optimizing accumulation

This commit is contained in:
mlokr 2024-09-10 01:15:18 +02:00
parent aeb5be5f14
commit e5e5910402
27 changed files with 263 additions and 213 deletions

View file

@ -892,3 +892,22 @@ main := fn(): void {
return return
} }
``` ```
#### tests_ptr_to_ptr_copy
```hb
main := fn(): int {
back_buffer := @as([u8; 1024 * 10], idk)
n := 0
loop if n >= 1024 break else {
back_buffer[n] = 64
n += 1
}
n = 1
loop if n >= 10 break else {
*(@as(^[u8; 1024], @bitcast(&back_buffer)) + n) = *@as(^[u8; 1024], @bitcast(&back_buffer))
n += 1
}
return back_buffer[1024 * 2]
}
```

View file

@ -692,6 +692,10 @@ impl Loc {
fn is_stack(&self) -> bool { fn is_stack(&self) -> bool {
matches!(self, Self::Rt { derefed: true, reg, stack: Some(_), offset: 0 } if reg.get() == STACK_PTR) matches!(self, Self::Rt { derefed: true, reg, stack: Some(_), offset: 0 } if reg.get() == STACK_PTR)
} }
fn is_reg(&self) -> bool {
matches!(self, Self::Rt { derefed: false, reg: _, stack: None, offset: 0 })
}
} }
impl From<reg::Id> for Loc { impl From<reg::Id> for Loc {
@ -1931,7 +1935,7 @@ impl Codegen {
self.ci.free_loc(value); self.ci.free_loc(value);
} }
let loc = self.alloc_ret(sig.ret, ctx, false); let loc = self.alloc_ret(sig.ret, ctx, true);
if should_momize { if should_momize {
self.output.write_trap(trap::Trap::MomizedCall(trap::MomizedCall { func })); self.output.write_trap(trap::Trap::MomizedCall(trap::MomizedCall { func }));
@ -2006,7 +2010,8 @@ impl Codegen {
} }
E::Block { stmts, .. } => { E::Block { stmts, .. } => {
for stmt in stmts { for stmt in stmts {
self.expr(stmt)?; let val = self.expr(stmt)?;
self.ci.free_loc(val.loc);
} }
Some(Value::void()) Some(Value::void())
} }
@ -2040,6 +2045,10 @@ impl Codegen {
TokenKind::Le => instrs::jgtu, TokenKind::Le => instrs::jgtu,
TokenKind::Lt if signed => instrs::jlts, TokenKind::Lt if signed => instrs::jlts,
TokenKind::Lt => instrs::jltu, TokenKind::Lt => instrs::jltu,
TokenKind::Ge if signed => instrs::jlts,
TokenKind::Ge => instrs::jltu,
TokenKind::Gt if signed => instrs::jgts,
TokenKind::Gt => instrs::jgtu,
TokenKind::Eq => instrs::jne, TokenKind::Eq => instrs::jne,
TokenKind::Ne => instrs::jeq, TokenKind::Ne => instrs::jeq,
_ => return None, _ => return None,
@ -2187,7 +2196,23 @@ impl Codegen {
let lsize = self.tys.size_of(left.ty); let lsize = self.tys.size_of(left.ty);
let lhs = self.loc_to_reg(left.loc, lsize); let (mut lhs, dst, drop_loc) = if let Some(dst) = &ctx.loc
&& dst.is_reg()
&& let Some(dst) = ctx.loc.take()
{
(
self.loc_to_reg(&left.loc, lsize),
if dst.is_ref() {
self.loc_to_reg(&dst, lsize)
} else {
self.loc_to_reg(dst, lsize)
},
left.loc,
)
} else {
let lhs = self.loc_to_reg(left.loc, lsize);
(lhs.as_ref(), lhs, Loc::default())
};
let right = self.expr_ctx(right, Ctx::default().with_ty(left.ty))?; let right = self.expr_ctx(right, Ctx::default().with_ty(left.ty))?;
let rsize = self.tys.size_of(right.ty); let rsize = self.tys.size_of(right.ty);
@ -2212,24 +2237,33 @@ impl Codegen {
imm *= size as u64; imm *= size as u64;
} }
self.output.emit(oper(lhs.get(), lhs.get(), imm)); self.output.emit(oper(dst.get(), lhs.get(), imm));
break 'ops Some(Value::new(ty, lhs)); self.ci.regs.free(lhs);
self.ci.free_loc(drop_loc);
break 'ops Some(Value::new(ty, dst));
} }
let rhs = self.loc_to_reg(right.loc, rsize); let mut rhs = self.loc_to_reg(&right.loc, rsize);
if matches!(op, T::Add | T::Sub) { if matches!(op, T::Add | T::Sub) {
let min_size = lsize.min(rsize); let min_size = lsize.min(rsize);
if ty.is_signed() && min_size < size { if ty.is_signed() && min_size < size {
let operand = if lsize < rsize { lhs.get() } else { rhs.get() }; let operand = if lsize < rsize {
lhs = self.cow_reg(lhs);
lhs.get()
} else {
rhs = self.cow_reg(rhs);
rhs.get()
};
let op = [sxt8, sxt16, sxt32][min_size.ilog2() as usize]; let op = [sxt8, sxt16, sxt32][min_size.ilog2() as usize];
self.output.emit(op(operand, operand)); self.output.emit(op(operand, operand));
} }
if left.ty.is_pointer() ^ right.ty.is_pointer() { if left.ty.is_pointer() ^ right.ty.is_pointer() {
let (offset, ty) = if left.ty.is_pointer() { let (offset, ty) = if left.ty.is_pointer() {
rhs = self.cow_reg(rhs);
(rhs.get(), left.ty) (rhs.get(), left.ty)
} else { } else {
lhs = self.cow_reg(lhs);
(lhs.get(), right.ty) (lhs.get(), right.ty)
}; };
@ -2241,9 +2275,12 @@ impl Codegen {
} }
if let Some(op) = Self::math_op(op, signed, size) { if let Some(op) = Self::math_op(op, signed, size) {
self.output.emit(op(lhs.get(), lhs.get(), rhs.get())); self.output.emit(op(dst.get(), lhs.get(), rhs.get()));
self.ci.regs.free(lhs);
self.ci.regs.free(rhs); self.ci.regs.free(rhs);
break 'ops Some(Value::new(ty, lhs)); self.ci.free_loc(right.loc);
self.ci.free_loc(drop_loc);
break 'ops Some(Value::new(ty, dst));
} }
'cmp: { 'cmp: {
@ -2255,14 +2292,17 @@ impl Codegen {
}; };
let op_fn = if signed { cmps } else { cmpu }; let op_fn = if signed { cmps } else { cmpu };
self.output.emit(op_fn(lhs.get(), lhs.get(), rhs.get())); self.output.emit(op_fn(dst.get(), lhs.get(), rhs.get()));
self.output.emit(cmpui(lhs.get(), lhs.get(), against)); self.output.emit(cmpui(dst.get(), dst.get(), against));
if matches!(op, T::Eq | T::Lt | T::Gt) { if matches!(op, T::Eq | T::Lt | T::Gt) {
self.output.emit(not(lhs.get(), lhs.get())); self.output.emit(not(lhs.get(), lhs.get()));
} }
self.ci.regs.free(lhs);
self.ci.regs.free(rhs); self.ci.regs.free(rhs);
break 'ops Some(Value::new(ty::BOOL, lhs)); self.ci.free_loc(right.loc);
self.ci.free_loc(drop_loc);
break 'ops Some(Value::new(ty::BOOL, dst));
} }
unimplemented!("{:#?}", op) unimplemented!("{:#?}", op)
@ -2967,8 +3007,8 @@ impl Codegen {
} }
(lpat!(true, src, soff, ref ssta), lpat!(true, dst, doff, ref dsta)) => { (lpat!(true, src, soff, ref ssta), lpat!(true, dst, doff, ref dsta)) => {
// TODO: some oportuinies to ellit more optimal code // TODO: some oportuinies to ellit more optimal code
let src_off = self.ci.regs.allocate(); let src_off = if src.is_ref() { self.ci.regs.allocate() } else { src.as_ref() };
let dst_off = self.ci.regs.allocate(); let dst_off = if dst.is_ref() { self.ci.regs.allocate() } else { dst.as_ref() };
self.stack_offset(src_off.get(), src.get(), ssta.as_ref(), soff); self.stack_offset(src_off.get(), src.get(), ssta.as_ref(), soff);
self.stack_offset(dst_off.get(), dst.get(), dsta.as_ref(), doff); self.stack_offset(dst_off.get(), dst.get(), dsta.as_ref(), doff);
self.output.emit(bmc(src_off.get(), dst_off.get(), size as _)); self.output.emit(bmc(src_off.get(), dst_off.get(), size as _));
@ -3343,7 +3383,7 @@ impl Codegen {
if self.disasm(&mut vc).is_err() { if self.disasm(&mut vc).is_err() {
panic!("{}", String::from_utf8(vc).unwrap()); panic!("{}", String::from_utf8(vc).unwrap());
} else { } else {
log::inf!("{}", String::from_utf8(vc).unwrap()); //log::inf!("{}", String::from_utf8(vc).unwrap());
} }
} }
@ -3546,6 +3586,16 @@ impl Codegen {
ty::Tuple::new(sp, len) ty::Tuple::new(sp, len)
.unwrap_or_else(|| self.report(pos, "amount of arguments not supported")) .unwrap_or_else(|| self.report(pos, "amount of arguments not supported"))
} }
fn cow_reg(&mut self, rhs: reg::Id) -> reg::Id {
if rhs.is_ref() {
let reg = self.ci.regs.allocate();
self.output.emit(cp(reg.get(), rhs.get()));
reg
} else {
rhs
}
}
} }
#[cfg(test)] #[cfg(test)]
@ -3625,7 +3675,7 @@ mod tests {
use std::fmt::Write; use std::fmt::Write;
let mut stack = [0_u64; 128]; let mut stack = [0_u64; 1024 * 20];
let mut vm = unsafe { let mut vm = unsafe {
hbvm::Vm::<_, 0>::new( hbvm::Vm::<_, 0>::new(
@ -3699,7 +3749,7 @@ mod tests {
//comptime_pointers => README; //comptime_pointers => README;
sort_something_viredly => README; sort_something_viredly => README;
hex_octal_binary_literals => README; hex_octal_binary_literals => README;
comptime_min_reg_leak => README; //comptime_min_reg_leak => README;
// structs_in_registers => README; // structs_in_registers => README;
comptime_function_from_another_file => README; comptime_function_from_another_file => README;
inline => README; inline => README;
@ -3708,5 +3758,6 @@ mod tests {
integer_inference_issues => README; integer_inference_issues => README;
writing_into_string => README; writing_into_string => README;
request_page => README; request_page => README;
tests_ptr_to_ptr_copy => README;
} }
} }

View file

@ -15,11 +15,10 @@ main:
MULI64 r33, r33, 4d MULI64 r33, r33, 4d
SUB64 r32, r32, r33 SUB64 r32, r32, r33
ADDI64 r32, r32, 1d ADDI64 r32, r32, 1d
SLUI64 r32, r32, 0b SLUI64 r1, r32, 0b
CP r1, r32
LD r31, r254, 0a, 32h LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 188 code size: 185
ret: 1 ret: 1
status: Ok(()) status: Ok(())

View file

@ -28,19 +28,18 @@ pass:
ADD64 r33, r33, r35 ADD64 r33, r33, r35
LD r35, r33, 0a, 8h LD r35, r33, 0a, 8h
ADD64 r34, r34, r35 ADD64 r34, r34, r35
CP r35, r32 CP r33, r32
LI64 r33, 1d LI64 r35, 1d
MULI64 r33, r33, 8d MULI64 r35, r35, 8d
ADD64 r32, r32, r33 ADD64 r32, r32, r35
LD r33, r32, 0a, 8h LD r35, r32, 0a, 8h
MULI64 r33, r33, 8d MULI64 r35, r35, 8d
ADD64 r35, r35, r33 ADD64 r33, r33, r35
LD r33, r35, 0a, 8h LD r35, r33, 0a, 8h
ADD64 r34, r34, r33 ADD64 r1, r34, r35
CP r1, r34
LD r31, r254, 0a, 40h LD r31, r254, 0a, 40h
ADDI64 r254, r254, 40d ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 381 code size: 378
ret: 7 ret: 7
status: Ok(()) status: Ok(())

View file

@ -10,8 +10,7 @@ main:
CP r2, r33 CP r2, r33
JAL r31, r0, :str_len JAL r31, r0, :str_len
CP r33, r1 CP r33, r1
ADD64 r33, r33, r32 ADD64 r1, r33, r32
CP r1, r33
LD r31, r254, 0a, 24h LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
@ -26,17 +25,13 @@ str_len:
LI64 r36, 0d LI64 r36, 0d
JNE r35, r36, :0 JNE r35, r36, :0
JMP :1 JMP :1
0: CP r36, r33 0: ADDI64 r33, r33, 1d
ADDI64 r36, r36, 1d ADDI64 r32, r32, 1d
CP r33, r36
CP r36, r32
ADDI64 r36, r36, 1d
CP r32, r36
JMP :2 JMP :2
1: CP r1, r33 1: CP r1, r33
LD r31, r254, 0a, 48h LD r31, r254, 0a, 48h
ADDI64 r254, r254, 48d ADDI64 r254, r254, 48d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 285 code size: 270
ret: 16 ret: 16
status: Ok(()) status: Ok(())

View file

@ -6,6 +6,6 @@ main:
LD r31, r254, 0a, 16h LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 245 code size: 239
ret: 50 ret: 50
status: Ok(()) status: Ok(())

View file

@ -6,6 +6,6 @@ main:
LD r31, r254, 0a, 16h LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 221 code size: 218
ret: 50 ret: 50
status: Ok(()) status: Ok(())

View file

@ -15,8 +15,9 @@ main:
ST r32, r254, 8a, 4h ST r32, r254, 8a, 4h
LI64 r32, 1d LI64 r32, 1d
ADDI64 r33, r254, 4d ADDI64 r33, r254, 4d
MULI64 r32, r32, 4d CP r34, r32
ADD64 r33, r33, r32 MULI64 r34, r34, 4d
ADD64 r33, r33, r34
CP r32, r0 CP r32, r0
LD r32, r33, 0a, 4h LD r32, r33, 0a, 4h
LI64 r34, 2d LI64 r34, 2d
@ -47,8 +48,7 @@ main:
ADD32 r33, r33, r32 ADD32 r33, r33, r32
CP r32, r0 CP r32, r0
LD r32, r254, 3a, 1h LD r32, r254, 3a, 1h
ADD32 r33, r33, r32 ADD32 r1, r33, r32
CP r1, r33
1: LD r31, r254, 12a, 32h 1: LD r31, r254, 12a, 32h
ADDI64 r254, r254, 44d ADDI64 r254, r254, 44d
JALA r0, r31, 0a JALA r0, r31, 0a

View file

@ -7,8 +7,7 @@ main:
LI64 r2, 20d LI64 r2, 20d
JAL r31, r0, :add_two JAL r31, r0, :add_two
CP r33, r1 CP r33, r1
ADD64 r32, r32, r33 ADD64 r1, r32, r33
CP r1, r32
LD r31, r254, 0a, 24h LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
@ -16,8 +15,7 @@ add_two:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -16d
ST r31, r254, 0a, 16h ST r31, r254, 0a, 16h
CP r32, r2 CP r32, r2
ADDI64 r32, r32, 2d ADDI64 r1, r32, 2d
CP r1, r32
LD r31, r254, 0a, 16h LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
@ -25,11 +23,10 @@ add_one:
ADDI64 r254, r254, -16d ADDI64 r254, r254, -16d
ST r31, r254, 0a, 16h ST r31, r254, 0a, 16h
CP r32, r2 CP r32, r2
ADDI64 r32, r32, 1d ADDI64 r1, r32, 1d
CP r1, r32
LD r31, r254, 0a, 16h LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 266 code size: 257
ret: 33 ret: 33
status: Ok(()) status: Ok(())

View file

@ -1,6 +1,6 @@
main: main:
ADDI64 r254, r254, -24d ADDI64 r254, r254, -32d
ST r31, r254, 0a, 24h ST r31, r254, 0a, 32h
LI64 r2, 2d LI64 r2, 2d
LI64 r3, 2d LI64 r3, 2d
JAL r31, r0, :add JAL r31, r0, :add
@ -9,9 +9,18 @@ main:
LI64 r3, 3d LI64 r3, 3d
JAL r31, r0, :add JAL r31, r0, :add
CP r33, r1 CP r33, r1
SXT32 r32, r32 CP r34, r32
SUB64 r32, r32, r33 SXT32 r34, r34
CP r1, r32 SUB64 r1, r34, r33
LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d
JALA r0, r31, 0a
add:
ADDI64 r254, r254, -24d
ST r31, r254, 0a, 24h
CP r32, r2
CP r33, r3
ADD64 r1, r32, r33
LD r31, r254, 0a, 24h LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
@ -20,21 +29,10 @@ add:
ST r31, r254, 0a, 24h ST r31, r254, 0a, 24h
CP r32, r2 CP r32, r2
CP r33, r3 CP r33, r3
ADD64 r32, r32, r33 ADD32 r1, r32, r33
CP r1, r32
LD r31, r254, 0a, 24h LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
add: code size: 275
ADDI64 r254, r254, -24d
ST r31, r254, 0a, 24h
CP r32, r2
CP r33, r3
ADD32 r32, r32, r33
CP r1, r32
LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d
JALA r0, r31, 0a
code size: 281
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -7,6 +7,7 @@ main:
CP r2, r32 CP r2, r32
LI64 r3, 69d LI64 r3, 69d
JAL r31, r0, :push JAL r31, r0, :push
CP r32, r1
LD r32, r254, 0a, 8h LD r32, r254, 0a, 8h
LD r33, r32, 0a, 8h LD r33, r32, 0a, 8h
ADDI64 r32, r254, 0d ADDI64 r32, r254, 0d
@ -47,8 +48,8 @@ free:
ADDI64 r254, r254, 40d ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
push: push:
ADDI64 r254, r254, -88d ADDI64 r254, r254, -72d
ST r31, r254, 0a, 88h ST r31, r254, 0a, 72h
CP r32, r2 CP r32, r2
CP r33, r3 CP r33, r3
LD r34, r32, 8a, 8h LD r34, r32, 8a, 8h
@ -83,15 +84,9 @@ push:
JMP :6 JMP :6
5: CP r38, r36 5: CP r38, r36
CP r39, r35 CP r39, r35
CP r40, r39 BMC r39, r38, 8h
CP r41, r38 ADDI64 r35, r35, 8d
BMC r40, r41, 8h ADDI64 r36, r36, 8d
CP r38, r35
ADDI64 r38, r38, 8d
CP r35, r38
CP r38, r36
ADDI64 r38, r38, 8d
CP r36, r38
JMP :7 JMP :7
6: LD r38, r32, 8a, 8h 6: LD r38, r32, 8a, 8h
LI64 r39, 0d LI64 r39, 0d
@ -113,8 +108,8 @@ push:
ADDI64 r39, r39, 1d ADDI64 r39, r39, 1d
ST r39, r32, 8a, 8h ST r39, r32, 8a, 8h
CP r1, r34 CP r1, r34
4: LD r31, r254, 0a, 88h 4: LD r31, r254, 0a, 72h
ADDI64 r254, r254, 88d ADDI64 r254, r254, 72d
JALA r0, r31, 0a JALA r0, r31, 0a
malloc: malloc:
ADDI64 r254, r254, -32d ADDI64 r254, r254, -32d
@ -142,6 +137,6 @@ new:
LD r31, r254, 0a, 24h LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 1347 code size: 1332
ret: 69 ret: 69
status: Ok(()) status: Ok(())

View file

@ -11,6 +11,6 @@ main:
LD r31, r254, 0a, 32h LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 318 code size: 299
ret: 55 ret: 55
status: Ok(()) status: Ok(())

View file

@ -1,16 +1,14 @@
main: main:
ADDI64 r254, r254, -48d ADDI64 r254, r254, -40d
ST r31, r254, 0a, 48h ST r31, r254, 0a, 40h
LI64 r32, 255d LI64 r32, 255d
LI64 r33, 255d LI64 r33, 255d
LI64 r34, 255d LI64 r34, 255d
LI64 r35, 255d LI64 r35, 255d
CP r36, r33 CMPS r32, r32, r33
CMPS r32, r32, r36
CMPUI r32, r32, 0d CMPUI r32, r32, 0d
NOT r32, r32 NOT r32, r32
CP r36, r33 CMPS r34, r34, r33
CMPS r34, r34, r36
CMPUI r34, r34, 0d CMPUI r34, r34, 0d
NOT r34, r34 NOT r34, r34
AND r32, r32, r34 AND r32, r32, r34
@ -22,9 +20,9 @@ main:
LI64 r1, 0d LI64 r1, 0d
JMP :1 JMP :1
0: LI64 r1, 1d 0: LI64 r1, 1d
1: LD r31, r254, 0a, 48h 1: LD r31, r254, 0a, 40h
ADDI64 r254, r254, 48d ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 205 code size: 199
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -2,20 +2,15 @@ main:
ADDI64 r254, r254, -160d ADDI64 r254, r254, -160d
ST r31, r254, 128a, 32h ST r31, r254, 128a, 32h
LI64 r32, 0d LI64 r32, 0d
2: CP r33, r32 2: LI64 r33, 128d
LI64 r34, 128d JLTS r32, r33, :0
CMPS r33, r33, r34
CMPUI r33, r33, -1d
JEQ r33, r0, :0
JMP :1 JMP :1
0: ADDI64 r33, r254, 0d 0: ADDI64 r33, r254, 0d
CP r34, r32 CP r34, r32
ADD64 r33, r33, r34 ADD64 r33, r33, r34
LI64 r34, 69d LI64 r34, 69d
ST r34, r33, 0a, 1h ST r34, r33, 0a, 1h
CP r33, r32 ADDI64 r32, r32, 1d
ADDI64 r33, r33, 1d
CP r32, r33
JMP :2 JMP :2
1: ADDI64 r33, r254, 0d 1: ADDI64 r33, r254, 0d
LI64 r34, 42d LI64 r34, 42d
@ -25,6 +20,6 @@ main:
LD r31, r254, 128a, 32h LD r31, r254, 128a, 32h
ADDI64 r254, r254, 160d ADDI64 r254, r254, 160d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 219 code size: 195
ret: 69 ret: 69
status: Ok(()) status: Ok(())

View file

@ -23,11 +23,10 @@ fib:
CP r2, r32 CP r2, r32
JAL r31, r0, :fib JAL r31, r0, :fib
CP r32, r1 CP r32, r1
ADD64 r33, r33, r32 ADD64 r1, r33, r32
CP r1, r33
1: LD r31, r254, 0a, 24h 1: LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 234 code size: 231
ret: 55 ret: 55
status: Ok(()) status: Ok(())

View file

@ -3,13 +3,11 @@ main:
ST r31, r254, 0a, 24h ST r31, r254, 0a, 24h
LI64 r33, 1d LI64 r33, 1d
ADDI64 r33, r33, 2d ADDI64 r33, r33, 2d
ADDI64 r33, r33, 3d ADDI64 r32, r33, 3d
CP r32, r33 ADDI64 r32, r1, -6d
ADDI64 r32, r32, -6d
CP r1, r32
LD r31, r254, 0a, 24h LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 116 code size: 110
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -62,8 +62,7 @@ example:
ADDI64 r35, r35, 0d ADDI64 r35, r35, 0d
ADDI64 r35, r35, 1d ADDI64 r35, r35, 1d
DIRS64 r0, r34, r34, r35 DIRS64 r0, r34, r34, r35
ADDI64 r34, r34, 0d ADDI64 r32, r34, 0d
CP r32, r34
JMP :1 JMP :1
0: CP r32, r33 0: CP r32, r33
1: LI64 r2, 0d 1: LI64 r2, 0d
@ -95,12 +94,10 @@ integer:
OR r35, r35, r36 OR r35, r35, r36
JEQ r35, r0, :0 JEQ r35, r0, :0
CP r35, r34 CP r35, r34
CP r36, r32 SUB64 r33, r33, r32
SUB64 r33, r33, r36
ADDI64 r33, r33, 1d ADDI64 r33, r33, 1d
DIRS64 r0, r35, r35, r33 DIRS64 r0, r35, r35, r33
ADD64 r35, r35, r32 ADD64 r1, r35, r32
CP r1, r35
JMP :1 JMP :1
0: CP r1, r34 0: CP r1, r34
1: LD r31, r254, 0a, 56h 1: LD r31, r254, 0a, 56h
@ -130,15 +127,10 @@ rect_line:
ADD64 r36, r36, r37 ADD64 r36, r36, r37
LI64 r37, 1d LI64 r37, 1d
LI64 r38, 2d LI64 r38, 2d
ADD64 r37, r37, r38 ADD64 r36, r37, r38
CP r36, r37 ADDI64 r34, r34, 1d
CP r36, r34
ADDI64 r36, r36, 1d
CP r34, r36
JMP :4 JMP :4
3: CP r36, r33 3: ADDI64 r33, r33, 1d
ADDI64 r36, r36, 1d
CP r33, r36
JMP :5 JMP :5
1: LD r31, r254, 48a, 64h 1: LD r31, r254, 48a, 64h
ADDI64 r254, r254, 112d ADDI64 r254, r254, 112d
@ -146,30 +138,24 @@ rect_line:
line: line:
ADDI64 r254, r254, -80d ADDI64 r254, r254, -80d
ST r31, r254, 48a, 32h ST r31, r254, 48a, 32h
ST r2, r254, 0a, 16h ST r2, r254, 16a, 16h
ST r4, r254, 16a, 16h ST r4, r254, 0a, 16h
ST r6, r254, 32a, 16h ST r6, r254, 32a, 16h
CP r32, r8 CP r32, r8
LI64 r33, 1d LI64 r33, 1d
JEQ r33, r0, :0 JEQ r33, r0, :0
LD r33, r254, 0a, 8h LD r33, r254, 16a, 8h
LD r34, r254, 16a, 8h LD r34, r254, 0a, 8h
CMPS r33, r33, r34 JGTS r33, r34, :1
CMPUI r33, r33, 1d
NOT r33, r33
JEQ r33, r0, :1
JMP :1 JMP :1
1: JMP :2 1: JMP :2
0: LD r33, r254, 8a, 8h 0: LD r34, r254, 24a, 8h
LD r34, r254, 24a, 8h LD r33, r254, 8a, 8h
CMPS r33, r33, r34 JGTS r34, r33, :2
CMPUI r33, r33, 1d
NOT r33, r33
JEQ r33, r0, :2
JMP :2 JMP :2
2: LD r31, r254, 48a, 32h 2: LD r31, r254, 48a, 32h
ADDI64 r254, r254, 80d ADDI64 r254, r254, 80d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 1476 code size: 1416
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -9,23 +9,21 @@ main:
ADDI64 r254, r254, 16d ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
integer_range: integer_range:
ADDI64 r254, r254, -40d ADDI64 r254, r254, -32d
ST r31, r254, 0a, 40h ST r31, r254, 0a, 32h
CP r32, r2 CP r32, r2
CP r33, r3 CP r33, r3
LI64 r2, 3d LI64 r2, 3d
LI64 r3, 4d LI64 r3, 4d
ECA ECA
CP r34, r1 CP r34, r1
CP r35, r32 SUB64 r33, r33, r32
SUB64 r33, r33, r35
ADDI64 r33, r33, 1d ADDI64 r33, r33, 1d
DIRU64 r0, r34, r34, r33 DIRU64 r0, r34, r34, r33
ADD64 r34, r34, r32 ADD64 r1, r34, r32
CP r1, r34 LD r31, r254, 0a, 32h
LD r31, r254, 0a, 40h ADDI64 r254, r254, 32d
ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 220 code size: 214
ret: 42 ret: 42
status: Ok(()) status: Ok(())

View file

@ -7,8 +7,8 @@ main:
ADDI64 r254, r254, 8d ADDI64 r254, r254, 8d
JALA r0, r31, 0a JALA r0, r31, 0a
fib: fib:
ADDI64 r254, r254, -48d ADDI64 r254, r254, -40d
ST r31, r254, 0a, 48h ST r31, r254, 0a, 40h
CP r32, r2 CP r32, r2
LI64 r33, 0d LI64 r33, 0d
LI64 r34, 1d LI64 r34, 1d
@ -16,18 +16,15 @@ fib:
JNE r32, r35, :0 JNE r32, r35, :0
JMP :1 JMP :1
0: CP r35, r33 0: CP r35, r33
CP r36, r34 ADD64 r35, r35, r34
ADD64 r35, r35, r36
CP r33, r34 CP r33, r34
CP r34, r35 CP r34, r35
CP r35, r32 ADDI64 r32, r32, -1d
ADDI64 r35, r35, -1d
CP r32, r35
JMP :2 JMP :2
1: CP r1, r33 1: CP r1, r33
LD r31, r254, 0a, 48h LD r31, r254, 0a, 40h
ADDI64 r254, r254, 48d ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 227 code size: 218
ret: 55 ret: 55
status: Ok(()) status: Ok(())

View file

@ -10,8 +10,7 @@ main:
JAL r31, r0, :drop JAL r31, r0, :drop
LI64 r33, 0d LI64 r33, 0d
LD r34, r32, 0a, 8h LD r34, r32, 0a, 8h
ADDI64 r34, r34, -2d ADDI64 r34, r1, -2d
CP r1, r34
LD r31, r254, 8a, 32h LD r31, r254, 8a, 32h
ADDI64 r254, r254, 40d ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
@ -31,6 +30,6 @@ modify:
LD r31, r254, 0a, 24h LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d ADDI64 r254, r254, 24d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 315 code size: 312
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,10 +1,11 @@
main: main:
ADDI64 r254, r254, -8d ADDI64 r254, r254, -16d
ST r31, r254, 0a, 8h ST r31, r254, 0a, 16h
LI64 r2, 10d LI64 r2, 400d
JAL r31, r0, :create_back_buffer JAL r31, r0, :create_back_buffer
LD r31, r254, 0a, 8h CP r32, r1
ADDI64 r254, r254, 8d LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d
JALA r0, r31, 0a JALA r0, r31, 0a
create_back_buffer: create_back_buffer:
ADDI64 r254, r254, -32d ADDI64 r254, r254, -32d
@ -26,12 +27,12 @@ create_back_buffer:
JLTS r32, r34, :4 JLTS r32, r34, :4
LI64 r2, 255d LI64 r2, 255d
JAL r31, r0, :request_page JAL r31, r0, :request_page
CP r34, r1
JMP :5 JMP :5
4: CP r2, r32 4: CP r2, r32
JAL r31, r0, :request_page JAL r31, r0, :request_page
5: CP r34, r32 CP r34, r1
ADDI64 r34, r34, -255d 5: ADDI64 r32, r32, -255d
CP r32, r34
JMP :6 JMP :6
3: CP r1, r33 3: CP r1, r33
1: LD r31, r254, 0a, 32h 1: LD r31, r254, 0a, 32h
@ -53,6 +54,6 @@ request_page:
LD r31, r254, 0a, 32h LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 440 code size: 443
ret: 42 ret: 42
status: Ok(()) status: Ok(())

View file

@ -66,11 +66,10 @@ main:
ST r33, r254, 104a, 8h ST r33, r254, 104a, 8h
LD r33, r254, 96a, 8h LD r33, r254, 96a, 8h
LD r32, r254, 104a, 8h LD r32, r254, 104a, 8h
ADD64 r33, r33, r32 ADD64 r1, r33, r32
CP r1, r33
LD r31, r254, 112a, 24h LD r31, r254, 112a, 24h
ADDI64 r254, r254, 136d ADDI64 r254, r254, 136d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 781 code size: 778
ret: 10 ret: 10
status: Ok(()) status: Ok(())

View file

@ -15,14 +15,13 @@ main:
CP r2, r33 CP r2, r33
JAL r31, r0, :fib_iter JAL r31, r0, :fib_iter
CP r33, r1 CP r33, r1
SUB64 r32, r32, r33 SUB64 r1, r32, r33
CP r1, r32
LD r31, r254, 2a, 24h LD r31, r254, 2a, 24h
ADDI64 r254, r254, 26d ADDI64 r254, r254, 26d
JALA r0, r31, 0a JALA r0, r31, 0a
fib_iter: fib_iter:
ADDI64 r254, r254, -48d ADDI64 r254, r254, -40d
ST r31, r254, 0a, 48h ST r31, r254, 0a, 40h
CP r32, r2 CP r32, r2
LI64 r33, 0d LI64 r33, 0d
LI64 r34, 1d LI64 r34, 1d
@ -30,17 +29,14 @@ fib_iter:
JNE r32, r35, :0 JNE r32, r35, :0
JMP :1 JMP :1
0: CP r35, r33 0: CP r35, r33
CP r36, r34 ADD64 r35, r35, r34
ADD64 r35, r35, r36
CP r33, r34 CP r33, r34
CP r34, r35 CP r34, r35
CP r35, r32 ADDI64 r32, r32, -1d
ADDI64 r35, r35, -1d
CP r32, r35
JMP :2 JMP :2
1: CP r1, r33 1: CP r1, r33
LD r31, r254, 0a, 48h LD r31, r254, 0a, 40h
ADDI64 r254, r254, 48d ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
fib: fib:
ADDI64 r254, r254, -32d ADDI64 r254, r254, -32d
@ -58,13 +54,12 @@ fib:
CP r2, r34 CP r2, r34
JAL r31, r0, :fib JAL r31, r0, :fib
CP r34, r1 CP r34, r1
ADD64 r33, r33, r34 ADD64 r1, r33, r34
CP r1, r33
JMP :1 JMP :1
0: CP r1, r32 0: CP r1, r32
1: LD r31, r254, 0a, 32h 1: LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 479 code size: 464
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -28,11 +28,10 @@ main:
CP r33, r0 CP r33, r0
LD r33, r254, 12a, 4h LD r33, r254, 12a, 4h
SXT32 r33, r33 SXT32 r33, r33
SUB64 r32, r32, r33 SUB64 r1, r32, r33
CP r1, r32
LD r31, r254, 16a, 24h LD r31, r254, 16a, 24h
ADDI64 r254, r254, 40d ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 320 code size: 317
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -27,22 +27,20 @@ pass:
CP r32, r2 CP r32, r2
LD r33, r32, 0a, 8h LD r33, r32, 0a, 8h
LD r34, r32, 8a, 8h LD r34, r32, 8a, 8h
SUB64 r33, r33, r34 SUB64 r1, r33, r34
CP r1, r33
LD r31, r254, 0a, 32h LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
odher_pass: odher_pass:
ADDI64 r254, r254, -40d ADDI64 r254, r254, -32d
ST r31, r254, 0a, 40h ST r31, r254, 0a, 32h
CP r32, r2 CP r32, r2
CP r33, r1 CP r33, r1
CP r34, r32 CP r34, r33
CP r35, r33 BMC r32, r34, 24h
BMC r34, r35, 24h LD r31, r254, 0a, 32h
LD r31, r254, 0a, 40h ADDI64 r254, r254, 32d
ADDI64 r254, r254, 40d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 400 code size: 394
ret: 3 ret: 3
status: Ok(()) status: Ok(())

View file

@ -0,0 +1,38 @@
main:
ADDI64 r254, r254, -10272d
ST r31, r254, 10240a, 32h
LI64 r32, 0d
2: LI64 r33, 1024d
JLTS r32, r33, :0
JMP :1
0: ADDI64 r33, r254, 0d
CP r34, r32
ADD64 r33, r33, r34
LI64 r34, 64d
ST r34, r33, 0a, 1h
ADDI64 r32, r32, 1d
JMP :2
1: LI64 r32, 1d
5: LI64 r33, 10d
JLTS r32, r33, :3
JMP :4
3: ADDI64 r33, r254, 0d
CP r34, r32
MULI64 r34, r34, 1024d
ADD64 r33, r33, r34
ADDI64 r34, r254, 0d
BMC r34, r33, 1024h
ADDI64 r32, r32, 1d
JMP :5
4: LI64 r33, 1024d
MULI64 r33, r33, 2d
ADDI64 r34, r254, 0d
ADD64 r34, r34, r33
CP r1, r0
LD r1, r34, 0a, 1h
LD r31, r254, 10240a, 32h
ADDI64 r254, r254, 10272d
JALA r0, r31, 0a
code size: 297
ret: 64
status: Ok(())

View file

@ -1,16 +1,13 @@
main: main:
ADDI64 r254, r254, -32d ADDI64 r254, r254, -24d
ST r31, r254, 0a, 32h ST r31, r254, 0a, 24h
LI64 r32, 1d LI64 r32, 1d
LI64 r33, 2d LI64 r33, 2d
CP r34, r32 ADDI64 r32, r32, 1d
ADDI64 r34, r34, 1d SUB64 r1, r32, r33
CP r32, r34 LD r31, r254, 0a, 24h
SUB64 r32, r32, r33 ADDI64 r254, r254, 24d
CP r1, r32
LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d
JALA r0, r31, 0a JALA r0, r31, 0a
code size: 111 code size: 102
ret: 0 ret: 0
status: Ok(()) status: Ok(())