qemu/tests/tcg/loongarch64/test_bit.c
Song Gao a5661c3ab5 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>
2022-07-19 21:53:58 +05:30

89 lines
3.1 KiB
C

#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;
}