aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2008-11-22 15:16:57 +0100
committerUros Bizjak <uros@gcc.gnu.org>2008-11-22 15:16:57 +0100
commita00ce5fe3ef7372f13019de6bd2d2cf674d0417e (patch)
tree64e5e90d94141e6b76b8dc8129b0d825daea5378 /gcc
parentf06fb22be5ab362c5cf6c0b235e0baa9917bb74d (diff)
downloadgcc-a00ce5fe3ef7372f13019de6bd2d2cf674d0417e.zip
gcc-a00ce5fe3ef7372f13019de6bd2d2cf674d0417e.tar.gz
gcc-a00ce5fe3ef7372f13019de6bd2d2cf674d0417e.tar.bz2
re PR target/38222 (gcc.target/i386/sse4_2-popcntl.c fails on i686-apple-darwin9)
PR target/38222 * config/i386/i386.md (SWI248): New mode iterator. (SWI32): Remove 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. testsuite/ChangeLog: PR target/38222 * gcc.target/i386/funcspec-3.c: Scan for popcnt on Darwin targets. From-SVN: r142121
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/config/i386/i386.md94
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/funcspec-3.c5
4 files changed, 55 insertions, 62 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 68a72c9..e58190e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2008-11-22 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/38222
+ * config/i386/i386.md (SWI248): New mode iterator.
+ (SWI32): Remove 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.
+
2008-11-22 Eric Botcazou <ebotcazou@adacore.com>
* config/sparc/sparc.c (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index d49e49a..cca7c89 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -652,8 +652,8 @@
;; All single word integer modes.
(define_mode_iterator SWI [QI HI SI (DI "TARGET_64BIT")])
-;; Single word integer modes up to SImode.
-(define_mode_iterator SWI32 [QI HI SI])
+;; 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")])
@@ -15493,28 +15493,42 @@
[(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)
@@ -15524,7 +15538,13 @@
(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")])
@@ -15620,29 +15640,6 @@
[(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" "")
@@ -15681,29 +15678,6 @@
[(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" "")))]
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ef7facc..194a90c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-11-22 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/38222
+ * gcc.target/i386/funcspec-3.c: Scan for popcnt on Darwin targets.
+
2008-11-22 Jakub Jelinek <jakub@redhat.com>
PR libfortran/37839
diff --git a/gcc/testsuite/gcc.target/i386/funcspec-3.c b/gcc/testsuite/gcc.target/i386/funcspec-3.c
index 62748be..01c7e4c 100644
--- a/gcc/testsuite/gcc.target/i386/funcspec-3.c
+++ b/gcc/testsuite/gcc.target/i386/funcspec-3.c
@@ -59,8 +59,9 @@ int main ()
exit (0);
}
-/* { dg-final { scan-assembler "popcntl" } } */
-/* { dg-final { scan-assembler "popcntq" } } */
+/* { dg-final { scan-assembler "popcntl" { target { ! *-*-darwin* } } } } */
+/* { dg-final { scan-assembler "popcntq" { target { ! *-*-darwin* } } } } */
+/* { dg-final { scan-assembler-times "popcnt" 2 { target *-*-darwin* } } } */
/* { dg-final { scan-assembler "call\t(.*)sse4a_pop_i" } } */
/* { dg-final { scan-assembler "call\t(.*)sse42_pop_l" } } */
/* { dg-final { scan-assembler "call\t(.*)popcountdi2" } } */