Co-Auther: Daniel Henrique Barboza <[email protected]>
Signed-off-by: Mingliang Liu <[email protected]>
---
 tests/tcg/riscv64/Makefile.softmmu-target |   8 +
 tests/tcg/riscv64/test-zvabd.S            | 659 ++++++++++++++++++++++
 2 files changed, 667 insertions(+)
 create mode 100644 tests/tcg/riscv64/test-zvabd.S

diff --git a/tests/tcg/riscv64/Makefile.softmmu-target 
b/tests/tcg/riscv64/Makefile.softmmu-target
index 6a219c306c..787fdaab40 100644
--- a/tests/tcg/riscv64/Makefile.softmmu-target
+++ b/tests/tcg/riscv64/Makefile.softmmu-target
@@ -71,5 +71,13 @@ EXTRA_RUNS += run-test-misa-w
 run-test-misa-w: test-misa-w
        $(call run-test, $<, $(QEMU) -cpu 
rv64$(comma)x-misa-w=true$(comma)c=true$(comma)v=true $(QEMU_OPTS)$<)
 
+EXTRA_RUNS += run-test-zvabd
+ZVABD_CPU = rv64$(comma)v=true$(comma)vlen=256$(comma)x-zvabd=true
+CLEANFILES += test-zvabd
+test-zvabd: test-zvabd.o $(LINK_SCRIPT)
+       $(LD) $(LDFLAGS) $< -o $@
+run-test-zvabd: test-zvabd
+       $(call run-test, $<, $(QEMU) -cpu $(ZVABD_CPU) $(QEMU_OPTS)$<)
+
 # We don't currently support the multiarch system tests
 undefine MULTIARCH_TESTS
