On 09/22/2014 11:45 PM, Zhenqiang Chen wrote:
> +static unsigned int
> +aarch64_code_to_nzcv (enum rtx_code code, bool inverse) {
> +  switch (code)
> +    {
> +    case NE: /* NE, Z == 0.  */
> +      return inverse ? AARCH64_CC_Z : 0;
> +    case EQ: /* EQ, Z == 1.  */
> +      return inverse ? 0 : AARCH64_CC_Z;
> +    case LE: /* LE, !(Z == 0 && N == V).  */
> +      return inverse ? AARCH64_CC_N | AARCH64_CC_V : AARCH64_CC_Z;
> +    case GT: /* GT, Z == 0 && N == V.  */
> +      return inverse ? AARCH64_CC_Z : AARCH64_CC_N | AARCH64_CC_V;
> +    case LT: /* LT, N != V.  */
> +      return inverse ? AARCH64_CC_N | AARCH64_CC_V : AARCH64_CC_N;
> +    case GE: /* GE, N == V.  */
> +      return inverse ? AARCH64_CC_N : AARCH64_CC_N | AARCH64_CC_V;
> +    case LEU: /* LS, !(C == 1 && Z == 0).  */
> +      return inverse ? AARCH64_CC_C: AARCH64_CC_Z;
> +    case GTU: /* HI, C ==1 && Z == 0.  */
> +      return inverse ? AARCH64_CC_Z : AARCH64_CC_C;
> +    case LTU: /* CC, C == 0.  */
> +      return inverse ? AARCH64_CC_C : 0;
> +    case GEU: /* CS, C == 1.  */
> +      return inverse ? 0 : AARCH64_CC_C;
> +    default:
> +      gcc_unreachable ();
> +      return 0;
> +    }
> +}
> +

I'm not overly fond of this, since "code" doesn't map 1-1.  It needs the
context of a mode to provide a unique mapping.

I think it would be better to rearrange the existing aarch64_cond_code enum
such that AARCH64_NE et al are meaningful wrt NZCV.  Then you can use
aarch64_get_condition_code_1 to get this mapping.

> +static unsigned
> +aarch64_mode_to_condition_code (enum machine_mode mode, bool
> inverse) {
> +  switch (mode)
> +    {
> +    case CC_DNEmode:
> +      return inverse ? aarch64_get_condition_code_1 (CCmode, EQ)
> +                      : aarch64_get_condition_code_1 (CCmode, NE);

This function is just silly.  Modulo the unsigned result, which is wrong after
the rebase, the whole thing reduces to

  return aarch64_get_condition_code_1 (mode, inverse ? EQ : NE);

I'm really not sure what you're after here.

> +const char *
> +aarch64_output_ccmp (rtx *operands, bool is_and, int which_alternative)

Is this really used more than once?  I'm not fond of the use of
which_alternative without the context of a pattern.  I think this could simply
be inlined.


r~

Reply via email to