112771Sqtt2@cornell.edu# See LICENSE for license details.
212771Sqtt2@cornell.edu
312771Sqtt2@cornell.edu#*****************************************************************************
412771Sqtt2@cornell.edu# move.S
512771Sqtt2@cornell.edu#-----------------------------------------------------------------------------
612771Sqtt2@cornell.edu#
712771Sqtt2@cornell.edu# This test verifies that fmv.d.x, fmv.x.d, and fsgnj[x|n].d work properly.
812771Sqtt2@cornell.edu#
912771Sqtt2@cornell.edu
1012771Sqtt2@cornell.edu#include "riscv_test.h"
1112771Sqtt2@cornell.edu#include "test_macros.h"
1212771Sqtt2@cornell.edu
1312771Sqtt2@cornell.eduRVTEST_RV64UF
1412771Sqtt2@cornell.eduRVTEST_CODE_BEGIN
1512771Sqtt2@cornell.edu
1612771Sqtt2@cornell.edu#TODO: make 32-bit compatible version
1712771Sqtt2@cornell.edu#define TEST_FSGNJD(n, insn, new_sign, rs1_sign, rs2_sign) \
1812771Sqtt2@cornell.edu  TEST_CASE(n, a0, 0x123456789abcdef0 | (-(new_sign) << 63), \
1912771Sqtt2@cornell.edu    li a1, ((rs1_sign) << 63) | 0x123456789abcdef0; \
2012771Sqtt2@cornell.edu    li a2, -(rs2_sign); \
2112771Sqtt2@cornell.edu    fmv.d.x f1, a1; \
2212771Sqtt2@cornell.edu    fmv.d.x f2, a2; \
2312771Sqtt2@cornell.edu    insn f0, f1, f2; \
2412771Sqtt2@cornell.edu    fmv.x.d a0, f0)
2512771Sqtt2@cornell.edu
2612771Sqtt2@cornell.edu  TEST_FSGNJD(10, fsgnj.d, 0, 0, 0)
2712771Sqtt2@cornell.edu  TEST_FSGNJD(11, fsgnj.d, 1, 0, 1)
2812771Sqtt2@cornell.edu  TEST_FSGNJD(12, fsgnj.d, 0, 1, 0)
2912771Sqtt2@cornell.edu  TEST_FSGNJD(13, fsgnj.d, 1, 1, 1)
3012771Sqtt2@cornell.edu
3112771Sqtt2@cornell.edu  TEST_FSGNJD(20, fsgnjn.d, 1, 0, 0)
3212771Sqtt2@cornell.edu  TEST_FSGNJD(21, fsgnjn.d, 0, 0, 1)
3312771Sqtt2@cornell.edu  TEST_FSGNJD(22, fsgnjn.d, 1, 1, 0)
3412771Sqtt2@cornell.edu  TEST_FSGNJD(23, fsgnjn.d, 0, 1, 1)
3512771Sqtt2@cornell.edu
3612771Sqtt2@cornell.edu  TEST_FSGNJD(30, fsgnjx.d, 0, 0, 0)
3712771Sqtt2@cornell.edu  TEST_FSGNJD(31, fsgnjx.d, 1, 0, 1)
3812771Sqtt2@cornell.edu  TEST_FSGNJD(32, fsgnjx.d, 1, 1, 0)
3912771Sqtt2@cornell.edu  TEST_FSGNJD(33, fsgnjx.d, 0, 1, 1)
4012771Sqtt2@cornell.edu
4112771Sqtt2@cornell.edu// Test fsgnj.s in conjunction with double-precision moves
4212771Sqtt2@cornell.edu#define TEST_FSGNJS(n, rd, rs1, rs2) \
4312771Sqtt2@cornell.edu  TEST_CASE(n, a0, (rd) | (-((rd) >> 31) << 32), \
4412771Sqtt2@cornell.edu    li a1, rs1; \
4512771Sqtt2@cornell.edu    li a2, rs2; \
4612771Sqtt2@cornell.edu    fmv.d.x f1, a1; \
4712771Sqtt2@cornell.edu    fmv.d.x f2, a2; \
4812771Sqtt2@cornell.edu    fsgnj.s f0, f1, f2; \
4912771Sqtt2@cornell.edu    fmv.x.s a0, f0); \
5012771Sqtt2@cornell.edu  TEST_CASE(1##n, a0, (rd) | 0xffffffff00000000, \
5112771Sqtt2@cornell.edu    li a1, rs1; \
5212771Sqtt2@cornell.edu    li a2, rs2; \
5312771Sqtt2@cornell.edu    fmv.d.x f1, a1; \
5412771Sqtt2@cornell.edu    fmv.d.x f2, a2; \
5512771Sqtt2@cornell.edu    fsgnj.s f0, f1, f2; \
5612771Sqtt2@cornell.edu    fmv.x.d a0, f0)
5712771Sqtt2@cornell.edu
5812771Sqtt2@cornell.edu  TEST_FSGNJS(40, 0x7fc00000, 0x7ffffffe12345678, 0)
5912771Sqtt2@cornell.edu  TEST_FSGNJS(41, 0x7fc00000, 0xfffffffe12345678, 0)
6012771Sqtt2@cornell.edu  TEST_FSGNJS(42, 0x7fc00000, 0x7fffffff12345678, 0)
6112771Sqtt2@cornell.edu  TEST_FSGNJS(43, 0x12345678, 0xffffffff12345678, 0)
6212771Sqtt2@cornell.edu
6312771Sqtt2@cornell.edu  TEST_FSGNJS(50, 0x7fc00000, 0x7ffffffe12345678, 0x80000000)
6412771Sqtt2@cornell.edu  TEST_FSGNJS(51, 0x7fc00000, 0xfffffffe12345678, 0x80000000)
6512771Sqtt2@cornell.edu  TEST_FSGNJS(52, 0x7fc00000, 0x7fffffff12345678, 0x80000000)
6612771Sqtt2@cornell.edu  TEST_FSGNJS(53, 0x12345678, 0xffffffff12345678, 0x80000000)
6712771Sqtt2@cornell.edu
6812771Sqtt2@cornell.edu  TEST_FSGNJS(60, 0xffc00000, 0x7ffffffe12345678, 0xffffffff80000000)
6912771Sqtt2@cornell.edu  TEST_FSGNJS(61, 0xffc00000, 0xfffffffe12345678, 0xffffffff80000000)
7012771Sqtt2@cornell.edu  TEST_FSGNJS(62, 0x92345678, 0xffffffff12345678, 0xffffffff80000000)
7112771Sqtt2@cornell.edu  TEST_FSGNJS(63, 0x12345678, 0xffffffff12345678, 0x7fffffff80000000)
7212771Sqtt2@cornell.edu
7312771Sqtt2@cornell.edu// Test fsgnj.d in conjunction with single-precision moves
7412771Sqtt2@cornell.edu#define TEST_FSGNJD_SP(n, isnan, rd, rs1, rs2) \
7512771Sqtt2@cornell.edu  TEST_CASE(n, a0, ((rd) & 0xffffffff) | (-(((rd) >> 31) & 1) << 32), \
7612771Sqtt2@cornell.edu    li a1, rs1; \
7712771Sqtt2@cornell.edu    li a2, rs2; \
7812771Sqtt2@cornell.edu    fmv.d.x f1, a1; \
7912771Sqtt2@cornell.edu    fmv.d.x f2, a2; \
8012771Sqtt2@cornell.edu    fsgnj.d f0, f1, f2; \
8112771Sqtt2@cornell.edu    feq.s a0, f0, f0; \
8212771Sqtt2@cornell.edu    addi a0, a0, -!(isnan); \
8312771Sqtt2@cornell.edu    bnez a0, 1f; \
8412771Sqtt2@cornell.edu    fmv.x.s a0, f0; \
8512771Sqtt2@cornell.edu    1:); \
8612771Sqtt2@cornell.edu  TEST_CASE(1##n, a0, rd, \
8712771Sqtt2@cornell.edu    li a1, rs1; \
8812771Sqtt2@cornell.edu    li a2, rs2; \
8912771Sqtt2@cornell.edu    fmv.d.x f1, a1; \
9012771Sqtt2@cornell.edu    fmv.d.x f2, a2; \
9112771Sqtt2@cornell.edu    fsgnj.d f0, f1, f2; \
9212771Sqtt2@cornell.edu    fmv.x.d a0, f0; \
9312771Sqtt2@cornell.edu    1:)
9412771Sqtt2@cornell.edu
9512771Sqtt2@cornell.edu  TEST_FSGNJD_SP(70, 0, 0xffffffff11111111, 0xffffffff11111111, 0xffffffff11111111)
9612771Sqtt2@cornell.edu  TEST_FSGNJD_SP(71, 1, 0x7fffffff11111111, 0xffffffff11111111, 0x7fffffff11111111)
9712771Sqtt2@cornell.edu  TEST_FSGNJD_SP(72, 0, 0xffffffff11111111, 0xffffffff11111111, 0xffffffff91111111)
9812771Sqtt2@cornell.edu  TEST_FSGNJD_SP(73, 0, 0xffffffff11111111, 0xffffffff11111111, 0x8000000000000000)
9912771Sqtt2@cornell.edu  TEST_FSGNJD_SP(74, 0, 0xffffffff11111111, 0x7fffffff11111111, 0xffffffff11111111)
10012771Sqtt2@cornell.edu  TEST_FSGNJD_SP(75, 1, 0x7fffffff11111111, 0x7fffffff11111111, 0x7fffffff11111111)
10112771Sqtt2@cornell.edu  TEST_FSGNJD_SP(76, 0, 0xffffffff11111111, 0x7fffffff11111111, 0xffffffff91111111)
10212771Sqtt2@cornell.edu  TEST_FSGNJD_SP(77, 0, 0xffffffff11111111, 0x7fffffff11111111, 0x8000000000000000)
10312771Sqtt2@cornell.edu
10412771Sqtt2@cornell.edu  TEST_PASSFAIL
10512771Sqtt2@cornell.edu
10612771Sqtt2@cornell.eduRVTEST_CODE_END
10712771Sqtt2@cornell.edu
10812771Sqtt2@cornell.edu  .data
10912771Sqtt2@cornell.eduRVTEST_DATA_BEGIN
11012771Sqtt2@cornell.edu
11112771Sqtt2@cornell.edu  TEST_DATA
11212771Sqtt2@cornell.edu
11312771Sqtt2@cornell.eduRVTEST_DATA_END
114