diff --git a/lang/src/backend/hbvm/regalloc.rs b/lang/src/backend/hbvm/regalloc.rs index 5505326..16d2f5f 100644 --- a/lang/src/backend/hbvm/regalloc.rs +++ b/lang/src/backend/hbvm/regalloc.rs @@ -434,12 +434,15 @@ impl HbvmBackend { self.emit(instrs::st(r, atr(*node.inputs.last().unwrap()), 0, size)); } - match ret { - Some(PLoc::WideReg(..)) => {} - Some(PLoc::Reg(..)) if node.ty.loc(tys) == Loc::Stack => {} - Some(PLoc::Reg(r, ..)) => self.emit_cp(atr(nid), r), - None | Some(PLoc::Ref(..)) => {} - } + //match ret { + // Some(PLoc::WideReg(..)) => {} + // Some(PLoc::Reg(..)) if node.ty.loc(tys) == Loc::Stack => {} + // Some(PLoc::Reg(r, ..)) => self.emit_cp(atr(nid), r), + // None | Some(PLoc::Ref(..)) => {} + //} + } + Kind::RetVal => { + self.emit_cp(atr(nid), reg::RET); } Kind::Global { global } => { let reloc = Reloc::new(self.code.len(), 3, 4); @@ -696,6 +699,7 @@ impl<'a> FunctionBuilder<'a> { | Kind::Global { .. } | Kind::Load { .. } | Kind::Stre + | Kind::RetVal | Kind::Stck => self.add_instr(nid), Kind::End | Kind::Phi | Kind::Arg | Kind::Mem | Kind::Loops | Kind::Join => {} Kind::Assert { .. } => unreachable!(), diff --git a/lang/src/nodes.rs b/lang/src/nodes.rs index 56fc43d..16d9835 100644 --- a/lang/src/nodes.rs +++ b/lang/src/nodes.rs @@ -169,12 +169,8 @@ impl Nodes { let mut deepest = self[node].inputs[0]; for &inp in self[node].inputs[1..].iter() { if self.idepth(inp, Some(scheds)) > self.idepth(deepest, Some(scheds)) { - if self[inp].kind.is_call() { - deepest = inp; - } else { - debug_assert!(!self.is_cfg(inp)); - deepest = self.idom(inp, Some(scheds)); - } + debug_assert!(!self.is_cfg(inp)); + deepest = self.idom(inp, Some(scheds)); } } @@ -199,8 +195,8 @@ impl Nodes { for &node in rpo.iter().rev() { self.loop_depth(node, Some(scheds)); - for i in 0..self[node].inputs.len() { - self.push_up_impl(self[node].inputs[i], visited, scheds); + for &i in self[node].inputs.iter() { + self.push_up_impl(i, visited, scheds); } if matches!(self[node].kind, Kind::Loop | Kind::Region) { @@ -217,13 +213,13 @@ impl Nodes { self.iter() .map(|(n, _)| n) .filter(|&n| !visited.get(n) - && !matches!(self[n].kind, Kind::Arg | Kind::Mem | Kind::Loops)) + && !matches!(self[n].kind, Kind::Arg | Kind::Mem | Kind::Loops | Kind::RetVal)) .collect::>(), vec![], "{:?}", self.iter() .filter(|&(n, nod)| !visited.get(n) - && !matches!(nod.kind, Kind::Arg | Kind::Mem | Kind::Loops)) + && !matches!(nod.kind, Kind::Arg | Kind::Mem | Kind::Loops | Kind::RetVal)) .collect::>() ); @@ -288,6 +284,7 @@ impl Nodes { let cfg_idx = outputs.iter().position(|&n| self.is_cfg(n)).unwrap(); outputs.swap(cfg_idx, 0); + for &o in outputs.iter() { if (!self.is_cfg(o) && self[o].outputs.iter().any(|&oi| { @@ -1566,6 +1563,7 @@ impl Nodes { K::Start => {} _ if self.is_cfg(target) && self.idom(target, None) == NEVER => panic!(), K::Entry + | K::RetVal | K::Mem | K::Loops | K::End @@ -1728,6 +1726,7 @@ impl Nodes { Kind::Mem => write!(out, " mem: "), Kind::Loops => write!(out, "loops: "), Kind::Join => write!(out, "join: "), + Kind::RetVal => write!(out, "rval: "), }?; if self[node].kind != Kind::Loop && self[node].kind != Kind::Region { @@ -2051,8 +2050,7 @@ impl Node { } pub fn has_no_value(&self) -> bool { - (self.kind.is_cfg() && (!self.kind.is_call() || self.ty == ty::Id::VOID)) - || matches!(self.kind, Kind::Stre) + self.kind.is_cfg() || matches!(self.kind, Kind::Stre) } } @@ -2087,6 +2085,12 @@ pub enum Kind { Return { file: ty::Module, }, + // [ctrl, ...args] + Call { + unreachable: bool, + func: ty::Func, + args: ty::Tuple, + }, // [ctrl] Die, // [ctrl] @@ -2108,12 +2112,7 @@ pub enum Kind { Global { global: ty::Global, }, - // [ctrl, ...args] - Call { - unreachable: bool, - func: ty::Func, - args: ty::Tuple, - }, + RetVal, // [ctrl, cond, value] Assert { kind: AssertKind, @@ -2139,7 +2138,9 @@ impl Kind { } fn is_pinned(&self) -> bool { - self.is_cfg() || self.is_at_start() || matches!(self, Self::Phi | Kind::Assert { .. }) + self.is_cfg() + || self.is_at_start() + || matches!(self, Self::Phi | Self::Assert { .. } | Self::RetVal) } fn is_at_start(&self) -> bool { diff --git a/lang/src/son.rs b/lang/src/son.rs index 5ed56bc..e002381 100644 --- a/lang/src/son.rs +++ b/lang/src/son.rs @@ -1520,7 +1520,14 @@ impl<'a> Codegen<'a> { None } Expr::Directive { pos, name: "eca", args } => { - inference!(ty, ctx, self, pos, "return type", "@as(, @eca(...))"); + inference!( + ret_ty, + ctx, + self, + pos, + "return type", + "@as(, @eca(...))" + ); let mut inps = Vc::from([NEVER]); let arg_base = self.tys.tmp.args.len(); @@ -1542,19 +1549,19 @@ impl<'a> Codegen<'a> { self.append_clobbers(&mut inps, &mut clobbered_aliases); - let alt_value = match ty.loc(self.tys) { + let alt_value = match ret_ty.loc(self.tys) { Loc::Reg => None, Loc::Stack => { - let stck = self.new_stack(pos, ty); + let stck = self.new_stack(pos, ret_ty); inps.push(stck); - Some(Value::ptr(stck).ty(ty)) + Some(Value::ptr(stck).ty(ret_ty)) } }; inps[0] = self.ci.ctrl.get(); self.ci.ctrl.set( self.ci.nodes.new_node_nop( - ty, + ret_ty, Kind::Call { func: ty::Func::ECA, args, unreachable: false }, inps, ), @@ -1563,7 +1570,11 @@ impl<'a> Codegen<'a> { self.add_clobber_stores(clobbered_aliases); - alt_value.or(Some(Value::new(self.ci.ctrl.get()).ty(ty))) + Some(alt_value.unwrap_or_else(|| { + let ret = + self.ci.nodes.new_node_nop(ret_ty, Kind::RetVal, [self.ci.ctrl.get()]); + Value::new(ret).ty(ret_ty) + })) } Expr::Call { func, args, .. } => self.gen_call(func, args, false), Expr::Directive { name: "inline", args: [func, args @ ..], .. } => { @@ -2713,7 +2724,10 @@ impl<'a> Codegen<'a> { return None; } - alt_value.or(Some(Value::new(self.ci.ctrl.get()).ty(sig.ret))) + Some(alt_value.unwrap_or_else(|| { + let ret = self.ci.nodes.new_node_nop(sig.ret, Kind::RetVal, [self.ci.ctrl.get()]); + Value::new(ret).ty(sig.ret) + })) } } diff --git a/lang/tests/son_tests_conditional_stores.txt b/lang/tests/son_tests_conditional_stores.txt index 4e7b7ec..cc79c7c 100644 --- a/lang/tests/son_tests_conditional_stores.txt +++ b/lang/tests/son_tests_conditional_stores.txt @@ -5,8 +5,8 @@ main: ADDI64 r254, r254, -24d ST r31, r254, 0a, 24h JAL r31, r0, :cond - CP r33, r1 CP r32, r0 + CP r33, r1 JNE r33, r32, :0 JMP :1 0: LI64 r32, 2d diff --git a/lang/tests/son_tests_exhaustive_loop_testing.txt b/lang/tests/son_tests_exhaustive_loop_testing.txt index c4c1842..2e9d153 100644 --- a/lang/tests/son_tests_exhaustive_loop_testing.txt +++ b/lang/tests/son_tests_exhaustive_loop_testing.txt @@ -37,41 +37,41 @@ main: ST r31, r254, 0a, 40h CP r2, r0 JAL r31, r0, :multiple_breaks - CP r32, r1 - LI64 r33, 3d - JEQ r32, r33, :0 + LI64 r32, 3d + CP r33, r1 + JEQ r33, r32, :0 LI64 r32, 1d CP r1, r32 JMP :1 - 0: LI64 r32, 4d - CP r2, r32 + 0: LI64 r33, 4d + CP r2, r33 JAL r31, r0, :multiple_breaks - CP r34, r1 - LI64 r35, 10d - JEQ r34, r35, :2 + LI64 r34, 10d + CP r35, r1 + JEQ r35, r34, :2 LI64 r32, 2d CP r1, r32 JMP :1 2: CP r2, r0 JAL r31, r0, :state_change_in_break - CP r34, r1 - JEQ r34, r0, :3 - CP r1, r33 - JMP :1 - 3: CP r2, r32 - JAL r31, r0, :state_change_in_break - CP r34, r1 - JEQ r34, r35, :4 + CP r35, r1 + JEQ r35, r0, :3 CP r1, r32 JMP :1 - 4: CP r2, r35 + 3: CP r2, r33 + JAL r31, r0, :state_change_in_break + CP r35, r1 + JEQ r35, r34, :4 + CP r1, r33 + JMP :1 + 4: CP r2, r34 JAL r31, r0, :continue_and_state_change - CP r32, r1 - JEQ r32, r35, :5 + CP r33, r1 + JEQ r33, r34, :5 LI64 r32, 5d CP r1, r32 JMP :1 - 5: CP r2, r33 + 5: CP r2, r32 JAL r31, r0, :continue_and_state_change CP r32, r1 JEQ r32, r0, :6 diff --git a/lang/tests/son_tests_generic_types.txt b/lang/tests/son_tests_generic_types.txt index 7318f32..9f1181a 100644 --- a/lang/tests/son_tests_generic_types.txt +++ b/lang/tests/son_tests_generic_types.txt @@ -42,10 +42,11 @@ free: CP r4, r14 CP r5, r15 ECA + CP r13, r1 JALA r0, r31, 0a main: - ADDI64 r254, r254, -96d - ST r31, r254, 48a, 48h + ADDI64 r254, r254, -88d + ST r31, r254, 48a, 40h ADDI64 r32, r254, 24d CP r1, r32 JAL r31, r0, :new @@ -60,20 +61,19 @@ main: CP r2, r33 CP r3, r34 JAL r31, r0, :push - CP r34, r1 - LD r35, r254, 0a, 8h - LD r35, r35, 0a, 1h - LD r36, r254, 24a, 8h - LD r34, r36, 0a, 8h + LD r34, r254, 0a, 8h + LD r34, r34, 0a, 1h + LD r35, r254, 24a, 8h + LD r35, r35, 0a, 8h CP r2, r33 JAL r31, r0, :deinit CP r2, r32 JAL r31, r0, :deinit - ANDI r32, r35, 255d - ADD64 r32, r34, r32 + ANDI r32, r34, 255d + ADD64 r32, r35, r32 CP r1, r32 - LD r31, r254, 48a, 48h - ADDI64 r254, r254, 96d + LD r31, r254, 48a, 40h + ADDI64 r254, r254, 88d JALA r0, r31, 0a malloc: CP r13, r2 @@ -125,8 +125,8 @@ push: 2: CP r2, r32 CP r3, r37 JAL r31, r0, :malloc - CP r35, r1 ST r32, r38, 16a, 8h + CP r35, r1 JNE r35, r0, :3 CP r1, r0 JMP :4 @@ -179,8 +179,8 @@ push: CP r2, r34 CP r3, r40 JAL r31, r0, :malloc - CP r35, r1 ST r32, r38, 16a, 8h + CP r35, r1 JNE r35, r0, :3 CP r1, r0 JMP :4 diff --git a/lang/tests/son_tests_global_variable_wiredness.txt b/lang/tests/son_tests_global_variable_wiredness.txt index 6fde6ec..978bb85 100644 --- a/lang/tests/son_tests_global_variable_wiredness.txt +++ b/lang/tests/son_tests_global_variable_wiredness.txt @@ -2,8 +2,8 @@ inb: CP r1, r0 JALA r0, r31, 0a main: - ADDI64 r254, r254, -32d - ST r31, r254, 0a, 32h + ADDI64 r254, r254, -24d + ST r31, r254, 0a, 24h LRA r32, r0, :ports LD r33, r32, 0a, 1h ANDI r33, r33, 255d @@ -11,12 +11,12 @@ main: JMP :1 0: JAL r31, r0, :inb CP r33, r1 - CMPU r34, r33, r0 - CMPUI r34, r34, 0d - NOT r34, r34 - ST r34, r32, 0a, 1h - 1: LD r31, r254, 0a, 32h - ADDI64 r254, r254, 32d + CMPU r33, r33, r0 + CMPUI r33, r33, 0d + NOT r33, r33 + ST r33, r32, 0a, 1h + 1: LD r31, r254, 0a, 24h + ADDI64 r254, r254, 24d JALA r0, r31, 0a code size: 164 ret: 0 diff --git a/lang/tests/son_tests_integer_inference_issues.txt b/lang/tests/son_tests_integer_inference_issues.txt index 7eea799..ba1e3eb 100644 --- a/lang/tests/son_tests_integer_inference_issues.txt +++ b/lang/tests/son_tests_integer_inference_issues.txt @@ -6,9 +6,9 @@ integer_range: CP r2, r16 CP r3, r15 ECA - CP r15, r1 SUB64 r14, r14, r13 ADDI64 r14, r14, 1d + CP r15, r1 DIRU64 r0, r14, r15, r14 ADD64 r13, r14, r13 CP r1, r13 diff --git a/lang/tests/son_tests_memory_swap.txt b/lang/tests/son_tests_memory_swap.txt index 1a7fba7..0186fb9 100644 --- a/lang/tests/son_tests_memory_swap.txt +++ b/lang/tests/son_tests_memory_swap.txt @@ -10,26 +10,26 @@ decide: ADDI64 r254, r254, 24d JALA r0, r31, 0a main: - ADDI64 r254, r254, -120d - ST r31, r254, 72a, 48h + ADDI64 r254, r254, -104d + ST r31, r254, 72a, 32h ADDI64 r32, r254, 48d CP r1, r32 CP r2, r0 JAL r31, r0, :decide - ADDI64 r34, r254, 24d - BMC r32, r34, 24h - LI64 r35, 1d - CP r1, r34 - CP r2, r35 + ADDI64 r33, r254, 24d + BMC r32, r33, 24h + LI64 r34, 1d + CP r1, r33 + CP r2, r34 JAL r31, r0, :decide - ADDI64 r36, r254, 0d - BMC r32, r36, 24h + ADDI64 r34, r254, 0d + BMC r32, r34, 24h LD r32, r254, 24a, 8h LD r33, r254, 0a, 8h ADD64 r32, r33, r32 CP r1, r32 - LD r31, r254, 72a, 48h - ADDI64 r254, r254, 120d + LD r31, r254, 72a, 32h + ADDI64 r254, r254, 104d JALA r0, r31, 0a code size: 273 ret: 1 diff --git a/lang/tests/son_tests_nullable_structure.txt b/lang/tests/son_tests_nullable_structure.txt index ca9d6bb..167bd89 100644 --- a/lang/tests/son_tests_nullable_structure.txt +++ b/lang/tests/son_tests_nullable_structure.txt @@ -1,6 +1,6 @@ main: - ADDI64 r254, r254, -66d - ST r31, r254, 26a, 40h + ADDI64 r254, r254, -58d + ST r31, r254, 26a, 32h JAL r31, r0, :returner_fn CP r32, r1 ADDI64 r33, r254, 2d @@ -25,8 +25,8 @@ main: JMP :1 0: LI64 r32, 1d CP r1, r32 - 1: LD r31, r254, 26a, 40h - ADDI64 r254, r254, 66d + 1: LD r31, r254, 26a, 32h + ADDI64 r254, r254, 58d JALA r0, r31, 0a returner_bn: ADDI64 r254, r254, -24d diff --git a/lang/tests/son_tests_nullable_types.txt b/lang/tests/son_tests_nullable_types.txt index a473c59..1d41bc1 100644 --- a/lang/tests/son_tests_nullable_types.txt +++ b/lang/tests/son_tests_nullable_types.txt @@ -6,9 +6,9 @@ main: ADDI64 r254, r254, -128d ST r31, r254, 80a, 48h JAL r31, r0, :decide - CP r32, r1 CP r33, r0 ADDI64 r34, r254, 72d + CP r32, r1 ANDI r32, r32, 255d JNE r32, r0, :0 CP r32, r33 @@ -37,8 +37,8 @@ main: CP r1, r32 JMP :3 6: JAL r31, r0, :decide - CP r32, r1 CP r33, r0 + CP r32, r1 ANDI r32, r32, 255d JNE r32, r0, :7 CP r32, r33 diff --git a/lang/tests/son_tests_overwrite_aliasing_overoptimization.txt b/lang/tests/son_tests_overwrite_aliasing_overoptimization.txt index 48188fb..6896b2a 100644 --- a/lang/tests/son_tests_overwrite_aliasing_overoptimization.txt +++ b/lang/tests/son_tests_overwrite_aliasing_overoptimization.txt @@ -1,6 +1,6 @@ main: - ADDI64 r254, r254, -64d - ST r31, r254, 24a, 40h + ADDI64 r254, r254, -56d + ST r31, r254, 24a, 32h ADDI64 r32, r254, 0d LI64 r33, 1d ST r33, r254, 16a, 8h @@ -9,14 +9,14 @@ main: ST r33, r254, 8a, 8h JAL r31, r0, :opaque ST r1, r32, 0a, 16h - LD r34, r254, 8a, 8h - LD r35, r254, 16a, 8h - ADD64 r34, r35, r34 + LD r33, r254, 8a, 8h + LD r34, r254, 16a, 8h + ADD64 r33, r34, r33 LD r32, r254, 0a, 8h - SUB64 r32, r32, r34 + SUB64 r32, r32, r33 CP r1, r32 - LD r31, r254, 24a, 40h - ADDI64 r254, r254, 64d + LD r31, r254, 24a, 32h + ADDI64 r254, r254, 56d JALA r0, r31, 0a opaque: ADDI64 r254, r254, -16d diff --git a/lang/tests/son_tests_request_page.txt b/lang/tests/son_tests_request_page.txt index 2b7f0ae..b4fe810 100644 --- a/lang/tests/son_tests_request_page.txt +++ b/lang/tests/son_tests_request_page.txt @@ -12,8 +12,8 @@ create_back_buffer: 0: LI8 r34, 255b CP r2, r34 JAL r31, r0, :request_page - CP r35, r1 SUB64 r32, r32, r33 + CP r35, r1 5: JGTS r32, r0, :2 CP r1, r35 JMP :1 diff --git a/lang/tests/son_tests_returning_global_struct.txt b/lang/tests/son_tests_returning_global_struct.txt index c52dcf9..448a196 100644 --- a/lang/tests/son_tests_returning_global_struct.txt +++ b/lang/tests/son_tests_returning_global_struct.txt @@ -1,23 +1,23 @@ main: - ADDI64 r254, r254, -52d - ST r31, r254, 4a, 48h + ADDI64 r254, r254, -44d + ST r31, r254, 4a, 40h ADDI64 r32, r254, 0d JAL r31, r0, :random_color ST r1, r32, 0a, 4h - LD r34, r254, 0a, 1h - LD r35, r254, 1a, 1h - LD r36, r254, 2a, 1h + LD r33, r254, 0a, 1h + LD r34, r254, 1a, 1h + LD r35, r254, 2a, 1h + ANDI r33, r33, 255d ANDI r34, r34, 255d - ANDI r35, r35, 255d LD r32, r254, 3a, 1h - ANDI r33, r36, 255d - ADD64 r34, r35, r34 - ANDI r32, r32, 255d + ANDI r35, r35, 255d ADD64 r33, r34, r33 + ANDI r32, r32, 255d + ADD64 r33, r33, r35 ADD64 r32, r33, r32 CP r1, r32 - LD r31, r254, 4a, 48h - ADDI64 r254, r254, 52d + LD r31, r254, 4a, 40h + ADDI64 r254, r254, 44d JALA r0, r31, 0a random_color: LRA r13, r0, :white diff --git a/lang/tests/son_tests_storing_into_nullable_struct.txt b/lang/tests/son_tests_storing_into_nullable_struct.txt index 713870e..f547c83 100644 --- a/lang/tests/son_tests_storing_into_nullable_struct.txt +++ b/lang/tests/son_tests_storing_into_nullable_struct.txt @@ -5,8 +5,8 @@ do_stuff: just_read: JALA r0, r31, 0a main: - ADDI64 r254, r254, -80d - ST r31, r254, 48a, 32h + ADDI64 r254, r254, -72d + ST r31, r254, 48a, 24h ADDI64 r32, r254, 16d CP r1, r32 JAL r31, r0, :optionala @@ -37,8 +37,8 @@ main: CP r33, r1 ADD64 r32, r33, r32 CP r1, r32 - 1: LD r31, r254, 48a, 32h - ADDI64 r254, r254, 80d + 1: LD r31, r254, 48a, 24h + ADDI64 r254, r254, 72d JALA r0, r31, 0a optional: ADDI64 r254, r254, -16d diff --git a/lang/tests/son_tests_struct_return_from_module_function.txt b/lang/tests/son_tests_struct_return_from_module_function.txt index f0608aa..3ab1321 100644 --- a/lang/tests/son_tests_struct_return_from_module_function.txt +++ b/lang/tests/son_tests_struct_return_from_module_function.txt @@ -9,8 +9,8 @@ foo: ADDI64 r254, r254, 16d JALA r0, r31, 0a main: - ADDI64 r254, r254, -88d - ST r31, r254, 48a, 40h + ADDI64 r254, r254, -80d + ST r31, r254, 48a, 32h ADDI64 r32, r254, 32d JAL r31, r0, :foo ST r1, r32, 0a, 16h @@ -30,8 +30,8 @@ main: LI64 r33, 7d SUB64 r32, r33, r32 CP r1, r32 - LD r31, r254, 48a, 40h - ADDI64 r254, r254, 88d + LD r31, r254, 48a, 32h + ADDI64 r254, r254, 80d JALA r0, r31, 0a code size: 347 ret: 0 diff --git a/lang/tests/son_tests_wide_ret.txt b/lang/tests/son_tests_wide_ret.txt index 5861be5..a7ad32f 100644 --- a/lang/tests/son_tests_wide_ret.txt +++ b/lang/tests/son_tests_wide_ret.txt @@ -1,46 +1,46 @@ main: - ADDI64 r254, r254, -48d - ST r31, r254, 16a, 32h + ADDI64 r254, r254, -40d + ST r31, r254, 16a, 24h ADDI64 r32, r254, 0d CP r3, r0 CP r4, r0 JAL r31, r0, :maina ST r1, r32, 0a, 16h - LD r34, r254, 12a, 1h + LD r33, r254, 12a, 1h LD r32, r254, 3a, 1h - SUB8 r32, r32, r34 + SUB8 r32, r32, r33 ANDI r32, r32, 255d CP r1, r32 - LD r31, r254, 16a, 32h - ADDI64 r254, r254, 48d + LD r31, r254, 16a, 24h + ADDI64 r254, r254, 40d JALA r0, r31, 0a maina: - ADDI64 r254, r254, -52d - ST r31, r254, 20a, 32h + ADDI64 r254, r254, -44d + ST r31, r254, 20a, 24h ADDI64 r32, r254, 16d JAL r31, r0, :small_struct ST r1, r32, 0a, 4h ST r0, r254, 0a, 1h ST r0, r254, 1a, 1h ST r0, r254, 2a, 1h - LI8 r33, 3b - ST r33, r254, 3a, 1h - LI8 r34, 1b - ST r34, r254, 4a, 1h + LI8 r32, 3b + ST r32, r254, 3a, 1h + LI8 r33, 1b + ST r33, r254, 4a, 1h ST r0, r254, 5a, 1h ST r0, r254, 6a, 1h ST r0, r254, 7a, 1h ST r0, r254, 8a, 1h ST r0, r254, 9a, 1h ST r0, r254, 10a, 1h - ST r33, r254, 11a, 1h - ST r34, r254, 12a, 1h + ST r32, r254, 11a, 1h + ST r33, r254, 12a, 1h ST r0, r254, 13a, 1h ST r0, r254, 14a, 1h ST r0, r254, 15a, 1h LD r1, r254, 0a, 16h - LD r31, r254, 20a, 32h - ADDI64 r254, r254, 52d + LD r31, r254, 20a, 24h + ADDI64 r254, r254, 44d JALA r0, r31, 0a small_struct: ADDI64 r254, r254, -4d