i386.md (and<mode>3): Generate zero-extends for TARGET_ZERO_EXTEND_WITH_AND &&...

* config/i386/i386.md (and<mode>3): Generate zero-extends for
	TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun))
	only.
	(*anddi3_doubleword): Split before reload. Merge with
	anddi->zext pre-reload splitter.
	(*andndi3_doubleword): Split before reload.
	(*<code>di3_doubleword): Ditto.
	(*one_cmpldi2_doubleword): Ditto.

From-SVN: r272323
This commit is contained in:
Uros Bizjak 2019-06-15 09:32:02 +02:00 committed by Uros Bizjak
parent 211b7533bf
commit 9919f5fe87
2 changed files with 77 additions and 91 deletions

View File

@ -1,3 +1,14 @@
2019-06-15 Uroš Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (and<mode>3): Generate zero-extends for
TARGET_ZERO_EXTEND_WITH_AND && optimize_function_for_speed_p (cfun))
only.
(*anddi3_doubleword): Split before reload. Merge with
anddi->zext pre-reload splitter.
(*andndi3_doubleword): Split before reload.
(*<code>di3_doubleword): Ditto.
(*one_cmpldi2_doubleword): Ditto.
2019-06-15 Jakub Jelinek <jakub@redhat.com>
PR middle-end/90779

View File

