diff --git a/.gitignore b/.gitignore index 10e673bab..90d354408 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,7 @@ /tests/test-rshr /tests/test-rshr_u /tests/test-rshi_u +/tests/test-comr +/tests/test-negr +/tests/test-negr_d +/tests/test-negr_f diff --git a/tests/test-comr.c b/tests/test-comr.c new file mode 100644 index 000000000..608c374c1 --- /dev/null +++ b/tests/test-comr.c @@ -0,0 +1,45 @@ +#include "test.h" + +static void +run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size) +{ + jit_begin(j, arena_base, arena_size); + + const jit_arg_abi_t abi[] = { JIT_ARG_ABI_INTMAX }; + jit_arg_t args[1]; + const jit_anyreg_t regs[] = { { .gpr=JIT_R0 } }; + + jit_receive(j, 1, abi, args); + jit_load_args(j, 1, abi, args, regs); + + jit_comr(j, JIT_R0, JIT_R0); + jit_retr(j, JIT_R0); + + intmax_t (*f)(intmax_t) = jit_end(j, NULL); + +#if __WORDSIZE == 32 + ASSERT(f(0) == 0xffffffff); + ASSERT(f(1) == 0xfffffffe); + ASSERT(f(0xffffffff) == 0); + ASSERT(f(0x80000000) == 0x7fffffff); + ASSERT(f(0x7fffffff) == 0x80000000); + ASSERT(f(0x80000001) == 0x7ffffffe); +#else + ASSERT(f(0) == 0xffffffffffffffff); + ASSERT(f(1) == 0xfffffffffffffffe); + ASSERT(f(0xffffffff) == 0xffffffff00000000); + ASSERT(f(0x80000000) == 0xffffffff7fffffff); + ASSERT(f(0x7fffffff) == 0xffffffff80000000); + ASSERT(f(0x80000001) == 0xffffffff7ffffffe); + ASSERT(f(0xffffffffffffffff) == 0); + ASSERT(f(0x8000000000000000) == 0x7fffffffffffffff); + ASSERT(f(0x7fffffffffffffff) == 0x8000000000000000); + ASSERT(f(0x8000000000000001) == 0x7ffffffffffffffe); +#endif +} + +int +main (int argc, char *argv[]) +{ + return main_helper(argc, argv, run_test); +} diff --git a/tests/test-negr.c b/tests/test-negr.c new file mode 100644 index 000000000..5a5c5c1d2 --- /dev/null +++ b/tests/test-negr.c @@ -0,0 +1,43 @@ +#include "test.h" + +static void +run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size) +{ + jit_begin(j, arena_base, arena_size); + + const jit_arg_abi_t abi[] = { JIT_ARG_ABI_INTMAX }; + jit_arg_t args[1]; + const jit_anyreg_t regs[] = { { .gpr=JIT_R0 } }; + + jit_receive(j, 1, abi, args); + jit_load_args(j, 1, abi, args, regs); + + jit_negr(j, JIT_R0, JIT_R0); + jit_retr(j, JIT_R0); + + intmax_t (*f)(intmax_t) = jit_end(j, NULL); + + ASSERT(f(0) == 0); +#if __WORDSIZE == 32 + ASSERT(f(1) == 0xffffffff); + ASSERT(f(0xffffffff) == 1); + ASSERT(f(0x80000000) == 0x80000000); + ASSERT(f(0x7fffffff) == 0x80000001); + ASSERT(f(0x80000001) == 0x7fffffff); +#else + ASSERT(f(1) == 0xffffffffffffffff); + ASSERT(f(0xffffffff) == 0xffffffff00000001); + ASSERT(f(0x80000000) == 0xffffffff80000000); + ASSERT(f(0x7fffffff) == 0xffffffff80000001); + ASSERT(f(0x80000001) == 0xffffffff7fffffff); + ASSERT(f(0xffffffffffffffff) == 1); + ASSERT(f(0x8000000000000000) == 0x8000000000000000); + ASSERT(f(0x7fffffffffffffff) == 0x8000000000000001); +#endif +} + +int +main (int argc, char *argv[]) +{ + return main_helper(argc, argv, run_test); +} diff --git a/tests/test-negr_d.c b/tests/test-negr_d.c new file mode 100644 index 000000000..1af229be6 --- /dev/null +++ b/tests/test-negr_d.c @@ -0,0 +1,30 @@ +#include "test.h" + +static void +run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size) +{ + jit_begin(j, arena_base, arena_size); + + const jit_arg_abi_t abi[] = { JIT_ARG_ABI_DOUBLE }; + jit_arg_t args[1]; + const jit_anyreg_t regs[] = { { .fpr=JIT_F0 } }; + + jit_receive(j, 1, abi, args); + jit_load_args(j, 1, abi, args, regs); + + jit_negr_d(j, JIT_F0, JIT_F0); + jit_retr_d(j, JIT_F0); + + double (*f)(double) = jit_end(j, NULL); + + ASSERT(f(0.0) == -0.0); + ASSERT(f(0.5) == -0.5); + ASSERT(f(1.0 / 0.0) == -1.0 / 0.0); + ASSERT(f(-1.25) == 1.25); +} + +int +main (int argc, char *argv[]) +{ + return main_helper(argc, argv, run_test); +} diff --git a/tests/test-negr_f.c b/tests/test-negr_f.c new file mode 100644 index 000000000..cdc1ccdcc --- /dev/null +++ b/tests/test-negr_f.c @@ -0,0 +1,30 @@ +#include "test.h" + +static void +run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size) +{ + jit_begin(j, arena_base, arena_size); + + const jit_arg_abi_t abi[] = { JIT_ARG_ABI_FLOAT }; + jit_arg_t args[1]; + const jit_anyreg_t regs[] = { { .fpr=JIT_F0 } }; + + jit_receive(j, 1, abi, args); + jit_load_args(j, 1, abi, args, regs); + + jit_negr_f(j, JIT_F0, JIT_F0); + jit_retr_f(j, JIT_F0); + + float (*f)(float) = jit_end(j, NULL); + + ASSERT(f(0.0f) == -0.0f); + ASSERT(f(0.5f) == -0.5f); + ASSERT(f(1.0f / 0.0f) == -1.0f / 0.0f); + ASSERT(f(-1.25f) == 1.25f); +} + +int +main (int argc, char *argv[]) +{ + return main_helper(argc, argv, run_test); +}