Skip to content

Commit 10bd555

Browse files
authored
[RISCV] Model vd as a src for some Zvk* instructions in MC layer. (#86710)
Some Zvk instructions use vd as a source regardless of tail policy. Model this in the MC layer. We already do this for FMA for example.
1 parent baf66ec commit 10bd555

File tree

2 files changed

+39
-21
lines changed

2 files changed

+39
-21
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoV.td

-8
Original file line numberDiff line numberDiff line change
@@ -531,14 +531,6 @@ class VALUVs2<bits<6> funct6, bits<5> vs1, RISCVVFormat opv, string opcodestr>
531531
: RVInstV<funct6, vs1, opv, (outs VR:$vd),
532532
(ins VR:$vs2, VMaskOp:$vm),
533533
opcodestr, "$vd, $vs2$vm">;
534-
535-
// op vd, vs2 (use vs1 as instruction encoding)
536-
class VALUVs2NoVm<bits<6> funct6, bits<5> vs1, RISCVVFormat opv, string opcodestr>
537-
: RVInstV<funct6, vs1, opv, (outs VR:$vd),
538-
(ins VR:$vs2), opcodestr,
539-
"$vd, $vs2"> {
540-
let vm = 1;
541-
}
542534
} // hasSideEffects = 0, mayLoad = 0, mayStore = 0
543535

544536
//===----------------------------------------------------------------------===//

llvm/lib/Target/RISCV/RISCVInstrInfoZvk.td

+39-13
Original file line numberDiff line numberDiff line change
@@ -67,25 +67,51 @@ class PALUVVNoVm<bits<6> funct6, RISCVVFormat opv, string opcodestr>
6767
let Inst{6-0} = OPC_OP_P.Value;
6868
}
6969

70+
// op vd, vs2, vs1
71+
class PALUVVNoVmTernary<bits<6> funct6, RISCVVFormat opv, string opcodestr>
72+
: RVInstVV<funct6, opv, (outs VR:$vd_wb),
73+
(ins VR:$vd, VR:$vs2, VR:$vs1),
74+
opcodestr, "$vd, $vs2, $vs1"> {
75+
let Constraints = "$vd = $vd_wb";
76+
let vm = 1;
77+
let Inst{6-0} = OPC_OP_P.Value;
78+
}
79+
7080
// op vd, vs2, imm
7181
class PALUVINoVm<bits<6> funct6, string opcodestr, Operand optype>
7282
: VALUVINoVm<funct6, opcodestr, optype> {
7383
let Inst{6-0} = OPC_OP_P.Value;
7484
let Inst{14-12} = OPMVV.Value;
7585
}
7686

77-
// op vd, vs2 (use vs1 as instruction encoding)
78-
class PALUVs2NoVm<bits<6> funct6, bits<5> vs1, RISCVVFormat opv, string opcodestr>
79-
: VALUVs2NoVm<funct6, vs1, opv, opcodestr> {
87+
// op vd, vs2, imm where vd is also a source regardless of tail policy
88+
class PALUVINoVmBinary<bits<6> funct6, string opcodestr, Operand optype>
89+
: RVInstIVI<funct6, (outs VR:$vd_wb),
90+
(ins VR:$vd, VR:$vs2, optype:$imm),
91+
opcodestr, "$vd, $vs2, $imm"> {
92+
let Constraints = "$vd = $vd_wb";
93+
let vm = 1;
94+
let Inst{6-0} = OPC_OP_P.Value;
95+
let Inst{14-12} = OPMVV.Value;
96+
}
97+
98+
// op vd, vs2 (use vs1 as instruction encoding) where vd is also a source
99+
// regardless of tail policy
100+
class PALUVs2NoVmBinary<bits<6> funct6, bits<5> vs1, RISCVVFormat opv,
101+
string opcodestr>
102+
: RVInstV<funct6, vs1, opv, (outs VR:$vd_wb), (ins VR:$vd, VR:$vs2),
103+
opcodestr, "$vd, $vs2"> {
104+
let Constraints = "$vd = $vd_wb";
105+
let vm = 1;
80106
let Inst{6-0} = OPC_OP_P.Value;
81107
}
82108

83109
multiclass VAES_MV_V_S<bits<6> funct6_vv, bits<6> funct6_vs, bits<5> vs1,
84110
RISCVVFormat opv, string opcodestr> {
85111
let RVVConstraint = NoConstraint in
86-
def NAME # _VV : PALUVs2NoVm<funct6_vv, vs1, opv, opcodestr # ".vv">;
112+
def NAME # _VV : PALUVs2NoVmBinary<funct6_vv, vs1, opv, opcodestr # ".vv">;
87113
let RVVConstraint = VS2Constraint in
88-
def NAME # _VS : PALUVs2NoVm<funct6_vs, vs1, opv, opcodestr # ".vs">;
114+
def NAME # _VS : PALUVs2NoVmBinary<funct6_vs, vs1, opv, opcodestr # ".vs">;
89115
}
90116
} // hasSideEffects = 0, mayLoad = 0, mayStore = 0
91117

