adding the stack offset elision for return values as well

Signed-off-by: Jakub Doka <jakub.doka2@gmail.com>
This commit is contained in:
Jakub Doka 2024-12-15 17:57:22 +01:00
parent f9c47f86ad
commit 5a7a01ca02
No known key found for this signature in database
GPG key ID: C6E9A89936B8C143
14 changed files with 74 additions and 96 deletions

View file

@ -392,11 +392,10 @@ impl Nodes {
op.cond_op(self[self[cnd].inputs[1]].ty) op.cond_op(self[self[cnd].inputs[1]].ty)
} }
fn strip_offset(&self, region: Nid, ty: ty::Id, tys: &Types) -> (Nid, Offset) { fn strip_offset(&self, region: Nid) -> (Nid, Offset) {
if matches!(self[region].kind, Kind::BinOp { op: TokenKind::Add | TokenKind::Sub }) if matches!(self[region].kind, Kind::BinOp { op: TokenKind::Add | TokenKind::Sub })
&& self.is_locked(region) && self.is_locked(region)
&& let Kind::CInt { value } = self[self[region].inputs[2]].kind && let Kind::CInt { value } = self[self[region].inputs[2]].kind
&& ty.loc(tys) == Loc::Reg
{ {
(self[region].inputs[1], value as _) (self[region].inputs[1], value as _)
} else { } else {
@ -442,7 +441,7 @@ impl Nodes {
// this means the struct is actually loaded into a register so no BMC needed // this means the struct is actually loaded into a register so no BMC needed
|| (node.kind == Kind::Load || (node.kind == Kind::Load
&& !matches!(tys.parama(node.ty).0, Some(PLoc::Ref(..))) && !matches!(tys.parama(node.ty).0, Some(PLoc::Ref(..)))
&& node.outputs.iter().all(|&o| self[o].kind.is_call()))) && node.outputs.iter().all(|&o| matches!(self[o].kind, Kind::Call { .. } | Kind::Return { .. }))))
} }
} }

View file

