@@ -284,32 +284,32 @@ defm SHRX64: ShiftX<"shrx", Xi64>, XD;
284
284
defm SHLX32: ShiftX<"shlx", Xi32>, PD;
285
285
defm SHLX64: ShiftX<"shlx", Xi64>, PD;
286
286
287
- multiclass RORX_Pats {
287
+ multiclass RORX_Pats<string suffix> {
288
288
// Prefer RORX which is non-destructive and doesn't update EFLAGS.
289
289
let AddedComplexity = 10 in {
290
290
def : Pat<(rotr GR32:$src, (i8 imm:$shamt)),
291
- (RORX32ri GR32:$src, imm:$shamt)>;
291
+ (!cast<Instruction>( RORX32ri#suffix) GR32:$src, imm:$shamt)>;
292
292
def : Pat<(rotr GR64:$src, (i8 imm:$shamt)),
293
- (RORX64ri GR64:$src, imm:$shamt)>;
293
+ (!cast<Instruction>( RORX64ri#suffix) GR64:$src, imm:$shamt)>;
294
294
295
295
def : Pat<(rotl GR32:$src, (i8 imm:$shamt)),
296
- (RORX32ri GR32:$src, (ROT32L2R_imm8 imm:$shamt))>;
296
+ (!cast<Instruction>( RORX32ri#suffix) GR32:$src, (ROT32L2R_imm8 imm:$shamt))>;
297
297
def : Pat<(rotl GR64:$src, (i8 imm:$shamt)),
298
- (RORX64ri GR64:$src, (ROT64L2R_imm8 imm:$shamt))>;
298
+ (!cast<Instruction>( RORX64ri#suffix) GR64:$src, (ROT64L2R_imm8 imm:$shamt))>;
299
299
}
300
300
301
301
def : Pat<(rotr (loadi32 addr:$src), (i8 imm:$shamt)),
302
- (RORX32mi addr:$src, imm:$shamt)>;
302
+ (!cast<Instruction>( RORX32mi#suffix) addr:$src, imm:$shamt)>;
303
303
def : Pat<(rotr (loadi64 addr:$src), (i8 imm:$shamt)),
304
- (RORX64mi addr:$src, imm:$shamt)>;
304
+ (!cast<Instruction>( RORX64mi#suffix) addr:$src, imm:$shamt)>;
305
305
306
306
def : Pat<(rotl (loadi32 addr:$src), (i8 imm:$shamt)),
307
- (RORX32mi addr:$src, (ROT32L2R_imm8 imm:$shamt))>;
307
+ (!cast<Instruction>( RORX32mi#suffix) addr:$src, (ROT32L2R_imm8 imm:$shamt))>;
308
308
def : Pat<(rotl (loadi64 addr:$src), (i8 imm:$shamt)),
309
- (RORX64mi addr:$src, (ROT64L2R_imm8 imm:$shamt))>;
309
+ (!cast<Instruction>( RORX64mi#suffix) addr:$src, (ROT64L2R_imm8 imm:$shamt))>;
310
310
}
311
311
312
- multiclass ShiftX_Pats<SDNode op> {
312
+ multiclass ShiftX_Pats<SDNode op, string suffix = "" > {
313
313
// Prefer SARX/SHRX/SHLX over SAR/SHR/SHL with variable shift BUT not
314
314
// immediate shift, i.e. the following code is considered better
315
315
//
@@ -325,16 +325,16 @@ multiclass ShiftX_Pats<SDNode op> {
325
325
//
326
326
let AddedComplexity = 1 in {
327
327
def : Pat<(op GR32:$src1, GR8:$src2),
328
- (!cast<Instruction>(NAME#"32rr") GR32:$src1,
328
+ (!cast<Instruction>(NAME#"32rr"#suffix ) GR32:$src1,
329
329
(INSERT_SUBREG (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
330
330
def : Pat<(op GR64:$src1, GR8:$src2),
331
- (!cast<Instruction>(NAME#"64rr") GR64:$src1,
331
+ (!cast<Instruction>(NAME#"64rr"#suffix ) GR64:$src1,
332
332
(INSERT_SUBREG (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
333
333
def : Pat<(op GR32:$src1, (shiftMask32 GR8:$src2)),
334
- (!cast<Instruction>(NAME#"32rr") GR32:$src1,
334
+ (!cast<Instruction>(NAME#"32rr"#suffix ) GR32:$src1,
335
335
(INSERT_SUBREG (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
336
336
def : Pat<(op GR64:$src1, (shiftMask64 GR8:$src2)),
337
- (!cast<Instruction>(NAME#"64rr") GR64:$src1,
337
+ (!cast<Instruction>(NAME#"64rr"#suffix ) GR64:$src1,
338
338
(INSERT_SUBREG (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
339
339
}
340
340
// We prefer to use
@@ -348,33 +348,29 @@ multiclass ShiftX_Pats<SDNode op> {
348
348
//
349
349
// This priority is enforced by IsProfitableToFoldLoad.
350
350
def : Pat<(op (loadi32 addr:$src1), GR8:$src2),
351
- <<<<<<< HEAD
352
- (!cast<Instruction>(NAME#"32rm") addr:$src1,
351
+ (!cast<Instruction>(NAME#"32rm"#suffix) addr:$src1,
353
352
(INSERT_SUBREG (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
354
353
def : Pat<(op (loadi64 addr:$src1), GR8:$src2),
355
- (!cast<Instruction>(NAME#"64rm") addr:$src1,
354
+ (!cast<Instruction>(NAME#"64rm"#suffix ) addr:$src1,
356
355
(INSERT_SUBREG (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
357
356
def : Pat<(op (loadi32 addr:$src1), (shiftMask32 GR8:$src2)),
358
- (!cast<Instruction>(NAME#"32rm") addr:$src1,
357
+ (!cast<Instruction>(NAME#"32rm"#suffix ) addr:$src1,
359
358
(INSERT_SUBREG (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
360
359
def : Pat<(op (loadi64 addr:$src1), (shiftMask64 GR8:$src2)),
361
- (!cast<Instruction>(NAME#"64rm") addr:$src1,
360
+ (!cast<Instruction>(NAME#"64rm"#suffix) addr:$src1,
361
+ (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
362
362
}
363
363
364
- let Predicates = [HasBMI2] in {
365
- defm : RORX_Pats;
364
+ let Predicates = [HasBMI2, NoEGPR ] in {
365
+ defm : RORX_Pats<""> ;
366
366
defm SARX : ShiftX_Pats<sra>;
367
367
defm SHRX : ShiftX_Pats<srl>;
368
368
defm SHLX : ShiftX_Pats<shl>;
369
369
}
370
- =======
371
- (!cast<Instruction>(NAME#"32rm"#suffix) addr:$src1,
372
- (INSERT_SUBREG
373
- (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
374
- def : Pat<(op (loadi64 addr:$src1), GR8:$src2),
375
- (!cast<Instruction>(NAME#"64rm"#suffix) addr:$src1,
376
- (INSERT_SUBREG
377
- (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
378
- }
379
370
380
- multiclass RORX_Pats<string suffix> {
371
+ let Predicates = [HasBMI2, HasEGPR] in {
372
+ defm : RORX_Pats<"_EVEX">;
373
+ defm SARX : ShiftX_Pats<sra, "_EVEX">;
374
+ defm SHRX : ShiftX_Pats<srl, "_EVEX">;
375
+ defm SHLX : ShiftX_Pats<shl, "_EVEX">;
376
+ }
0 commit comments