aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386/sse.md
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2008-08-19 12:49:28 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2008-08-19 05:49:28 -0700
commitb8aaf5063d697ee0346ffb820e41d9d842c91b05 (patch)
treef55edcca17f1bbe86c33b0021c908039ae9b5373 /gcc/config/i386/sse.md
parente92cbe3a1df3f5ad7027d9863c5a49c34cf789e9 (diff)
downloadgcc-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.md57
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