From b8aaf5063d697ee0346ffb820e41d9d842c91b05 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 19 Aug 2008 12:49:28 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++ gcc/config/i386/sse.md | 57 ++++++++++--------- gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gcc.target/i386/sse2-unpack-1.c | 19 +++++++ 4 files changed, 59 insertions(+), 28 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/sse2-unpack-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a170704b41e..8d305164eef 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 c8bf42d8193..e7e4140597d 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 7499840aa3d..ac05d1fe995 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 00000000000..a2676396cd3 --- /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" } } */