aboutsummaryrefslogtreecommitdiff
path: root/tests/tcg/loongarch64/test_bit.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/tcg/loongarch64/test_bit.c')
-rw-r--r--tests/tcg/loongarch64/test_bit.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/tests/tcg/loongarch64/test_bit.c b/tests/tcg/loongarch64/test_bit.c
new file mode 100644
index 0000000000..a6d9904909
--- /dev/null
+++ b/tests/tcg/loongarch64/test_bit.c
@@ -0,0 +1,88 @@
+#include <assert.h>
+#include <inttypes.h>
+
+#define ARRAY_SIZE(X) (sizeof(X) / sizeof(*(X)))
+#define TEST_CLO(N) \
+static uint64_t test_clo_##N(uint64_t rj) \
+{ \
+ uint64_t rd = 0; \
+ \
+ asm volatile("clo."#N" %0, %1\n\t" \
+ : "=r"(rd) \
+ : "r"(rj) \
+ : ); \
+ return rd; \
+}
+
+#define TEST_CLZ(N) \
+static uint64_t test_clz_##N(uint64_t rj) \
+{ \
+ uint64_t rd = 0; \
+ \
+ asm volatile("clz."#N" %0, %1\n\t" \
+ : "=r"(rd) \
+ : "r"(rj) \
+ : ); \
+ return rd; \
+}
+
+#define TEST_CTO(N) \
+static uint64_t test_cto_##N(uint64_t rj) \
+{ \
+ uint64_t rd = 0; \
+ \
+ asm volatile("cto."#N" %0, %1\n\t" \
+ : "=r"(rd) \
+ : "r"(rj) \
+ : ); \
+ return rd; \
+}
+
+#define TEST_CTZ(N) \
+static uint64_t test_ctz_##N(uint64_t rj) \
+{ \
+ uint64_t rd = 0; \
+ \
+ asm volatile("ctz."#N" %0, %1\n\t" \
+ : "=r"(rd) \
+ : "r"(rj) \
+ : ); \
+ return rd; \
+}
+
+TEST_CLO(w)
+TEST_CLO(d)
+TEST_CLZ(w)
+TEST_CLZ(d)
+TEST_CTO(w)
+TEST_CTO(d)
+TEST_CTZ(w)
+TEST_CTZ(d)
+
+struct vector {
+ uint64_t (*func)(uint64_t);
+ uint64_t u;
+ uint64_t r;
+};
+
+static struct vector vectors[] = {
+ {test_clo_w, 0xfff11fff392476ab, 0},
+ {test_clo_d, 0xabd28a64000000, 0},
+ {test_clz_w, 0xfaffff42392476ab, 2},
+ {test_clz_d, 0xabd28a64000000, 8},
+ {test_cto_w, 0xfff11fff392476ab, 2},
+ {test_cto_d, 0xabd28a64000000, 0},
+ {test_ctz_w, 0xfaffff42392476ab, 0},
+ {test_ctz_d, 0xabd28a64000000, 26},
+};
+
+int main()
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(vectors); i++) {
+ assert((*vectors[i].func)(vectors[i].u) == vectors[i].r);
+ }
+
+ return 0;
+}