@@ -284,32 +284,32 @@ defm SHRX64: ShiftX<"shrx", Xi64>, XD;
284284defm SHLX32: ShiftX<"shlx", Xi32>, PD;
285285defm SHLX64: ShiftX<"shlx", Xi64>, PD;
286286
287- multiclass RORX_Pats {
287+ multiclass RORX_Pats<string suffix> {
288288 // Prefer RORX which is non-destructive and doesn't update EFLAGS.
289289 let AddedComplexity = 10 in {
290290 def : Pat<(rotr GR32:$src, (i8 imm:$shamt)),
291- (RORX32ri GR32:$src, imm:$shamt)>;
291+ (!cast<Instruction>( RORX32ri#suffix) GR32:$src, imm:$shamt)>;
292292 def : Pat<(rotr GR64:$src, (i8 imm:$shamt)),
293- (RORX64ri GR64:$src, imm:$shamt)>;
293+ (!cast<Instruction>( RORX64ri#suffix) GR64:$src, imm:$shamt)>;
294294
295295 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))>;
297297 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))>;
299299 }
300300
301301 def : Pat<(rotr (loadi32 addr:$src), (i8 imm:$shamt)),
302- (RORX32mi addr:$src, imm:$shamt)>;
302+ (!cast<Instruction>( RORX32mi#suffix) addr:$src, imm:$shamt)>;
303303 def : Pat<(rotr (loadi64 addr:$src), (i8 imm:$shamt)),
304- (RORX64mi addr:$src, imm:$shamt)>;
304+ (!cast<Instruction>( RORX64mi#suffix) addr:$src, imm:$shamt)>;
305305
306306 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))>;
308308 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))>;
310310}
311311
312- multiclass ShiftX_Pats<SDNode op> {
312+ multiclass ShiftX_Pats<SDNode op, string suffix = "" > {
313313 // Prefer SARX/SHRX/SHLX over SAR/SHR/SHL with variable shift BUT not
314314 // immediate shift, i.e. the following code is considered better
315315 //
@@ -325,16 +325,16 @@ multiclass ShiftX_Pats<SDNode op> {
325325 //
326326 let AddedComplexity = 1 in {
327327 def : Pat<(op GR32:$src1, GR8:$src2),
328- (!cast<Instruction>(NAME#"32rr") GR32:$src1,
328+ (!cast<Instruction>(NAME#"32rr"#suffix ) GR32:$src1,
329329 (INSERT_SUBREG (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
330330 def : Pat<(op GR64:$src1, GR8:$src2),
331- (!cast<Instruction>(NAME#"64rr") GR64:$src1,
331+ (!cast<Instruction>(NAME#"64rr"#suffix ) GR64:$src1,
332332 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
333333 def : Pat<(op GR32:$src1, (shiftMask32 GR8:$src2)),
334- (!cast<Instruction>(NAME#"32rr") GR32:$src1,
334+ (!cast<Instruction>(NAME#"32rr"#suffix ) GR32:$src1,
335335 (INSERT_SUBREG (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
336336 def : Pat<(op GR64:$src1, (shiftMask64 GR8:$src2)),
337- (!cast<Instruction>(NAME#"64rr") GR64:$src1,
337+ (!cast<Instruction>(NAME#"64rr"#suffix ) GR64:$src1,
338338 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
339339 }
340340 // We prefer to use
@@ -348,33 +348,29 @@ multiclass ShiftX_Pats<SDNode op> {
348348 //
349349 // This priority is enforced by IsProfitableToFoldLoad.
350350 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,
353352 (INSERT_SUBREG (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
354353 def : Pat<(op (loadi64 addr:$src1), GR8:$src2),
355- (!cast<Instruction>(NAME#"64rm") addr:$src1,
354+ (!cast<Instruction>(NAME#"64rm"#suffix ) addr:$src1,
356355 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
357356 def : Pat<(op (loadi32 addr:$src1), (shiftMask32 GR8:$src2)),
358- (!cast<Instruction>(NAME#"32rm") addr:$src1,
357+ (!cast<Instruction>(NAME#"32rm"#suffix ) addr:$src1,
359358 (INSERT_SUBREG (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
360359 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))>;
362362}
363363
364- let Predicates = [HasBMI2] in {
365- defm : RORX_Pats;
364+ let Predicates = [HasBMI2, NoEGPR ] in {
365+ defm : RORX_Pats<""> ;
366366 defm SARX : ShiftX_Pats<sra>;
367367 defm SHRX : ShiftX_Pats<srl>;
368368 defm SHLX : ShiftX_Pats<shl>;
369369}
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- }
379370
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