From: H.J. Lu Date: Tue, 19 Aug 2008 12:49:28 +0000 (+0000) Subject: re PR target/37157 (Wrong insn for _mm_unpackhi_epi64) X-Git-Tag: releases/gcc-4.4.0~3072 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b8aaf5063d697ee0346ffb820e41d9d842c91b05;p=thirdparty%2Fgcc.git re PR target/37157 (Wrong insn for _mm_unpackhi_epi64) gcc/ 2008-08-19 H.J. Lu PR target/37157 * config/i386/sse.md (sse2_punpckhqdq, sse2_punpcklqdq): Moved before (sse2_shufpd_). gcc/testsuite/ 2008-08-19 H.J. Lu PR target/37157 * gcc.target/i386/sse2-unpack-1.c: New. From-SVN: r139232 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a170704b41e4..8d305164eef6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-08-19 H.J. Lu + + PR target/37157 + * config/i386/sse.md (sse2_punpckhqdq, sse2_punpcklqdq): Moved + before (sse2_shufpd_). + 2008-08-19 Jakub Jelinek PR debug/37156 diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index c8bf42d81932..e7e4140597dc 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -2610,6 +2610,35 @@ (const_int 3)])))] "TARGET_SSE2") +;; punpcklqdq and punpckhqdq are shorter than shufpd. +(define_insn "sse2_punpckhqdq" + [(set (match_operand:V2DI 0 "register_operand" "=x") + (vec_select:V2DI + (vec_concat:V4DI + (match_operand:V2DI 1 "register_operand" "0") + (match_operand:V2DI 2 "nonimmediate_operand" "xm")) + (parallel [(const_int 1) + (const_int 3)])))] + "TARGET_SSE2" + "punpckhqdq\t{%2, %0|%0, %2}" + [(set_attr "type" "sselog") + (set_attr "prefix_data16" "1") + (set_attr "mode" "TI")]) + +(define_insn "sse2_punpcklqdq" + [(set (match_operand:V2DI 0 "register_operand" "=x") + (vec_select:V2DI + (vec_concat:V4DI + (match_operand:V2DI 1 "register_operand" "0") + (match_operand:V2DI 2 "nonimmediate_operand" "xm")) + (parallel [(const_int 0) + (const_int 2)])))] + "TARGET_SSE2" + "punpcklqdq\t{%2, %0|%0, %2}" + [(set_attr "type" "sselog") + (set_attr "prefix_data16" "1") + (set_attr "mode" "TI")]) + (define_insn "sse2_shufpd_" [(set (match_operand:SSEMODE2D 0 "register_operand" "=x") (vec_select:SSEMODE2D @@ -4438,34 +4467,6 @@ (set_attr "prefix_data16" "1") (set_attr "mode" "TI")]) -(define_insn "sse2_punpckhqdq" - [(set (match_operand:V2DI 0 "register_operand" "=x") - (vec_select:V2DI - (vec_concat:V4DI - (match_operand:V2DI 1 "register_operand" "0") - (match_operand:V2DI 2 "nonimmediate_operand" "xm")) - (parallel [(const_int 1) - (const_int 3)])))] - "TARGET_SSE2" - "punpckhqdq\t{%2, %0|%0, %2}" - [(set_attr "type" "sselog") - (set_attr "prefix_data16" "1") - (set_attr "mode" "TI")]) - -(define_insn "sse2_punpcklqdq" - [(set (match_operand:V2DI 0 "register_operand" "=x") - (vec_select:V2DI - (vec_concat:V4DI - (match_operand:V2DI 1 "register_operand" "0") - (match_operand:V2DI 2 "nonimmediate_operand" "xm")) - (parallel [(const_int 0) - (const_int 2)])))] - "TARGET_SSE2" - "punpcklqdq\t{%2, %0|%0, %2}" - [(set_attr "type" "sselog") - (set_attr "prefix_data16" "1") - (set_attr "mode" "TI")]) - (define_insn "*sse4_1_pinsrb" [(set (match_operand:V16QI 0 "register_operand" "=x") (vec_merge:V16QI diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7499840aa3d8..ac05d1fe9955 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-08-19 H.J. Lu + + PR target/37157 + * gcc.target/i386/sse2-unpack-1.c: New. + 2008-08-19 Jakub Jelinek PR debug/37156 diff --git a/gcc/testsuite/gcc.target/i386/sse2-unpack-1.c b/gcc/testsuite/gcc.target/i386/sse2-unpack-1.c new file mode 100644 index 000000000000..a2676396cd32 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/sse2-unpack-1.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -msse2" } */ + +#include + +__m128i +foo1 (__m128i s1, __m128i s2) +{ + return _mm_unpackhi_epi64 (s1, s2); +} + +__m128i +foo2 (__m128i s1, __m128i s2) +{ + return _mm_unpacklo_epi64 (s1, s2); +} + +/* { dg-final { scan-assembler "punpcklqdq" } } */ +/* { dg-final { scan-assembler "punpckhqdq" } } */