mirror of
https://github.com/open-goal/jak-project
synced 2026-07-07 06:05:15 -04:00
Decompiler: Cleanup CLI and make overriding the config much easier (#1711)
* decomp: cleaned up CLI for decompiler * decomp: much more flexible and clean decomp override mechanism * decomp: cleanup scripts
This commit is contained in:
+1
-2
@@ -110,8 +110,7 @@
|
||||
"args": [
|
||||
"${workspaceRoot}/decompiler/config/jak1_ntsc_black_label.jsonc",
|
||||
"${workspaceRoot}/iso_data",
|
||||
"${workspaceRoot}/decompiler_out",
|
||||
"decompile_code=false"
|
||||
"${workspaceRoot}/decompiler_out"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
+2
-15
@@ -32,7 +32,7 @@ tasks:
|
||||
- sh: test -f {{.DECOMP_BIN_RELEASE_DIR}}/decompiler{{.EXE_FILE_EXTENSION}}
|
||||
msg: "Couldn't locate decompiler executable in '{{.DECOMP_BIN_RELEASE_DIR}}/decompiler'"
|
||||
cmds:
|
||||
- '{{.DECOMP_BIN_RELEASE_DIR}}/decompiler "./decompiler/config/{{.DECOMP_CONFIG}}" "./iso_data" "./decompiler_out" "decompile_code=false"'
|
||||
- '{{.DECOMP_BIN_RELEASE_DIR}}/decompiler "./decompiler/config/{{.DECOMP_CONFIG}}" ./iso_data ./decompiler_out --config-override "{\\\"decompile_code\\\": false}"'
|
||||
boot-game:
|
||||
desc: "Boots the game, it will fail if it's not already booted!"
|
||||
preconditions:
|
||||
@@ -77,19 +77,6 @@ tasks:
|
||||
- rm ./decompiler_out/**/*.asm
|
||||
- rm ./decompiler_out/**/*disasm.gc
|
||||
# TODO - the below are broken, need to be updated or replaced
|
||||
# decomp-file:
|
||||
# cmds:
|
||||
# - python ./scripts/next-decomp-file.py --files "{{.FILES}}"
|
||||
# - task: decomp
|
||||
# decomp-list:
|
||||
# cmds:
|
||||
# - python ./scripts/next-decomp-file.py --list "{{.LIST}}"
|
||||
# vars:
|
||||
# LIST: '{{default "0" .LIST}}'
|
||||
# # python -m pip install -U watchdog[watchmedo]
|
||||
# decomp-watch:
|
||||
# cmds:
|
||||
# - watchmedo shell-command --drop --patterns="*.gc;*.jsonc" --recursive --command='task decomp-file FILES="{{.FILES}}"' ./decompiler/config/
|
||||
# update-gsrc:
|
||||
# cmds:
|
||||
# - python ./scripts/next-decomp-file.py --files "{{.FILES}}"
|
||||
@@ -124,7 +111,7 @@ tasks:
|
||||
# - task: offline-tests
|
||||
update-ref-tests:
|
||||
cmds:
|
||||
- cmd: python ./scripts/default-file-or-folder.py --path failures
|
||||
- cmd: python ./scripts/tasks/default-file-or-folder.py --path failures
|
||||
- cmd: '{{.OFFLINETEST_BIN_RELEASE_DIR}}/offline-test --iso_data_path "./iso_data/{{.GAME}}" --game {{.GAME}} --dump_current_output'
|
||||
ignore_error: true
|
||||
- python ./scripts/update_decomp_reference.py ./failures ./test/decompiler/reference/
|
||||
|
||||
@@ -25,17 +25,12 @@ nlohmann::json read_json_file_from_config(const nlohmann::json& cfg, const std::
|
||||
/*!
|
||||
* Parse the main config file and return decompiler config.
|
||||
*/
|
||||
Config read_config_file(const std::string& path_to_config_file,
|
||||
const std::map<std::string, bool>& overrides) {
|
||||
Config read_config_file(const fs::path& path_to_config_file, const std::string& override_json) {
|
||||
Config config;
|
||||
auto config_str = file_util::read_text_file(path_to_config_file);
|
||||
auto cfg = parse_commented_json(config_str, path_to_config_file);
|
||||
|
||||
// Override JSON
|
||||
for (auto const& [key, val] : overrides) {
|
||||
fmt::print("[Config] - Overwriting '{}' with '{}'\n", key, val);
|
||||
cfg[key] = val;
|
||||
}
|
||||
auto cfg = parse_commented_json(config_str, path_to_config_file.string());
|
||||
auto cfg_override = parse_commented_json(override_json, "");
|
||||
cfg.update(cfg_override);
|
||||
|
||||
int version_int = cfg.at("game_version").get<int>();
|
||||
ASSERT(version_int == 1 || version_int == 2);
|
||||
|
||||
+2
-2
@@ -7,6 +7,7 @@
|
||||
#include <vector>
|
||||
|
||||
#include "common/common_types.h"
|
||||
#include "common/util/FileUtil.h"
|
||||
#include "common/versions.h"
|
||||
|
||||
#include "decompiler/Disasm/Register.h"
|
||||
@@ -165,7 +166,6 @@ struct Config {
|
||||
std::unordered_map<std::string, std::vector<std::string>> import_deps_by_file;
|
||||
};
|
||||
|
||||
Config read_config_file(const std::string& path_to_config_file,
|
||||
const std::map<std::string, bool>& overrides);
|
||||
Config read_config_file(const fs::path& path_to_config_file, const std::string& override_json);
|
||||
|
||||
} // namespace decompiler
|
||||
|
||||
+43
-58
@@ -17,13 +17,11 @@
|
||||
#include "decompiler/data/streamed_audio.h"
|
||||
#include "decompiler/level_extractor/extract_level.h"
|
||||
|
||||
#include "third-party/CLI11.hpp"
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
ArgumentGuard u8_guard(argc, argv);
|
||||
|
||||
Timer decomp_timer;
|
||||
|
||||
fmt::print("[Mem] Top of main: {} MB\n", get_peak_rss() / (1024 * 1024));
|
||||
using namespace decompiler;
|
||||
if (!file_util::setup_project_path(std::nullopt)) {
|
||||
return 1;
|
||||
}
|
||||
@@ -33,72 +31,52 @@ int main(int argc, char** argv) {
|
||||
lg::set_flush_level(lg::level::info);
|
||||
lg::initialize();
|
||||
|
||||
init_opcode_info();
|
||||
fs::path config_path;
|
||||
fs::path in_folder;
|
||||
fs::path out_folder;
|
||||
|
||||
if (argc < 4) {
|
||||
printf(
|
||||
"Usage: decompiler <config_file> <in_folder> <out_folder> "
|
||||
"[bool_flag_name=true/false...]\n");
|
||||
return 1;
|
||||
}
|
||||
fmt::print("[Mem] After init: {} MB\n", get_peak_rss() / (1024 * 1024));
|
||||
std::string config_override = "{}";
|
||||
|
||||
CLI::App app{"OpenGOAL Decompiler"};
|
||||
app.add_option("config-path", config_path,
|
||||
"Path to the decompiler config .jsonc file. ie. "
|
||||
"./decompiler/config/jak1_ntsc_black_label.jsonc")
|
||||
->required();
|
||||
app.add_option("in-folder", in_folder,
|
||||
"The path containing the iso_data folders. ie. ./iso_data/. Assumes the "
|
||||
"'gameName' from the config as a sub-directory")
|
||||
->required();
|
||||
app.add_option("out-folder", out_folder,
|
||||
"The path for where the decompiler should place it's outputs. Assumes the "
|
||||
"'gameName' from the config as a sub-directory")
|
||||
->required();
|
||||
app.add_option("--config-override", config_override,
|
||||
"JSON provided will be merged with the specified config, use to override options");
|
||||
app.validate_positionals();
|
||||
CLI11_PARSE(app, argc, argv);
|
||||
|
||||
// Validate arguments
|
||||
using namespace decompiler;
|
||||
|
||||
// collect all files to process
|
||||
Config config;
|
||||
try {
|
||||
// Allow overriding config boolean flags via CLI
|
||||
// There are very minimum guard-rails here
|
||||
//
|
||||
// "<key>=<override>"
|
||||
//
|
||||
// This allows us to run scripts that deviate from the defaults
|
||||
std::map<std::string, bool> overrides;
|
||||
if (argc > 4) {
|
||||
for (int i = 4; i < argc; i++) {
|
||||
std::string val = argv[i];
|
||||
if (val.find('=') == std::string::npos) {
|
||||
printf("Aborting - invalid flag override syntax\n");
|
||||
printf(
|
||||
"Usage: decompiler <config_file> <in_folder> <out_folder> "
|
||||
"[bool_flag_name=true/false...]\n");
|
||||
return 1;
|
||||
}
|
||||
auto pair = split_string(argv[i], '=');
|
||||
if (pair.size() > 2) {
|
||||
printf("Aborting - invalid flag override syntax, provide pairs!\n");
|
||||
printf(
|
||||
"Usage: decompiler <config_file> <in_folder> <out_folder> "
|
||||
"[bool_flag_name=true/false...]\n");
|
||||
return 1;
|
||||
}
|
||||
if (pair.at(1) != "true" && pair.at(1) != "false") {
|
||||
printf("Aborting - invalid flag override syntax, true|false only!\n");
|
||||
printf(
|
||||
"Usage: decompiler <config_file> <in_folder> <out_folder> "
|
||||
"[bool_flag_name=true/false...]\n");
|
||||
return 1;
|
||||
}
|
||||
overrides.insert({pair.at(0), pair.at(0) == "true"});
|
||||
}
|
||||
}
|
||||
|
||||
config = read_config_file(argv[1], overrides);
|
||||
|
||||
config = read_config_file(config_path, config_override);
|
||||
} catch (const std::exception& e) {
|
||||
lg::error("Failed to parse config: {}", e.what());
|
||||
return 1;
|
||||
}
|
||||
|
||||
// std::string in_folder = file_util::combine_path(argv[2], config.game_name);
|
||||
fs::path in_folder = fs::path(argv[2]) / config.game_name;
|
||||
fs::path out_folder = fs::path(argv[3]) / config.game_name;
|
||||
|
||||
in_folder = in_folder / config.game_name;
|
||||
// Verify the in_folder is correct
|
||||
if (!exists(in_folder)) {
|
||||
fmt::print("Aborting - 'in_folder' does not exist '{}'\n", in_folder.string());
|
||||
return 1;
|
||||
}
|
||||
|
||||
out_folder = out_folder / config.game_name;
|
||||
file_util::create_dir_if_needed(out_folder);
|
||||
file_util::create_dir_if_needed(out_folder / "assets");
|
||||
|
||||
// Warning message if expected ELF isn't found, user could be using bad assets / didn't extract
|
||||
// the ISO properly
|
||||
if (!config.expected_elf_name.empty() && !exists(in_folder / config.expected_elf_name)) {
|
||||
@@ -108,6 +86,16 @@ int main(int argc, char** argv) {
|
||||
in_folder.string(), config.expected_elf_name);
|
||||
}
|
||||
|
||||
// -- Begin the Decompilation!
|
||||
|
||||
Timer decomp_timer;
|
||||
|
||||
fmt::print("[Mem] Top of main: {} MB\n", get_peak_rss() / (1024 * 1024));
|
||||
|
||||
init_opcode_info();
|
||||
|
||||
fmt::print("[Mem] After init: {} MB\n", get_peak_rss() / (1024 * 1024));
|
||||
|
||||
std::vector<fs::path> dgos, objs, strs;
|
||||
for (const auto& dgo_name : config.dgo_names) {
|
||||
dgos.push_back(in_folder / dgo_name);
|
||||
@@ -121,9 +109,6 @@ int main(int argc, char** argv) {
|
||||
strs.push_back(in_folder / str_name);
|
||||
}
|
||||
|
||||
file_util::create_dir_if_needed(out_folder);
|
||||
file_util::create_dir_if_needed(out_folder / "assets");
|
||||
|
||||
if (config.rip_levels) {
|
||||
file_util::create_dir_if_needed(file_util::get_jak_project_dir() / "debug_out");
|
||||
}
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
# Find files that are added to gsrc, but not to ref tests
|
||||
from jak1_file_list import file_list
|
||||
import os
|
||||
|
||||
src_path = ""
|
||||
for f in file_list:
|
||||
if f[2] != 3:
|
||||
continue
|
||||
if f[4] == "kernel":
|
||||
continue
|
||||
src_path = f[4]
|
||||
gsrc_exists = False
|
||||
gsrc_path = "./goal_src/{}/{}.gc".format(src_path, f[0])
|
||||
if os.path.exists(gsrc_path):
|
||||
with open(gsrc_path, "r") as gsrc_file:
|
||||
lines = gsrc_file.readlines()
|
||||
line_count = len(lines)
|
||||
if line_count > 100:
|
||||
gsrc_exists = True
|
||||
|
||||
# now check if there is a ref test file
|
||||
if gsrc_exists:
|
||||
ref_path = "./test/decompiler/reference/{}/{}_REF.gc".format(src_path, f[0])
|
||||
if not os.path.exists(ref_path):
|
||||
print("No Ref Test for - {}".format(f[0]))
|
||||
print(gsrc_path)
|
||||
print(ref_path)
|
||||
@@ -1,61 +0,0 @@
|
||||
import sys
|
||||
from jak1_file_list import file_list
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--files")
|
||||
parser.add_argument("--list", type=int)
|
||||
args = parser.parse_args()
|
||||
|
||||
def update_json_file(decomp_list):
|
||||
new_file_contents = []
|
||||
print("Decompiling - " + ','.join(decomp_list))
|
||||
# TODO, update the CGO/DGO
|
||||
with open("decompiler\config\jak1_ntsc_black_label.jsonc", "r") as config_file:
|
||||
cfg_lines = config_file.readlines()
|
||||
for line in cfg_lines:
|
||||
if "allowed_objects" in line:
|
||||
line = " \"allowed_objects\": [\"" + ','.join(decomp_list) + "\"],\n"
|
||||
new_file_contents.append(line)
|
||||
if len(new_file_contents) > 0:
|
||||
with open("decompiler\config\jak1_ntsc_black_label.jsonc", "w") as f:
|
||||
f.writelines(new_file_contents)
|
||||
print("Allowed objects list updated")
|
||||
|
||||
if args.files:
|
||||
input_list = args.files.split(",")
|
||||
decomp_list = []
|
||||
for inFile in input_list:
|
||||
for file in file_list:
|
||||
if file[0] == inFile:
|
||||
decomp_list.append(file[0])
|
||||
break
|
||||
elif file[1] == inFile:
|
||||
# NOTE - kinda a hack, assumes -ag files always come after
|
||||
decomp_list.append(file[1])
|
||||
break
|
||||
if len(decomp_list) > 0:
|
||||
update_json_file(decomp_list)
|
||||
else:
|
||||
list_eligible = []
|
||||
for file in file_list:
|
||||
if file[2] != 3:
|
||||
continue
|
||||
if len(list_eligible) > args.list:
|
||||
break
|
||||
src_path = "goal_src/" + file[4] + "/" + file[0] + ".gc"
|
||||
with open(src_path) as f:
|
||||
lines = f.readlines()
|
||||
if len(lines) <= 7:
|
||||
list_eligible.append("{} - Empty".format(file[0]))
|
||||
else:
|
||||
# Check for TODOs
|
||||
count_todos = 0
|
||||
for line in lines:
|
||||
if "TODO" in line:
|
||||
count_todos = count_todos + 1
|
||||
if count_todos > 0:
|
||||
list_eligible.append("{} - {} TODOs - {}".format(file[0], count_todos, src_path))
|
||||
if len(list_eligible) > 0:
|
||||
print("The next {} files that need to be addressed:".format(args.list))
|
||||
print(*list_eligible, sep = "\n")
|
||||
@@ -1,3 +0,0 @@
|
||||
watchdog[watchmedo]
|
||||
prompt_toolkit
|
||||
jsmin
|
||||
@@ -42,11 +42,19 @@ decomp_config_map = {
|
||||
}
|
||||
}
|
||||
|
||||
default_config_map = {
|
||||
"jak1": "jak1_ntsc_black_label.jsonc",
|
||||
"jak2": "jak2_ntsc_v1.jsonc"
|
||||
}
|
||||
|
||||
if args.game:
|
||||
if args.game not in valid_games:
|
||||
print("Unsupported game '{}'".format(args.game))
|
||||
sys.exit(1)
|
||||
curr = file["GAME"]
|
||||
file["GAME"] = args.game
|
||||
if (curr != file["GAME"]) or file["DECOMP_CONFIG"] not in decomp_config_map[file["GAME"]]:
|
||||
file["DECOMP_CONFIG"] = default_config_map[file["GAME"]]
|
||||
if args.decomp_config:
|
||||
if args.decomp_config not in decomp_config_map[file["GAME"]]:
|
||||
print("Unsupported decomp config '{}' for game '{}'".format(args.decomp_config, file["GAME"]))
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
TEST(DecompilerAtomicOpBuilder, BEQ) {test_case(assembly_from_list({"L100:", "beq a0, a1, L100", "sll r0, r0, 0", ""}), {"(b! (= a0 a1) L100 (nop!))"}, {{""}}, {{"a0","a1"}}, {{""}});test_case(assembly_from_list({"L100:", "beq r0, r0, L100", "sll r0, r0, 0", ""}), {"(b! #t L100 (nop!))"}, {{""}}, {{""}}, {{""}});test_case(assembly_from_list({"L100:", "beq a0, r0, L100", "sll r0, r0, 0", ""}), {"(b! (zero? a0) L100 (nop!))"}, {{""}}, {{"a0"}}, {{""}});test_case(assembly_from_list({"L100:", "beq s7, a0, L100", "sll r0, r0, 0", ""}), {"(b! (not a0) L100 (nop!))"}, {{""}}, {{"a0"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, BEQL) {test_case(assembly_from_list({"L100:", "beql a0, a1, L100", "sll r0, r0, 0", ""}), {"(bl! (= a0 a1) L100 (nop!))"}, {{""}}, {{"a0","a1"}}, {{""}});test_case(assembly_from_list({"L100:", "beql r0, r0, L100", "sll r0, r0, 0", ""}), {"(bl! #t L100 (nop!))"}, {{""}}, {{""}}, {{""}});test_case(assembly_from_list({"L100:", "beql a0, r0, L100", "sll r0, r0, 0", ""}), {"(bl! (zero? a0) L100 (nop!))"}, {{""}}, {{"a0"}}, {{""}});test_case(assembly_from_list({"L100:", "beql s7, a0, L100", "sll r0, r0, 0", ""}), {"(bl! (not a0) L100 (nop!))"}, {{""}}, {{"a0"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, BGEZL) {test_case(assembly_from_list({"L100:", "bgezl a0, L100", "sll r0, r0, 0", ""}), {"(bl! (>=0.si a0) L100 (nop!))"}, {{""}}, {{"a0"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, BGTZL) {test_case(assembly_from_list({"L100:", "bgtzl a0, L100", "sll r0, r0, 0", ""}), {"(bl! (>0.si a0) L100 (nop!))"}, {{""}}, {{"a0"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, BLTZL) {test_case(assembly_from_list({"L100:", "bltzl a0, L100", "sll r0, r0, 0", ""}), {"(bl! (<0.si a0) L100 (nop!))"}, {{""}}, {{"a0"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, BNE) {test_case(assembly_from_list({"L100:", "bne a1, a2, L100", "sll r0, r0, 0", ""}), {"(b! (!= a1 a2) L100 (nop!))"}, {{""}}, {{"a1","a2"}}, {{""}});test_case(assembly_from_list({"L100:", "bne a1, a2, L100", "or a3, s7, r0", ""}), {"(b! (!= a1 a2) L100 (set! a3 #f))"}, {{"a3"}}, {{"a1","a2"}}, {{""}});test_case(assembly_from_list({"L100:", "bne a1, a2, L100", "or a3, t0, r0", ""}), {"(b! (!= a1 a2) L100 (set! a3 t0))"}, {{"a3"}}, {{"a1","a2","t0"}}, {{""}});test_case(assembly_from_list({"L100:", "bne a1, a2, L100", "daddiu a3, s7, 8", ""}), {"(b! (!= a1 a2) L100 (set! a3 #t))"}, {{"a3"}}, {{"a1","a2"}}, {{""}});test_case(assembly_from_list({"L100:", "bne a1, a2, L100", "lw a3, pair(s7)", ""}), {"(b! (!= a1 a2) L100 (set! a3 pair))"}, {{"a3"}}, {{"a1","a2"}}, {{""}});test_case(assembly_from_list({"L100:", "bne a1, a2, L100", "lw a3, binteger(s7)", ""}), {"(b! (!= a1 a2) L100 (set! a3 binteger))"}, {{"a3"}}, {{"a1","a2"}}, {{""}});test_case(assembly_from_list({"L100:", "bne a1, a2, L100", "dsllv a3, t0, t1", ""}), {"(b! (!= a1 a2) L100 (set! a3 (sll t0 t1)))"}, {{"a3"}}, {{"a1","a2","t0","t1"}}, {{""}});test_case(assembly_from_list({"L100:", "bne a1, a2, L100", "dsubu a3, r0, t1", ""}), {"(b! (!= a1 a2) L100 (set! a3 (- t1)))"}, {{"a3"}}, {{"a1","a2","","t1"}}, {{""}});test_case(assembly_from_list({"L100:", "bne a1, r0, L100", "sll r0, r0, 0", ""}), {"(b! (nonzero? a1) L100 (nop!))"}, {{""}}, {{"a1"}}, {{""}});test_case(assembly_from_list({"L100:", "bne s7, a1, L100", "sll r0, r0, 0", ""}), {"(b! (truthy a1) L100 (nop!))"}, {{""}}, {{"a1"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, BNEL) {test_case(assembly_from_list({"L100:", "bnel a1, a2, L100", "sll r0, r0, 0", ""}), {"(bl! (!= a1 a2) L100 (nop!))"}, {{""}}, {{"a1","a2"}}, {{""}});test_case(assembly_from_list({"L100:", "bnel a1, r0, L100", "sll r0, r0, 0", ""}), {"(bl! (nonzero? a1) L100 (nop!))"}, {{""}}, {{"a1"}}, {{""}});test_case(assembly_from_list({"L100:", "bnel s7, a1, L100", "sll r0, r0, 0", ""}), {"(bl! (truthy a1) L100 (nop!))"}, {{""}}, {{"a1"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, C_EQ_S) {test_case(assembly_from_list({"L100:", "c.eq.s f1, f2", "bc1t L100", "sll r0, r0, 0", ""}), {"(b! (=.s f1 f2) L100 (nop!))"}, {{""}}, {{"f1","f2"}}, {{""}});test_case(assembly_from_list({"L100:", "c.eq.s f1, f2", "bc1f L100", "sll r0, r0, 0", ""}), {"(b! (!=.s f1 f2) L100 (nop!))"}, {{""}}, {{"f1","f2"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, C_LE_S) {test_case(assembly_from_list({"L100:", "c.le.s f1, f2", "bc1t L100", "sll r0, r0, 0", ""}), {"(b! (<=.s f1 f2) L100 (nop!))"}, {{""}}, {{"f1","f2"}}, {{""}});test_case(assembly_from_list({"L100:", "c.le.s f1, f2", "bc1f L100", "sll r0, r0, 0", ""}), {"(b! (>.s f1 f2) L100 (nop!))"}, {{""}}, {{"f1","f2"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, C_LT_S) {test_case(assembly_from_list({"L100:", "c.lt.s f1, f2", "bc1t L100", "sll r0, r0, 0", ""}), {"(b! (<.s f1 f2) L100 (nop!))"}, {{""}}, {{"f1","f2"}}, {{""}});test_case(assembly_from_list({"L100:", "c.lt.s f1, f2", "bc1f L100", "sll r0, r0, 0", ""}), {"(b! (>=.s f1 f2) L100 (nop!))"}, {{""}}, {{"f1","f2"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, DADDIU) {test_case(assembly_from_list({"daddiu a1, s7, 8", "movn a1, s7, a0", ""}), {"(set! a1 (zero? a0))"}, {{"a1"}}, {{"a0"}}, {{""}});test_case(assembly_from_list({"daddiu a1, s7, 8", "movz a1, s7, a0", ""}), {"(set! a1 (nonzero? a0))"}, {{"a1"}}, {{"a0"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, DADDU) {test_case(assembly_from_list({"daddu v1, r0, v0", ""}), {"(set! v1 (+ v0 0))"}, {{"v1"}}, {{"v0"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, DIV) {test_case(assembly_from_list({"div a1, a2", "mflo a3", ""}), {"(set! a3 (/.si a1 a2))"}, {{"a3"}}, {{"a1","a2"}}, {{""}});test_case(assembly_from_list({"div a1, a2", "mfhi a3", ""}), {"(set! a3 (mod.si a1 a2))"}, {{"a3"}}, {{"a1","a2"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, DIVU) {test_case(assembly_from_list({"divu a1, a2", "mflo a3", ""}), {"(set! a3 (/.ui a1 a2))"}, {{"a3"}}, {{"a1","a2"}}, {{""}});test_case(assembly_from_list({"divu a1, a2", "mfhi a3", ""}), {"(set! a3 (mod.ui a1 a2))"}, {{"a3"}}, {{"a1","a2"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, DSLL32) {test_case(assembly_from_list({"L100:", "dsll32 v1, s4, 30", "slt v1, v1, r0", "beq v1, r0, L100", "sll r0, r0, 0", ""}), {"(b! (not-pair? s4) L100 (nop!))"}, {{""}}, {{"s4"}}, {{"v1"}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, DSUBU) {test_case(assembly_from_list({"dsubu a0, a1, a2", "daddiu t0, s7, 8", "movn t0, s7, a0", ""}), {"(set! t0 (= a1 a2))"}, {{"t0"}}, {{"a1","a2"}}, {{"a0"}});test_case(assembly_from_list({"dsubu a0, a1, a2", "daddiu t0, s7, 8", "movz t0, s7, a0", ""}), {"(set! t0 (!= a1 a2))"}, {{"t0"}}, {{"a1","a2"}}, {{"a0"}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, JALR) {test_case(assembly_from_list({"jalr ra, t9", "sll v0, ra, 0", ""}), {"(call!)"}, {{""}}, {{"t9"}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, LUI) {test_case(assembly_from_list({"L100:", "lui a0, 2", "ori a1, a0, 3", ""}), {"(set! a1 131075)"}, {{"a1"}}, {{""}}, {{"a0"}});test_case(assembly_from_list({"L100:", "lui a0, 2", "ori a0, a0, 3", ""}), {"(set! a0 131075)"}, {{"a0"}}, {{""}}, {{""}});test_case(assembly_from_list({"L100:", "lui a0, L100", "ori a1, a0, L100", ""}), {"(set! a1 L100)"}, {{"a1"}}, {{""}}, {{"a0"}});test_case(assembly_from_list({"L100:", "lui a0, L100", "ori a0, a0, L100", ""}), {"(set! a0 L100)"}, {{"a0"}}, {{""}}, {{""}});test_case(assembly_from_list({"L100:", "lui a0, L100", "ori a1, a0, L100", "addu a1, fp, a1", ""}), {"(set! a1 L100)"}, {{"a1"}}, {{""}}, {{"a0"}});test_case(assembly_from_list({"L100:", "lui a1, L100", "ori a1, a1, L100", "addu a1, fp, a1", ""}), {"(set! a1 L100)"}, {{"a1"}}, {{""}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, MTC1) {test_case(assembly_from_list({"mtc1 f3, r0", ""}), {"(set! f3 0)"}, {{"f3"}}, {{""}}, {{""}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, SLT) {test_case(assembly_from_list({"slt a0, a1, a2", "movz a1, a2, a0", ""}), {"(set! a1 (min.si a1 a2))"}, {{"a1"}}, {{"a1","a2"}}, {{"a0"}});test_case(assembly_from_list({"slt a0, a1, a2", "movn a1, a2, a0", ""}), {"(set! a1 (max.si a1 a2))"}, {{"a1"}}, {{"a1","a2"}}, {{"a0"}});test_case(assembly_from_list({"L100:", "slt a3, a0, a1", "bne a3, r0, L100", "or a3, s7, r0", ""}), {"(b! (<.si a0 a1) L100 (set! a3 #f))"}, {{"a3"}}, {{"a0","a1"}}, {{""}});test_case(assembly_from_list({"L100:", "slt a3, a0, a1", "bne a3, r0, L100", "or a2, s7, r0", ""}), {"(b! (<.si a0 a1) L100 (set! a2 #f))"}, {{"a2"}}, {{"a0","a1"}}, {{"a3"}});test_case(assembly_from_list({"L100:", "slt a3, a0, a1", "beq a3, r0, L100", "or a3, s7, r0", ""}), {"(b! (>=.si a0 a1) L100 (set! a3 #f))"}, {{"a3"}}, {{"a0","a1"}}, {{""}});test_case(assembly_from_list({"L100:", "slt a3, a0, a1", "beq a3, r0, L100", "or a2, s7, r0", ""}), {"(b! (>=.si a0 a1) L100 (set! a2 #f))"}, {{"a2"}}, {{"a0","a1"}}, {{"a3"}});test_case(assembly_from_list({"slt a3, a0, a1", "daddiu a2, s7, 8", "movz a2, s7, a3", ""}), {"(set! a2 (<.si a0 a1))"}, {{"a2"}}, {{"a0","a1"}}, {{"a3"}});test_case(assembly_from_list({"slt a3, a0, r0", "daddiu a2, s7, 8", "movz a2, s7, a3", ""}), {"(set! a2 (<0.si a0))"}, {{"a2"}}, {{"a0"}}, {{"a3"}});test_case(assembly_from_list({"slt a3, a0, a1", "daddiu a2, s7, 8", "movn a2, s7, a3", ""}), {"(set! a2 (>=.si a0 a1))"}, {{"a2"}}, {{"a0","a1"}}, {{"a3"}});test_case(assembly_from_list({"slt a3, a0, r0", "daddiu a2, s7, 8", "movn a2, s7, a3", ""}), {"(set! a2 (>=0.si a0))"}, {{"a2"}}, {{"a0"}}, {{"a3"}});test_case(assembly_from_list({"slt a3, r0, a0", "daddiu a2, s7, 8", "movz a2, s7, a3", ""}), {"(set! a2 (>0.si a0))"}, {{"a2"}}, {{"a0"}}, {{"a3"}});test_case(assembly_from_list({"L100:", "slt v1, s2, r0", "beq v1, r0, L100", "or v1, s7, r0", ""}), {"(b! (>=0.si s2) L100 (set! v1 #f))"}, {{"v1"}}, {{"s2"}}, {{""}});test_case(assembly_from_list({"L100:", "slt v1, s2, r0", "beq v1, r0, L100", "or v0, s7, r0", ""}), {"(b! (>=0.si s2) L100 (set! v0 #f))"}, {{"v0"}}, {{"s2"}}, {{"v1"}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, SLTI) {test_case(assembly_from_list({"L100:", "slti a3, a0, 12", "bne a3, r0, L100", "or a3, s7, r0", ""}), {"(b! (<.si a0 12) L100 (set! a3 #f))"}, {{"a3"}}, {{"a0"}}, {{""}});test_case(assembly_from_list({"L100:", "slti a3, a0, 12", "bne a3, r0, L100", "or a2, s7, r0", ""}), {"(b! (<.si a0 12) L100 (set! a2 #f))"}, {{"a2"}}, {{"a0"}}, {{"a3"}});test_case(assembly_from_list({"L100:", "slti a3, a0, 12", "beq a3, r0, L100", "or a3, s7, r0", ""}), {"(b! (>=.si a0 12) L100 (set! a3 #f))"}, {{"a3"}}, {{"a0"}}, {{""}});test_case(assembly_from_list({"L100:", "slti a3, a0, 12", "beq a3, r0, L100", "or a2, s7, r0", ""}), {"(b! (>=.si a0 12) L100 (set! a2 #f))"}, {{"a2"}}, {{"a0"}}, {{"a3"}});test_case(assembly_from_list({"slti a3, a0, 12", "daddiu a2, s7, 8", "movz a2, s7, a3", ""}), {"(set! a2 (<.si a0 12))"}, {{"a2"}}, {{"a0"}}, {{"a3"}});test_case(assembly_from_list({"slti a3, a0, 12", "daddiu a2, s7, 8", "movn a2, s7, a3", ""}), {"(set! a2 (>=.si a0 12))"}, {{"a2"}}, {{"a0"}}, {{"a3"}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, SLTIU) {test_case(assembly_from_list({"L100:", "sltiu a3, a0, 12", "bne a3, r0, L100", "or a3, s7, r0", ""}), {"(b! (<.ui a0 12) L100 (set! a3 #f))"}, {{"a3"}}, {{"a0"}}, {{""}});test_case(assembly_from_list({"L100:", "sltiu a3, a0, 12", "bne a3, r0, L100", "or a2, s7, r0", ""}), {"(b! (<.ui a0 12) L100 (set! a2 #f))"}, {{"a2"}}, {{"a0"}}, {{"a3"}});test_case(assembly_from_list({"L100:", "sltiu a3, a0, 12", "beq a3, r0, L100", "or a3, s7, r0", ""}), {"(b! (>=.ui a0 12) L100 (set! a3 #f))"}, {{"a3"}}, {{"a0"}}, {{""}});test_case(assembly_from_list({"L100:", "sltiu a3, a0, 12", "beq a3, r0, L100", "or a2, s7, r0", ""}), {"(b! (>=.ui a0 12) L100 (set! a2 #f))"}, {{"a2"}}, {{"a0"}}, {{"a3"}});test_case(assembly_from_list({"sltiu a3, a0, 12", "daddiu a2, s7, 8", "movz a2, s7, a3", ""}), {"(set! a2 (<.ui a0 12))"}, {{"a2"}}, {{"a0"}}, {{"a3"}});test_case(assembly_from_list({"sltiu a3, a0, 12", "daddiu a2, s7, 8", "movn a2, s7, a3", ""}), {"(set! a2 (>=.ui a0 12))"}, {{"a2"}}, {{"a0"}}, {{"a3"}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, SLTU) {test_case(assembly_from_list({"sltu a0, a1, a2", "movz a1, a2, a0", ""}), {"(set! a1 (min.ui a1 a2))"}, {{"a1"}}, {{"a1","a2"}}, {{"a0"}});test_case(assembly_from_list({"sltu a0, a1, a2", "movn a1, a2, a0", ""}), {"(set! a1 (max.ui a1 a2))"}, {{"a1"}}, {{"a1","a2"}}, {{"a0"}});test_case(assembly_from_list({"L100:", "sltu a3, a0, a1", "bne a3, r0, L100", "or a3, s7, r0", ""}), {"(b! (<.ui a0 a1) L100 (set! a3 #f))"}, {{"a3"}}, {{"a0","a1"}}, {{""}});test_case(assembly_from_list({"L100:", "sltu a3, a0, a1", "bne a3, r0, L100", "or a2, s7, r0", ""}), {"(b! (<.ui a0 a1) L100 (set! a2 #f))"}, {{"a2"}}, {{"a0","a1"}}, {{"a3"}});test_case(assembly_from_list({"L100:", "sltu a3, a0, a1", "beq a3, r0, L100", "or a3, s7, r0", ""}), {"(b! (>=.ui a0 a1) L100 (set! a3 #f))"}, {{"a3"}}, {{"a0","a1"}}, {{""}});test_case(assembly_from_list({"L100:", "sltu a3, a0, a1", "beq a3, r0, L100", "or a2, s7, r0", ""}), {"(b! (>=.ui a0 a1) L100 (set! a2 #f))"}, {{"a2"}}, {{"a0","a1"}}, {{"a3"}});test_case(assembly_from_list({"sltu a3, a0, a1", "daddiu a2, s7, 8", "movz a2, s7, a3", ""}), {"(set! a2 (<.ui a0 a1))"}, {{"a2"}}, {{"a0","a1"}}, {{"a3"}});test_case(assembly_from_list({"sltu a3, a0, a1", "daddiu a2, s7, 8", "movn a2, s7, a3", ""}), {"(set! a2 (>=.ui a0 a1))"}, {{"a2"}}, {{"a0","a1"}}, {{"a3"}});}
|
||||
|
||||
TEST(DecompilerAtomicOpBuilder, SW) {test_case(assembly_from_list({"sw r0, test(s7)", ""}), {"(s.w! test 0)"}, {{""}}, {{""}}, {{""}});test_case(assembly_from_list({"sw r0, 2(a3)", ""}), {"(s.w! (+ a3 2) 0)"}, {{""}}, {{"a3"}}, {{""}});test_case(assembly_from_list({"sw r0, 0(a3)", ""}), {"(s.w! a3 0)"}, {{""}}, {{"a3"}}, {{""}});}
|
||||
|
||||
@@ -1,183 +0,0 @@
|
||||
" or a1, a2, a3\n", {"(set! a1 (logior a2 a3))"}, {"a1"}, {"a2 a3"}, {""}
|
||||
" or a2, r0, r0\n", {"(set! a2 0)"}, {"a2"}, {""}, {""}
|
||||
" or a1, s7, r0\n", {"(set! a1 '#f)"}, {"a1"}, {""}, {""}
|
||||
" ori a2, r0, 1234\n", {"(set! a2 1234)"}, {"a2"}, {""}, {""}
|
||||
" ori a2, r0, -1234\n", {"(set! a2 -1234)"}, {"a2"}, {""}, {""}
|
||||
" ori a2, a3, -1234\n", {"(set! a2 (logior a3 -1234))"}, {"a2"}, {"a3"}, {""}
|
||||
" mtc1 f3, a1\n", {"(set! f3 (gpr->fpr a1))"}, {"f3"}, {"a1"}, {""}
|
||||
" mfc1 a1, f3\n", {"(set! a1 (fpr->gpr f3))"}, {"a1"}, {"f3"}, {""}
|
||||
" and a1, a2, a3\n", {"(set! a1 (logand a2 a3))"}, {"a1"}, {"a2 a3"}, {""}
|
||||
"L123:\n lwc1 f3, L123(fp)\n", {"(set! f3 (l.f L123))"}, {"f3"}, {""}, {""}
|
||||
" lwc1 f2, 0(a3)\n", {"(set! f2 (l.f a3))"}, {"f2"}, {"a3"}, {""}
|
||||
" lwc1 f2, 12(a3)\n", {"(set! f2 (l.f (+ a3 12)))"}, {"f2"}, {"a3"}, {""}
|
||||
"L123:\n lb a3, L123(fp)\n", {"(set! a3 (l.b L123))"}, {"a3"}, {""}, {""}
|
||||
" lb a2, 0(a3)\n", {"(set! a2 (l.b a3))"}, {"a2"}, {"a3"}, {""}
|
||||
" lb a2, 12(a3)\n", {"(set! a2 (l.b (+ a3 12)))"}, {"a2"}, {"a3"}, {""}
|
||||
"L123:\n lbu a3, L123(fp)\n", {"(set! a3 (l.bu L123))"}, {"a3"}, {""}, {""}
|
||||
" lbu a2, 0(a3)\n", {"(set! a2 (l.bu a3))"}, {"a2"}, {"a3"}, {""}
|
||||
" lbu a2, 12(a3)\n", {"(set! a2 (l.bu (+ a3 12)))"}, {"a2"}, {"a3"}, {""}
|
||||
"L123:\n lh a3, L123(fp)\n", {"(set! a3 (l.h L123))"}, {"a3"}, {""}, {""}
|
||||
" lh a2, 0(a3)\n", {"(set! a2 (l.h a3))"}, {"a2"}, {"a3"}, {""}
|
||||
" lh a2, 12(a3)\n", {"(set! a2 (l.h (+ a3 12)))"}, {"a2"}, {"a3"}, {""}
|
||||
"L123:\n lhu a3, L123(fp)\n", {"(set! a3 (l.hu L123))"}, {"a3"}, {""}, {""}
|
||||
" lhu a2, 0(a3)\n", {"(set! a2 (l.hu a3))"}, {"a2"}, {"a3"}, {""}
|
||||
" lhu a2, 12(a3)\n", {"(set! a2 (l.hu (+ a3 12)))"}, {"a2"}, {"a3"}, {""}
|
||||
"L123:\n lwu a3, L123(fp)\n", {"(set! a3 (l.wu L123))"}, {"a3"}, {""}, {""}
|
||||
" lwu a2, 0(a3)\n", {"(set! a2 (l.wu a3))"}, {"a2"}, {"a3"}, {""}
|
||||
" lwu a2, 12(a3)\n", {"(set! a2 (l.wu (+ a3 12)))"}, {"a2"}, {"a3"}, {""}
|
||||
"L123:\n ld a3, L123(fp)\n", {"(set! a3 (l.d L123))"}, {"a3"}, {""}, {""}
|
||||
" ld a2, 0(a3)\n", {"(set! a2 (l.d a3))"}, {"a2"}, {"a3"}, {""}
|
||||
" ld a2, 12(a3)\n", {"(set! a2 (l.d (+ a3 12)))"}, {"a2"}, {"a3"}, {""}
|
||||
" lw r0, 2(r0)\n", {"(break!)"}, {""}, {""}, {""}
|
||||
" lw a2, test(s7)\n", {"(set! a2 test)"}, {"a2"}, {""}, {""}
|
||||
"L123:\n lw a3, L123(fp)\n", {"(set! a3 (l.w L123))"}, {"a3"}, {""}, {""}
|
||||
" lw a2, 0(a3)\n", {"(set! a2 (l.w a3))"}, {"a2"}, {"a3"}, {""}
|
||||
" lw a2, 12(a3)\n", {"(set! a2 (l.w (+ a3 12)))"}, {"a2"}, {"a3"}, {""}
|
||||
" dsll a2, a3, 3\n", {"(set! a2 (shl a3 3))"}, {"a2"}, {"a3"}, {""}
|
||||
" dsll32 a2, a3, 3\n", {"(set! a2 (shl a3 35))"}, {"a2"}, {"a3"}, {""}
|
||||
" dsrl a2, a3, 3\n", {"(set! a2 (srl a3 3))"}, {"a2"}, {"a3"}, {""}
|
||||
" dsrl32 a2, a3, 3\n", {"(set! a2 (srl a3 35))"}, {"a2"}, {"a3"}, {""}
|
||||
" dsra a2, a3, 3\n", {"(set! a2 (sra a3 3))"}, {"a2"}, {"a3"}, {""}
|
||||
" dsra32 a2, a3, 3\n", {"(set! a2 (sra a3 35))"}, {"a2"}, {"a3"}, {""}
|
||||
" div.s f1, f2, f3\n", {"(set! f1 (/.s f2 f3))"}, {"f1"}, {"f2 f3"}, {""}
|
||||
" min.s f1, f2, f3\n", {"(set! f1 (min.s f2 f3))"}, {"f1"}, {"f2 f3"}, {""}
|
||||
" max.s f1, f2, f3\n", {"(set! f1 (max.s f2 f3))"}, {"f1"}, {"f2 f3"}, {""}
|
||||
" mul.s f1, f2, f3\n", {"(set! f1 (*.s f2 f3))"}, {"f1"}, {"f2 f3"}, {""}
|
||||
" add.s f1, f2, f3\n", {"(set! f1 (+.s f2 f3))"}, {"f1"}, {"f2 f3"}, {""}
|
||||
" sub.s f1, f2, f3\n", {"(set! f1 (-.s f2 f3))"}, {"f1"}, {"f2 f3"}, {""}
|
||||
" daddiu a1, s7, test\n", {"(set! a1 'test)"}, {"a1"}, {""}, {""}
|
||||
" daddiu a1, s7, -10\n", {"(set! a1 '())"}, {"a1"}, {""}, {""}
|
||||
" daddiu a1, s7, -32768\n", {"(set! a1 __START-OF-TABLE__)"}, {"a1"}, {""}, {""}
|
||||
" daddiu a1, s7, 8\n", {"(set! a1 '#t)"}, {"a1"}, {""}, {""}
|
||||
"L123:\n daddiu a1, fp, L123\n", {"(set! a1 L123)"}, {"a1"}, {""}, {""}
|
||||
" daddiu a1, a2, 1234\n", {"(set! a1 (+ a2 1234))"}, {"a1"}, {"a2"}, {""}
|
||||
" daddu a1, a2, a3\n", {"(set! a1 (+ a2 a3))"}, {"a1"}, {"a2 a3"}, {""}
|
||||
" dsubu a1, a2, a3\n", {"(set! a1 (- a2 a3))"}, {"a1"}, {"a2 a3"}, {""}
|
||||
" dsubu a1, r0, a3\n", {"(set! a1 (- a3))"}, {"a1"}, {"a3"}, {""}
|
||||
" mult3 a1, a2, a3\n", {"(set! a1 (*.si a2 a3))"}, {"a1"}, {"a2 a3"}, {""}
|
||||
" multu3 a1, a2, a3\n", {"(set! a1 (*.ui a2 a3))"}, {"a1"}, {"a2 a3"}, {""}
|
||||
" andi a1, a2, 1234\n", {"(set! a1 (logand a2 1234))"}, {"a1"}, {"a2"}, {""}
|
||||
" xori a1, a2, 1234\n", {"(set! a1 (logxor a2 1234))"}, {"a1"}, {"a2"}, {""}
|
||||
" nor a1, a2, r0\n", {"(set! a1 (lognot a2))"}, {"a1"}, {"a2"}, {""}
|
||||
" nor a1, a2, a3\n", {"(set! a1 (lognor a2 a3))"}, {"a1"}, {"a2 a3"}, {""}
|
||||
" xor a1, a2, a3\n", {"(set! a1 (logxor a2 a3))"}, {"a1"}, {"a2 a3"}, {""}
|
||||
" addiu a1, r0, 12\n", {"(set! a1 12)"}, {"a1"}, {""}, {""}
|
||||
" lui a3, 2\n", {"(set! a3 131072)"}, {"a3"}, {""}, {""}
|
||||
" sll r0, r0, 0\n", {"(nop!)"}, {""}, {""}, {""}
|
||||
" dsrav a1, a2, a3\n", {"(set! a1 (sra a2 a3))"}, {"a1"}, {"a2 a3"}, {""}
|
||||
" dsrlv a1, a2, a3\n", {"(set! a1 (srl a2 a3))"}, {"a1"}, {"a2 a3"}, {""}
|
||||
" dsllv a1, a2, a3\n", {"(set! a1 (sll a2 a3))"}, {"a1"}, {"a2 a3"}, {""}
|
||||
" sb a1, 2(a3)\n", {"(s.b! (+ a3 2) a1)"}, {""}, {"a1 a3"}, {""}
|
||||
" sb a1, 0(a3)\n", {"(s.b! a3 a1)"}, {""}, {"a1 a3"}, {""}
|
||||
" sb s7, 2(a3)\n", {"(s.b! (+ a3 2) '#f)"}, {""}, {"a3"}, {""}
|
||||
" sb s7, 0(a3)\n", {"(s.b! a3 '#f)"}, {""}, {"a3"}, {""}
|
||||
" sh a1, 2(a3)\n", {"(s.h! (+ a3 2) a1)"}, {""}, {"a1 a3"}, {""}
|
||||
" sh a1, 0(a3)\n", {"(s.h! a3 a1)"}, {""}, {"a1 a3"}, {""}
|
||||
" sh s7, 2(a3)\n", {"(s.h! (+ a3 2) '#f)"}, {""}, {"a3"}, {""}
|
||||
" sh s7, 0(a3)\n", {"(s.h! a3 '#f)"}, {""}, {"a3"}, {""}
|
||||
" sw a1, test(s7)\n", {"(s.w! test a1)"}, {""}, {"a1"}, {""}
|
||||
" sw s7, test(s7)\n", {"(s.w! test '#f)"}, {""}, {""}, {""}
|
||||
" sw a1, 2(a3)\n", {"(s.w! (+ a3 2) a1)"}, {""}, {"a1 a3"}, {""}
|
||||
" sw a1, 0(a3)\n", {"(s.w! a3 a1)"}, {""}, {"a1 a3"}, {""}
|
||||
" sw s7, 2(a3)\n", {"(s.w! (+ a3 2) '#f)"}, {""}, {"a3"}, {""}
|
||||
" sw s7, 0(a3)\n", {"(s.w! a3 '#f)"}, {""}, {"a3"}, {""}
|
||||
" sd a1, 2(a3)\n", {"(s.d! (+ a3 2) a1)"}, {""}, {"a1 a3"}, {""}
|
||||
" sd a1, 0(a3)\n", {"(s.d! a3 a1)"}, {""}, {"a1 a3"}, {""}
|
||||
" sd s7, 2(a3)\n", {"(s.d! (+ a3 2) '#f)"}, {""}, {"a3"}, {""}
|
||||
" sd s7, 0(a3)\n", {"(s.d! a3 '#f)"}, {""}, {"a3"}, {""}
|
||||
" swc1 f2, 2(a3)\n", {"(s.f! (+ a3 2) f2)"}, {""}, {"f2 a3"}, {""}
|
||||
" swc1 f2, 0(a3)\n", {"(s.f! a3 f2)"}, {""}, {"f2 a3"}, {""}
|
||||
" cvt.s.w f1, f2\n", {"(set! f1 (i2f f2))"}, {"f1"}, {"f2"}, {""}
|
||||
" cvt.w.s f1, f2\n", {"(set! f1 (f2i f2))"}, {"f1"}, {"f2"}, {""}
|
||||
" abs.s f1, f2\n", {"(set! f1 (abs.s f2))"}, {"f1"}, {"f2"}, {""}
|
||||
" neg.s f1, f2\n", {"(set! f1 (neg.s f2))"}, {"f1"}, {"f2"}, {""}
|
||||
" sqrt.s f1, f2\n", {"(set! f1 (sqrt.s f2))"}, {"f1"}, {"f2"}, {""}
|
||||
" mov.s f1, f2\n", {"(set! f1 f2)"}, {"f1"}, {"f2"}, {""}
|
||||
" movz a1, s7, a2\n", {"(cmove-#f-zero a1 a2)"}, {"a1"}, {"a2"}, {""}
|
||||
" movn a1, s7, a2\n", {"(cmove-#f-nonzero a1 a2)"}, {"a1"}, {"a2"}, {""}
|
||||
|
||||
|
||||
" div a1, a2\n mflo a3\n", {"(set! a3 (/.si a1 a2))"}, {"a3"}, {"a1 a2"}, {""}
|
||||
" divu a1, a2\n mflo a3\n", {"(set! a3 (/.ui a1 a2))"}, {"a3"}, {"a1 a2"}, {""}
|
||||
" div a1, a2\n mfhi a3\n", {"(set! a3 (mod.si a1 a2))"}, {"a3"}, {"a1 a2"}, {""}
|
||||
" divu a1, a2\n mfhi a3\n", {"(set! a3 (mod.ui a1 a2))"}, {"a3"}, {"a1 a2"}, {""}
|
||||
" jalr ra, t9\n sll v0, ra, 0\n", {"(call!)"}, {""}, {"t9"}, {""}
|
||||
"L100:\n bne a1, a2, L100\n sll r0, r0, 0\n", {"(b! (!= a1 a2) L100 (nop!))"}, {""}, {"a1 a2"}, {""}
|
||||
"L100:\n bne a1, a2, L100\n or a3, s7, r0\n", {"(b! (!= a1 a2) L100 (set! a3 #f))"}, {"a3"}, {"a1 a2"}, {""}
|
||||
"L100:\n bne a1, a2, L100\n or a3, t0, r0\n", {"(b! (!= a1 a2) L100 (set! a3 t0))"}, {"a3"}, {"a1 a2 t0"}, {""}
|
||||
"L100:\n bne a1, a2, L100\n daddiu a3, s7, 8\n", {"(b! (!= a1 a2) L100 (set! a3 #t))"}, {"a3"}, {"a1 a2"}, {""}
|
||||
"L100:\n bne a1, a2, L100\n lw a3, pair(s7)\n", {"(b! (!= a1 a2) L100 (set! a3 pair))"}, {"a3"}, {"a1 a2"}, {""}
|
||||
"L100:\n bne a1, a2, L100\n lw a3, binteger(s7)\n", {"(b! (!= a1 a2) L100 (set! a3 binteger))"}, {"a3"}, {"a1 a2"}, {""}
|
||||
"L100:\n bne a1, a2, L100\n dsllv a3, t0, t1\n", {"(b! (!= a1 a2) L100 (set! a3 (sll t0 t1)))"}, {"a3"}, {"a1 a2 t0 t1"}, {""}
|
||||
"L100:\n bne a1, a2, L100\n dsubu a3, r0, t1\n", {"(b! (!= a1 a2) L100 (set! a3 (- t1)))"}, {"a3"}, {"a1 a2 t1"}, {""}
|
||||
"L100:\n bne a1, r0, L100\n sll r0, r0, 0\n", {"(b! (nonzero? a1) L100 (nop!))"}, {""}, {"a1"}, {""}
|
||||
"L100:\n bne s7, a1, L100\n sll r0, r0, 0\n", {"(b! (truthy a1) L100 (nop!))"}, {""}, {"a1"}, {""}
|
||||
"L100:\n bnel a1, a2, L100\n sll r0, r0, 0\n", {"(bl! (!= a1 a2) L100 (nop!))"}, {""}, {"a1 a2"}, {""}
|
||||
"L100:\n bnel a1, r0, L100\n sll r0, r0, 0\n", {"(bl! (nonzero? a1) L100 (nop!))"}, {""}, {"a1"}, {""}
|
||||
"L100:\n bnel s7, a1, L100\n sll r0, r0, 0\n", {"(bl! (truthy a1) L100 (nop!))"}, {""}, {"a1"}, {""}
|
||||
"L100:\n beq a0, a1, L100\n sll r0, r0, 0\n", {"(b! (= a0 a1) L100 (nop!))"}, {""}, {"a0 a1"}, {""}
|
||||
"L100:\n beq r0, r0, L100\n sll r0, r0, 0\n", {"(b! #t L100 (nop!))"}, {""}, {""}, {""}
|
||||
"L100:\n beq a0, r0, L100\n sll r0, r0, 0\n", {"(b! (zero? a0) L100 (nop!))"}, {""}, {"a0"}, {""}
|
||||
"L100:\n beq s7, a0, L100\n sll r0, r0, 0\n", {"(b! (not a0) L100 (nop!))"}, {""}, {"a0"}, {""}
|
||||
"L100:\n beql a0, a1, L100\n sll r0, r0, 0\n", {"(bl! (= a0 a1) L100 (nop!))"}, {""}, {"a0 a1"}, {""}
|
||||
"L100:\n beql r0, r0, L100\n sll r0, r0, 0\n", {"(bl! #t L100 (nop!))"}, {""}, {""}, {""}
|
||||
"L100:\n beql a0, r0, L100\n sll r0, r0, 0\n", {"(bl! (zero? a0) L100 (nop!))"}, {""}, {"a0"}, {""}
|
||||
"L100:\n beql s7, a0, L100\n sll r0, r0, 0\n", {"(bl! (not a0) L100 (nop!))"}, {""}, {"a0"}, {""}
|
||||
"L100:\n bgtzl a0, L100\n sll r0, r0, 0\n", {"(bl! (>0.si a0) L100 (nop!))"}, {""}, {"a0"}, {""}
|
||||
"L100:\n bgezl a0, L100\n sll r0, r0, 0\n", {"(bl! (>=0.si a0) L100 (nop!))"}, {""}, {"a0"}, {""}
|
||||
"L100:\n bltzl a0, L100\n sll r0, r0, 0\n", {"(bl! (<0.si a0) L100 (nop!))"}, {""}, {"a0"}, {""}
|
||||
" daddiu a1, s7, 8\n movn a1, s7, a0\n", {"(set! a1 (zero? a0))"}, {"a1"}, {"a0"}, {""}
|
||||
" daddiu a1, s7, 8\n movz a1, s7, a0\n", {"(set! a1 (nonzero? a0))"}, {"a1"}, {"a0"}, {""}
|
||||
"L100:\n lui a0, 2\n ori a1, a0, 3\n", {"(set! a1 131075)"}, {"a1"}, {""}, {"a0"}
|
||||
"L100:\n lui a0, 2\n ori a0, a0, 3\n", {"(set! a0 131075)"}, {"a0"}, {""}, {""}
|
||||
"L100:\n lui a0, L100\n ori a1, a0, L100\n", {"(set! a1 L100)"}, {"a1"}, {""}, {"a0"}
|
||||
"L100:\n lui a0, L100\n ori a0, a0, L100\n", {"(set! a0 L100)"}, {"a0"}, {""}, {""}
|
||||
" slt a0, a1, a2\n movz a1, a2, a0\n", {"(set! a1 (min.si a1 a2))"}, {"a1"}, {"a1 a2"}, {"a0"}
|
||||
" slt a0, a1, a2\n movn a1, a2, a0\n", {"(set! a1 (max.si a1 a2))"}, {"a1"}, {"a1 a2"}, {"a0"}
|
||||
" sltu a0, a1, a2\n movz a1, a2, a0\n", {"(set! a1 (min.ui a1 a2))"}, {"a1"}, {"a1 a2"}, {"a0"}
|
||||
" sltu a0, a1, a2\n movn a1, a2, a0\n", {"(set! a1 (max.ui a1 a2))"}, {"a1"}, {"a1 a2"}, {"a0"}
|
||||
"L100:\n lui a0, L100\n ori a1, a0, L100\n addu a1, fp, a1\n", {"(set! a1 L100)"}, {"a1"}, {""}, {"a0"}
|
||||
"L100:\n lui a1, L100\n ori a1, a1, L100\n addu a1, fp, a1\n", {"(set! a1 L100)"}, {"a1"}, {""}, {""}
|
||||
" dsubu a0, a1, a2\n daddiu t0, s7, 8\n movn t0, s7, a0\n", {"(set! t0 (= a1 a2))"}, {"t0"}, {"a1 a2"}, {"a0"}
|
||||
" dsubu a0, a1, a2\n daddiu t0, s7, 8\n movz t0, s7, a0\n", {"(set! t0 (!= a1 a2))"}, {"t0"}, {"a1 a2"}, {"a0"}
|
||||
"L100:\n slt a3, a0, a1\n bne a3, r0, L100\n or a3, s7, r0\n", {"(b! (<.si a0 a1) L100 (set! a3 #f))"}, {"a3"}, {"a0 a1"}, {""}
|
||||
"L100:\n slt a3, a0, a1\n bne a3, r0, L100\n or a2, s7, r0\n", {"(b! (<.si a0 a1) L100 (set! a2 #f))"}, {"a2"}, {"a0 a1"}, {"a3"}
|
||||
"L100:\n sltu a3, a0, a1\n bne a3, r0, L100\n or a3, s7, r0\n", {"(b! (<.ui a0 a1) L100 (set! a3 #f))"}, {"a3"}, {"a0 a1"}, {""}
|
||||
"L100:\n sltu a3, a0, a1\n bne a3, r0, L100\n or a2, s7, r0\n", {"(b! (<.ui a0 a1) L100 (set! a2 #f))"}, {"a2"}, {"a0 a1"}, {"a3"}
|
||||
"L100:\n slt a3, a0, a1\n beq a3, r0, L100\n or a3, s7, r0\n", {"(b! (>=.si a0 a1) L100 (set! a3 #f))"}, {"a3"}, {"a0 a1"}, {""}
|
||||
"L100:\n slt a3, a0, a1\n beq a3, r0, L100\n or a2, s7, r0\n", {"(b! (>=.si a0 a1) L100 (set! a2 #f))"}, {"a2"}, {"a0 a1"}, {"a3"}
|
||||
"L100:\n sltu a3, a0, a1\n beq a3, r0, L100\n or a3, s7, r0\n", {"(b! (>=.ui a0 a1) L100 (set! a3 #f))"}, {"a3"}, {"a0 a1"}, {""}
|
||||
"L100:\n sltu a3, a0, a1\n beq a3, r0, L100\n or a2, s7, r0\n", {"(b! (>=.ui a0 a1) L100 (set! a2 #f))"}, {"a2"}, {"a0 a1"}, {"a3"}
|
||||
" slt a3, a0, a1\n daddiu a2, s7, 8\n movz a2, s7, a3\n", {"(set! a2 (<.si a0 a1))"}, {"a2"}, {"a0 a1"}, {"a3"}
|
||||
" slt a3, a0, r0\n daddiu a2, s7, 8\n movz a2, s7, a3\n", {"(set! a2 (<0.si a0))"}, {"a2"}, {"a0"}, {"a3"}
|
||||
" sltu a3, a0, a1\n daddiu a2, s7, 8\n movz a2, s7, a3\n", {"(set! a2 (<.ui a0 a1))"}, {"a2"}, {"a0 a1"}, {"a3"}
|
||||
" slt a3, a0, a1\n daddiu a2, s7, 8\n movn a2, s7, a3\n", {"(set! a2 (>=.si a0 a1))"}, {"a2"}, {"a0 a1"}, {"a3"}
|
||||
" slt a3, a0, r0\n daddiu a2, s7, 8\n movn a2, s7, a3\n", {"(set! a2 (>=0.si a0))"}, {"a2"}, {"a0"}, {"a3"}
|
||||
" sltu a3, a0, a1\n daddiu a2, s7, 8\n movn a2, s7, a3\n", {"(set! a2 (>=.ui a0 a1))"}, {"a2"}, {"a0 a1"}, {"a3"}
|
||||
"L100:\n slti a3, a0, 12\n bne a3, r0, L100\n or a3, s7, r0\n", {"(b! (<.si a0 12) L100 (set! a3 #f))"}, {"a3"}, {"a0"}, {""}
|
||||
"L100:\n slti a3, a0, 12\n bne a3, r0, L100\n or a2, s7, r0\n", {"(b! (<.si a0 12) L100 (set! a2 #f))"}, {"a2"}, {"a0"}, {"a3"}
|
||||
"L100:\n sltiu a3, a0, 12\n bne a3, r0, L100\n or a3, s7, r0\n", {"(b! (<.ui a0 12) L100 (set! a3 #f))"}, {"a3"}, {"a0"}, {""}
|
||||
"L100:\n sltiu a3, a0, 12\n bne a3, r0, L100\n or a2, s7, r0\n", {"(b! (<.ui a0 12) L100 (set! a2 #f))"}, {"a2"}, {"a0"}, {"a3"}
|
||||
"L100:\n slti a3, a0, 12\n beq a3, r0, L100\n or a3, s7, r0\n", {"(b! (>=.si a0 12) L100 (set! a3 #f))"}, {"a3"}, {"a0"}, {""}
|
||||
"L100:\n slti a3, a0, 12\n beq a3, r0, L100\n or a2, s7, r0\n", {"(b! (>=.si a0 12) L100 (set! a2 #f))"}, {"a2"}, {"a0"}, {"a3"}
|
||||
"L100:\n sltiu a3, a0, 12\n beq a3, r0, L100\n or a3, s7, r0\n", {"(b! (>=.ui a0 12) L100 (set! a3 #f))"}, {"a3"}, {"a0"}, {""}
|
||||
"L100:\n sltiu a3, a0, 12\n beq a3, r0, L100\n or a2, s7, r0\n", {"(b! (>=.ui a0 12) L100 (set! a2 #f))"}, {"a2"}, {"a0"}, {"a3"}
|
||||
" slti a3, a0, 12\n daddiu a2, s7, 8\n movz a2, s7, a3\n", {"(set! a2 (<.si a0 12))"}, {"a2"}, {"a0"}, {"a3"}
|
||||
" sltiu a3, a0, 12\n daddiu a2, s7, 8\n movz a2, s7, a3\n", {"(set! a2 (<.ui a0 12))"}, {"a2"}, {"a0"}, {"a3"}
|
||||
" slti a3, a0, 12\n daddiu a2, s7, 8\n movn a2, s7, a3\n", {"(set! a2 (>=.si a0 12))"}, {"a2"}, {"a0"}, {"a3"}
|
||||
" sltiu a3, a0, 12\n daddiu a2, s7, 8\n movn a2, s7, a3\n", {"(set! a2 (>=.ui a0 12))"}, {"a2"}, {"a0"}, {"a3"}
|
||||
"L100:\n c.eq.s f1, f2\n bc1t L100\n sll r0, r0, 0\n", {"(b! (=.s f1 f2) L100 (nop!))"}, {""}, {"f1 f2"}, {""}
|
||||
"L100:\n c.eq.s f1, f2\n bc1f L100\n sll r0, r0, 0\n", {"(b! (!=.s f1 f2) L100 (nop!))"}, {""}, {"f1 f2"}, {""}
|
||||
"L100:\n c.lt.s f1, f2\n bc1t L100\n sll r0, r0, 0\n", {"(b! (<.s f1 f2) L100 (nop!))"}, {""}, {"f1 f2"}, {""}
|
||||
"L100:\n c.lt.s f1, f2\n bc1f L100\n sll r0, r0, 0\n", {"(b! (>=.s f1 f2) L100 (nop!))"}, {""}, {"f1 f2"}, {""}
|
||||
"L100:\n c.le.s f1, f2\n bc1t L100\n sll r0, r0, 0\n", {"(b! (<=.s f1 f2) L100 (nop!))"}, {""}, {"f1 f2"}, {""}
|
||||
"L100:\n c.le.s f1, f2\n bc1f L100\n sll r0, r0, 0\n", {"(b! (>.s f1 f2) L100 (nop!))"}, {""}, {"f1 f2"}, {""}
|
||||
"L100:\n dsll32 v1, s4, 30\n slt v1, v1, r0\n beq v1, r0, L100\n sll r0, r0, 0\n", {"(b! (not-pair? s4) L100 (nop!))"}, {""}, {"s4"}, {"v1"}
|
||||
" slt a3, r0, a0\n daddiu a2, s7, 8\n movz a2, s7, a3\n", {"(set! a2 (>0.si a0))"}, {"a2"}, {"a0"}, {"a3"}
|
||||
" daddu v1, r0, v0\n", {"(set! v1 (+ v0 0))"}, {"v1"}, {"v0"}, {""}
|
||||
" sw r0, test(s7)\n", {"(s.w! test 0)"}, {""}, {""}, {""}
|
||||
" sw r0, 2(a3)\n", {"(s.w! (+ a3 2) 0)"}, {""}, {"a3"}, {""}
|
||||
" sw r0, 0(a3)\n", {"(s.w! a3 0)"}, {""}, {"a3"}, {""}
|
||||
"L100:\n slt v1, s2, r0\n beq v1, r0, L100\n or v1, s7, r0\n", {"(b! (>=0.si s2) L100 (set! v1 #f))"}, {"v1"}, {"s2"}, {""}
|
||||
"L100:\n slt v1, s2, r0\n beq v1, r0, L100\n or v0, s7, r0\n", {"(b! (>=0.si s2) L100 (set! v0 #f))"}, {"v0"}, {"s2"}, {"v1"}
|
||||
" mtc1 f3, r0\n", {"(set! f3 0)"}, {"f3"}, {""}, {""}
|
||||
Reference in New Issue
Block a user