]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386: Implement mmx_pblendv to optimize SSE conditional moves [PR98218]
authorUros Bizjak <ubizjak@gmail.com>
Fri, 7 May 2021 15:14:34 +0000 (17:14 +0200)
committerUros Bizjak <ubizjak@gmail.com>
Fri, 7 May 2021 15:15:26 +0000 (17:15 +0200)
Implement mmx_pblendv to optimize V8HI, V4HI and V2SI mode
conditional moves for SSE4.1 targets.

2021-05-07  Uroš Bizjak  <ubizjak@gmail.com>

gcc/
PR target/98218
* config/i386/i386-expand.c (ix86_expand_sse_movcc):
Handle V8QI, V4HI and V2SI modes.
* config/i386/mmx.md (mmx_pblendvb): New insn pattern.
* config/i386/sse.md (unspec): Move UNSPEC_BLENDV ...
* config/i386/i386.md (unspec): ... here.

gcc/config/i386/i386-expand.c
gcc/config/i386/i386.md
gcc/config/i386/mmx.md
gcc/config/i386/sse.md

index 61b2f921f4192cf441cc3fababe0ece6096e36f2..e9f11bca78a2e11ad8776b982ea56a77f3464f2b 100644 (file)
@@ -3702,6 +3702,19 @@ ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
          op_true = force_reg (mode, op_true);
        }
       break;
+    case E_V8QImode:
+    case E_V4HImode:
+    case E_V2SImode:
+      if (TARGET_SSE4_1)
+       {
+         gen = gen_mmx_pblendvb;
+         if (mode != V8QImode)
+           d = gen_reg_rtx (V8QImode);
+         op_false = gen_lowpart (V8QImode, op_false);
+         op_true = gen_lowpart (V8QImode, op_true);
+         cmp = gen_lowpart (V8QImode, cmp);
+       }
+      break;
     case E_V16QImode:
     case E_V8HImode:
     case E_V4SImode:
index f79fd122f565c709a87ae9344926713522de66a8..74e924f3c041ec8c825f0beb85e72406b110159b 100644 (file)
   UNSPEC_FIX_NOTRUNC
   UNSPEC_MASKMOV
   UNSPEC_MOVMSK
+  UNSPEC_BLENDV
   UNSPEC_RCP
   UNSPEC_RSQRT
   UNSPEC_PSADBW
index 295501dec2fd2c4e38049ba667e390cddbf07440..f08570856f938e9fa48bb418dd0c185c8367b6f3 100644 (file)
   DONE;
 })
 
+(define_insn "mmx_pblendvb"
+  [(set (match_operand:V8QI 0 "register_operand" "=Yr,*x,x")
+       (unspec:V8QI
+         [(match_operand:V8QI 1 "register_operand" "0,0,x")
+          (match_operand:V8QI 2 "register_operand" "Yr,*x,x")
+          (match_operand:V8QI 3 "register_operand" "Yz,Yz,x")]
+         UNSPEC_BLENDV))]
+  "TARGET_SSE4_1 && TARGET_MMX_WITH_SSE"
+  "@
+   pblendvb\t{%3, %2, %0|%0, %2, %3}
+   pblendvb\t{%3, %2, %0|%0, %2, %3}
+   vpblendvb\t{%3, %2, %1, %0|%0, %1, %2, %3}"
+  [(set_attr "isa" "noavx,noavx,avx")
+   (set_attr "type" "ssemov")
+   (set_attr "prefix_extra" "1")
+   (set_attr "length_immediate" "*,*,1")
+   (set_attr "prefix" "orig,orig,vex")
+   (set_attr "btver2_decode" "vector")
+   (set_attr "mode" "TI")])
+
 ;; XOP parallel XMM conditional moves
 (define_insn "*xop_pcmov_<mode>"
   [(set (match_operand:MMXMODEI 0 "register_operand" "=x")
index 897cf3eaea955bce8c0937496391e80dde982a3a..244fb13e97a5ad68c7591934e47d7c258b85a04b 100644 (file)
@@ -39,7 +39,6 @@
   UNSPEC_INSERTQ
 
   ;; For SSE4.1 support
-  UNSPEC_BLENDV
   UNSPEC_INSERTPS
   UNSPEC_DP
   UNSPEC_MOVNTDQA