aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2017-04-02 20:19:02 +0200
committerUros Bizjak <uros@gcc.gnu.org>2017-04-02 20:19:02 +0200
commitd4a8fcafe5d9a239eca55b5cc9ac6460438f0809 (patch)
treebebcdfb8401a4d13f86b1f174b1fa80ab8e9134f /gcc/config/i386
parent5738fe8899ffc59fddc32dc05068785f5e74dc5e (diff)
downloadgcc-d4a8fcafe5d9a239eca55b5cc9ac6460438f0809.zip
gcc-d4a8fcafe5d9a239eca55b5cc9ac6460438f0809.tar.gz
gcc-d4a8fcafe5d9a239eca55b5cc9ac6460438f0809.tar.bz2
re PR target/80250 (ICE in in final_scan_insn, at final.c:3025 for __builtin_ia32_vp4dpwssds_mask builtin)
PR target/80250 * config/i386/sse.md (mov<IMOD4:mode>): Remove insn pattern. (mov<IMOD4:mode>): New expander. (*mov<IMOD4:mode>_internal): New insn and split pattern. From-SVN: r246637
Diffstat (limited to 'gcc/config/i386')
-rw-r--r--gcc/config/i386/sse.md44
1 files changed, 29 insertions, 15 deletions
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 0ea06c5..817762c 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -19707,24 +19707,38 @@
(define_mode_attr imod4_narrow
[(V64SF "V16SF") (V64SI "V16SI")])
-(define_insn "mov<mode>"
+(define_expand "mov<mode>"
[(set (match_operand:IMOD4 0 "nonimmediate_operand")
- (match_operand:IMOD4 1 "general_operand"))]
+ (match_operand:IMOD4 1 "vector_move_operand"))]
"TARGET_AVX512F"
- "#")
+{
+ ix86_expand_vector_move (<MODE>mode, operands);
+ DONE;
+})
-(define_split
- [(set (match_operand:IMOD4 0 "register_operand")
- (match_operand:IMOD4 1 "nonimmediate_operand"))]
- "TARGET_AVX512F && reload_completed"
- [(set (subreg:<imod4_narrow> (match_dup 0) 0)
- (subreg:<imod4_narrow> (match_dup 1) 0))
- (set (subreg:<imod4_narrow> (match_dup 0) 64)
- (subreg:<imod4_narrow> (match_dup 1) 64))
- (set (subreg:<imod4_narrow> (match_dup 0) 128)
- (subreg:<imod4_narrow> (match_dup 1) 128))
- (set (subreg:<imod4_narrow> (match_dup 0) 192)
- (subreg:<imod4_narrow> (match_dup 1) 192))])
+(define_insn_and_split "*mov<mode>_internal"
+ [(set (match_operand:IMOD4 0 "nonimmediate_operand" "=v,v ,m")
+ (match_operand:IMOD4 1 "vector_move_operand" " C,vm,v"))]
+ "TARGET_AVX512F
+ && (register_operand (operands[0], <MODE>mode)
+ || register_operand (operands[1], <MODE>mode))"
+ "#"
+ "&& reload_completed"
+ [(const_int 0)]
+{
+ rtx op0, op1;
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ op0 = simplify_subreg
+ (<imod4_narrow>mode, operands[0], <MODE>mode, i * 64);
+ op1 = simplify_subreg
+ (<imod4_narrow>mode, operands[1], <MODE>mode, i * 64);
+ emit_move_insn (op0, op1);
+ }
+ DONE;
+})
(define_insn "avx5124fmaddps_4fmaddps"
[(set (match_operand:V16SF 0 "register_operand" "=v")