@@ -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))
@@ -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>")]
)