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:
parent
f05c61a99e
commit
a8aba7e7c2
|
@ -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!(),
|
||||||
|
|
|
@ -169,14 +169,10 @@ 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() {
|
|
||||||
deepest = inp;
|
|
||||||
} else {
|
|
||||||
debug_assert!(!self.is_cfg(inp));
|
debug_assert!(!self.is_cfg(inp));
|
||||||
deepest = self.idom(inp, Some(scheds));
|
deepest = self.idom(inp, Some(scheds));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
scheds[node as usize] = deepest;
|
scheds[node as usize] = deepest;
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue