]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/38222 (gcc.target/i386/sse4_2-popcntl.c fails on i686-apple...
authorUros Bizjak <ubizjak@gmail.com>
Thu, 11 Jun 2009 20:59:16 +0000 (22:59 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Thu, 11 Jun 2009 20:59:16 +0000 (22:59 +0200)
Backport from mainline:
2008-11-22  Uros Bizjak  <ubizjak@gmail.com>

PR target/38222
* config/i386/i386.md (SWI248): New mode iterator.
(popcount<mode>2): Rename from popcounthi2, popcountsi2 and
popcounthi2 insn patterns. Macroize pattern using SWI248 mode
iterator.  Generate popcnt mnemonic without mode extensions
for Darwin x86 targets.
(*popcount<mode>2_cmp): Ditto.
(*popcountsi2_cmp_zext): Generate popcnt mnemonic without mode
extensions for Darwin x86 targets.

From-SVN: r148397

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

index 417bc039f494185b19374492db95aa413fb55d0b..546a2051553fd00a2498254528172fa53cc97f63 100644 (file)
@@ -1,3 +1,19 @@
+2009-06-11  Uros Bizjak  <ubizjak@gmail.com>
+
+       Backport from mainline:
+       2008-11-22  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/38222
+       * config/i386/i386.md (SWI248): New mode iterator.
+       (popcount<mode>2): Rename from popcounthi2, popcountsi2 and
+       popcounthi2 insn patterns. Macroize pattern using SWI248 mode
+       iterator.  Generate popcnt mnemonic without mode extensions
+       for Darwin x86 targets.
+       (*popcount<mode>2_cmp): Ditto.
+       (*popcountsi2_cmp_zext): Generate popcnt mnemonic without mode
+       extensions for Darwin x86 targets.
+
+
 2009-05-26  Richard Guenther  <rguenther@suse.de>
 
        Backport from mainline
index 69630d209942427a77d318a45fdec3186df7ce74..ceb212ad6b9ee40a55be8aa962deda1325e4528b 100644 (file)
 ;; All single word integer modes.
 (define_mode_iterator SWI [QI HI SI (DI "TARGET_64BIT")])
 
+;; Single word integer modes without QImode.
+(define_mode_iterator SWI248 [HI SI (DI "TARGET_64BIT")])
+
 ;; Instruction suffix for integer modes.
 (define_mode_attr imodesuffix [(QI "b") (HI "w") (SI "l") (DI "q")])
 
   [(set_attr "prefix_0f" "1")
    (set_attr "mode" "SI")])
 
-(define_insn "popcountsi2"
-  [(set (match_operand:SI 0 "register_operand" "=r")
-       (popcount:SI (match_operand:SI 1 "nonimmediate_operand" "rm")))
+(define_insn "popcount<mode>2"
+  [(set (match_operand:SWI248 0 "register_operand" "=r")
+       (popcount:SWI248
+         (match_operand:SWI248 1 "nonimmediate_operand" "rm")))
    (clobber (reg:CC FLAGS_REG))]
   "TARGET_POPCNT"
-  "popcnt{l}\t{%1, %0|%0, %1}"
+{
+#if TARGET_MACHO
+  return "popcnt\t{%1, %0|%0, %1}";
+#else
+  return "popcnt{<imodesuffix>}\t{%1, %0|%0, %1}";
+#endif
+}
   [(set_attr "prefix_rep" "1")
    (set_attr "type" "bitmanip")
-   (set_attr "mode" "SI")])
+   (set_attr "mode" "<MODE>")])
 
-(define_insn "*popcountsi2_cmp"
+(define_insn "*popcount<mode>2_cmp"
   [(set (reg FLAGS_REG)
        (compare
-         (popcount:SI (match_operand:SI 1 "nonimmediate_operand" "rm"))
+         (popcount:SWI248
+           (match_operand:SWI248 1 "nonimmediate_operand" "rm"))
          (const_int 0)))
-   (set (match_operand:SI 0 "register_operand" "=r")
-       (popcount:SI (match_dup 1)))]
+   (set (match_operand:SWI248 0 "register_operand" "=r")
+       (popcount:SWI248 (match_dup 1)))]
   "TARGET_POPCNT && ix86_match_ccmode (insn, CCZmode)"
-  "popcnt{l}\t{%1, %0|%0, %1}"
+{
+#if TARGET_MACHO
+  return "popcnt\t{%1, %0|%0, %1}";
+#else
+  return "popcnt{<imodesuffix>}\t{%1, %0|%0, %1}";
+#endif
+}
   [(set_attr "prefix_rep" "1")
    (set_attr "type" "bitmanip")
-   (set_attr "mode" "SI")])
+   (set_attr "mode" "<MODE>")])
 
 (define_insn "*popcountsi2_cmp_zext"
   [(set (reg FLAGS_REG)
    (set (match_operand:DI 0 "register_operand" "=r")
         (zero_extend:DI(popcount:SI (match_dup 1))))]
   "TARGET_64BIT && TARGET_POPCNT && ix86_match_ccmode (insn, CCZmode)"
-  "popcnt{l}\t{%1, %0|%0, %1}"
+{
+#if TARGET_MACHO
+  return "popcnt\t{%1, %0|%0, %1}";
+#else
+  return "popcnt{<imodesuffix>}\t{%1, %0|%0, %1}";
+#endif
+}
   [(set_attr "prefix_rep" "1")
    (set_attr "type" "bitmanip")
    (set_attr "mode" "SI")])
   [(set_attr "prefix_0f" "1")
    (set_attr "mode" "DI")])
 
