tests/tcg/loongarch64: Add div and mod related instructions test
This includes: - DIV.{W[U]/D[U]} - MOD.{W[U]/D[U]} Signed-off-by: Song Gao <gaosong@loongson.cn> Message-Id: <20220716085426.3098060-6-gaosong@loongson.cn> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
a5661c3ab5
commit
fa50579a57
@ -11,5 +11,6 @@ VPATH += $(LOONGARCH64_SRC)
|
||||
LDFLAGS+=-lm
|
||||
|
||||
LOONGARCH64_TESTS = test_bit
|
||||
LOONGARCH64_TESTS += test_div
|
||||
|
||||
TESTS += $(LOONGARCH64_TESTS)
|
||||
|
54
tests/tcg/loongarch64/test_div.c
Normal file
54
tests/tcg/loongarch64/test_div.c
Normal file
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user