@@ -67,25 +67,51 @@ class PALUVVNoVm<bits<6> funct6, RISCVVFormat opv, string opcodestr>
67
67
let Inst{6-0} = OPC_OP_P.Value;
68
68
}
69
69
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
+
70
80
// op vd, vs2, imm
71
81
class PALUVINoVm<bits<6> funct6, string opcodestr, Operand optype>
72
82
: VALUVINoVm<funct6, opcodestr, optype> {
73
83
let Inst{6-0} = OPC_OP_P.Value;
74
84
let Inst{14-12} = OPMVV.Value;
75
85
}
76
86
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;
80
106
let Inst{6-0} = OPC_OP_P.Value;
81
107
}
82
108
83
109
multiclass VAES_MV_V_S<bits<6> funct6_vv, bits<6> funct6_vs, bits<5> vs1,
84
110
RISCVVFormat opv, string opcodestr> {
85
111
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">;
87
113
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">;
89
115
}
90
116
} // hasSideEffects = 0, mayLoad = 0, mayStore = 0
91
117
@@ -116,14 +142,14 @@ let Predicates = [HasStdExtZvkb] in {
116
142
} // Predicates = [HasStdExtZvkb]
117
143
118
144
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">;
121
147
} // Predicates = [HasStdExtZvkg]
122
148
123
149
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">;
127
153
} // Predicates = [HasStdExtZvknhaOrZvknhb]
128
154
129
155
let Predicates = [HasStdExtZvkned]in {
@@ -132,9 +158,9 @@ let Predicates = [HasStdExtZvkned]in {
132
158
defm VAESEF : VAES_MV_V_S<0b101000, 0b101001, 0b00011, OPMVV, "vaesef">;
133
159
defm VAESEM : VAES_MV_V_S<0b101000, 0b101001, 0b00010, OPMVV, "vaesem">;
134
160
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>;
136
162
let RVVConstraint = VS2Constraint in
137
- def VAESZ_VS : PALUVs2NoVm <0b101001, 0b00111, OPMVV, "vaesz.vs">;
163
+ def VAESZ_VS : PALUVs2NoVmBinary <0b101001, 0b00111, OPMVV, "vaesz.vs">;
138
164
} // Predicates = [HasStdExtZvkned]
139
165
140
166
let Predicates = [HasStdExtZvksed] in {
@@ -144,7 +170,7 @@ let Predicates = [HasStdExtZvksed] in {
144
170
} // Predicates = [HasStdExtZvksed]
145
171
146
172
let Predicates = [HasStdExtZvksh], RVVConstraint = VS2Constraint in {
147
- def VSM3C_VI : PALUVINoVm <0b101011, "vsm3c.vi", uimm5>;
173
+ def VSM3C_VI : PALUVINoVmBinary <0b101011, "vsm3c.vi", uimm5>;
148
174
def VSM3ME_VV : PALUVVNoVm<0b100000, OPMVV, "vsm3me.vv">;
149
175
} // Predicates = [HasStdExtZvksh]
150
176
0 commit comments