On 1/20/22 17:13, Robin Dapp wrote:
> Hi,
> 
> this patch splits the CCSmode into an integer and a floating point
> variant.  This allows ifcvt to consider floating point compares which
> would be rejected before because they could not be reversed.
> 
> Bootstrapped and regtested on s390x.
> 
> Is it OK?
> 
> Regards
>  Robin
> 
> --
> 
> gcc/ChangeLog:
> 
>       * config/s390/predicates.md: Add CCSINTmode and CCSFPmode.
>       * config/s390/s390-modes.def (UNORDERED): Likewise.
>       (CC_MODE): Likewise.
>       * config/s390/s390.cc (s390_cc_modes_compatible): Likewise.
>       (s390_match_ccmode_set): Likewise.
>       (s390_select_ccmode): Likewise.
>       (s390_branch_condition_mask): Likewise.
>       (s390_reverse_condition): Likewise.
>       * config/s390/s390.h (REVERSIBLE_CC_MODE): Likewise.
>       * config/s390/s390.md: Likewise.
>       * config/s390/subst.md: Likewise.

> diff --git a/gcc/config/s390/predicates.md b/gcc/config/s390/predicates.md
> index 33194d3f3d6..ec47416cc1b 100644
> --- a/gcc/config/s390/predicates.md
> +++ b/gcc/config/s390/predicates.md
> @@ -325,7 +325,8 @@
>      case E_CCURmode:
>        return GET_CODE (op) == LTU;
>
> -    case E_CCSmode:
> +    case E_CCSINTmode:
> +    case E_CCSFPmode:
>        return GET_CODE (op) == UNGT;

Can we get an UNGT for CCSINTmode here? Shouldn't this be just GT?

>
>      case E_CCSRmode:
> @@ -370,7 +371,8 @@
>      case E_CCURmode:
>        return GET_CODE (op) == GEU;
>
> -    case E_CCSmode:
> +    case E_CCSINTmode:
> +    case E_CCSFPmode:
>        return GET_CODE (op) == LE;
>
>      case E_CCSRmode:
> diff --git a/gcc/config/s390/s390-modes.def b/gcc/config/s390/s390-modes.def
> index b419907960e..eafe1e12938 100644
> --- a/gcc/config/s390/s390-modes.def
> +++ b/gcc/config/s390/s390-modes.def
> @@ -48,12 +48,12 @@ CCUR: EQ          GTU          LTU         NE         
> (CLGF/R)
>
>  Signed compares
>
> -CCS:  EQ          LT           GT          UNORDERED  (LTGFR, LTGR, LTR, 
> ICM/Y,
> -                                                       LTDBR, LTDR, LTEBR, 
> LTER,
> +CCSINT: EQ        LT           GT          UNORDERED  (LTGFR, LTGR, LTR, 
> ICM/Y,

CC3 for signed integer compares should not occur. So perhaps '-' instead of 
UNORDERED?

>                                                         CG/R, C/R/Y, CGHI, 
> CHI,
> -                                                       CDB/R, CD/R, CEB/R, 
> CE/R,
> -                                                       ADB/R, AEB/R, SDB/R, 
> SEB/R,
>                                                         SRAG, SRA, SRDA)
> +CCSFP:  EQ        LT           GT          UNORDERED  (CDB/R, CD/R, CEB/R, 
> CE/R,
> +                                                       LTDBR, LTDR, LTEBR, 
> LTER,
> +                                                       ADB/R, AEB/R, SDB/R, 
> SEB/R)
>  CCSR: EQ          GT           LT          UNORDERED  (CGF/R, CH/Y)
>  CCSFPS: EQ        LT           GT          UNORDERED  (KEB/R, KDB/R, KXBR, 
> KDTR,
>                                                      KXTR, WFK)
...
> @@ -2139,7 +2148,8 @@ s390_branch_condition_mask (rtx code)
>       }
>        break;
>
> -    case E_CCSmode:
> +    case E_CCSINTmode:
> +    case E_CCSFPmode:
>      case E_CCSFPSmode:
>        switch (GET_CODE (code))
>       {

We will need a new switch statement for CCSINT without all the FP only 
comparison operators.

Andreas

Reply via email to