From: Uros Bizjak Date: Wed, 30 Dec 2009 11:47:30 +0000 (+0100) Subject: re PR target/42549 (Incorrect 3DNow! code generated) X-Git-Tag: releases/gcc-4.3.5~242 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c8aabf14953fc128244fb9315a6e273d4303743a;p=thirdparty%2Fgcc.git re PR target/42549 (Incorrect 3DNow! code generated) PR target/42549 * config/i386/mmx.md (*mmx_subv2sf3): Fix insn operand number for alternative 1. testsuite/ChangeLog: PR target/42549 * gcc.target/i386/mmx-3dnow-check.h: New file. * gcc.target/i386/pr42549.c: New test. From-SVN: r155522 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 36c5beb7990e..298372b8bc18 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-12-30 Uros Bizjak + + PR target/42549 + * config/i386/mmx.md (*mmx_subv2sf3): Fix insn operand number for + alternative 1. + 2009-12-07 Uros Bizjak * config/i386/i386.md (*iorqi_ext_2): Fix insn mnemonic typo. diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md index 3f8bfe71d30a..60d0e08cba20 100644 --- a/gcc/config/i386/mmx.md +++ b/gcc/config/i386/mmx.md @@ -226,7 +226,7 @@ "TARGET_3DNOW && !(MEM_P (operands[0]) && MEM_P (operands[1]))" "@ pfsub\\t{%2, %0|%0, %2} - pfsubr\\t{%2, %0|%0, %2}" + pfsubr\\t{%1, %0|%0, %1}" [(set_attr "type" "mmxadd") (set_attr "mode" "V2SF")]) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 54befe2e7fbc..f4182a303be4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-12-30 Uros Bizjak + + PR target/42549 + * gcc.target/i386/mmx-3dnow-check.h: New file. + * gcc.target/i386/pr42549.c: New test. + 2009-12-23 Thomas Koenig PR libfortran/PR42422 diff --git a/gcc/testsuite/gcc.target/i386/mmx-3dnow-check.h b/gcc/testsuite/gcc.target/i386/mmx-3dnow-check.h new file mode 100644 index 000000000000..458e7cda8980 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/mmx-3dnow-check.h @@ -0,0 +1,21 @@ +#include +#include + +#include "cpuid.h" + +static void mmx_3dnow_test (void); + +int +main () +{ + unsigned int eax, ebx, ecx, edx; + + if (!__get_cpuid (0x80000001, &eax, &ebx, &ecx, &edx)) + return 0; + + /* Run 3DNow! test only if host has 3DNow! support. */ + if (edx & bit_3DNOW) + mmx_3dnow_test (); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/i386/pr42549.c b/gcc/testsuite/gcc.target/i386/pr42549.c new file mode 100644 index 000000000000..5f9646251aad --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr42549.c @@ -0,0 +1,37 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -m3dnow" } */ + +#include "mmx-3dnow-check.h" + +#include + +typedef union { + float f[2]; + __m64 v; +} vec_t; + +void __attribute__ ((noinline)) +Butterfly_3 (__m64 * D, __m64 SC) +{ + __m64 T, T1; + + T = _m_pfmul (D[1], SC); + T1 = D[0]; + D[0] = _m_pfadd (T1, T); + D[1] = _m_pfsub (T1, T); +} + +void +mmx_3dnow_test (void) +{ + vec_t D[2] = { { .f = { 2.0f, 3.0f } }, + { .f = { 4.0f, 5.0f } } }; + + const vec_t SC = { .f = { 1.0f, 1.0f } }; + + Butterfly_3 (&D[0].v, SC.v); + _m_femms (); + + if (D[1].f[0] != -2.0f || D[1].f[1] != -2.0f) + abort (); +}