diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2008-08-19 12:49:28 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2008-08-19 05:49:28 -0700 |
commit | b8aaf5063d697ee0346ffb820e41d9d842c91b05 (patch) | |
tree | f55edcca17f1bbe86c33b0021c908039ae9b5373 /gcc/config/i386/sse.md | |
parent | e92cbe3a1df3f5ad7027d9863c5a49c34cf789e9 (diff) | |
download | gcc-b8aaf5063d697ee0346ffb820e41d9d842c91b05.zip gcc-b8aaf5063d697ee0346ffb820e41d9d842c91b05.tar.gz gcc-b8aaf5063d697ee0346ffb820e41d9d842c91b05.tar.bz2 |
re PR target/37157 (Wrong insn for _mm_unpackhi_epi64)
gcc/
2008-08-19 H.J. Lu <hongjiu.lu@intel.com>
PR target/37157
* config/i386/sse.md (sse2_punpckhqdq, sse2_punpcklqdq): Moved
before (sse2_shufpd_<mode>).
gcc/testsuite/
2008-08-19 H.J. Lu <hongjiu.lu@intel.com>
PR target/37157
* gcc.target/i386/sse2-unpack-1.c: New.
From-SVN: r139232
Diffstat (limited to 'gcc/config/i386/sse.md')
-rw-r--r-- | gcc/config/i386/sse.md | 57 |
1 files changed, 29 insertions, 28 deletions
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index c8bf42d8..e7e4140 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_<mode>" [(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 |