feat(asm): encode the riscv64 vector arithmetic families
Assisted-by: GLM 5.3 Flash
This commit is contained in:
1 parent
5de9e985f8
commit
778c297214
3 files changed
+1812
-102
No files matched your search
+436
-21
@@ -540,11 +540,8 @@ func riscvJType(rd int, offset int32) uint32 {
|
||||
const (
|
||||
riscvOpV = 0x57 // the vector operation opcode (also OPcfg for vset*)
|
||||
// funct3 values: 0 OPIVV, 1 OPFVV, 2 OPMVV, 3 OPIVI, 4 OPIVX,
|
||||
// 5 OPFVF, 6 OPMVX, 7 vsetvli.
|
||||
riscvVf3VV = 0x0 // vector-vector
|
||||
riscvVf3MV = 0x2 // vector mask
|
||||
riscvVf3VI = 0x3 // vector-immediate
|
||||
riscvVf3VX = 0x4 // vector-scalar
|
||||
// 5 OPFVF, 6 OPMVX, 7 vsetvli. The subclass a mnemonic carries lives
|
||||
// in its table entry's funct3.
|
||||
riscvVf3Cfg = 0x7 // vsetvli
|
||||
)
|
||||
|
||||
@@ -578,27 +575,445 @@ func riscvVLSType(op uint32, nf, mop, width int, rs2 int32, rs1, rd int) uint32
|
||||
uint32(rd)<<7 | op
|
||||
}
|
||||
|
||||
// riscvVVInstr encodes an OP-V instruction with the six-bit operation code in
|
||||
// funct7's upper bits, bit 25 as the unmasked flag and the three registers in
|
||||
// the standard positions. vs1 may name an integer register for the *VX forms
|
||||
// (the scalar sits in the rs1 field) or an immediate for the *VI forms.
|
||||
func riscvVVInstr(funct6, funct3 int, vs1 int32, vs2, vd int) uint32 {
|
||||
return uint32(funct6&0x3F)<<26 | 1<<25 | uint32(vs1)<<15 |
|
||||
uint32(funct3)<<12 | uint32(vs2)<<20 | uint32(vd)<<7 | riscvOpV
|
||||
}
|
||||
|
||||
// riscvVUnaryInstr encodes a one-vector-operand OP-V instruction whose fixed
|
||||
// fields live where the second source register would be: rs1Field and vs2 are
|
||||
// written verbatim (the oracle writes fixed non-zero constants there for some
|
||||
// instructions, such as 0x11 in the rs1 field of vmfirst.m and vid.v).
|
||||
func riscvVUnaryInstr(funct6, funct3 int, rs1Field int32, vs2, vd int) uint32 {
|
||||
return uint32(funct6&0x3F)<<26 | 1<<25 | uint32(vs2&0x1F)<<20 |
|
||||
uint32(rs1Field&0x1F)<<15 | uint32(funct3&0x7)<<12 | uint32(vd&0x1F)<<7 | riscvOpV
|
||||
// riscvVecWord composes one OP-V arithmetic word: funct7 carries funct6 << 1
|
||||
// with the vm bit in its LSB, exactly as the table stores it; rs1Field takes
|
||||
// the source register, the scalar or the immediate; vs2 and vd name vector
|
||||
// registers.
|
||||
func riscvVecWord(funct7 uint32, rs1Field int32, vs2 int, funct3 uint32, vd int) uint32 {
|
||||
return funct7<<25 | uint32(vs2&0x1F)<<20 | uint32(rs1Field&0x1F)<<15 |
|
||||
funct3&0x7<<12 | uint32(vd&0x1F)<<7 | riscvOpV
|
||||
}
|
||||
|
||||
// riscvSegNF maps a segment count to the 3-bit nf field (count - 1).
|
||||
func riscvSegNF(n int) int32 { return int32(n - 1) }
|
||||
|
||||
// The table below mirrors the Go toolchain's own instruction table
|
||||
// (cmd/internal/obj/riscv): funct7 carries funct6 << 1 with the fixed
|
||||
// vm bit in its LSB, exactly as the toolchain stores it.
|
||||
|
||||
// riscvVecOpClass names the operand shape a vector arithmetic mnemonic
|
||||
// takes: which operands land in the rs1 and vs2 fields, whether a
|
||||
// V0 mask may sit between them, and whether the class rewrites its
|
||||
// operands or its mnemonic before encoding.
|
||||
type riscvVecOpClass uint8
|
||||
|
||||
const (
|
||||
// vs1, vs2 [, v0], vd: the plain vector-vector form
|
||||
vecVV riscvVecOpClass = iota
|
||||
// vs2, vs1 [, v0], vd: the multiply-accumulate order
|
||||
vecMACC
|
||||
// vs2 [, v0], vd: one vector operand, fixed rs1
|
||||
vecUNARY
|
||||
// vs2 [, v0], xrd: mask bookkeeping into an integer register
|
||||
vecM2I
|
||||
// vs2, vd: vmv.v.v and vmv.v.x spellings
|
||||
vecVMVV
|
||||
// $imm, vd: vmv.v.i
|
||||
vecVMVI
|
||||
// fs1, vd: vfmv.v.f
|
||||
vecVFMVVF
|
||||
// vs2, vd: two-operand forms with a fixed rs1 field
|
||||
vecTWO
|
||||
// xs1|fs1, vd: two-operand forms with a fixed vs2 field
|
||||
vecTWOX
|
||||
// vs1, vs2, v0, vd: the carry forms, mask mandatory
|
||||
vecADC
|
||||
// vs1, vs2, v0, vd: the merge forms, mask mandatory
|
||||
vecMERGE
|
||||
// vs1, vs2, vd: the carry-producing forms
|
||||
vecVMADC
|
||||
// vs2 [, v0], vd with rs1 = x0: VNEGV and friends
|
||||
vecNEG
|
||||
// vs2 [, v0], vd: XOR with -1
|
||||
vecVNOT
|
||||
// vs2, vs1 [, v0], vd: the swapped comparisons
|
||||
vecSWAPVV
|
||||
// $imm, vs2 [, v0], vd: swapped, imm-1
|
||||
vecSWAPVI
|
||||
// vs2 [, v0], vd with rs1 = vs2: VFABSV and VFNEGV
|
||||
vecVFABS
|
||||
// vs1, vs2, vd: the mask-mask forms, no mask operand
|
||||
vecMM
|
||||
// vd: the whole-mask clears and sets
|
||||
vecVMCLR
|
||||
// [v0,] vd: the element index
|
||||
vecVID
|
||||
)
|
||||
|
||||
// riscvVecOp is one vector arithmetic instruction's fixed fields: the
|
||||
// funct3 subclass, the fixed rs1 field (the unary constants), the fixed
|
||||
// funct7 (funct6 << 1 with the fixed vm bit), the operand class and the
|
||||
// immediate form the first operand takes.
|
||||
type riscvVecOp struct {
|
||||
funct3 uint32
|
||||
rs1 uint32
|
||||
funct7 uint32
|
||||
class riscvVecOpClass
|
||||
imm bool // the first operand is an immediate in the rs1 field
|
||||
immU bool // that immediate is unsigned [0, 31] (shifts and slides)
|
||||
}
|
||||
|
||||
// riscvVecOps maps every vector arithmetic mnemonic the toolchain knows
|
||||
// onto its fields. The loads and stores and the configuration setters
|
||||
// have their own paths.
|
||||
var riscvVecOps = map[string]riscvVecOp{
|
||||
"VAADDUVV": {0x2, 0x0, 0x10, 0, false, false},
|
||||
"VAADDUVX": {0x6, 0x0, 0x10, 0, false, false},
|
||||
"VAADDVV": {0x2, 0x0, 0x12, 0, false, false},
|
||||
"VAADDVX": {0x6, 0x0, 0x12, 0, false, false},
|
||||
"VADCVIM": {0x3, 0x0, 0x20, 9, true, false},
|
||||
"VADCVVM": {0x0, 0x0, 0x20, 9, false, false},
|
||||
"VADCVXM": {0x4, 0x0, 0x20, 9, false, false},
|
||||
"VADDVI": {0x3, 0x0, 0x00, 0, true, false},
|
||||
"VADDVV": {0x0, 0x0, 0x00, 0, false, false},
|
||||
"VADDVX": {0x4, 0x0, 0x00, 0, false, false},
|
||||
"VANDNVV": {0x0, 0x0, 0x02, 0, false, false},
|
||||
"VANDNVX": {0x4, 0x0, 0x02, 0, false, false},
|
||||
"VANDVI": {0x3, 0x0, 0x12, 0, true, false},
|
||||
"VANDVV": {0x0, 0x0, 0x12, 0, false, false},
|
||||
"VANDVX": {0x4, 0x0, 0x12, 0, false, false},
|
||||
"VASUBUVV": {0x2, 0x0, 0x14, 0, false, false},
|
||||
"VASUBUVX": {0x6, 0x0, 0x14, 0, false, false},
|
||||
"VASUBVV": {0x2, 0x0, 0x16, 0, false, false},
|
||||
"VASUBVX": {0x6, 0x0, 0x16, 0, false, false},
|
||||
"VBREV8V": {0x2, 0x8, 0x24, 2, false, false},
|
||||
"VBREVV": {0x2, 0xa, 0x24, 2, false, false},
|
||||
"VCLMULHVV": {0x2, 0x0, 0x1a, 0, false, false},
|
||||
"VCLMULHVX": {0x6, 0x0, 0x1a, 0, false, false},
|
||||
"VCLMULVV": {0x2, 0x0, 0x18, 0, false, false},
|
||||
"VCLMULVX": {0x6, 0x0, 0x18, 0, false, false},
|
||||
"VCLZV": {0x2, 0xc, 0x24, 2, false, false},
|
||||
"VCOMPRESSVM": {0x2, 0x0, 0x2f, 17, false, false},
|
||||
"VCPOPM": {0x2, 0x10, 0x20, 3, false, false},
|
||||
"VCPOPV": {0x2, 0xe, 0x24, 2, false, false},
|
||||
"VCTZV": {0x2, 0xd, 0x24, 2, false, false},
|
||||
"VDIVUVV": {0x2, 0x0, 0x40, 0, false, false},
|
||||
"VDIVUVX": {0x6, 0x0, 0x40, 0, false, false},
|
||||
"VDIVVV": {0x2, 0x0, 0x42, 0, false, false},
|
||||
"VDIVVX": {0x6, 0x0, 0x42, 0, false, false},
|
||||
"VFABSV": {0x1, 0x0, 0x14, 16, false, false},
|
||||
"VFADDVF": {0x5, 0x0, 0x00, 0, false, false},
|
||||
"VFADDVV": {0x1, 0x0, 0x00, 0, false, false},
|
||||
"VFCLASSV": {0x1, 0x10, 0x26, 2, false, false},
|
||||
"VFCVTFXUV": {0x1, 0x2, 0x24, 2, false, false},
|
||||
"VFCVTFXV": {0x1, 0x3, 0x24, 2, false, false},
|
||||
"VFCVTRTZXFV": {0x1, 0x7, 0x24, 2, false, false},
|
||||
"VFCVTRTZXUFV": {0x1, 0x6, 0x24, 2, false, false},
|
||||
"VFCVTXFV": {0x1, 0x1, 0x24, 2, false, false},
|
||||
"VFCVTXUFV": {0x1, 0x0, 0x24, 2, false, false},
|
||||
"VFDIVVF": {0x5, 0x0, 0x40, 0, false, false},
|
||||
"VFDIVVV": {0x1, 0x0, 0x40, 0, false, false},
|
||||
"VFIRSTM": {0x2, 0x11, 0x20, 3, false, false},
|
||||
"VFMACCVF": {0x5, 0x0, 0x58, 1, false, false},
|
||||
"VFMACCVV": {0x1, 0x0, 0x58, 1, false, false},
|
||||
"VFMADDVF": {0x5, 0x0, 0x50, 1, false, false},
|
||||
"VFMADDVV": {0x1, 0x0, 0x50, 1, false, false},
|
||||
"VFMAXVF": {0x5, 0x0, 0x0c, 0, false, false},
|
||||
"VFMAXVV": {0x1, 0x0, 0x0c, 0, false, false},
|
||||
"VFMERGEVFM": {0x5, 0x0, 0x2e, 10, false, false},
|
||||
"VFMINVF": {0x5, 0x0, 0x08, 0, false, false},
|
||||
"VFMINVV": {0x1, 0x0, 0x08, 0, false, false},
|
||||
"VFMSACVF": {0x5, 0x0, 0x5c, 1, false, false},
|
||||
"VFMSACVV": {0x1, 0x0, 0x5c, 1, false, false},
|
||||
"VFMSUBVF": {0x5, 0x0, 0x54, 1, false, false},
|
||||
"VFMSUBVV": {0x1, 0x0, 0x54, 1, false, false},
|
||||
"VFMULVF": {0x5, 0x0, 0x48, 0, false, false},
|
||||
"VFMULVV": {0x1, 0x0, 0x48, 0, false, false},
|
||||
"VFMVFS": {0x1, 0x0, 0x21, 7, false, false},
|
||||
"VFMVSF": {0x5, 0x0, 0x21, 8, false, false},
|
||||
"VFMVVF": {0x5, 0x0, 0x2f, 6, false, false},
|
||||
"VFNCVTFFW": {0x1, 0x14, 0x24, 2, false, false},
|
||||
"VFNCVTFXUW": {0x1, 0x12, 0x24, 2, false, false},
|
||||
"VFNCVTFXW": {0x1, 0x13, 0x24, 2, false, false},
|
||||
"VFNCVTRODFFW": {0x1, 0x15, 0x24, 2, false, false},
|
||||
"VFNCVTRTZXFW": {0x1, 0x17, 0x24, 2, false, false},
|
||||
"VFNCVTRTZXUFW": {0x1, 0x16, 0x24, 2, false, false},
|
||||
"VFNCVTXFW": {0x1, 0x11, 0x24, 2, false, false},
|
||||
"VFNCVTXUFW": {0x1, 0x10, 0x24, 2, false, false},
|
||||
"VFNEGV": {0x1, 0x0, 0x12, 16, false, false},
|
||||
"VFNMACCVF": {0x5, 0x0, 0x5a, 1, false, false},
|
||||
"VFNMACCVV": {0x1, 0x0, 0x5a, 1, false, false},
|
||||
"VFNMADDVF": {0x5, 0x0, 0x52, 1, false, false},
|
||||
"VFNMADDVV": {0x1, 0x0, 0x52, 1, false, false},
|
||||
"VFNMSACVF": {0x5, 0x0, 0x5e, 1, false, false},
|
||||
"VFNMSACVV": {0x1, 0x0, 0x5e, 1, false, false},
|
||||
"VFNMSUBVF": {0x5, 0x0, 0x56, 1, false, false},
|
||||
"VFNMSUBVV": {0x1, 0x0, 0x56, 1, false, false},
|
||||
"VFRDIVVF": {0x5, 0x0, 0x42, 0, false, false},
|
||||
"VFREC7V": {0x1, 0x5, 0x26, 2, false, false},
|
||||
"VFREDMAXVS": {0x1, 0x0, 0x0e, 0, false, false},
|
||||
"VFREDMINVS": {0x1, 0x0, 0x0a, 0, false, false},
|
||||
"VFREDOSUMVS": {0x1, 0x0, 0x06, 0, false, false},
|
||||
"VFREDUSUMVS": {0x1, 0x0, 0x02, 0, false, false},
|
||||
"VFRSQRT7V": {0x1, 0x4, 0x26, 2, false, false},
|
||||
"VFRSUBVF": {0x5, 0x0, 0x4e, 0, false, false},
|
||||
"VFSGNJNVF": {0x5, 0x0, 0x12, 0, false, false},
|
||||
"VFSGNJNVV": {0x1, 0x0, 0x12, 0, false, false},
|
||||
"VFSGNJVF": {0x5, 0x0, 0x10, 0, false, false},
|
||||
"VFSGNJVV": {0x1, 0x0, 0x10, 0, false, false},
|
||||
"VFSGNJXVF": {0x5, 0x0, 0x14, 0, false, false},
|
||||
"VFSGNJXVV": {0x1, 0x0, 0x14, 0, false, false},
|
||||
"VFSLIDE1DOWNVF": {0x5, 0x0, 0x1e, 0, false, false},
|
||||
"VFSLIDE1UPVF": {0x5, 0x0, 0x1c, 0, false, false},
|
||||
"VFSQRTV": {0x1, 0x0, 0x26, 2, false, false},
|
||||
"VFSUBVF": {0x5, 0x0, 0x04, 0, false, false},
|
||||
"VFSUBVV": {0x1, 0x0, 0x04, 0, false, false},
|
||||
"VFWADDVF": {0x5, 0x0, 0x60, 0, false, false},
|
||||
"VFWADDVV": {0x1, 0x0, 0x60, 0, false, false},
|
||||
"VFWADDWF": {0x5, 0x0, 0x68, 0, false, false},
|
||||
"VFWADDWV": {0x1, 0x0, 0x68, 0, false, false},
|
||||
"VFWCVTFFV": {0x1, 0xc, 0x24, 2, false, false},
|
||||
"VFWCVTFXUV": {0x1, 0xa, 0x24, 2, false, false},
|
||||
"VFWCVTFXV": {0x1, 0xb, 0x24, 2, false, false},
|
||||
"VFWCVTRTZXFV": {0x1, 0xf, 0x24, 2, false, false},
|
||||
"VFWCVTRTZXUFV": {0x1, 0xe, 0x24, 2, false, false},
|
||||
"VFWCVTXFV": {0x1, 0x9, 0x24, 2, false, false},
|
||||
"VFWCVTXUFV": {0x1, 0x8, 0x24, 2, false, false},
|
||||
"VFWMACCVF": {0x5, 0x0, 0x78, 1, false, false},
|
||||
"VFWMACCVV": {0x1, 0x0, 0x78, 1, false, false},
|
||||
"VFWMSACVF": {0x5, 0x0, 0x7c, 1, false, false},
|
||||
"VFWMSACVV": {0x1, 0x0, 0x7c, 1, false, false},
|
||||
"VFWMULVF": {0x5, 0x0, 0x70, 0, false, false},
|
||||
"VFWMULVV": {0x1, 0x0, 0x70, 0, false, false},
|
||||
"VFWNMACCVF": {0x5, 0x0, 0x7a, 1, false, false},
|
||||
"VFWNMACCVV": {0x1, 0x0, 0x7a, 1, false, false},
|
||||
"VFWNMSACVF": {0x5, 0x0, 0x7e, 1, false, false},
|
||||
"VFWNMSACVV": {0x1, 0x0, 0x7e, 1, false, false},
|
||||
"VFWREDOSUMVS": {0x1, 0x0, 0x66, 0, false, false},
|
||||
"VFWREDUSUMVS": {0x1, 0x0, 0x62, 0, false, false},
|
||||
"VFWSUBVF": {0x5, 0x0, 0x64, 0, false, false},
|
||||
"VFWSUBVV": {0x1, 0x0, 0x64, 0, false, false},
|
||||
"VFWSUBWF": {0x5, 0x0, 0x6c, 0, false, false},
|
||||
"VFWSUBWV": {0x1, 0x0, 0x6c, 0, false, false},
|
||||
"VIDV": {0x2, 0x11, 0x28, 19, false, false},
|
||||
"VIOTAM": {0x2, 0x10, 0x28, 3, false, false},
|
||||
"VMACCVV": {0x2, 0x0, 0x5a, 1, false, false},
|
||||
"VMACCVX": {0x6, 0x0, 0x5a, 1, false, false},
|
||||
"VMADCVI": {0x3, 0x0, 0x23, 11, true, false},
|
||||
"VMADCVIM": {0x3, 0x0, 0x22, 10, true, false},
|
||||
"VMADCVV": {0x0, 0x0, 0x23, 11, false, false},
|
||||
"VMADCVVM": {0x0, 0x0, 0x22, 10, false, false},
|
||||
"VMADCVX": {0x4, 0x0, 0x23, 11, false, false},
|
||||
"VMADCVXM": {0x4, 0x0, 0x22, 10, false, false},
|
||||
"VMADDVV": {0x2, 0x0, 0x52, 1, false, false},
|
||||
"VMADDVX": {0x6, 0x0, 0x52, 1, false, false},
|
||||
"VMANDMM": {0x2, 0x0, 0x33, 17, false, false},
|
||||
"VMANDNMM": {0x2, 0x0, 0x31, 17, false, false},
|
||||
"VMAXUVV": {0x0, 0x0, 0x0c, 0, false, false},
|
||||
"VMAXUVX": {0x4, 0x0, 0x0c, 0, false, false},
|
||||
"VMAXVV": {0x0, 0x0, 0x0e, 0, false, false},
|
||||
"VMAXVX": {0x4, 0x0, 0x0e, 0, false, false},
|
||||
"VMCLRM": {0x2, 0x0, 0x37, 18, false, false},
|
||||
"VMERGEVIM": {0x3, 0x0, 0x2e, 10, true, false},
|
||||
"VMERGEVVM": {0x0, 0x0, 0x2e, 10, false, false},
|
||||
"VMERGEVXM": {0x4, 0x0, 0x2e, 10, false, false},
|
||||
"VMFEQVF": {0x5, 0x0, 0x30, 0, false, false},
|
||||
"VMFEQVV": {0x1, 0x0, 0x30, 0, false, false},
|
||||
"VMFGEVF": {0x5, 0x0, 0x3e, 0, false, false},
|
||||
"VMFGEVV": {0x1, 0x0, 0x32, 14, false, false},
|
||||
"VMFGTVF": {0x5, 0x0, 0x3a, 0, false, false},
|
||||
"VMFGTVV": {0x1, 0x0, 0x36, 14, false, false},
|
||||
"VMFLEVF": {0x5, 0x0, 0x32, 0, false, false},
|
||||
"VMFLEVV": {0x1, 0x0, 0x32, 0, false, false},
|
||||
"VMFLTVF": {0x5, 0x0, 0x36, 0, false, false},
|
||||
"VMFLTVV": {0x1, 0x0, 0x36, 0, false, false},
|
||||
"VMFNEVF": {0x5, 0x0, 0x38, 0, false, false},
|
||||
"VMFNEVV": {0x1, 0x0, 0x38, 0, false, false},
|
||||
"VMINUVV": {0x0, 0x0, 0x08, 0, false, false},
|
||||
"VMINUVX": {0x4, 0x0, 0x08, 0, false, false},
|
||||
"VMINVV": {0x0, 0x0, 0x0a, 0, false, false},
|
||||
"VMINVX": {0x4, 0x0, 0x0a, 0, false, false},
|
||||
"VMMVM": {0x2, 0x0, 0x33, 17, false, false},
|
||||
"VMNANDMM": {0x2, 0x0, 0x3b, 17, false, false},
|
||||
"VMNORMM": {0x2, 0x0, 0x3d, 17, false, false},
|
||||
"VMNOTM": {0x2, 0x0, 0x3b, 17, false, false},
|
||||
"VMORMM": {0x2, 0x0, 0x35, 17, false, false},
|
||||
"VMORNMM": {0x2, 0x0, 0x39, 17, false, false},
|
||||
"VMSBCVV": {0x0, 0x0, 0x27, 11, false, false},
|
||||
"VMSBCVVM": {0x0, 0x0, 0x26, 10, false, false},
|
||||
"VMSBCVX": {0x4, 0x0, 0x27, 11, false, false},
|
||||
"VMSBCVXM": {0x4, 0x0, 0x26, 10, false, false},
|
||||
"VMSBFM": {0x2, 0x1, 0x28, 3, false, false},
|
||||
"VMSEQVI": {0x3, 0x0, 0x30, 0, true, false},
|
||||
"VMSEQVV": {0x0, 0x0, 0x30, 0, false, false},
|
||||
"VMSEQVX": {0x4, 0x0, 0x30, 0, false, false},
|
||||
"VMSETM": {0x2, 0x0, 0x3f, 18, false, false},
|
||||
"VMSGEUVI": {0x3, 0x0, 0x3c, 15, true, false},
|
||||
"VMSGEUVV": {0x0, 0x0, 0x38, 14, false, false},
|
||||
"VMSGEVI": {0x3, 0x0, 0x3e, 15, true, false},
|
||||
"VMSGEVV": {0x0, 0x0, 0x3a, 14, false, false},
|
||||
"VMSGTUVI": {0x3, 0x0, 0x3c, 0, true, false},
|
||||
"VMSGTUVV": {0x0, 0x0, 0x34, 14, false, false},
|
||||
"VMSGTUVX": {0x4, 0x0, 0x3c, 0, false, false},
|
||||
"VMSGTVI": {0x3, 0x0, 0x3e, 0, true, false},
|
||||
"VMSGTVV": {0x0, 0x0, 0x36, 14, false, false},
|
||||
"VMSGTVX": {0x4, 0x0, 0x3e, 0, false, false},
|
||||
"VMSIFM": {0x2, 0x3, 0x28, 3, false, false},
|
||||
"VMSLEUVI": {0x3, 0x0, 0x38, 0, true, false},
|
||||
"VMSLEUVV": {0x0, 0x0, 0x38, 0, false, false},
|
||||
"VMSLEUVX": {0x4, 0x0, 0x38, 0, false, false},
|
||||
"VMSLEVI": {0x3, 0x0, 0x3a, 0, true, false},
|
||||
"VMSLEVV": {0x0, 0x0, 0x3a, 0, false, false},
|
||||
"VMSLEVX": {0x4, 0x0, 0x3a, 0, false, false},
|
||||
"VMSLTUVI": {0x3, 0x0, 0x38, 15, true, false},
|
||||
"VMSLTUVV": {0x0, 0x0, 0x34, 0, false, false},
|
||||
"VMSLTUVX": {0x4, 0x0, 0x34, 0, false, false},
|
||||
"VMSLTVI": {0x3, 0x0, 0x3a, 15, true, false},
|
||||
"VMSLTVV": {0x0, 0x0, 0x36, 0, false, false},
|
||||
"VMSLTVX": {0x4, 0x0, 0x36, 0, false, false},
|
||||
"VMSNEVI": {0x3, 0x0, 0x32, 0, true, false},
|
||||
"VMSNEVV": {0x0, 0x0, 0x32, 0, false, false},
|
||||
"VMSNEVX": {0x4, 0x0, 0x32, 0, false, false},
|
||||
"VMSOFM": {0x2, 0x2, 0x28, 3, false, false},
|
||||
"VMULHSUVV": {0x2, 0x0, 0x4c, 0, false, false},
|
||||
"VMULHSUVX": {0x6, 0x0, 0x4c, 0, false, false},
|
||||
"VMULHUVV": {0x2, 0x0, 0x48, 0, false, false},
|
||||
"VMULHUVX": {0x6, 0x0, 0x48, 0, false, false},
|
||||
"VMULHVV": {0x2, 0x0, 0x4e, 0, false, false},
|
||||
"VMULHVX": {0x6, 0x0, 0x4e, 0, false, false},
|
||||
"VMULVV": {0x2, 0x0, 0x4a, 0, false, false},
|
||||
"VMULVX": {0x6, 0x0, 0x4a, 0, false, false},
|
||||
"VMV1RV": {0x3, 0x0, 0x4f, 7, false, false},
|
||||
"VMV2RV": {0x3, 0x1, 0x4f, 7, false, false},
|
||||
"VMV4RV": {0x3, 0x3, 0x4f, 7, false, false},
|
||||
"VMV8RV": {0x3, 0x7, 0x4f, 7, false, false},
|
||||
"VMVSX": {0x6, 0x0, 0x21, 8, false, false},
|
||||
"VMVVI": {0x3, 0x0, 0x2f, 5, true, false},
|
||||
"VMVVV": {0x0, 0x0, 0x2f, 4, false, false},
|
||||
"VMVVX": {0x4, 0x0, 0x2f, 4, false, false},
|
||||
"VMVXS": {0x2, 0x0, 0x21, 7, false, false},
|
||||
"VMXNORMM": {0x2, 0x0, 0x3f, 17, false, false},
|
||||
"VMXORMM": {0x2, 0x0, 0x37, 17, false, false},
|
||||
"VNCLIPUWI": {0x3, 0x0, 0x5c, 0, true, true},
|
||||
"VNCLIPUWV": {0x0, 0x0, 0x5c, 0, false, false},
|
||||
"VNCLIPUWX": {0x4, 0x0, 0x5c, 0, false, false},
|
||||
"VNCLIPWI": {0x3, 0x0, 0x5e, 0, true, true},
|
||||
"VNCLIPWV": {0x0, 0x0, 0x5e, 0, false, false},
|
||||
"VNCLIPWX": {0x4, 0x0, 0x5e, 0, false, false},
|
||||
"VNCVTXXW": {0x4, 0x0, 0x58, 12, false, false},
|
||||
"VNEGV": {0x4, 0x0, 0x06, 12, false, false},
|
||||
"VNMSACVV": {0x2, 0x0, 0x5e, 1, false, false},
|
||||
"VNMSACVX": {0x6, 0x0, 0x5e, 1, false, false},
|
||||
"VNMSUBVV": {0x2, 0x0, 0x56, 1, false, false},
|
||||
"VNMSUBVX": {0x6, 0x0, 0x56, 1, false, false},
|
||||
"VNOTV": {0x3, 0x0, 0x16, 13, true, false},
|
||||
"VNSRAWI": {0x3, 0x0, 0x5a, 0, true, true},
|
||||
"VNSRAWV": {0x0, 0x0, 0x5a, 0, false, false},
|
||||
"VNSRAWX": {0x4, 0x0, 0x5a, 0, false, false},
|
||||
"VNSRLWI": {0x3, 0x0, 0x58, 0, true, true},
|
||||
"VNSRLWV": {0x0, 0x0, 0x58, 0, false, false},
|
||||
"VNSRLWX": {0x4, 0x0, 0x58, 0, false, false},
|
||||
"VORVI": {0x3, 0x0, 0x14, 0, true, false},
|
||||
"VORVV": {0x0, 0x0, 0x14, 0, false, false},
|
||||
"VORVX": {0x4, 0x0, 0x14, 0, false, false},
|
||||
"VREDANDVS": {0x2, 0x0, 0x02, 0, false, false},
|
||||
"VREDMAXUVS": {0x2, 0x0, 0x0c, 0, false, false},
|
||||
"VREDMAXVS": {0x2, 0x0, 0x0e, 0, false, false},
|
||||
"VREDMINUVS": {0x2, 0x0, 0x08, 0, false, false},
|
||||
"VREDMINVS": {0x2, 0x0, 0x0a, 0, false, false},
|
||||
"VREDORVS": {0x2, 0x0, 0x04, 0, false, false},
|
||||
"VREDSUMVS": {0x2, 0x0, 0x00, 0, false, false},
|
||||
"VREDXORVS": {0x2, 0x0, 0x06, 0, false, false},
|
||||
"VREMUVV": {0x2, 0x0, 0x44, 0, false, false},
|
||||
"VREMUVX": {0x6, 0x0, 0x44, 0, false, false},
|
||||
"VREMVV": {0x2, 0x0, 0x46, 0, false, false},
|
||||
"VREMVX": {0x6, 0x0, 0x46, 0, false, false},
|
||||
"VREV8V": {0x2, 0x9, 0x24, 2, false, false},
|
||||
"VRGATHEREI16VV": {0x0, 0x0, 0x1c, 0, false, false},
|
||||
"VRGATHERVI": {0x3, 0x0, 0x18, 0, true, true},
|
||||
"VRGATHERVV": {0x0, 0x0, 0x18, 0, false, false},
|
||||
"VRGATHERVX": {0x4, 0x0, 0x18, 0, false, false},
|
||||
"VROLVV": {0x0, 0x0, 0x2a, 0, false, false},
|
||||
"VROLVX": {0x4, 0x0, 0x2a, 0, false, false},
|
||||
"VRORVI": {0x3, 0x0, 0x28, 0, true, true},
|
||||
"VRORVV": {0x0, 0x0, 0x28, 0, false, false},
|
||||
"VRORVX": {0x4, 0x0, 0x28, 0, false, false},
|
||||
"VRSUBVI": {0x3, 0x0, 0x06, 0, true, false},
|
||||
"VRSUBVX": {0x4, 0x0, 0x06, 0, false, false},
|
||||
"VSADDUVI": {0x3, 0x0, 0x40, 0, true, false},
|
||||
"VSADDUVV": {0x0, 0x0, 0x40, 0, false, false},
|
||||
"VSADDUVX": {0x4, 0x0, 0x40, 0, false, false},
|
||||
"VSADDVI": {0x3, 0x0, 0x42, 0, true, false},
|
||||
"VSADDVV": {0x0, 0x0, 0x42, 0, false, false},
|
||||
"VSADDVX": {0x4, 0x0, 0x42, 0, false, false},
|
||||
"VSBCVVM": {0x0, 0x0, 0x24, 9, false, false},
|
||||
"VSBCVXM": {0x4, 0x0, 0x24, 9, false, false},
|
||||
"VSEXTVF2": {0x2, 0x7, 0x24, 2, false, false},
|
||||
"VSEXTVF4": {0x2, 0x5, 0x24, 2, false, false},
|
||||
"VSEXTVF8": {0x2, 0x3, 0x24, 2, false, false},
|
||||
"VSLIDE1DOWNVX": {0x6, 0x0, 0x1e, 0, false, false},
|
||||
"VSLIDE1UPVX": {0x6, 0x0, 0x1c, 0, false, false},
|
||||
"VSLIDEDOWNVI": {0x3, 0x0, 0x1e, 0, true, true},
|
||||
"VSLIDEDOWNVX": {0x4, 0x0, 0x1e, 0, false, false},
|
||||
"VSLIDEUPVI": {0x3, 0x0, 0x1c, 0, true, true},
|
||||
"VSLIDEUPVX": {0x4, 0x0, 0x1c, 0, false, false},
|
||||
"VSLLVI": {0x3, 0x0, 0x4a, 0, true, true},
|
||||
"VSLLVV": {0x0, 0x0, 0x4a, 0, false, false},
|
||||
"VSLLVX": {0x4, 0x0, 0x4a, 0, false, false},
|
||||
"VSMULVV": {0x0, 0x0, 0x4e, 0, false, false},
|
||||
"VSMULVX": {0x4, 0x0, 0x4e, 0, false, false},
|
||||
"VSRAVI": {0x3, 0x0, 0x52, 0, true, true},
|
||||
"VSRAVV": {0x0, 0x0, 0x52, 0, false, false},
|
||||
"VSRAVX": {0x4, 0x0, 0x52, 0, false, false},
|
||||
"VSRLVI": {0x3, 0x0, 0x50, 0, true, true},
|
||||
"VSRLVV": {0x0, 0x0, 0x50, 0, false, false},
|
||||
"VSRLVX": {0x4, 0x0, 0x50, 0, false, false},
|
||||
"VSSRAVI": {0x3, 0x0, 0x56, 0, true, true},
|
||||
"VSSRAVV": {0x0, 0x0, 0x56, 0, false, false},
|
||||
"VSSRAVX": {0x4, 0x0, 0x56, 0, false, false},
|
||||
"VSSRLVI": {0x3, 0x0, 0x54, 0, true, true},
|
||||
"VSSRLVV": {0x0, 0x0, 0x54, 0, false, false},
|
||||
"VSSRLVX": {0x4, 0x0, 0x54, 0, false, false},
|
||||
"VSSUBUVV": {0x0, 0x0, 0x44, 0, false, false},
|
||||
"VSSUBUVX": {0x4, 0x0, 0x44, 0, false, false},
|
||||
"VSSUBVV": {0x0, 0x0, 0x46, 0, false, false},
|
||||
"VSSUBVX": {0x4, 0x0, 0x46, 0, false, false},
|
||||
"VSUBVV": {0x0, 0x0, 0x04, 0, false, false},
|
||||
"VSUBVX": {0x4, 0x0, 0x04, 0, false, false},
|
||||
"VWADDUVV": {0x2, 0x0, 0x60, 0, false, false},
|
||||
"VWADDUVX": {0x6, 0x0, 0x60, 0, false, false},
|
||||
"VWADDUWV": {0x2, 0x0, 0x68, 0, false, false},
|
||||
"VWADDUWX": {0x6, 0x0, 0x68, 0, false, false},
|
||||
"VWADDVV": {0x2, 0x0, 0x62, 0, false, false},
|
||||
"VWADDVX": {0x6, 0x0, 0x62, 0, false, false},
|
||||
"VWADDWV": {0x2, 0x0, 0x6a, 0, false, false},
|
||||
"VWADDWX": {0x6, 0x0, 0x6a, 0, false, false},
|
||||
"VWCVTUXXV": {0x6, 0x0, 0x60, 12, false, false},
|
||||
"VWCVTXXV": {0x6, 0x0, 0x62, 12, false, false},
|
||||
"VWMACCSUVV": {0x2, 0x0, 0x7e, 1, false, false},
|
||||
"VWMACCSUVX": {0x6, 0x0, 0x7e, 1, false, false},
|
||||
"VWMACCUSVX": {0x6, 0x0, 0x7c, 1, false, false},
|
||||
"VWMACCUVV": {0x2, 0x0, 0x78, 1, false, false},
|
||||
"VWMACCUVX": {0x6, 0x0, 0x78, 1, false, false},
|
||||
"VWMACCVV": {0x2, 0x0, 0x7a, 1, false, false},
|
||||
"VWMACCVX": {0x6, 0x0, 0x7a, 1, false, false},
|
||||
"VWMULSUVV": {0x2, 0x0, 0x74, 0, false, false},
|
||||
"VWMULSUVX": {0x6, 0x0, 0x74, 0, false, false},
|
||||
"VWMULUVV": {0x2, 0x0, 0x70, 0, false, false},
|
||||
"VWMULUVX": {0x6, 0x0, 0x70, 0, false, false},
|
||||
"VWMULVV": {0x2, 0x0, 0x76, 0, false, false},
|
||||
"VWMULVX": {0x6, 0x0, 0x76, 0, false, false},
|
||||
"VWREDSUMUVS": {0x0, 0x0, 0x60, 0, false, false},
|
||||
"VWREDSUMVS": {0x0, 0x0, 0x62, 0, false, false},
|
||||
"VWSLLVI": {0x3, 0x0, 0x6a, 0, true, true},
|
||||
"VWSLLVV": {0x0, 0x0, 0x6a, 0, false, false},
|
||||
"VWSLLVX": {0x4, 0x0, 0x6a, 0, false, false},
|
||||
"VWSUBUVV": {0x2, 0x0, 0x64, 0, false, false},
|
||||
"VWSUBUVX": {0x6, 0x0, 0x64, 0, false, false},
|
||||
"VWSUBUWV": {0x2, 0x0, 0x6c, 0, false, false},
|
||||
"VWSUBUWX": {0x6, 0x0, 0x6c, 0, false, false},
|
||||
"VWSUBVV": {0x2, 0x0, 0x66, 0, false, false},
|
||||
"VWSUBVX": {0x6, 0x0, 0x66, 0, false, false},
|
||||
"VWSUBWV": {0x2, 0x0, 0x6e, 0, false, false},
|
||||
"VWSUBWX": {0x6, 0x0, 0x6e, 0, false, false},
|
||||
"VXORVI": {0x3, 0x0, 0x16, 0, true, false},
|
||||
"VXORVV": {0x0, 0x0, 0x16, 0, false, false},
|
||||
"VXORVX": {0x4, 0x0, 0x16, 0, false, false},
|
||||
"VZEXTVF2": {0x2, 0x6, 0x24, 2, false, false},
|
||||
"VZEXTVF4": {0x2, 0x4, 0x24, 2, false, false},
|
||||
"VZEXTVF8": {0x2, 0x2, 0x24, 2, false, false},
|
||||
}
|
||||
|
||||
// ---- RVC (compressed) encoding helpers ----
|
||||
|
||||
// isRVCIntReg reports whether a register number can be encoded in the 3-bit
|
||||
|
||||
Reference in new issue
Block a user