Add abort() for benefit of benchmark code
[riscv-tests.git] / isa / rv64ud / move.S
1 # See LICENSE for license details.
2
3 #*****************************************************************************
4 # move.S
5 #-----------------------------------------------------------------------------
6 #
7 # This test verifies that fmv.d.x, fmv.x.d, and fsgnj[x|n].d work properly.
8 #
9
10 #include "riscv_test.h"
11 #include "test_macros.h"
12
13 RVTEST_RV64UF
14 RVTEST_CODE_BEGIN
15
16 #define TEST_FSGNJD(n, insn, new_sign, rs1_sign, rs2_sign) \
17 TEST_CASE(n, a0, 0x123456789abcdef0 | (-(new_sign) << 63), \
18 li a1, ((rs1_sign) << 63) | 0x123456789abcdef0; \
19 li a2, -(rs2_sign); \
20 fmv.d.x f1, a1; \
21 fmv.d.x f2, a2; \
22 insn f0, f1, f2; \
23 fmv.x.d a0, f0)
24
25 TEST_FSGNJD(10, fsgnj.d, 0, 0, 0)
26 TEST_FSGNJD(11, fsgnj.d, 1, 0, 1)
27 TEST_FSGNJD(12, fsgnj.d, 0, 1, 0)
28 TEST_FSGNJD(13, fsgnj.d, 1, 1, 1)
29
30 TEST_FSGNJD(20, fsgnjn.d, 1, 0, 0)
31 TEST_FSGNJD(21, fsgnjn.d, 0, 0, 1)
32 TEST_FSGNJD(22, fsgnjn.d, 1, 1, 0)
33 TEST_FSGNJD(23, fsgnjn.d, 0, 1, 1)
34
35 TEST_FSGNJD(30, fsgnjx.d, 0, 0, 0)
36 TEST_FSGNJD(31, fsgnjx.d, 1, 0, 1)
37 TEST_FSGNJD(32, fsgnjx.d, 1, 1, 0)
38 TEST_FSGNJD(33, fsgnjx.d, 0, 1, 1)
39
40 // Test fsgnj.s in conjunction with double-precision moves
41 #define TEST_FSGNJS(n, rd, rs1, rs2) \
42 TEST_CASE(n, a0, (rd) | (-((rd) >> 31) << 32), \
43 li a1, rs1; \
44 li a2, rs2; \
45 fmv.d.x f1, a1; \
46 fmv.d.x f2, a2; \
47 fsgnj.s f0, f1, f2; \
48 fmv.x.s a0, f0); \
49 TEST_CASE(1##n, a0, (rd) | 0xffffffff00000000, \
50 li a1, rs1; \
51 li a2, rs2; \
52 fmv.d.x f1, a1; \
53 fmv.d.x f2, a2; \
54 fsgnj.s f0, f1, f2; \
55 fmv.x.d a0, f0)
56
57 TEST_FSGNJS(40, 0x7fc00000, 0x7ffffffe12345678, 0)
58 TEST_FSGNJS(41, 0x7fc00000, 0xfffffffe12345678, 0)
59 TEST_FSGNJS(42, 0x7fc00000, 0x7fffffff12345678, 0)
60 TEST_FSGNJS(43, 0x12345678, 0xffffffff12345678, 0)
61
62 TEST_FSGNJS(50, 0x7fc00000, 0x7ffffffe12345678, 0x80000000)
63 TEST_FSGNJS(51, 0x7fc00000, 0xfffffffe12345678, 0x80000000)
64 TEST_FSGNJS(52, 0x7fc00000, 0x7fffffff12345678, 0x80000000)
65 TEST_FSGNJS(53, 0x12345678, 0xffffffff12345678, 0x80000000)
66
67 TEST_FSGNJS(60, 0xffc00000, 0x7ffffffe12345678, 0xffffffff80000000)
68 TEST_FSGNJS(61, 0xffc00000, 0xfffffffe12345678, 0xffffffff80000000)
69 TEST_FSGNJS(62, 0x92345678, 0xffffffff12345678, 0xffffffff80000000)
70 TEST_FSGNJS(63, 0x12345678, 0xffffffff12345678, 0x7fffffff80000000)
71
72 // Test fsgnj.d in conjunction with single-precision moves
73 #define TEST_FSGNJD_SP(n, isnan, rd, rs1, rs2) \
74 TEST_CASE(n, a0, ((rd) & 0xffffffff) | (-(((rd) >> 31) & 1) << 32), \
75 li a1, rs1; \
76 li a2, rs2; \
77 fmv.d.x f1, a1; \
78 fmv.d.x f2, a2; \
79 fsgnj.d f0, f1, f2; \
80 feq.s a0, f0, f0; \
81 addi a0, a0, -!(isnan); \
82 bnez a0, 1f; \
83 fmv.x.s a0, f0; \
84 1:); \
85 TEST_CASE(1##n, a0, rd, \
86 li a1, rs1; \
87 li a2, rs2; \
88 fmv.d.x f1, a1; \
89 fmv.d.x f2, a2; \
90 fsgnj.d f0, f1, f2; \
91 fmv.x.d a0, f0; \
92 1:)
93
94 TEST_FSGNJD_SP(70, 0, 0xffffffff11111111, 0xffffffff11111111, 0xffffffff11111111)
95 TEST_FSGNJD_SP(71, 1, 0x7fffffff11111111, 0xffffffff11111111, 0x7fffffff11111111)
96 TEST_FSGNJD_SP(72, 0, 0xffffffff11111111, 0xffffffff11111111, 0xffffffff91111111)
97 TEST_FSGNJD_SP(73, 0, 0xffffffff11111111, 0xffffffff11111111, 0x8000000000000000)
98 TEST_FSGNJD_SP(74, 0, 0xffffffff11111111, 0x7fffffff11111111, 0xffffffff11111111)
99 TEST_FSGNJD_SP(75, 1, 0x7fffffff11111111, 0x7fffffff11111111, 0x7fffffff11111111)
100 TEST_FSGNJD_SP(76, 0, 0xffffffff11111111, 0x7fffffff11111111, 0xffffffff91111111)
101 TEST_FSGNJD_SP(77, 0, 0xffffffff11111111, 0x7fffffff11111111, 0x8000000000000000)
102
103 TEST_PASSFAIL
104
105 RVTEST_CODE_END
106
107 .data
108 RVTEST_DATA_BEGIN
109
110 TEST_DATA
111
112 RVTEST_DATA_END