mirror of https://github.com/xemu-project/xemu.git
tests/tcg/loongarch64: Add clo related instructions test
This includes: - CL{O/Z}.{W/D} - CT{O/Z}.{W/D} Signed-off-by: Song Gao <gaosong@loongson.cn> Message-Id: <20220716085426.3098060-5-gaosong@loongson.cn> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
79e853b584
commit
a5661c3ab5
|
@ -0,0 +1,15 @@
|
|||
# -*- Mode: makefile -*-
|
||||
#
|
||||
# LoongArch64 specific tweaks
|
||||
|
||||
# Loongarch64 doesn't support gdb, so skip the EXTRA_RUNS
|
||||
EXTRA_RUNS =
|
||||
|
||||
LOONGARCH64_SRC=$(SRC_PATH)/tests/tcg/loongarch64
|
||||
VPATH += $(LOONGARCH64_SRC)
|
||||
|
||||
LDFLAGS+=-lm
|
||||
|
||||
LOONGARCH64_TESTS = test_bit
|
||||
|
||||
TESTS += $(LOONGARCH64_TESTS)
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue