Skip to content

Commit ed27ed6

Browse files
committed
linear code size for fixed size arrays (except when flattened)
1 parent 8b281f5 commit ed27ed6

File tree

5 files changed

+78
-13
lines changed

5 files changed

+78
-13
lines changed

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
///
@@ -1979,7 +1990,7 @@ impl<'a, B: Bindgen> Generator<'a, B> {
19791990
self.write_to_memory(element, elem_addr, offset);
19801991
self.finish_block(0);
19811992
self.stack.push(addr);
1982-
self.emit(&FixedSizeListLowerMemory {
1993+
self.emit(&FixedSizeListLowerToMemory {
19831994
element,
19841995
size: *size,
19851996
id,
@@ -2172,13 +2183,13 @@ impl<'a, B: Bindgen> Generator<'a, B> {
21722183

21732184
TypeDefKind::Unknown => unreachable!(),
21742185
TypeDefKind::FixedSizeList(ty, size) => {
2175-
let increment = self.bindgen.sizes().size(ty);
2176-
let mut position = offset;
2177-
for _ in 0..*size {
2178-
self.read_from_memory(ty, addr.clone(), position);
2179-
position = position + increment;
2180-
}
2181-
self.emit(&FixedSizeListLift {
2186+
self.push_block();
2187+
self.emit(&IterBasePointer);
2188+
let elemaddr = self.stack.pop().unwrap();
2189+
self.read_from_memory(ty, elemaddr, Default::default());
2190+
self.finish_block(1);
2191+
self.stack.push(addr.clone());
2192+
self.emit(&FixedSizeListLiftFromMemory {
21822193
element: ty,
21832194
size: *size,
21842195
id,

crates/cpp/src/lib.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2644,8 +2644,37 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
26442644
self.push_str("};\n");
26452645
results.push(result);
26462646
}
2647+
abi::Instruction::FixedSizeListLiftFromMemory {
2648+
element,
2649+
size: elemsize,
2650+
id: _,
2651+
} => {
2652+
let body = self.blocks.pop().unwrap();
2653+
let tmp = self.tmp();
2654+
let vec = format!("array{tmp}");
2655+
let source = operands[0].clone();
2656+
let size = self.r#gen.sizes.size(element);
2657+
let size_str = size.format(POINTER_SIZE_EXPRESSION);
2658+
let typename = self
2659+
.r#gen
2660+
.type_name(element, &self.namespace, Flavor::InStruct);
2661+
let ptr_type = self.r#gen.r#gen.opts.ptr_type();
2662+
self.push_str(&format!("std::array<{typename}, {elemsize}> {vec};\n"));
2663+
self.push_str(&format!(
2664+
"{{
2665+
{ptr_type} outer_base = {source};\n"
2666+
));
2667+
let source: String = "outer_base".into();
2668+
// let vec: String = "outer_vec".into();
2669+
self.push_str(&format!("for (unsigned i = 0; i<{elemsize}; ++i) {{\n",));
2670+
self.push_str(&format!("{ptr_type} base = {source} + i * {size_str};\n"));
2671+
self.push_str(&body.0);
2672+
self.push_str(&format!("{vec}[i] = {};", body.1[0]));
2673+
self.push_str("\n}\n}\n");
2674+
results.push(vec);
2675+
}
26472676
abi::Instruction::FixedSizeListLower { .. } => todo!(),
2648-
abi::Instruction::FixedSizeListLowerMemory {
2677+
abi::Instruction::FixedSizeListLowerToMemory {
26492678
element,
26502679
size: elemsize,
26512680
id: _,

crates/csharp/src/function.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1393,7 +1393,8 @@ impl Bindgen for FunctionBindgen<'_, '_> {
13931393
| Instruction::DropHandle { .. }
13941394
| Instruction::FixedSizeListLift { .. }
13951395
| Instruction::FixedSizeListLower { .. }
1396-
| Instruction::FixedSizeListLowerMemory { .. }
1396+
| Instruction::FixedSizeListLowerToMemory { .. }
1397+
| Instruction::FixedSizeListLiftFromMemory { .. }
13971398
=> {
13981399
dbg!(inst);
13991400
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
@@ -784,7 +784,7 @@ impl Bindgen for FunctionBindgen<'_, '_> {
784784
results.push(len);
785785
}
786786

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

0 commit comments

Comments
 (0)