Files
jak-project/test/test_emitter_arm64.cpp
Tyler Wilding 76941379e9 goalc: Finish converting all load/store instructions to ARM64 (#4334)
All that remains (8 instructions) are division, and NEON instructions
that require me to convert the x86 control byte to NEON `TBL` values.
Those handful of instructions can be done later while doing the next
steps (finally something more interesting than just encoding
instructions).
2026-07-03 19:40:29 -04:00

44 lines
1.1 KiB
C++

#include "emitter_util.h"
#include "goalc/emitter/CodeTester.h"
#include "goalc/emitter/IGen.h"
#include "gtest/gtest.h"
using namespace emitter;
TEST(ARM64EmitterIntegerMath, add_gpr64_imm8s) {
CodeTester tester(InstructionSet::ARM64);
tester.init_code_buffer(256);
std::vector<s64> vals = {0, 1, -1, INT32_MIN, INT32_MAX, INT64_MIN, INT64_MAX};
std::vector<s64> imms = {0, 1, -1, INT8_MIN, INT8_MAX};
// test the ones that aren't sp
for (int i = 0; i < 16; i++) {
if (i == SP) {
continue;
}
for (auto val : vals) {
for (auto imm : imms) {
auto expected = val + imm;
tester.clear();
tester.emit_push_all_gprs(true);
// move initial value to register
tester.emit(IGen::mov_gpr64_gpr64(tester.generator(), i, X0));
// do the add
tester.emit(IGen::add_gpr64_imm8s(tester.generator(), i, imm));
// move for return
tester.emit(IGen::mov_gpr64_gpr64(tester.generator(), X0, i));
tester.emit_pop_all_gprs(true);
tester.emit_return();
execute_ret_tester(tester, val, expected);
}
}
}
tester.clear();
}