]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/45336 (pextr{b,w,d}, (worse than) redundant extensions)
authorJakub Jelinek <jakub@redhat.com>
Fri, 20 Aug 2010 20:54:25 +0000 (22:54 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 20 Aug 2010 20:54:25 +0000 (22:54 +0200)
PR target/45336
* config/i386/sse.md (*sse4_1_pextrb): Add SWI48 mode iterator
to cover zero extension into 64-bit register.
(*sse2_pextrw): Likewise.
(*sse4_1_pextrd_zext): New insn.

From-SVN: r163420

gcc/ChangeLog
gcc/config/i386/sse.md

index 8b93321607ffb8f0fe5ef2451883af4fb2ba197b..6ccc0a185be0c8cb83b9df80f27684189bc4513b 100644 (file)
@@ -1,3 +1,11 @@
+2010-08-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/45336
+       * config/i386/sse.md (*sse4_1_pextrb): Add SWI48 mode iterator
+       to cover zero extension into 64-bit register.
+       (*sse2_pextrw): Likewise.
+       (*sse4_1_pextrd_zext): New insn.
+
 2010-08-20  Iain Sandoe  <iains@gcc.gnu.org>
 
        revert r163410, partially revert r163267.
index b505c8ed4f5bdff366d9af3472bab22fbb1f0e51..3f756d9b636fe856c1479736c2169af12e17d681 100644 (file)
    (set_attr "length_immediate" "1")
    (set_attr "mode" "TI")])
 
-(define_insn "*sse4_1_pextrb"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (zero_extend:SI
+(define_insn "*sse4_1_pextrb_<mode>"
+  [(set (match_operand:SWI48 0 "register_operand" "=r")
+       (zero_extend:SWI48
          (vec_select:QI
            (match_operand:V16QI 1 "register_operand" "x")
            (parallel [(match_operand:SI 2 "const_0_to_15_operand" "n")]))))]
   "TARGET_SSE4_1"
-  "%vpextrb\t{%2, %1, %0|%0, %1, %2}"
+  "%vpextrb\t{%2, %1, %k0|%k0, %1, %2}"
   [(set_attr "type" "sselog")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "TI")])
 
-(define_insn "*sse2_pextrw"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (zero_extend:SI
+(define_insn "*sse2_pextrw_<mode>"
+  [(set (match_operand:SWI48 0 "register_operand" "=r")
+       (zero_extend:SWI48
          (vec_select:HI
            (match_operand:V8HI 1 "register_operand" "x")
            (parallel [(match_operand:SI 2 "const_0_to_7_operand" "n")]))))]
   "TARGET_SSE2"
-  "%vpextrw\t{%2, %1, %0|%0, %1, %2}"
+  "%vpextrw\t{%2, %1, %k0|%k0, %1, %2}"
   [(set_attr "type" "sselog")
    (set_attr "prefix_data16" "1")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "TI")])
 
+(define_insn "*sse4_1_pextrd_zext"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+       (zero_extend:DI
+         (vec_select:SI
+           (match_operand:V4SI 1 "register_operand" "x")
+           (parallel [(match_operand:SI 2 "const_0_to_3_operand" "n")]))))]
+  "TARGET_64BIT && TARGET_SSE4_1"
+  "%vpextrd\t{%2, %1, %k0|%k0, %1, %2}"
+  [(set_attr "type" "sselog")
+   (set_attr "prefix_extra" "1")
+   (set_attr "length_immediate" "1")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "mode" "TI")])
+
 ;; It must come before *vec_extractv2di_1_sse since it is preferred.
 (define_insn "*sse4_1_pextrq"
   [(set (match_operand:DI 0 "nonimmediate_operand" "=rm")