// Copyright (c) 2026 Petr Balvín (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") }