aboutsummaryrefslogtreecommitdiff
path: root/tests/lshr.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lshr.c')
-rw-r--r--tests/lshr.c205
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);
}