Currently we use %k to interpret an aarch64_cond_code value.
This interpretation is done via an array, aarch64_nzcv_codes.
The rtl is neither hindered nor harmed by using the proper
nzcv value itself, so index the array earlier than later.
This makes it easier to compare the rtl to the assembly.

It is slightly confusing in that aarch64_nzcv_codes has
values of nzcv which produce the inverse of the code that
is the index.  Invert those values.

        * config/aarch64/aarch64.c (AARCH64_CC_{NZCV}): Move up.
        (aarch64_nzcv_codes): Move up; reverse values of even/odd entries.
        (aarch64_gen_compare_reg): Use aarch64_nzcv_codes in
        gen_ccmpccdi generation.
        (aarch64_print_operand): Remove case 'k'.
        (aarch64_gen_ccmp_next): Invert condition for !AND, remove
        inversion for AND; use aarch64_nzcv_codes.
        * config/aarch64/aarch64.md (*ccmpcc<GPI>): Remove %k from
        all alternatives.
        (*ccmpcc<GPI>_rev, *ccmp<CCFP><GPF>, *ccmp<CCFP><GPF>_rev): Likewise.
---
 gcc/config/aarch64/aarch64.c  | 81 +++++++++++++++--------------------
 gcc/config/aarch64/aarch64.md | 16 +++----
 2 files changed, 42 insertions(+), 55 deletions(-)

diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 16ff40fc267..d7899dad759 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -1270,6 +1270,36 @@ aarch64_cc;
 
 #define AARCH64_INVERSE_CONDITION_CODE(X) ((aarch64_cc) (((int) X) ^ 1))
 
+/* N Z C V.  */
+#define AARCH64_CC_V 1
+#define AARCH64_CC_C (1 << 1)
+#define AARCH64_CC_Z (1 << 2)
+#define AARCH64_CC_N (1 << 3)
+
+/*
+ * N Z C V flags for ccmp.  Indexed by aarch64_cond_code.
+ * These are the flags to make the given code be *true*.
+ */
+static const int aarch64_nzcv_codes[] =
+{
+  AARCH64_CC_Z,        /* EQ, Z == 1.  */
+  0,           /* NE, Z == 0.  */
+  AARCH64_CC_C,        /* CS, C == 1.  */
+  0,           /* CC, C == 0.  */
+  AARCH64_CC_N,        /* MI, N == 1.  */
+  0,           /* PL, N == 0.  */
+  AARCH64_CC_V,        /* VS, V == 1.  */
+  0,           /* VC, V == 0.  */
+  AARCH64_CC_C,        /* HI, C == 1 && Z == 0.  */
+  0,           /* LS, !(C == 1 && Z == 0).  */
+  0,           /* GE, N == V.  */
+  AARCH64_CC_V,        /* LT, N != V.  */
+  0,           /* GT, Z == 0 && N == V.  */
+  AARCH64_CC_V,        /* LE, !(Z == 0 && N == V).  */
+  0,           /* AL, Any.  */
+  0            /* NV, Any.  */
+};
+
 struct aarch64_branch_protect_type
 {
   /* The type's name that the user passes to the branch-protection option
@@ -2351,7 +2381,7 @@ aarch64_gen_compare_reg (RTX_CODE code, rtx x, rtx y)
       rtx y_hi = operand_subword (y, 1, 0, TImode);
       emit_insn (gen_ccmpccdi (cc_reg, x_hi, y_hi,
                               gen_rtx_EQ (cc_mode, cc_reg, const0_rtx),
-                              GEN_INT (AARCH64_EQ)));
+                              GEN_INT (aarch64_nzcv_codes[AARCH64_NE])));
     }
   else
     {
@@ -9302,33 +9332,6 @@ aarch64_const_vec_all_in_range_p (rtx vec,
   return true;
 }
 
-/* N Z C V.  */
-#define AARCH64_CC_V 1
-#define AARCH64_CC_C (1 << 1)
-#define AARCH64_CC_Z (1 << 2)
-#define AARCH64_CC_N (1 << 3)
-
-/* N Z C V flags for ccmp.  Indexed by AARCH64_COND_CODE.  */
-static const int aarch64_nzcv_codes[] =
-{
-  0,           /* EQ, Z == 1.  */
-  AARCH64_CC_Z,        /* NE, Z == 0.  */
-  0,           /* CS, C == 1.  */
-  AARCH64_CC_C,        /* CC, C == 0.  */
-  0,           /* MI, N == 1.  */
-  AARCH64_CC_N, /* PL, N == 0.  */
-  0,           /* VS, V == 1.  */
-  AARCH64_CC_V, /* VC, V == 0.  */
-  0,           /* HI, C ==1 && Z == 0.  */
-  AARCH64_CC_C,        /* LS, !(C == 1 && Z == 0).  */
-  AARCH64_CC_V,        /* GE, N == V.  */
-  0,           /* LT, N != V.  */
-  AARCH64_CC_Z, /* GT, Z == 0 && N == V.  */
-  0,           /* LE, !(Z == 0 && N == V).  */
-  0,           /* AL, Any.  */
-  0            /* NV, Any.  */
-};
-
 /* Print floating-point vector immediate operand X to F, negating it
    first if NEGATE is true.  Return true on success, false if it isn't
    a constant we can handle.  */
@@ -9416,7 +9419,6 @@ sizetochar (int size)
                        (32-bit or 64-bit).
      '0':              Print a normal operand, if it's a general register,
                        then we assume DImode.
-     'k':              Print NZCV for conditional compare instructions.
      'A':              Output address constant representing the first
                        argument of X, specifying a relocation offset
                        if appropriate.
@@ -9866,22 +9868,6 @@ aarch64_print_operand (FILE *f, rtx x, int code)
       output_addr_const (asm_out_file, x);
       break;
 
-    case 'k':
-      {
-       HOST_WIDE_INT cond_code;
-
-       if (!CONST_INT_P (x))
-         {
-           output_operand_lossage ("invalid operand for '%%%c'", code);
-           return;
-         }
-
-       cond_code = INTVAL (x);
-       gcc_assert (cond_code >= 0 && cond_code <= AARCH64_NV);
-       asm_fprintf (f, "%d", aarch64_nzcv_codes[cond_code]);
-      }
-      break;
-
     case 'y':
     case 'z':
       {
@@ -20514,14 +20500,15 @@ aarch64_gen_ccmp_next (rtx_insn **prep_seq, rtx_insn 
**gen_seq, rtx prev,
          rtx_code code = reverse_condition (prev_code);
          prev = gen_rtx_fmt_ee (code, VOIDmode, XEXP (prev, 0), const0_rtx);
        }
-      aarch64_cond = AARCH64_INVERSE_CONDITION_CODE (aarch64_cond);
     }
+  else
+    aarch64_cond = AARCH64_INVERSE_CONDITION_CODE (aarch64_cond);
 
   create_fixed_operand (&ops[0], target);
   create_fixed_operand (&ops[1], op0);
   create_fixed_operand (&ops[2], op1);
   create_fixed_operand (&ops[3], prev);
-  create_fixed_operand (&ops[4], GEN_INT (aarch64_cond));
+  create_fixed_operand (&ops[4], GEN_INT (aarch64_nzcv_codes[aarch64_cond]));
 
   push_to_sequence (*gen_seq);
   if (!maybe_expand_insn (icode, 5, ops))
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 12213176103..c789b641e7c 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -522,9 +522,9 @@
            UNSPEC_NZCV)))]
   ""
   "@
