summaryrefslogtreecommitdiff
path: root/tests/tcg/loongarch64/test_div.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/tcg/loongarch64/test_div.c')
-rw-r--r--tests/tcg/loongarch64/test_div.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/tests/tcg/loongarch64/test_div.c b/tests/tcg/loongarch64/test_div.c
new file mode 100644
index 0000000000..6c31fe97ae
--- /dev/null
+++ b/tests/tcg/loongarch64/test_div.c
@@ -0,0 +1,54 @@
+#include <assert.h>
+#include <inttypes.h>
+#include <stdio.h>
+
+#define TEST_DIV(N, M) \
+static void test_div_ ##N(uint ## M ## _t rj, \
+ uint ## M ## _t rk, \
+ uint64_t rm) \
+{ \
+ uint64_t rd = 0; \
+ \
+ asm volatile("div."#N" %0,%1,%2\n\t" \
+ : "=r"(rd) \
+ : "r"(rj), "r"(rk) \
+ : ); \
+ assert(rd == rm); \
+}
+
+#define TEST_MOD(N, M) \
+static void test_mod_ ##N(uint ## M ## _t rj, \
+ uint ## M ## _t rk, \
+ uint64_t rm) \
+{ \
+ uint64_t rd = 0; \
+ \
+ asm volatile("mod."#N" %0,%1,%2\n\t" \
+ : "=r"(rd) \
+ : "r"(rj), "r"(rk) \
+ : ); \
+ assert(rd == rm); \
+}
+
+TEST_DIV(w, 32)
+TEST_DIV(wu, 32)
+TEST_DIV(d, 64)
+TEST_DIV(du, 64)
+TEST_MOD(w, 32)
+TEST_MOD(wu, 32)
+TEST_MOD(d, 64)
+TEST_MOD(du, 64)
+
+int main(void)
+{
+ test_div_w(0xffaced97, 0xc36abcde, 0x0);
+ test_div_wu(0xffaced97, 0xc36abcde, 0x1);
+ test_div_d(0xffaced973582005f, 0xef56832a358b, 0xffffffffffffffa8);
+ test_div_du(0xffaced973582005f, 0xef56832a358b, 0x11179);
+ test_mod_w(0x7cf18c32, 0xa04da650, 0x1d3f3282);
+ test_mod_wu(0x7cf18c32, 0xc04da650, 0x7cf18c32);
+ test_mod_d(0x7cf18c3200000000, 0xa04da65000000000, 0x1d3f328200000000);
+ test_mod_du(0x7cf18c3200000000, 0xc04da65000000000, 0x7cf18c3200000000);
+
+ return 0;
+}