diff --git a/tests/tcg/riscv64/test-zvabd.S b/tests/tcg/riscv64/test-zvabd.S
new file mode 100644
index 0000000000..01db2fd7dc
--- /dev/null
+++ b/tests/tcg/riscv64/test-zvabd.S
@@ -0,0 +1,659 @@
+/*
+ * Test the Zvabd vector absolute-difference instructions and the vabs.v
+ * pseudoinstruction.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+       .option arch, +v
+       .option norvc
+
+       .text
+
+       .global _start
+_start:
+       /* Enable the vector unit (mstatus.VS = Initial). */
+       li      t0, 1 << 9
+       csrs    mstatus, t0
+
+       /* Route synchronous traps to trap_handler (mtvec direct mode). */
+       la      t0, trap_handler
+       csrw    mtvec, t0
+
+       /* Run each test function. */
+       call    test_vabs_v
+       bnez    a0, _exit
+       call    test_vabs_v_mask
+       bnez    a0, _exit
+
+       call    test_vabd_vv
+       bnez    a0, _exit
+       call    test_vabd_vv_mask
+       bnez    a0, _exit
+
+       call    test_vabd_vx
+       bnez    a0, _exit
+       call    test_vabd_vx_mask
+       bnez    a0, _exit
+
+       call    test_vabdu_vv
+       bnez    a0, _exit
+       call    test_vabdu_vv_mask
+       bnez    a0, _exit
+
+       call    test_vabdu_vx
+       bnez    a0, _exit
+       call    test_vabdu_vx_mask
+       bnez    a0, _exit
+
+       call    test_vwabda_vv
+       bnez    a0, _exit
+       call    test_vwabda_vv_mask
+       bnez    a0, _exit
+
+       call    test_vwabda_vx
+       bnez    a0, _exit
+       call    test_vwabda_vx_mask
+       bnez    a0, _exit
+
+       call    test_vwabdau_vv
+       bnez    a0, _exit
+       call    test_vwabdau_vv_mask
+       bnez    a0, _exit
+
+       call    test_vwabdau_vx
+       bnez    a0, _exit
+       call    test_vwabdau_vx_mask
+       bnez    a0, _exit
+
+       j       _exit
+
+test_vabs_v:
+       vsetivli zero, 2, e8, m1, ta, ma
+
+       /* Load .arr_neg array in v1 */
+       la     t0,.arr_neg
+       vle8.v v1,0(t0)
+
+       /* vabs.v v2, v1 (vabd.vx v2, v1, x0) raw opcode */
+       .word   0x56106157
+
+       /* Load .arr_pos in v3 */
+       la      t1,.arr_pos
+       vle8.v  v3,0(t1)
+
+       /* Compare v2 and v3 into v0 */
+       vmsne.vv  v0,v2,v3
+       vcpop.m a0,v0
+       snez    a0,a0
+
+       ret
+
+test_vabs_v_mask:
+       vsetivli zero, 2, e8, m1, ta, mu
+
+       /* Load .arr_neg array in v1 */
+       la      t0, .arr_neg
+       vle8.v  v1, 0(t0)
+
+       /* Zero v2 using .arr_zero */
+       la     t0,.arr_zero
+       vle8.v v2,0(t0)
+
+       /* Load .v0_mask array in v0 */
+       la     t1,.v0_mask
+       vle8.v v0,0(t1)
+
+       /* vabs.v v2, v1, v0.t raw opcode */
+       .word   0x54106157
+
+       /* Load .arr_masked in v3 */
+       la      t0,.arr_masked
+       vle8.v  v3,0(t0)
+
+       /* Compare v2 and v3 into v0 */
+       vmsne.vv  v0,v2,v3
+       vcpop.m a0,v0
+       snez    a0,a0
+
+       ret
+
+test_vabd_vv:
+       /*
+        * Test signed vector-vector absolute difference:
+        * abs({-5, -7} - {5, 7}) = {10, 14}.
+        */
+       vsetivli zero, 2, e8, m1, ta, mu
+
+       /* Load the two signed source vectors into v1 and v3. */
+       la      t0, .arr_neg
+       vle8.v  v1, 0(t0)
+       la      t0, .arr_pos
+       vle8.v  v3, 0(t0)
+
+       /* Execute vabd.vv v2, v1, v3. */
+       .word   0x5611a157
+
+       /* Load the expected result into v3. */
+       la      t0, .expect_vabd_vv
+       vle8.v  v3, 0(t0)
+
+       /* Compare v2 and v3 into v0 */
+       vmsne.vv  v0, v2, v3
+       vcpop.m a0, v0
+       snez    a0, a0
+
+       ret
+
+test_vabd_vv_mask:
+       /*
+        * Test masked vabd.vv.  Element 0 remains 9 and element 1 becomes
+        * abs(-7 - 7) = 14.
+        */
+       vsetivli zero, 2, e8, m1, ta, mu
+
+       /* Load the two signed source vectors into v1 and v3. */
+       la      t0, .arr_neg
+       vle8.v  v1, 0(t0)
+       la      t0, .arr_pos
+       vle8.v  v3, 0(t0)
+
+       /* Load original value into v2 */
+       la      t0, .arr_init
+       vle8.v  v2, 0(t0)
+
+       /* Load mask value into v0 */
+       la      t0, .v0_mask
+       vle8.v  v0, 0(t0)
+
+       .word   0x5411a157
+
+       /* Load the expected result into v3. */
+       la      t0, .expect_vabd_vv_masked
+       vle8.v  v3, 0(t0)
+
+       vmsne.vv  v0, v2, v3
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vabd_vx:
+       /*
+        * Test signed vector-scalar absolute difference:
+        * abs({-5, -7} - 3) = {8, 10}.
+        */
+       vsetivli zero, 2, e8, m1, ta, mu
+       la      t0, .arr_neg
+       vle8.v  v1, 0(t0)
+       li      a2, 3
+
+       /* Execute vabd.vx v2, v1, a2. */
+       .word   0x56166157
+
+       /* Load the expected result into v3. */
+       la      t0, .expect_vabd_vx
+       vle8.v  v3, 0(t0)
+
+       vmsne.vv  v0, v2, v3
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vabd_vx_mask:
+       /*
+        * Test masked vabd.vx.  Element 0 remains 9 and element 1 becomes
+        * abs(-7 - 3) = 10.
+        */
+       vsetivli zero, 2, e8, m1, ta, mu
+
+       la      t0, .arr_neg
+       vle8.v  v1, 0(t0)
+       li      a2, 3
+
+       la      t0, .arr_init
+       vle8.v  v2, 0(t0)
+
+       la      t0, .v0_mask
+       vle8.v  v0, 0(t0)
+
+       .word   0x54166157
+
+       la      t0, .expect_vabd_vx_masked
+       vle8.v  v3, 0(t0)
+
+       vmsne.vv  v0, v2, v3
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vabdu_vv:
+       /*
+        * Test unsigned vector-vector absolute difference:
+        * abs({0, 255} - {255, 0}) = {255, 255}.
+        */
+       vsetivli zero, 2, e8, m1, ta, mu
+
+       /* Load the two unsigned source vectors into v1 and v3. */
+       la      t0, .arr_unsigned_lhs
+       vle8.v  v1, 0(t0)
+       la      t0, .arr_unsigned_rhs
+       vle8.v  v3, 0(t0)
+
+       /* Execute vabdu.vv v2, v1, v3. */
+       .word   0x5a11a157
+
+       /* Load the expected result into v3. */
+       la      t0, .expect_vabdu_vv
+       vle8.v  v3, 0(t0)
+
+       vmsne.vv  v0, v2, v3
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vabdu_vv_mask:
+       /*
+        * Test masked vabdu.vv.  Element 0 remains 9 and element 1 becomes
+        * abs(255 - 0) = 255.
+        */
+       vsetivli zero, 2, e8, m1, ta, mu
+
+       la      t0, .arr_unsigned_lhs
+       vle8.v  v1, 0(t0)
+       la      t0, .arr_unsigned_rhs
+       vle8.v  v3, 0(t0)
+
+       la      t0, .arr_init
+       vle8.v  v2, 0(t0)
+
+       la      t0, .v0_mask
+       vle8.v  v0, 0(t0)
+
+       .word   0x5811a157
+
+       la      t0, .expect_vabdu_vv_masked
+       vle8.v  v3, 0(t0)
+
+       vmsne.vv  v0, v2, v3
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vabdu_vx:
+       /*
+        * Test unsigned vector-scalar absolute difference:
+        * abs({0, 255} - 128) = {128, 127}.
+        */
+       vsetivli zero, 2, e8, m1, ta, mu
+
+       la      t0, .arr_unsigned_lhs
+       vle8.v  v1, 0(t0)
+       li      a2, 128
+
+       /* Execute vabdu.vx v2, v1, a2. */
+       .word   0x5a166157
+
+       la      t0, .expect_vabdu_vx
+       vle8.v  v3, 0(t0)
+
+       vmsne.vv  v0, v2, v3
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vabdu_vx_mask:
+       /*
+        * Test masked vabdu.vx.  Element 0 remains 9 and element 1 becomes
+        * abs(255 - 128) = 127.
+        */
+       vsetivli zero, 2, e8, m1, ta, mu
+
+       la      t0, .arr_unsigned_lhs
+       vle8.v  v1, 0(t0)
+       li      a2, 128
+
+       la      t0, .arr_init
+       vle8.v  v2, 0(t0)
+
+       la      t0, .v0_mask
+       vle8.v  v0, 0(t0)
+
+       .word   0x58166157
+
+       la      t0, .expect_vabdu_vx_masked
+       vle8.v  v3, 0(t0)
+
+       vmsne.vv  v0, v2, v3
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vwabda_vv:
+       /*
+        * Test signed widening vector-vector absolute difference and
+        * accumulation. Start with v4 = {1000, -1000}, and the expected
+        * widened result is {1000, -1000} + abs({-5, -7} - {5, 7}) =
+        * {1010, -986}.
+        */
+       /* Load the 16-bit accumulator before selecting 8-bit operands. */
+       vsetivli zero, 2, e16, m2, ta, mu
+       la      t0, .arr_signed_acc
+       vle16.v v4, 0(t0)
+
+       vsetivli zero, 2, e8, m1, ta, mu
+       la      t0, .arr_neg
+       vle8.v  v1, 0(t0)
+       la      t0, .arr_pos
+       vle8.v  v2, 0(t0)
+
+       /* Execute vwabda.vv v4, v1, v2. */
+       .word   0xf6110257
+
+       /* Select the widened EEW and compare v4 with the expected result. */
+       vsetivli zero, 2, e16, m2, ta, mu
+       la      t0, .expect_vwabda_vv
+       vle16.v v6, 0(t0)
+
+       vmsne.vv  v0, v4, v6
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vwabda_vv_mask:
+       /*
+        * Test masked vwabda.vv.
+        * Start with v4 = {1000, -1000}, v0 = {0, 1}, and the expected widened
+        * result is {1000, -1000} + abs({-5, -7} - {5, 7}) = {1000, -986}.
+        */
+       vsetivli zero, 2, e16, m2, ta, mu
+       la      t0, .arr_signed_acc
+       vle16.v v4, 0(t0)
+
+       vsetivli zero, 2, e8, m1, ta, mu
+       la      t0, .arr_neg
+       vle8.v  v1, 0(t0)
+       la      t0, .arr_pos
+       vle8.v  v2, 0(t0)
+
+       la      t0, .v0_mask
+       vle8.v  v0, 0(t0)
+
+       .word   0xf4110257
+
+       vsetivli zero, 2, e16, m2, ta, mu
+       la      t0, .expect_vwabda_vv_masked
+
+       vle16.v v6, 0(t0)
+       vmsne.vv  v0, v4, v6
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vwabda_vx:
+       /*
+        * Test signed widening vector-scalar absolute difference and
+        * accumulation. With scalar 3, v4 becomes {1000 + 8, -1000 + 10}.
+        */
+       /* Load the 16-bit accumulator before selecting 8-bit operands. */
+       vsetivli zero, 2, e16, m2, ta, mu
+       la      t0, .arr_signed_acc
+       vle16.v v4, 0(t0)
+
+       vsetivli zero, 2, e8, m1, ta, mu
+       la      t0, .arr_neg
+       vle8.v  v1, 0(t0)
+       li      a2, 3
+
+       /* Execute vwabda.vx v4, v1, a2. */
+       .word   0xf6164257
+
+       /* Select the widened EEW and compare v4 with the expected result. */
+       vsetivli zero, 2, e16, m2, ta, mu
+       la      t0, .expect_vwabda_vx
+       vle16.v v6, 0(t0)
+
+       vmsne.vv  v0, v4, v6
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vwabda_vx_mask:
+       /*
+        * Test masked vwabda.vx.  Element 0 remains 1000 while element 1
+        * accumulates 10 and becomes -990.
+        */
+       vsetivli zero, 2, e16, m2, ta, mu
+
+       la      t0, .arr_signed_acc
+       vle16.v v4, 0(t0)
+
+       vsetivli zero, 2, e8, m1, ta, mu
+       la      t0, .arr_neg
+       vle8.v  v1, 0(t0)
+       li      a2, 3
+
+       la      t0, .v0_mask
+       vle8.v  v0, 0(t0)
+
+       .word   0xf4164257
+
+       vsetivli zero, 2, e16, m2, ta, mu
+       la      t0, .expect_vwabda_vx_masked
+       vle16.v v6, 0(t0)
+
+       vmsne.vv  v0, v4, v6
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vwabdau_vv:
+       /*
+        * Test unsigned widening vector-vector absolute difference and
+        * accumulation. Start with v4 = {1000, 2000}, adding {255, 255}
+        * produces {1255, 2255}.
+        */
+       /* Load the unsigned 16-bit accumulator and 8-bit source vectors. */
+       vsetivli zero, 2, e16, m2, ta, mu
+
+       la      t0, .arr_unsigned_acc
+       vle16.v v4, 0(t0)
+       vsetivli zero, 2, e8, m1, ta, mu
+
+       la      t0, .arr_unsigned_lhs
+       vle8.v  v1, 0(t0)
+       la      t0, .arr_unsigned_rhs
+       vle8.v  v2, 0(t0)
+
+       /* Execute vwabdau.vv v4, v1, v2. */
+       .word   0xfa110257
+
+       /* Select the widened EEW and compare v4 with the expected result. */
+       vsetivli zero, 2, e16, m2, ta, mu
+       la      t0, .expect_vwabdau_vv
+       vle16.v v6, 0(t0)
+
+       vmsne.vv  v0, v4, v6
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vwabdau_vv_mask:
+       /*
+        * Test masked vwabdau.vv.  Element 0 remains 1000 while element 1
+        * accumulates 255 and becomes 2255.
+        */
+       vsetivli zero, 2, e16, m2, ta, mu
+
+       la      t0, .arr_unsigned_acc
+       vle16.v v4, 0(t0)
+
+       vsetivli zero, 2, e8, m1, ta, mu
+       la      t0, .arr_unsigned_lhs
+       vle8.v  v1, 0(t0)
+       la      t0, .arr_unsigned_rhs
+       vle8.v  v2, 0(t0)
+
+       la      t0, .v0_mask
+       vle8.v  v0, 0(t0)
+
+       .word   0xf8110257
+
+       vsetivli zero, 2, e16, m2, ta, mu
+       la      t0, .expect_vwabdau_vv_masked
+       vle16.v v6, 0(t0)
+
+       vmsne.vv  v0, v4, v6
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vwabdau_vx:
+       /*
+        * Test unsigned widening vector-scalar absolute difference and
+        * accumulation. With scalar 128, v4 becomes {1000 + 128, 2000 + 127}.
+        */
+       /* Load the unsigned 16-bit accumulator and 8-bit source vector. */
+       vsetivli zero, 2, e16, m2, ta, mu
+
+       la      t0, .arr_unsigned_acc
+       vle16.v v4, 0(t0)
+
+       vsetivli zero, 2, e8, m1, ta, mu
+       la      t0, .arr_unsigned_lhs
+       vle8.v  v1, 0(t0)
+       li      a2, 128
+
+       /* Execute vwabdau.vx v4, v1, a2. */
+       .word   0xfa164257
+
+       /* Select the widened EEW and compare v4 with the expected result. */
+       vsetivli zero, 2, e16, m2, ta, mu
+       la      t0, .expect_vwabdau_vx
+       vle16.v v6, 0(t0)
+
+       vmsne.vv  v0, v4, v6
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+test_vwabdau_vx_mask:
+       /*
+        * Test masked vwabdau.vx.  Element 0 remains 1000 while element 1
+        * accumulates 127 and becomes 2127.
+        */
+       vsetivli zero, 2, e16, m2, ta, mu
+
+       la      t0, .arr_unsigned_acc
+       vle16.v v4, 0(t0)
+
+       vsetivli zero, 2, e8, m1, ta, mu
+       la      t0, .arr_unsigned_lhs
+       vle8.v  v1, 0(t0)
+       li      a2, 128
+
+       la      t0, .v0_mask
+       vle8.v  v0, 0(t0)
+
+       .word   0xf8164257
+
+       vsetivli zero, 2, e16, m2, ta, mu
+       la      t0, .expect_vwabdau_vx_masked
+       vle16.v v6, 0(t0)
+
+       vmsne.vv  v0, v4, v6
+       vcpop.m a0, v0
+       snez    a0, a0
+       ret
+
+
+/* Exit through the semihosting SYS_EXIT_EXTENDED call with a0 as the code. */
+_exit:
+       la      a1, semiargs
+       li      t0, 0x20026     /* ADP_Stopped_ApplicationExit */
+       sd      t0, 0(a1)
+       sd      a0, 8(a1)
+       li      a0, 0x20        /* TARGET_SYS_EXIT_EXTENDED */
+       .balign 16
+       slli    zero, zero, 0x1f
+       ebreak
+       srai    zero, zero, 0x7
+       j       .
+
+       .balign 4
+trap_handler:
+       csrr    t4, mcause
+       la      t5, trap_mcause
+       sd      t4, 0(t5)
+       csrr    t4, mtval
+       la      t5, trap_mtval
+       sd      t4, 0(t5)
+       li      a0, 1
+       j       _exit
+
+       .data
+       .balign 8
+semiargs:
+       .space  16
+trap_mcause:
+       .space  8
+trap_mtval:
+       .space  8
+.arr_neg:
+       .byte -5, -7
+.arr_pos:
+       .byte 5, 7
+.arr_zero:
+       .byte 0, 0
+.arr_init:
+       .byte 9, 9
+.v0_mask:
+       .byte 0b10
+.arr_masked:
+       .byte 0, 7
+
+/* Unsigned input vectors used by vabdu and vwabdau. */
+.arr_unsigned_lhs:
+       .byte 0, 255
+.arr_unsigned_rhs:
+       .byte 255, 0
+       .balign 2
+
+/* Nonzero accumulators verify the add part of widening operations. */
+.arr_signed_acc:
+       .half 1000, -1000
+.arr_unsigned_acc:
+       .half 1000, 2000
+
+/* Expected results for the unmasked and masked forms. */
+.expect_vabd_vv:
+       .byte 10, 14
+.expect_vabd_vv_masked:
+       .byte 9, 14
+.expect_vabd_vx:
+       .byte 8, 10
+.expect_vabd_vx_masked:
+       .byte 9, 10
+.expect_vabdu_vv:
+       .byte 255, 255
+.expect_vabdu_vv_masked:
+       .byte 9, 255
+.expect_vabdu_vx:
+       .byte 128, 127
+.expect_vabdu_vx_masked:
+       .byte 9, 127
+.expect_vwabda_vv:
+       .half 1010, -986
+.expect_vwabda_vv_masked:
+       .half 1000, -986
+.expect_vwabda_vx:
+       .half 1008, -990
+.expect_vwabda_vx_masked:
+       .half 1000, -990
+.expect_vwabdau_vv:
+       .half 1255, 2255
+.expect_vwabdau_vv_masked:
+       .half 1000, 2255
+.expect_vwabdau_vx:
+       .half 1128, 2127
+.expect_vwabdau_vx_masked:
+       .half 1000, 2127
-- 
2.39.5

Reply via email to