-   ccmp\\t%<w>2, %<w>3, %k5, %m4
-   ccmp\\t%<w>2, %3, %k5, %m4
-   ccmn\\t%<w>2, #%n3, %k5, %m4"
+   ccmp\\t%<w>2, %<w>3, %5, %m4
+   ccmp\\t%<w>2, %3, %5, %m4
+   ccmn\\t%<w>2, #%n3, %5, %m4"
   [(set_attr "type" "alus_sreg,alus_imm,alus_imm")]
 )
 
@@ -554,7 +554,7 @@
            [(match_operand 5 "immediate_operand")]
            UNSPEC_NZCV)))]
   "TARGET_FLOAT"
-  "fccmp<e>\\t%<s>2, %<s>3, %k5, %m4"
+  "fccmp<e>\\t%<s>2, %<s>3, %5, %m4"
   [(set_attr "type" "fccmp<s>")]
 )
 
@@ -585,9 +585,9 @@
            (match_operand:GPI 3 "aarch64_ccmp_operand" "r,Uss,Usn"))))]
   ""
   "@
-   ccmp\\t%<w>2, %<w>3, %k5, %M4
-   ccmp\\t%<w>2, %3, %k5, %M4
-   ccmn\\t%<w>2, #%n3, %k5, %M4"
+   ccmp\\t%<w>2, %<w>3, %5, %M4
+   ccmp\\t%<w>2, %3, %5, %M4
+   ccmn\\t%<w>2, #%n3, %5, %M4"
   [(set_attr "type" "alus_sreg,alus_imm,alus_imm")]
 )
 
@@ -617,7 +617,7 @@
            (match_operand:GPF 2 "register_operand" "w")
            (match_operand:GPF 3 "register_operand" "w"))))]
   "TARGET_FLOAT"
-  "fccmp<e>\\t%<s>2, %<s>3, %k5, %M4"
+  "fccmp<e>\\t%<s>2, %<s>3, %5, %M4"
   [(set_attr "type" "fccmp<s>")]
 )
 
-- 
2.20.1

Reply via email to