Skip to content

Commit a5af348

Browse files
committed
[RISCV][MC] Create an AsmOperand for carry-in vmask
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 a2c683b commit a5af348

File tree

4 files changed

+163
-15
lines changed

4 files changed

+163
-15
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1671,6 +1671,10 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
16711671
SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc();
16721672
return Error(ErrorLoc, "operand must be v0.t");
16731673
}
1674+
case Match_InvalidVMaskCarryInRegister: {
1675+
SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc();
1676+
return Error(ErrorLoc, "operand must be v0");
1677+
}
16741678
case Match_InvalidSImm5Plus1: {
16751679
return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 4) + 1,
16761680
(1 << 4),

llvm/lib/Target/RISCV/RISCVInstrInfoV.td

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,26 @@ 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+
let DecoderMethod = "decodeVMaskReg";
71+
}
72+
6073
def simm5 : RISCVSImmLeafOp<5> {
6174
let MCOperandPredicate = [{
6275
int64_t Imm;
@@ -442,10 +455,8 @@ class VALUVV<bits<6> funct6, RISCVVFormat opv, string opcodestr>
442455
// op vd, vs2, vs1, v0 (without mask, use v0 as carry input)
443456
class VALUmVV<bits<6> funct6, RISCVVFormat opv, string opcodestr>
444457
: 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-
}
458+
(ins VR:$vs2, VR:$vs1, VMaskCarryInOp:$vm),
459+
opcodestr, "$vd, $vs2, $vs1, $vm">;
449460

450461
// op vd, vs1, vs2, vm (reverse the order of vs1 and vs2)
451462
class VALUrVV<bits<6> funct6, RISCVVFormat opv, string opcodestr,
@@ -474,10 +485,8 @@ class VALUVX<bits<6> funct6, RISCVVFormat opv, string opcodestr>
474485
// op vd, vs2, rs1, v0 (without mask, use v0 as carry input)
475486
class VALUmVX<bits<6> funct6, RISCVVFormat opv, string opcodestr>
476487
: 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-
}
488+
(ins VR:$vs2, GPR:$rs1, VMaskCarryInOp:$vm),
489+
opcodestr, "$vd, $vs2, $rs1, $vm">;
481490

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

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

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

14671473
// 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)