Skip to content

Commit 074a25f

Browse files
authored
[RISCV][MC] Create an AsmOperand for carry-in vmask (#124317)
Previously we used a fixed assembly string as well as encoding for the carry-in vector mask, since it will always be there. However, this makes both AsmParser and disassembler to either create a garbage MCOperand for the mask or fail to add one as a whole. This wouldn't be a problem for majority of the cases but tools like llvm-mca who relies on MCInst will fail to account for the register dependency on these mask operands.
1 parent d398c0c commit 074a25f

File tree

5 files changed

+172
-15
lines changed

5 files changed

+172
-15
lines changed

llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1681,6 +1681,10 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
16811681
SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc();
16821682
return Error(ErrorLoc, "operand must be v0.t");
16831683
}
1684+
case Match_InvalidVMaskCarryInRegister: {
1685+
SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc();
1686+
return Error(ErrorLoc, "operand must be v0");
1687+
}
16841688
case Match_InvalidSImm5Plus1: {
16851689
return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 4) + 1,
16861690
(1 << 4),

llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,16 @@ static DecodeStatus DecodeVRM8RegisterClass(MCInst &Inst, uint32_t RegNo,
297297
return MCDisassembler::Success;
298298
}
299299

300+
static DecodeStatus DecodeVMV0RegisterClass(MCInst &Inst, uint32_t RegNo,
301+
uint64_t Address,
302+
const MCDisassembler *Decoder) {
303+
if (RegNo)
304+
return MCDisassembler::Fail;
305+
306+
Inst.addOperand(MCOperand::createReg(RISCV::V0));
307+
return MCDisassembler::Success;
308+
}
309+
300310
static DecodeStatus decodeVMaskReg(MCInst &Inst, uint32_t RegNo,
301311
uint64_t Address,
302312
const MCDisassembler *Decoder) {

llvm/lib/Target/RISCV/RISCVInstrInfoV.td

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,25 @@ def VMaskAsmOperand : AsmOperandClass {
5050
let DiagnosticType = "InvalidVMaskRegister";
5151
}
5252

53+
def VMaskCarryInAsmOperand : AsmOperandClass {
54+
let Name = "RVVMaskCarryInRegOpOperand";
55+
let RenderMethod = "addRegOperands";
56+
let PredicateMethod = "isV0Reg";
57+
let DiagnosticType = "InvalidVMaskCarryInRegister";
58+
}
59+
5360
def VMaskOp : RegisterOperand<VMV0> {
5461
let ParserMatchClass = VMaskAsmOperand;
5562
let PrintMethod = "printVMaskReg";
5663
let EncoderMethod = "getVMaskReg";
5764
let DecoderMethod = "decodeVMaskReg";
5865
}
5966

67+
def VMaskCarryInOp : RegisterOperand<VMV0> {
68+
let ParserMatchClass = VMaskCarryInAsmOperand;
69+
let EncoderMethod = "getVMaskReg";
70+
}
71+
6072
def simm5 : RISCVSImmLeafOp<5> {
6173
let MCOperandPredicate = [{
6274
int64_t Imm;
@@ -442,10 +454,8 @@ class VALUVV<bits<6> funct6, RISCVVFormat opv, string opcodestr>
442454
// op vd, vs2, vs1, v0 (without mask, use v0 as carry input)
443455
class VALUmVV<bits<6> funct6, RISCVVFormat opv, string opcodestr>
444456
: RVInstVV<funct6, opv, (outs VR:$vd),
445-
(ins VR:$vs2, VR:$vs1, VMV0:$v0),
446-
opcodestr, "$vd, $vs2, $vs1, v0"> {
447-
let vm = 0;
448-
}
457+
(ins VR:$vs2, VR:$vs1, VMaskCarryInOp:$vm),
458+
opcodestr, "$vd, $vs2, $vs1, $vm">;
449459

450460
// op vd, vs1, vs2, vm (reverse the order of vs1 and vs2)
451461
class VALUrVV<bits<6> funct6, RISCVVFormat opv, string opcodestr,
@@ -474,10 +484,8 @@ class VALUVX<bits<6> funct6, RISCVVFormat opv, string opcodestr>
474484
// op vd, vs2, rs1, v0 (without mask, use v0 as carry input)
475485
class VALUmVX<bits<6> funct6, RISCVVFormat opv, string opcodestr>
476486
: RVInstVX<funct6, opv, (outs VR:$vd),
477-
(ins VR:$vs2, GPR:$rs1, VMV0:$v0),
478-
opcodestr, "$vd, $vs2, $rs1, v0"> {
479-
let vm = 0;
480-
}
487+
(ins VR:$vs2, GPR:$rs1, VMaskCarryInOp:$vm),
488+
opcodestr, "$vd, $vs2, $rs1, $vm">;
481489

482490
// op vd, rs1, vs2, vm (reverse the order of rs1 and vs2)
483491
class VALUrVX<bits<6> funct6, RISCVVFormat opv, string opcodestr,
@@ -506,10 +514,8 @@ class VALUVI<bits<6> funct6, string opcodestr, Operand optype = simm5>
506514
// op vd, vs2, imm, v0 (without mask, use v0 as carry input)
507515
class VALUmVI<bits<6> funct6, string opcodestr, Operand optype = simm5>
508516
: RVInstIVI<funct6, (outs VR:$vd),
509-
(ins VR:$vs2, optype:$imm, VMV0:$v0),
510-
opcodestr, "$vd, $vs2, $imm, v0"> {
511-
let vm = 0;
512-
}
517+
(ins VR:$vs2, optype:$imm, VMaskCarryInOp:$vm),
518+
opcodestr, "$vd, $vs2, $imm, $vm">;
513519

514520
// op vd, vs2, imm, vm
515521
class VALUVINoVm<bits<6> funct6, string opcodestr, Operand optype = simm5>
@@ -1458,10 +1464,9 @@ defm VFCLASS_V : VCLS_FV_VS2<"vfclass.v", 0b010011, 0b10000>;
14581464
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
14591465

14601466
// Vector Floating-Point Merge Instruction
1461-
let vm = 0 in
14621467
def VFMERGE_VFM : RVInstVX<0b010111, OPFVF, (outs VR:$vd),
1463-
(ins VR:$vs2, FPR32:$rs1, VMV0:$v0),
1464-
"vfmerge.vfm", "$vd, $vs2, $rs1, v0">,
1468+
(ins VR:$vs2, FPR32:$rs1, VMaskCarryInOp:$vm),
1469+
"vfmerge.vfm", "$vd, $vs2, $rs1, $vm">,
14651470
SchedBinaryMC<"WriteVFMergeV", "ReadVFMergeV", "ReadVFMergeF">;
14661471

14671472
// Vector Floating-Point Move Instruction
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# RUN: llvm-mc -triple=riscv64 -disassemble -show-inst --mattr=+v %s \
2+
# RUN: --M no-aliases | FileCheck %s
3+
4+
# Check if there is a MCOperand for the carry-in mask.
5+
6+
[0x57,0x04,0x4a,0x5c]
7+
# CHECK: <MCInst #{{[0-9]+}} VMERGE_VVM
8+
# CHECK-COUNT-4: MCOperand Reg
9+
10+
[0x57,0x44,0x45,0x5c]
11+
# CHECK: <MCInst #{{[0-9]+}} VMERGE_VXM
12+
# CHECK-COUNT-4: MCOperand Reg
13+
14+
[0x57,0xb4,0x47,0x5c]
15+
# CHECK: <MCInst #{{[0-9]+}} VMERGE_VIM
16+
# CHECK-NEXT: MCOperand Reg
17+
# CHECK-NEXT: MCOperand Reg
18+
# CHECK-NEXT: MCOperand Imm
19+
# CHECK-NEXT: MCOperand Reg
20+
21+
[0x57,0x04,0x4a,0x40]
22+
# CHECK: <MCInst #{{[0-9]+}} VADC_VVM
23+
# CHECK-COUNT-4: MCOperand Reg
24+
25+
[0x57,0x44,0x45,0x40]
26+
# CHECK: <MCInst #{{[0-9]+}} VADC_VXM
27+
# CHECK-COUNT-4: MCOperand Reg
28+
29+
[0x57,0xb4,0x47,0x40]
30+
# CHECK: <MCInst #{{[0-9]+}} VADC_VIM
31+
# CHECK-NEXT: MCOperand Reg
32+
# CHECK-NEXT: MCOperand Reg
33+
# CHECK-NEXT: MCOperand Imm
34+
# CHECK-NEXT: MCOperand Reg
35+
36+
[0x57,0x04,0x4a,0x44]
37+
# CHECK: <MCInst #{{[0-9]+}} VMADC_VVM
38+
# CHECK-COUNT-4: MCOperand Reg
39+
40+
[0x57,0x44,0x45,0x44]
41+
# CHECK: <MCInst #{{[0-9]+}} VMADC_VXM
42+
# CHECK-COUNT-4: MCOperand Reg
43+
44+
[0x57,0xb4,0x47,0x44]
45+
# CHECK: <MCInst #{{[0-9]+}} VMADC_VIM
46+
# CHECK-NEXT: MCOperand Reg
47+
# CHECK-NEXT: MCOperand Reg
48+
# CHECK-NEXT: MCOperand Imm
49+
# CHECK-NEXT: MCOperand Reg
50+
51+
[0x57,0x04,0x4a,0x48]
52+
# CHECK: <MCInst #{{[0-9]+}} VSBC_VVM
53+
# CHECK-COUNT-4: MCOperand Reg
54+
55+
[0x57,0x44,0x45,0x48]
56+
# CHECK: <MCInst #{{[0-9]+}} VSBC_VXM
57+
# CHECK-COUNT-4: MCOperand Reg
58+
59+
[0x57,0x04,0x4a,0x4c]
60+
# CHECK: <MCInst #{{[0-9]+}} VMSBC_VVM
61+
# CHECK-COUNT-4: MCOperand Reg
62+
63+
[0x57,0x44,0x45,0x4c]
64+
# CHECK: <MCInst #{{[0-9]+}} VMSBC_VXM
65+
# CHECK-COUNT-4: MCOperand Reg
66+
67+
[0x57,0x54,0x45,0x5c]
68+
# CHECK: <MCInst #{{[0-9]+}} VFMERGE_VFM
69+
# CHECK-COUNT-4: MCOperand Reg
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# RUN: llvm-mc -triple=riscv64 -show-inst --mattr=+v %s \
2+
# RUN: --M no-aliases | FileCheck %s
3+
4+
# Check if there is a MCOperand for the carry-in mask.
5+
6+
vmerge.vvm v8, v4, v20, v0
7+
# CHECK: <MCInst #{{[0-9]+}} VMERGE_VVM
8+
# CHECK-COUNT-4: MCOperand Reg
9+
10+
vmerge.vxm v8, v4, a0, v0
11+
# CHECK: <MCInst #{{[0-9]+}} VMERGE_VXM
12+
# CHECK-COUNT-4: MCOperand Reg
13+
14+
vmerge.vim v8, v4, 15, v0
15+
# CHECK: <MCInst #{{[0-9]+}} VMERGE_VIM
16+
# CHECK-NEXT: MCOperand Reg
17+
# CHECK-NEXT: MCOperand Reg
18+
# CHECK-NEXT: MCOperand Imm
19+
# CHECK-NEXT: MCOperand Reg
20+
21+
vadc.vvm v8, v4, v20, v0
22+
# CHECK: <MCInst #{{[0-9]+}} VADC_VVM
23+
# CHECK-COUNT-4: MCOperand Reg
24+
25+
vadc.vxm v8, v4, a0, v0
26+
# CHECK: <MCInst #{{[0-9]+}} VADC_VXM
27+
# CHECK-COUNT-4: MCOperand Reg
28+
29+
vadc.vim v8, v4, 15, v0
30+
# CHECK: <MCInst #{{[0-9]+}} VADC_VIM
31+
# CHECK-NEXT: MCOperand Reg
32+
# CHECK-NEXT: MCOperand Reg
33+
# CHECK-NEXT: MCOperand Imm
34+
# CHECK-NEXT: MCOperand Reg
35+
36+
vmadc.vvm v8, v4, v20, v0
37+
# CHECK: <MCInst #{{[0-9]+}} VMADC_VVM
38+
# CHECK-COUNT-4: MCOperand Reg
39+
40+
vmadc.vxm v8, v4, a0, v0
41+
# CHECK: <MCInst #{{[0-9]+}} VMADC_VXM
42+
# CHECK-COUNT-4: MCOperand Reg
43+
44+
vmadc.vim v8, v4, 15, v0
45+
# CHECK: <MCInst #{{[0-9]+}} VMADC_VIM
46+
# CHECK-NEXT: MCOperand Reg
47+
# CHECK-NEXT: MCOperand Reg
48+
# CHECK-NEXT: MCOperand Imm
49+
# CHECK-NEXT: MCOperand Reg
50+
51+
vsbc.vvm v8, v4, v20, v0
52+
# CHECK: <MCInst #{{[0-9]+}} VSBC_VVM
53+
# CHECK-COUNT-4: MCOperand Reg
54+
55+
vsbc.vxm v8, v4, a0, v0
56+
# CHECK: <MCInst #{{[0-9]+}} VSBC_VXM
57+
# CHECK-COUNT-4: MCOperand Reg
58+
59+
vmsbc.vvm v8, v4, v20, v0
60+
# CHECK: <MCInst #{{[0-9]+}} VMSBC_VVM
61+
# CHECK-COUNT-4: MCOperand Reg
62+
63+
vmsbc.vxm v8, v4, a0, v0
64+
# CHECK: <MCInst #{{[0-9]+}} VMSBC_VXM
65+
# CHECK-COUNT-4: MCOperand Reg
66+
67+
vfmerge.vfm v8, v4, fa0, v0
68+
# CHECK: <MCInst #{{[0-9]+}} VFMERGE_VFM
69+
# CHECK-COUNT-4: MCOperand Reg

0 commit comments

Comments
 (0)