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:
Tyler Wilding
2022-07-29 20:10:11 -04:00
committed by GitHub
parent a04bdff80d
commit eaac247074
12 changed files with 60 additions and 408 deletions
+1 -2
View File
@@ -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
View File
@@ -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/
+4 -9
View File
@@ -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
View File
@@ -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
View File
@@ -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");
}
-27
View File
@@ -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)
-61
View File
@@ -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")
-3
View File
@@ -1,3 +0,0 @@
watchdog[watchmedo]
prompt_toolkit
jsmin
+8
View File
@@ -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"]))
-48
View File
@@ -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"}}, {{""}});}
-183
View File
@@ -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"}, {""}, {""}