@ -8365,7 +8365,10 @@
if (<MODE>mode == DImode && !TARGET_64BIT)
;
else if (CONST_INT_P (operands[2]) && REG_P (operands[0]))
else if (const_int_operand (operands[2], <MODE>mode)
&& register_operand (operands[0], <MODE>mode)
&& !(TARGET_ZERO_EXTEND_WITH_AND
&& optimize_function_for_speed_p (cfun)))
{
unsigned HOST_WIDE_INT ival = UINTVAL (operands[2]);
@ -8388,68 +8391,34 @@
})
(define_insn_and_split "*anddi3_doubleword"
[(set (match_operand:DI 0 "nonimmediate_operand" "=r,rm,r")
(and:DI
(match_operand:DI 1 "nonimmediate_operand" "%0,0,0")
(match_operand:DI 2 "x86_64_szext_general_operand" "Z,re,rm")))
(clobber (reg:CC FLAGS_REG))]
"!TARGET_64BIT && TARGET_STV && TARGET_SSE2
&& ix86_binary_operator_ok (AND, DImode, operands)"
"#"
"&& reload_completed"
[(const_int 0)]
{
split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);
if (operands[2] == const0_rtx)
{
operands[1] = const0_rtx;
ix86_expand_move (SImode, &operands[0]);
}
else if (operands[2] != constm1_rtx)
ix86_expand_binary_operator (AND, SImode, &operands[0]);
else if (operands[5] == constm1_rtx)
emit_note (NOTE_INSN_DELETED);
if (operands[5] == const0_rtx)
{
operands[4] = const0_rtx;
ix86_expand_move (SImode, &operands[3]);
}
else if (operands[5] != constm1_rtx)
ix86_expand_binary_operator (AND, SImode, &operands[3]);
DONE;
})
(define_split
[(set (match_operand:DI 0 "register_operand")
[(set (match_operand:DI 0 "nonimmediate_operand")
(and:DI
(match_operand:DI 1 "nonimmediate_operand")
(match_operand:DI 2 "const_int_operand")))
(match_operand:DI 2 "x86_64_szext_general_operand")))
(clobber (reg:CC FLAGS_REG))]
"!TARGET_64BIT && TARGET_STV && TARGET_SSE2
&& ix86_binary_operator_ok (AND, DImode, operands)
&& can_create_pseudo_p ()"
"#"
"&& 1"
[(const_int 0)]
{
unsigned HOST_WIDE_INT ival = UINTVAL (operands[2]);
machine_mode mode;
if (ival == GET_MODE_MASK (SImode))
mode = SImode;
else if (ival == GET_MODE_MASK (HImode))
mode = HImode;
else if (ival == GET_MODE_MASK (QImode))
mode = QImode;
else
FAIL;
split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);
if (mode == SImode)
if (operands[2] == const0_rtx)
emit_move_insn (operands[0], const0_rtx);
else if (operands[2] == constm1_rtx)
emit_move_insn (operands[0], operands[1]);
else
emit_insn (gen_extend_insn
(operands[0], gen_lowpart (mode, operands[1]),
SImode, mode, 1));
emit_move_insn (operands[3], const0_rtx);
emit_insn (gen_andsi3 (operands[0], operands[1], operands[2]));
if (operands[5] == const0_rtx)
emit_move_insn (operands[3], const0_rtx);
else if (operands[5] == constm1_rtx)
emit_move_insn (operands[3], operands[4]);
else
emit_insn (gen_andsi3 (operands[3], operands[4], operands[5]));
DONE;
})
@ -8886,14 +8855,14 @@
})
(define_insn "*andndi3_doubleword"
[(set (match_operand:DI 0 "register_operand" "=&r,r,r,&r")
[(set (match_operand:DI 0 "register_operand")
(and:DI
(not:DI (match_operand:DI 1 "register_operand" "r,0,r,0"))
(match_operand:DI 2 "nonimmediate_operand" "rm,rm,0,rm")))
(not:DI (match_operand:DI 1 "register_operand"))
(match_operand:DI 2 "nonimmediate_operand")))
(clobber (reg:CC FLAGS_REG))]
"!TARGET_64BIT && TARGET_STV && TARGET_SSE2"
"#"
[(set_attr "isa" "bmi,bmi,bmi,*")])
"!TARGET_64BIT && TARGET_STV && TARGET_SSE2
&& can_create_pseudo_p ()"
"#")
(define_split
[(set (match_operand:DI 0 "register_operand")
@ -8902,7 +8871,7 @@
(match_operand:DI 2 "nonimmediate_operand")))
(clobber (reg:CC FLAGS_REG))]
"!TARGET_64BIT && TARGET_BMI && TARGET_STV && TARGET_SSE2
&& reload_completed"
&& can_create_pseudo_p ()"
[(parallel [(set (match_dup 0)
(and:SI (not:SI (match_dup 1)) (match_dup 2)))
(clobber (reg:CC FLAGS_REG))])
@ -8914,20 +8883,25 @@
(define_split
[(set (match_operand:DI 0 "register_operand")
(and:DI
(not:DI (match_dup 0))
(match_operand:DI 1 "nonimmediate_operand")))
(not:DI (match_operand:DI 1 "register_operand"))
(match_operand:DI 2 "nonimmediate_operand")))
(clobber (reg:CC FLAGS_REG))]
"!TARGET_64BIT && !TARGET_BMI && TARGET_STV && TARGET_SSE2
&& reload_completed"
[(set (match_dup 0) (not:SI (match_dup 0)))
&& can_create_pseudo_p ()"
[(set (match_dup 6) (not:SI (match_dup 1)))
(parallel [(set (match_dup 0)
(and:SI (match_dup 0) (match_dup 1)))
(and:SI (match_dup 6) (match_dup 2)))
(clobber (reg:CC FLAGS_REG))])
(set (match_dup 2) (not:SI (match_dup 2)))
(parallel [(set (match_dup 2)
(and:SI (match_dup 2) (match_dup 3)))
(set (match_dup 7) (not:SI (match_dup 4)))
(parallel [(set (match_dup 3)
(and:SI (match_dup 7) (match_dup 5)))
(clobber (reg:CC FLAGS_REG))])]
"split_double_mode (DImode, &operands[0], 2, &operands[0], &operands[2]);")
{
operands[6] = gen_reg_rtx (SImode);
operands[7] = gen_reg_rtx (SImode);
split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);
})
(define_insn "*andn<mode>_1"
[(set (match_operand:SWI48 0 "register_operand" "=r,r")
@ -8980,44 +8954,44 @@
"ix86_expand_binary_operator (<CODE>, <MODE>mode, operands); DONE;")
(define_insn_and_split "*<code>di3_doubleword"
[(set (match_operand:DI 0 "nonimmediate_operand" "=r,rm,r")
[(set (match_operand:DI 0 "nonimmediate_operand")
(any_or:DI
(match_operand:DI 1 "nonimmediate_operand" "%0,0,0")
(match_operand:DI 2 "x86_64_szext_general_operand" "Z,re,rm")))
(match_operand:DI 1 "nonimmediate_operand")
(match_operand:DI 2 "x86_64_szext_general_operand")))
(clobber (reg:CC FLAGS_REG))]
"!TARGET_64BIT && TARGET_STV && TARGET_SSE2
&& ix86_binary_operator_ok (<CODE>, DImode, operands)"
&& ix86_binary_operator_ok (<CODE>, DImode, operands)
&& can_create_pseudo_p ()"
"#"
"&& reload_completed"
"&& 1"
[(const_int 0)]
{
split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);
if (operands[2] == constm1_rtx)
if (operands[2] == const0_rtx)
emit_move_insn (operands[0], operands[1]);
else if (operands[2] == constm1_rtx)
{
if (<CODE> == IOR)
{
operands[1] = constm1_rtx;
ix86_expand_move (SImode, &operands[0]);
}
emit_move_insn (operands[0], constm1_rtx);
else
ix86_expand_unary_operator (NOT, SImode, &operands[0]);
}
else if (operands[2] != const0_rtx)
else
ix86_expand_binary_operator (<CODE>, SImode, &operands[0]);
else if (operands[5] == const0_rtx)
emit_note (NOTE_INSN_DELETED);
if (operands[5] == constm1_rtx)
if (operands[5] == const0_rtx)
emit_move_insn (operands[3], operands[4]);
else if (operands[5] == constm1_rtx)
{
if (<CODE> == IOR)
{
operands[4] = constm1_rtx;
ix86_expand_move (SImode, &operands[3]);
}
emit_move_insn (operands[3], constm1_rtx);
else
ix86_expand_unary_operator (NOT, SImode, &operands[3]);
}
else if (operands[5] != const0_rtx)
else
ix86_expand_binary_operator (<CODE>, SImode, &operands[3]);
DONE;
})
@ -9673,12 +9647,13 @@
"ix86_expand_unary_operator (NOT, <MODE>mode, operands); DONE;")
(define_insn_and_split "*one_cmpldi2_doubleword"
[(set (match_operand:DI 0 "nonimmediate_operand" "=rm")
(not:DI (match_operand:DI 1 "nonimmediate_operand" "0")))]
[(set (match_operand:DI 0 "nonimmediate_operand")
(not:DI (match_operand:DI 1 "nonimmediate_operand")))]
"!TARGET_64BIT && TARGET_STV && TARGET_SSE2
&& ix86_unary_operator_ok (NOT, DImode, operands)"
&& ix86_unary_operator_ok (NOT, DImode, operands)
&& can_create_pseudo_p ()"
"#"
"&& reload_completed"
"&& 1"
[(set (match_dup 0)
(not:SI (match_dup 1)))
(set (match_dup 2)