From a00ce5fe3ef7372f13019de6bd2d2cf674d0417e Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Sat, 22 Nov 2008 15:16:57 +0100 Subject: 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. (popcount2): Rename from popcounthi2, popcountsi2 and popcounthi2 insn patterns. Macroize pattern using SWI248 mode iterator. Generate popcnt mnemonic without mode extensions for Darwin x86 targets. (*popcount2_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 --- gcc/ChangeLog | 13 +++++ gcc/config/i386/i386.md | 94 +++++++++++------------------- gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gcc.target/i386/funcspec-3.c | 5 +- 4 files changed, 55 insertions(+), 62 deletions(-) (limited to 'gcc') 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 + + PR target/38222 + * config/i386/i386.md (SWI248): New mode iterator. + (SWI32): Remove mode iterator. + (popcount2): Rename from popcounthi2, popcountsi2 and + popcounthi2 insn patterns. Macroize pattern using SWI248 mode + iterator. Generate popcnt mnemonic without mode extensions + for Darwin x86 targets. + (*popcount2_cmp): Ditto. + (*popcountsi2_cmp_zext): Generate popcnt mnemonic without mode + extensions for Darwin x86 targets. + 2008-11-22 Eric Botcazou * 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 "popcount2" + [(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{}\t{%1, %0|%0, %1}"; +#endif +} [(set_attr "prefix_rep" "1") (set_attr "type" "bitmanip") - (set_attr "mode" "SI")]) + (set_attr "mode" "")]) -(define_insn "*popcountsi2_cmp" +(define_insn "*popcount2_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{}\t{%1, %0|%0, %1}"; +#endif +} [(set_attr "prefix_rep" "1") (set_attr "type" "bitmanip") - (set_attr "mode" "SI")]) + (set_attr "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{}\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 + + PR target/38222 + * gcc.target/i386/funcspec-3.c: Scan for popcnt on Darwin targets. + 2008-11-22 Jakub Jelinek 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" } } */ -- cgit v1.1