i386.md (setcc splitters): Add four splitters to simplify compound compares that simplify_comparison can't...
* config/i386/i386.md (setcc splitters): Add four splitters to simplify compound compares that simplify_comparison can't handle. From-SVN: r46203
This commit is contained in:
parent
6f32162af6
commit
1097820739
|
@ -1,3 +1,8 @@
|
|||
2001-10-11 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* config/i386/i386.md (setcc splitters): Add four splitters to
|
||||
simplify compound compares that simplify_comparison can't handle.
|
||||
|
||||
2001-10-11 Zack Weinberg <zack@codesourcery.com>
|
||||
|
||||
* cpplex.c (digraph_spellings, token_spellings): Make static.
|
||||
|
|
|
@ -12542,6 +12542,76 @@
|
|||
[(set_attr "type" "setcc")
|
||||
(set_attr "mode" "QI")])
|
||||
|
||||
;; In general it is not safe to assume too much about CCmode registers,
|
||||
;; so simplify-rtx stops when it sees a second one. Under certain
|
||||
;; conditions this is safe on x86, so help combine not create
|
||||
;;
|
||||
;; seta %al
|
||||
;; testb %al, %al
|
||||
;; sete %al
|
||||
|
||||
(define_split
|
||||
[(set (match_operand:QI 0 "nonimmediate_operand" "")
|
||||
(ne:QI (match_operator 1 "ix86_comparison_operator"
|
||||
[(reg 17) (const_int 0)])
|
||||
(const_int 0)))]
|
||||
""
|
||||
[(set (match_dup 0) (match_dup 1))]
|
||||
{
|
||||
PUT_MODE (operands[1], QImode);
|
||||
})
|
||||
|
||||
(define_split
|
||||
[(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" ""))
|
||||
(ne:QI (match_operator 1 "ix86_comparison_operator"
|
||||
[(reg 17) (const_int 0)])
|
||||
(const_int 0)))]
|
||||
""
|
||||
[(set (match_dup 0) (match_dup 1))]
|
||||
{
|
||||
PUT_MODE (operands[1], QImode);
|
||||
})
|
||||
|
||||
(define_split
|
||||
[(set (match_operand:QI 0 "nonimmediate_operand" "")
|
||||
(eq:QI (match_operator 1 "ix86_comparison_operator"
|
||||
[(reg 17) (const_int 0)])
|
||||
(const_int 0)))]
|
||||
""
|
||||
[(set (match_dup 0) (match_dup 1))]
|
||||
{
|
||||
rtx new_op1 = copy_rtx (operands[1]);
|
||||
operands[1] = new_op1;
|
||||
PUT_MODE (new_op1, QImode);
|
||||
PUT_CODE (new_op1, REVERSE_CONDITION (GET_CODE (new_op1),
|
||||
GET_MODE (XEXP (new_op1, 0))));
|
||||
|
||||
/* Make sure that (a) the CCmode we have for the flags is strong
|
||||
enough for the reversed compare or (b) we have a valid FP compare. */
|
||||
if (! ix86_comparison_operator (new_op1, VOIDmode))
|
||||
FAIL;
|
||||
})
|
||||
|
||||
(define_split
|
||||
[(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand" ""))
|
||||
(eq:QI (match_operator 1 "ix86_comparison_operator"
|
||||
[(reg 17) (const_int 0)])
|
||||
(const_int 0)))]
|
||||
""
|
||||
[(set (match_dup 0) (match_dup 1))]
|
||||
{
|
||||
rtx new_op1 = copy_rtx (operands[1]);
|
||||
operands[1] = new_op1;
|
||||
PUT_MODE (new_op1, QImode);
|
||||
PUT_CODE (new_op1, REVERSE_CONDITION (GET_CODE (new_op1),
|
||||
GET_MODE (XEXP (new_op1, 0))));
|
||||
|
||||
/* Make sure that (a) the CCmode we have for the flags is strong
|
||||
enough for the reversed compare or (b) we have a valid FP compare. */
|
||||
if (! ix86_comparison_operator (new_op1, VOIDmode))
|
||||
FAIL;
|
||||
})
|
||||
|
||||
;; The SSE store flag instructions saves 0 or 0xffffffff to the result.
|
||||
;; subsequent logical operations are used to imitate conditional moves.
|
||||
;; 0xffffffff is NaN, but not in normalized form, so we can't represent
|
||||
|
|
Loading…
Reference in New Issue