@@ -184,52 +184,139 @@ def IMUL64rmi32 : IMulOpMI_R<Xi64, WriteIMul64Imm>;
184
184
//===----------------------------------------------------------------------===//
185
185
// INC and DEC Instructions
186
186
//
187
- class IncOpR_RF<X86TypeInfo t> : UnaryOpR_RF<0xFF, MRM0r, "inc", t, null_frag> {
187
+ class IncOpR_RF<X86TypeInfo t, bit ndd = 0 > : UnaryOpR_RF<0xFF, MRM0r, "inc", t, null_frag, ndd > {
188
188
let Pattern = [(set t.RegClass:$dst, EFLAGS,
189
189
(X86add_flag_nocf t.RegClass:$src1, 1))];
190
190
}
191
- class DecOpR_RF<X86TypeInfo t> : UnaryOpR_RF<0xFF, MRM1r, "dec", t, null_frag> {
191
+ class DecOpR_RF<X86TypeInfo t, bit ndd = 0 > : UnaryOpR_RF<0xFF, MRM1r, "dec", t, null_frag, ndd > {
192
192
let Pattern = [(set t.RegClass:$dst, EFLAGS,
193
193
(X86sub_flag_nocf t.RegClass:$src1, 1))];
194
194
}
195
- class IncOpM_M<X86TypeInfo t> : UnaryOpM_MF<0xFF, MRM0m, "inc", t, null_frag> {
195
+ class IncOpR_R<X86TypeInfo t, bit ndd = 0> : UnaryOpR_R<0xFF, MRM0r, "inc", t, null_frag, ndd>;
196
+ class DecOpR_R<X86TypeInfo t, bit ndd = 0> : UnaryOpR_R<0xFF, MRM1r, "dec", t, null_frag, ndd>;
197
+ class IncOpM_MF<X86TypeInfo t> : UnaryOpM_MF<0xFF, MRM0m, "inc", t, null_frag> {
196
198
let Pattern = [(store (add (t.LoadNode addr:$src1), 1), addr:$src1),
197
199
(implicit EFLAGS)];
198
200
}
199
- class DecOpM_M <X86TypeInfo t> : UnaryOpM_MF<0xFF, MRM1m, "dec", t, null_frag> {
201
+ class DecOpM_MF <X86TypeInfo t> : UnaryOpM_MF<0xFF, MRM1m, "dec", t, null_frag> {
200
202
let Pattern = [(store (add (t.LoadNode addr:$src1), -1), addr:$src1),
201
203
(implicit EFLAGS)];
202
204
}
205
+ class IncOpM_RF<X86TypeInfo t> : UnaryOpM_RF<0xFF, MRM0m, "inc", t, null_frag> {
206
+ let Pattern = [(set t.RegClass:$dst, EFLAGS, (add (t.LoadNode addr:$src1), 1))];
207
+ }
208
+ class DecOpM_RF<X86TypeInfo t> : UnaryOpM_RF<0xFF, MRM1m, "dec", t, null_frag> {
209
+ let Pattern = [(set t.RegClass:$dst, EFLAGS, (add (t.LoadNode addr:$src1), -1))];
210
+ }
211
+ class IncOpM_M<X86TypeInfo t> : UnaryOpM_M<0xFF, MRM0m, "inc", t, null_frag>;
212
+ class DecOpM_M<X86TypeInfo t> : UnaryOpM_M<0xFF, MRM1m, "dec", t, null_frag>;
213
+ class IncOpM_R<X86TypeInfo t> : UnaryOpM_R<0xFF, MRM0m, "inc", t, null_frag>;
214
+ class DecOpM_R<X86TypeInfo t> : UnaryOpM_R<0xFF, MRM1m, "dec", t, null_frag>;
215
+
203
216
// IncDec_Alt - Instructions like "inc reg" short forms.
204
217
// Short forms only valid in 32-bit mode. Selected during MCInst lowering.
205
218
class IncDec_Alt<bits<8> o, string m, X86TypeInfo t>
206
219
: UnaryOpR_RF<o, AddRegFrm, m, t, null_frag>, Requires<[Not64BitMode]>;
207
220
208
221
let isConvertibleToThreeAddress = 1 in {
209
- def INC16r_alt : IncDec_Alt<0x40, "inc", Xi16>, OpSize16;
210
- def INC32r_alt : IncDec_Alt<0x40, "inc", Xi32>, OpSize32;
211
- def DEC16r_alt : IncDec_Alt<0x48, "dec", Xi16>, OpSize16;
212
- def DEC32r_alt : IncDec_Alt<0x48, "dec", Xi32>, OpSize32;
213
- def INC8r : IncOpR_RF<Xi8>;
214
- def INC16r : IncOpR_RF<Xi16>, OpSize16;
215
- def INC32r : IncOpR_RF<Xi32>, OpSize32;
216
- def INC64r : IncOpR_RF<Xi64>;
217
- def DEC8r : DecOpR_RF<Xi8>;
218
- def DEC16r : DecOpR_RF<Xi16>, OpSize16;
219
- def DEC32r : DecOpR_RF<Xi32>, OpSize32;
220
- def DEC64r : DecOpR_RF<Xi64>;
222
+ def INC16r_alt : IncDec_Alt<0x40, "inc", Xi16>, OpSize16;
223
+ def INC32r_alt : IncDec_Alt<0x40, "inc", Xi32>, OpSize32;
224
+ def DEC16r_alt : IncDec_Alt<0x48, "dec", Xi16>, OpSize16;
225
+ def DEC32r_alt : IncDec_Alt<0x48, "dec", Xi32>, OpSize32;
226
+ let Predicates = [NoNDD] in {
227
+ def INC8r : IncOpR_RF<Xi8>;
228
+ def INC16r : IncOpR_RF<Xi16>, OpSize16;
229
+ def INC32r : IncOpR_RF<Xi32>, OpSize32;
230
+ def INC64r : IncOpR_RF<Xi64>;
231
+ def DEC8r : DecOpR_RF<Xi8>;
232
+ def DEC16r : DecOpR_RF<Xi16>, OpSize16;
233
+ def DEC32r : DecOpR_RF<Xi32>, OpSize32;
234
+ def DEC64r : DecOpR_RF<Xi64>;
235
+ }
236
+ let Predicates = [HasNDD, In64BitMode] in {
237
+ def INC8r_ND : IncOpR_RF<Xi8, 1>;
238
+ def INC16r_ND : IncOpR_RF<Xi16, 1>, PD;
239
+ def INC32r_ND : IncOpR_RF<Xi32, 1>;
240
+ def INC64r_ND : IncOpR_RF<Xi64, 1>;
241
+ def DEC8r_ND : DecOpR_RF<Xi8, 1>;
242
+ def DEC16r_ND : DecOpR_RF<Xi16, 1>, PD;
243
+ def DEC32r_ND : DecOpR_RF<Xi32, 1>;
244
+ def DEC64r_ND : DecOpR_RF<Xi64, 1>;
245
+ }
246
+ let Predicates = [In64BitMode], Pattern = [(null_frag)] in {
247
+ def INC8r_NF : IncOpR_R<Xi8>, NF;
248
+ def INC16r_NF : IncOpR_R<Xi16>, NF, PD;
249
+ def INC32r_NF : IncOpR_R<Xi32>, NF;
250
+ def INC64r_NF : IncOpR_R<Xi64>, NF;
251
+ def DEC8r_NF : DecOpR_R<Xi8>, NF;
252
+ def DEC16r_NF : DecOpR_R<Xi16>, NF, PD;
253
+ def DEC32r_NF : DecOpR_R<Xi32>, NF;
254
+ def DEC64r_NF : DecOpR_R<Xi64>, NF;
255
+ def INC8r_NF_ND : IncOpR_R<Xi8, 1>, NF;
256
+ def INC16r_NF_ND : IncOpR_R<Xi16, 1>, NF, PD;
257
+ def INC32r_NF_ND : IncOpR_R<Xi32, 1>, NF;
258
+ def INC64r_NF_ND : IncOpR_R<Xi64, 1>, NF;
259
+ def DEC8r_NF_ND : DecOpR_R<Xi8, 1>, NF;
260
+ def DEC16r_NF_ND : DecOpR_R<Xi16, 1>, NF, PD;
261
+ def DEC32r_NF_ND : DecOpR_R<Xi32, 1>, NF;
262
+ def DEC64r_NF_ND : DecOpR_R<Xi64, 1>, NF;
263
+ def INC8r_EVEX : IncOpR_RF<Xi8>, PL;
264
+ def INC16r_EVEX : IncOpR_RF<Xi16>, PL, PD;
265
+ def INC32r_EVEX : IncOpR_RF<Xi32>, PL;
266
+ def INC64r_EVEX : IncOpR_RF<Xi64>, PL;
267
+ def DEC8r_EVEX : DecOpR_RF<Xi8>, PL;
268
+ def DEC16r_EVEX : DecOpR_RF<Xi16>, PL, PD;
269
+ def DEC32r_EVEX : DecOpR_RF<Xi32>, PL;
270
+ def DEC64r_EVEX : DecOpR_RF<Xi64>, PL;
271
+ }
221
272
}
222
273
let Predicates = [UseIncDec] in {
223
- def INC8m : IncOpM_M <Xi8>;
224
- def INC16m : IncOpM_M <Xi16>, OpSize16;
225
- def INC32m : IncOpM_M <Xi32>, OpSize32;
226
- def DEC8m : DecOpM_M <Xi8>;
227
- def DEC16m : DecOpM_M <Xi16>, OpSize16;
228
- def DEC32m : DecOpM_M <Xi32>, OpSize32;
274
+ def INC8m : IncOpM_MF <Xi8>;
275
+ def INC16m : IncOpM_MF <Xi16>, OpSize16;
276
+ def INC32m : IncOpM_MF <Xi32>, OpSize32;
277
+ def DEC8m : DecOpM_MF <Xi8>;
278
+ def DEC16m : DecOpM_MF <Xi16>, OpSize16;
279
+ def DEC32m : DecOpM_MF <Xi32>, OpSize32;
229
280
}
230
281
let Predicates = [UseIncDec, In64BitMode] in {
231
- def INC64m : IncOpM_M<Xi64>;
232
- def DEC64m : DecOpM_M<Xi64>;
282
+ def INC64m : IncOpM_MF<Xi64>;
283
+ def DEC64m : DecOpM_MF<Xi64>;
284
+ }
285
+ let Predicates = [HasNDD, In64BitMode, UseIncDec] in {
286
+ def INC8m_ND : IncOpM_RF<Xi8>;
287
+ def INC16m_ND : IncOpM_RF<Xi16>, PD;
288
+ def INC32m_ND : IncOpM_RF<Xi32>;
289
+ def DEC8m_ND : DecOpM_RF<Xi8>;
290
+ def DEC16m_ND : DecOpM_RF<Xi16>, PD;
291
+ def DEC32m_ND : DecOpM_RF<Xi32>;
292
+ def INC64m_ND : IncOpM_RF<Xi64>;
293
+ def DEC64m_ND : DecOpM_RF<Xi64>;
294
+ }
295
+ let Predicates = [In64BitMode], Pattern = [(null_frag)] in {
296
+ def INC8m_NF : IncOpM_M<Xi8>, NF;
297
+ def INC16m_NF : IncOpM_M<Xi16>, NF, PD;
298
+ def INC32m_NF : IncOpM_M<Xi32>, NF;
299
+ def INC64m_NF : IncOpM_M<Xi64>, NF;
300
+ def DEC8m_NF : DecOpM_M<Xi8>, NF;
301
+ def DEC16m_NF : DecOpM_M<Xi16>, NF, PD;
302
+ def DEC32m_NF : DecOpM_M<Xi32>, NF;
303
+ def DEC64m_NF : DecOpM_M<Xi64>, NF;
304
+ def INC8m_NF_ND : IncOpM_R<Xi8>, NF;
305
+ def INC16m_NF_ND : IncOpM_R<Xi16>, NF, PD;
306
+ def INC32m_NF_ND : IncOpM_R<Xi32>, NF;
307
+ def INC64m_NF_ND : IncOpM_R<Xi64>, NF;
308
+ def DEC8m_NF_ND : DecOpM_R<Xi8>, NF;
309
+ def DEC16m_NF_ND : DecOpM_R<Xi16>, NF, PD;
310
+ def DEC32m_NF_ND : DecOpM_R<Xi32>, NF;
311
+ def DEC64m_NF_ND : DecOpM_R<Xi64>, NF;
312
+ def INC8m_EVEX : IncOpM_MF<Xi8>, PL;
313
+ def INC16m_EVEX : IncOpM_MF<Xi16>, PL, PD;
314
+ def INC32m_EVEX : IncOpM_MF<Xi32>, PL;
315
+ def INC64m_EVEX : IncOpM_MF<Xi64>, PL;
316
+ def DEC8m_EVEX : DecOpM_MF<Xi8>, PL;
317
+ def DEC16m_EVEX : DecOpM_MF<Xi16>, PL, PD;
318
+ def DEC32m_EVEX : DecOpM_MF<Xi32>, PL;
319
+ def DEC64m_EVEX : DecOpM_MF<Xi64>, PL;
233
320
}
234
321
235
322
//===----------------------------------------------------------------------===//
@@ -1119,14 +1206,34 @@ defm MULX64 : MulX<Xi64, WriteMULX64>, REX_W;
1119
1206
// We don't have patterns for these as there is no advantage over ADC for
1120
1207
// most code.
1121
1208
let Form = MRMSrcReg in {
1122
- def ADCX32rr : BinOpRRF_RF<0xF6, "adcx", Xi32, null_frag>, T8, PD;
1123
- def ADCX64rr : BinOpRRF_RF<0xF6, "adcx", Xi64, null_frag>, T8, PD;
1124
- def ADOX32rr : BinOpRRF_RF<0xF6, "adox", Xi32, null_frag>, T8, XS;
1125
- def ADOX64rr : BinOpRRF_RF<0xF6, "adox", Xi64, null_frag>, T8, XS;
1209
+ def ADCX32rr : BinOpRRF_RF<0xF6, "adcx", Xi32>, T8, PD;
1210
+ def ADCX64rr : BinOpRRF_RF<0xF6, "adcx", Xi64>, T8, PD;
1211
+ def ADOX32rr : BinOpRRF_RF<0xF6, "adox", Xi32>, T8, XS;
1212
+ def ADOX64rr : BinOpRRF_RF<0xF6, "adox", Xi64>, T8, XS;
1213
+ let Predicates =[In64BitMode] in {
1214
+ def ADCX32rr_EVEX : BinOpRRF_RF<0x66, "adcx", Xi32>, EVEX, T_MAP4, PD;
1215
+ def ADCX64rr_EVEX : BinOpRRF_RF<0x66, "adcx", Xi64>, EVEX, T_MAP4, PD;
1216
+ def ADOX32rr_EVEX : BinOpRRF_RF<0x66, "adox", Xi32>, EVEX, T_MAP4, XS;
1217
+ def ADOX64rr_EVEX : BinOpRRF_RF<0x66, "adox", Xi64>, EVEX, T_MAP4, XS;
1218
+ def ADCX32rr_ND : BinOpRRF_RF<0x66, "adcx", Xi32, null_frag, 1>, PD;
1219
+ def ADCX64rr_ND : BinOpRRF_RF<0x66, "adcx", Xi64, null_frag, 1>, PD;
1220
+ def ADOX32rr_ND : BinOpRRF_RF<0x66, "adox", Xi32, null_frag, 1>, XS;
1221
+ def ADOX64rr_ND : BinOpRRF_RF<0x66, "adox", Xi64, null_frag, 1>, XS;
1222
+ }
1126
1223
}
1127
1224
let Form = MRMSrcMem in {
1128
- def ADCX32rm : BinOpRMF_RF<0xF6, "adcx", Xi32, null_frag>, T8, PD;
1129
- def ADCX64rm : BinOpRMF_RF<0xF6, "adcx", Xi64, null_frag>, T8, PD;
1130
- def ADOX32rm : BinOpRMF_RF<0xF6, "adox", Xi32, null_frag>, T8, XS;
1131
- def ADOX64rm : BinOpRMF_RF<0xF6, "adox", Xi64, null_frag>, T8, XS;
1225
+ def ADCX32rm : BinOpRMF_RF<0xF6, "adcx", Xi32>, T8, PD;
1226
+ def ADCX64rm : BinOpRMF_RF<0xF6, "adcx", Xi64>, T8, PD;
1227
+ def ADOX32rm : BinOpRMF_RF<0xF6, "adox", Xi32>, T8, XS;
1228
+ def ADOX64rm : BinOpRMF_RF<0xF6, "adox", Xi64>, T8, XS;
1229
+ let Predicates =[In64BitMode] in {
1230
+ def ADCX32rm_EVEX : BinOpRMF_RF<0x66, "adcx", Xi32>, EVEX, T_MAP4, PD;
1231
+ def ADCX64rm_EVEX : BinOpRMF_RF<0x66, "adcx", Xi64>, EVEX, T_MAP4, PD;
1232
+ def ADOX32rm_EVEX : BinOpRMF_RF<0x66, "adox", Xi32>, EVEX, T_MAP4, XS;
1233
+ def ADOX64rm_EVEX : BinOpRMF_RF<0x66, "adox", Xi64>, EVEX, T_MAP4, XS;
1234
+ def ADCX32rm_ND : BinOpRMF_RF<0x66, "adcx", Xi32, null_frag, 1>, PD;
1235
+ def ADCX64rm_ND : BinOpRMF_RF<0x66, "adcx", Xi64, null_frag, 1>, PD;
1236
+ def ADOX32rm_ND : BinOpRMF_RF<0x66, "adox", Xi32, null_frag, 1>, XS;
1237
+ def ADOX64rm_ND : BinOpRMF_RF<0x66, "adox", Xi64, null_frag, 1>, XS;
1238
+ }
1132
1239
}
0 commit comments