[llvm] 86bc18a - [X86][NFC] Simplify the definitions of BMI shift/rotate instructions

Shengchen Kan via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 16 03:57:53 PST 2024


Author: Shengchen Kan
Date: 2024-01-16T19:53:57+08:00
New Revision: 86bc18ade8f335f03f607142311957129e156efc

URL: https://github.com/llvm/llvm-project/commit/86bc18ade8f335f03f607142311957129e156efc
DIFF: https://github.com/llvm/llvm-project/commit/86bc18ade8f335f03f607142311957129e156efc.diff

LOG: [X86][NFC] Simplify the definitions of BMI shift/rotate instructions

Added: 
    

Modified: 
    llvm/lib/Target/X86/X86InstrShiftRotate.td

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/X86InstrShiftRotate.td b/llvm/lib/Target/X86/X86InstrShiftRotate.td
index ce3f84773b730d..a87af5c680e18c 100644
--- a/llvm/lib/Target/X86/X86InstrShiftRotate.td
+++ b/llvm/lib/Target/X86/X86InstrShiftRotate.td
@@ -223,61 +223,67 @@ def ROT64L2R_imm8  : SDNodeXForm<imm, [{
 
 // NOTE: We use WriteShift for these rotates as they avoid the stalls
 // of many of the older x86 rotate instructions.
-multiclass bmi_rotate<string asm, RegisterClass RC, X86MemOperand x86memop,
-                      string Suffix = ""> {
-let hasSideEffects = 0 in {
-  def ri#Suffix : Ii8<0xF0, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, u8imm:$src2),
-                      !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), []>,
-                  TA, XD, VEX, Sched<[WriteShift]>;
-  let mayLoad = 1 in
-  def mi#Suffix : Ii8<0xF0, MRMSrcMem, (outs RC:$dst),
-                      (ins x86memop:$src1, u8imm:$src2),
-                      !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), []>,
-                  TA, XD, VEX, Sched<[WriteShiftLd]>;
+class RorXri<X86TypeInfo t>
+  : ITy<0xF0, MRMSrcReg, t, (outs t.RegClass:$dst), (ins t.RegClass:$src1, u8imm:$src2),
+        "rorx", binop_ndd_args, []>, TA, XD, Sched<[WriteShift]> {
+  let ImmT = Imm8;
 }
+class RorXmi<X86TypeInfo t>
+  : ITy<0xF0, MRMSrcMem, t, (outs t.RegClass:$dst), (ins t.MemOperand:$src1, u8imm:$src2),
+        "rorx", binop_ndd_args, []>, TA, XD, Sched<[WriteShiftLd]> {
+  let ImmT = Imm8;
+  let mayLoad = 1;
 }
 
-multiclass bmi_shift<string asm, RegisterClass RC, X86MemOperand x86memop,
-                     string Suffix = ""> {
-let hasSideEffects = 0 in {
-  def rr#Suffix : I<0xF7, MRMSrcReg4VOp3, (outs RC:$dst), (ins RC:$src1, RC:$src2),
-                    !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), []>,
-                    VEX, Sched<[WriteShift]>;
-  let mayLoad = 1 in
-  def rm#Suffix : I<0xF7, MRMSrcMem4VOp3,
-                    (outs RC:$dst), (ins x86memop:$src1, RC:$src2),
-                    !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), []>,
-                  VEX, Sched<[WriteShift.Folded,
-                              // x86memop:$src1
-                              ReadDefault, ReadDefault, ReadDefault, ReadDefault,
-                              ReadDefault,
-                              // RC:$src2
-                              WriteShift.ReadAfterFold]>;
-}
+multiclass RorX<X86TypeInfo t> {
+  let Predicates = [HasBMI2, NoEGPR] in {
+    def ri : RorXri<t>, VEX;
+    def mi : RorXmi<t>, VEX;
+  }
+  let Predicates = [HasBMI2, HasEGPR, In64BitMode] in {
+    def ri_EVEX : RorXri<t>, EVEX;
+    def mi_EVEX : RorXmi<t>, EVEX;
+  }
 }
 
-let Predicates = [HasBMI2, NoEGPR] in {
-  defm RORX32 : bmi_rotate<"rorx{l}", GR32, i32mem>;
-  defm RORX64 : bmi_rotate<"rorx{q}", GR64, i64mem>, REX_W;
-  defm SARX32 : bmi_shift<"sarx{l}", GR32, i32mem>, T8, XS;
-  defm SARX64 : bmi_shift<"sarx{q}", GR64, i64mem>, T8, XS, REX_W;
-  defm SHRX32 : bmi_shift<"shrx{l}", GR32, i32mem>, T8, XD;
-  defm SHRX64 : bmi_shift<"shrx{q}", GR64, i64mem>, T8, XD, REX_W;
-  defm SHLX32 : bmi_shift<"shlx{l}", GR32, i32mem>, T8, PD;
-  defm SHLX64 : bmi_shift<"shlx{q}", GR64, i64mem>, T8, PD, REX_W;
+defm RORX32: RorX<Xi32>;
+defm RORX64: RorX<Xi64>;
+
+class ShiftXrr<string m, X86TypeInfo t>
+  : ITy<0xF7, MRMSrcReg4VOp3, t, (outs t.RegClass:$dst), (ins t.RegClass:$src1, t.RegClass:$src2),
+        m, binop_ndd_args, []>, T8, Sched<[WriteShift]>;
+
+class ShiftXrm<string m, X86TypeInfo t>
+  : ITy<0xF7, MRMSrcMem4VOp3, t, (outs t.RegClass:$dst), (ins t.MemOperand:$src1, t.RegClass:$src2),
+        m, binop_ndd_args, []>, T8,
+    Sched<[WriteShift.Folded,
+           // x86memop:$src1
+           ReadDefault, ReadDefault, ReadDefault, ReadDefault,
+           ReadDefault,
+           // RC:$src2
+           WriteShift.ReadAfterFold]> {
+  let mayLoad = 1;
 }
 
-let Predicates = [HasBMI2, HasEGPR, In64BitMode] in {
-  defm RORX32 : bmi_rotate<"rorx{l}", GR32, i32mem, "_EVEX">, EVEX;
-  defm RORX64 : bmi_rotate<"rorx{q}", GR64, i64mem, "_EVEX">, REX_W, EVEX;
-  defm SARX32 : bmi_shift<"sarx{l}", GR32, i32mem, "_EVEX">, T8, XS, EVEX;
-  defm SARX64 : bmi_shift<"sarx{q}", GR64, i64mem, "_EVEX">, T8, XS, REX_W, EVEX;
-  defm SHRX32 : bmi_shift<"shrx{l}", GR32, i32mem, "_EVEX">, T8, XD, EVEX;
-  defm SHRX64 : bmi_shift<"shrx{q}", GR64, i64mem, "_EVEX">, T8, XD, REX_W, EVEX;
-  defm SHLX32 : bmi_shift<"shlx{l}", GR32, i32mem, "_EVEX">, T8, PD, EVEX;
-  defm SHLX64 : bmi_shift<"shlx{q}", GR64, i64mem, "_EVEX">, T8, PD, REX_W, EVEX;
+
+multiclass ShiftX<string m, X86TypeInfo t> {
+  let Predicates = [HasBMI2, NoEGPR] in {
+    def rr : ShiftXrr<m, t>, VEX;
+    def rm : ShiftXrm<m, t>, VEX;
+  }
+  let Predicates = [HasBMI2, HasEGPR, In64BitMode] in {
+    def rr_EVEX : ShiftXrr<m, t>, EVEX;
+    def rm_EVEX : ShiftXrm<m, t>, EVEX;
+  }
 }
 
+defm SARX32: ShiftX<"sarx", Xi32>, XS;
+defm SARX64: ShiftX<"sarx", Xi64>, XS;
+defm SHRX32: ShiftX<"shrx", Xi32>, XD;
+defm SHRX64: ShiftX<"shrx", Xi64>, XD;
+defm SHLX32: ShiftX<"shlx", Xi32>, PD;
+defm SHLX64: ShiftX<"shlx", Xi64>, PD;
+
 let Predicates = [HasBMI2] in {
   // Prefer RORX which is non-destructive and doesn't update EFLAGS.
   let AddedComplexity = 10 in {


        


More information about the llvm-commits mailing list