mirror of
https://github.com/open-goal/jak-project
synced 2026-07-08 14:36:52 -04:00
76941379e9
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).
44 lines
1.1 KiB
C++
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();
|
|
} |