1
0
Fork 0
forked from koniifer/ableos

adding disasembler

This commit is contained in:
mlokr 2024-09-03 22:34:17 +02:00
parent 467eff7440
commit 41fa4bdce0
30 changed files with 1386 additions and 61 deletions

1
.gitignore vendored
View file

@ -2,5 +2,6 @@
/hbbytecode/src/opcode.rs /hbbytecode/src/opcode.rs
/hbbytecode/src/ops.rs /hbbytecode/src/ops.rs
/hblang/src/instrs.rs /hblang/src/instrs.rs
/hblang/src/disasm.rs
/.rgignore /.rgignore
rust-ice-* rust-ice-*

View file

@ -1,76 +1,135 @@
#![feature(iter_next_chunk)] #![feature(iter_next_chunk)]
use std::fmt::Write; use std::{collections::HashSet, fmt::Write};
fn main() -> Result<(), Box<dyn std::error::Error>> { fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("cargo:rerun-if-changed=build.rs"); println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=../hbbytecode/instructions.in"); println!("cargo:rerun-if-changed=../hbbytecode/instructions.in");
gen_instrs()?;
Ok(())
}
fn gen_instrs() -> Result<(), Box<dyn std::error::Error>> {
let mut generated = String::new(); let mut generated = String::new();
writeln!(generated, "#![allow(dead_code)] #![allow(clippy::upper_case_acronyms)]")?; writeln!(generated, "#![allow(dead_code)] #![allow(clippy::upper_case_acronyms)]")?;
gen_max_size(&mut generated)?;
gen_encodes(&mut generated)?;
gen_structs(&mut generated)?;
gen_name_list(&mut generated)?;
std::fs::write("src/instrs.rs", generated)?; '_max_size: {
Ok(())
}
fn gen_name_list(generated: &mut String) -> Result<(), Box<dyn std::error::Error>> {
writeln!(generated, "pub const NAMES: [&str; {}] = [", instructions().count())?;
for [_, name, _, _] in instructions() {
writeln!(generated, " \"{}\",", name.to_lowercase())?;
}
writeln!(generated, "];")?;
Ok(())
}
fn gen_max_size(generated: &mut String) -> Result<(), Box<dyn std::error::Error>> {
let max = instructions() let max = instructions()
.map(|[_, _, ty, _]| { .map(
|[_, _, ty, _]| {
if ty == "N" { if ty == "N" {
1 1
} else { } else {
iter_args(ty).map(|(_, c)| arg_to_width(c)).sum::<usize>() + 1 iter_args(ty).map(arg_to_width).sum::<usize>() + 1
} }
}) },
)
.max() .max()
.unwrap(); .unwrap();
writeln!(generated, "pub const MAX_SIZE: usize = {};", max)?; writeln!(generated, "pub const MAX_SIZE: usize = {max};")?;
Ok(())
} }
fn gen_encodes(generated: &mut String) -> Result<(), Box<dyn std::error::Error>> { '_encoders: {
for [op, name, ty, doc] in instructions() { for [op, name, ty, doc] in instructions() {
writeln!(generated, "/// {}", doc.trim_matches('"'))?; writeln!(generated, "/// {}", doc.trim_matches('"'))?;
let name = name.to_lowercase(); let name = name.to_lowercase();
let args = comma_sep( let args = comma_sep(
iter_args(ty).map(|(i, c)| format!("{}{i}: {}", arg_to_name(c), arg_to_type(c))), iter_args(ty)
.enumerate()
.map(|(i, c)| format!("{}{i}: {}", arg_to_name(c), arg_to_type(c))),
); );
writeln!(generated, "pub fn {name}({args}) -> (usize, [u8; MAX_SIZE]) {{")?; writeln!(generated, "pub fn {name}({args}) -> (usize, [u8; MAX_SIZE]) {{")?;
let arg_names = comma_sep(iter_args(ty).map(|(i, c)| format!("{}{i}", arg_to_name(c)))); let arg_names =
comma_sep(iter_args(ty).enumerate().map(|(i, c)| format!("{}{i}", arg_to_name(c))));
writeln!(generated, " unsafe {{ crate::encode({ty}({op}, {arg_names})) }}")?; writeln!(generated, " unsafe {{ crate::encode({ty}({op}, {arg_names})) }}")?;
writeln!(generated, "}}")?; writeln!(generated, "}}")?;
} }
Ok(())
} }
fn gen_structs(generated: &mut String) -> Result<(), Box<dyn std::error::Error>> { '_structs: {
let mut seen = std::collections::HashSet::new(); let mut seen = std::collections::HashSet::new();
for [_, _, ty, _] in instructions() { for [_, _, ty, _] in instructions() {
if !seen.insert(ty) { if !seen.insert(ty) {
continue; continue;
} }
let types = comma_sep(iter_args(ty).map(|(_, c)| arg_to_type(c).to_string())); let types = comma_sep(iter_args(ty).map(arg_to_type).map(|s| s.to_string()));
writeln!(generated, "#[repr(packed)] pub struct {ty}(u8, {types});")?; writeln!(generated, "#[repr(packed)] pub struct {ty}(u8, {types});")?;
} }
}
'_name_list: {
writeln!(generated, "pub const NAMES: [&str; {}] = [", instructions().count())?;
for [_, name, _, _] in instructions() {
writeln!(generated, " \"{}\",", name.to_lowercase())?;
}
writeln!(generated, "];")?;
}
let instr = "Instr";
let oper = "Oper";
'_instr_enum: {
writeln!(generated, "#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[repr(u8)]")?;
writeln!(generated, "pub enum {instr} {{")?;
for [id, name, ..] in instructions() {
writeln!(generated, " {name} = {id},")?;
}
writeln!(generated, "}}")?;
}
'_arg_kind: {
writeln!(generated, "#[derive(Debug, Clone, Copy, PartialEq, Eq)]")?;
writeln!(generated, "pub enum {oper} {{")?;
let mut seen = HashSet::new();
for ty in instructions().flat_map(|[.., ty, _]| iter_args(ty)) {
if !seen.insert(ty) {
continue;
}
writeln!(generated, " {ty}({}),", arg_to_type(ty))?;
}
writeln!(generated, "}}")?;
}
'_parse_opers: {
writeln!(
generated,
"/// This assumes the instruction byte is still at the beginning of the buffer"
)?;
writeln!(generated, "pub fn parse_args(bytes: &mut &[u8], kind: {instr}, buf: &mut Vec<{oper}>) -> Option<()> {{")?;
writeln!(generated, " match kind {{")?;
let mut instrs = instructions().collect::<Vec<_>>();
instrs.sort_unstable_by_key(|&[.., ty, _]| ty);
for group in instrs.chunk_by(|[.., a, _], [.., b, _]| a == b) {
let ty = group[0][2];
for &[_, name, ..] in group {
writeln!(generated, " | {instr}::{name}")?;
}
generated.pop();
writeln!(generated, " => {{")?;
if iter_args(ty).count() != 0 {
writeln!(generated, " let data = unsafe {{ std::ptr::read(bytes.take(..std::mem::size_of::<{ty}>())?.as_ptr() as *const {ty}) }};")?;
writeln!(
generated,
" buf.extend([{}]);",
comma_sep(
iter_args(ty).zip(1u32..).map(|(t, i)| format!("{oper}::{t}(data.{i})"))
)
)?;
} else {
writeln!(generated, " bytes.take(..std::mem::size_of::<{ty}>())?;")?;
}
writeln!(generated, " }}")?;
}
writeln!(generated, " }}")?;
writeln!(generated, " Some(())")?;
writeln!(generated, "}}")?;
}
std::fs::write("src/instrs.rs", generated)?;
Ok(()) Ok(())
} }
@ -119,6 +178,6 @@ fn arg_to_name(arg: char) -> &'static str {
} }
} }
fn iter_args(ty: &'static str) -> impl Iterator<Item = (usize, char)> { fn iter_args(ty: &'static str) -> impl Iterator<Item = char> {
ty.chars().enumerate().filter(|(_, c)| *c != 'N') ty.chars().filter(|c| *c != 'N')
} }

