summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2015-06-04 10:06:11 +0000
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2015-06-04 10:06:11 +0000
commitb1d9adacb088a7a2834ce27ef1a6258502950d73 (patch)
tree6c19af416a8734800d4c1726431a043fb6e3eca9
parente81ad0db65a77d17ae5d73f3fc7559c5909192fd (diff)
downloadgcc-b1d9adacb088a7a2834ce27ef1a6258502950d73.tar.gz
PR target/66369
* config/i386/sse.md (<sse2_avx2>_pmovmsk): Merge from avx2_pmovmskb and sse2_pmovmskb using VI1_AVX2 mode iterator. (*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_zext): New insn pattern. (*<sse2_avx2>_pmovmskb_zext): Ditto. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@224120 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/i386/sse.md48
2 files changed, 38 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 53d75b1c69f..78d46132672 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1125,7 +1125,7 @@
ACX_PROG_CXX_WARNING_ALMOST_PEDANTIC, and
ACX_PROG_CXX_WARNINGS_ARE_ERRORS.
-2015-05-22 Aditya Kumar <hiraditya@msn.com>
+2015-05-22 Aditya Kumar <hiraditya@msn.com>
* auto-profile.c (afdo_calculate_branch_prob): Break once has_sample
is true.
@@ -3398,7 +3398,7 @@
(aarch_macro_fusion_pair_p): Update uses of current_tune.
* arm.h (LOGICAL_OP_NON_SHORT_CIRCUIT): Likewise.
-2015-05-12 Sandra Loosemore <sandra@codesourcery.com>
+2015-05-12 Sandra Loosemore <sandra@codesourcery.com>
* config/nios2/nios2.md (trap, ctrapsi4): Use "trap" instead of
"break".
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 21c6c6cd5be..e44ba9a6d36 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -13112,24 +13112,48 @@
(set_attr "prefix" "maybe_vex")
(set_attr "mode" "<MODE>")])
-(define_insn "avx2_pmovmskb"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:V32QI 1 "register_operand" "x")]
- UNSPEC_MOVMSK))]
- "TARGET_AVX2"
- "vpmovmskb\t{%1, %0|%0, %1}"
+(define_insn "*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_zext"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (zero_extend:DI
+ (unspec:SI
+ [(match_operand:VF_128_256 1 "register_operand" "x")]
+ UNSPEC_MOVMSK)))]
+ "TARGET_64BIT && TARGET_SSE"
+ "%vmovmsk<ssemodesuffix>\t{%1, %k0|%k0, %1}"
[(set_attr "type" "ssemov")
- (set_attr "prefix" "vex")
- (set_attr "mode" "DI")])
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "<MODE>")])
-(define_insn "sse2_pmovmskb"
+(define_insn "<sse2_avx2>_pmovmskb"
[(set (match_operand:SI 0 "register_operand" "=r")
- (unspec:SI [(match_operand:V16QI 1 "register_operand" "x")]
- UNSPEC_MOVMSK))]
+ (unspec:SI
+ [(match_operand:VI1_AVX2 1 "register_operand" "x")]
+ UNSPEC_MOVMSK))]
"TARGET_SSE2"
"%vpmovmskb\t{%1, %0|%0, %1}"
[(set_attr "type" "ssemov")
- (set_attr "prefix_data16" "1")
+ (set (attr "prefix_data16")
+ (if_then_else
+ (match_test "TARGET_AVX")
+ (const_string "*")
+ (const_string "1")))
+ (set_attr "prefix" "maybe_vex")
+ (set_attr "mode" "SI")])
+
+(define_insn "*<sse2_avx2>_pmovmskb_zext"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (zero_extend:DI
+ (unspec:SI
+ [(match_operand:VI1_AVX2 1 "register_operand" "x")]
+ UNSPEC_MOVMSK)))]
+ "TARGET_64BIT && TARGET_SSE2"
+ "%vpmovmskb\t{%1, %k0|%k0, %1}"
+ [(set_attr "type" "ssemov")
+ (set (attr "prefix_data16")
+ (if_then_else
+ (match_test "TARGET_AVX")
+ (const_string "*")
+ (const_string "1")))
(set_attr "prefix" "maybe_vex")
(set_attr "mode" "SI")])