]> granicus.if.org Git - llvm/commitdiff
[X86][SSE] Merged sse2_unpack and sse2_unpack PUNPCK instruction templates. NFCI.
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Wed, 29 Nov 2017 12:12:27 +0000 (12:12 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Wed, 29 Nov 2017 12:12:27 +0000 (12:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319310 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86InstrSSE.td

index 17e728e02a3fcd6a3dd222fd16311b85aceea45b..f74a92afca9c0b5d00f7019e1f159dbcffdc17f9 100644 (file)
@@ -4048,102 +4048,100 @@ def SSE_PUNPCK : OpndItins<
 
 let ExeDomain = SSEPackedInt in {
 multiclass sse2_unpack<bits<8> opc, string OpcodeStr, ValueType vt,
-                       SDNode OpNode, OpndItins itins, PatFrag ld_frag,
-                       bit Is2Addr = 1> {
+                       SDNode OpNode, RegisterClass RC, X86MemOperand x86memop,
+                       OpndItins itins, PatFrag ld_frag, bit Is2Addr = 1> {
   def rr : PDI<opc, MRMSrcReg,
-      (outs VR128:$dst), (ins VR128:$src1, VR128:$src2),
+      (outs RC:$dst), (ins RC:$src1, RC:$src2),
       !if(Is2Addr,
           !strconcat(OpcodeStr,"\t{$src2, $dst|$dst, $src2}"),
           !strconcat(OpcodeStr,"\t{$src2, $src1, $dst|$dst, $src1, $src2}")),
-      [(set VR128:$dst, (vt (OpNode VR128:$src1, VR128:$src2)))],
+      [(set RC:$dst, (vt (OpNode RC:$src1, RC:$src2)))],
       itins.rr>, Sched<[itins.Sched]>;
   def rm : PDI<opc, MRMSrcMem,
-      (outs VR128:$dst), (ins VR128:$src1, i128mem:$src2),
+      (outs RC:$dst), (ins RC:$src1, x86memop:$src2),
       !if(Is2Addr,
           !strconcat(OpcodeStr,"\t{$src2, $dst|$dst, $src2}"),
           !strconcat(OpcodeStr,"\t{$src2, $src1, $dst|$dst, $src1, $src2}")),
-      [(set VR128:$dst, (vt (OpNode VR128:$src1,
+      [(set RC:$dst, (vt (OpNode RC:$src1,
                                   (bitconvert (ld_frag addr:$src2)))))],
                                                itins.rm>,
       Sched<[itins.Sched.Folded, ReadAfterLd]>;
 }
 
-multiclass sse2_unpack_y<bits<8> opc, string OpcodeStr, ValueType vt,
-                         SDNode OpNode, OpndItins itins> {
-  def Yrr : PDI<opc, MRMSrcReg,
-      (outs VR256:$dst), (ins VR256:$src1, VR256:$src2),
-      !strconcat(OpcodeStr,"\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
-      [(set VR256:$dst, (vt (OpNode VR256:$src1, VR256:$src2)))],
-      itins.rr>, Sched<[itins.Sched]>;
-  def Yrm : PDI<opc, MRMSrcMem,
-      (outs VR256:$dst), (ins VR256:$src1, i256mem:$src2),
-      !strconcat(OpcodeStr,"\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
-      [(set VR256:$dst, (vt (OpNode VR256:$src1,
-                                  (bitconvert (loadv4i64 addr:$src2)))))],
-      itins.rm>, Sched<[itins.Sched.Folded, ReadAfterLd]>;
-}
-
-
 let Predicates = [HasAVX, NoVLX_Or_NoBWI] in {
-  defm VPUNPCKLBW  : sse2_unpack<0x60, "vpunpcklbw", v16i8, X86Unpckl,
-                                 SSE_PUNPCK, loadv2i64, 0>, VEX_4V, VEX_WIG;
-  defm VPUNPCKLWD  : sse2_unpack<0x61, "vpunpcklwd", v8i16, X86Unpckl,
-                                 SSE_PUNPCK, loadv2i64, 0>, VEX_4V, VEX_WIG;
-  defm VPUNPCKHBW  : sse2_unpack<0x68, "vpunpckhbw", v16i8, X86Unpckh,
-                                 SSE_PUNPCK, loadv2i64, 0>, VEX_4V, VEX_WIG;
-  defm VPUNPCKHWD  : sse2_unpack<0x69, "vpunpckhwd", v8i16, X86Unpckh,
-                                 SSE_PUNPCK, loadv2i64, 0>, VEX_4V, VEX_WIG;
+  defm VPUNPCKLBW  : sse2_unpack<0x60, "vpunpcklbw", v16i8, X86Unpckl, VR128,
+                                 i128mem, SSE_PUNPCK, loadv2i64, 0>, VEX_4V, VEX_WIG;
+  defm VPUNPCKLWD  : sse2_unpack<0x61, "vpunpcklwd", v8i16, X86Unpckl, VR128,
+                                 i128mem, SSE_PUNPCK, loadv2i64, 0>, VEX_4V, VEX_WIG;
+  defm VPUNPCKHBW  : sse2_unpack<0x68, "vpunpckhbw", v16i8, X86Unpckh, VR128,
+                                 i128mem, SSE_PUNPCK, loadv2i64, 0>, VEX_4V, VEX_WIG;
+  defm VPUNPCKHWD  : sse2_unpack<0x69, "vpunpckhwd", v8i16, X86Unpckh, VR128,
+                                 i128mem, SSE_PUNPCK, loadv2i64, 0>, VEX_4V, VEX_WIG;
 }
+
 let Predicates = [HasAVX, NoVLX] in {
-  defm VPUNPCKLDQ  : sse2_unpack<0x62, "vpunpckldq", v4i32, X86Unpckl,
-                                 SSE_PUNPCK, loadv2i64, 0>, VEX_4V, VEX_WIG;
-  defm VPUNPCKLQDQ : sse2_unpack<0x6C, "vpunpcklqdq", v2i64, X86Unpckl,
-                                 SSE_PUNPCK, loadv2i64, 0>, VEX_4V, VEX_WIG;
-  defm VPUNPCKHDQ  : sse2_unpack<0x6A, "vpunpckhdq", v4i32, X86Unpckh,
-                                 SSE_PUNPCK, loadv2i64, 0>, VEX_4V, VEX_WIG;
-  defm VPUNPCKHQDQ : sse2_unpack<0x6D, "vpunpckhqdq", v2i64, X86Unpckh,
-                                 SSE_PUNPCK, loadv2i64, 0>, VEX_4V, VEX_WIG;
+  defm VPUNPCKLDQ  : sse2_unpack<0x62, "vpunpckldq", v4i32, X86Unpckl, VR128,
+                                 i128mem, SSE_PUNPCK, loadv2i64, 0>,
+                                 VEX_4V, VEX_WIG;
+  defm VPUNPCKLQDQ : sse2_unpack<0x6C, "vpunpcklqdq", v2i64, X86Unpckl, VR128,
+                                 i128mem, SSE_PUNPCK, loadv2i64, 0>,
+                                 VEX_4V, VEX_WIG;
+  defm VPUNPCKHDQ  : sse2_unpack<0x6A, "vpunpckhdq", v4i32, X86Unpckh, VR128,
+                                 i128mem, SSE_PUNPCK, loadv2i64, 0>,
+                                 VEX_4V, VEX_WIG;
+  defm VPUNPCKHQDQ : sse2_unpack<0x6D, "vpunpckhqdq", v2i64, X86Unpckh, VR128,
+                                 i128mem, SSE_PUNPCK, loadv2i64, 0>,
+                                 VEX_4V, VEX_WIG;
 }
 
 let Predicates = [HasAVX2, NoVLX_Or_NoBWI] in {
-  defm VPUNPCKLBW  : sse2_unpack_y<0x60, "vpunpcklbw", v32i8, X86Unpckl, SSE_PUNPCK>,
-                                   VEX_4V, VEX_L, VEX_WIG;
-  defm VPUNPCKLWD  : sse2_unpack_y<0x61, "vpunpcklwd", v16i16, X86Unpckl, SSE_PUNPCK>,
-                                   VEX_4V, VEX_L, VEX_WIG;
-  defm VPUNPCKHBW  : sse2_unpack_y<0x68, "vpunpckhbw", v32i8, X86Unpckh, SSE_PUNPCK>,
-                                   VEX_4V, VEX_L, VEX_WIG;
-  defm VPUNPCKHWD  : sse2_unpack_y<0x69, "vpunpckhwd", v16i16, X86Unpckh, SSE_PUNPCK>,
-                                   VEX_4V, VEX_L, VEX_WIG;
+  defm VPUNPCKLBWY  : sse2_unpack<0x60, "vpunpcklbw", v32i8, X86Unpckl, VR256,
+                                  i256mem, SSE_PUNPCK, loadv4i64, 0>,
+                                  VEX_4V, VEX_L, VEX_WIG;
+  defm VPUNPCKLWDY  : sse2_unpack<0x61, "vpunpcklwd", v16i16, X86Unpckl, VR256,
+                                  i256mem, SSE_PUNPCK, loadv4i64, 0>,
+                                  VEX_4V, VEX_L, VEX_WIG;
+  defm VPUNPCKHBWY  : sse2_unpack<0x68, "vpunpckhbw", v32i8, X86Unpckh, VR256,
+                                  i256mem, SSE_PUNPCK, loadv4i64, 0>,
+                                  VEX_4V, VEX_L, VEX_WIG;
+  defm VPUNPCKHWDY  : sse2_unpack<0x69, "vpunpckhwd", v16i16, X86Unpckh, VR256,
+                                  i256mem, SSE_PUNPCK, loadv4i64, 0>,
+                                  VEX_4V, VEX_L, VEX_WIG;
 }
+
 let Predicates = [HasAVX2, NoVLX] in {
-  defm VPUNPCKLDQ  : sse2_unpack_y<0x62, "vpunpckldq", v8i32, X86Unpckl, SSE_PUNPCK>,
-                                   VEX_4V, VEX_L, VEX_WIG;
-  defm VPUNPCKLQDQ : sse2_unpack_y<0x6C, "vpunpcklqdq", v4i64, X86Unpckl, SSE_PUNPCK>,
-                                   VEX_4V, VEX_L, VEX_WIG;
-  defm VPUNPCKHDQ  : sse2_unpack_y<0x6A, "vpunpckhdq", v8i32, X86Unpckh, SSE_PUNPCK>,
-                                   VEX_4V, VEX_L, VEX_WIG;
-  defm VPUNPCKHQDQ : sse2_unpack_y<0x6D, "vpunpckhqdq", v4i64, X86Unpckh, SSE_PUNPCK>,
-                                   VEX_4V, VEX_L, VEX_WIG;
+  defm VPUNPCKLDQY  : sse2_unpack<0x62, "vpunpckldq", v8i32, X86Unpckl, VR256,
+                                  i256mem, SSE_PUNPCK, loadv4i64, 0>,
+                                  VEX_4V, VEX_L, VEX_WIG;
+  defm VPUNPCKLQDQY : sse2_unpack<0x6C, "vpunpcklqdq", v4i64, X86Unpckl, VR256,
+                                  i256mem, SSE_PUNPCK, loadv4i64, 0>,
+                                  VEX_4V, VEX_L, VEX_WIG;
+  defm VPUNPCKHDQY  : sse2_unpack<0x6A, "vpunpckhdq", v8i32, X86Unpckh, VR256,
+                                  i256mem, SSE_PUNPCK, loadv4i64, 0>,
+                                  VEX_4V, VEX_L, VEX_WIG;
+  defm VPUNPCKHQDQY : sse2_unpack<0x6D, "vpunpckhqdq", v4i64, X86Unpckh, VR256,
+                                  i256mem, SSE_PUNPCK, loadv4i64, 0>,
+                                  VEX_4V, VEX_L, VEX_WIG;
 }
 
 let Constraints = "$src1 = $dst" in {
-  defm PUNPCKLBW  : sse2_unpack<0x60, "punpcklbw", v16i8, X86Unpckl, SSE_PUNPCK,
-                                memopv2i64>;
-  defm PUNPCKLWD  : sse2_unpack<0x61, "punpcklwd", v8i16, X86Unpckl, SSE_PUNPCK,
-                                memopv2i64>;
-  defm PUNPCKLDQ  : sse2_unpack<0x62, "punpckldq", v4i32, X86Unpckl, SSE_PUNPCK,
-                                memopv2i64>;
-  defm PUNPCKLQDQ : sse2_unpack<0x6C, "punpcklqdq", v2i64, X86Unpckl, SSE_PUNPCK,
-                                memopv2i64>;
-
-  defm PUNPCKHBW  : sse2_unpack<0x68, "punpckhbw", v16i8, X86Unpckh, SSE_PUNPCK,
-                                memopv2i64>;
-  defm PUNPCKHWD  : sse2_unpack<0x69, "punpckhwd", v8i16, X86Unpckh, SSE_PUNPCK,
-                                memopv2i64>;
-  defm PUNPCKHDQ  : sse2_unpack<0x6A, "punpckhdq", v4i32, X86Unpckh, SSE_PUNPCK,
-                                memopv2i64>;
-  defm PUNPCKHQDQ : sse2_unpack<0x6D, "punpckhqdq", v2i64, X86Unpckh, SSE_PUNPCK,
-                                memopv2i64>;
+  defm PUNPCKLBW  : sse2_unpack<0x60, "punpcklbw", v16i8, X86Unpckl, VR128,
+                                i128mem, SSE_PUNPCK, memopv2i64>;
+  defm PUNPCKLWD  : sse2_unpack<0x61, "punpcklwd", v8i16, X86Unpckl, VR128,
+                                i128mem, SSE_PUNPCK, memopv2i64>;
+  defm PUNPCKLDQ  : sse2_unpack<0x62, "punpckldq", v4i32, X86Unpckl, VR128,
+                                i128mem, SSE_PUNPCK, memopv2i64>;
+  defm PUNPCKLQDQ : sse2_unpack<0x6C, "punpcklqdq", v2i64, X86Unpckl, VR128,
+                                i128mem, SSE_PUNPCK, memopv2i64>;
+
+  defm PUNPCKHBW  : sse2_unpack<0x68, "punpckhbw", v16i8, X86Unpckh, VR128,
+                                i128mem, SSE_PUNPCK, memopv2i64>;
+  defm PUNPCKHWD  : sse2_unpack<0x69, "punpckhwd", v8i16, X86Unpckh, VR128,
+                                i128mem, SSE_PUNPCK, memopv2i64>;
+  defm PUNPCKHDQ  : sse2_unpack<0x6A, "punpckhdq", v4i32, X86Unpckh, VR128,
+                                i128mem, SSE_PUNPCK, memopv2i64>;
+  defm PUNPCKHQDQ : sse2_unpack<0x6D, "punpckhqdq", v2i64, X86Unpckh, VR128,
+                                i128mem, SSE_PUNPCK, memopv2i64>;
 }
 } // ExeDomain = SSEPackedInt