View file

@ -863,7 +863,9 @@ struct Func {
file: FileId, file: FileId,
expr: ExprRef, expr: ExprRef,
sig: Option<Sig>, sig: Option<Sig>,
runtime: bool,
offset: Offset, offset: Offset,
size: Size,
} }
struct Global { struct Global {
@ -1281,6 +1283,7 @@ const VM_STACK_SIZE: usize = 1024 * 1024 * 2;
struct Comptime { struct Comptime {
vm: hbvm::Vm<LoggedMem, 0>, vm: hbvm::Vm<LoggedMem, 0>,
depth: usize,
_stack: Box<[u8; VM_STACK_SIZE]>, _stack: Box<[u8; VM_STACK_SIZE]>,
} }
@ -1291,7 +1294,21 @@ impl Default for Comptime {
let ptr = unsafe { stack.as_mut_ptr().cast::<u8>().add(VM_STACK_SIZE) as u64 }; let ptr = unsafe { stack.as_mut_ptr().cast::<u8>().add(VM_STACK_SIZE) as u64 };
log::dbg!("stack_ptr: {:x}", ptr); log::dbg!("stack_ptr: {:x}", ptr);
vm.write_reg(STACK_PTR, ptr); vm.write_reg(STACK_PTR, ptr);
Self { vm, _stack: unsafe { stack.assume_init() } } Self { vm, depth: 0, _stack: unsafe { stack.assume_init() } }
}
}
impl Comptime {
fn active(&self) -> bool {
self.depth != 0
}
fn enter(&mut self) {
self.depth += 1;
}
fn exit(&mut self) {
self.depth -= 1;
} }
} }
@ -1380,7 +1397,7 @@ impl Codegen {
self.link(); self.link();
} }
pub fn dump(mut self, out: &mut impl std::io::Write) -> std::io::Result<()> { pub fn dump(&mut self, out: &mut impl std::io::Write) -> std::io::Result<()> {
let reloc = Reloc::shifted(0, 3, 4); let reloc = Reloc::shifted(0, 3, 4);
self.output.funcs.push((0, reloc)); self.output.funcs.push((0, reloc));
self.link(); self.link();
@ -2272,6 +2289,8 @@ impl Codegen {
self.tys.funcs.push(Func { self.tys.funcs.push(Func {
file: fuc.file, file: fuc.file,
offset: u32::MAX, offset: u32::MAX,
size: 0,
runtime: false,
sig: Some(Sig { args, ret }), sig: Some(Sig { args, ret }),
expr: fuc.expr, expr: fuc.expr,
}); });
@ -2698,6 +2717,7 @@ impl Codegen {
self.output.emit(jala(ZERO, RET_ADDR, 0)); self.output.emit(jala(ZERO, RET_ADDR, 0));
self.ci.regs.free(std::mem::take(&mut self.ci.ret_reg)); self.ci.regs.free(std::mem::take(&mut self.ci.ret_reg));
self.tys.funcs[id as usize].offset = self.ci.snap.code as Offset; self.tys.funcs[id as usize].offset = self.ci.snap.code as Offset;
self.tys.funcs[id as usize].size = self.local_offset();
self.pool.cis.push(std::mem::replace(&mut self.ci, prev_ci)); self.pool.cis.push(std::mem::replace(&mut self.ci, prev_ci));
self.ct.vm.write_reg(reg::STACK_PTR, ct_stack_base); self.ct.vm.write_reg(reg::STACK_PTR, ct_stack_base);
} }
@ -3089,7 +3109,9 @@ impl Codegen {
debug_assert!(refr.get(&f).is_some()); debug_assert!(refr.get(&f).is_some());
refr refr
}, },
runtime: false,
offset: u32::MAX, offset: u32::MAX,
size: 0,
}; };
let id = self.tys.funcs.len() as _; let id = self.tys.funcs.len() as _;
@ -3128,6 +3150,7 @@ impl Codegen {
fn make_func_reachable(&mut self, func: ty::Func) { fn make_func_reachable(&mut self, func: ty::Func) {
let fuc = &mut self.tys.funcs[func as usize]; let fuc = &mut self.tys.funcs[func as usize];
fuc.runtime |= !self.ct.active();
if fuc.offset == u32::MAX { if fuc.offset == u32::MAX {
fuc.offset = task::id(self.tasks.len() as _); fuc.offset = task::id(self.tasks.len() as _);
self.tasks.push(Some(FTask { file: fuc.file, id: func })); self.tasks.push(Some(FTask { file: fuc.file, id: func }));
@ -3191,6 +3214,7 @@ impl Codegen {
compile: impl FnOnce(&mut Self, &mut ItemCtx) -> Result<T, E>, compile: impl FnOnce(&mut Self, &mut ItemCtx) -> Result<T, E>,
) -> Result<T, E> { ) -> Result<T, E> {
log::dbg!("eval"); log::dbg!("eval");
self.ct.enter();
let stash = self.pop_stash(); let stash = self.pop_stash();
let mut prev_ci = std::mem::replace(&mut self.ci, ci); let mut prev_ci = std::mem::replace(&mut self.ci, ci);
@ -3231,6 +3255,7 @@ impl Codegen {
self.ci.snap = self.output.snap(); self.ci.snap = self.output.snap();
self.push_stash(stash); self.push_stash(stash);
self.ct.exit();
log::dbg!("eval-end"); log::dbg!("eval-end");
ret ret
@ -3336,7 +3361,11 @@ impl Codegen {
mod tests { mod tests {
use { use {
super::parser, super::parser,
crate::{codegen::LoggedMem, log, parser::FileId}, crate::{
codegen::LoggedMem,
log,
parser::{Expr, FileId},
},
std::io, std::io,
}; };
@ -3400,7 +3429,24 @@ mod tests {
let mut out = Vec::new(); let mut out = Vec::new();
codegen.dump(&mut out).unwrap(); codegen.dump(&mut out).unwrap();
log::dbg!("code: {}", String::from_utf8_lossy(&out)); let mut sluce = out.as_slice();
let functions = codegen
.tys
.funcs
.iter()
.filter(|f| f.offset != u32::MAX && f.runtime)
.map(|f| {
let file = &codegen.files[f.file as usize];
let Expr::BinOp { left: &Expr::Ident { name, .. }, .. } = f.expr.get(file).unwrap()
else {
unreachable!()
};
(f.offset, (name, f.size))
})
.collect::<crate::HashMap<_, _>>();
if crate::disasm(&mut sluce, &functions, output).is_err() {
panic!("{} {:?}", output, sluce);
}
use std::fmt::Write; use std::fmt::Write;

View file

@ -11,15 +11,16 @@
portable_simd, portable_simd,
iter_collect_into, iter_collect_into,
ptr_metadata, ptr_metadata,
slice_ptr_get slice_ptr_get,
slice_take,
map_try_insert
)] )]
#![feature(map_try_insert)]
#![allow(internal_features, clippy::format_collect)] #![allow(internal_features, clippy::format_collect)]
use { use {
parser::Ast, parser::Ast,
std::{ std::{
collections::VecDeque, collections::{hash_map, VecDeque},
io::{self, Read}, io::{self, Read},
path::{Path, PathBuf}, path::{Path, PathBuf},
sync::Mutex, sync::Mutex,
@ -128,6 +129,117 @@ unsafe fn encode<T>(instr: T) -> (usize, [u8; instrs::MAX_SIZE]) {
std::ptr::write(buf.as_mut_ptr() as *mut T, instr); std::ptr::write(buf.as_mut_ptr() as *mut T, instr);
(std::mem::size_of::<T>(), buf) (std::mem::size_of::<T>(), buf)
} }
#[cfg(test)]
fn disasm(
binary: &mut &[u8],
functions: &HashMap<u32, (&str, u32)>,
out: &mut String,
) -> std::fmt::Result {
use self::instrs::Instr;
fn instr_from_byte(b: u8) -> Result<Instr, std::fmt::Error> {
if b as usize >= instrs::NAMES.len() {
return Err(std::fmt::Error);
}
unsafe { std::mem::transmute(b) }
}
let mut labels = HashMap::<u32, u32>::default();
let mut buf = Vec::<instrs::Oper>::new();
'_offset_pass: for (&off, &(_name, len)) in functions.iter() {
let prev = *binary;
binary.take(..off as usize).unwrap();
let mut label_count = 0;
while let Some(&byte) = binary.first() {
let inst = instr_from_byte(byte)?;
let offset: i32 = (prev.len() - binary.len()).try_into().unwrap();
if offset as u32 == off + len {
break;
}
instrs::parse_args(binary, inst, &mut buf).ok_or(std::fmt::Error)?;
for op in buf.drain(..) {
let rel = match op {
instrs::Oper::O(rel) => rel,
instrs::Oper::P(rel) => rel.into(),
_ => continue,
};
let global_offset: u32 = (offset + rel).try_into().unwrap();
if functions.get(&global_offset).is_some() {
continue;
}
label_count += labels.try_insert(global_offset, label_count).is_ok() as u32;
}
}
*binary = prev;
}
'_dump: for (&off, &(name, len)) in functions.iter() {
let prev = *binary;
use std::fmt::Write;
writeln!(out, "{name}:")?;
binary.take(..off as usize).unwrap();
while let Some(&byte) = binary.first() {
let inst = instr_from_byte(byte)?;
let offset: i32 = (prev.len() - binary.len()).try_into().unwrap();
if offset as u32 == off + len {
break;
}
instrs::parse_args(binary, inst, &mut buf).ok_or(std::fmt::Error)?;
if let Some(label) = labels.get(&offset.try_into().unwrap()) {
write!(out, "{:>2}: ", label)?;
} else {
write!(out, " ")?;
}
write!(out, "{inst:<8?} ")?;
'a: for (i, op) in buf.drain(..).enumerate() {
if i != 0 {
write!(out, ", ")?;
}
let rel = 'b: {
match op {
instrs::Oper::O(rel) => break 'b rel,
instrs::Oper::P(rel) => break 'b rel.into(),
instrs::Oper::R(r) => write!(out, "r{r}")?,
instrs::Oper::B(b) => write!(out, "{b}b")?,
instrs::Oper::H(h) => write!(out, "{h}h")?,
instrs::Oper::W(w) => write!(out, "{w}w")?,
instrs::Oper::D(d) if (d as i64) < 0 => write!(out, "{}d", d as i64)?,
instrs::Oper::D(d) => write!(out, "{d}d")?,
instrs::Oper::A(a) => write!(out, "{a}a")?,
}
continue 'a;
};
let global_offset: u32 = (offset + rel).try_into().unwrap();
if let Some(&(name, _)) = functions.get(&global_offset) {
write!(out, ":{name}")?;
} else {
let label = labels.get(&global_offset).unwrap();
write!(out, ":{label}")?;
}
}
writeln!(out)?;
}
*binary = prev;
}
Ok(())
}
struct TaskQueue<T> { struct TaskQueue<T> {
inner: Mutex<TaskQueueInner<T>>, inner: Mutex<TaskQueueInner<T>>,
@ -367,10 +479,10 @@ pub fn parse_from_fs(extra_threads: usize, root: &str) -> io::Result<Vec<Ast>> {
let mut seen = seen.lock().unwrap(); let mut seen = seen.lock().unwrap();
let len = seen.len(); let len = seen.len();
match seen.entry(physiscal_path.clone()) { match seen.entry(physiscal_path.clone()) {
std::collections::hash_map::Entry::Occupied(entry) => { hash_map::Entry::Occupied(entry) => {
return Ok(*entry.get()); return Ok(*entry.get());
} }
std::collections::hash_map::Entry::Vacant(entry) => { hash_map::Entry::Vacant(entry) => {
entry.insert(len as _); entry.insert(len as _);
len as u32 len as u32
} }

View file

@ -3,7 +3,6 @@ use {
codegen, codegen,
ident::{self, Ident}, ident::{self, Ident},
lexer::{self, Lexer, Token, TokenKind}, lexer::{self, Lexer, Token, TokenKind},
log,
}, },
std::{ std::{
cell::{Cell, UnsafeCell}, cell::{Cell, UnsafeCell},

View file

@ -1,3 +1,25 @@
main:
ADDI64 r254, r254, -32d
ST r31, r254, 0a, 32h
LI64 r32, 10d
LI64 r33, 20d
LI64 r34, 2d
DIRS64 r33, r0, r33, r34
SUB64 r32, r32, r33
LI64 r33, 4d
LI64 r34, 2d
ADDI64 r34, r34, 2d
MUL64 r33, r33, r34
ADD64 r32, r32, r33
LI64 r33, 4d
MULI64 r33, r33, 4d
SUB64 r32, r32, r33
ADDI64 r32, r32, 1d
SLUI64 r32, r32, 0b
CP r1, r32
LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d
JALA r0, r31, 0a
code size: 188 code size: 188
ret: 1 ret: 1
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,49 @@
main:
ADDI64 r254, r254, -72d
ST r31, r254, 48a, 24h
LI64 r32, 1d
ST r32, r254, 0a, 24h
LI64 r32, 2d
ST r32, r254, 8a, 24h
LI64 r32, 4d
ST r32, r254, 16a, 24h
ADDI64 r32, r254, 0d
ADDI64 r33, r254, 24d
BMC r32, r33, 24h
ADDI64 r33, r254, 24d
CP r2, r33
JAL r31, r0, :pass
LD r31, r254, 48a, 24h
ADDI64 r254, r254, 72d
JALA r0, r31, 0a
pass:
ADDI64 r254, r254, -40d
ST r31, r254, 0a, 40h
CP r32, r2
CP r33, r32
LI64 r34, 0d
MULI64 r34, r34, 8d
ADD64 r33, r33, r34
LD r34, r33, 0a, 8h
CP r33, r32
LI64 r35, 1d
MULI64 r35, r35, 8d
ADD64 r33, r33, r35
LD r35, r33, 0a, 8h
ADD64 r34, r34, r35
CP r35, r32
LI64 r33, 1d
MULI64 r33, r33, 8d
ADD64 r32, r32, r33
LD r33, r32, 0a, 8h
MULI64 r33, r33, 8d
ADD64 r35, r35, r33
LD r33, r35, 0a, 8h
ADD64 r34, r34, r33
CP r1, r34
LD r31, r254, 0a, 40h
ADDI64 r254, r254, 40d
JALA r0, r31, 0a
code size: 408 code size: 408
ret: 7 ret: 7
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,44 @@
main:
ADDI64 r254, r254, -24d
ST r31, r254, 0a, 24h
LRA r32, r0, :0
CP r2, r32
JAL r31, r0, :str_len
CP r32, r1
LRA r33, r0, :1
CP r2, r33
JAL r31, r0, :str_len
CP r33, r1
ADD64 r33, r33, r32
CP r1, r33
LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d
JALA r0, r31, 0a
str_len:
ADDI64 r254, r254, -40d
ST r31, r254, 0a, 40h
CP r32, r2
LI64 r33, 0d
2: CP r34, r32
CP r35, r0
LD r35, r34, 0a, 1h
LI64 r34, 0d
CMPU r35, r35, r34
CMPUI r35, r35, 0d
NOT r35, r35
JEQ r35, r0, :0
JMP :1
0: CP r35, r33
ADDI64 r35, r35, 1d
CP r33, r35
CP r35, r32
ADDI64 r35, r35, 1d
CP r32, r35
JMP :2
1: CP r1, r33
LD r31, r254, 0a, 40h
ADDI64 r254, r254, 40d
JALA r0, r31, 0a
code size: 303 code size: 303
ret: 16 ret: 16
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,17 @@
main:
ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h
JAL r31, r0, :foo
LI64 r1, 0d
LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d
JALA r0, r31, 0a
foo:
ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h
LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d
JALA r0, r31, 0a
code size: 143 code size: 143
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,11 @@
main:
ADDI64 r254, r254, -16d
ST r31, r254, 0a, 16h
LRA r32, r0, :0
LD r1, r32, 0a, 8h
LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d
JALA r0, r31, 0a
code size: 245 code size: 245
ret: 50 ret: 50
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,11 @@
main:
ADDI64 r254, r254, -16d
ST r31, r254, 0a, 16h
LRA r32, r0, :0
LD r1, r32, 0a, 8h
LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d
JALA r0, r31, 0a
code size: 221 code size: 221
ret: 50 ret: 50
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,64 @@
main:
ADDI64 r254, r254, -48d
ST r31, r254, 24a, 24h
LI64 r32, 255d
ST r32, r254, 0a, 1h
LI64 r32, 0d
ST r32, r254, 1a, 1h
LI64 r32, 0d
ST r32, r254, 2a, 1h
LI64 r32, 255d
ST r32, r254, 3a, 1h
LI64 r32, 0d
ST r32, r254, 4a, 4h
LI64 r32, 2d
ST r32, r254, 8a, 4h
ADDI64 r32, r254, 0d
ADDI64 r33, r254, 12d
BMC r32, r33, 12h
LI64 r33, 1d
ADDI64 r32, r254, 16d
MULI64 r33, r33, 4d
ADD64 r32, r32, r33
CP r33, r0
LD r33, r32, 0a, 4h
LI64 r32, 2d
CMPU r33, r33, r32
CMPUI r33, r33, 0d
JEQ r33, r0, :0
LI64 r1, 0d
JMP :1
0: ADDI64 r33, r254, 20d
ADDI64 r33, r33, -4d
CP r32, r0
LD r32, r33, 0a, 4h
LI64 r33, 0d
CMPU r32, r32, r33
CMPUI r32, r32, 0d
JEQ r32, r0, :2
LI64 r1, 64d
JMP :1
2: CP r32, r0
LD r32, r254, 16a, 4h
CP r33, r0
LD r33, r254, 20a, 4h
ADD32 r32, r32, r33
CP r33, r0
LD r33, r254, 12a, 1h
ADD32 r32, r32, r33
CP r33, r0
LD r33, r254, 13a, 1h
ADD32 r32, r32, r33
CP r33, r0
LD r33, r254, 14a, 1h
ADD32 r32, r32, r33
CP r33, r0
LD r33, r254, 15a, 1h
ADD32 r32, r32, r33
CP r1, r32
1: LD r31, r254, 24a, 24h
ADDI64 r254, r254, 48d
JALA r0, r31, 0a
code size: 531 code size: 531
ret: 512 ret: 512
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,26 @@
main:
ADDI64 r254, r254, -80d
ST r31, r254, 16a, 64h
LI64 r32, 10d
LI64 r33, 30d
LI64 r34, 40d
LI64 r35, 16d
LI64 r36, 8d
LI64 r37, 10d
LI64 r2, 1d
LI64 r38, 10d
ST r38, r254, 0a, 8h
LI64 r38, 20d
ST r38, r254, 8a, 8h
LD r3, r254, 0a, 16h
LI64 r5, 5d
LI64 r6, 6d
ECA
CP r38, r1
LI64 r1, 0d
LD r31, r254, 16a, 64h
ADDI64 r254, r254, 80d
JALA r0, r31, 0a
ev: Ecall ev: Ecall
code size: 234 code size: 234
ret: 0 ret: 0

View file

@ -1,3 +1,72 @@
check_platform:
ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h
JAL r31, r0, :x86_fb_ptr
LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d
JALA r0, r31, 0a
main:
ADDI64 r254, r254, -64d
ST r31, r254, 0a, 64h
JAL r31, r0, :check_platform
CP r32, r1
LI64 r33, 100d
LI64 r34, 30d
LI64 r35, 0d
LI64 r36, 0d
4: CP r37, r35
CP r38, r34
ADDI64 r38, r38, 1d
CMPS r37, r37, r38
CMPUI r37, r37, 1d
JEQ r37, r0, :0
CP r2, r35
CP r3, r36
CP r4, r33
JAL r31, r0, :set_pixel
CP r37, r35
ADDI64 r37, r37, 1d
CP r35, r37
JMP :1
0: CP r2, r35
CP r3, r36
CP r4, r33
JAL r31, r0, :set_pixel
LI64 r35, 0d
CP r37, r36
ADDI64 r37, r37, 1d
CP r36, r37
1: CP r37, r36
CP r38, r33
CMPS r37, r37, r38
CMPUI r37, r37, 0d
NOT r37, r37
JEQ r37, r0, :2
JMP :3
2: JMP :4
3: LI64 r1, 0d
LD r31, r254, 0a, 64h
ADDI64 r254, r254, 64d
JALA r0, r31, 0a
set_pixel:
ADDI64 r254, r254, -32d
ST r31, r254, 0a, 32h
CP r32, r2
CP r33, r3
CP r34, r4
MUL64 r33, r33, r34
ADD64 r33, r33, r32
LI64 r1, 0d
LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d
JALA r0, r31, 0a
x86_fb_ptr:
ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h
LI64 r1, 100d
LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d
JALA r0, r31, 0a
code size: 505 code size: 505
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

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

View file

@ -1,3 +1,40 @@
add:
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
main:
ADDI64 r254, r254, -24d
ST r31, r254, 0a, 24h
LI64 r2, 2d
LI64 r3, 2d
JAL r31, r0, :add
CP r32, r1
LI64 r2, 1d
LI64 r3, 3d
JAL r31, r0, :add
CP r33, r1
SXT32 r32, r32
SUB64 r32, r32, r33
CP r1, r32
LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d
JALA r0, r31, 0a
add:
ADDI64 r254, r254, -24d
ST r31, r254, 0a, 24h
CP r32, r2
CP r33, r3
ADD64 r32, r32, r33
CP r1, r32
LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d
JALA r0, r31, 0a
code size: 281 code size: 281
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,167 @@
new:
ADDI64 r254, r254, -24d
ST r31, r254, 0a, 24h
CP r32, r1
LI64 r33, 0d
ST r33, r32, 0a, 8h
LI64 r33, 0d
ST r33, r32, 8a, 8h
LI64 r33, 0d
ST r33, r32, 16a, 8h
LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d
JALA r0, r31, 0a
push:
ADDI64 r254, r254, -88d
ST r31, r254, 0a, 88h
CP r32, r2
CP r33, r3
LD r34, r32, 8a, 8h
LD r35, r32, 16a, 8h
CMPU r34, r34, r35
CMPUI r34, r34, 0d
NOT r34, r34
JEQ r34, r0, :0
LD r34, r32, 16a, 8h
LI64 r35, 0d
CMPU r34, r34, r35
CMPUI r34, r34, 0d
NOT r34, r34
JEQ r34, r0, :1
LI64 r34, 1d
ST r34, r32, 16a, 8h
JMP :2
1: LD r34, r32, 16a, 8h
MULI64 r34, r34, 2d
ST r34, r32, 16a, 8h
2: LD r34, r32, 16a, 8h
MULI64 r34, r34, 8d
CP r2, r34
LI64 r3, 8d
JAL r31, r0, :malloc
CP r34, r1
CP r35, r34
LI64 r36, 0d
CMPU r35, r35, r36
CMPUI r35, r35, 0d
NOT r35, r35
JEQ r35, r0, :3
LI64 r1, 0d
JMP :4
3: LD r35, r32, 0a, 8h
CP r36, r34
LD r37, r32, 0a, 8h
LD r38, r32, 8a, 8h
MULI64 r38, r38, 8d
ADD64 r37, r37, r38
7: CP r38, r35
CP r39, r37
CMPU r38, r38, r39
CMPUI r38, r38, 0d
NOT r38, r38
JEQ r38, r0, :5
JMP :6
5: CP r38, r36
CP r39, r35
CP r40, r39
CP r41, r38
BMC r40, r41, 8h
CP r38, r35
ADDI64 r38, r38, 8d
CP r35, r38
CP r38, r36
ADDI64 r38, r38, 8d
CP r36, r38
JMP :7
6: LD r38, r32, 8a, 8h
LI64 r39, 0d
CMPU r38, r38, r39
CMPUI r38, r38, 0d
JEQ r38, r0, :8
LD r2, r32, 0a, 8h
LD r38, r32, 8a, 8h
MULI64 r38, r38, 8d
CP r3, r38
LI64 r4, 8d
JAL r31, r0, :free
8: ST r34, r32, 0a, 8h
0: LD r34, r32, 0a, 8h
LD r38, r32, 8a, 8h
MULI64 r38, r38, 8d
ADD64 r34, r34, r38
CP r38, r34
ST r33, r38, 0a, 8h
LD r38, r32, 8a, 8h
ADDI64 r38, r38, 1d
ST r38, r32, 8a, 8h
CP r1, r34
4: LD r31, r254, 0a, 88h
ADDI64 r254, r254, 88d
JALA r0, r31, 0a
deinit:
ADDI64 r254, r254, -24d
ST r31, r254, 0a, 24h
CP r32, r2
LD r2, r32, 0a, 8h
LD r33, r32, 16a, 8h
MULI64 r33, r33, 8d
CP r3, r33
LI64 r4, 8d
JAL r31, r0, :free
CP r1, r32
JAL r31, r0, :new
LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d
JALA r0, r31, 0a
malloc:
ADDI64 r254, r254, -32d
ST r31, r254, 0a, 32h
CP r32, r2
CP r33, r3
LRA r34, r0, :0
LD r2, r34, 0a, 8h
CP r3, r32
CP r4, r33
ECA
LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d
JALA r0, r31, 0a
free:
ADDI64 r254, r254, -40d
ST r31, r254, 0a, 40h
CP r32, r2
CP r33, r3
CP r34, r4
LRA r35, r0, :0
LD r2, r35, 0a, 8h
CP r3, r32
CP r4, r33
CP r5, r34
ECA
LD r31, r254, 0a, 40h
ADDI64 r254, r254, 40d
JALA r0, r31, 0a
main:
ADDI64 r254, r254, -72d
ST r31, r254, 48a, 24h
ADDI64 r1, r254, 0d
JAL r31, r0, :new
ADDI64 r32, r254, 0d
ADDI64 r33, r254, 24d
BMC r32, r33, 24h
ADDI64 r33, r254, 24d
CP r2, r33
LI64 r3, 69d
JAL r31, r0, :push
LD r33, r254, 24a, 8h
LD r32, r33, 0a, 8h
ADDI64 r33, r254, 24d
CP r2, r33
JAL r31, r0, :deinit
CP r1, r32
LD r31, r254, 48a, 24h
ADDI64 r254, r254, 72d
JALA r0, r31, 0a
code size: 1469 code size: 1469
ret: 69 ret: 69
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,11 @@
main:
ADDI64 r254, r254, -16d
ST r31, r254, 0a, 16h
LRA r32, r0, :0
LD r1, r32, 0a, 8h
LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d
JALA r0, r31, 0a
code size: 267 code size: 267
ret: 50 ret: 50
status: Ok(()) status: Ok(())

View file

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

View file

@ -1,3 +1,36 @@
main:
ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h
LI64 r2, 10d
JAL r31, r0, :fib
LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d
JALA r0, r31, 0a
fib:
ADDI64 r254, r254, -32d
ST r31, r254, 0a, 32h
CP r32, r2
CP r33, r32
LI64 r34, 2d
CMPS r33, r33, r34
CMPUI r33, r33, 1d
JEQ r33, r0, :0
LI64 r1, 1d
JMP :1
0: CP r33, r32
ADDI64 r33, r33, -1d
CP r2, r33
JAL r31, r0, :fib
CP r33, r1
ADDI64 r32, r32, -2d
CP r2, r32
JAL r31, r0, :fib
CP r32, r1
ADD64 r33, r33, r32
CP r1, r33
1: LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d
JALA r0, r31, 0a
code size: 252 code size: 252
ret: 55 ret: 55
status: Ok(()) status: Ok(())

View file

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

View file

@ -1,3 +1,184 @@
integer:
ADDI64 r254, r254, -56d
ST r31, r254, 0a, 56h
CP r32, r2
CP r33, r3
LI64 r2, 3d
LI64 r3, 4d
ECA
CP r34, r1
CP r35, r32
LI64 r36, 0d
CMPS r35, r35, r36
CMPUI r35, r35, 0d
CP r36, r33
LI64 r37, 0d
CMPS r36, r36, r37
CMPUI r36, r36, 0d
OR r35, r35, r36
JEQ r35, r0, :0
CP r35, r34
CP r36, r32
SUB64 r33, r33, r36
ADDI64 r33, r33, 1d
DIRS64 r0, r35, r35, r33
ADD64 r35, r35, r32
CP r1, r35
JMP :1
0: CP r1, r34
1: LD r31, r254, 0a, 56h
ADDI64 r254, r254, 56d
JALA r0, r31, 0a
line:
ADDI64 r254, r254, -80d
ST r31, r254, 48a, 32h
ST r2, r254, 0a, 16h
ST r4, r254, 16a, 16h
ST r6, r254, 32a, 16h
CP r32, r8
LI64 r33, 1d
JEQ r33, r0, :0
LD r33, r254, 0a, 8h
LD r34, r254, 16a, 8h
CMPS r33, r33, r34
CMPUI r33, r33, 1d
NOT r33, r33
JEQ r33, r0, :1
JMP :1
1: JMP :2
0: LD r33, r254, 8a, 8h
LD r34, r254, 24a, 8h
CMPS r33, r33, r34
CMPUI r33, r33, 1d
NOT r33, r33
JEQ r33, r0, :2
JMP :2
2: LD r31, r254, 48a, 32h
ADDI64 r254, r254, 80d
JALA r0, r31, 0a
example:
ADDI64 r254, r254, -48d
ST r31, r254, 0a, 48h
LI64 r2, 3d
LI64 r3, 4d
ECA
CP r33, r1
LI64 r34, 0d
LI64 r35, 0d
CMPS r34, r34, r35
CMPUI r34, r34, 0d
LI64 r35, 1024d
LI64 r36, 0d
CMPS r35, r35, r36
CMPUI r35, r35, 0d
OR r34, r34, r35
JEQ r34, r0, :0
CP r34, r33
LI64 r35, 1024d
ADDI64 r35, r35, 0d
ADDI64 r35, r35, 1d
DIRS64 r0, r34, r34, r35
ADDI64 r34, r34, 0d
CP r32, r34
JMP :1
0: CP r32, r33
1: LI64 r2, 0d
LI64 r3, 768d
JAL r31, r0, :integer
CP r33, r1
CP r34, r32
JMP :2
2: LD r31, r254, 0a, 48h
ADDI64 r254, r254, 48d
JALA r0, r31, 0a
main:
ADDI64 r254, r254, -64d
ST r31, r254, 48a, 16h
LI64 r32, 0d
ST r32, r254, 0a, 8h
LI64 r32, 0d
ST r32, r254, 8a, 8h
LD r2, r254, 0a, 16h
LI64 r32, 0d
ST r32, r254, 16a, 8h
LI64 r32, 0d
ST r32, r254, 24a, 8h
LD r4, r254, 16a, 16h
LI64 r32, 0d
ST r32, r254, 32a, 8h
LI64 r32, 0d
ST r32, r254, 40a, 8h
LD r6, r254, 32a, 16h
LI64 r8, 10d
JAL r31, r0, :line
LI64 r32, 0d
ST r32, r254, 0a, 8h
LI64 r32, 0d
ST r32, r254, 8a, 8h
LD r2, r254, 0a, 16h
LI64 r32, 0d
ST r32, r254, 16a, 8h
LI64 r32, 0d
ST r32, r254, 24a, 8h
LD r4, r254, 16a, 16h
LI64 r32, 0d
ST r32, r254, 32a, 8h
LI64 r32, 0d
ST r32, r254, 40a, 8h
LD r6, r254, 32a, 16h
LI64 r8, 10d
JAL r31, r0, :rect_line
JAL r31, r0, :example
LI64 r1, 0d
LD r31, r254, 48a, 16h
ADDI64 r254, r254, 64d
JALA r0, r31, 0a
rect_line:
ADDI64 r254, r254, -112d
ST r31, r254, 48a, 64h
ST r2, r254, 0a, 16h
ST r4, r254, 16a, 16h
ST r6, r254, 32a, 16h
CP r32, r8
LI64 r33, 0d
LI64 r34, 0d
LI64 r35, 0d
5: CP r36, r33
CP r37, r32
CMPS r36, r36, r37
CMPUI r36, r36, 0d
NOT r36, r36
JEQ r36, r0, :0
JMP :1
0: LD r34, r254, 8a, 8h
LD r35, r254, 0a, 8h
4: CP r36, r34
LD r37, r254, 8a, 8h
LD r38, r254, 16a, 8h
ADD64 r37, r37, r38
CMPS r36, r36, r37
CMPUI r36, r36, 0d
NOT r36, r36
JEQ r36, r0, :2
JMP :3
2: LI64 r36, 1d
LI64 r37, 10d
ADD64 r36, r36, r37
LI64 r37, 1d
LI64 r38, 2d
ADD64 r37, r37, r38
CP r36, r37
CP r36, r34
ADDI64 r36, r36, 1d
CP r34, r36
JMP :4
3: CP r36, r33
ADDI64 r36, r36, 1d
CP r33, r36
JMP :5
1: LD r31, r254, 48a, 64h
ADDI64 r254, r254, 112d
JALA r0, r31, 0a
code size: 1521 code size: 1521
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,38 @@
main:
ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h
LI64 r2, 10d
JAL r31, r0, :fib
LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d
JALA r0, r31, 0a
fib:
ADDI64 r254, r254, -48d
ST r31, r254, 0a, 48h
CP r32, r2
LI64 r33, 0d
LI64 r34, 1d
2: CP r35, r32
LI64 r36, 0d
CMPS r35, r35, r36
CMPUI r35, r35, 0d
NOT r35, r35
JEQ r35, r0, :0
JMP :1
0: CP r35, r33
CP r36, r34
ADD64 r35, r35, r36
CP r33, r34
CP r34, r35
CP r35, r32
ADDI64 r35, r35, -1d
CP r32, r35
LI64 r35, 0d
JMP :2
1: CP r1, r33
LD r31, r254, 0a, 48h
ADDI64 r254, r254, 48d
JALA r0, r31, 0a
code size: 258 code size: 258
ret: 55 ret: 55
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,36 @@
main:
ADDI64 r254, r254, -40d
ST r31, r254, 8a, 32h
LI64 r32, 1d
ST r32, r254, 0a, 8h
ADDI64 r32, r254, 0d
CP r2, r32
JAL r31, r0, :modify
LD r2, r254, 0a, 8h
JAL r31, r0, :drop
LI64 r33, 0d
LD r34, r32, 0a, 8h
ADDI64 r34, r34, -2d
CP r1, r34
LD r31, r254, 8a, 32h
ADDI64 r254, r254, 40d
JALA r0, r31, 0a
drop:
ADDI64 r254, r254, -16d
ST r31, r254, 0a, 16h
CP r32, r2
LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d
JALA r0, r31, 0a
modify:
ADDI64 r254, r254, -24d
ST r31, r254, 0a, 24h
CP r32, r2
LI64 r33, 2d
ST r33, r32, 0a, 8h
LD r31, r254, 0a, 24h
ADDI64 r254, r254, 24d
JALA r0, r31, 0a
code size: 315 code size: 315
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,11 @@
main:
ADDI64 r254, r254, -16d
ST r31, r254, 0a, 16h
LI64 r32, 1610612737d
LI64 r1, 0d
LD r31, r254, 0a, 16h
ADDI64 r254, r254, 16d
JALA r0, r31, 0a
code size: 87 code size: 87
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,76 @@
main:
ADDI64 r254, r254, -136d
ST r31, r254, 112a, 24h
LI64 r32, 1d
ST r32, r254, 32a, 8h
LI64 r32, 2d
ST r32, r254, 40a, 8h
LI64 r32, 3d
ST r32, r254, 16a, 8h
LI64 r32, 4d
ST r32, r254, 24a, 8h
LD r32, r254, 32a, 8h
LD r33, r254, 16a, 8h
ADD64 r32, r32, r33
ST r32, r254, 48a, 8h
LD r32, r254, 40a, 8h
LD r33, r254, 24a, 8h
ADD64 r32, r32, r33
ST r32, r254, 56a, 8h
LD r32, r254, 16a, 8h
LD r33, r254, 32a, 8h
SUB64 r32, r32, r33
ST r32, r254, 64a, 8h
LD r32, r254, 24a, 8h
LD r33, r254, 40a, 8h
SUB64 r32, r32, r33
ST r32, r254, 72a, 8h
LI64 r32, 0d
ST r32, r254, 0a, 8h
LI64 r32, 0d
ST r32, r254, 8a, 8h
LD r32, r254, 0a, 8h
LD r33, r254, 16a, 8h
SUB64 r32, r32, r33
ST r32, r254, 80a, 8h
LD r32, r254, 8a, 8h
LD r33, r254, 24a, 8h
SUB64 r32, r32, r33
ST r32, r254, 88a, 8h
ADDI64 r32, r254, 32d
ADDI64 r33, r254, 96d
BMC r32, r33, 16h
LD r33, r254, 80a, 8h
LD r32, r254, 48a, 8h
ADD64 r33, r33, r32
ST r33, r254, 80a, 8h
LD r33, r254, 88a, 8h
LD r32, r254, 56a, 8h
ADD64 r33, r33, r32
ST r33, r254, 88a, 8h
LD r33, r254, 96a, 8h
LD r32, r254, 64a, 8h
ADD64 r33, r33, r32
ST r33, r254, 96a, 8h
LD r33, r254, 104a, 8h
LD r32, r254, 72a, 8h
ADD64 r33, r33, r32
ST r33, r254, 104a, 8h
LD r33, r254, 80a, 8h
LD r32, r254, 96a, 8h
ADD64 r33, r33, r32
ST r33, r254, 96a, 8h
LD r33, r254, 88a, 8h
LD r32, r254, 104a, 8h
ADD64 r33, r33, r32
ST r33, r254, 104a, 8h
LD r33, r254, 96a, 8h
LD r32, r254, 104a, 8h
ADD64 r33, r33, r32
CP r1, r33
LD r31, r254, 112a, 24h
ADDI64 r254, r254, 136d
JALA r0, r31, 0a
code size: 781 code size: 781
ret: 10 ret: 10
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,77 @@
fib:
ADDI64 r254, r254, -32d
ST r31, r254, 0a, 32h
CP r32, r2
CP r33, r32
LI64 r34, 2d
CMPS r33, r33, r34
CMPUI r33, r33, -1d
NOT r33, r33
JEQ r33, r0, :0
CP r1, r32
JMP :1
0: CP r33, r32
ADDI64 r33, r33, -1d
CP r2, r33
JAL r31, r0, :fib
CP r33, r1
ADDI64 r32, r32, -2d
CP r2, r32
JAL r31, r0, :fib
CP r32, r1
ADD64 r33, r33, r32
CP r1, r33
1: LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d
JALA r0, r31, 0a
main:
ADDI64 r254, r254, -26d
ST r31, r254, 2a, 24h
LI64 r32, 10d
ST r32, r254, 0a, 1h
LI64 r32, 10d
ST r32, r254, 1a, 1h
CP r32, r0
LD r32, r254, 0a, 1h
CP r33, r0
LD r33, r254, 1a, 1h
CP r2, r32
JAL r31, r0, :fib
CP r32, r1
CP r2, r33
JAL r31, r0, :fib_iter
CP r33, r1
SUB64 r32, r32, r33
CP r1, r32
LD r31, r254, 2a, 24h
ADDI64 r254, r254, 26d
JALA r0, r31, 0a
fib_iter:
ADDI64 r254, r254, -48d
ST r31, r254, 0a, 48h
CP r32, r2
LI64 r33, 0d
LI64 r34, 1d
2: CP r35, r32
LI64 r36, 0d
CMPS r35, r35, r36
CMPUI r35, r35, 0d
NOT r35, r35
JEQ r35, r0, :0
JMP :1
0: CP r35, r33
CP r36, r34
ADD64 r35, r35, r36
CP r33, r34
CP r34, r35
CP r35, r32
ADDI64 r35, r35, -1d
CP r32, r35
JMP :2
1: CP r1, r33
LD r31, r254, 0a, 48h
ADDI64 r254, r254, 48d
JALA r0, r31, 0a
code size: 518 code size: 518
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,38 @@
main:
ADDI64 r254, r254, -40d
ST r31, r254, 16a, 24h
LI64 r32, 7d
JAL r31, r0, :foo
ST r1, r254, 0a, 16h
LD r33, r254, 0a, 8h
SUB64 r32, r32, r33
JAL r31, r0, :foo
ST r1, r254, 0a, 16h
CP r33, r0
LD r33, r254, 8a, 4h
SXT32 r33, r33
SUB64 r32, r32, r33
JAL r31, r0, :foo
ST r1, r254, 0a, 16h
CP r33, r0
LD r33, r254, 12a, 4h
SXT32 r33, r33
SUB64 r32, r32, r33
CP r1, r32
LD r31, r254, 16a, 24h
ADDI64 r254, r254, 40d
JALA r0, r31, 0a
foo:
ADDI64 r254, r254, -8d
ST r31, r254, 0a, 8h
LI64 r1, 3d
ANDI r2, r2, -4294967296d
ORI r2, r2, 2d
ANDI r2, r2, 4294967295d
ORI r2, r2, 8589934592d
LD r31, r254, 0a, 8h
ADDI64 r254, r254, 8d
JALA r0, r31, 0a
code size: 320 code size: 320
ret: 0 ret: 0
status: Ok(()) status: Ok(())

View file

@ -1,3 +1,54 @@
pass:
ADDI64 r254, r254, -32d
ST r31, r254, 0a, 32h
CP r32, r2
LD r33, r32, 0a, 8h
LD r34, r32, 8a, 8h
SUB64 r33, r33, r34
CP r1, r33
LD r31, r254, 0a, 32h
ADDI64 r254, r254, 32d
JALA r0, r31, 0a
main:
ADDI64 r254, r254, -72d
ST r31, r254, 48a, 24h
LI64 r32, 4d
ST r32, r254, 24a, 8h
LI64 r32, 1d
ST r32, r254, 32a, 8h
LI64 r32, 3d
ST r32, r254, 40a, 8h
ADDI64 r2, r254, 24d
ADDI64 r1, r254, 0d
JAL r31, r0, :odher_pass
ADDI64 r32, r254, 0d
ADDI64 r33, r254, 24d
BMC r32, r33, 24h
LD r33, r254, 40a, 8h
LI64 r32, 3d
CMPS r33, r33, r32
CMPUI r33, r33, 0d
NOT r33, r33
JEQ r33, r0, :0
ADDI64 r33, r254, 24d
CP r2, r33
JAL r31, r0, :pass
JMP :1
0: LI64 r1, 0d
1: LD r31, r254, 48a, 24h
ADDI64 r254, r254, 72d
JALA r0, r31, 0a
odher_pass:
ADDI64 r254, r254, -40d
ST r31, r254, 0a, 40h
CP r32, r2
CP r33, r1
CP r34, r32
CP r35, r33
BMC r34, r35, 24h
LD r31, r254, 0a, 40h
ADDI64 r254, r254, 40d
JALA r0, r31, 0a
code size: 445 code size: 445
ret: 3 ret: 3
status: Ok(()) status: Ok(())

View file

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