-(define_insn "popcountdi2"
-  [(set (match_operand:DI 0 "register_operand" "=r")
-       (popcount:DI (match_operand:DI 1 "nonimmediate_operand" "rm")))
-   (clobber (reg:CC FLAGS_REG))]
-  "TARGET_64BIT && TARGET_POPCNT"
-  "popcnt{q}\t{%1, %0|%0, %1}"
-  [(set_attr "prefix_rep" "1")
-   (set_attr "type" "bitmanip")
-   (set_attr "mode" "DI")])
-
-(define_insn "*popcountdi2_cmp"
-  [(set (reg FLAGS_REG)
-       (compare
-         (popcount:DI (match_operand:DI 1 "nonimmediate_operand" "rm"))
-         (const_int 0)))
-   (set (match_operand:DI 0 "register_operand" "=r")
-       (popcount:DI (match_dup 1)))]
-  "TARGET_64BIT && TARGET_POPCNT && ix86_match_ccmode (insn, CCZmode)"
-  "popcnt{q}\t{%1, %0|%0, %1}"
-  [(set_attr "prefix_rep" "1")
-   (set_attr "type" "bitmanip")
-   (set_attr "mode" "DI")])
-
 (define_expand "clzhi2"
   [(parallel
      [(set (match_operand:HI 0 "register_operand" "")
   [(set_attr "prefix_0f" "1")
    (set_attr "mode" "HI")])
 
-(define_insn "popcounthi2"
-  [(set (match_operand:HI 0 "register_operand" "=r")
-       (popcount:HI (match_operand:HI 1 "nonimmediate_operand" "rm")))
-   (clobber (reg:CC FLAGS_REG))]
-  "TARGET_POPCNT"
-  "popcnt{w}\t{%1, %0|%0, %1}"
-  [(set_attr "prefix_rep" "1")
-   (set_attr "type" "bitmanip")
-   (set_attr "mode" "HI")])
-
-(define_insn "*popcounthi2_cmp"
-  [(set (reg FLAGS_REG)
-        (compare
-          (popcount:HI (match_operand:HI 1 "nonimmediate_operand" "rm"))
-          (const_int 0)))
-   (set (match_operand:HI 0 "register_operand" "=r")
-        (popcount:HI (match_dup 1)))]
-  "TARGET_POPCNT && ix86_match_ccmode (insn, CCZmode)"
-  "popcnt{w}\t{%1, %0|%0, %1}"
-  [(set_attr "prefix_rep" "1")
-   (set_attr "type" "bitmanip")
-   (set_attr "mode" "HI")])
-
 (define_expand "paritydi2"
   [(set (match_operand:DI 0 "register_operand" "")
        (parity:DI (match_operand:DI 1 "register_operand" "")))]