forked from koniifer/ableos
implementing ableos executable format
This commit is contained in:
parent
65c99ff74c
commit
2999a011f5
347
Cargo.lock
generated
347
Cargo.lock
generated
|
@ -2,6 +2,120 @@
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ahash"
|
||||||
|
version = "0.8.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"once_cell",
|
||||||
|
"version_check",
|
||||||
|
"zerocopy",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aho-corasick"
|
||||||
|
version = "1.1.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstream"
|
||||||
|
version = "0.6.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526"
|
||||||
|
dependencies = [
|
||||||
|
"anstyle",
|
||||||
|
"anstyle-parse",
|
||||||
|
"anstyle-query",
|
||||||
|
"anstyle-wincon",
|
||||||
|
"colorchoice",
|
||||||
|
"is_terminal_polyfill",
|
||||||
|
"utf8parse",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstyle"
|
||||||
|
version = "1.0.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstyle-parse"
|
||||||
|
version = "0.2.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb"
|
||||||
|
dependencies = [
|
||||||
|
"utf8parse",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstyle-query"
|
||||||
|
version = "1.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a"
|
||||||
|
dependencies = [
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anstyle-wincon"
|
||||||
|
version = "3.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8"
|
||||||
|
dependencies = [
|
||||||
|
"anstyle",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg-if"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "colorchoice"
|
||||||
|
version = "1.0.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "env_filter"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
"regex",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "env_logger"
|
||||||
|
version = "0.11.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d"
|
||||||
|
dependencies = [
|
||||||
|
"anstream",
|
||||||
|
"anstyle",
|
||||||
|
"env_filter",
|
||||||
|
"humantime",
|
||||||
|
"log",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.14.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
||||||
|
dependencies = [
|
||||||
|
"ahash",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hbbytecode"
|
name = "hbbytecode"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -14,7 +128,10 @@ version = "0.1.0"
|
||||||
name = "hblang"
|
name = "hblang"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"env_logger",
|
||||||
"hbvm",
|
"hbvm",
|
||||||
|
"log",
|
||||||
|
"regalloc2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -32,12 +149,36 @@ dependencies = [
|
||||||
"memmap2",
|
"memmap2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "humantime"
|
||||||
|
version = "2.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "is_terminal_polyfill"
|
||||||
|
version = "1.70.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.158"
|
version = "0.2.158"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
|
checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "log"
|
||||||
|
version = "0.4.22"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memchr"
|
||||||
|
version = "2.7.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memmap2"
|
name = "memmap2"
|
||||||
version = "0.9.5"
|
version = "0.9.5"
|
||||||
|
@ -47,6 +188,212 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "once_cell"
|
||||||
|
version = "1.19.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.86"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.37"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regalloc2"
|
||||||
|
version = "0.10.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "12908dbeb234370af84d0579b9f68258a0f67e201412dd9a2814e6f45b2fc0f0"
|
||||||
|
dependencies = [
|
||||||
|
"hashbrown",
|
||||||
|
"log",
|
||||||
|
"rustc-hash",
|
||||||
|
"slice-group-by",
|
||||||
|
"smallvec",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex"
|
||||||
|
version = "1.10.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
|
"regex-automata",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-automata"
|
||||||
|
version = "0.4.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-syntax"
|
||||||
|
version = "0.8.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc-hash"
|
||||||
|
version = "2.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "slice-group-by"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "smallvec"
|
||||||
|
version = "1.13.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "2.0.77"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-ident"
|
||||||
|
version = "1.0.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "utf8parse"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "version_check"
|
||||||
|
version = "0.9.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-sys"
|
||||||
|
version = "0.52.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
||||||
|
dependencies = [
|
||||||
|
"windows-targets",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-targets"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
|
||||||
|
dependencies = [
|
||||||
|
"windows_aarch64_gnullvm",
|
||||||
|
"windows_aarch64_msvc",
|
||||||
|
"windows_i686_gnu",
|
||||||
|
"windows_i686_gnullvm",
|
||||||
|
"windows_i686_msvc",
|
||||||
|
"windows_x86_64_gnu",
|
||||||
|
"windows_x86_64_gnullvm",
|
||||||
|
"windows_x86_64_msvc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_gnullvm"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_msvc"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_gnu"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_gnullvm"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_msvc"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnu"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnullvm"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_msvc"
|
||||||
|
version = "0.52.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xtask"
|
name = "xtask"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zerocopy"
|
||||||
|
version = "0.7.35"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
|
||||||
|
dependencies = [
|
||||||
|
"zerocopy-derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zerocopy-derive"
|
||||||
|
version = "0.7.35"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
|
@ -8,4 +8,7 @@ name = "hbc"
|
||||||
path = "src/main.rs"
|
path = "src/main.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
env_logger = "0.11.5"
|
||||||
hbvm = { path = "../hbvm", features = ["nightly"] }
|
hbvm = { path = "../hbvm", features = ["nightly"] }
|
||||||
|
log = "0.4.22"
|
||||||
|
regalloc2 = { version = "0.10.2", features = ["trace-log"] }
|
||||||
|
|
|
@ -601,6 +601,19 @@ impl ParamAlloc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[repr(packed)]
|
||||||
|
#[allow(dead_code)]
|
||||||
|
struct AbleOsExecutableHeader {
|
||||||
|
magic_number: [u8; 3],
|
||||||
|
executable_version: u32,
|
||||||
|
|
||||||
|
code_length: u64,
|
||||||
|
data_length: u64,
|
||||||
|
debug_length: u64,
|
||||||
|
config_length: u64,
|
||||||
|
metadata_length: u64,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct Types {
|
struct Types {
|
||||||
syms: HashMap<SymKey, ty::Id>,
|
syms: HashMap<SymKey, ty::Id>,
|
||||||
|
@ -613,15 +626,24 @@ struct Types {
|
||||||
arrays: Vec<Array>,
|
arrays: Vec<Array>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const HEADER_SIZE: usize = std::mem::size_of::<AbleOsExecutableHeader>();
|
||||||
|
|
||||||
impl Types {
|
impl Types {
|
||||||
fn assemble(&mut self, to: &mut Vec<u8>) {
|
fn assemble(&mut self, to: &mut Vec<u8>) {
|
||||||
|
to.extend([0u8; HEADER_SIZE]);
|
||||||
|
|
||||||
emit(to, instrs::jal(reg::RET_ADDR, reg::ZERO, 0));
|
emit(to, instrs::jal(reg::RET_ADDR, reg::ZERO, 0));
|
||||||
emit(to, instrs::tx());
|
emit(to, instrs::tx());
|
||||||
self.dump_reachable(0, to);
|
let exe = self.dump_reachable(0, to);
|
||||||
Reloc::new(0, 3, 4).apply_jump(to, self.funcs[0].offset, 0);
|
Reloc::new(HEADER_SIZE, 3, 4).apply_jump(to, self.funcs[0].offset, 0);
|
||||||
|
|
||||||
|
unsafe { *to.as_mut_ptr().cast::<AbleOsExecutableHeader>() = exe }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dump_reachable(&mut self, from: ty::Func, to: &mut Vec<u8>) {
|
fn dump_reachable(&mut self, from: ty::Func, to: &mut Vec<u8>) -> AbleOsExecutableHeader {
|
||||||
|
let mut used_funcs = vec![];
|
||||||
|
let mut used_globals = vec![];
|
||||||
|
|
||||||
let mut frontier = vec![ty::Kind::Func(from).compress()];
|
let mut frontier = vec![ty::Kind::Func(from).compress()];
|
||||||
|
|
||||||
while let Some(itm) = frontier.pop() {
|
while let Some(itm) = frontier.pop() {
|
||||||
|
@ -631,8 +653,8 @@ impl Types {
|
||||||
if task::is_done(fuc.offset) {
|
if task::is_done(fuc.offset) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
fuc.offset = to.len() as _;
|
fuc.offset = 0;
|
||||||
to.extend(&fuc.code);
|
used_funcs.push(func);
|
||||||
frontier.extend(fuc.relocs.iter().map(|r| r.target));
|
frontier.extend(fuc.relocs.iter().map(|r| r.target));
|
||||||
}
|
}
|
||||||
ty::Kind::Global(glob) => {
|
ty::Kind::Global(glob) => {
|
||||||
|
@ -640,18 +662,31 @@ impl Types {
|
||||||
if task::is_done(glb.offset) {
|
if task::is_done(glb.offset) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
glb.offset = to.len() as _;
|
glb.offset = 0;
|
||||||
to.extend(&glb.data);
|
used_globals.push(glob);
|
||||||
}
|
}
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for fuc in &self.funcs {
|
for &func in &used_funcs {
|
||||||
if !task::is_done(fuc.offset) {
|
let fuc = &mut self.funcs[func as usize];
|
||||||
continue;
|
fuc.offset = to.len() as _;
|
||||||
|
to.extend(&fuc.code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let code_length = to.len();
|
||||||
|
|
||||||
|
for &global in &used_globals {
|
||||||
|
let global = &mut self.globals[global as usize];
|
||||||
|
global.offset = to.len() as _;
|
||||||
|
to.extend(&global.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
let data_length = to.len() - code_length;
|
||||||
|
|
||||||
|
for func in used_funcs {
|
||||||
|
let fuc = &self.funcs[func as usize];
|
||||||
for rel in &fuc.relocs {
|
for rel in &fuc.relocs {
|
||||||
let offset = match rel.target.expand() {
|
let offset = match rel.target.expand() {
|
||||||
ty::Kind::Func(fun) => self.funcs[fun as usize].offset,
|
ty::Kind::Func(fun) => self.funcs[fun as usize].offset,
|
||||||
|
@ -661,6 +696,16 @@ impl Types {
|
||||||
rel.reloc.apply_jump(to, offset, fuc.offset);
|
rel.reloc.apply_jump(to, offset, fuc.offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AbleOsExecutableHeader {
|
||||||
|
magic_number: [0x15, 0x91, 0xD2],
|
||||||
|
executable_version: 0,
|
||||||
|
code_length: (code_length - HEADER_SIZE) as _,
|
||||||
|
data_length: data_length as _,
|
||||||
|
debug_length: 0,
|
||||||
|
config_length: 0,
|
||||||
|
metadata_length: 0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn disasm(
|
pub fn disasm(
|
||||||
|
@ -892,7 +937,10 @@ fn disasm(
|
||||||
*binary = prev;
|
*binary = prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
'_dump: for (&off, &(name, len, kind)) in functions.iter() {
|
let mut ordered = functions.iter().collect::<Vec<_>>();
|
||||||
|
ordered.sort_unstable_by_key(|(_, (name, _, _))| name);
|
||||||
|
|
||||||
|
'_dump: for (&off, &(name, len, kind)) in ordered {
|
||||||
if matches!(kind, DisasmItem::Global) {
|
if matches!(kind, DisasmItem::Global) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1336,7 +1384,7 @@ fn test_run_vm(out: &[u8], output: &mut String) {
|
||||||
let mut vm = unsafe {
|
let mut vm = unsafe {
|
||||||
hbvm::Vm::<_, { 1024 * 100 }>::new(
|
hbvm::Vm::<_, { 1024 * 100 }>::new(
|
||||||
LoggedMem::default(),
|
LoggedMem::default(),
|
||||||
hbvm::mem::Address::new(out.as_ptr() as u64),
|
hbvm::mem::Address::new(out.as_ptr() as u64).wrapping_add(HEADER_SIZE),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1375,7 +1423,7 @@ fn test_run_vm(out: &[u8], output: &mut String) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
writeln!(output, "code size: {}", out.len()).unwrap();
|
writeln!(output, "code size: {}", out.len() - HEADER_SIZE).unwrap();
|
||||||
writeln!(output, "ret: {:?}", vm.read_reg(1).0).unwrap();
|
writeln!(output, "ret: {:?}", vm.read_reg(1).0).unwrap();
|
||||||
writeln!(output, "status: {:?}", stat).unwrap();
|
writeln!(output, "status: {:?}", stat).unwrap();
|
||||||
}
|
}
|
||||||
|
|
1084
hblang/src/son.rs
1084
hblang/src/son.rs
File diff suppressed because it is too large
Load diff
|
@ -1,3 +1,9 @@
|
||||||
|
foo:
|
||||||
|
ADDI64 r254, r254, -8d
|
||||||
|
ST r31, r254, 0a, 8h
|
||||||
|
LD r31, r254, 0a, 8h
|
||||||
|
ADDI64 r254, r254, 8d
|
||||||
|
JALA r0, r31, 0a
|
||||||
main:
|
main:
|
||||||
ADDI64 r254, r254, -8d
|
ADDI64 r254, r254, -8d
|
||||||
ST r31, r254, 0a, 8h
|
ST r31, r254, 0a, 8h
|
||||||
|
@ -6,12 +12,6 @@ main:
|
||||||
LD r31, r254, 0a, 8h
|
LD r31, r254, 0a, 8h
|
||||||
ADDI64 r254, r254, 8d
|
ADDI64 r254, r254, 8d
|
||||||
JALA r0, r31, 0a
|
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(())
|
||||||
|
|
|
@ -1,3 +1,19 @@
|
||||||
|
add_one:
|
||||||
|
ADDI64 r254, r254, -16d
|
||||||
|
ST r31, r254, 0a, 16h
|
||||||
|
CP r32, r2
|
||||||
|
ADDI64 r1, r32, 1d
|
||||||
|
LD r31, r254, 0a, 16h
|
||||||
|
ADDI64 r254, r254, 16d
|
||||||
|
JALA r0, r31, 0a
|
||||||
|
add_two:
|
||||||
|
ADDI64 r254, r254, -16d
|
||||||
|
ST r31, r254, 0a, 16h
|
||||||
|
CP r32, r2
|
||||||
|
ADDI64 r1, r32, 2d
|
||||||
|
LD r31, r254, 0a, 16h
|
||||||
|
ADDI64 r254, r254, 16d
|
||||||
|
JALA r0, r31, 0a
|
||||||
main:
|
main:
|
||||||
ADDI64 r254, r254, -24d
|
ADDI64 r254, r254, -24d
|
||||||
ST r31, r254, 0a, 24h
|
ST r31, r254, 0a, 24h
|
||||||
|
@ -11,22 +27,6 @@ main:
|
||||||
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_two:
|
|
||||||
ADDI64 r254, r254, -16d
|
|
||||||
ST r31, r254, 0a, 16h
|
|
||||||
CP r32, r2
|
|
||||||
ADDI64 r1, r32, 2d
|
|
||||||
LD r31, r254, 0a, 16h
|
|
||||||
ADDI64 r254, r254, 16d
|
|
||||||
JALA r0, r31, 0a
|
|
||||||
add_one:
|
|
||||||
ADDI64 r254, r254, -16d
|
|
||||||
ST r31, r254, 0a, 16h
|
|
||||||
CP r32, r2
|
|
||||||
ADDI64 r1, r32, 1d
|
|
||||||
LD r31, r254, 0a, 16h
|
|
||||||
ADDI64 r254, r254, 16d
|
|
||||||
JALA r0, r31, 0a
|
|
||||||
code size: 257
|
code size: 257
|
||||||
ret: 33
|
ret: 33
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
|
@ -1,20 +1,3 @@
|
||||||
main:
|
|
||||||
ADDI64 r254, r254, -32d
|
|
||||||
ST r31, r254, 0a, 32h
|
|
||||||
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
|
|
||||||
CP r34, r32
|
|
||||||
SXT32 r34, r34
|
|
||||||
SUB64 r1, r34, r33
|
|
||||||
LD r31, r254, 0a, 32h
|
|
||||||
ADDI64 r254, r254, 32d
|
|
||||||
JALA r0, r31, 0a
|
|
||||||
add:
|
add:
|
||||||
ADDI64 r254, r254, -24d
|
ADDI64 r254, r254, -24d
|
||||||
ST r31, r254, 0a, 24h
|
ST r31, r254, 0a, 24h
|
||||||
|
@ -33,6 +16,23 @@ add:
|
||||||
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
|
||||||
|
main:
|
||||||
|
ADDI64 r254, r254, -32d
|
||||||
|
ST r31, r254, 0a, 32h
|
||||||
|
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
|
||||||
|
CP r34, r32
|
||||||
|
SXT32 r34, r34
|
||||||
|
SUB64 r1, r34, r33
|
||||||
|
LD r31, r254, 0a, 32h
|
||||||
|
ADDI64 r254, r254, 32d
|
||||||
|
JALA r0, r31, 0a
|
||||||
code size: 275
|
code size: 275
|
||||||
ret: 0
|
ret: 0
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
|
@ -1,3 +1,33 @@
|
||||||
|
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
|
||||||
|
free:
|
||||||
|
ADDI64 r254, r254, -40d
|
||||||
|
ST r31, r254, 0a, 40h
|
||||||
|
CP r32, r2
|
||||||
|
CP r33, r3
|
||||||
|
CP r34, r4
|
||||||
|
LRA r35, r0, :FREE_SYS_CALL
|
||||||
|
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:
|
main:
|
||||||
ADDI64 r254, r254, -48d
|
ADDI64 r254, r254, -48d
|
||||||
ST r31, r254, 24a, 24h
|
ST r31, r254, 24a, 24h
|
||||||
|
@ -17,20 +47,18 @@ main:
|
||||||
LD r31, r254, 24a, 24h
|
LD r31, r254, 24a, 24h
|
||||||
ADDI64 r254, r254, 48d
|
ADDI64 r254, r254, 48d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
deinit:
|
malloc:
|
||||||
ADDI64 r254, r254, -24d
|
ADDI64 r254, r254, -32d
|
||||||
ST r31, r254, 0a, 24h
|
ST r31, r254, 0a, 32h
|
||||||
CP r32, r2
|
CP r32, r2
|
||||||
LD r2, r32, 0a, 8h
|
CP r33, r3
|
||||||
LD r33, r32, 16a, 8h
|
LRA r34, r0, :MALLOC_SYS_CALL
|
||||||
MULI64 r33, r33, 8d
|
LD r2, r34, 0a, 8h
|
||||||
CP r3, r33
|
CP r3, r32
|
||||||
LI64 r4, 8d
|
CP r4, r33
|
||||||
JAL r31, r0, :free
|
ECA
|
||||||
CP r1, r32
|
LD r31, r254, 0a, 32h
|
||||||
JAL r31, r0, :new
|
ADDI64 r254, r254, 32d
|
||||||
LD r31, r254, 0a, 24h
|
|
||||||
ADDI64 r254, r254, 24d
|
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
new:
|
new:
|
||||||
ADDI64 r254, r254, -24d
|
ADDI64 r254, r254, -24d
|
||||||
|
@ -45,21 +73,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
|
||||||
free:
|
|
||||||
ADDI64 r254, r254, -40d
|
|
||||||
ST r31, r254, 0a, 40h
|
|
||||||
CP r32, r2
|
|
||||||
CP r33, r3
|
|
||||||
CP r34, r4
|
|
||||||
LRA r35, r0, :FREE_SYS_CALL
|
|
||||||
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
|
|
||||||
push:
|
push:
|
||||||
ADDI64 r254, r254, -72d
|
ADDI64 r254, r254, -72d
|
||||||
ST r31, r254, 0a, 72h
|
ST r31, r254, 0a, 72h
|
||||||
|
@ -124,19 +137,6 @@ push:
|
||||||
4: LD r31, r254, 0a, 72h
|
4: LD r31, r254, 0a, 72h
|
||||||
ADDI64 r254, r254, 72d
|
ADDI64 r254, r254, 72d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
malloc:
|
|
||||||
ADDI64 r254, r254, -32d
|
|
||||||
ST r31, r254, 0a, 32h
|
|
||||||
CP r32, r2
|
|
||||||
CP r33, r3
|
|
||||||
LRA r34, r0, :MALLOC_SYS_CALL
|
|
||||||
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
|
|
||||||
code size: 1201
|
code size: 1201
|
||||||
ret: 69
|
ret: 69
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
|
@ -1,11 +1,3 @@
|
||||||
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:
|
fib:
|
||||||
ADDI64 r254, r254, -24d
|
ADDI64 r254, r254, -24d
|
||||||
ST r31, r254, 0a, 24h
|
ST r31, r254, 0a, 24h
|
||||||
|
@ -27,6 +19,14 @@ fib:
|
||||||
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
|
||||||
|
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
|
||||||
code size: 231
|
code size: 231
|
||||||
ret: 55
|
ret: 55
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
|
@ -1,45 +1,3 @@
|
||||||
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
|
|
||||||
example:
|
example:
|
||||||
ADDI64 r254, r254, -48d
|
ADDI64 r254, r254, -48d
|
||||||
ST r31, r254, 0a, 48h
|
ST r31, r254, 0a, 48h
|
||||||
|
@ -103,6 +61,69 @@ integer:
|
||||||
1: LD r31, r254, 0a, 56h
|
1: LD r31, r254, 0a, 56h
|
||||||
ADDI64 r254, r254, 56d
|
ADDI64 r254, r254, 56d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
|
line:
|
||||||
|
ADDI64 r254, r254, -80d
|
||||||
|
ST r31, r254, 48a, 32h
|
||||||
|
ST r2, r254, 16a, 16h
|
||||||
|
ST r4, r254, 0a, 16h
|
||||||
|
ST r6, r254, 32a, 16h
|
||||||
|
CP r32, r8
|
||||||
|
LI64 r33, 1d
|
||||||
|
JEQ r33, r0, :0
|
||||||
|
LD r33, r254, 16a, 8h
|
||||||
|
LD r34, r254, 0a, 8h
|
||||||
|
JGTS r33, r34, :1
|
||||||
|
JMP :1
|
||||||
|
1: JMP :2
|
||||||
|
0: LD r34, r254, 24a, 8h
|
||||||
|
LD r33, r254, 8a, 8h
|
||||||
|
JGTS r34, r33, :2
|
||||||
|
JMP :2
|
||||||
|
2: LD r31, r254, 48a, 32h
|
||||||
|
ADDI64 r254, r254, 80d
|
||||||
|
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:
|
rect_line:
|
||||||
ADDI64 r254, r254, -112d
|
ADDI64 r254, r254, -112d
|
||||||
ST r31, r254, 48a, 64h
|
ST r31, r254, 48a, 64h
|
||||||
|
@ -135,27 +156,6 @@ rect_line:
|
||||||
1: LD r31, r254, 48a, 64h
|
1: LD r31, r254, 48a, 64h
|
||||||
ADDI64 r254, r254, 112d
|
ADDI64 r254, r254, 112d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
line:
|
|
||||||
ADDI64 r254, r254, -80d
|
|
||||||
ST r31, r254, 48a, 32h
|
|
||||||
ST r2, r254, 16a, 16h
|
|
||||||
ST r4, r254, 0a, 16h
|
|
||||||
ST r6, r254, 32a, 16h
|
|
||||||
CP r32, r8
|
|
||||||
LI64 r33, 1d
|
|
||||||
JEQ r33, r0, :0
|
|
||||||
LD r33, r254, 16a, 8h
|
|
||||||
LD r34, r254, 0a, 8h
|
|
||||||
JGTS r33, r34, :1
|
|
||||||
JMP :1
|
|
||||||
1: JMP :2
|
|
||||||
0: LD r34, r254, 24a, 8h
|
|
||||||
LD r33, r254, 8a, 8h
|
|
||||||
JGTS r34, r33, :2
|
|
||||||
JMP :2
|
|
||||||
2: LD r31, r254, 48a, 32h
|
|
||||||
ADDI64 r254, r254, 80d
|
|
||||||
JALA r0, r31, 0a
|
|
||||||
code size: 1400
|
code size: 1400
|
||||||
ret: 0
|
ret: 0
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
|
@ -1,13 +1,3 @@
|
||||||
main:
|
|
||||||
ADDI64 r254, r254, -16d
|
|
||||||
ST r31, r254, 0a, 16h
|
|
||||||
LI64 r2, 0d
|
|
||||||
LI64 r3, 1000d
|
|
||||||
JAL r31, r0, :integer_range
|
|
||||||
CP r32, r1
|
|
||||||
LD r31, r254, 0a, 16h
|
|
||||||
ADDI64 r254, r254, 16d
|
|
||||||
JALA r0, r31, 0a
|
|
||||||
integer_range:
|
integer_range:
|
||||||
ADDI64 r254, r254, -32d
|
ADDI64 r254, r254, -32d
|
||||||
ST r31, r254, 0a, 32h
|
ST r31, r254, 0a, 32h
|
||||||
|
@ -24,6 +14,16 @@ integer_range:
|
||||||
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
|
||||||
|
main:
|
||||||
|
ADDI64 r254, r254, -16d
|
||||||
|
ST r31, r254, 0a, 16h
|
||||||
|
LI64 r2, 0d
|
||||||
|
LI64 r3, 1000d
|
||||||
|
JAL r31, r0, :integer_range
|
||||||
|
CP r32, r1
|
||||||
|
LD r31, r254, 0a, 16h
|
||||||
|
ADDI64 r254, r254, 16d
|
||||||
|
JALA r0, r31, 0a
|
||||||
code size: 210
|
code size: 210
|
||||||
ret: 42
|
ret: 42
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
|
@ -1,11 +1,3 @@
|
||||||
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:
|
fib:
|
||||||
ADDI64 r254, r254, -40d
|
ADDI64 r254, r254, -40d
|
||||||
ST r31, r254, 0a, 40h
|
ST r31, r254, 0a, 40h
|
||||||
|
@ -25,6 +17,14 @@ fib:
|
||||||
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
|
||||||
|
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
|
||||||
code size: 218
|
code size: 218
|
||||||
ret: 55
|
ret: 55
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
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
|
||||||
main:
|
main:
|
||||||
ADDI64 r254, r254, -40d
|
ADDI64 r254, r254, -40d
|
||||||
ST r31, r254, 8a, 32h
|
ST r31, r254, 8a, 32h
|
||||||
|
@ -14,13 +21,6 @@ main:
|
||||||
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
|
||||||
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:
|
modify:
|
||||||
ADDI64 r254, r254, -24d
|
ADDI64 r254, r254, -24d
|
||||||
ST r31, r254, 0a, 24h
|
ST r31, r254, 0a, 24h
|
||||||
|
|
|
@ -1,12 +1,3 @@
|
||||||
main:
|
|
||||||
ADDI64 r254, r254, -16d
|
|
||||||
ST r31, r254, 0a, 16h
|
|
||||||
LI64 r2, 400d
|
|
||||||
JAL r31, r0, :create_back_buffer
|
|
||||||
CP r32, r1
|
|
||||||
LD r31, r254, 0a, 16h
|
|
||||||
ADDI64 r254, r254, 16d
|
|
||||||
JALA r0, r31, 0a
|
|
||||||
create_back_buffer:
|
create_back_buffer:
|
||||||
ADDI64 r254, r254, -32d
|
ADDI64 r254, r254, -32d
|
||||||
ST r31, r254, 0a, 32h
|
ST r31, r254, 0a, 32h
|
||||||
|
@ -38,6 +29,15 @@ create_back_buffer:
|
||||||
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
|
||||||
|
main:
|
||||||
|
ADDI64 r254, r254, -16d
|
||||||
|
ST r31, r254, 0a, 16h
|
||||||
|
LI64 r2, 400d
|
||||||
|
JAL r31, r0, :create_back_buffer
|
||||||
|
CP r32, r1
|
||||||
|
LD r31, r254, 0a, 16h
|
||||||
|
ADDI64 r254, r254, 16d
|
||||||
|
JALA r0, r31, 0a
|
||||||
request_page:
|
request_page:
|
||||||
ADDI64 r254, r254, -32d
|
ADDI64 r254, r254, -32d
|
||||||
ST r31, r254, 0a, 32h
|
ST r31, r254, 0a, 32h
|
||||||
|
|
|
@ -1,43 +1,3 @@
|
||||||
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 r1, r32, r33
|
|
||||||
LD r31, r254, 2a, 24h
|
|
||||||
ADDI64 r254, r254, 26d
|
|
||||||
JALA r0, r31, 0a
|
|
||||||
fib_iter:
|
|
||||||
ADDI64 r254, r254, -40d
|
|
||||||
ST r31, r254, 0a, 40h
|
|
||||||
CP r32, r2
|
|
||||||
LI64 r33, 0d
|
|
||||||
LI64 r34, 1d
|
|
||||||
2: LI64 r35, 0d
|
|
||||||
JNE r32, r35, :0
|
|
||||||
JMP :1
|
|
||||||
0: CP r35, r33
|
|
||||||
ADD64 r35, r35, r34
|
|
||||||
CP r33, r34
|
|
||||||
CP r34, r35
|
|
||||||
ADDI64 r32, r32, -1d
|
|
||||||
JMP :2
|
|
||||||
1: CP r1, r33
|
|
||||||
LD r31, r254, 0a, 40h
|
|
||||||
ADDI64 r254, r254, 40d
|
|
||||||
JALA r0, r31, 0a
|
|
||||||
fib:
|
fib:
|
||||||
ADDI64 r254, r254, -32d
|
ADDI64 r254, r254, -32d
|
||||||
ST r31, r254, 0a, 32h
|
ST r31, r254, 0a, 32h
|
||||||
|
@ -60,6 +20,46 @@ fib:
|
||||||
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
|
||||||
|
fib_iter:
|
||||||
|
ADDI64 r254, r254, -40d
|
||||||
|
ST r31, r254, 0a, 40h
|
||||||
|
CP r32, r2
|
||||||
|
LI64 r33, 0d
|
||||||
|
LI64 r34, 1d
|
||||||
|
2: LI64 r35, 0d
|
||||||
|
JNE r32, r35, :0
|
||||||
|
JMP :1
|
||||||
|
0: CP r35, r33
|
||||||
|
ADD64 r35, r35, r34
|
||||||
|
CP r33, r34
|
||||||
|
CP r34, r35
|
||||||
|
ADDI64 r32, r32, -1d
|
||||||
|
JMP :2
|
||||||
|
1: CP r1, r33
|
||||||
|
LD r31, r254, 0a, 40h
|
||||||
|
ADDI64 r254, r254, 40d
|
||||||
|
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 r1, r32, r33
|
||||||
|
LD r31, r254, 2a, 24h
|
||||||
|
ADDI64 r254, r254, 26d
|
||||||
|
JALA r0, r31, 0a
|
||||||
code size: 452
|
code size: 452
|
||||||
ret: 0
|
ret: 0
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
foo:
|
||||||
|
ADDI64 r254, r254, -32d
|
||||||
|
ST r31, r254, 16a, 16h
|
||||||
|
LI64 r32, 3d
|
||||||
|
ST r32, r254, 0a, 8h
|
||||||
|
LI64 r32, 2d
|
||||||
|
ST r32, r254, 8a, 4h
|
||||||
|
LI64 r32, 2d
|
||||||
|
ST r32, r254, 12a, 4h
|
||||||
|
LD r1, r254, 0a, 16h
|
||||||
|
LD r31, r254, 16a, 16h
|
||||||
|
ADDI64 r254, r254, 32d
|
||||||
|
JALA r0, r31, 0a
|
||||||
main:
|
main:
|
||||||
ADDI64 r254, r254, -40d
|
ADDI64 r254, r254, -40d
|
||||||
ST r31, r254, 16a, 24h
|
ST r31, r254, 16a, 24h
|
||||||
|
@ -21,19 +34,6 @@ main:
|
||||||
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
|
||||||
foo:
|
|
||||||
ADDI64 r254, r254, -32d
|
|
||||||
ST r31, r254, 16a, 16h
|
|
||||||
LI64 r32, 3d
|
|
||||||
ST r32, r254, 0a, 8h
|
|
||||||
LI64 r32, 2d
|
|
||||||
ST r32, r254, 8a, 4h
|
|
||||||
LI64 r32, 2d
|
|
||||||
ST r32, r254, 12a, 4h
|
|
||||||
LD r1, r254, 0a, 16h
|
|
||||||
LD r31, r254, 16a, 16h
|
|
||||||
ADDI64 r254, r254, 32d
|
|
||||||
JALA r0, r31, 0a
|
|
||||||
code size: 341
|
code size: 341
|
||||||
ret: 0
|
ret: 0
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
|
@ -21,16 +21,6 @@ main:
|
||||||
1: LD r31, r254, 24a, 24h
|
1: LD r31, r254, 24a, 24h
|
||||||
ADDI64 r254, r254, 48d
|
ADDI64 r254, r254, 48d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
pass:
|
|
||||||
ADDI64 r254, r254, -32d
|
|
||||||
ST r31, r254, 0a, 32h
|
|
||||||
CP r32, r2
|
|
||||||
LD r33, r32, 0a, 8h
|
|
||||||
LD r34, r32, 8a, 8h
|
|
||||||
SUB64 r1, r33, r34
|
|
||||||
LD r31, r254, 0a, 32h
|
|
||||||
ADDI64 r254, r254, 32d
|
|
||||||
JALA r0, r31, 0a
|
|
||||||
odher_pass:
|
odher_pass:
|
||||||
ADDI64 r254, r254, -32d
|
ADDI64 r254, r254, -32d
|
||||||
ST r31, r254, 0a, 32h
|
ST r31, r254, 0a, 32h
|
||||||
|
@ -41,6 +31,16 @@ odher_pass:
|
||||||
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
|
||||||
|
pass:
|
||||||
|
ADDI64 r254, r254, -32d
|
||||||
|
ST r31, r254, 0a, 32h
|
||||||
|
CP r32, r2
|
||||||
|
LD r33, r32, 0a, 8h
|
||||||
|
LD r34, r32, 8a, 8h
|
||||||
|
SUB64 r1, r33, r34
|
||||||
|
LD r31, r254, 0a, 32h
|
||||||
|
ADDI64 r254, r254, 32d
|
||||||
|
JALA r0, r31, 0a
|
||||||
code size: 394
|
code size: 394
|
||||||
ret: 3
|
ret: 3
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
inl:
|
||||||
|
ADDI64 r254, r254, -16d
|
||||||
|
ST r31, r254, 0a, 16h
|
||||||
|
LRA r32, r0, :"luhahah\0"
|
||||||
|
LD r31, r254, 0a, 16h
|
||||||
|
ADDI64 r254, r254, 16d
|
||||||
|
JALA r0, r31, 0a
|
||||||
main:
|
main:
|
||||||
ADDI64 r254, r254, -8d
|
ADDI64 r254, r254, -8d
|
||||||
ST r31, r254, 0a, 8h
|
ST r31, r254, 0a, 8h
|
||||||
|
@ -6,13 +13,6 @@ main:
|
||||||
LD r31, r254, 0a, 8h
|
LD r31, r254, 0a, 8h
|
||||||
ADDI64 r254, r254, 8d
|
ADDI64 r254, r254, 8d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
inl:
|
|
||||||
ADDI64 r254, r254, -16d
|
|
||||||
ST r31, r254, 0a, 16h
|
|
||||||
LRA r32, r0, :"luhahah\0"
|
|
||||||
LD r31, r254, 0a, 16h
|
|
||||||
ADDI64 r254, r254, 16d
|
|
||||||
JALA r0, r31, 0a
|
|
||||||
outl:
|
outl:
|
||||||
ADDI64 r254, r254, -16d
|
ADDI64 r254, r254, -16d
|
||||||
ST r31, r254, 0a, 16h
|
ST r31, r254, 0a, 16h
|
||||||
|
|
Loading…
Reference in a new issue