@ -4,14 +4,14 @@ use {
reg::{self, Reg}, reg::{self, Reg},
HbvmBackend, Nid, Nodes, PLoc, Reloc, TypedReloc, HbvmBackend, Nid, Nodes, PLoc, Reloc, TypedReloc,
}, },
lexer::{Token, TokenKind}, lexer::TokenKind,
parser, quad_sort, parser, quad_sort,
son::{Kind, ARG_START, MEM, VOID}, son::{Kind, ARG_START, MEM, VOID},
ty::{self, Arg, Loc, Module, Offset, Sig, Types}, ty::{self, Arg, Loc, Module, Offset, Sig, Types},
utils::{BitSet, EntSlice}, utils::{BitSet, EntSlice},
}, },
alloc::{borrow::ToOwned, vec::Vec}, alloc::{borrow::ToOwned, vec::Vec},
core::{assert_matches::debug_assert_matches, mem, ops::Range, usize}, core::{assert_matches::debug_assert_matches, mem, ops::Range},
hbbytecode::{self as instrs}, hbbytecode::{self as instrs},
}; };
@ -136,7 +136,7 @@ impl HbvmBackend {
let offset_atr = |pallc: Nid, offsets: &[Offset]| { let offset_atr = |pallc: Nid, offsets: &[Offset]| {
let allc = strip_load(pallc); let allc = strip_load(pallc);
if nodes.is_locked(allc) { if nodes.is_locked(allc) {
let (region, offset) = nodes.strip_offset(allc, ty::Id::VOID, tys); let (region, offset) = nodes.strip_offset(allc);
match nodes[region].kind { match nodes[region].kind {
Kind::Stck => { Kind::Stck => {
return ( return (
@ -268,12 +268,12 @@ impl HbvmBackend {
match retl { match retl {
None => {} None => {}
Some(PLoc::Reg(r, size)) if sig.ret.loc(tys) == Loc::Stack => { Some(PLoc::Reg(r, size)) if sig.ret.loc(tys) == Loc::Stack => {
// TODO: handle the stack load let (src, offset) = offset_atr(ret, &self.offsets);
self.emit(instrs::ld(r, atr(ret), 0, size)) self.emit(instrs::ld(r, src, offset, size))
} }
Some(PLoc::WideReg(r, size)) => { Some(PLoc::WideReg(r, size)) => {
// TODO: handle the stack load let (src, offset) = offset_atr(ret, &self.offsets);
self.emit(instrs::ld(r, atr(ret), 0, size)) self.emit(instrs::ld(r, src, offset, size))
} }
Some(PLoc::Reg(r, _)) => { Some(PLoc::Reg(r, _)) => {
alloc_buf.push(atr(ret)); alloc_buf.push(atr(ret));
@ -419,6 +419,13 @@ 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 {
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::Global { global } => { Kind::Global { global } => {
let reloc = Reloc::new(self.code.len(), 3, 4); let reloc = Reloc::new(self.code.len(), 3, 4);
@ -431,7 +438,7 @@ impl HbvmBackend {
self.emit(instrs::addi64(atr(nid), base, offset as _)); self.emit(instrs::addi64(atr(nid), base, offset as _));
} }
Kind::Load => { Kind::Load => {
let (region, offset) = nodes.strip_offset(node.inputs[1], node.ty, tys); let (region, offset) = nodes.strip_offset(node.inputs[1]);
let size = tys.size_of(node.ty); let size = tys.size_of(node.ty);
if node.ty.loc(tys) != Loc::Stack { if node.ty.loc(tys) != Loc::Stack {
let (base, offset) = match nodes[region].kind { let (base, offset) = match nodes[region].kind {
@ -445,7 +452,7 @@ impl HbvmBackend {
} }
Kind::Stre => { Kind::Stre => {
debug_assert_ne!(node.inputs[1], VOID); debug_assert_ne!(node.inputs[1], VOID);
let (region, offset) = nodes.strip_offset(node.inputs[2], node.ty, tys); let (region, offset) = nodes.strip_offset(node.inputs[2]);
let size = u16::try_from(tys.size_of(node.ty)).expect("TODO"); let size = u16::try_from(tys.size_of(node.ty)).expect("TODO");
let (base, offset, src) = match nodes[region].kind { let (base, offset, src) = match nodes[region].kind {
Kind::Stck if node.ty.loc(tys) == Loc::Reg => ( Kind::Stck if node.ty.loc(tys) == Loc::Reg => (
@ -474,16 +481,6 @@ impl HbvmBackend {
| Kind::Phi | Kind::Phi
| Kind::Join) => unreachable!("{e:?}"), | Kind::Join) => unreachable!("{e:?}"),
} }
if let Kind::Call { .. } = node.kind {
let (ret, ..) = tys.parama(node.ty);
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(..)) => {}
}
}
} }
} }
@ -502,6 +499,7 @@ impl HbvmBackend {
vec![], vec![],
"{bundle_count}" "{bundle_count}"
); );
( (
if tail { if tail {
bundle_count.saturating_sub(reg::RET_ADDR as _) bundle_count.saturating_sub(reg::RET_ADDR as _)

View file

@ -66,12 +66,11 @@ main:
JALA r0, r31, 0a JALA r0, r31, 0a
new_stru: new_stru:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -16d
ADDI64 r13, r254, 0d
ST r0, r254, 0a, 8h ST r0, r254, 0a, 8h
ST r0, r254, 8a, 8h ST r0, r254, 8a, 8h
LD r1, r13, 0a, 16h LD r1, r254, 0a, 16h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 684 code size: 673
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -17,16 +17,15 @@ main:
return_fn: return_fn:
ADDI64 r254, r254, -6d ADDI64 r254, r254, -6d
LI8 r13, 1b LI8 r13, 1b
ADDI64 r14, r254, 0d
ST r13, r254, 0a, 1h ST r13, r254, 0a, 1h
ST r0, r254, 1a, 1h ST r0, r254, 1a, 1h
ST r0, r254, 2a, 1h ST r0, r254, 2a, 1h
ST r0, r254, 3a, 1h ST r0, r254, 3a, 1h
ST r0, r254, 4a, 1h ST r0, r254, 4a, 1h
ST r0, r254, 5a, 1h ST r0, r254, 5a, 1h
LD r1, r14, 0a, 6h LD r1, r254, 0a, 6h
ADDI64 r254, r254, 6d ADDI64 r254, r254, 6d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 288 code size: 277
ret: 1 ret: 1
status: Ok(()) status: Ok(())

View file

@ -9,31 +9,27 @@ foo:
LD r33, r254, 64a, 1h LD r33, r254, 64a, 1h
ANDI r33, r33, 255d ANDI r33, r33, 255d
JNE r33, r0, :0 JNE r33, r0, :0
ADDI64 r32, r254, 48d
ST r0, r254, 48a, 1h ST r0, r254, 48a, 1h
LD r1, r32, 0a, 16h LD r1, r254, 48a, 16h
JMP :1 JMP :1
0: LI8 r33, 1b 0: LI8 r33, 1b
LI64 r34, 4d LI64 r34, 4d
LD r32, r254, 72a, 8h LD r32, r254, 72a, 8h
JNE r32, r34, :2 JNE r32, r34, :2
ADDI64 r32, r254, 32d
ST r33, r254, 32a, 1h ST r33, r254, 32a, 1h
LI64 r33, 2d LI64 r32, 2d
ST r33, r254, 40a, 8h ST r32, r254, 40a, 8h
LD r1, r32, 0a, 16h LD r1, r254, 32a, 16h
JMP :1 JMP :1
2: LRA r34, r0, :magic 2: LRA r34, r0, :magic
LD r34, r34, 0a, 8h LD r34, r34, 0a, 8h
JNE r34, r32, :3 JNE r34, r32, :3
ADDI64 r32, r254, 16d
ST r33, r254, 16a, 1h ST r33, r254, 16a, 1h
ST r0, r254, 24a, 8h ST r0, r254, 24a, 8h
LD r1, r32, 0a, 16h LD r1, r254, 16a, 16h
JMP :1 JMP :1
3: ADDI64 r32, r254, 0d 3: ST r0, r254, 0a, 1h
ST r0, r254, 0a, 1h LD r1, r254, 0a, 16h
LD r1, r32, 0a, 16h
1: LD r31, r254, 80a, 32h 1: LD r31, r254, 80a, 32h
ADDI64 r254, r254, 112d ADDI64 r254, r254, 112d
JALA r0, r31, 0a JALA r0, r31, 0a
@ -46,14 +42,12 @@ get:
LD r14, r14, 0a, 8h LD r14, r14, 0a, 8h
JNE r14, r13, :0 JNE r14, r13, :0
LI8 r13, 1b LI8 r13, 1b
ADDI64 r15, r254, 16d
ST r13, r254, 16a, 1h ST r13, r254, 16a, 1h
ST r14, r254, 24a, 8h ST r14, r254, 24a, 8h
LD r1, r15, 0a, 16h LD r1, r254, 16a, 16h
JMP :1 JMP :1
0: ADDI64 r13, r254, 0d 0: ST r0, r254, 0a, 1h
ST r0, r254, 0a, 1h LD r1, r254, 0a, 16h
LD r1, r13, 0a, 16h
1: ADDI64 r254, r254, 32d 1: ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
main: main:
@ -73,6 +67,6 @@ main:
1: LD r31, r254, 16a, 24h 1: LD r31, r254, 16a, 24h
ADDI64 r254, r254, 40d ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 739 code size: 673
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -42,10 +42,9 @@ returner_bn:
returner_cn: returner_cn:
ADDI64 r254, r254, -2d ADDI64 r254, r254, -2d
LI8 r13, 1b LI8 r13, 1b
ADDI64 r14, r254, 0d
ST r13, r254, 0a, 1h ST r13, r254, 0a, 1h
ST r0, r254, 1a, 1h ST r0, r254, 1a, 1h
LD r1, r14, 0a, 2h LD r1, r254, 0a, 2h
ADDI64 r254, r254, 2d ADDI64 r254, r254, 2d
JALA r0, r31, 0a JALA r0, r31, 0a
returner_fn: returner_fn:
@ -53,6 +52,6 @@ returner_fn:
ORI r13, r13, 128d ORI r13, r13, 128d
CP r1, r13 CP r1, r13
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 463 code size: 452
ret: 1 ret: 1
status: Ok(()) status: Ok(())

View file

@ -117,17 +117,15 @@ new_bar:
new_foo: new_foo:
ADDI64 r254, r254, -24d ADDI64 r254, r254, -24d
ADDI64 r13, r254, 0d ADDI64 r13, r254, 0d
ADDI64 r14, r254, 8d
ST r13, r254, 8a, 8h ST r13, r254, 8a, 8h
ST r0, r254, 16a, 8h ST r0, r254, 16a, 8h
LD r1, r14, 0a, 16h LD r1, r254, 8a, 16h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
no_foo: no_foo:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -16d
ADDI64 r13, r254, 0d
ST r0, r254, 0a, 8h ST r0, r254, 0a, 8h
LD r1, r13, 0a, 16h LD r1, r254, 0a, 16h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
use_foo: use_foo:
@ -136,6 +134,6 @@ use_foo:
ADDI64 r2, r254, 0d ADDI64 r2, r254, 0d
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 1114 code size: 1092
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -21,13 +21,12 @@ main:
opaque: opaque:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -16d
LI64 r13, 3d LI64 r13, 3d
ADDI64 r14, r254, 0d
ST r13, r254, 0a, 8h ST r13, r254, 0a, 8h
LI64 r13, 2d LI64 r13, 2d
ST r13, r254, 8a, 8h ST r13, r254, 8a, 8h
LD r1, r14, 0a, 16h LD r1, r254, 0a, 16h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 310 code size: 299
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,12 +1,11 @@
get_format: get_format:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -16d
LI8 r13, 1b LI8 r13, 1b
ADDI64 r14, r254, 0d LRA r14, r0, :bmp
LRA r15, r0, :bmp
ST r13, r254, 0a, 1h ST r13, r254, 0a, 1h
LD r13, r15, 0a, 8h LD r13, r14, 0a, 8h
ST r13, r254, 8a, 8h ST r13, r254, 8a, 8h
LD r1, r14, 0a, 16h LD r1, r254, 0a, 16h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
main: main:
@ -26,6 +25,6 @@ main:
1: LD r31, r254, 16a, 24h 1: LD r31, r254, 16a, 24h
ADDI64 r254, r254, 40d ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 275 code size: 264
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,16 +1,15 @@
constructor: constructor:
ADDI64 r254, r254, -40d ADDI64 r254, r254, -32d
ST r31, r254, 16a, 24h ST r31, r254, 16a, 16h
CP r32, r3 CP r32, r3
CP r2, r32 CP r2, r32
JAL r31, r0, :opaque JAL r31, r0, :opaque
CP r32, r1 CP r32, r1
ADDI64 r33, r254, 0d
ST r32, r254, 0a, 8h ST r32, r254, 0a, 8h
ST r32, r254, 8a, 8h ST r32, r254, 8a, 8h
LD r1, r33, 0a, 16h LD r1, r254, 0a, 16h
LD r31, r254, 16a, 24h LD r31, r254, 16a, 16h
ADDI64 r254, r254, 40d ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
main: main:
ADDI64 r254, r254, -32d ADDI64 r254, r254, -32d
@ -30,6 +29,6 @@ opaque:
ANDI r13, r13, 255d ANDI r13, r13, 255d
CP r1, r13 CP r1, r13
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 279 code size: 268
ret: 255 ret: 255
status: Ok(()) status: Ok(())

View file

@ -14,22 +14,21 @@ main:
ADDI64 r254, r254, 28d ADDI64 r254, r254, 28d
JALA r0, r31, 0a JALA r0, r31, 0a
u32_to_color: u32_to_color:
ADDI64 r254, r254, -28d ADDI64 r254, r254, -20d
ST r31, r254, 4a, 24h ST r31, r254, 4a, 16h
CP r32, r2 CP r32, r2
CP r2, r32 CP r2, r32
JAL r31, r0, :u32_to_u32 JAL r31, r0, :u32_to_u32
CP r32, r1 CP r32, r1
ADDI64 r33, r254, 0d
ST r32, r254, 0a, 4h ST r32, r254, 0a, 4h
LD r1, r33, 0a, 4h LD r1, r254, 0a, 4h
LD r31, r254, 4a, 24h LD r31, r254, 4a, 16h
ADDI64 r254, r254, 28d ADDI64 r254, r254, 20d
JALA r0, r31, 0a JALA r0, r31, 0a
u32_to_u32: u32_to_u32:
CP r13, r2 CP r13, r2
CP r1, r13 CP r1, r13
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 281 code size: 270
ret: 255 ret: 255
status: Ok(()) status: Ok(())

View file

@ -43,11 +43,10 @@ main:
optional: optional:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -16d
LI8 r13, 1b LI8 r13, 1b
ADDI64 r14, r254, 0d
ST r13, r254, 0a, 1h ST r13, r254, 0a, 1h
LI64 r13, 10d LI64 r13, 10d
ST r13, r254, 8a, 8h ST r13, r254, 8a, 8h
LD r1, r14, 0a, 16h LD r1, r254, 0a, 16h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
optionala: optionala:
@ -66,6 +65,6 @@ optionala:
BMC r15, r17, 32h BMC r15, r17, 32h
ADDI64 r254, r254, 48d ADDI64 r254, r254, 48d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 567 code size: 556
ret: 100 ret: 100
status: Ok(()) status: Ok(())

View file

@ -1,12 +1,11 @@
foo: foo:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -16d
LI64 r13, 3d LI64 r13, 3d
ADDI64 r14, r254, 0d
ST r13, r254, 0a, 8h ST r13, r254, 0a, 8h
LI32 r13, 2w LI32 r13, 2w
ST r13, r254, 8a, 4h ST r13, r254, 8a, 4h
ST r13, r254, 12a, 4h ST r13, r254, 12a, 4h
LD r1, r14, 0a, 16h LD r1, r254, 0a, 16h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
main: main:
@ -34,6 +33,6 @@ main:
LD r31, r254, 48a, 40h LD r31, r254, 48a, 40h
ADDI64 r254, r254, 88d ADDI64 r254, r254, 88d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 358 code size: 347
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -15,42 +15,40 @@ main:
ADDI64 r254, r254, 48d ADDI64 r254, r254, 48d
JALA r0, r31, 0a JALA r0, r31, 0a
maina: maina:
ADDI64 r254, r254, -60d ADDI64 r254, r254, -52d
ST r31, r254, 20a, 40h ST r31, r254, 20a, 32h
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
ADDI64 r33, r254, 0d
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 r34, 3b LI8 r33, 3b
ST r34, r254, 3a, 1h ST r33, r254, 3a, 1h
LI8 r35, 1b LI8 r34, 1b
ST r35, r254, 4a, 1h ST r34, 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 r34, r254, 11a, 1h ST r33, r254, 11a, 1h
ST r35, r254, 12a, 1h ST r34, 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, r33, 0a, 16h LD r1, r254, 0a, 16h
LD r31, r254, 20a, 40h LD r31, r254, 20a, 32h
ADDI64 r254, r254, 60d ADDI64 r254, r254, 52d
JALA r0, r31, 0a JALA r0, r31, 0a
small_struct: small_struct:
ADDI64 r254, r254, -4d ADDI64 r254, r254, -4d
ADDI64 r13, r254, 0d
ST r0, r254, 0a, 2h ST r0, r254, 0a, 2h
ST r0, r254, 2a, 2h ST r0, r254, 2a, 2h
LD r1, r13, 0a, 4h LD r1, r254, 0a, 4h
ADDI64 r254, r254, 4d ADDI64 r254, r254, 4d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 559 code size: 537
ret: 2 ret: 2
status: Ok(()) status: Ok(())