making the Call node less special

return value is now a separate node pinned to the call

Signed-off-by: Jakub Doka <jakub.doka2@gmail.com>
This commit is contained in:
Jakub Doka 2024-12-19 10:48:05 +01:00
parent f05c61a99e
commit a8aba7e7c2
No known key found for this signature in database
GPG key ID: C6E9A89936B8C143
17 changed files with 155 additions and 136 deletions

View file

@ -434,12 +434,15 @@ impl HbvmBackend {
self.emit(instrs::st(r, atr(*node.inputs.last().unwrap()), 0, size)); self.emit(instrs::st(r, atr(*node.inputs.last().unwrap()), 0, size));
} }
match ret { //match ret {
Some(PLoc::WideReg(..)) => {} // Some(PLoc::WideReg(..)) => {}
Some(PLoc::Reg(..)) if node.ty.loc(tys) == Loc::Stack => {} // Some(PLoc::Reg(..)) if node.ty.loc(tys) == Loc::Stack => {}
Some(PLoc::Reg(r, ..)) => self.emit_cp(atr(nid), r), // Some(PLoc::Reg(r, ..)) => self.emit_cp(atr(nid), r),
None | Some(PLoc::Ref(..)) => {} // None | Some(PLoc::Ref(..)) => {}
} //}
}
Kind::RetVal => {
self.emit_cp(atr(nid), reg::RET);
} }
Kind::Global { global } => { Kind::Global { global } => {
let reloc = Reloc::new(self.code.len(), 3, 4); let reloc = Reloc::new(self.code.len(), 3, 4);
@ -696,6 +699,7 @@ impl<'a> FunctionBuilder<'a> {
| Kind::Global { .. } | Kind::Global { .. }
| Kind::Load { .. } | Kind::Load { .. }
| Kind::Stre | Kind::Stre
| Kind::RetVal
| Kind::Stck => self.add_instr(nid), | Kind::Stck => self.add_instr(nid),
Kind::End | Kind::Phi | Kind::Arg | Kind::Mem | Kind::Loops | Kind::Join => {} Kind::End | Kind::Phi | Kind::Arg | Kind::Mem | Kind::Loops | Kind::Join => {}
Kind::Assert { .. } => unreachable!(), Kind::Assert { .. } => unreachable!(),

View file

@ -169,12 +169,8 @@ impl Nodes {
let mut deepest = self[node].inputs[0]; let mut deepest = self[node].inputs[0];
for &inp in self[node].inputs[1..].iter() { for &inp in self[node].inputs[1..].iter() {
if self.idepth(inp, Some(scheds)) > self.idepth(deepest, Some(scheds)) { if self.idepth(inp, Some(scheds)) > self.idepth(deepest, Some(scheds)) {
if self[inp].kind.is_call() { debug_assert!(!self.is_cfg(inp));
deepest = inp; deepest = self.idom(inp, Some(scheds));
} else {
debug_assert!(!self.is_cfg(inp));
deepest = self.idom(inp, Some(scheds));
}
} }
} }
@ -199,8 +195,8 @@ impl Nodes {
for &node in rpo.iter().rev() { for &node in rpo.iter().rev() {
self.loop_depth(node, Some(scheds)); self.loop_depth(node, Some(scheds));
for i in 0..self[node].inputs.len() { for &i in self[node].inputs.iter() {
self.push_up_impl(self[node].inputs[i], visited, scheds); self.push_up_impl(i, visited, scheds);
} }
if matches!(self[node].kind, Kind::Loop | Kind::Region) { if matches!(self[node].kind, Kind::Loop | Kind::Region) {
@ -217,13 +213,13 @@ impl Nodes {
self.iter() self.iter()
.map(|(n, _)| n) .map(|(n, _)| n)
.filter(|&n| !visited.get(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<_>>(), .collect::<Vec<_>>(),
vec![], vec![],
"{:?}", "{:?}",
self.iter() self.iter()
.filter(|&(n, nod)| !visited.get(n) .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::<Vec<_>>() .collect::<Vec<_>>()
); );
@ -288,6 +284,7 @@ impl Nodes {
let cfg_idx = outputs.iter().position(|&n| self.is_cfg(n)).unwrap(); let cfg_idx = outputs.iter().position(|&n| self.is_cfg(n)).unwrap();
outputs.swap(cfg_idx, 0); outputs.swap(cfg_idx, 0);
for &o in outputs.iter() { for &o in outputs.iter() {
if (!self.is_cfg(o) if (!self.is_cfg(o)
&& self[o].outputs.iter().any(|&oi| { && self[o].outputs.iter().any(|&oi| {
@ -1566,6 +1563,7 @@ impl Nodes {
K::Start => {} K::Start => {}
_ if self.is_cfg(target) && self.idom(target, None) == NEVER => panic!(), _ if self.is_cfg(target) && self.idom(target, None) == NEVER => panic!(),
K::Entry K::Entry
| K::RetVal
| K::Mem | K::Mem
| K::Loops | K::Loops
| K::End | K::End
@ -1728,6 +1726,7 @@ impl Nodes {
Kind::Mem => write!(out, " mem: "), Kind::Mem => write!(out, " mem: "),
Kind::Loops => write!(out, "loops: "), Kind::Loops => write!(out, "loops: "),
Kind::Join => write!(out, "join: "), Kind::Join => write!(out, "join: "),
Kind::RetVal => write!(out, "rval: "),
}?; }?;
if self[node].kind != Kind::Loop && self[node].kind != Kind::Region { if self[node].kind != Kind::Loop && self[node].kind != Kind::Region {
@ -2051,8 +2050,7 @@ impl Node {
} }
pub fn has_no_value(&self) -> bool { pub fn has_no_value(&self) -> bool {
(self.kind.is_cfg() && (!self.kind.is_call() || self.ty == ty::Id::VOID)) self.kind.is_cfg() || matches!(self.kind, Kind::Stre)
|| matches!(self.kind, Kind::Stre)
} }
} }
@ -2087,6 +2085,12 @@ pub enum Kind {
Return { Return {
file: ty::Module, file: ty::Module,
}, },
// [ctrl, ...args]
Call {
unreachable: bool,
func: ty::Func,
args: ty::Tuple,
},
// [ctrl] // [ctrl]
Die, Die,
// [ctrl] // [ctrl]
@ -2108,12 +2112,7 @@ pub enum Kind {
Global { Global {
global: ty::Global, global: ty::Global,
}, },
// [ctrl, ...args] RetVal,
Call {
unreachable: bool,
func: ty::Func,
args: ty::Tuple,
},
// [ctrl, cond, value] // [ctrl, cond, value]
Assert { Assert {
kind: AssertKind, kind: AssertKind,
@ -2139,7 +2138,9 @@ impl Kind {
} }
fn is_pinned(&self) -> bool { 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 { fn is_at_start(&self) -> bool {

View file

@ -1520,7 +1520,14 @@ impl<'a> Codegen<'a> {
None None
} }
Expr::Directive { pos, name: "eca", args } => { Expr::Directive { pos, name: "eca", args } => {
inference!(ty, ctx, self, pos, "return type", "@as(<return_ty>, @eca(<expr>...))"); inference!(
ret_ty,
ctx,
self,
pos,
"return type",
"@as(<return_ty>, @eca(<expr>...))"
);
let mut inps = Vc::from([NEVER]); let mut inps = Vc::from([NEVER]);
let arg_base = self.tys.tmp.args.len(); let arg_base = self.tys.tmp.args.len();
@ -1542,19 +1549,19 @@ impl<'a> Codegen<'a> {
self.append_clobbers(&mut inps, &mut clobbered_aliases); 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::Reg => None,
Loc::Stack => { Loc::Stack => {
let stck = self.new_stack(pos, ty); let stck = self.new_stack(pos, ret_ty);
inps.push(stck); inps.push(stck);
Some(Value::ptr(stck).ty(ty)) Some(Value::ptr(stck).ty(ret_ty))
} }
}; };
inps[0] = self.ci.ctrl.get(); inps[0] = self.ci.ctrl.get();
self.ci.ctrl.set( self.ci.ctrl.set(
self.ci.nodes.new_node_nop( self.ci.nodes.new_node_nop(
ty, ret_ty,
Kind::Call { func: ty::Func::ECA, args, unreachable: false }, Kind::Call { func: ty::Func::ECA, args, unreachable: false },
inps, inps,
), ),
@ -1563,7 +1570,11 @@ impl<'a> Codegen<'a> {
self.add_clobber_stores(clobbered_aliases); 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::Call { func, args, .. } => self.gen_call(func, args, false),
Expr::Directive { name: "inline", args: [func, args @ ..], .. } => { Expr::Directive { name: "inline", args: [func, args @ ..], .. } => {
@ -2713,7 +2724,10 @@ impl<'a> Codegen<'a> {
return None; 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)
}))
} }
} }

View file

@ -5,8 +5,8 @@ main:
ADDI64 r254, r254, -24d ADDI64 r254, r254, -24d
ST r31, r254, 0a, 24h ST r31, r254, 0a, 24h
JAL r31, r0, :cond JAL r31, r0, :cond
CP r33, r1
CP r32, r0 CP r32, r0
CP r33, r1
JNE r33, r32, :0 JNE r33, r32, :0
JMP :1 JMP :1
0: LI64 r32, 2d 0: LI64 r32, 2d

View file

@ -37,41 +37,41 @@ main:
ST r31, r254, 0a, 40h ST r31, r254, 0a, 40h
CP r2, r0 CP r2, r0
JAL r31, r0, :multiple_breaks JAL r31, r0, :multiple_breaks
CP r32, r1 LI64 r32, 3d
LI64 r33, 3d CP r33, r1
JEQ r32, r33, :0 JEQ r33, r32, :0
LI64 r32, 1d LI64 r32, 1d
CP r1, r32 CP r1, r32
JMP :1 JMP :1
0: LI64 r32, 4d 0: LI64 r33, 4d
CP r2, r32 CP r2, r33
JAL r31, r0, :multiple_breaks JAL r31, r0, :multiple_breaks
CP r34, r1 LI64 r34, 10d
LI64 r35, 10d CP r35, r1
JEQ r34, r35, :2 JEQ r35, r34, :2
LI64 r32, 2d LI64 r32, 2d
CP r1, r32 CP r1, r32
JMP :1 JMP :1
2: CP r2, r0 2: CP r2, r0
JAL r31, r0, :state_change_in_break JAL r31, r0, :state_change_in_break
CP r34, r1 CP r35, r1
JEQ r34, r0, :3 JEQ r35, 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 r1, r32 CP r1, r32
JMP :1 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 JAL r31, r0, :continue_and_state_change
CP r32, r1 CP r33, r1
JEQ r32, r35, :5 JEQ r33, r34, :5
LI64 r32, 5d LI64 r32, 5d
CP r1, r32 CP r1, r32
JMP :1 JMP :1
5: CP r2, r33 5: CP r2, r32
JAL r31, r0, :continue_and_state_change JAL r31, r0, :continue_and_state_change
CP r32, r1 CP r32, r1
JEQ r32, r0, :6 JEQ r32, r0, :6

View file

@ -42,10 +42,11 @@ free:
CP r4, r14 CP r4, r14
CP r5, r15 CP r5, r15
ECA ECA
CP r13, r1
JALA r0, r31, 0a JALA r0, r31, 0a
main: main:
ADDI64 r254, r254, -96d ADDI64 r254, r254, -88d
ST r31, r254, 48a, 48h ST r31, r254, 48a, 40h
ADDI64 r32, r254, 24d ADDI64 r32, r254, 24d
CP r1, r32 CP r1, r32
JAL r31, r0, :new JAL r31, r0, :new
@ -60,20 +61,19 @@ main:
CP r2, r33 CP r2, r33
CP r3, r34 CP r3, r34
JAL r31, r0, :push JAL r31, r0, :push
CP r34, r1 LD r34, r254, 0a, 8h
LD r35, r254, 0a, 8h LD r34, r34, 0a, 1h
LD r35, r35, 0a, 1h LD r35, r254, 24a, 8h
LD r36, r254, 24a, 8h LD r35, r35, 0a, 8h
LD r34, r36, 0a, 8h
CP r2, r33 CP r2, r33
JAL r31, r0, :deinit JAL r31, r0, :deinit
CP r2, r32 CP r2, r32
JAL r31, r0, :deinit JAL r31, r0, :deinit
ANDI r32, r35, 255d ANDI r32, r34, 255d
ADD64 r32, r34, r32 ADD64 r32, r35, r32
CP r1, r32 CP r1, r32
LD r31, r254, 48a, 48h LD r31, r254, 48a, 40h
ADDI64 r254, r254, 96d ADDI64 r254, r254, 88d
JALA r0, r31, 0a JALA r0, r31, 0a
malloc: malloc:
CP r13, r2 CP r13, r2
@ -125,8 +125,8 @@ push:
2: CP r2, r32 2: CP r2, r32
CP r3, r37 CP r3, r37
JAL r31, r0, :malloc JAL r31, r0, :malloc
CP r35, r1
ST r32, r38, 16a, 8h ST r32, r38, 16a, 8h
CP r35, r1
JNE r35, r0, :3 JNE r35, r0, :3
CP r1, r0 CP r1, r0
JMP :4 JMP :4
@ -179,8 +179,8 @@ push:
CP r2, r34 CP r2, r34
CP r3, r40 CP r3, r40
JAL r31, r0, :malloc JAL r31, r0, :malloc
CP r35, r1
ST r32, r38, 16a, 8h ST r32, r38, 16a, 8h
CP r35, r1
JNE r35, r0, :3 JNE r35, r0, :3
CP r1, r0 CP r1, r0
JMP :4 JMP :4

View file

@ -2,8 +2,8 @@ inb:
CP r1, r0 CP r1, r0
JALA r0, r31, 0a JALA r0, r31, 0a
main: main:
ADDI64 r254, r254, -32d ADDI64 r254, r254, -24d
ST r31, r254, 0a, 32h ST r31, r254, 0a, 24h
LRA r32, r0, :ports LRA r32, r0, :ports
LD r33, r32, 0a, 1h LD r33, r32, 0a, 1h
ANDI r33, r33, 255d ANDI r33, r33, 255d
@ -11,12 +11,12 @@ main:
JMP :1 JMP :1
0: JAL r31, r0, :inb 0: JAL r31, r0, :inb
CP r33, r1 CP r33, r1
CMPU r34, r33, r0 CMPU r33, r33, r0
CMPUI r34, r34, 0d CMPUI r33, r33, 0d
NOT r34, r34 NOT r33, r33
ST r34, r32, 0a, 1h ST r33, r32, 0a, 1h
1: LD r31, r254, 0a, 32h 1: LD r31, r254, 0a, 24h
ADDI64 r254, r254, 32d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 164 code size: 164
ret: 0 ret: 0

View file

@ -6,9 +6,9 @@ integer_range:
CP r2, r16 CP r2, r16
CP r3, r15 CP r3, r15
ECA ECA
CP r15, r1
SUB64 r14, r14, r13 SUB64 r14, r14, r13
ADDI64 r14, r14, 1d ADDI64 r14, r14, 1d
CP r15, r1
DIRU64 r0, r14, r15, r14 DIRU64 r0, r14, r15, r14
ADD64 r13, r14, r13 ADD64 r13, r14, r13
CP r1, r13 CP r1, r13

View file

@ -10,26 +10,26 @@ decide:
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
main: main:
ADDI64 r254, r254, -120d ADDI64 r254, r254, -104d
ST r31, r254, 72a, 48h ST r31, r254, 72a, 32h
ADDI64 r32, r254, 48d ADDI64 r32, r254, 48d
CP r1, r32 CP r1, r32
CP r2, r0 CP r2, r0
JAL r31, r0, :decide JAL r31, r0, :decide
ADDI64 r34, r254, 24d ADDI64 r33, r254, 24d
BMC r32, r34, 24h BMC r32, r33, 24h
LI64 r35, 1d LI64 r34, 1d
CP r1, r34 CP r1, r33
CP r2, r35 CP r2, r34
JAL r31, r0, :decide JAL r31, r0, :decide
ADDI64 r36, r254, 0d ADDI64 r34, r254, 0d
BMC r32, r36, 24h BMC r32, r34, 24h
LD r32, r254, 24a, 8h LD r32, r254, 24a, 8h
LD r33, r254, 0a, 8h LD r33, r254, 0a, 8h
ADD64 r32, r33, r32 ADD64 r32, r33, r32
CP r1, r32 CP r1, r32
LD r31, r254, 72a, 48h LD r31, r254, 72a, 32h
ADDI64 r254, r254, 120d ADDI64 r254, r254, 104d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 273 code size: 273
ret: 1 ret: 1

View file

@ -1,6 +1,6 @@
main: main:
ADDI64 r254, r254, -66d ADDI64 r254, r254, -58d
ST r31, r254, 26a, 40h ST r31, r254, 26a, 32h
JAL r31, r0, :returner_fn JAL r31, r0, :returner_fn
CP r32, r1 CP r32, r1
ADDI64 r33, r254, 2d ADDI64 r33, r254, 2d
@ -25,8 +25,8 @@ main:
JMP :1 JMP :1
0: LI64 r32, 1d 0: LI64 r32, 1d
CP r1, r32 CP r1, r32
1: LD r31, r254, 26a, 40h 1: LD r31, r254, 26a, 32h
ADDI64 r254, r254, 66d ADDI64 r254, r254, 58d
JALA r0, r31, 0a JALA r0, r31, 0a
returner_bn: returner_bn:
ADDI64 r254, r254, -24d ADDI64 r254, r254, -24d

View file

@ -6,9 +6,9 @@ main:
ADDI64 r254, r254, -128d ADDI64 r254, r254, -128d
ST r31, r254, 80a, 48h ST r31, r254, 80a, 48h
JAL r31, r0, :decide JAL r31, r0, :decide
CP r32, r1
CP r33, r0 CP r33, r0
ADDI64 r34, r254, 72d ADDI64 r34, r254, 72d
CP r32, r1
ANDI r32, r32, 255d ANDI r32, r32, 255d
JNE r32, r0, :0 JNE r32, r0, :0
CP r32, r33 CP r32, r33
@ -37,8 +37,8 @@ main:
CP r1, r32 CP r1, r32
JMP :3 JMP :3
6: JAL r31, r0, :decide 6: JAL r31, r0, :decide
CP r32, r1
CP r33, r0 CP r33, r0
CP r32, r1
ANDI r32, r32, 255d ANDI r32, r32, 255d
JNE r32, r0, :7 JNE r32, r0, :7
CP r32, r33 CP r32, r33

View file

@ -1,6 +1,6 @@
main: main:
ADDI64 r254, r254, -64d ADDI64 r254, r254, -56d
ST r31, r254, 24a, 40h ST r31, r254, 24a, 32h
ADDI64 r32, r254, 0d ADDI64 r32, r254, 0d
LI64 r33, 1d LI64 r33, 1d
ST r33, r254, 16a, 8h ST r33, r254, 16a, 8h
@ -9,14 +9,14 @@ main:
ST r33, r254, 8a, 8h ST r33, r254, 8a, 8h
JAL r31, r0, :opaque JAL r31, r0, :opaque
ST r1, r32, 0a, 16h ST r1, r32, 0a, 16h
LD r34, r254, 8a, 8h LD r33, r254, 8a, 8h
LD r35, r254, 16a, 8h LD r34, r254, 16a, 8h
ADD64 r34, r35, r34 ADD64 r33, r34, r33
LD r32, r254, 0a, 8h LD r32, r254, 0a, 8h
SUB64 r32, r32, r34 SUB64 r32, r32, r33
CP r1, r32 CP r1, r32
LD r31, r254, 24a, 40h LD r31, r254, 24a, 32h
ADDI64 r254, r254, 64d ADDI64 r254, r254, 56d
JALA r0, r31, 0a JALA r0, r31, 0a
opaque: opaque:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -16d

View file

@ -12,8 +12,8 @@ create_back_buffer:
0: LI8 r34, 255b 0: LI8 r34, 255b
CP r2, r34 CP r2, r34
JAL r31, r0, :request_page JAL r31, r0, :request_page
CP r35, r1
SUB64 r32, r32, r33 SUB64 r32, r32, r33
CP r35, r1
5: JGTS r32, r0, :2 5: JGTS r32, r0, :2
CP r1, r35 CP r1, r35
JMP :1 JMP :1

View file

@ -1,23 +1,23 @@
main: main:
ADDI64 r254, r254, -52d ADDI64 r254, r254, -44d
ST r31, r254, 4a, 48h ST r31, r254, 4a, 40h
ADDI64 r32, r254, 0d ADDI64 r32, r254, 0d
JAL r31, r0, :random_color JAL r31, r0, :random_color
ST r1, r32, 0a, 4h ST r1, r32, 0a, 4h
LD r34, r254, 0a, 1h LD r33, r254, 0a, 1h
LD r35, r254, 1a, 1h LD r34, r254, 1a, 1h
LD r36, r254, 2a, 1h LD r35, r254, 2a, 1h
ANDI r33, r33, 255d
ANDI r34, r34, 255d ANDI r34, r34, 255d
ANDI r35, r35, 255d
LD r32, r254, 3a, 1h LD r32, r254, 3a, 1h
ANDI r33, r36, 255d ANDI r35, r35, 255d
ADD64 r34, r35, r34
ANDI r32, r32, 255d
ADD64 r33, r34, r33 ADD64 r33, r34, r33
ANDI r32, r32, 255d
ADD64 r33, r33, r35
ADD64 r32, r33, r32 ADD64 r32, r33, r32
CP r1, r32 CP r1, r32
LD r31, r254, 4a, 48h LD r31, r254, 4a, 40h
ADDI64 r254, r254, 52d ADDI64 r254, r254, 44d
JALA r0, r31, 0a JALA r0, r31, 0a
random_color: random_color:
LRA r13, r0, :white LRA r13, r0, :white

View file

@ -5,8 +5,8 @@ do_stuff:
just_read: just_read:
JALA r0, r31, 0a JALA r0, r31, 0a
main: main:
ADDI64 r254, r254, -80d ADDI64 r254, r254, -72d
ST r31, r254, 48a, 32h ST r31, r254, 48a, 24h
ADDI64 r32, r254, 16d ADDI64 r32, r254, 16d
CP r1, r32 CP r1, r32
JAL r31, r0, :optionala JAL r31, r0, :optionala
@ -37,8 +37,8 @@ main:
CP r33, r1 CP r33, r1
ADD64 r32, r33, r32 ADD64 r32, r33, r32
CP r1, r32 CP r1, r32
1: LD r31, r254, 48a, 32h 1: LD r31, r254, 48a, 24h
ADDI64 r254, r254, 80d ADDI64 r254, r254, 72d
JALA r0, r31, 0a JALA r0, r31, 0a
optional: optional:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -16d

View file

@ -9,8 +9,8 @@ foo:
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
main: main:
ADDI64 r254, r254, -88d ADDI64 r254, r254, -80d
ST r31, r254, 48a, 40h ST r31, r254, 48a, 32h
ADDI64 r32, r254, 32d ADDI64 r32, r254, 32d
JAL r31, r0, :foo JAL r31, r0, :foo
ST r1, r32, 0a, 16h ST r1, r32, 0a, 16h
@ -30,8 +30,8 @@ main:
LI64 r33, 7d LI64 r33, 7d
SUB64 r32, r33, r32 SUB64 r32, r33, r32
CP r1, r32 CP r1, r32
LD r31, r254, 48a, 40h LD r31, r254, 48a, 32h
ADDI64 r254, r254, 88d ADDI64 r254, r254, 80d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 347 code size: 347
ret: 0 ret: 0

View file

@ -1,46 +1,46 @@
main: main:
ADDI64 r254, r254, -48d ADDI64 r254, r254, -40d
ST r31, r254, 16a, 32h ST r31, r254, 16a, 24h
ADDI64 r32, r254, 0d ADDI64 r32, r254, 0d
CP r3, r0 CP r3, r0
CP r4, r0 CP r4, r0
JAL r31, r0, :maina JAL r31, r0, :maina
ST r1, r32, 0a, 16h ST r1, r32, 0a, 16h
LD r34, r254, 12a, 1h LD r33, r254, 12a, 1h
LD r32, r254, 3a, 1h LD r32, r254, 3a, 1h
SUB8 r32, r32, r34 SUB8 r32, r32, r33
ANDI r32, r32, 255d ANDI r32, r32, 255d
CP r1, r32 CP r1, r32
LD r31, r254, 16a, 32h LD r31, r254, 16a, 24h
ADDI64 r254, r254, 48d ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
maina: maina:
ADDI64 r254, r254, -52d ADDI64 r254, r254, -44d
ST r31, r254, 20a, 32h ST r31, r254, 20a, 24h
ADDI64 r32, r254, 16d ADDI64 r32, r254, 16d
JAL r31, r0, :small_struct JAL r31, r0, :small_struct
ST r1, r32, 0a, 4h ST r1, r32, 0a, 4h
ST r0, r254, 0a, 1h ST r0, r254, 0a, 1h
ST r0, r254, 1a, 1h ST r0, r254, 1a, 1h
ST r0, r254, 2a, 1h ST r0, r254, 2a, 1h
LI8 r33, 3b LI8 r32, 3b
ST r33, r254, 3a, 1h ST r32, r254, 3a, 1h
LI8 r34, 1b LI8 r33, 1b
ST r34, r254, 4a, 1h ST r33, r254, 4a, 1h
ST r0, r254, 5a, 1h ST r0, r254, 5a, 1h
ST r0, r254, 6a, 1h ST r0, r254, 6a, 1h
ST r0, r254, 7a, 1h ST r0, r254, 7a, 1h
ST r0, r254, 8a, 1h ST r0, r254, 8a, 1h
ST r0, r254, 9a, 1h ST r0, r254, 9a, 1h
ST r0, r254, 10a, 1h ST r0, r254, 10a, 1h
ST r33, r254, 11a, 1h ST r32, r254, 11a, 1h
ST r34, r254, 12a, 1h ST r33, r254, 12a, 1h
ST r0, r254, 13a, 1h ST r0, r254, 13a, 1h
ST r0, r254, 14a, 1h ST r0, r254, 14a, 1h
ST r0, r254, 15a, 1h ST r0, r254, 15a, 1h
LD r1, r254, 0a, 16h LD r1, r254, 0a, 16h
LD r31, r254, 20a, 32h LD r31, r254, 20a, 24h
ADDI64 r254, r254, 52d ADDI64 r254, r254, 44d
JALA r0, r31, 0a JALA r0, r31, 0a
small_struct: small_struct:
ADDI64 r254, r254, -4d ADDI64 r254, r254, -4d