diff options
Diffstat (limited to 'tests/lshr.c')
-rw-r--r-- | tests/lshr.c | 205 |
1 files changed, 140 insertions, 65 deletions
diff --git a/tests/lshr.c b/tests/lshr.c index 89b9084..4bfef86 100644 --- a/tests/lshr.c +++ b/tests/lshr.c @@ -1,69 +1,144 @@ -#include "test.h" +#include <ejit/ejit.h> +#include <assert.h> +#include "do_jit.h" -static void -run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size) +int main() { - jit_begin(j, arena_base, arena_size); - size_t align = jit_enter_jit_abi(j, 0, 0, 0); - jit_load_args_2(j, jit_operand_gpr (JIT_OPERAND_ABI_WORD, JIT_R0), - jit_operand_gpr (JIT_OPERAND_ABI_WORD, JIT_R1)); - - jit_lshr(j, JIT_R0, JIT_R0, JIT_R1); - jit_leave_jit_abi(j, 0, 0, align); - jit_retr(j, JIT_R0); - - size_t size = 0; - void* ret = jit_end(j, &size); - - jit_word_t (*f)(jit_word_t, jit_word_t) = ret; - - ASSERT(f(0x7f, 1) == 0xfe); - ASSERT(f(0x7fff, 2) == 0x1fffc); - ASSERT(f(0x81, 16) == 0x810000); - ASSERT(f(0xff, 15) == 0x7f8000); - ASSERT(f(0x7fffffff, 0) == 0x7fffffff); -#if EJIT_WORDSIZE == 32 - ASSERT(f(0xffffffff, 8) == 0xffffff00); - ASSERT(f(0x7fffffff, 3) == 0xfffffff8); - ASSERT(f(-0x7f, 31) == 0x80000000); - ASSERT(f(-0x7fff, 30) == 0x40000000); - ASSERT(f(-0x7fffffff, 29) == 0x20000000); - ASSERT(f(0x80000001, 28) == 0x10000000); - ASSERT(f(0x8001, 17) == 0x20000); - ASSERT(f(0x80000001, 18) == 0x40000); - ASSERT(f(-0xffff, 24) == 0x1000000); -#else - ASSERT(f(0xffffffff, 8) == 0xffffffff00); - ASSERT(f(0x7fffffff, 3) == 0x3fffffff8); - ASSERT(f(-0x7f, 31) == 0xffffffc080000000); - ASSERT(f(-0x7fff, 30) == 0xffffe00040000000); - ASSERT(f(-0x7fffffff, 29) == 0xf000000020000000); - ASSERT(f(0x80000001, 28) == 0x800000010000000); - ASSERT(f(0x8001, 17) == 0x100020000); - ASSERT(f(0x80000001, 18) == 0x2000000040000); - ASSERT(f(-0xffff, 24) == 0xffffff0001000000); - ASSERT(f(0x7f, 33) == 0xfe00000000); - ASSERT(f(0x7ffff, 34) == 0x1ffffc00000000); - ASSERT(f(0x7fffffff, 35) == 0xfffffff800000000); - ASSERT(f(-0x7f, 63) == 0x8000000000000000); - ASSERT(f(-0x7fff, 62) == 0x4000000000000000); - ASSERT(f(-0x7fffffff, 61) == 0x2000000000000000); - ASSERT(f(0x80000001, 60) == 0x1000000000000000); - ASSERT(f(0x81, 48) == 0x81000000000000); - ASSERT(f(0x8001, 49) == 0x2000000000000); - ASSERT(f(0x80000001, 40) == 0x10000000000); - ASSERT(f(0xff, 47) == 0x7f800000000000); - ASSERT(f(0xffff0001, 56) == 0x100000000000000); - ASSERT(f(0xffffffff, 40) == 0xffffff0000000000); - ASSERT(f(0x7fffffffff, 33) == 0xfffffffe00000000); - ASSERT(f(-0x7fffffffff, 63) == 0x8000000000000000); - ASSERT(f(0x8000000001, 48) == 0x1000000000000); - ASSERT(f(0xffffffffff, 47) == 0xffff800000000000); -#endif -} + struct ejit_operand operands[2] = { + EJIT_OPERAND_GPR(0, EJIT_TYPE(long)), + EJIT_OPERAND_GPR(1, EJIT_TYPE(long)) + }; -int -main (int argc, char *argv[]) -{ - return main_helper(argc, argv, run_test); + struct ejit_func *f = ejit_create_func(EJIT_TYPE(long), 2, operands); + + ejit_lshr(f, EJIT_GPR(0), EJIT_GPR(0), EJIT_GPR(1)); + ejit_retr(f, EJIT_GPR(0)); + + ejit_select_compile_func(f, 2, 0, EJIT_USE64(long), do_jit); + + assert(erf2(f, + EJIT_ARG(0x7f, long), + EJIT_ARG(1, long)) == 0xfe); + + assert(erf2(f, + EJIT_ARG(0x7fff, long), + EJIT_ARG(2, long)) == 0x1fffc); + + assert(erf2(f, + EJIT_ARG(0x81, long), + EJIT_ARG(16, long)) == 0x810000); + + assert(erf2(f, + EJIT_ARG(0xff, long), + EJIT_ARG(15, long)) == 0x7f8000); + + assert(erf2(f, + EJIT_ARG(0x7fffffff, long), + EJIT_ARG(0, long)) == 0x7fffffff); + + assert(erf2(f, + EJIT_ARG(0xffffffff, long), + EJIT_ARG(8, long)) == 0xffffffff00); + + assert(erf2(f, + EJIT_ARG(0x7fffffff, long), + EJIT_ARG(3, long)) == 0x3fffffff8); + + assert(erf2(f, + EJIT_ARG(-0x7f, long), + EJIT_ARG(31, long)) == (int64_t)0xffffffc080000000); + + assert(erf2(f, + EJIT_ARG(-0x7fff, long), + EJIT_ARG(30, long)) == (int64_t)0xffffe00040000000); + + assert(erf2(f, + EJIT_ARG(-0x7fffffff, long), + EJIT_ARG(29, long)) == (int64_t)0xf000000020000000); + + assert(erf2(f, + EJIT_ARG(0x80000001, long), + EJIT_ARG(28, long)) == (int64_t)0x800000010000000); + + assert(erf2(f, + EJIT_ARG(0x8001, long), + EJIT_ARG(17, long)) == 0x100020000); + + assert(erf2(f, + EJIT_ARG(0x80000001, long), + EJIT_ARG(18, long)) == (int64_t)0x2000000040000); + + assert(erf2(f, + EJIT_ARG(-0xffff, long), + EJIT_ARG(24, long)) == (int64_t)0xffffff0001000000); + + assert(erf2(f, + EJIT_ARG(0x7f, long), + EJIT_ARG(33, long)) == 0xfe00000000); + + assert(erf2(f, + EJIT_ARG(0x7ffff, long), + EJIT_ARG(34, long)) == 0x1ffffc00000000); + + assert(erf2(f, + EJIT_ARG(0x7fffffff, long), + EJIT_ARG(35, long)) == (int64_t)0xfffffff800000000); + + assert(erf2(f, + EJIT_ARG(-0x7f, long), + EJIT_ARG(63, long)) == (int64_t)0x8000000000000000); + + assert(erf2(f, + EJIT_ARG(-0x7fff, long), + EJIT_ARG(62, long)) == 0x4000000000000000); + + assert(erf2(f, + EJIT_ARG(-0x7fffffff, long), + EJIT_ARG(61, long)) == 0x2000000000000000); + + assert(erf2(f, + EJIT_ARG(0x80000001, long), + EJIT_ARG(60, long)) == 0x1000000000000000); + + assert(erf2(f, + EJIT_ARG(0x81, long), + EJIT_ARG(48, long)) == 0x81000000000000); + + assert(erf2(f, + EJIT_ARG(0x8001, long), + EJIT_ARG(49, long)) == 0x2000000000000); + + assert(erf2(f, + EJIT_ARG(0x80000001, long), + EJIT_ARG(40, long)) == 0x10000000000); + + assert(erf2(f, + EJIT_ARG(0xff, long), + EJIT_ARG(47, long)) == 0x7f800000000000); + + assert(erf2(f, + EJIT_ARG(0xffff0001, long), + EJIT_ARG(56, long)) == 0x100000000000000); + + assert(erf2(f, + EJIT_ARG(0xffffffff, long), + EJIT_ARG(40, long)) == (int64_t)0xffffff0000000000); + + assert(erf2(f, + EJIT_ARG(0x7fffffffff, long), + EJIT_ARG(33, long)) == (int64_t)0xfffffffe00000000); + + assert(erf2(f, + EJIT_ARG(-0x7fffffffff, long), + EJIT_ARG(63, long)) == (int64_t)0x8000000000000000); + + assert(erf2(f, + EJIT_ARG(0x8000000001, long), + EJIT_ARG(48, long)) == 0x1000000000000); + + assert(erf2(f, + EJIT_ARG(0xffffffffff, long), + EJIT_ARG(47, long)) == (int64_t)0xffff800000000000); + + ejit_destroy_func(f); } |