mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-21 23:41:13 +08:00
i386: Cleanup comparison predicates.
CCCmode is allowed only with GEU and LTU comparison codes. Also allow CCGZmode for these two codes. There is no need to check for trivial FP comparison operator, ix86_fp_compare_code_to_integer will return UNKNOWN code for unsupported operators. 2021-04-29 Uroš Bizjak <ubizjak@gmail.com> gcc/ * config/i386/predicates.md (fcmov_comparison_operator): Do not check for trivial FP comparison operator. <case GEU, case LTU>: Allow CCGZmode. <case GTU, case LEU>: Do not allow CCCmode. (ix86_comparison_operator) <case GTU, case LEU>: Allow only CCmode. (ix86_carry_flag_operator): Match only LTU and UNLT code. Do not check for trivial FP comparison operator. Allow CCGZmode.
This commit is contained in:
parent
fc14ff6111
commit
d03ca8a614
@ -1352,16 +1352,17 @@
|
||||
enum rtx_code code = GET_CODE (op);
|
||||
|
||||
if (inmode == CCFPmode)
|
||||
{
|
||||
if (!ix86_trivial_fp_comparison_operator (op, mode))
|
||||
return false;
|
||||
code = ix86_fp_compare_code_to_integer (code);
|
||||
}
|
||||
code = ix86_fp_compare_code_to_integer (code);
|
||||
|
||||
/* i387 supports just limited amount of conditional codes. */
|
||||
switch (code)
|
||||
{
|
||||
case LTU: case GTU: case LEU: case GEU:
|
||||
if (inmode == CCmode || inmode == CCFPmode || inmode == CCCmode)
|
||||
case GEU: case LTU:
|
||||
if (inmode == CCCmode || inmode == CCGZmode)
|
||||
return true;
|
||||
/* FALLTHRU */
|
||||
case GTU: case LEU:
|
||||
if (inmode == CCmode || inmode == CCFPmode)
|
||||
return true;
|
||||
return false;
|
||||
case ORDERED: case UNORDERED:
|
||||
@ -1418,11 +1419,11 @@
|
||||
return true;
|
||||
return false;
|
||||
case GEU: case LTU:
|
||||
if (inmode == CCGZmode)
|
||||
if (inmode == CCCmode || inmode == CCGZmode)
|
||||
return true;
|
||||
/* FALLTHRU */
|
||||
case GTU: case LEU:
|
||||
if (inmode == CCmode || inmode == CCCmode || inmode == CCGZmode)
|
||||
if (inmode == CCmode)
|
||||
return true;
|
||||
return false;
|
||||
case ORDERED: case UNORDERED:
|
||||
@ -1441,20 +1442,14 @@
|
||||
;; Return true if OP is a valid comparison operator
|
||||
;; testing carry flag to be set.
|
||||
(define_predicate "ix86_carry_flag_operator"
|
||||
(match_code "ltu,lt,unlt,gtu,gt,ungt,le,unle,ge,unge,ltgt,uneq")
|
||||
(match_code "ltu,unlt")
|
||||
{
|
||||
machine_mode inmode = GET_MODE (XEXP (op, 0));
|
||||
enum rtx_code code = GET_CODE (op);
|
||||
|
||||
if (inmode == CCFPmode)
|
||||
{
|
||||
if (!ix86_trivial_fp_comparison_operator (op, mode))
|
||||
return false;
|
||||
code = ix86_fp_compare_code_to_integer (code);
|
||||
}
|
||||
else if (inmode == CCCmode)
|
||||
return code == LTU || code == GTU;
|
||||
else if (inmode != CCmode)
|
||||
code = ix86_fp_compare_code_to_integer (code);
|
||||
else if (inmode != CCmode && inmode != CCCmode && inmode != CCGZmode)
|
||||
return false;
|
||||
|
||||
return code == LTU;
|
||||
|
Loading…
x
Reference in New Issue
Block a user