@@ -116,14 +142,14 @@ let Predicates = [HasStdExtZvkb] in {
116142
} // Predicates = [HasStdExtZvkb]
117143

118144
let Predicates = [HasStdExtZvkg], RVVConstraint = NoConstraint in {
119-
def VGHSH_VV : PALUVVNoVm<0b101100, OPMVV, "vghsh.vv">;
120-
def VGMUL_VV : PALUVs2NoVm<0b101000, 0b10001, OPMVV, "vgmul.vv">;
145+
def VGHSH_VV : PALUVVNoVmTernary<0b101100, OPMVV, "vghsh.vv">;
146+
def VGMUL_VV : PALUVs2NoVmBinary<0b101000, 0b10001, OPMVV, "vgmul.vv">;
121147
} // Predicates = [HasStdExtZvkg]
122148

123149
let Predicates = [HasStdExtZvknhaOrZvknhb], RVVConstraint = Sha2Constraint in {
124-
def VSHA2CH_VV : PALUVVNoVm<0b101110, OPMVV, "vsha2ch.vv">;
125-
def VSHA2CL_VV : PALUVVNoVm<0b101111, OPMVV, "vsha2cl.vv">;
126-
def VSHA2MS_VV : PALUVVNoVm<0b101101, OPMVV, "vsha2ms.vv">;
150+
def VSHA2CH_VV : PALUVVNoVmTernary<0b101110, OPMVV, "vsha2ch.vv">;
151+
def VSHA2CL_VV : PALUVVNoVmTernary<0b101111, OPMVV, "vsha2cl.vv">;
152+
def VSHA2MS_VV : PALUVVNoVmTernary<0b101101, OPMVV, "vsha2ms.vv">;
127153
} // Predicates = [HasStdExtZvknhaOrZvknhb]
128154

129155
let Predicates = [HasStdExtZvkned]in {
@@ -132,9 +158,9 @@ let Predicates = [HasStdExtZvkned]in {
132158
defm VAESEF : VAES_MV_V_S<0b101000, 0b101001, 0b00011, OPMVV, "vaesef">;
133159
defm VAESEM : VAES_MV_V_S<0b101000, 0b101001, 0b00010, OPMVV, "vaesem">;
134160
def VAESKF1_VI : PALUVINoVm<0b100010, "vaeskf1.vi", uimm5>;
135-
def VAESKF2_VI : PALUVINoVm<0b101010, "vaeskf2.vi", uimm5>;
161+
def VAESKF2_VI : PALUVINoVmBinary<0b101010, "vaeskf2.vi", uimm5>;
136162
let RVVConstraint = VS2Constraint in
137-
def VAESZ_VS : PALUVs2NoVm<0b101001, 0b00111, OPMVV, "vaesz.vs">;
163+
def VAESZ_VS : PALUVs2NoVmBinary<0b101001, 0b00111, OPMVV, "vaesz.vs">;
138164
} // Predicates = [HasStdExtZvkned]
139165

140166
let Predicates = [HasStdExtZvksed] in {
@@ -144,7 +170,7 @@ let Predicates = [HasStdExtZvksed] in {
144170
} // Predicates = [HasStdExtZvksed]
145171

146172
let Predicates = [HasStdExtZvksh], RVVConstraint = VS2Constraint in {
147-
def VSM3C_VI : PALUVINoVm<0b101011, "vsm3c.vi", uimm5>;
173+
def VSM3C_VI : PALUVINoVmBinary<0b101011, "vsm3c.vi", uimm5>;
148174
def VSM3ME_VV : PALUVVNoVm<0b100000, OPMVV, "vsm3me.vv">;
149175
} // Predicates = [HasStdExtZvksh]
150176

0 commit comments

Comments
 (0)