name := fmt.Sprintf("F%d", i-riscv.REG_F0)
register[name] = int16(i)
}
+ for i := riscv.REG_V0; i <= riscv.REG_V31; i++ {
+ name := fmt.Sprintf("V%d", i-riscv.REG_V0)
+ register[name] = int16(i)
+ }
// General registers with ABI names.
register["ZERO"] = riscv.REG_ZERO
REG_X30
REG_X31
- // FP register numberings.
+ // Floating Point register numberings.
REG_F0
REG_F1
REG_F2
REG_F30
REG_F31
+ // Vector register numberings.
+ REG_V0
+ REG_V1
+ REG_V2
+ REG_V3
+ REG_V4
+ REG_V5
+ REG_V6
+ REG_V7
+ REG_V8
+ REG_V9
+ REG_V10
+ REG_V11
+ REG_V12
+ REG_V13
+ REG_V14
+ REG_V15
+ REG_V16
+ REG_V17
+ REG_V18
+ REG_V19
+ REG_V20
+ REG_V21
+ REG_V22
+ REG_V23
+ REG_V24
+ REG_V25
+ REG_V26
+ REG_V27
+ REG_V28
+ REG_V29
+ REG_V30
+ REG_V31
+
// This marks the end of the register numbering.
REG_END
return fmt.Sprintf("X%d", r-REG_X0)
case REG_F0 <= r && r <= REG_F31:
return fmt.Sprintf("F%d", r-REG_F0)
+ case REG_V0 <= r && r <= REG_V31:
+ return fmt.Sprintf("V%d", r-REG_V0)
default:
return fmt.Sprintf("Rgok(%d)", r-obj.RBaseRISCV)
}
return regVal(r, REG_F0, REG_F31)
}
+// regV returns a vector register.
+func regV(r uint32) uint32 {
+ return regVal(r, REG_V0, REG_V31)
+}
+
// regAddr extracts a register from an Addr.
func regAddr(a obj.Addr, min, max uint32) uint32 {
if a.Type != obj.TYPE_REG {
wantReg(ctxt, ins, pos, "float", r, REG_F0, REG_F31)
}
+// wantVectorReg checks that r is a vector register.
+func wantVectorReg(ctxt *obj.Link, ins *instruction, pos string, r uint32) {
+ wantReg(ctxt, ins, pos, "vector", r, REG_V0, REG_V31)
+}
+
// wantEvenOffset checks that the offset is a multiple of two.
func wantEvenOffset(ctxt *obj.Link, ins *instruction, offset int64) {
if err := immEven(offset); err != nil {