sse.md (*sse4_1_extractps): Change into define_insn_and_split...
* config/i386/sse.md (*sse4_1_extractps): Change into define_insn_and_split, add =x 0 n and =x x n alternatives and split them after reload. From-SVN: r178976
This commit is contained in:
parent
dac8a1db73
commit
5a1357fbe0
@ -1,3 +1,9 @@
|
|||||||
|
2011-09-19 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* config/i386/sse.md (*sse4_1_extractps): Change into
|
||||||
|
define_insn_and_split, add =x 0 n and =x x n alternatives
|
||||||
|
and split them after reload.
|
||||||
|
|
||||||
2011-09-19 Alexandre Oliva <aoliva@redhat.com>
|
2011-09-19 Alexandre Oliva <aoliva@redhat.com>
|
||||||
|
|
||||||
* tree.h (TREE_NOT_CHECK4): Rename from bogus NON_TREE_CHECK4.
|
* tree.h (TREE_NOT_CHECK4): Rename from bogus NON_TREE_CHECK4.
|
||||||
|
@ -4000,19 +4000,45 @@
|
|||||||
(const_string "OI")
|
(const_string "OI")
|
||||||
(const_string "V8SF")))])
|
(const_string "V8SF")))])
|
||||||
|
|
||||||
(define_insn "*sse4_1_extractps"
|
(define_insn_and_split "*sse4_1_extractps"
|
||||||
[(set (match_operand:SF 0 "nonimmediate_operand" "=rm")
|
[(set (match_operand:SF 0 "nonimmediate_operand" "=rm,x,x")
|
||||||
(vec_select:SF
|
(vec_select:SF
|
||||||
(match_operand:V4SF 1 "register_operand" "x")
|
(match_operand:V4SF 1 "register_operand" "x,0,x")
|
||||||
(parallel [(match_operand:SI 2 "const_0_to_3_operand" "n")])))]
|
(parallel [(match_operand:SI 2 "const_0_to_3_operand" "n,n,n")])))]
|
||||||
"TARGET_SSE4_1"
|
"TARGET_SSE4_1"
|
||||||
"%vextractps\t{%2, %1, %0|%0, %1, %2}"
|
"@
|
||||||
[(set_attr "type" "sselog")
|
%vextractps\t{%2, %1, %0|%0, %1, %2}
|
||||||
(set_attr "prefix_data16" "1")
|
#
|
||||||
(set_attr "prefix_extra" "1")
|
#"
|
||||||
(set_attr "length_immediate" "1")
|
"&& reload_completed && SSE_REG_P (operands[0])"
|
||||||
(set_attr "prefix" "maybe_vex")
|
[(const_int 0)]
|
||||||
(set_attr "mode" "V4SF")])
|
{
|
||||||
|
rtx dest = gen_rtx_REG (V4SFmode, REGNO (operands[0]));
|
||||||
|
switch (INTVAL (operands[2]))
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
case 3:
|
||||||
|
emit_insn (gen_sse_shufps_v4sf (dest, operands[1], operands[1],
|
||||||
|
operands[2], operands[2],
|
||||||
|
GEN_INT (INTVAL (operands[2]) + 4),
|
||||||
|
GEN_INT (INTVAL (operands[2]) + 4)));
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
emit_insn (gen_vec_interleave_highv4sf (dest, operands[1], operands[1]));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* 0 should be handled by the *vec_extractv4sf_0 pattern above. */
|
||||||
|
gcc_unreachable ();
|
||||||
|
}
|
||||||
|
DONE;
|
||||||
|
}
|
||||||
|
[(set_attr "isa" "*,noavx,avx")
|
||||||
|
(set_attr "type" "sselog,*,*")
|
||||||
|
(set_attr "prefix_data16" "1,*,*")
|
||||||
|
(set_attr "prefix_extra" "1,*,*")
|
||||||
|
(set_attr "length_immediate" "1,*,*")
|
||||||
|
(set_attr "prefix" "maybe_vex,*,*")
|
||||||
|
(set_attr "mode" "V4SF,*,*")])
|
||||||
|
|
||||||
(define_insn_and_split "*vec_extract_v4sf_mem"
|
(define_insn_and_split "*vec_extract_v4sf_mem"
|
||||||
[(set (match_operand:SF 0 "register_operand" "=x*rf")
|
[(set (match_operand:SF 0 "register_operand" "=x*rf")
|
||||||
|
Loading…
Reference in New Issue
Block a user