AVX: Add additional vbroadcast replacement sequences for integers.
authorNadav Rotem <nadav.rotem@intel.com>
Tue, 24 Apr 2012 18:09:59 +0000 (18:09 +0000)
committerNadav Rotem <nadav.rotem@intel.com>
Tue, 24 Apr 2012 18:09:59 +0000 (18:09 +0000)
Remove the v2f64 patterns because it does not match any vbroadcast
instruction.

llvm-svn: 155461

llvm/lib/Target/X86/X86InstrSSE.td

index 8cd00a9aa0ee163db3e635761d02d972ecddcfa4..aa3e08bd4dc537581c0252d8324ffda3551d3130 100644 (file)
@@ -7736,6 +7736,16 @@ let Predicates = [HasAVX2] in {
     def : Pat<(v4f64 (X86VBroadcast FR64:$src)),
               (VBROADCASTSDrr
               (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), FR64:$src, sub_sd))>;
+
+    def : Pat<(v4i32 (X86VBroadcast GR32:$src)),
+              (VBROADCASTSSrr
+              (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), GR32:$src, sub_ss))>;
+    def : Pat<(v8i32 (X86VBroadcast GR32:$src)),
+              (VBROADCASTSSYrr
+              (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), GR32:$src, sub_ss))>;
+    def : Pat<(v4i64 (X86VBroadcast GR64:$src)),
+              (VBROADCASTSDrr
+              (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), GR64:$src, sub_sd))>;
   }
 }
 
@@ -7758,9 +7768,6 @@ def : Pat<(v4i32 (X86VBroadcast (loadi32 addr:$src))),
   // is used by additional users, which prevents the pattern selection.
   let AddedComplexity = 20 in {
   // 128bit broadcasts:
-  def : Pat<(v2f64 (X86VBroadcast FR64:$src)),
-            (VPSHUFDri
-            (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), FR64:$src, sub_sd), 0)>;
   def : Pat<(v4f32 (X86VBroadcast FR32:$src)),
             (VPSHUFDri
             (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), FR32:$src, sub_ss), 0)>;
@@ -7780,6 +7787,26 @@ def : Pat<(v4i32 (X86VBroadcast (loadi32 addr:$src))),
               (VPSHUFDri
                 (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), FR64:$src, sub_sd),
               0), 1)>;
+
+  def : Pat<(v4i32 (X86VBroadcast GR32:$src)),
+            (VPSHUFDri
+            (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), GR32:$src, sub_ss), 0)>;
+  def : Pat<(v8i32 (X86VBroadcast GR32:$src)),
+            (VINSERTF128rr (INSERT_SUBREG (v8i32 (IMPLICIT_DEF)),
+              (VPSHUFDri
+                (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), GR32:$src, sub_ss), 0),
+                  sub_xmm),
+              (VPSHUFDri
+                (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), GR32:$src, sub_ss),
+               0), 1)>;
+  def : Pat<(v4i64 (X86VBroadcast GR64:$src)),
+            (VINSERTF128rr (INSERT_SUBREG (v4i64 (IMPLICIT_DEF)),
+              (VPSHUFDri
+                (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), GR64:$src, sub_sd), 0),
+                  sub_xmm),
+              (VPSHUFDri
+                (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), GR64:$src, sub_sd),
+              0), 1)>;
   }
 }