The CB<cond> family of instructions does not support using the CS or CC
condition codes; instead the synonyms HS and LO must be used. GCC has
traditionally used the CS and CC names. To work around this while
avoiding test churn, add new `j` and `J` format specifiers and use them
when generating CB<cond> instructions.
Also reformat the definition of the `aarch64_cond_code` enum while we're
in the same neighbourhood, to make the relationship between each code
and its inverse more obvious.
gcc/ChangeLog:
* config/aarch64/aarch64.cc (aarch64_cond_code): Reformat.
(aarch64_print_operand): Add new 'j' and 'J' format specifiers.
* config/aarch64/aarch64.md: Use new specifiers.
gcc/testsuite/ChangeLog:
* gcc.target/aarch64/cmpbr.c: Update tests.
---
gcc/config/aarch64/aarch64.cc | 35 ++++++++++++++++++------
gcc/config/aarch64/aarch64.md | 4 +--
gcc/testsuite/gcc.target/aarch64/cmpbr.c | 16 +++++------
3 files changed, 37 insertions(+), 18 deletions(-)
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 5000672e4a2..9ab324cb2ec 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -913,11 +913,17 @@ static const scoped_attribute_specs *const
aarch64_attribute_table[] =
&aarch64_arm_attribute_table
};
-typedef enum aarch64_cond_code
-{
- AARCH64_EQ = 0, AARCH64_NE, AARCH64_CS, AARCH64_CC, AARCH64_MI, AARCH64_PL,
- AARCH64_VS, AARCH64_VC, AARCH64_HI, AARCH64_LS, AARCH64_GE, AARCH64_LT,
- AARCH64_GT, AARCH64_LE, AARCH64_AL, AARCH64_NV
+/* The condition codes come in opposing pairs. To get the inverse of a given
+ condition, simply flip the LSB. */
+typedef enum aarch64_cond_code {
+ AARCH64_EQ = 0x00, AARCH64_NE = 0x01,
+ AARCH64_CS = 0x02, AARCH64_CC = 0x03,
+ AARCH64_MI = 0x04, AARCH64_PL = 0x05,
+ AARCH64_VS = 0x06, AARCH64_VC = 0x07,
+ AARCH64_HI = 0x08, AARCH64_LS = 0x09,
+ AARCH64_GE = 0x0A, AARCH64_LT = 0x0B,
+ AARCH64_GT = 0x0C, AARCH64_LE = 0x0D,
+ AARCH64_AL = 0x0E, AARCH64_NV = 0x0F,
}
aarch64_cc;
@@ -12289,64 +12295,67 @@ static char
sizetochar (int size)
{
switch (size)
{
case 64: return 'd';
case 32: return 's';
case 16: return 'h';
case 8: return 'b';
default: gcc_unreachable ();
}
}
/* Print operand X to file F in a target specific manner according to CODE.
The acceptable formatting commands given by CODE are:
'c': An integer or symbol address without a preceding #
sign.
'C': Take the duplicated element in a vector constant
and print it in hex.
'D': Take the duplicated element in a vector constant
and print it as an unsigned integer, in decimal.
'e': Print the sign/zero-extend size as a character 8->b,
16->h, 32->w. Can also be used for masks:
0xff->b, 0xffff->h, 0xffffffff->w.
'I': If the operand is a duplicated vector constant,
replace it with the duplicated scalar. If the
operand is then a floating-point constant, replace
it with the integer bit representation. Print the
transformed constant as a signed decimal number.
'p': Prints N such that 2^N == X (X must be power of 2 and
const int).
'P': Print the number of non-zero bits in X (a const_int).
'H': Print the higher numbered register of a pair (TImode)
of regs.
'm': Print a condition (eq, ne, etc).
'M': Same as 'm', but invert condition.
+ 'j': Same as 'm', but use use `hs` and `lo`
+ instead of `cs` and `cc`.
+ 'J': Same as 'j', but invert condition.
'N': Take the duplicated element in a vector constant
and print the negative of it in decimal.
'b/h/s/d/q': Print a scalar FP/SIMD register name.
'Z': Same for SVE registers. ('z' was already taken.)
Note that it is not necessary to use %Z for operands
that have SVE modes. The convention is to use %Z
only for non-SVE (or potentially non-SVE) modes.
'S/T/U/V': Print a FP/SIMD register name for a register
list.
The register printed is the FP/SIMD register name
of X + 0/1/2/3 for S/T/U/V.
'R': Print a scalar Integer/FP/SIMD register name + 1.
'X': Print bottom 16 bits of integer constant in hex.
'w/x': Print a general register name or the zero register
(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.
'K': Print a predicate register as pn<N> rather than p<N>
'A': Output address constant representing the first
argument of X, specifying a relocation offset
if appropriate.
'L': Output constant address specified by X
with a relocation offset if appropriate.
'G': Prints address of X, specifying a PC relative
relocation mode if appropriate.
'y': Output address of LDP or STP - this is used for
some LDP/STPs which don't use a PARALLEL in their
pattern (so the mode needs to be adjusted).
'z': Output address of a typical LDP or STP. */
@@ -12355,494 +12364,504 @@ static void
aarch64_print_operand (FILE *f, rtx x, int code)
{
rtx elt;
switch (code)
{
case 'c':
if (CONST_INT_P (x))
fprintf (f, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
else
{
poly_int64 offset;
rtx base = strip_offset_and_salt (x, &offset);
if (SYMBOL_REF_P (base))
output_addr_const (f, x);
else
output_operand_lossage ("unsupported operand for code '%c'", code);
}
break;
case 'e':
{
x = unwrap_const_vec_duplicate (x);
if (!CONST_INT_P (x))
{
output_operand_lossage ("invalid operand for '%%%c'", code);
return;
}
HOST_WIDE_INT val = INTVAL (x);
if ((val & ~7) == 8 || val == 0xff)
fputc ('b', f);
else if ((val & ~7) == 16 || val == 0xffff)
fputc ('h', f);
else if ((val & ~7) == 32 || val == 0xffffffff)
fputc ('w', f);
else
{
output_operand_lossage ("invalid operand for '%%%c'", code);
return;
}
}
break;
case 'p':
{
int n;
if (!CONST_INT_P (x) || (n = exact_log2 (INTVAL (x))) < 0)
{
output_operand_lossage ("invalid operand for '%%%c'", code);
return;
}
asm_fprintf (f, "%d", n);
}
break;
case 'P':
if (!CONST_INT_P (x))
{
output_operand_lossage ("invalid operand for '%%%c'", code);
return;
}
asm_fprintf (f, "%u", popcount_hwi (INTVAL (x)));
break;
case 'H':
if (x == const0_rtx)
{
asm_fprintf (f, "xzr");
break;
}
if (!REG_P (x) || !GP_REGNUM_P (REGNO (x) + 1))
{
output_operand_lossage ("invalid operand for '%%%c'", code);
return;
}
asm_fprintf (f, "%s", reg_names [REGNO (x) + 1]);
break;
case 'I':
{
x = aarch64_bit_representation (unwrap_const_vec_duplicate (x));
if (CONST_INT_P (x))
asm_fprintf (f, "%wd", INTVAL (x));
else
{
output_operand_lossage ("invalid operand for '%%%c'", code);
return;
}
break;
}
case 'M':
case 'm':
+ case 'j':
+ case 'J':
{
int cond_code;
/* CONST_TRUE_RTX means al/nv (al is the default, don't print it). */
if (x == const_true_rtx)
{
- if (code == 'M')
+ if (code == 'M' || code == 'J')
fputs ("nv", f);
return;
}
if (!COMPARISON_P (x))
{
output_operand_lossage ("invalid operand for '%%%c'", code);
return;
}
cond_code = aarch64_get_condition_code (x);
gcc_assert (cond_code >= 0);
- if (code == 'M')
+ if (code == 'M' || code == 'J')
cond_code = AARCH64_INVERSE_CONDITION_CODE (cond_code);
if (GET_MODE (XEXP (x, 0)) == CC_NZCmode)
fputs (aarch64_sve_condition_codes[cond_code], f);
else
- fputs (aarch64_condition_codes[cond_code], f);
+ {
+ auto name = aarch64_condition_codes[cond_code];
+ if (code == 'j' || code == 'J')
+ {
+ if (cond_code == AARCH64_CS) name = "hs";
+ if (cond_code == AARCH64_CC) name = "lo";
+ }
+ fputs (name, f);
+ }
}
break;
case 'N':
if (!const_vec_duplicate_p (x, &elt))
{
output_operand_lossage ("invalid vector constant");
return;
}
if (GET_MODE_CLASS (GET_MODE (x)) == MODE_VECTOR_INT)
asm_fprintf (f, "%wd", (HOST_WIDE_INT) -UINTVAL (elt));
else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_VECTOR_FLOAT
&& aarch64_print_vector_float_operand (f, x, true))
;
else
{
output_operand_lossage ("invalid vector constant");
return;
}
break;
case 'b':
case 'h':
case 's':
case 'd':
case 'q':
case 'Z':
code = TOLOWER (code);
if (!REG_P (x) || !FP_REGNUM_P (REGNO (x)))
{
output_operand_lossage ("incompatible floating point / vector
register operand for '%%%c'", code);
return;
}
asm_fprintf (f, "%c%d", code, REGNO (x) - V0_REGNUM);
break;
case 'S':
case 'T':
case 'U':
case 'V':
if (!REG_P (x) || (!FP_REGNUM_P (REGNO (x)) && !PR_REGNUM_P (REGNO (x))))
{
output_operand_lossage ("incompatible operand for '%%%c'", code);
return;
}
if (PR_REGNUM_P (REGNO (x)))
asm_fprintf (f, "p%d", REGNO (x) - P0_REGNUM + (code - 'S'));
else
asm_fprintf (f, "%c%d",
aarch64_sve_data_mode_p (GET_MODE (x)) ? 'z' : 'v',
REGNO (x) - V0_REGNUM + (code - 'S'));
break;
case 'R':
if (REG_P (x) && FP_REGNUM_P (REGNO (x))
&& (aarch64_advsimd_partial_struct_mode_p (GET_MODE (x))))
asm_fprintf (f, "d%d", REGNO (x) - V0_REGNUM + 1);
else if (REG_P (x) && FP_REGNUM_P (REGNO (x)))
asm_fprintf (f, "q%d", REGNO (x) - V0_REGNUM + 1);
else if (REG_P (x) && GP_REGNUM_P (REGNO (x)))
asm_fprintf (f, "x%d", REGNO (x) - R0_REGNUM + 1);
else
output_operand_lossage ("incompatible register operand for '%%%c'",
code);
break;
case 'X':
if (!CONST_INT_P (x))
{
output_operand_lossage ("invalid operand for '%%%c'", code);
return;
}
asm_fprintf (f, "0x%wx", UINTVAL (x) & 0xffff);
break;
case 'C':
{
/* Print a replicated constant in hex. */
if (!const_vec_duplicate_p (x, &elt) || !CONST_INT_P (elt))
{
output_operand_lossage ("invalid operand for '%%%c'", code);
return;
}
scalar_mode inner_mode = GET_MODE_INNER (GET_MODE (x));
asm_fprintf (f, "0x%wx", UINTVAL (elt) & GET_MODE_MASK (inner_mode));
}
break;
case 'D':
{
/* Print a replicated constant in decimal, treating it as
unsigned. */
if (!const_vec_duplicate_p (x, &elt) || !CONST_INT_P (elt))
{
output_operand_lossage ("invalid operand for '%%%c'", code);
return;
}
scalar_mode inner_mode = GET_MODE_INNER (GET_MODE (x));
asm_fprintf (f, "%wd", UINTVAL (elt) & GET_MODE_MASK (inner_mode));
}
break;
case 'w':
case 'x':
if (aarch64_const_zero_rtx_p (x))
{
asm_fprintf (f, "%czr", code);
break;
}
if (REG_P (x) && GP_REGNUM_P (REGNO (x)))
{
asm_fprintf (f, "%c%d", code, REGNO (x) - R0_REGNUM);
break;
}
if (REG_P (x) && REGNO (x) == SP_REGNUM)
{
asm_fprintf (f, "%ssp", code == 'w' ? "w" : "");
break;
}
/* Fall through */
case 0:
if (x == NULL)
{
output_operand_lossage ("missing operand");
return;
}
switch (GET_CODE (x))
{
case CONST_STRING:
{
asm_fprintf (f, "%s", XSTR (x, 0));
break;
}
case REG:
if (aarch64_sve_data_mode_p (GET_MODE (x)))
{
if (REG_NREGS (x) == 1)
asm_fprintf (f, "z%d", REGNO (x) - V0_REGNUM);
else
{
char suffix
= sizetochar (GET_MODE_UNIT_BITSIZE (GET_MODE (x)));
asm_fprintf (f, "{z%d.%c - z%d.%c}",
REGNO (x) - V0_REGNUM, suffix,
END_REGNO (x) - V0_REGNUM - 1, suffix);
}
}
else
asm_fprintf (f, "%s", reg_names [REGNO (x)]);
break;
case MEM:
output_address (GET_MODE (x), XEXP (x, 0));
break;
case LABEL_REF:
case SYMBOL_REF:
output_addr_const (asm_out_file, x);
break;
case CONST_INT:
asm_fprintf (f, "%wd", INTVAL (x));
break;
case CONST:
if (!VECTOR_MODE_P (GET_MODE (x)))
{
output_addr_const (asm_out_file, x);
break;
}
/* fall through */
case CONST_VECTOR:
if (!const_vec_duplicate_p (x, &elt))
{
output_operand_lossage ("invalid vector constant");
return;
}
if (GET_MODE_CLASS (GET_MODE (x)) == MODE_VECTOR_INT)
asm_fprintf (f, "%wd", INTVAL (elt));
else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_VECTOR_FLOAT
&& aarch64_print_vector_float_operand (f, x, false))
;
else
{
output_operand_lossage ("invalid vector constant");
return;
}
break;
case CONST_DOUBLE:
/* Since we define TARGET_SUPPORTS_WIDE_INT we shouldn't ever
be getting CONST_DOUBLEs holding integers. */
gcc_assert (GET_MODE (x) != VOIDmode);
if (aarch64_float_const_zero_rtx_p (x))
{
fputc ('0', f);
break;
}
else if (aarch64_float_const_representable_p (x))
{
#define buf_size 20
char float_buf[buf_size] = {'\0'};
real_to_decimal_for_mode (float_buf,
CONST_DOUBLE_REAL_VALUE (x),
buf_size, buf_size,
1, GET_MODE (x));
asm_fprintf (asm_out_file, "%s", float_buf);
break;
#undef buf_size
}
output_operand_lossage ("invalid constant");
return;
default:
output_operand_lossage ("invalid operand");
return;
}
break;
case 'A':
if (GET_CODE (x) == HIGH)
x = XEXP (x, 0);
switch (aarch64_classify_symbolic_expression (x))
{
case SYMBOL_SMALL_GOT_4G:
asm_fprintf (asm_out_file, ":got:");
break;
case SYMBOL_SMALL_TLSGD:
asm_fprintf (asm_out_file, ":tlsgd:");
break;
case SYMBOL_SMALL_TLSDESC:
asm_fprintf (asm_out_file, ":tlsdesc:");
break;
case SYMBOL_SMALL_TLSIE:
asm_fprintf (asm_out_file, ":gottprel:");
break;
case SYMBOL_TLSLE24:
asm_fprintf (asm_out_file, ":tprel:");
break;
case SYMBOL_TINY_GOT:
gcc_unreachable ();
break;
default:
break;
}
output_addr_const (asm_out_file, x);
break;
case 'L':
switch (aarch64_classify_symbolic_expression (x))
{
case SYMBOL_SMALL_GOT_4G:
asm_fprintf (asm_out_file, ":got_lo12:");
break;
case SYMBOL_SMALL_TLSGD:
asm_fprintf (asm_out_file, ":tlsgd_lo12:");
break;
case SYMBOL_SMALL_TLSDESC:
asm_fprintf (asm_out_file, ":tlsdesc_lo12:");
break;
case SYMBOL_SMALL_TLSIE:
asm_fprintf (asm_out_file, ":gottprel_lo12:");
break;
case SYMBOL_TLSLE12:
asm_fprintf (asm_out_file, ":tprel_lo12:");
break;
case SYMBOL_TLSLE24:
asm_fprintf (asm_out_file, ":tprel_lo12_nc:");
break;
case SYMBOL_TINY_GOT:
asm_fprintf (asm_out_file, ":got:");
break;
case SYMBOL_TINY_TLSIE:
asm_fprintf (asm_out_file, ":gottprel:");
break;
default:
break;
}
output_addr_const (asm_out_file, x);
break;
case 'G':
switch (aarch64_classify_symbolic_expression (x))
{
case SYMBOL_TLSLE24:
asm_fprintf (asm_out_file, ":tprel_hi12:");
break;
default:
break;
}
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 'K':
if (!REG_P (x) || !PR_REGNUM_P (REGNO (x)))
{
output_operand_lossage ("invalid operand for '%%%c'", code);
return;
}
asm_fprintf (f, "pn%d", REGNO (x) - P0_REGNUM);
break;
case 'y':
case 'z':
{
machine_mode mode = GET_MODE (x);
if (!MEM_P (x)
|| (code == 'y'
&& maybe_ne (GET_MODE_SIZE (mode), 8)
&& maybe_ne (GET_MODE_SIZE (mode), 16)
&& maybe_ne (GET_MODE_SIZE (mode), 32)))
{
output_operand_lossage ("invalid operand for '%%%c'", code);
return;
}
if (!aarch64_print_address_internal (f, mode, XEXP (x, 0),
code == 'y'
? ADDR_QUERY_LDP_STP_N
: ADDR_QUERY_LDP_STP))
output_operand_lossage ("invalid operand prefix '%%%c'", code);
}
break;
default:
output_operand_lossage ("invalid operand prefix '%%%c'", code);
return;
}
}
/* Print address 'x' of a memory access with mode 'mode'.
'op' is the context required by aarch64_classify_address. It can either be
MEM for a normal memory access or PARALLEL for LDP/STP. */
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index d3514ff1ef9..3f236141ab1 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -865,56 +865,56 @@ (define_insn "*aarch64_tbz<optab><mode>1"
;; Emit a `CB<cond> (register)` or `CB<cond> (immediate)` instruction.
;; Only immediates in the range 0-63 are supported.
;; Comparisons against immediates outside this range fall back to
;; CMP + B<cond>.
(define_insn "aarch64_cb<GPI:mode>"
[(set (pc) (if_then_else (match_operator 0 "aarch64_comparison_operator"
[(match_operand:GPI 1 "register_operand" "r")
(match_operand:GPI 2 "aarch64_cb_operand" "ri")])
(label_ref (match_operand 3))
(pc)))]
"TARGET_CMPBR"
- "cb%m0\\t%<w>1, %<w>2, %l3";
+ "cb%j0\\t%<w>1, %<w>2, %l3";
[(set_attr "type" "branch")
(set (attr "length")
(if_then_else (and (ge (minus (match_dup 3) (pc))
(const_int BRANCH_LEN_N_1Kib))
(lt (minus (match_dup 3) (pc))
(const_int BRANCH_LEN_P_1Kib)))
(const_int 4)
(const_int 8)))
(set (attr "far_branch")
(if_then_else (and (ge (minus (match_dup 3) (pc))
(const_int BRANCH_LEN_N_1Kib))
(lt (minus (match_dup 3) (pc))
(const_int BRANCH_LEN_P_1Kib)))
(const_string "no")
(const_string "yes")))]
)
;; Emit a `CBB<cond> (register)` or `CBH<cond> (register)` instruction.
(define_insn "aarch64_cb<SHORT:mode>"
[(set (pc) (if_then_else (match_operator 0 "aarch64_comparison_operator"
[(match_operand:SHORT 1 "register_operand" "r")
(match_operand:SHORT 2 "aarch64_cb_short_operand"
"rZ")])
(label_ref (match_operand 3))
(pc)))]
"TARGET_CMPBR"
- "cb<SHORT:cmpbr_suffix>%m0\\t%<w>1, %<w>2, %l3"
+ "cb<SHORT:cmpbr_suffix>%j0\\t%<w>1, %<w>2, %l3"
[(set_attr "type" "branch")
(set (attr "length")
(if_then_else (and (ge (minus (match_dup 3) (pc))
(const_int BRANCH_LEN_N_1Kib))
(lt (minus (match_dup 3) (pc))
(const_int BRANCH_LEN_P_1Kib)))
(const_int 4)
(const_int 8)))
(set (attr "far_branch")
(if_then_else (and (ge (minus (match_dup 3) (pc))
(const_int BRANCH_LEN_N_1Kib))
(lt (minus (match_dup 3) (pc))
(const_int BRANCH_LEN_P_1Kib)))
(const_string "no")
(const_string "yes")))]
)
;; Emit `B<cond>`, assuming that the condition is already in the CC register.
diff --git a/gcc/testsuite/gcc.target/aarch64/cmpbr.c
b/gcc/testsuite/gcc.target/aarch64/cmpbr.c
index 62448214892..dc3f2b5eb55 100644
--- a/gcc/testsuite/gcc.target/aarch64/cmpbr.c
+++ b/gcc/testsuite/gcc.target/aarch64/cmpbr.c
@@ -85,1397 +85,1397 @@ COMPARE_ALL(u32, i32, 4098);
COMPARE_ALL(u64, i64, 4098);
/*
** u8_x0_eq_x1:
** cbbeq w1, w0, .L4
** b not_taken
** b taken
*/
/*
** u8_x0_ne_x1:
** cbbeq w1, w0, .L6
** b taken
** b not_taken
*/
/*
** u8_x0_ult_x1:
** cbbls w1, w0, .L8
** b taken
** b not_taken
*/
/*
** u8_x0_ule_x1:
-** cbbcc w1, w0, .L10
+** cbblo w1, w0, .L10
** b taken
** b not_taken
*/
/*
** u8_x0_ugt_x1:
-** cbbcs w1, w0, .L12
+** cbbhs w1, w0, .L12
** b taken
** b not_taken
*/
/*
** u8_x0_uge_x1:
** cbbhi w1, w0, .L14
** b taken
** b not_taken
*/
/*
** i8_x0_slt_x1:
** cbble w1, w0, .L16
** b taken
** b not_taken
*/
/*
** i8_x0_sle_x1:
** cbblt w1, w0, .L18
** b taken
** b not_taken
*/
/*
** i8_x0_sgt_x1:
** cbbge w1, w0, .L20
** b taken
** b not_taken
*/
/*
** i8_x0_sge_x1:
** cbbgt w1, w0, .L22
** b taken
** b not_taken
*/
/*
** u16_x0_eq_x1:
** cbheq w1, w0, .L25
** b not_taken
** b taken
*/
/*
** u16_x0_ne_x1:
** cbheq w1, w0, .L27
** b taken
** b not_taken
*/
/*
** u16_x0_ult_x1:
** cbhls w1, w0, .L29
** b taken
** b not_taken
*/
/*
** u16_x0_ule_x1:
-** cbhcc w1, w0, .L31
+** cbhlo w1, w0, .L31
** b taken
** b not_taken
*/
/*
** u16_x0_ugt_x1:
-** cbhcs w1, w0, .L33
+** cbhhs w1, w0, .L33
** b taken
** b not_taken
*/
/*
** u16_x0_uge_x1:
** cbhhi w1, w0, .L35
** b taken
** b not_taken
*/
/*
** i16_x0_slt_x1:
** cbhle w1, w0, .L37
** b taken
** b not_taken
*/
/*
** i16_x0_sle_x1:
** cbhlt w1, w0, .L39
** b taken
** b not_taken
*/
/*
** i16_x0_sgt_x1:
** cbhge w1, w0, .L41
** b taken
** b not_taken
*/
/*
** i16_x0_sge_x1:
** cbhgt w1, w0, .L43
** b taken
** b not_taken
*/
/*
** u32_x0_eq_x1:
** cbeq w0, w1, .L46
** b not_taken
** b taken
*/
/*
** u32_x0_ne_x1:
** cbeq w0, w1, .L48
** b taken
** b not_taken
*/
/*
** u32_x0_ult_x1:
-** cbcs w0, w1, .L50
+** cbhs w0, w1, .L50
** b taken
** b not_taken
*/
/*
** u32_x0_ule_x1:
** cbhi w0, w1, .L52
** b taken
** b not_taken
*/
/*
** u32_x0_ugt_x1:
** cbls w0, w1, .L54
** b taken
** b not_taken
*/
/*
** u32_x0_uge_x1:
-** cbcc w0, w1, .L56
+** cblo w0, w1, .L56
** b taken
** b not_taken
*/
/*
** i32_x0_slt_x1:
** cbge w0, w1, .L58
** b taken
** b not_taken
*/
/*
** i32_x0_sle_x1:
** cbgt w0, w1, .L60
** b taken
** b not_taken
*/
/*
** i32_x0_sgt_x1:
** cble w0, w1, .L62
** b taken
** b not_taken
*/
/*
** i32_x0_sge_x1:
** cblt w0, w1, .L64
** b taken
** b not_taken
*/
/*
** u64_x0_eq_x1:
** cbeq x0, x1, .L67
** b not_taken
** b taken
*/
/*
** u64_x0_ne_x1:
** cbeq x0, x1, .L69
** b taken
** b not_taken
*/
/*
** u64_x0_ult_x1:
-** cbcs x0, x1, .L71
+** cbhs x0, x1, .L71
** b taken
** b not_taken
*/
/*
** u64_x0_ule_x1:
** cbhi x0, x1, .L73
** b taken
** b not_taken
*/
/*
** u64_x0_ugt_x1:
** cbls x0, x1, .L75
** b taken
** b not_taken
*/
/*
** u64_x0_uge_x1:
-** cbcc x0, x1, .L77
+** cblo x0, x1, .L77
** b taken
** b not_taken
*/
/*
** i64_x0_slt_x1:
** cbge x0, x1, .L79
** b taken
** b not_taken
*/
/*
** i64_x0_sle_x1:
** cbgt x0, x1, .L81
** b taken
** b not_taken
*/
/*
** i64_x0_sgt_x1:
** cble x0, x1, .L83
** b taken
** b not_taken
*/
/*
** i64_x0_sge_x1:
** cblt x0, x1, .L85
** b taken
** b not_taken
*/
/*
** u32_x0_eq_42:
** cbeq w0, 42, .L88
** b not_taken
** b taken
*/
/*
** u32_x0_ne_42:
** cbeq w0, 42, .L90
** b taken
** b not_taken
*/
/*
** u32_x0_ult_42:
** cbhi w0, 41, .L92
** b taken
** b not_taken
*/
/*
** u32_x0_ule_42:
** cbhi w0, 42, .L94
** b taken
** b not_taken
*/
/*
** u32_x0_ugt_42:
** cbls w0, 42, .L96
** b taken
** b not_taken
*/
/*
** u32_x0_uge_42:
** cbls w0, 41, .L98
** b taken
** b not_taken
*/
/*
** i32_x0_slt_42:
** cbgt w0, 41, .L100
** b taken
** b not_taken
*/
/*
** i32_x0_sle_42:
** cbgt w0, 42, .L102
** b taken
** b not_taken
*/
/*
** i32_x0_sgt_42:
** cble w0, 42, .L104
** b taken
** b not_taken
*/
/*
** i32_x0_sge_42:
** cble w0, 41, .L106
** b taken
** b not_taken
*/
/*
** u64_x0_eq_42:
** cbeq x0, 42, .L109
** b not_taken
** b taken
*/
/*
** u64_x0_ne_42:
** cbeq x0, 42, .L111
** b taken
** b not_taken
*/
/*
** u64_x0_ult_42:
** cbhi x0, 41, .L113
** b taken
** b not_taken
*/
/*
** u64_x0_ule_42:
** cbhi x0, 42, .L115
** b taken
** b not_taken
*/
/*
** u64_x0_ugt_42:
** cbls x0, 42, .L117
** b taken
** b not_taken
*/
/*
** u64_x0_uge_42:
** cbls x0, 41, .L119
** b taken
** b not_taken
*/
/*
** i64_x0_slt_42:
** cbgt x0, 41, .L121
** b taken
** b not_taken
*/
/*
** i64_x0_sle_42:
** cbgt x0, 42, .L123
** b taken
** b not_taken
*/
/*
** i64_x0_sgt_42:
** cble x0, 42, .L125
** b taken
** b not_taken
*/
/*
** i64_x0_sge_42:
** cble x0, 41, .L127
** b taken
** b not_taken
*/
/*
** u8_x0_eq_0:
** cbbne w0, wzr, .L129
** b taken
** b not_taken
*/
/*
** u8_x0_ne_0:
** cbbeq w0, wzr, .L131
** b taken
** b not_taken
*/
/*
** u8_x0_ult_0:
** b not_taken
*/
/*
** u8_x0_ule_0:
** cbbne w0, wzr, .L134
** b taken
** b not_taken
*/
/*
** u8_x0_ugt_0:
** cbbeq w0, wzr, .L136
** b taken
** b not_taken
*/
/*
** u8_x0_uge_0:
** b taken
*/
/*
** i8_x0_slt_0:
** tbnz w0, #7, .L140
** b not_taken
** b taken
*/
/*
** i8_x0_sle_0:
** cbble w0, wzr, .L143
** b not_taken
** b taken
*/
/*
** i8_x0_sgt_0:
** cbble w0, wzr, .L145
** b taken
** b not_taken
*/
/*
** i8_x0_sge_0:
** tbnz w0, #7, .L147
** b taken
** b not_taken
*/
/*
** u16_x0_eq_0:
** cbhne w0, wzr, .L149
** b taken
** b not_taken
*/
/*
** u16_x0_ne_0:
** cbheq w0, wzr, .L151
** b taken
** b not_taken
*/
/*
** u16_x0_ult_0:
** b not_taken
*/
/*
** u16_x0_ule_0:
** cbhne w0, wzr, .L154
** b taken
** b not_taken
*/
/*
** u16_x0_ugt_0:
** cbheq w0, wzr, .L156
** b taken
** b not_taken
*/
/*
** u16_x0_uge_0:
** b taken
*/
/*
** i16_x0_slt_0:
** tbnz w0, #15, .L160
** b not_taken
** b taken
*/
/*
** i16_x0_sle_0:
** cbhle w0, wzr, .L163
** b not_taken
** b taken
*/
/*
** i16_x0_sgt_0:
** cbhle w0, wzr, .L165
** b taken
** b not_taken
*/
/*
** i16_x0_sge_0:
** tbnz w0, #15, .L167
** b taken
** b not_taken
*/
/*
** u32_x0_eq_0:
** cbnz w0, .L169
** b taken
** b not_taken
*/
/*
** u32_x0_ne_0:
** cbz w0, .L171
** b taken
** b not_taken
*/
/*
** u32_x0_ult_0:
** b not_taken
*/
/*
** u32_x0_ule_0:
** cbnz w0, .L174
** b taken
** b not_taken
*/
/*
** u32_x0_ugt_0:
** cbz w0, .L176
** b taken
** b not_taken
*/
/*
** u32_x0_uge_0:
** b taken
*/
/*
** i32_x0_slt_0:
** tbnz w0, #31, .L180
** b not_taken
** b taken
*/
/*
** i32_x0_sle_0:
** cble w0, wzr, .L183
** b not_taken
** b taken
*/
/*
** i32_x0_sgt_0:
** cble w0, wzr, .L185
** b taken
** b not_taken
*/
/*
** i32_x0_sge_0:
** tbnz w0, #31, .L187
** b taken
** b not_taken
*/
/*
** u64_x0_eq_0:
** cbnz x0, .L189
** b taken
** b not_taken
*/
/*
** u64_x0_ne_0:
** cbz x0, .L191
** b taken
** b not_taken
*/
/*
** u64_x0_ult_0:
** b not_taken
*/
/*
** u64_x0_ule_0:
** cbnz x0, .L194
** b taken
** b not_taken
*/
/*
** u64_x0_ugt_0:
** cbz x0, .L196
** b taken
** b not_taken
*/
/*
** u64_x0_uge_0:
** b taken
*/
/*
** i64_x0_slt_0:
** tbnz x0, #63, .L200
** b not_taken
** b taken
*/
/*
** i64_x0_sle_0:
** cble x0, xzr, .L203
** b not_taken
** b taken
*/
/*
** i64_x0_sgt_0:
** cble x0, xzr, .L205
** b taken
** b not_taken
*/
/*
** i64_x0_sge_0:
** tbnz x0, #63, .L207
** b taken
** b not_taken
*/
/*
** u8_x0_eq_42:
** mov w1, 42
** cbbeq w0, w1, .L210
** b not_taken
** b taken
*/
/*
** u8_x0_ne_42:
** mov w1, 42
** cbbeq w0, w1, .L212
** b taken
** b not_taken
*/
/*
** u8_x0_ult_42:
** mov w1, 41
** cbbhi w0, w1, .L214
** b taken
** b not_taken
*/
/*
** u8_x0_ule_42:
** mov w1, 42
** cbbhi w0, w1, .L216
** b taken
** b not_taken
*/
/*
** u8_x0_ugt_42:
** mov w1, 42
** cbbls w0, w1, .L218
** b taken
** b not_taken
*/
/*
** u8_x0_uge_42:
** mov w1, 41
** cbbls w0, w1, .L220
** b taken
** b not_taken
*/
/*
** i8_x0_slt_42:
** mov w1, 41
** cbbgt w0, w1, .L222
** b taken
** b not_taken
*/
/*
** i8_x0_sle_42:
** mov w1, 42
** cbbgt w0, w1, .L224
** b taken
** b not_taken
*/
/*
** i8_x0_sgt_42:
** mov w1, 42
** cbble w0, w1, .L226
** b taken
** b not_taken
*/
/*
** i8_x0_sge_42:
** mov w1, 41
** cbble w0, w1, .L228
** b taken
** b not_taken
*/
/*
** u16_x0_eq_42:
** mov w1, 42
** cbheq w0, w1, .L231
** b not_taken
** b taken
*/
/*
** u16_x0_ne_42:
** mov w1, 42
** cbheq w0, w1, .L233
** b taken
** b not_taken
*/
/*
** u16_x0_ult_42:
** mov w1, 41
** cbhhi w0, w1, .L235
** b taken
** b not_taken
*/
/*
** u16_x0_ule_42:
** mov w1, 42
** cbhhi w0, w1, .L237
** b taken
** b not_taken
*/
/*
** u16_x0_ugt_42:
** mov w1, 42
** cbhls w0, w1, .L239
** b taken
** b not_taken
*/
/*
** u16_x0_uge_42:
** mov w1, 41
** cbhls w0, w1, .L241
** b taken
** b not_taken
*/
/*
** i16_x0_slt_42:
** mov w1, 41
** cbhgt w0, w1, .L243
** b taken
** b not_taken
*/
/*
** i16_x0_sle_42:
** mov w1, 42
** cbhgt w0, w1, .L245
** b taken
** b not_taken
*/
/*
** i16_x0_sgt_42:
** mov w1, 42
** cbhle w0, w1, .L247
** b taken
** b not_taken
*/
/*
** i16_x0_sge_42:
** mov w1, 41
** cbhle w0, w1, .L249
** b taken
** b not_taken
*/
/*
** u8_x0_eq_64:
** mov w1, 64
** cbbeq w0, w1, .L252
** b not_taken
** b taken
*/
/*
** u8_x0_ne_64:
** mov w1, 64
** cbbeq w0, w1, .L254
** b taken
** b not_taken
*/
/*
** u8_x0_ult_64:
** mov w1, 63
** cbbhi w0, w1, .L256
** b taken
** b not_taken
*/
/*
** u8_x0_ule_64:
** mov w1, 64
** cbbhi w0, w1, .L258
** b taken
** b not_taken
*/
/*
** u8_x0_ugt_64:
** mov w1, 64
** cbbls w0, w1, .L260
** b taken
** b not_taken
*/
/*
** u8_x0_uge_64:
** mov w1, 63
** cbbls w0, w1, .L262
** b taken
** b not_taken
*/
/*
** i8_x0_slt_64:
** mov w1, 63
** cbbgt w0, w1, .L264
** b taken
** b not_taken
*/
/*
** i8_x0_sle_64:
** mov w1, 64
** cbbgt w0, w1, .L266
** b taken
** b not_taken
*/
/*
** i8_x0_sgt_64:
** mov w1, 64
** cbble w0, w1, .L268
** b taken
** b not_taken
*/
/*
** i8_x0_sge_64:
** mov w1, 63
** cbble w0, w1, .L270
** b taken
** b not_taken
*/
/*
** u16_x0_eq_64:
** mov w1, 64
** cbheq w0, w1, .L273
** b not_taken
** b taken
*/
/*
** u16_x0_ne_64:
** mov w1, 64
** cbheq w0, w1, .L275
** b taken
** b not_taken
*/
/*
** u16_x0_ult_64:
** mov w1, 63
** cbhhi w0, w1, .L277
** b taken
** b not_taken
*/
/*
** u16_x0_ule_64:
** mov w1, 64
** cbhhi w0, w1, .L279
** b taken
** b not_taken
*/
/*
** u16_x0_ugt_64:
** mov w1, 64
** cbhls w0, w1, .L281
** b taken
** b not_taken
*/
/*
** u16_x0_uge_64:
** mov w1, 63
** cbhls w0, w1, .L283
** b taken
** b not_taken
*/
/*
** i16_x0_slt_64:
** mov w1, 63
** cbhgt w0, w1, .L285
** b taken
** b not_taken
*/
/*
** i16_x0_sle_64:
** mov w1, 64
** cbhgt w0, w1, .L287
** b taken
** b not_taken
*/
/*
** i16_x0_sgt_64:
** mov w1, 64
** cbhle w0, w1, .L289
** b taken
** b not_taken
*/
/*
** i16_x0_sge_64:
** mov w1, 63
** cbhle w0, w1, .L291
** b taken
** b not_taken
*/
/*
** u32_x0_eq_64:
** cmp w0, 64
** beq .L294
** b not_taken
** b taken
*/
/*
** u32_x0_ne_64:
** cmp w0, 64
** beq .L296
** b taken
** b not_taken
*/
/*
** u32_x0_ult_64:
** cbhi w0, 63, .L298
** b taken
** b not_taken
*/
/*
** u32_x0_ule_64:
** cmp w0, 64
** bhi .L300
** b taken
** b not_taken
*/
/*
** u32_x0_ugt_64:
** cmp w0, 64
** bls .L302
** b taken
** b not_taken
*/
/*
** u32_x0_uge_64:
** cbls w0, 63, .L304
** b taken
** b not_taken
*/
/*
** i32_x0_slt_64:
** cbgt w0, 63, .L306
** b taken
** b not_taken
*/
/*
** i32_x0_sle_64:
** cmp w0, 64
** bgt .L308
** b taken
** b not_taken
*/
/*
** i32_x0_sgt_64:
** cmp w0, 64
** ble .L310
** b taken
** b not_taken
*/
/*
** i32_x0_sge_64:
** cble w0, 63, .L312
** b taken
** b not_taken
*/
/*
** u64_x0_eq_64:
** cmp x0, 64
** beq .L315
** b not_taken
** b taken
*/
/*
** u64_x0_ne_64:
** cmp x0, 64
** beq .L317
** b taken
** b not_taken
*/
/*
** u64_x0_ult_64:
** cbhi x0, 63, .L319
** b taken
** b not_taken
*/
/*
** u64_x0_ule_64:
** cmp x0, 64
** bhi .L321
** b taken
** b not_taken
*/
/*
** u64_x0_ugt_64:
** cmp x0, 64
** bls .L323
** b taken
** b not_taken
*/
/*
** u64_x0_uge_64:
** cbls x0, 63, .L325
** b taken
** b not_taken
*/
/*
** i64_x0_slt_64:
** cbgt x0, 63, .L327
** b taken
** b not_taken
*/
/*
** i64_x0_sle_64:
** cmp x0, 64
** bgt .L329
** b taken
** b not_taken
*/
/*
** i64_x0_sgt_64:
** cmp x0, 64
** ble .L331
** b taken
** b not_taken
*/
/*
** i64_x0_sge_64:
** cble x0, 63, .L333
** b taken
** b not_taken
*/
/*
** u16_x0_eq_4098:
** mov w1, 4098
** cbheq w0, w1, .L336
** b not_taken
** b taken
*/
/*
** u16_x0_ne_4098:
** mov w1, 4098
** cbheq w0, w1, .L338
** b taken
** b not_taken
*/
/*
** u16_x0_ult_4098:
** mov w1, 4097
** cbhhi w0, w1, .L340
** b taken
** b not_taken
*/
/*
** u16_x0_ule_4098:
** mov w1, 4098
** cbhhi w0, w1, .L342
** b taken
** b not_taken
*/
/*
** u16_x0_ugt_4098:
** mov w1, 4098
** cbhls w0, w1, .L344
** b taken
** b not_taken
*/
/*
** u16_x0_uge_4098:
** mov w1, 4097
** cbhls w0, w1, .L346
** b taken
** b not_taken
*/
/*
** i16_x0_slt_4098:
** mov w1, 4097
** cbhgt w0, w1, .L348
** b taken
** b not_taken
*/
/*
** i16_x0_sle_4098:
** mov w1, 4098
** cbhgt w0, w1, .L350
** b taken
** b not_taken
*/
/*
** i16_x0_sgt_4098:
** mov w1, 4098
** cbhle w0, w1, .L352
** b taken
** b not_taken
*/
/*
** i16_x0_sge_4098:
** mov w1, 4097
** cbhle w0, w1, .L354
** b taken
** b not_taken
*/
/*
** u32_x0_eq_4098:
** mov w1, 4098
** cbeq w0, w1, .L357
** b not_taken
** b taken
*/
/*
** u32_x0_ne_4098:
** mov w1, 4098
** cbeq w0, w1, .L359
** b taken
** b not_taken
*/
/*
** u32_x0_ult_4098:
** mov w1, 4097
** cbhi w0, w1, .L361
** b taken
** b not_taken
*/
/*
** u32_x0_ule_4098:
** mov w1, 4098
** cbhi w0, w1, .L363
** b taken
** b not_taken
*/
/*
** u32_x0_ugt_4098:
** mov w1, 4098
** cbls w0, w1, .L365
** b taken
** b not_taken
*/
/*
** u32_x0_uge_4098:
** mov w1, 4097
** cbls w0, w1, .L367
** b taken
** b not_taken
*/
/*
** i32_x0_slt_4098:
** mov w1, 4097
** cbgt w0, w1, .L369
** b taken
** b not_taken
*/
/*
** i32_x0_sle_4098:
** mov w1, 4098
** cbgt w0, w1, .L371
** b taken
** b not_taken
*/
/*
** i32_x0_sgt_4098:
** mov w1, 4098
** cble w0, w1, .L373
** b taken
** b not_taken
*/
/*
** i32_x0_sge_4098:
** mov w1, 4097
** cble w0, w1, .L375
** b taken
** b not_taken
*/
/*
** u64_x0_eq_4098:
** mov x1, 4098
** cbeq x0, x1, .L378
** b not_taken
** b taken
*/
/*
** u64_x0_ne_4098:
** mov x1, 4098
** cbeq x0, x1, .L380
** b taken
** b not_taken
*/
/*
** u64_x0_ult_4098:
** mov x1, 4097
** cbhi x0, x1, .L382
** b taken
** b not_taken
*/
/*
** u64_x0_ule_4098:
** mov x1, 4098
** cbhi x0, x1, .L384
** b taken
** b not_taken
*/
/*
** u64_x0_ugt_4098:
** mov x1, 4098
** cbls x0, x1, .L386
** b taken
** b not_taken
*/
/*
** u64_x0_uge_4098:
** mov x1, 4097
** cbls x0, x1, .L388
** b taken
** b not_taken
*/
/*
** i64_x0_slt_4098:
** mov x1, 4097
** cbgt x0, x1, .L390
** b taken
** b not_taken
*/
/*
** i64_x0_sle_4098:
** mov x1, 4098
** cbgt x0, x1, .L392
** b taken
** b not_taken
*/
/*
** i64_x0_sgt_4098:
** mov x1, 4098
** cble x0, x1, .L394
** b taken
** b not_taken
*/
/*
** i64_x0_sge_4098:
** mov x1, 4097
** cble x0, x1, .L396
** b taken
** b not_taken
*/
--
2.45.2