Skip to content

Commit 370944f

Browse files
committed
linear code size for fixed size arrays (except when flattened)
1 parent 68ff89e commit 370944f

5 files changed

Lines changed: 78 additions & 13 deletions

File tree

crates/core/src/abi.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -325,12 +325,23 @@ def_instruction! {
325325
} : [1] => [*size as usize],
326326

327327
/// Pops an array and an address off the stack, passes each element to a block storing it
328-
FixedSizeListLowerMemory {
328+
FixedSizeListLowerToMemory {
329329
element: &'a Type,
330330
size: u32,
331331
id: TypeId,
332332
} : [2] => [0],
333333

334+
/// Pops base address, pushes an array
335+
///
336+
/// This will also pop a block from the block stack which is how to
337+
/// read each individual element from the list.
338+
FixedSizeListLiftFromMemory {
339+
element: &'a Type,
340+
size: u32,
341+
id: TypeId,
342+
} : [1] => [1],
343+
344+
334345
/// Pushes an operand onto the stack representing the list item from
335346
/// each iteration of the list.
336347
///
@@ -1993,7 +2004,7 @@ impl<'a, B: Bindgen> Generator<'a, B> {
19932004
self.write_to_memory(element, elem_addr, offset);
19942005
self.finish_block(0);
19952006
self.stack.push(addr);
1996-
self.emit(&FixedSizeListLowerMemory {
2007+
self.emit(&FixedSizeListLowerToMemory {
19972008
element,
19982009
size: *size,
19992010
id,
@@ -2187,13 +2198,13 @@ impl<'a, B: Bindgen> Generator<'a, B> {
21872198

21882199
TypeDefKind::Unknown => unreachable!(),
21892200
TypeDefKind::FixedSizeList(ty, size) => {
2190-
let increment = self.bindgen.sizes().size(ty);
2191-
let mut position = offset;
2192-
for _ in 0..*size {
2193-
self.read_from_memory(ty, addr.clone(), position);
2194-
position = position + increment;
2195-
}
2196-
self.emit(&FixedSizeListLift {
2201+
self.push_block();
2202+
self.emit(&IterBasePointer);
2203+
let elemaddr = self.stack.pop().unwrap();
2204+
self.read_from_memory(ty, elemaddr, Default::default());
2205+
self.finish_block(1);
2206+
self.stack.push(addr.clone());
2207+
self.emit(&FixedSizeListLiftFromMemory {
21972208
element: ty,
21982209
size: *size,
21992210
id,

crates/cpp/src/lib.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2676,8 +2676,37 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
26762676
self.push_str("};\n");
26772677
results.push(result);
26782678
}
2679+
abi::Instruction::FixedSizeListLiftFromMemory {
2680+
element,
2681+
size: elemsize,
2682+
id: _,
2683+
} => {
2684+
let body = self.blocks.pop().unwrap();
2685+
let tmp = self.tmp();
2686+
let vec = format!("array{tmp}");
2687+
let source = operands[0].clone();
2688+
let size = self.r#gen.sizes.size(element);
2689+
let size_str = size.format(POINTER_SIZE_EXPRESSION);
2690+
let typename = self
2691+
.r#gen
2692+
.type_name(element, &self.namespace, Flavor::InStruct);
2693+
let ptr_type = self.r#gen.r#gen.opts.ptr_type();
2694+
self.push_str(&format!("std::array<{typename}, {elemsize}> {vec};\n"));
2695+
self.push_str(&format!(
2696+
"{{
2697+
{ptr_type} outer_base = {source};\n"
2698+
));
2699+
let source: String = "outer_base".into();
2700+
// let vec: String = "outer_vec".into();
2701+
self.push_str(&format!("for (unsigned i = 0; i<{elemsize}; ++i) {{\n",));
2702+
self.push_str(&format!("{ptr_type} base = {source} + i * {size_str};\n"));
2703+
self.push_str(&body.0);
2704+
self.push_str(&format!("{vec}[i] = {};", body.1[0]));
2705+
self.push_str("\n}\n}\n");
2706+
results.push(vec);
2707+
}
26792708
abi::Instruction::FixedSizeListLower { .. } => todo!(),
2680-
abi::Instruction::FixedSizeListLowerMemory {
2709+
abi::Instruction::FixedSizeListLowerToMemory {
26812710
element,
26822711
size: elemsize,
26832712
id: _,

crates/csharp/src/function.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1447,7 +1447,8 @@ impl Bindgen for FunctionBindgen<'_, '_> {
14471447
| Instruction::DropHandle { .. }
14481448
| Instruction::FixedSizeListLift { .. }
14491449
| Instruction::FixedSizeListLower { .. }
1450-
| Instruction::FixedSizeListLowerMemory { .. }
1450+
| Instruction::FixedSizeListLowerToMemory { .. }
1451+
| Instruction::FixedSizeListLiftFromMemory { .. }
14511452
=> {
14521453
dbg!(inst);
14531454
todo!()

crates/moonbit/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2698,7 +2698,8 @@ impl Bindgen for FunctionBindgen<'_, '_> {
26982698
| Instruction::DropHandle { .. } => todo!(),
26992699
Instruction::FixedSizeListLift { .. } => todo!(),
27002700
Instruction::FixedSizeListLower { .. } => todo!(),
2701-
Instruction::FixedSizeListLowerMemory { .. } => todo!(),
2701+
Instruction::FixedSizeListLowerToMemory { .. } => todo!(),
2702+
Instruction::FixedSizeListLiftFromMemory { .. } => todo!(),
27022703
}
27032704
}
27042705

crates/rust/src/bindgen.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,7 @@ impl Bindgen for FunctionBindgen<'_, '_> {
783783
results.push(len);
784784
}
785785

786-
Instruction::FixedSizeListLowerMemory {
786+
Instruction::FixedSizeListLowerToMemory {
787787
element,
788788
size: _,
789789
id: _,
@@ -1252,6 +1252,29 @@ impl Bindgen for FunctionBindgen<'_, '_> {
12521252
results.push(format!("{}[{i}]", operands[0]));
12531253
}
12541254
}
1255+
Instruction::FixedSizeListLiftFromMemory {
1256+
element,
1257+
size,
1258+
id: _,
1259+
} => {
1260+
let body = self.blocks.pop().unwrap();
1261+
let elemsize = self
1262+
.r#gen
1263+
.sizes
1264+
.size(element)
1265+
.format(POINTER_SIZE_EXPRESSION);
1266+
let base = operands[0].clone();
1267+
let tmp = self.tmp();
1268+
let index_var = format!("idx{tmp}");
1269+
self.push_str(&format!(
1270+
" let array{tmp}: [_; {size}] = core::array::from_fn(|{index_var}| {{
1271+
let base = {base}.add({index_var} * {elemsize});
1272+
{body}
1273+
}});"
1274+
));
1275+
let result = format!("array{tmp}");
1276+
results.push(result);
1277+
}
12551278
}
12561279
}
12571280
}

0 commit comments

Comments
 (0)