This commit is contained in:
commit
aba131c4c3
|
@ -0,0 +1,2 @@
|
||||||
|
/target
|
||||||
|
.idea
|
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "hitc"]
|
||||||
|
path = hitc
|
||||||
|
url = http://43.136.17.142:3000/cncsmonster/compiler
|
|
@ -0,0 +1,641 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aho-corasick"
|
||||||
|
version = "1.1.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "atty"
|
||||||
|
version = "0.2.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
|
||||||
|
dependencies = [
|
||||||
|
"hermit-abi",
|
||||||
|
"libc",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "autocfg"
|
||||||
|
version = "1.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "backend_module"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"hitc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "1.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "2.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cc"
|
||||||
|
version = "1.0.99"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg-if"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap"
|
||||||
|
version = "3.2.25"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123"
|
||||||
|
dependencies = [
|
||||||
|
"atty",
|
||||||
|
"bitflags 1.3.2",
|
||||||
|
"clap_lex",
|
||||||
|
"indexmap 1.9.3",
|
||||||
|
"strsim",
|
||||||
|
"termcolor",
|
||||||
|
"textwrap",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_lex"
|
||||||
|
version = "0.2.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
|
||||||
|
dependencies = [
|
||||||
|
"os_str_bytes",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam-deque"
|
||||||
|
version = "0.8.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
|
||||||
|
dependencies = [
|
||||||
|
"crossbeam-epoch",
|
||||||
|
"crossbeam-utils",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam-epoch"
|
||||||
|
version = "0.9.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
|
||||||
|
dependencies = [
|
||||||
|
"crossbeam-utils",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam-utils"
|
||||||
|
version = "0.8.20"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "either"
|
||||||
|
version = "1.12.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "equivalent"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "errno"
|
||||||
|
version = "0.3.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fastrand"
|
||||||
|
version = "2.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "getrandom"
|
||||||
|
version = "0.2.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"libc",
|
||||||
|
"wasi",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.12.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.14.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hermit-abi"
|
||||||
|
version = "0.1.19"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hitc"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"clap",
|
||||||
|
"lazy_static",
|
||||||
|
"llvm-ir",
|
||||||
|
"once_cell",
|
||||||
|
"rand",
|
||||||
|
"rayon",
|
||||||
|
"serde",
|
||||||
|
"serde_yaml",
|
||||||
|
"tempfile",
|
||||||
|
"thiserror",
|
||||||
|
"typed-arena",
|
||||||
|
"winnow",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indexmap"
|
||||||
|
version = "1.9.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"hashbrown 0.12.3",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indexmap"
|
||||||
|
version = "2.2.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
|
||||||
|
dependencies = [
|
||||||
|
"equivalent",
|
||||||
|
"hashbrown 0.14.5",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itoa"
|
||||||
|
version = "1.0.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lazy_static"
|
||||||
|
version = "1.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.155"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "linux-raw-sys"
|
||||||
|
version = "0.4.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "llvm-ir"
|
||||||
|
version = "0.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "434db35c1dc3bce4d16bb60c4f6a57587dfa8224ba92fc080fde38782c35fc90"
|
||||||
|
dependencies = [
|
||||||
|
"either",
|
||||||
|
"llvm-sys",
|
||||||
|
"log",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "llvm-sys"
|
||||||
|
version = "160.1.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "49f9888529887dfda6c59e20f0e0727b17e826cd54ae1ddf0d4c83850fa23b69"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
"lazy_static",
|
||||||
|
"libc",
|
||||||
|
"regex",
|
||||||
|
"semver",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "log"
|
||||||
|
version = "0.4.21"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memchr"
|
||||||
|
version = "2.7.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "once_cell"
|
||||||
|
version = "1.19.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "os_str_bytes"
|
||||||
|
version = "6.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ppv-lite86"
|
||||||
|
version = "0.2.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.85"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.36"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.8.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"rand_chacha",
|
||||||
|
"rand_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_chacha"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
||||||
|
dependencies = [
|
||||||
|
"ppv-lite86",
|
||||||
|
"rand_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.6.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
||||||
|
dependencies = [
|
||||||
|
"getrandom",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rayon"
|
||||||
|
version = "1.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
|
||||||
|
dependencies = [
|
||||||
|
"either",
|
||||||
|
"rayon-core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rayon-core"
|
||||||
|
version = "1.12.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
|
||||||
|
dependencies = [
|
||||||
|
"crossbeam-deque",
|
||||||
|
"crossbeam-utils",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex"
|
||||||
|
version = "1.10.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
|
||||||
|
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 = "rustix"
|
||||||
|
version = "0.38.34"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.5.0",
|
||||||
|
"errno",
|
||||||
|
"libc",
|
||||||
|
"linux-raw-sys",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ryu"
|
||||||
|
version = "1.0.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "semver"
|
||||||
|
version = "1.0.23"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde"
|
||||||
|
version = "1.0.203"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
|
||||||
|
dependencies = [
|
||||||
|
"serde_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive"
|
||||||
|
version = "1.0.203"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_yaml"
|
||||||
|
version = "0.9.34+deprecated"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
|
||||||
|
dependencies = [
|
||||||
|
"indexmap 2.2.6",
|
||||||
|
"itoa",
|
||||||
|
"ryu",
|
||||||
|
"serde",
|
||||||
|
"unsafe-libyaml",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "strsim"
|
||||||
|
version = "0.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "2.0.66"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tempfile"
|
||||||
|
version = "3.10.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"fastrand",
|
||||||
|
"rustix",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "termcolor"
|
||||||
|
version = "1.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
|
||||||
|
dependencies = [
|
||||||
|
"winapi-util",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "textwrap"
|
||||||
|
version = "0.16.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror"
|
||||||
|
version = "1.0.61"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
|
||||||
|
dependencies = [
|
||||||
|
"thiserror-impl",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror-impl"
|
||||||
|
version = "1.0.61"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typed-arena"
|
||||||
|
version = "2.0.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-ident"
|
||||||
|
version = "1.0.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unsafe-libyaml"
|
||||||
|
version = "0.2.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasi"
|
||||||
|
version = "0.11.0+wasi-snapshot-preview1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi"
|
||||||
|
version = "0.3.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
||||||
|
dependencies = [
|
||||||
|
"winapi-i686-pc-windows-gnu",
|
||||||
|
"winapi-x86_64-pc-windows-gnu",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-i686-pc-windows-gnu"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-util"
|
||||||
|
version = "0.1.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
|
||||||
|
dependencies = [
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-x86_64-pc-windows-gnu"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||||
|
|
||||||
|
[[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.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
|
||||||
|
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.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_msvc"
|
||||||
|
version = "0.52.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_gnu"
|
||||||
|
version = "0.52.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_gnullvm"
|
||||||
|
version = "0.52.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_msvc"
|
||||||
|
version = "0.52.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnu"
|
||||||
|
version = "0.52.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnullvm"
|
||||||
|
version = "0.52.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_msvc"
|
||||||
|
version = "0.52.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winnow"
|
||||||
|
version = "0.6.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
|
@ -0,0 +1,7 @@
|
||||||
|
[package]
|
||||||
|
name = "backend_module"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
hitc = { path = "./hitc" }
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit f3b9eefa3cb53f181d09328a66efeb3343ea7d3f
|
|
@ -0,0 +1,7 @@
|
||||||
|
bb0:
|
||||||
|
add sp,sp,-32
|
||||||
|
sd ra,24(sp)
|
||||||
|
sd s0,16(sp)
|
||||||
|
sd s1,8(sp)
|
||||||
|
sd s2,0(sp)
|
||||||
|
bge a1,a2,LBB0_17
|
|
@ -0,0 +1,276 @@
|
||||||
|
pub mod tests {
|
||||||
|
use compiler::backend::Inst::{ Call, Jmp };
|
||||||
|
use compiler::backend::{
|
||||||
|
AddInst,
|
||||||
|
Block,
|
||||||
|
BranchInst,
|
||||||
|
BranchOp,
|
||||||
|
CallInst,
|
||||||
|
Func,
|
||||||
|
Inst,
|
||||||
|
JmpInst,
|
||||||
|
LdInst,
|
||||||
|
LwInst,
|
||||||
|
Module,
|
||||||
|
MvInst,
|
||||||
|
SdInst,
|
||||||
|
SwInst,
|
||||||
|
REG_A0,
|
||||||
|
REG_A1,
|
||||||
|
REG_A2,
|
||||||
|
REG_A3,
|
||||||
|
REG_A4,
|
||||||
|
REG_A5,
|
||||||
|
REG_RA,
|
||||||
|
REG_S0,
|
||||||
|
REG_S1,
|
||||||
|
REG_S2,
|
||||||
|
REG_SP,
|
||||||
|
REG_ZERO,
|
||||||
|
};
|
||||||
|
use compiler::middle::ir::InstPtr;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn linked() {
|
||||||
|
/* ---------- ---------- createLinkedList ---------- ---------- */
|
||||||
|
|
||||||
|
let mut entry = Block::new("entry".into());
|
||||||
|
let addispsp_16 = Inst::Add(AddInst::new(REG_SP.into(), REG_SP.into(), (-16).into()));
|
||||||
|
let lia08 = Inst::Add(AddInst::new(REG_A0.into(), REG_ZERO.into(), (-16).into()));
|
||||||
|
let sdra8sp = Inst::Sd(SdInst::new(REG_RA.into(), (8).into(), REG_SP.into()));
|
||||||
|
let sds00sp = Inst::Sd(SdInst::new(REG_S0.into(), (0).into(), REG_SP.into()));
|
||||||
|
let callmalloc1 = Inst::Call(CallInst::new("malloc@plt".into()));
|
||||||
|
let beqa0zerol2 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Beq, REG_A0.into(), REG_ZERO.into(), "L2".into())
|
||||||
|
);
|
||||||
|
let mvs0a0 = Inst::Mv(MvInst::new(REG_S0.into(), REG_A0.into()));
|
||||||
|
let lia016 = Inst::Add(AddInst::new(REG_A0.into(), REG_ZERO.into(), (16).into()));
|
||||||
|
let callmalloc2 = Inst::Call(CallInst::new("malloc@plt".into()));
|
||||||
|
let sda00s0 = Inst::Sd(SdInst::new(REG_A0.into(), (0).into(), REG_S0.into()));
|
||||||
|
let beqa0zerol3 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Beq, REG_A0.into(), REG_ZERO.into(), "L3".into())
|
||||||
|
);
|
||||||
|
let sdzero8a0 = Inst::Sd(SdInst::new(REG_ZERO.into(), (8).into(), REG_A0.into()));
|
||||||
|
entry.extend_insts(
|
||||||
|
vec![
|
||||||
|
addispsp_16,
|
||||||
|
lia08,
|
||||||
|
sdra8sp,
|
||||||
|
sds00sp,
|
||||||
|
callmalloc1,
|
||||||
|
beqa0zerol2,
|
||||||
|
mvs0a0,
|
||||||
|
lia016,
|
||||||
|
callmalloc2,
|
||||||
|
sda00s0,
|
||||||
|
beqa0zerol3,
|
||||||
|
sdzero8a0
|
||||||
|
]
|
||||||
|
);
|
||||||
|
// L1
|
||||||
|
let mut l1 = Block::new("L1".into());
|
||||||
|
let ldra8sp = Inst::Ld(LdInst::new(REG_RA.into(), (8).into(), REG_SP.into()));
|
||||||
|
let mva0s0 = Inst::Mv(MvInst::new(REG_A0.into(), REG_S0.into()));
|
||||||
|
let lds00sp = Inst::Ld(LdInst::new(REG_S0.into(), (0).into(), REG_SP.into()));
|
||||||
|
let addispsp16 = Inst::Add(AddInst::new(REG_SP.into(), REG_SP.into(), (8).into()));
|
||||||
|
let ret = Inst::Ret;
|
||||||
|
l1.extend_insts(vec![ldra8sp, mva0s0, lds00sp, addispsp16, ret]);
|
||||||
|
let mut l3 = Block::new("L3".into());
|
||||||
|
let mva0s0 = Inst::Mv(MvInst::new(REG_A0.into(), REG_S0.into()));
|
||||||
|
let callfree = Inst::Call(CallInst::new("free@plt".into()));
|
||||||
|
l3.extend_insts(vec![mva0s0, callfree]);
|
||||||
|
let mut l2 = Block::new("l2".into());
|
||||||
|
let lis00 = Inst::Add(AddInst::new(REG_S0.into(), REG_ZERO.into(), (0).into()));
|
||||||
|
let jl1 = Inst::Jmp(JmpInst::new("L1".into()));
|
||||||
|
l2.extend_insts(vec![lis00, jl1]);
|
||||||
|
|
||||||
|
let mut createLinkedList = Func::new("createLinkedList".into(), Vec::new(), entry);
|
||||||
|
createLinkedList.push_bb(l1);
|
||||||
|
createLinkedList.push_bb(l2);
|
||||||
|
createLinkedList.push_bb(l3);
|
||||||
|
|
||||||
|
/* ---------- ---------- destroyLinkedList ---------- ---------- */
|
||||||
|
|
||||||
|
let mut entry = Block::new("entry".into());
|
||||||
|
let addispsp_32 = Inst::Add(AddInst::new(REG_SP.into(), REG_SP.into(), (-32).into()));
|
||||||
|
let sds016sp = Inst::Sd(SdInst::new(REG_S0.into(), (16).into(), REG_SP.into()));
|
||||||
|
let lds00a0 = Inst::Ld(LdInst::new(REG_SP.into(), (0).into(), REG_A0.into()));
|
||||||
|
let sds18sp = Inst::Sd(SdInst::new(REG_S1.into(), (8).into(), REG_SP.into()));
|
||||||
|
let sdra24sp = Inst::Sd(SdInst::new(REG_RA.into(), (24).into(), REG_SP.into()));
|
||||||
|
let mvs1a0 = Inst::Mv(MvInst::new(REG_S1.into(), REG_A0.into()));
|
||||||
|
let beqs0zerol31 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Beq, REG_S0.into(), REG_ZERO.into(), "L31".into())
|
||||||
|
);
|
||||||
|
entry.extend_insts(
|
||||||
|
vec![addispsp_32, sds016sp, lds00a0, sds18sp, sdra24sp, mvs1a0, beqs0zerol31]
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut l32 = Block::new("L32".into());
|
||||||
|
let mva0s0 = Inst::Mv(MvInst::new(REG_A0.into(), REG_S0.into()));
|
||||||
|
let lds08s0 = Inst::Ld(LdInst::new(REG_S0.into(), (8).into(), REG_S0.into()));
|
||||||
|
let callfree = Inst::Call(CallInst::new("free@plt".into()));
|
||||||
|
let bnes0zerol32 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bne, REG_S0.into(), REG_ZERO.into(), "L32".into())
|
||||||
|
);
|
||||||
|
l32.extend_insts(vec![mva0s0, lds08s0, callfree, bnes0zerol32]);
|
||||||
|
|
||||||
|
let mut l31 = Block::new("L32".into());
|
||||||
|
let lds016sp = Inst::Ld(LdInst::new(REG_S0.into(), (16).into(), REG_SP.into()));
|
||||||
|
let ldra24sp = Inst::Ld(LdInst::new(REG_RA.into(), (24).into(), REG_SP.into()));
|
||||||
|
let mva0s1 = Inst::Mv(MvInst::new(REG_A0.into(), REG_S1.into()));
|
||||||
|
let lds18sp = Inst::Ld(LdInst::new(REG_S1.into(), (8).into(), REG_SP.into()));
|
||||||
|
let addispsp32 = Inst::Add(AddInst::new(REG_SP.into(), REG_SP.into(), (32).into()));
|
||||||
|
//let tailfree = Inst::
|
||||||
|
l31.extend_insts(vec![lds016sp, ldra24sp, mva0s1, lds18sp, addispsp32]);
|
||||||
|
|
||||||
|
let mut destroyLinkedList = Func::new("destroyLinkedList".into(), Vec::new(), entry);
|
||||||
|
destroyLinkedList.push_bb(l32);
|
||||||
|
destroyLinkedList.push_bb(l31);
|
||||||
|
|
||||||
|
/* ---------- ---------- findNode ---------- ---------- */
|
||||||
|
let mut entry = Block::new("findNode".into());
|
||||||
|
let lda50a0 = Inst::Ld(LdInst::new(REG_A5.into(), (0).into(), REG_A0.into()));
|
||||||
|
let lda08a5 = Inst::Ld(LdInst::new(REG_A0.into(), (8).into(), REG_A5.into()));
|
||||||
|
// bne a0,zero,.L22
|
||||||
|
let bnea0zerol22 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bne, REG_A0.into(), REG_ZERO.into(), "L22".into())
|
||||||
|
);
|
||||||
|
let jl29 = Inst::Jmp(JmpInst::new("L29".into()));
|
||||||
|
entry.extend_insts(vec![lda50a0, lda08a5, bnea0zerol22, jl29]);
|
||||||
|
|
||||||
|
//
|
||||||
|
//.L24:
|
||||||
|
let mut l24 = Block::new("L24".into());
|
||||||
|
let lda08a0 = Inst::Ld(LdInst::new(REG_A0.into(), (8).into(), REG_A0.into()));
|
||||||
|
let beqa0zerol21 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Beq, REG_A0.into(), REG_ZERO.into(), "L21".into())
|
||||||
|
);
|
||||||
|
l24.extend_insts(vec![lda08a0, beqa0zerol21]);
|
||||||
|
|
||||||
|
let mut l22 = Block::new("L22".into());
|
||||||
|
let lwa50a0 = Inst::Lw(LwInst::new(REG_A5.into(), (0).into(), REG_A0.into()));
|
||||||
|
let bnea5a1l24 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bne, REG_A5.into(), REG_A1.into(), "L24".into())
|
||||||
|
);
|
||||||
|
l22.extend_insts(vec![lwa50a0, bnea5a1l24]);
|
||||||
|
|
||||||
|
let mut l21 = Block::new("L21".into());
|
||||||
|
let ret = Inst::Ret;
|
||||||
|
l21.extend_insts(vec![ret]);
|
||||||
|
|
||||||
|
let mut l29 = Block::new("L21".into());
|
||||||
|
let ret = Inst::Ret;
|
||||||
|
l29.extend_insts(vec![ret]);
|
||||||
|
|
||||||
|
let mut findNode = Func::new("findNode".into(), Vec::new(), entry);
|
||||||
|
findNode.push_bb(l24);
|
||||||
|
findNode.push_bb(l22);
|
||||||
|
findNode.push_bb(l21);
|
||||||
|
findNode.push_bb(l29);
|
||||||
|
|
||||||
|
/* ---------- ---------- deleteNode ---------- ---------- */
|
||||||
|
|
||||||
|
//deleteNode:
|
||||||
|
let mut entry = Block::new("entry".into());
|
||||||
|
let lda00a0 = Inst::Ld(LdInst::new(REG_A0.into(), (0).into(), REG_A0.into()));
|
||||||
|
let jl16 = Inst::Jmp(JmpInst::new("L16".into()));
|
||||||
|
entry.extend_insts(vec![lda00a0, jl16]);
|
||||||
|
|
||||||
|
//.L20:
|
||||||
|
let mut l20 = Block::new("L20".into());
|
||||||
|
let lwa50a0 = Inst::Lw(LwInst::new(REG_A5.into(), (0).into(), REG_A0.into()));
|
||||||
|
let beqa5a1L19 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Beq, REG_A5.into(), REG_A1.into(), "L19".into())
|
||||||
|
);
|
||||||
|
l20.extend_insts(vec![lwa50a0, beqa5a1L19]);
|
||||||
|
|
||||||
|
//.L16:
|
||||||
|
let mut l16 = Block::new("L16".into());
|
||||||
|
let mva4a0 = Inst::Mv(MvInst::new(REG_A4.into(), REG_A0.into()));
|
||||||
|
let lda08a0 = Inst::Ld(LdInst::new(REG_A0.into(), (8).into(), REG_A0.into()));
|
||||||
|
let bnea0zeroL20 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bne, REG_A0.into(), REG_ZERO.into(), "L20".into())
|
||||||
|
);
|
||||||
|
let ret = Inst::Ret;
|
||||||
|
l16.extend_insts(vec![mva4a0, lda08a0, bnea0zeroL20, ret]);
|
||||||
|
|
||||||
|
let mut l19 = Block::new("L19".into());
|
||||||
|
let lda58a0 = Inst::Ld(LdInst::new(REG_A5.into(), (8).into(), REG_A0.into()));
|
||||||
|
let sda58a4 = Inst::Sd(SdInst::new(REG_A5.into(), (8).into(), REG_A4.into()));
|
||||||
|
// tail free@plt
|
||||||
|
l19.extend_insts(vec![lda58a0, sda58a4]);
|
||||||
|
|
||||||
|
let mut deleteNode = Func::new("deleteNode".into(), Vec::new(), entry);
|
||||||
|
deleteNode.push_bb(l20);
|
||||||
|
deleteNode.push_bb(l16);
|
||||||
|
deleteNode.push_bb(l19);
|
||||||
|
|
||||||
|
/* ---------- ---------- insertNode ---------- ---------- */
|
||||||
|
//insertNode:
|
||||||
|
let mut entry = Block::new("entry".into());
|
||||||
|
let addispsp_32 = Inst::Add(AddInst::new(REG_SP.into(), REG_SP.into(), (-32).into()));
|
||||||
|
let sds18sp = Inst::Sd(SdInst::new(REG_S1.into(), (8).into(), REG_SP.into()));
|
||||||
|
let mvs1a0 = Inst::Mv(MvInst::new(REG_S1.into(), REG_A0.into()));
|
||||||
|
let lia016 = Inst::Add(AddInst::new(REG_A0.into(), REG_ZERO.into(), (16).into()));
|
||||||
|
let sds016sp = Inst::Sd(SdInst::new(REG_S0.into(), (16).into(), REG_SP.into()));
|
||||||
|
let sdra24sp = Inst::Sd(SdInst::new(REG_RA.into(), (24).into(), REG_SP.into()));
|
||||||
|
let mvs0a1 = Inst::Mv(MvInst::new(REG_S0.into(), REG_A1.into()));
|
||||||
|
let callmalloc = Inst::Call(CallInst::new("malloc@plt".into()));
|
||||||
|
let lda50s1 = Inst::Ld(LdInst::new(REG_A5.into(), (0).into(), REG_S1.into()));
|
||||||
|
let sws00a0 = Inst::Sw(SwInst::new(REG_S0.into(), (0).into(), REG_A0.into()));
|
||||||
|
let sdzero8a0 = Inst::Sd(SdInst::new(REG_ZERO.into(), (8).into(), REG_A0.into()));
|
||||||
|
entry.extend_insts(
|
||||||
|
vec![
|
||||||
|
addispsp_32,
|
||||||
|
sds18sp,
|
||||||
|
mvs1a0,
|
||||||
|
lia016,
|
||||||
|
sds016sp,
|
||||||
|
sdra24sp,
|
||||||
|
mvs0a1,
|
||||||
|
callmalloc,
|
||||||
|
lda50s1,
|
||||||
|
sws00a0,
|
||||||
|
sdzero8a0
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut l11 = Block::new("L11".into());
|
||||||
|
let mva4a5 = Inst::Mv(MvInst::new(REG_A4.into(), REG_A5.into()));
|
||||||
|
let lda58a5 = Inst::Ld(LdInst::new(REG_A5.into(), (8).into(), REG_A5.into()));
|
||||||
|
let bnea5zeroL11 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bne, REG_A5.into(), REG_ZERO.into(), "L11".into())
|
||||||
|
);
|
||||||
|
let ldra24sp = Inst::Ld(LdInst::new(REG_RA.into(), (24).into(), REG_SP.into()));
|
||||||
|
let lds016sp = Inst::Ld(LdInst::new(REG_S0.into(), (16).into(), REG_SP.into()));
|
||||||
|
let sds08sp = Inst::Sd(SdInst::new(REG_S0.into(), (8).into(), REG_A4.into()));
|
||||||
|
let lds18sp = Inst::Ld(LdInst::new(REG_S1.into(), (8).into(), REG_SP.into()));
|
||||||
|
let addispsp32 = Inst::Add(AddInst::new(REG_SP.into(), REG_SP.into(), (32).into()));
|
||||||
|
let ret = Inst::Ret;
|
||||||
|
l11.extend_insts(
|
||||||
|
vec![
|
||||||
|
mva4a5,
|
||||||
|
lda58a5,
|
||||||
|
bnea5zeroL11,
|
||||||
|
ldra24sp,
|
||||||
|
lds016sp,
|
||||||
|
sds08sp,
|
||||||
|
lds18sp,
|
||||||
|
addispsp32,
|
||||||
|
ret
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut insertNode = Func::new("insertNode".into(), Vec::new(), entry);
|
||||||
|
insertNode.push_bb(l11);
|
||||||
|
|
||||||
|
//let linkli =
|
||||||
|
let main_module = Module {
|
||||||
|
name: "main".into(),
|
||||||
|
global: Vec::new(),
|
||||||
|
funcs: vec![insertNode, deleteNode, findNode, destroyLinkedList, createLinkedList],
|
||||||
|
entry: None,
|
||||||
|
};
|
||||||
|
print!("{}", main_module.gen_asm());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
// 定义链表节点结构体
|
||||||
|
typedef struct ListNode {
|
||||||
|
int data; // 数据域
|
||||||
|
struct ListNode *next; // 指向下一个节点的指针
|
||||||
|
} ListNode;
|
||||||
|
|
||||||
|
// 定义链表结构体,这里我们的链表包含一个头结点
|
||||||
|
typedef struct LinkedList {
|
||||||
|
ListNode *head; // 指向头结点的指针
|
||||||
|
} LinkedList;
|
||||||
|
|
||||||
|
// 创建链表,初始化头结点
|
||||||
|
LinkedList *createLinkedList() {
|
||||||
|
LinkedList *list = (LinkedList *)malloc(sizeof(LinkedList));
|
||||||
|
if (list) {
|
||||||
|
list->head = (ListNode *)malloc(sizeof(ListNode)); // 创建头结点
|
||||||
|
if (list->head) {
|
||||||
|
list->head->next = NULL; // 头结点的next指向NULL
|
||||||
|
} else {
|
||||||
|
free(list); // 如果头结点创建失败,释放链表结构体所占内存
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 在链表尾部插入节点
|
||||||
|
void insertNode(LinkedList *list, int data) {
|
||||||
|
ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));
|
||||||
|
newNode->data = data;
|
||||||
|
newNode->next = NULL;
|
||||||
|
|
||||||
|
// 找到链表的最后一个节点
|
||||||
|
ListNode *current = list->head;
|
||||||
|
while (current->next != NULL) {
|
||||||
|
current = current->next;
|
||||||
|
}
|
||||||
|
// 将新节点插入到链表尾部
|
||||||
|
current->next = newNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除链表中的节点
|
||||||
|
void deleteNode(LinkedList *list, int data) {
|
||||||
|
ListNode *current = list->head;
|
||||||
|
ListNode *previous = NULL;
|
||||||
|
while (current->next != NULL && current->next->data != data) {
|
||||||
|
previous = current;
|
||||||
|
current = current->next;
|
||||||
|
}
|
||||||
|
if (current->next != NULL) {
|
||||||
|
ListNode *temp = current->next;
|
||||||
|
current->next = current->next->next;
|
||||||
|
free(temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找链表中的节点
|
||||||
|
ListNode *findNode(LinkedList *list, int data) {
|
||||||
|
ListNode *current = list->head->next; // 从第一个实际存储数据的节点开始
|
||||||
|
while (current != NULL && current->data != data) {
|
||||||
|
current = current->next;
|
||||||
|
}
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 销毁链表
|
||||||
|
void destroyLinkedList(LinkedList *list) {
|
||||||
|
ListNode *current = list->head;
|
||||||
|
while (current != NULL) {
|
||||||
|
ListNode *temp = current;
|
||||||
|
current = current->next;
|
||||||
|
free(temp);
|
||||||
|
}
|
||||||
|
free(list);
|
||||||
|
}
|
|
@ -0,0 +1,125 @@
|
||||||
|
.file "list.c"
|
||||||
|
.option pic
|
||||||
|
.attribute arch, "rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0"
|
||||||
|
.attribute unaligned_access, 0
|
||||||
|
.attribute stack_align, 16
|
||||||
|
.text
|
||||||
|
.align 1
|
||||||
|
.globl createLinkedList
|
||||||
|
.type createLinkedList, @function
|
||||||
|
createLinkedList:
|
||||||
|
addi sp,sp,-16
|
||||||
|
li a0,8
|
||||||
|
sd ra,8(sp)
|
||||||
|
sd s0,0(sp)
|
||||||
|
call malloc@plt
|
||||||
|
beq a0,zero,.L2
|
||||||
|
mv s0,a0
|
||||||
|
li a0,16
|
||||||
|
call malloc@plt
|
||||||
|
sd a0,0(s0)
|
||||||
|
beq a0,zero,.L3
|
||||||
|
sd zero,8(a0)
|
||||||
|
.L1:
|
||||||
|
ld ra,8(sp)
|
||||||
|
mv a0,s0
|
||||||
|
ld s0,0(sp)
|
||||||
|
addi sp,sp,16
|
||||||
|
jr ra
|
||||||
|
.L3:
|
||||||
|
mv a0,s0
|
||||||
|
call free@plt
|
||||||
|
.L2:
|
||||||
|
li s0,0
|
||||||
|
j .L1
|
||||||
|
.size createLinkedList, .-createLinkedList
|
||||||
|
.align 1
|
||||||
|
.globl insertNode
|
||||||
|
.type insertNode, @function
|
||||||
|
insertNode:
|
||||||
|
addi sp,sp,-32
|
||||||
|
sd s1,8(sp)
|
||||||
|
mv s1,a0
|
||||||
|
li a0,16
|
||||||
|
sd s0,16(sp)
|
||||||
|
sd ra,24(sp)
|
||||||
|
mv s0,a1
|
||||||
|
call malloc@plt
|
||||||
|
ld a5,0(s1)
|
||||||
|
sw s0,0(a0)
|
||||||
|
sd zero,8(a0)
|
||||||
|
.L11:
|
||||||
|
mv a4,a5
|
||||||
|
ld a5,8(a5)
|
||||||
|
bne a5,zero,.L11
|
||||||
|
ld ra,24(sp)
|
||||||
|
ld s0,16(sp)
|
||||||
|
sd a0,8(a4)
|
||||||
|
ld s1,8(sp)
|
||||||
|
addi sp,sp,32
|
||||||
|
jr ra
|
||||||
|
.size insertNode, .-insertNode
|
||||||
|
.align 1
|
||||||
|
.globl deleteNode
|
||||||
|
.type deleteNode, @function
|
||||||
|
deleteNode:
|
||||||
|
ld a0,0(a0)
|
||||||
|
j .L16
|
||||||
|
.L20:
|
||||||
|
lw a5,0(a0)
|
||||||
|
beq a5,a1,.L19
|
||||||
|
.L16:
|
||||||
|
mv a4,a0
|
||||||
|
ld a0,8(a0)
|
||||||
|
bne a0,zero,.L20
|
||||||
|
ret
|
||||||
|
.L19:
|
||||||
|
ld a5,8(a0)
|
||||||
|
sd a5,8(a4)
|
||||||
|
tail free@plt
|
||||||
|
.size deleteNode, .-deleteNode
|
||||||
|
.align 1
|
||||||
|
.globl findNode
|
||||||
|
.type findNode, @function
|
||||||
|
findNode:
|
||||||
|
ld a5,0(a0)
|
||||||
|
ld a0,8(a5)
|
||||||
|
bne a0,zero,.L22
|
||||||
|
j .L29
|
||||||
|
.L24:
|
||||||
|
ld a0,8(a0)
|
||||||
|
beq a0,zero,.L21
|
||||||
|
.L22:
|
||||||
|
lw a5,0(a0)
|
||||||
|
bne a5,a1,.L24
|
||||||
|
.L21:
|
||||||
|
ret
|
||||||
|
.L29:
|
||||||
|
ret
|
||||||
|
.size findNode, .-findNode
|
||||||
|
.align 1
|
||||||
|
.globl destroyLinkedList
|
||||||
|
.type destroyLinkedList, @function
|
||||||
|
destroyLinkedList:
|
||||||
|
addi sp,sp,-32
|
||||||
|
sd s0,16(sp)
|
||||||
|
ld s0,0(a0)
|
||||||
|
sd s1,8(sp)
|
||||||
|
sd ra,24(sp)
|
||||||
|
mv s1,a0
|
||||||
|
beq s0,zero,.L31
|
||||||
|
.L32:
|
||||||
|
mv a0,s0
|
||||||
|
ld s0,8(s0)
|
||||||
|
call free@plt
|
||||||
|
bne s0,zero,.L32
|
||||||
|
.L31:
|
||||||
|
ld s0,16(sp)
|
||||||
|
ld ra,24(sp)
|
||||||
|
mv a0,s1
|
||||||
|
ld s1,8(sp)
|
||||||
|
addi sp,sp,32
|
||||||
|
tail free@plt
|
||||||
|
.size destroyLinkedList, .-destroyLinkedList
|
||||||
|
.ident "GCC: (Debian 12.2.0-13) 12.2.0"
|
||||||
|
.section .note.GNU-stack,"",@progbits
|
|
@ -0,0 +1,5 @@
|
||||||
|
mod quicksort;
|
||||||
|
mod linkedlist;
|
||||||
|
|
||||||
|
pub use quicksort::*;
|
||||||
|
pub use linkedlist::*;
|
|
@ -0,0 +1,259 @@
|
||||||
|
// #[cfg(test)]
|
||||||
|
pub mod tests {
|
||||||
|
use compiler::{backend::*, middle::ir::instruction::binary_inst::Add};
|
||||||
|
use var::{ArrVar, Str, Var};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn quicksort_example() {
|
||||||
|
let mut entry = Block::new("entry".into());
|
||||||
|
let addispsp_32 = Inst::Add(AddInst::new(REG_SP.into(), REG_SP.into(), (-32).into()));
|
||||||
|
let sdra24sp = Inst::Sd(SdInst::new(REG_RA.into(), (24).into(), REG_SP.into()));
|
||||||
|
let sds016sp = Inst::Sd(SdInst::new(REG_S0.into(), (16).into(), REG_SP.into()));
|
||||||
|
let sds18sp = Inst::Sd(SdInst::new(REG_S1.into(), (8).into(), REG_SP.into()));
|
||||||
|
let sds20sp = Inst::Sd(SdInst::new(REG_S2.into(), (0).into(), REG_SP.into()));
|
||||||
|
let bgea1a2lbb0_17 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bge, REG_A1.into(), REG_A2.into(), "LBB0_17".into())
|
||||||
|
);
|
||||||
|
entry.extend_insts(vec![addispsp_32, sdra24sp, sds016sp, sds18sp, sds20sp, bgea1a2lbb0_17]);
|
||||||
|
let mvs2a2 = Inst::Mv(MvInst::new(REG_S2.into(), REG_A2.into()));
|
||||||
|
let mvs1a0 = Inst::Mv(MvInst::new(REG_S1.into(), REG_A0.into()));
|
||||||
|
let jlbb0_3 = Inst::Jmp(JmpInst::new("LBB0_3".into()));
|
||||||
|
entry.extend_insts(vec![mvs2a2, mvs1a0, jlbb0_3]);
|
||||||
|
|
||||||
|
let mut lbb0_2 = Block::new("lbb0_2".into());
|
||||||
|
let sllia2s02 = Inst::SLL(SllInst::new(REG_A2.into(), REG_S0.into(), (2).into()));
|
||||||
|
let adda2a2s1 = Inst::Add(AddInst::new(REG_A2.into(), REG_A2.into(), REG_S1.into()));
|
||||||
|
let swa00a2 = Inst::Sw(SwInst::new(REG_A0.into(), (0).into(), REG_A2.into()));
|
||||||
|
let addia2s0_1 = Inst::Add(AddInst::new(REG_A2.into(), REG_S0.into(), (-1).into()));
|
||||||
|
let mva0s1 = Inst::Mv(MvInst::new(REG_A0.into(), REG_S1.into()));
|
||||||
|
let callquicksort = Inst::Call(CallInst::new("QuickSort".into()));
|
||||||
|
let addia1s01 = Inst::Add(AddInst::new(REG_A1.into(), REG_S0.into(), (1).into()));
|
||||||
|
let bgea1s2lbb0_17 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bge, REG_A1.into(), REG_S2.into(), "LBB0_17".into())
|
||||||
|
);
|
||||||
|
lbb0_2.extend_insts(
|
||||||
|
vec![
|
||||||
|
sllia2s02,
|
||||||
|
adda2a2s1,
|
||||||
|
swa00a2,
|
||||||
|
addia2s0_1,
|
||||||
|
mva0s1,
|
||||||
|
callquicksort,
|
||||||
|
addia1s01,
|
||||||
|
bgea1s2lbb0_17,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut lbb0_3 = Block::new("LBB0_3".into());
|
||||||
|
let sllia0a12 = Inst::SLL(SllInst::new(REG_A0.into(), REG_A1.into(), (2).into()));
|
||||||
|
let adda0a0s1 = Inst::Add(AddInst::new(REG_A0.into(), REG_A0.into(), REG_S1.into()));
|
||||||
|
let lwa00a0 = Inst::Lw(LwInst::new(REG_A0.into(), (0).into(), REG_A0.into()));
|
||||||
|
let mvs0a1 = Inst::Mv(MvInst::new(REG_S0.into(), REG_A1.into()));
|
||||||
|
let bgea1s2lbb0_2 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bge, REG_A1.into(), REG_S2.into(), "LBB0_2".into())
|
||||||
|
);
|
||||||
|
lbb0_3.extend_insts(vec![sllia0a12, adda0a0s1, lwa00a0, mvs0a1, bgea1s2lbb0_2]);
|
||||||
|
let mvs0a1 = Inst::Mv(MvInst::new(REG_S0.into(), REG_A1.into()));
|
||||||
|
let mva2s2 = Inst::Mv(MvInst::new(REG_A2.into(), REG_S2.into()));
|
||||||
|
let jlbb0_7 = Inst::Jmp(JmpInst::new("LBB0_7".into()));
|
||||||
|
lbb0_3.extend_insts(vec![mvs0a1, mva2s2, jlbb0_7]);
|
||||||
|
|
||||||
|
let mut lbb0_5 = Block::new("LBB0_5".into());
|
||||||
|
let sllis3s22 = Inst::SLL(SllInst::new(REG_S3.into(), REG_S2.into(), (2).into()));
|
||||||
|
let adda3a3s1 = Inst::Add(AddInst::new(REG_A3.into(), REG_A3.into(), REG_S1.into()));
|
||||||
|
let swa40a3 = Inst::Sw(SwInst::new(REG_A4.into(), (0).into(), REG_A3.into()));
|
||||||
|
let addia2a2_1 = Inst::Add(AddInst::new(REG_A2.into(), REG_A2.into(), (-1).into()));
|
||||||
|
lbb0_5.extend_insts(vec![sllis3s22, adda3a3s1, swa40a3, addia2a2_1]);
|
||||||
|
|
||||||
|
let mut llb0_6 = Block::new("LBB0_6".into());
|
||||||
|
let bges0a2lbb0_2 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bge, REG_S0.into(), REG_A2.into(), "LBB0_2".into())
|
||||||
|
);
|
||||||
|
llb0_6.extend_insts(vec![bges0a2lbb0_2]);
|
||||||
|
|
||||||
|
let mut lbb0_7 = Block::new("LBB0_7".into());
|
||||||
|
let bges0a2lbb0_11 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bge, REG_S0.into(), REG_A2.into(), "LBB0_11".into())
|
||||||
|
);
|
||||||
|
lbb0_7.extend_insts(vec![bges0a2lbb0_11]);
|
||||||
|
let sllia3a22 = Inst::SLL(SllInst::new(REG_A3.into(), REG_A2.into(), (2).into()));
|
||||||
|
let adda3a3s1 = Inst::Add(AddInst::new(REG_A3.into(), REG_A3.into(), REG_S1.into()));
|
||||||
|
let mva4a2 = Inst::Mv(MvInst::new(REG_A4.into(), REG_A2.into()));
|
||||||
|
lbb0_7.extend_insts(vec![sllia3a22, adda3a3s1, mva4a2]);
|
||||||
|
|
||||||
|
let mut lbb0_9 = Block::new("LBB0_9".into());
|
||||||
|
let lwa50a3 = Inst::Lw(LwInst::new(REG_A5.into(), (0).into(), REG_A3.into()));
|
||||||
|
let blta5a0lbb0_12 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Blt, REG_A5.into(), REG_A0.into(), "LBB0_12".into())
|
||||||
|
);
|
||||||
|
lbb0_9.extend_insts(vec![lwa50a3, blta5a0lbb0_12]);
|
||||||
|
let addia4a4_1 = Inst::Add(AddInst::new(REG_A4.into(), REG_A4.into(), (-1).into()));
|
||||||
|
let addia2a2_1 = Inst::Add(AddInst::new(REG_A2.into(), REG_A2.into(), (-1).into()));
|
||||||
|
let addia3a3_4 = Inst::Add(AddInst::new(REG_A3.into(), REG_A3.into(), (-4).into()));
|
||||||
|
let blts0a4lbb0_9 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Blt, REG_S0.into(), REG_A4.into(), "LBB0_9".into())
|
||||||
|
);
|
||||||
|
lbb0_9.extend_insts(vec![addia4a4_1, addia2a2_1, addia3a3_4, blts0a4lbb0_9]);
|
||||||
|
|
||||||
|
let mut lbb0_11 = Block::new("LBB0_11".into());
|
||||||
|
let bges0a2lbb0_6 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bge, REG_S0.into(), REG_A2.into(), "LBB0_6".into())
|
||||||
|
);
|
||||||
|
let jlbb0_13 = Inst::Jmp(JmpInst::new("LBB0_13".into()));
|
||||||
|
lbb0_11.extend_insts(vec![bges0a2lbb0_6, jlbb0_13]);
|
||||||
|
|
||||||
|
let mut lbb0_12 = Block::new("LBB0_12".into());
|
||||||
|
let sllia3s02 = Inst::SLL(SllInst::new(REG_A3.into(), REG_S0.into(), (2).into()));
|
||||||
|
let adda3a3s1 = Inst::Add(AddInst::new(REG_A3.into(), REG_A3.into(), REG_S1.into()));
|
||||||
|
let swa50a3 = Inst::Sw(SwInst::new(REG_A5.into(), (0).into(), REG_A3.into()));
|
||||||
|
let addis0s01 = Inst::Add(AddInst::new(REG_S0.into(), REG_S0.into(), (1).into()));
|
||||||
|
let bges0a2lbb0_6 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bge, REG_S0.into(), REG_A2.into(), "LBB0_6".into())
|
||||||
|
);
|
||||||
|
lbb0_12.extend_insts(vec![sllia3s02, adda3a3s1, swa50a3, addis0s01, bges0a2lbb0_6]);
|
||||||
|
|
||||||
|
let mut lbb0_13 = Block::new("LBB0_13".into());
|
||||||
|
let sllia3s02 = Inst::SLL(SllInst::new(REG_A3.into(), REG_S0.into(), (2).into()));
|
||||||
|
let adda3a3s1 = Inst::Add(AddInst::new(REG_A3.into(), REG_A3.into(), REG_S1.into()));
|
||||||
|
lbb0_13.extend_insts(vec![sllia3s02, adda3a3s1]);
|
||||||
|
|
||||||
|
let mut lbb0_14 = Block::new("LBB0_14".into());
|
||||||
|
// lw a4, 0(a3)
|
||||||
|
let lwa40a3 = Inst::Lw(LwInst::new(REG_A4.into(), (0).into(), REG_A3.into()));
|
||||||
|
let bgea4a0lbb0_5 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bge, REG_A4.into(), REG_A0.into(), "LBB0_5".into())
|
||||||
|
);
|
||||||
|
lbb0_14.extend_insts(vec![lwa40a3, bgea4a0lbb0_5]);
|
||||||
|
// push_inst lw
|
||||||
|
let addis0s01 = Inst::Add(AddInst::new(REG_S0.into(), REG_S0.into(), (1).into()));
|
||||||
|
let addia3a34 = Inst::Add(AddInst::new(REG_A3.into(), REG_A3.into(), (4).into()));
|
||||||
|
let bnea2s0lbb0_14 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bne, REG_A2.into(), REG_S0.into(), "LBB0_14".into())
|
||||||
|
);
|
||||||
|
lbb0_14.extend_insts(vec![addis0s01, addia3a34, bnea2s0lbb0_14]);
|
||||||
|
let mvs0a2 = Inst::Mv(MvInst::new(REG_S0.into(), REG_A2.into()));
|
||||||
|
let jlbb0_2 = Inst::Jmp(JmpInst::new("LBB0_2".into()));
|
||||||
|
lbb0_14.extend_insts(vec![mvs0a2, jlbb0_2]);
|
||||||
|
|
||||||
|
let mut lbb0_17 = Block::new("LBB0_17".into());
|
||||||
|
let lia00 = Inst::Add(AddInst::new(REG_A0.into(), REG_ZERO.into(), (0).into()));
|
||||||
|
let ldra24sp = Inst::Ld(LdInst::new(REG_RA.into(), (24).into(), REG_SP.into()));
|
||||||
|
let lds016sp = Inst::Ld(LdInst::new(REG_S0.into(), (16).into(), REG_SP.into()));
|
||||||
|
let lds18sp = Inst::Ld(LdInst::new(REG_S1.into(), (8).into(), REG_SP.into()));
|
||||||
|
let lds20sp = Inst::Ld(LdInst::new(REG_S2.into(), (0).into(), REG_SP.into()));
|
||||||
|
let addispsp32 = Inst::Add(AddInst::new(REG_SP.into(), REG_SP.into(), (32).into()));
|
||||||
|
let ret = Inst::Ret;
|
||||||
|
lbb0_17.extend_insts(vec![lia00, ldra24sp, lds016sp, lds18sp, lds20sp, addispsp32, ret]);
|
||||||
|
|
||||||
|
let mut quickSort = Func::new("QuickSort".into(), Vec::new(), entry);
|
||||||
|
quickSort.push_bb(lbb0_2);
|
||||||
|
quickSort.push_bb(lbb0_3);
|
||||||
|
quickSort.push_bb(lbb0_5);
|
||||||
|
quickSort.push_bb(llb0_6);
|
||||||
|
quickSort.push_bb(lbb0_7);
|
||||||
|
quickSort.push_bb(lbb0_9);
|
||||||
|
quickSort.push_bb(lbb0_11);
|
||||||
|
quickSort.push_bb(lbb0_12);
|
||||||
|
quickSort.push_bb(lbb0_13);
|
||||||
|
quickSort.push_bb(lbb0_14);
|
||||||
|
quickSort.push_bb(lbb0_17);
|
||||||
|
|
||||||
|
// .LC0:
|
||||||
|
// .string "%d\n"
|
||||||
|
|
||||||
|
let mut entry = Block::new("entry".into());
|
||||||
|
let addispsp_32 = Inst::Add(AddInst::new(REG_SP.into(), REG_SP.into(), (-32).into()));
|
||||||
|
let lia29 = Inst::Add(AddInst::new(REG_A2.into(), REG_ZERO.into(), (9).into()));
|
||||||
|
let lia10 = Inst::Add(AddInst::new(REG_A0.into(), REG_ZERO.into(), (9).into()));
|
||||||
|
// TODO lla a0 arr
|
||||||
|
let sds016sp = Inst::Sd(SdInst::new(REG_S0.into(), (16).into(), REG_SP.into()));
|
||||||
|
let sds18sp = Inst::Sd(SdInst::new(REG_S1.into(), (8).into(), REG_SP.into()));
|
||||||
|
let sds20sp = Inst::Sd(SdInst::new(REG_S2.into(), (0).into(), REG_SP.into()));
|
||||||
|
let sdra24sp = Inst::Sd(SdInst::new(REG_RA.into(), (24).into(), REG_SP.into()));
|
||||||
|
// lla s0 arr
|
||||||
|
let callquicksort = Inst::Call(CallInst::new("QuickSort".into()));
|
||||||
|
// lla s2 arr+40
|
||||||
|
// lla s1 LC0 , lc0 is .string "%d\n"
|
||||||
|
entry.extend_insts(
|
||||||
|
vec![
|
||||||
|
addispsp_32,
|
||||||
|
lia29,
|
||||||
|
lia10,
|
||||||
|
/* lla a0, arr */ sds016sp,
|
||||||
|
sds18sp,
|
||||||
|
sds20sp,
|
||||||
|
sdra24sp,
|
||||||
|
/* lla s0 arr */
|
||||||
|
callquicksort, /* lla s1 LC0 */
|
||||||
|
/* lla s2, arr+40 */
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut l35 = Block::new("L35".into());
|
||||||
|
let lwa10s0 = Inst::Lw(LwInst::new(REG_A1.into(), (0).into(), REG_S0.into()));
|
||||||
|
let mva0s1 = Inst::Mv(MvInst::new(REG_A0.into(), REG_S1.into()));
|
||||||
|
let addis0s04 = Inst::Add(AddInst::new(REG_S0.into(), REG_S0.into(), (4).into()));
|
||||||
|
let callprintf = Inst::Call(CallInst::new("printf@plt".into()));
|
||||||
|
let bnes0s2l35 = Inst::Branch(
|
||||||
|
BranchInst::new(BranchOp::Bne, REG_S0.into(), REG_S2.into(), "L35".into())
|
||||||
|
);
|
||||||
|
let ldra24sp = Inst::Ld(LdInst::new(REG_RA.into(), (24).into(), REG_SP.into()));
|
||||||
|
let lds016sp = Inst::Ld(LdInst::new(REG_S0.into(), (16).into(), REG_SP.into()));
|
||||||
|
let lds18sp = Inst::Ld(LdInst::new(REG_S1.into(), (8).into(), REG_SP.into()));
|
||||||
|
let lds20sp = Inst::Ld(LdInst::new(REG_S2.into(), (0).into(), REG_SP.into()));
|
||||||
|
let lia00 = Inst::Add(AddInst::new(REG_A0.into(), REG_ZERO.into(), (0).into()));
|
||||||
|
let addispsp32 = Inst::Add(AddInst::new(REG_SP.into(), REG_SP.into(), (32).into()));
|
||||||
|
let ret = Inst::Ret;
|
||||||
|
l35.extend_insts(
|
||||||
|
vec![
|
||||||
|
lwa10s0,
|
||||||
|
mva0s1,
|
||||||
|
addis0s04,
|
||||||
|
callprintf,
|
||||||
|
bnes0s2l35,
|
||||||
|
ldra24sp,
|
||||||
|
lds016sp,
|
||||||
|
lds18sp,
|
||||||
|
lds20sp,
|
||||||
|
lia00,
|
||||||
|
addispsp32,
|
||||||
|
ret,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
let mut Main = Func::new("main".into(), Vec::new(), entry);
|
||||||
|
Main.push_bb(l35);
|
||||||
|
|
||||||
|
// let lc0 = Var::Str { Str { name : "LC0", init : "%d\n", is_const : true } };
|
||||||
|
let lc0 = Var::Str(Str {
|
||||||
|
name: "LC0".into(),
|
||||||
|
init: Some("%d\n".to_string()),
|
||||||
|
is_const: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
let arr = Var::IntArr(ArrVar {
|
||||||
|
name: "arr".to_string(),
|
||||||
|
capacity: 10,
|
||||||
|
init: vec![
|
||||||
|
(0, 4),
|
||||||
|
(1, 3),
|
||||||
|
(2, 9),
|
||||||
|
(3, 2),
|
||||||
|
(4, 0),
|
||||||
|
(5, 1),
|
||||||
|
(6, 6),
|
||||||
|
(7, 5),
|
||||||
|
(8, 7),
|
||||||
|
(9, 9),
|
||||||
|
],
|
||||||
|
is_const: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
let main_module = Module {
|
||||||
|
name: "main".into(),
|
||||||
|
global: vec![lc0, arr],
|
||||||
|
funcs: vec![Main, quickSort],
|
||||||
|
entry: Some("main".to_string()),
|
||||||
|
};
|
||||||
|
print!("{}", main_module.gen_asm());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
mod ch2;
|
||||||
|
|
||||||
|
use std::{ fs::File, io::Write };
|
||||||
|
|
||||||
|
use compiler::backend::*;
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Reference in New Issue