summaryrefslogtreecommitdiff
path: root/gcc/config/i386/sse.md
diff options
context:
space:
mode:
authorkyukhin <kyukhin@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-05 07:58:54 +0000
committerkyukhin <kyukhin@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-05 07:58:54 +0000
commit37407f90a9835cd602a6b953d25d6279fd89dfab (patch)
tree2b7b9572e37439040c91b437ef501d5ed5758fa8 /gcc/config/i386/sse.md
parent39e23eaa2f5f635ffc4da0c6c1563674bb2a8d8c (diff)
downloadgcc-37407f90a9835cd602a6b953d25d6279fd89dfab.tar.gz
Merge SSE and AVX ptest patterns.
gcc/ * config/i386/i386.c (bdesc_args): Rename CODE_FOR_sse4_1_ptest into CODE_FOR_sse4_1_ptestv2di and CODE_FOR_avx_vtestps256 into CODE_FOR_avx_ptestv4di. * config/i386/sse.md (define_mode_iterator V_AVX): New. (define_mode_attr sse4_1): Extend to other 128/256-bit modes. (define_insn "avx_ptest256"): Merge this ... (define_insn "sse4_1_ptest"): And this ... (define_insn "<sse4_1>_ptest<mode>"): Into this. Use V_AVX iterator. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@226611 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/i386/sse.md')
-rw-r--r--gcc/config/i386/sse.md41
1 files changed, 22 insertions, 19 deletions
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 0970f0e1e6d..0ffc27dfacb 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -299,6 +299,12 @@
V8DI (V4DI "TARGET_AVX512VL") (V2DI "TARGET_AVX512VL")])
;; All DImode vector integer modes
+(define_mode_iterator V_AVX
+ [V16QI V8HI V4SI V2DI V4SF V2DF
+ (V32QI "TARGET_AVX") (V16HI "TARGET_AVX")
+ (V8SI "TARGET_AVX") (V4DI "TARGET_AVX")
+ (V8SF "TARGET_AVX") (V4DF"TARGET_AVX")])
+
(define_mode_iterator VI8
[(V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX") V2DI])
@@ -566,7 +572,11 @@
(define_mode_attr sse4_1
[(V4SF "sse4_1") (V2DF "sse4_1")
(V8SF "avx") (V4DF "avx")
- (V8DF "avx512f")])
+ (V8DF "avx512f")
+ (V4DI "avx") (V2DI "sse4_1")
+ (V8SI "avx") (V4SI "sse4_1")
+ (V16QI "sse4_1") (V32QI "avx")
+ (V8HI "sse4_1") (V16HI "avx")])
(define_mode_attr avxsizesuffix
[(V64QI "512") (V32HI "512") (V16SI "512") (V8DI "512")
@@ -14640,30 +14650,23 @@
;; ptest is very similar to comiss and ucomiss when setting FLAGS_REG.
;; But it is not a really compare instruction.
-(define_insn "avx_ptest256"
- [(set (reg:CC FLAGS_REG)
- (unspec:CC [(match_operand:V4DI 0 "register_operand" "x")
- (match_operand:V4DI 1 "nonimmediate_operand" "xm")]
- UNSPEC_PTEST))]
- "TARGET_AVX"
- "vptest\t{%1, %0|%0, %1}"
- [(set_attr "type" "ssecomi")
- (set_attr "prefix_extra" "1")
- (set_attr "prefix" "vex")
- (set_attr "btver2_decode" "vector")
- (set_attr "mode" "OI")])
-
-(define_insn "sse4_1_ptest"
+(define_insn "<sse4_1>_ptest<mode>"
[(set (reg:CC FLAGS_REG)
- (unspec:CC [(match_operand:V2DI 0 "register_operand" "Yr,*x")
- (match_operand:V2DI 1 "nonimmediate_operand" "Yrm,*xm")]
+ (unspec:CC [(match_operand:V_AVX 0 "register_operand" "Yr, *x, x")
+ (match_operand:V_AVX 1 "nonimmediate_operand" "Yrm, *xm, xm")]
UNSPEC_PTEST))]
"TARGET_SSE4_1"
"%vptest\t{%1, %0|%0, %1}"
- [(set_attr "type" "ssecomi")
+ [(set_attr "isa" "*,*,avx")
+ (set_attr "type" "ssecomi")
(set_attr "prefix_extra" "1")
(set_attr "prefix" "maybe_vex")
- (set_attr "mode" "TI")])
+ (set (attr "btver2_decode")
+ (if_then_else
+ (match_test "<sseinsnmode>mode==OImode")
+ (const_string "vector")
+ (const_string "*")))
+ (set_attr "mode" "<sseinsnmode>")])
(define_insn "<sse4_1>_round<ssemodesuffix><avxsizesuffix>"
[(set (match_operand:VF_128_256 0 "register_operand" "=Yr,*x")