Files
gasm-sdk/asm/riscv_vecarith_test.go
T
2026-10-07 00:47:27 +02:00

846 lines
29 KiB
Go

// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
// SPDX-License-Identifier: BSD-3-Clause
package asm
import (
"os"
"path/filepath"
"testing"
)
// TestRISCVVecArith_Differential proves the vector arithmetic families
// against the toolchain: sections 31.11 through 31.16 of the "V"
// specification's arithmetic, reductions, mask, slide, gather, compress and
// whole-register-move material plus the Zvbb bit-manipulation and Zvbc
// carryless-multiplication extensions, in the toolchain's own testdata
// wording with every masked and unmasked form, assembled by gasm and by
// go tool asm must agree word for word.
func TestRISCVVecArith_Differential(t *testing.T) {
src := `#include "textflag.h"
TEXT ·vecarith(SB), NOSPLIT, $0
// 31.11.1: Vector Single-Width Integer Add and Subtract
VADDVV V1, V2, V3 // d7812002
VADDVV V1, V2, V0, V3 // d7812000
VADDVX X10, V2, V3 // d7412502
VADDVX X10, V2, V0, V3 // d7412500
VADDVI $15, V2, V3 // d7b12702
VADDVI $15, V2, V0, V3 // d7b12700
VADDVI $-16, V2, V3 // d7312802
VADDVI $-16, V2, V0, V3 // d7312800
VSUBVV V1, V2, V3 // d781200a
VSUBVV V1, V2, V0, V3 // d7812008
VSUBVX X10, V2, V3 // d741250a
VSUBVX X10, V2, V0, V3 // d7412508
VRSUBVX X10, V2, V3 // d741250e
VRSUBVX X10, V2, V0, V3 // d741250c
VRSUBVI $15, V2, V0, V3 // d7b1270c
VRSUBVI $-16, V2, V0, V3 // d731280c
VNEGV V2, V3 // d741200e
VNEGV V2, V0, V3 // d741200c
// 31.11.2: Vector Widening Integer Add/Subtract
VWADDUVV V1, V2, V3 // d7a120c2
VWADDUVV V1, V2, V0, V3 // d7a120c0
VWADDUVX X10, V2, V3 // d76125c2
VWADDUVX X10, V2, V0, V3 // d76125c0
VWSUBUVV V1, V2, V3 // d7a120ca
VWSUBUVV V1, V2, V0, V3 // d7a120c8
VWSUBUVX X10, V2, V3 // d76125ca
VWSUBUVX X10, V2, V0, V3 // d76125c8
VWADDVV V1, V2, V3 // d7a120c6
VWADDVV V1, V2, V0, V3 // d7a120c4
VWADDVX X10, V2, V3 // d76125c6
VWADDVX X10, V2, V0, V3 // d76125c4
VWSUBVV V1, V2, V3 // d7a120ce
VWSUBVV V1, V2, V0, V3 // d7a120cc
VWSUBVX X10, V2, V3 // d76125ce
VWSUBVX X10, V2, V0, V3 // d76125cc
VWADDUWV V1, V2, V3 // d7a120d2
VWADDUWV V1, V2, V0, V3 // d7a120d0
VWADDUWX X10, V2, V3 // d76125d2
VWADDUWX X10, V2, V0, V3 // d76125d0
VWSUBUWV V1, V2, V3 // d7a120da
VWSUBUWV V1, V2, V0, V3 // d7a120d8
VWSUBUWX X10, V2, V3 // d76125da
VWSUBUWX X10, V2, V0, V3 // d76125d8
VWADDWV V1, V2, V3 // d7a120d6
VWADDWV V1, V2, V0, V3 // d7a120d4
VWADDWX X10, V2, V3 // d76125d6
VWADDWX X10, V2, V0, V3 // d76125d4
VWSUBWV V1, V2, V3 // d7a120de
VWSUBWV V1, V2, V0, V3 // d7a120dc
VWSUBWX X10, V2, V3 // d76125de
VWSUBWX X10, V2, V0, V3 // d76125dc
VWCVTXXV V2, V3 // d76120c6
VWCVTXXV V2, V0, V3 // d76120c4
VWCVTUXXV V2, V3 // d76120c2
VWCVTUXXV V2, V0, V3 // d76120c0
// 31.11.3: Vector Integer Extension
VZEXTVF2 V2, V3 // d721234a
VZEXTVF2 V2, V0, V3 // d7212348
VSEXTVF2 V2, V3 // d7a1234a
VSEXTVF2 V2, V0, V3 // d7a12348
VZEXTVF4 V2, V3 // d721224a
VZEXTVF4 V2, V0, V3 // d7212248
VSEXTVF4 V2, V3 // d7a1224a
VSEXTVF4 V2, V0, V3 // d7a12248
VZEXTVF8 V2, V3 // d721214a
VZEXTVF8 V2, V0, V3 // d7212148
VSEXTVF8 V2, V3 // d7a1214a
VSEXTVF8 V2, V0, V3 // d7a12148
// 31.11.4: Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions
VADCVVM V1, V2, V0, V3 // d7812040
VADCVXM X11, V2, V0, V3 // d7c12540
VADCVIM $15, V2, V0, V3 // d7b12740
VMADCVVM V1, V2, V0, V3 // d7812044
VMADCVVM V1, V2, V0, V0 // 57802044
VMADCVXM X11, V2, V0, V3 // d7c12544
VMADCVXM X11, V2, V0, V0 // 57c02544
VMADCVIM $15, V2, V0, V3 // d7b12744
VMADCVIM $15, V2, V0, V0 // 57b02744
VMADCVV V1, V2, V3 // d7812046
VMADCVV V1, V2, V0 // 57802046
VMADCVX X11, V2, V3 // d7c12546
VMADCVX X11, V2, V0 // 57c02546
VMADCVI $15, V2, V3 // d7b12746
VMADCVI $15, V2, V0 // 57b02746
VSBCVVM V1, V2, V0, V3 // d7812048
VSBCVXM X11, V2, V0, V3 // d7c12548
VMSBCVVM V1, V2, V0, V3 // d781204c
VMSBCVVM V1, V2, V0, V0 // 5780204c
VMSBCVXM X11, V2, V0, V3 // d7c1254c
VMSBCVXM X11, V2, V0, V0 // 57c0254c
VMSBCVV V1, V2, V3 // d781204e
VMSBCVV V1, V2, V0 // 5780204e
VMSBCVX X11, V2, V3 // d7c1254e
VMSBCVX X11, V2, V0 // 57c0254e
// 31.11.5: Vector Bitwise Logical Instructions
VANDVV V1, V2, V3 // d7812026
VANDVV V1, V2, V0, V3 // d7812024
VANDVX X11, V2, V3 // d7c12526
VANDVX X11, V2, V0, V3 // d7c12524
VANDVI $15, V2, V3 // d7b12726
VANDVI $15, V2, V0, V3 // d7b12724
VORVV V1, V2, V3 // d781202a
VORVV V1, V2, V0, V3 // d7812028
VORVX X11, V2, V3 // d7c1252a
VORVX X11, V2, V0, V3 // d7c12528
VORVI $15, V2, V3 // d7b1272a
VORVI $15, V2, V0, V3 // d7b12728
VXORVV V1, V2, V3 // d781202e
VXORVV V1, V2, V0, V3 // d781202c
VXORVX X11, V2, V3 // d7c1252e
VXORVX X11, V2, V0, V3 // d7c1252c
VXORVI $15, V2, V3 // d7b1272e
VXORVI $15, V2, V0, V3 // d7b1272c
VNOTV V2, V3 // d7b12f2e
VNOTV V2, V0, V3 // d7b12f2c
// 31.11.6: Vector Single-Width Shift Instructions
VSLLVV V1, V2, V3 // d7812096
VSLLVV V1, V2, V0, V3 // d7812094
VSLLVX X11, V2, V3 // d7c12596
VSLLVX X11, V2, V0, V3 // d7c12594
VSLLVI $15, V2, V3 // d7b12796
VSLLVI $15, V2, V0, V3 // d7b12794
VSRLVV V1, V2, V3 // d78120a2
VSRLVV V1, V2, V0, V3 // d78120a0
VSRLVX X11, V2, V3 // d7c125a2
VSRLVX X11, V2, V0, V3 // d7c125a0
VSRLVI $15, V2, V3 // d7b127a2
VSRLVI $15, V2, V0, V3 // d7b127a0
VSRAVV V1, V2, V3 // d78120a6
VSRAVV V1, V2, V0, V3 // d78120a4
VSRAVX X11, V2, V3 // d7c125a6
VSRAVX X11, V2, V0, V3 // d7c125a4
VSRAVI $15, V2, V3 // d7b127a6
VSRAVI $15, V2, V0, V3 // d7b127a4
// 31.11.7: Vector Narrowing Integer Right Shift Instructions
VNSRLWV V1, V2, V3 // d78120b2
VNSRLWV V1, V2, V0, V3 // d78120b0
VNSRLWX X10, V2, V3 // d74125b2
VNSRLWX X10, V2, V0, V3 // d74125b0
VNSRLWI $31, V2, V3 // d7b12fb2
VNSRLWI $31, V2, V0, V3 // d7b12fb0
VNSRAWV V1, V2, V3 // d78120b6
VNSRAWV V1, V2, V0, V3 // d78120b4
VNSRAWX X10, V2, V3 // d74125b6
VNSRAWX X10, V2, V0, V3 // d74125b4
VNSRAWI $31, V2, V3 // d7b12fb6
VNSRAWI $31, V2, V0, V3 // d7b12fb4
VNCVTXXW V2, V3 // d74120b2
VNCVTXXW V2, V0, V3 // d74120b0
// 31.11.8: Vector Integer Compare Instructions
VMSEQVV V1, V2, V3 // d7812062
VMSEQVV V1, V2, V0, V3 // d7812060
VMSEQVX X10, V2, V3 // d7412562
VMSEQVX X10, V2, V0, V3 // d7412560
VMSEQVI $15, V2, V3 // d7b12762
VMSEQVI $15, V2, V0, V3 // d7b12760
VMSNEVV V1, V2, V3 // d7812066
VMSNEVV V1, V2, V0, V3 // d7812064
VMSNEVX X10, V2, V3 // d7412566
VMSNEVX X10, V2, V0, V3 // d7412564
VMSNEVI $15, V2, V3 // d7b12766
VMSNEVI $15, V2, V0, V3 // d7b12764
VMSLTUVV V1, V2, V3 // d781206a
VMSLTUVV V1, V2, V0, V3 // d7812068
VMSLTUVX X10, V2, V3 // d741256a
VMSLTUVX X10, V2, V0, V3 // d7412568
VMSLTVV V1, V2, V3 // d781206e
VMSLTVV V1, V2, V0, V3 // d781206c
VMSLTVX X10, V2, V3 // d741256e
VMSLTVX X10, V2, V0, V3 // d741256c
VMSLEUVV V1, V2, V3 // d7812072
VMSLEUVV V1, V2, V0, V3 // d7812070
VMSLEUVX X10, V2, V3 // d7412572
VMSLEUVX X10, V2, V0, V3 // d7412570
VMSLEUVI $15, V2, V3 // d7b12772
VMSLEUVI $15, V2, V0, V3 // d7b12770
VMSLEVV V1, V2, V3 // d7812076
VMSLEVV V1, V2, V0, V3 // d7812074
VMSLEVX X10, V2, V3 // d7412576
VMSLEVX X10, V2, V0, V3 // d7412574
VMSLEVI $15, V2, V3 // d7b12776
VMSLEVI $15, V2, V0, V3 // d7b12774
VMSGTUVX X10, V2, V3 // d741257a
VMSGTUVX X10, V2, V0, V3 // d7412578
VMSGTUVI $15, V2, V3 // d7b1277a
VMSGTUVI $15, V2, V0, V3 // d7b12778
VMSGTVX X10, V2, V3 // d741257e
VMSGTVX X10, V2, V0, V3 // d741257c
VMSGTVI $15, V2, V3 // d7b1277e
VMSGTVI $15, V2, V0, V3 // d7b1277c
VMSGTVV V1, V2, V3 // d701116e
VMSGTVV V1, V2, V0, V3 // d701116c
VMSGTUVV V1, V2, V3 // d701116a
VMSGTUVV V1, V2, V0, V3 // d7011168
VMSGEVV V1, V2, V3 // d7011176
VMSGEVV V1, V2, V0, V3 // d7011174
VMSGEUVV V1, V2, V3 // d7011172
VMSGEUVV V1, V2, V0, V3 // d7011170
VMSLTVI $15, V2, V3 // d7312776
VMSLTVI $15, V2, V0, V3 // d7312774
VMSLTUVI $15, V2, V3 // d7312772
VMSLTUVI $15, V2, V0, V3 // d7312770
VMSGEVI $15, V2, V3 // d731277e
VMSGEVI $15, V2, V0, V3 // d731277c
VMSGEUVI $15, V2, V3 // d731277a
VMSGEUVI $15, V2, V0, V3 // d7312778
// 31.11.9: Vector Integer Min/Max Instructions
VMINUVV V1, V2, V3 // d7812012
VMINUVV V1, V2, V0, V3 // d7812010
VMINUVX X10, V2, V3 // d7412512
VMINUVX X10, V2, V0, V3 // d7412510
VMINVV V1, V2, V3 // d7812016
VMINVV V1, V2, V0, V3 // d7812014
VMINVX X10, V2, V3 // d7412516
VMINVX X10, V2, V0, V3 // d7412514
VMAXUVV V1, V2, V3 // d781201a
VMAXUVV V1, V2, V0, V3 // d7812018
VMAXUVX X10, V2, V3 // d741251a
VMAXUVX X10, V2, V0, V3 // d7412518
VMAXVV V1, V2, V3 // d781201e
VMAXVV V1, V2, V0, V3 // d781201c
VMAXVX X10, V2, V3 // d741251e
VMAXVX X10, V2, V0, V3 // d741251c
// 31.11.10: Vector Single-Width Integer Multiply Instructions
VMULVV V1, V2, V3 // d7a12096
VMULVV V1, V2, V0, V3 // d7a12094
VMULVX X10, V2, V3 // d7612596
VMULVX X10, V2, V0, V3 // d7612594
VMULHVV V1, V2, V3 // d7a1209e
VMULHVV V1, V2, V0, V3 // d7a1209c
VMULHVX X10, V2, V3 // d761259e
VMULHVX X10, V2, V0, V3 // d761259c
VMULHUVV V1, V2, V3 // d7a12092
VMULHUVV V1, V2, V0, V3 // d7a12090
VMULHUVX X10, V2, V3 // d7612592
VMULHUVX X10, V2, V0, V3 // d7612590
VMULHSUVV V1, V2, V3 // d7a1209a
VMULHSUVV V1, V2, V0, V3 // d7a12098
VMULHSUVX X10, V2, V3 // d761259a
VMULHSUVX X10, V2, V0, V3 // d7612598
// 31.11.11: Vector Integer Divide Instructions
VDIVUVV V1, V2, V3 // d7a12082
VDIVUVV V1, V2, V0, V3 // d7a12080
VDIVUVX X10, V2, V3 // d7612582
VDIVUVX X10, V2, V0, V3 // d7612580
VDIVVV V1, V2, V3 // d7a12086
VDIVVV V1, V2, V0, V3 // d7a12084
VDIVVX X10, V2, V3 // d7612586
VDIVVX X10, V2, V0, V3 // d7612584
VREMUVV V1, V2, V3 // d7a1208a
VREMUVV V1, V2, V0, V3 // d7a12088
VREMUVX X10, V2, V3 // d761258a
VREMUVX X10, V2, V0, V3 // d7612588
VREMVV V1, V2, V3 // d7a1208e
VREMVV V1, V2, V0, V3 // d7a1208c
VREMVX X10, V2, V3 // d761258e
VREMVX X10, V2, V0, V3 // d761258c
// 31.11.12: Vector Widening Integer Multiply Instructions
VWMULVV V1, V2, V3 // d7a120ee
VWMULVV V1, V2, V0, V3 // d7a120ec
VWMULVX X10, V2, V3 // d76125ee
VWMULVX X10, V2, V0, V3 // d76125ec
VWMULUVV V1, V2, V3 // d7a120e2
VWMULUVV V1, V2, V0, V3 // d7a120e0
VWMULUVX X10, V2, V3 // d76125e2
VWMULUVX X10, V2, V0, V3 // d76125e0
VWMULSUVV V1, V2, V3 // d7a120ea
VWMULSUVV V1, V2, V0, V3 // d7a120e8
VWMULSUVX X10, V2, V3 // d76125ea
VWMULSUVX X10, V2, V0, V3 // d76125e8
// 31.11.13: Vector Single-Width Integer Multiply-Add Instructions
VMACCVV V2, V1, V3 // d7a120b6
VMACCVV V2, V1, V0, V3 // d7a120b4
VMACCVX V2, X10, V3 // d76125b6
VMACCVX V2, X10, V0, V3 // d76125b4
VNMSACVV V2, V1, V3 // d7a120be
VNMSACVV V2, V1, V0, V3 // d7a120bc
VNMSACVX V2, X10, V3 // d76125be
VNMSACVX V2, X10, V0, V3 // d76125bc
VMADDVV V2, V1, V3 // d7a120a6
VMADDVV V2, V1, V0, V3 // d7a120a4
VMADDVX V2, X10, V3 // d76125a6
VMADDVX V2, X10, V0, V3 // d76125a4
VNMSUBVV V2, V1, V3 // d7a120ae
VNMSUBVV V2, V1, V0, V3 // d7a120ac
VNMSUBVX V2, X10, V3 // d76125ae
VNMSUBVX V2, X10, V0, V3 // d76125ac
// 31.11.14: Vector Widening Integer Multiply-Add Instructions
VWMACCUVV V2, V1, V3 // d7a120f2
VWMACCUVV V2, V1, V0, V3 // d7a120f0
VWMACCUVX V2, X10, V3 // d76125f2
VWMACCUVX V2, X10, V0, V3 // d76125f0
VWMACCVV V2, V1, V3 // d7a120f6
VWMACCVV V2, V1, V0, V3 // d7a120f4
VWMACCVX V2, X10, V3 // d76125f6
VWMACCVX V2, X10, V0, V3 // d76125f4
VWMACCSUVV V2, V1, V3 // d7a120fe
VWMACCSUVV V2, V1, V0, V3 // d7a120fc
VWMACCSUVX V2, X10, V3 // d76125fe
VWMACCSUVX V2, X10, V0, V3 // d76125fc
VWMACCUSVX V2, X10, V3 // d76125fa
VWMACCUSVX V2, X10, V0, V3 // d76125f8
// 31.11.15: Vector Integer Merge Instructions
VMERGEVVM V1, V2, V0, V3 // d781205c
VMERGEVXM X10, V2, V0, V3 // d741255c
VMERGEVIM $15, V2, V0, V3 // d7b1275c
// 31.11.16: Vector Integer Move Instructions
VMVVV V2, V3 // d701015e
VMVVX X10, V3 // d741055e
VMVVI $15, V3 // d7b1075e
// 31.12.1: Vector Single-Width Saturating Add and Subtract
VSADDUVV V1, V2, V3 // d7812082
VSADDUVV V1, V2, V0, V3 // d7812080
VSADDUVX X10, V2, V3 // d7412582
VSADDUVX X10, V2, V0, V3 // d7412580
VSADDUVI $15, V2, V3 // d7b12782
VSADDUVI $15, V2, V0, V3 // d7b12780
VSADDVV V1, V2, V3 // d7812086
VSADDVV V1, V2, V0, V3 // d7812084
VSADDVX X10, V2, V3 // d7412586
VSADDVX X10, V2, V0, V3 // d7412584
VSADDVI $15, V2, V3 // d7b12786
VSADDVI $15, V2, V0, V3 // d7b12784
VSSUBUVV V1, V2, V3 // d781208a
VSSUBUVV V1, V2, V0, V3 // d7812088
VSSUBUVX X10, V2, V3 // d741258a
VSSUBUVX X10, V2, V0, V3 // d7412588
VSSUBVV V1, V2, V3 // d781208e
VSSUBVV V1, V2, V0, V3 // d781208c
VSSUBVX X10, V2, V3 // d741258e
VSSUBVX X10, V2, V0, V3 // d741258c
// 31.12.2: Vector Single-Width Averaging Add and Subtract
VAADDUVV V1, V2, V3 // d7a12022
VAADDUVV V1, V2, V0, V3 // d7a12020
VAADDUVX X10, V2, V3 // d7612522
VAADDUVX X10, V2, V0, V3 // d7612520
VAADDVV V1, V2, V3 // d7a12026
VAADDVV V1, V2, V0, V3 // d7a12024
VAADDVX X10, V2, V3 // d7612526
VAADDVX X10, V2, V0, V3 // d7612524
VASUBUVV V1, V2, V3 // d7a1202a
VASUBUVV V1, V2, V0, V3 // d7a12028
VASUBUVX X10, V2, V3 // d761252a
VASUBUVX X10, V2, V0, V3 // d7612528
VASUBVV V1, V2, V3 // d7a1202e
VASUBVV V1, V2, V0, V3 // d7a1202c
VASUBVX X10, V2, V3 // d761252e
VASUBVX X10, V2, V0, V3 // d761252c
// 31.12.3: Vector Single-Width Fractional Multiply with Rounding and Saturation
VSMULVV V1, V2, V3 // d781209e
VSMULVV V1, V2, V0, V3 // d781209c
VSMULVX X10, V2, V3 // d741259e
VSMULVX X10, V2, V0, V3 // d741259c
// 31.12.4: Vector Single-Width Scaling Shift Instructions
VSSRLVV V1, V2, V3 // d78120aa
VSSRLVV V1, V2, V0, V3 // d78120a8
VSSRLVX X10, V2, V3 // d74125aa
VSSRLVX X10, V2, V0, V3 // d74125a8
VSSRLVI $15, V2, V3 // d7b127aa
VSSRLVI $15, V2, V0, V3 // d7b127a8
VSSRAVV V1, V2, V3 // d78120ae
VSSRAVV V1, V2, V0, V3 // d78120ac
VSSRAVX X10, V2, V3 // d74125ae
VSSRAVX X10, V2, V0, V3 // d74125ac
VSSRAVI $16, V2, V3 // d73128ae
VSSRAVI $16, V2, V0, V3 // d73128ac
// 31.12.5: Vector Narrowing Fixed-Point Clip Instructions
VNCLIPUWV V1, V2, V3 // d78120ba
VNCLIPUWV V1, V2, V0, V3 // d78120b8
VNCLIPUWX X10, V2, V3 // d74125ba
VNCLIPUWX X10, V2, V0, V3 // d74125b8
VNCLIPUWI $16, V2, V3 // d73128ba
VNCLIPUWI $16, V2, V0, V3 // d73128b8
VNCLIPWV V1, V2, V3 // d78120be
VNCLIPWV V1, V2, V0, V3 // d78120bc
VNCLIPWX X10, V2, V3 // d74125be
VNCLIPWX X10, V2, V0, V3 // d74125bc
VNCLIPWI $16, V2, V3 // d73128be
VNCLIPWI $16, V2, V0, V3 // d73128bc
// 31.13.2: Vector Single-Width Floating-Point Add/Subtract Instructions
VFADDVV V1, V2, V3 // d7912002
VFADDVV V1, V2, V0, V3 // d7912000
VFADDVF F10, V2, V3 // d7512502
VFADDVF F10, V2, V0, V3 // d7512500
VFSUBVV V1, V2, V3 // d791200a
VFSUBVV V1, V2, V0, V3 // d7912008
VFSUBVF F10, V2, V3 // d751250a
VFSUBVF F10, V2, V0, V3 // d7512508
VFRSUBVF F10, V2, V3 // d751259e
VFRSUBVF F10, V2, V0, V3 // d751259c
// 31.13.3: Vector Widening Floating-Point Add/Subtract Instructions
VFWADDVV V1, V2, V3 // d79120c2
VFWADDVV V1, V2, V0, V3 // d79120c0
VFWADDVF F10, V2, V3 // d75125c2
VFWADDVF F10, V2, V0, V3 // d75125c0
VFWSUBVV V1, V2, V3 // d79120ca
VFWSUBVV V1, V2, V0, V3 // d79120c8
VFWSUBVF F10, V2, V3 // d75125ca
VFWSUBVF F10, V2, V0, V3 // d75125c8
VFWADDWV V1, V2, V3 // d79120d2
VFWADDWV V1, V2, V0, V3 // d79120d0
VFWADDWF F10, V2, V3 // d75125d2
VFWADDWF F10, V2, V0, V3 // d75125d0
VFWSUBWV V1, V2, V3 // d79120da
VFWSUBWV V1, V2, V0, V3 // d79120d8
VFWSUBWF F10, V2, V3 // d75125da
VFWSUBWF F10, V2, V0, V3 // d75125d8
// 31.13.4: Vector Single-Width Floating-Point Multiply/Divide Instructions
VFMULVV V1, V2, V3 // d7912092
VFMULVV V1, V2, V0, V3 // d7912090
VFMULVF F10, V2, V3 // d7512592
VFMULVF F10, V2, V0, V3 // d7512590
VFDIVVV V1, V2, V3 // d7912082
VFDIVVV V1, V2, V0, V3 // d7912080
VFDIVVF F10, V2, V3 // d7512582
VFDIVVF F10, V2, V0, V3 // d7512580
VFRDIVVF F10, V2, V3 // d7512586
VFRDIVVF F10, V2, V0, V3 // d7512584
// 31.13.5: Vector Widening Floating-Point Multiply
VFWMULVV V1, V2, V3 // d79120e2
VFWMULVV V1, V2, V0, V3 // d79120e0
VFWMULVF F10, V2, V3 // d75125e2
VFWMULVF F10, V2, V0, V3 // d75125e0
// 31.13.6: Vector Single-Width Floating-Point Fused Multiply-Add Instructions
VFMACCVV V2, V1, V3 // d79120b2
VFMACCVV V2, V1, V0, V3 // d79120b0
VFMACCVF V2, F10, V3 // d75125b2
VFMACCVF V2, F10, V0, V3 // d75125b0
VFNMACCVV V2, V1, V3 // d79120b6
VFNMACCVV V2, V1, V0, V3 // d79120b4
VFNMACCVF V2, F10, V3 // d75125b6
VFNMACCVF V2, F10, V0, V3 // d75125b4
VFMSACVV V2, V1, V3 // d79120ba
VFMSACVV V2, V1, V0, V3 // d79120b8
VFMSACVF V2, F10, V3 // d75125ba
VFMSACVF V2, F10, V0, V3 // d75125b8
VFNMSACVV V2, V1, V3 // d79120be
VFNMSACVV V2, V1, V0, V3 // d79120bc
VFNMSACVF V2, F10, V3 // d75125be
VFNMSACVF V2, F10, V0, V3 // d75125bc
VFMADDVV V2, V1, V3 // d79120a2
VFMADDVV V2, V1, V0, V3 // d79120a0
VFMADDVF V2, F10, V3 // d75125a2
VFMADDVF V2, F10, V0, V3 // d75125a0
VFNMADDVV V2, V1, V3 // d79120a6
VFNMADDVV V2, V1, V0, V3 // d79120a4
VFNMADDVF V2, F10, V3 // d75125a6
VFNMADDVF V2, F10, V0, V3 // d75125a4
VFMSUBVV V2, V1, V3 // d79120aa
VFMSUBVV V2, V1, V0, V3 // d79120a8
VFMSUBVF V2, F10, V3 // d75125aa
VFMSUBVF V2, F10, V0, V3 // d75125a8
VFNMSUBVV V2, V1, V3 // d79120ae
VFNMSUBVV V2, V1, V0, V3 // d79120ac
VFNMSUBVF V2, F10, V3 // d75125ae
VFNMSUBVF V2, F10, V0, V3 // d75125ac
// 31.13.7: Vector Widening Floating-Point Fused Multiply-Add Instructions
VFWMACCVV V2, V1, V3 // d79120f2
VFWMACCVV V2, V1, V0, V3 // d79120f0
VFWMACCVF V2, F10, V3 // d75125f2
VFWMACCVF V2, F10, V0, V3 // d75125f0
VFWNMACCVV V2, V1, V3 // d79120f6
VFWNMACCVV V2, V1, V0, V3 // d79120f4
VFWNMACCVF V2, F10, V3 // d75125f6
VFWNMACCVF V2, F10, V0, V3 // d75125f4
VFWMSACVV V2, V1, V3 // d79120fa
VFWMSACVV V2, V1, V0, V3 // d79120f8
VFWMSACVF V2, F10, V3 // d75125fa
VFWMSACVF V2, F10, V0, V3 // d75125f8
VFWNMSACVV V2, V1, V3 // d79120fe
VFWNMSACVV V2, V1, V0, V3 // d79120fc
VFWNMSACVF V2, F10, V3 // d75125fe
VFWNMSACVF V2, F10, V0, V3 // d75125fc
// 31.13.8: Vector Floating-Point Square-Root Instruction
VFSQRTV V2, V3 // d711204e
VFSQRTV V2, V0, V3 // d711204c
// 31.13.9: Vector Floating-Point Reciprocal Square-Root Estimate Instruction
VFRSQRT7V V2, V3 // d711224e
VFRSQRT7V V2, V0, V3 // d711224c
// 31.13.10: Vector Floating-Point Reciprocal Estimate Instruction
VFREC7V V2, V3 // d791224e
VFREC7V V2, V0, V3 // d791224c
// 31.13.11: Vector Floating-Point MIN/MAX Instructions
VFMINVV V1, V2, V3 // d7912012
VFMINVV V1, V2, V0, V3 // d7912010
VFMINVF F10, V2, V3 // d7512512
VFMINVF F10, V2, V0, V3 // d7512510
VFMAXVV V1, V2, V3 // d791201a
VFMAXVV V1, V2, V0, V3 // d7912018
VFMAXVF F10, V2, V3 // d751251a
VFMAXVF F10, V2, V0, V3 // d7512518
// 31.13.12: Vector Floating-Point Sign-Injection Instructions
VFSGNJVV V1, V2, V3 // d7912022
VFSGNJVV V1, V2, V0, V3 // d7912020
VFSGNJVF F10, V2, V3 // d7512522
VFSGNJVF F10, V2, V0, V3 // d7512520
VFSGNJNVV V1, V2, V3 // d7912026
VFSGNJNVV V1, V2, V0, V3 // d7912024
VFSGNJNVF F10, V2, V3 // d7512526
VFSGNJNVF F10, V2, V0, V3 // d7512524
VFSGNJXVV V1, V2, V3 // d791202a
VFSGNJXVV V1, V2, V0, V3 // d7912028
VFSGNJXVF F10, V2, V3 // d751252a
VFSGNJXVF F10, V2, V0, V3 // d7512528
VFNEGV V2, V3 // d7112126
VFNEGV V2, V0, V3 // d7112124
VFABSV V2, V3 // d711212a
VFABSV V2, V0, V3 // d7112128
// 31.13.13: Vector Floating-Point Compare Instructions
VMFEQVV V1, V2, V3 // d7912062
VMFEQVV V1, V2, V0, V3 // d7912060
VMFEQVF F10, V2, V3 // d7512562
VMFEQVF F10, V2, V0, V3 // d7512560
VMFNEVV V1, V2, V3 // d7912072
VMFNEVV V1, V2, V0, V3 // d7912070
VMFNEVF F10, V2, V3 // d7512572
VMFNEVF F10, V2, V0, V3 // d7512570
VMFLTVV V1, V2, V3 // d791206e
VMFLTVV V1, V2, V0, V3 // d791206c
VMFLTVF F10, V2, V3 // d751256e
VMFLTVF F10, V2, V0, V3 // d751256c
VMFLEVV V1, V2, V3 // d7912066
VMFLEVV V1, V2, V0, V3 // d7912064
VMFLEVF F10, V2, V3 // d7512566
VMFLEVF F10, V2, V0, V3 // d7512564
VMFGTVF F10, V2, V3 // d7512576
VMFGTVF F10, V2, V0, V3 // d7512574
VMFGEVF F10, V2, V3 // d751257e
VMFGEVF F10, V2, V0, V3 // d751257c
VMFGTVV V1, V2, V3 // d711116e
VMFGTVV V1, V2, V0, V3 // d711116c
VMFGEVV V1, V2, V3 // d7111166
VMFGEVV V1, V2, V0, V3 // d7111164
// 31.13.14: Vector Floating-Point Classify Instruction
VFCLASSV V2, V3 // d711284e
VFCLASSV V2, V0, V3 // d711284c
// 31.13.15: Vector Floating-Point Merge Instruction
VFMERGEVFM F10, V2, V0, V3 // d751255c
// 31.13.16: Vector Floating-Point Move Instruction
VFMVVF F10, V3 // d751055e
// 31.13.17: Single-Width Floating-Point/Integer Type-Convert Instructions
VFCVTXUFV V2, V3 // d711204a
VFCVTXUFV V2, V0, V3 // d7112048
VFCVTXFV V2, V3 // d791204a
VFCVTXFV V2, V0, V3 // d7912048
VFCVTRTZXUFV V2, V3 // d711234a
VFCVTRTZXUFV V2, V0, V3 // d7112348
VFCVTRTZXFV V2, V3 // d791234a
VFCVTRTZXFV V2, V0, V3 // d7912348
VFCVTFXUV V2, V3 // d711214a
VFCVTFXUV V2, V0, V3 // d7112148
VFCVTFXV V2, V3 // d791214a
VFCVTFXV V2, V0, V3 // d7912148
// 31.13.18: Widening Floating-Point/Integer Type-Convert Instructions
VFWCVTXUFV V2, V3 // d711244a
VFWCVTXUFV V2, V0, V3 // d7112448
VFWCVTXFV V2, V3 // d791244a
VFWCVTXFV V2, V0, V3 // d7912448
VFWCVTRTZXUFV V2, V3 // d711274a
VFWCVTRTZXUFV V2, V0, V3 // d7112748
VFWCVTRTZXFV V2, V3 // d791274a
VFWCVTRTZXFV V2, V0, V3 // d7912748
VFWCVTFXUV V2, V3 // d711254a
VFWCVTFXUV V2, V0, V3 // d7112548
VFWCVTFXV V2, V3 // d791254a
VFWCVTFXV V2, V0, V3 // d7912548
VFWCVTFFV V2, V3 // d711264a
VFWCVTFFV V2, V0, V3 // d7112648
// 31.13.19: Narrowing Floating-Point/Integer Type-Convert Instructions
VFNCVTXUFW V2, V3 // d711284a
VFNCVTXUFW V2, V0, V3 // d7112848
VFNCVTXFW V2, V3 // d791284a
VFNCVTXFW V2, V0, V3 // d7912848
VFNCVTRTZXUFW V2, V3 // d7112b4a
VFNCVTRTZXUFW V2, V0, V3 // d7112b48
VFNCVTRTZXFW V2, V3 // d7912b4a
VFNCVTRTZXFW V2, V0, V3 // d7912b48
VFNCVTFXUW V2, V3 // d711294a
VFNCVTFXUW V2, V0, V3 // d7112948
VFNCVTFXW V2, V3 // d791294a
VFNCVTFXW V2, V0, V3 // d7912948
VFNCVTFFW V2, V3 // d7112a4a
VFNCVTFFW V2, V0, V3 // d7112a48
VFNCVTRODFFW V2, V3 // d7912a4a
VFNCVTRODFFW V2, V0, V3 // d7912a48
// 31.14.1: Vector Single-Width Integer Reduction Instructions
VREDSUMVS V1, V2, V3 // d7a12002
VREDSUMVS V1, V2, V0, V3 // d7a12000
VREDMAXUVS V1, V2, V3 // d7a1201a
VREDMAXUVS V1, V2, V0, V3 // d7a12018
VREDMAXVS V1, V2, V3 // d7a1201e
VREDMAXVS V1, V2, V0, V3 // d7a1201c
VREDMINUVS V1, V2, V3 // d7a12012
VREDMINUVS V1, V2, V0, V3 // d7a12010
VREDMINVS V1, V2, V3 // d7a12016
VREDMINVS V1, V2, V0, V3 // d7a12014
VREDANDVS V1, V2, V3 // d7a12006
VREDANDVS V1, V2, V0, V3 // d7a12004
VREDORVS V1, V2, V3 // d7a1200a
VREDORVS V1, V2, V0, V3 // d7a12008
VREDXORVS V1, V2, V3 // d7a1200e
VREDXORVS V1, V2, V0, V3 // d7a1200c
// 31.14.2: Vector Widening Integer Reduction Instructions
VWREDSUMUVS V1, V2, V3 // d78120c2
VWREDSUMUVS V1, V2, V0, V3 // d78120c0
VWREDSUMVS V1, V2, V3 // d78120c6
VWREDSUMVS V1, V2, V0, V3 // d78120c4
// 31.14.3: Vector Single-Width Floating-Point Reduction Instructions
VFREDOSUMVS V1, V2, V3 // d791200e
VFREDOSUMVS V1, V2, V0, V3 // d791200c
VFREDUSUMVS V1, V2, V3 // d7912006
VFREDUSUMVS V1, V2, V0, V3 // d7912004
VFREDMAXVS V1, V2, V3 // d791201e
VFREDMAXVS V1, V2, V0, V3 // d791201c
VFREDMINVS V1, V2, V3 // d7912016
VFREDMINVS V1, V2, V0, V3 // d7912014
// 31.14.4: Vector Widening Floating-Point Reduction Instructions
VFWREDOSUMVS V1, V2, V3 // d79120ce
VFWREDOSUMVS V1, V2, V0, V3 // d79120cc
VFWREDUSUMVS V1, V2, V3 // d79120c6
VFWREDUSUMVS V1, V2, V0, V3 // d79120c4
// 31.15: Vector Mask Instructions
VMANDMM V1, V2, V3 // d7a12066
VMNANDMM V1, V2, V3 // d7a12076
VMANDNMM V1, V2, V3 // d7a12062
VMXORMM V1, V2, V3 // d7a1206e
VMORMM V1, V2, V3 // d7a1206a
VMNORMM V1, V2, V3 // d7a1207a
VMORNMM V1, V2, V3 // d7a12072
VMXNORMM V1, V2, V3 // d7a1207e
VMMVM V2, V3 // d7212166
VMCLRM V3 // d7a1316e
VMSETM V3 // d7a1317e
VMNOTM V2, V3 // d7212176
VCPOPM V2, X10 // 57252842
VCPOPM V2, V0, X10 // 57252840
VFIRSTM V2, X10 // 57a52842
VFIRSTM V2, V0, X10 // 57a52840
VMSBFM V2, V3 // d7a12052
VMSBFM V2, V0, V3 // d7a12050
VMSIFM V2, V3 // d7a12152
VMSIFM V2, V0, V3 // d7a12150
VMSOFM V2, V3 // d7212152
VMSOFM V2, V0, V3 // d7212150
VIOTAM V2, V3 // d7212852
VIOTAM V2, V0, V3 // d7212850
VIDV V3 // d7a10852
VIDV V0, V3 // d7a10850
// 31.16.1: Integer Scalar Move Instructions
VMVXS V2, X10 // 57252042
VMVSX X10, V2 // 57610542
// 31.16.2: Floating-Point Scalar Move Instructions
VFMVFS V2, F10 // 57152042
VFMVSF F10, V2 // 57510542
// 31.16.3: Vector Slide Instructions
VSLIDEUPVX X10, V2, V3 // d741253a
VSLIDEUPVX X10, V2, V0, V3 // d7412538
VSLIDEUPVI $16, V2, V3 // d731283a
VSLIDEUPVI $16, V2, V0, V3 // d7312838
VSLIDEDOWNVX X10, V2, V3 // d741253e
VSLIDEDOWNVX X10, V2, V0, V3 // d741253c
VSLIDEDOWNVI $16, V2, V3 // d731283e
VSLIDEDOWNVI $16, V2, V0, V3 // d731283c
VSLIDE1UPVX X10, V2, V3 // d761253a
VSLIDE1UPVX X10, V2, V0, V3 // d7612538
VFSLIDE1UPVF F10, V2, V3 // d751253a
VFSLIDE1UPVF F10, V2, V0, V3 // d7512538
VSLIDE1DOWNVX X10, V2, V3 // d761253e
VSLIDE1DOWNVX X10, V2, V0, V3 // d761253c
VFSLIDE1DOWNVF F10, V2, V3 // d751253e
VFSLIDE1DOWNVF F10, V2, V0, V3 // d751253c
// 31.16.4: Vector Register Gather Instructions
VRGATHERVV V1, V2, V3 // d7812032
VRGATHERVV V1, V2, V0, V3 // d7812030
VRGATHEREI16VV V1, V2, V3 // d781203a
VRGATHEREI16VV V1, V2, V0, V3 // d7812038
VRGATHERVX X10, V2, V3 // d7412532
VRGATHERVX X10, V2, V0, V3 // d7412530
VRGATHERVI $16, V2, V3 // d7312832
VRGATHERVI $16, V2, V0, V3 // d7312830
// 31.16.5: Vector Compress Instruction
VCOMPRESSVM V1, V2, V3 // d7a1205e
// 31.16.6: Whole Vector Register Move
VMV1RV V2, V1 // d730209e
VMV2RV V12, V10 // 57b5c09e
VMV4RV V8, V4 // 57b2819e
VMV8RV V8, V0 // 57b0839e
// 33.2.1: Vector Basic Bit-manipulation (Zvbb)
VANDNVV V1, V2, V3 // d7812006
VANDNVV V1, V2, V0, V3 // d7812004
VANDNVX X10, V2, V3 // d7412506
VANDNVX X10, V2, V0, V3 // d7412504
VBREVV V2, V3 // d721254a
VBREVV V2, V0, V3 // d7212548
VBREV8V V2, V3 // d721244a
VBREV8V V2, V0, V3 // d7212448
VREV8V V2, V3 // d7a1244a
VREV8V V2, V0, V3 // d7a12448
VCLZV V2, V3 // d721264a
VCLZV V2, V0, V3 // d7212648
VCTZV V2, V3 // d7a1264a
VCTZV V2, V0, V3 // d7a12648
VCPOPV V2, V3 // d721274a
VCPOPV V2, V0, V3 // d7212748
VROLVV V1, V2, V3 // d7812056
VROLVV V1, V2, V0, V3 // d7812054
VROLVX X10, V2, V3 // d7412556
VROLVX X10, V2, V0, V3 // d7412554
VRORVV V1, V2, V3 // d7812052
VRORVV V1, V2, V0, V3 // d7812050
VRORVX X10, V2, V3 // d7412552
VRORVX X10, V2, V0, V3 // d7412550
VRORVI $16, V2, V3 // d7312852
VRORVI $16, V2, V0, V3 // d7312850
VWSLLVV V1, V2, V3 // d78120d6
VWSLLVV V1, V2, V0, V3 // d78120d4
VWSLLVX X10, V2, V3 // d74125d6
VWSLLVX X10, V2, V0, V3 // d74125d4
VWSLLVI $16, V2, V3 // d73128d6
VWSLLVI $16, V2, V0, V3 // d73128d4
// 33.2.2: Vector Carryless Multiplication (Zvbc)
VCLMULVV V1, V2, V3 // d7a12032
VCLMULVV V1, V2, V0, V3 // d7a12030
VCLMULVX X10, V2, V3 // d7612532
VCLMULVX X10, V2, V0, V3 // d7612530
VCLMULHVV V1, V2, V3 // d7a12036
VCLMULHVV V1, V2, V0, V3 // d7a12034
VCLMULHVX X10, V2, V3 // d7612536
VCLMULHVX X10, V2, V0, V3 // d7612534
RET
`
dir := t.TempDir()
path := filepath.Join(dir, "vecarith_riscv64.s")
if err := os.WriteFile(path, []byte(src), 0o644); err != nil {
t.Fatal(err)
}
assertRISCVDifferential(t, path, src, "vecarith")
}
// TestRISCVScalarPseudos_Differential proves the scalar pseudo tail against
// the toolchain: the NEG/NEGW and SEQZ/SNEZ one- and two-operand forms, the
// sign-injection pseudos and the two-word not-equal expansions, exactly as
// the toolchain's own testdata spells them.
func TestRISCVScalarPseudos_Differential(t *testing.T) {
src := `#include "textflag.h"
TEXT ·pseudos(SB), NOSPLIT, $0-8
NEG X5
NEG X5, X6
NEGW X5
NEGW X5, X6
SEQZ X14, X15
SNEZ X14, X15
FABSS F0, F1
FNEGS F0, F1
FNES F0, F1, X7
FABSD F0, F1
FNEGD F0, F1
FNED F0, F1, X5
FLTD F0, F1, X5
FLED F0, F1, X5
FEQD F0, F1, X5
RET
`
dir := t.TempDir()
path := filepath.Join(dir, "pseudos_riscv64.s")
if err := os.WriteFile(path, []byte(src), 0o644); err != nil {
t.Fatal(err)
}
assertRISCVDifferential(t, path, src, "pseudos")
}