[PATCH v6] aarch64: Support for FEAT_CMPBR

Ezra.Sitorus@arm.com Ezra.Sitorus@arm.com
Wed Jun 4 19:42:53 GMT 2025


From: Ezra Sitorus <ezra.sitorus@arm.com>

FEAT_CMPBR - Compare and branch instructions. This patch adds these
instructions:
- CB<CC> (register)
- CB<CC> (immediate)
- CBH<CC>
- CBB<CC>

where CC is one of the following:
- EQ
- NE
- GT
- GE
- LT
- LE
- HI
- HS
- LO
- LS
---
I have updated the test files in this version so that it checks the full
range of possible inputs.

Regression test on aarch64-none-linux-gnu.

Ezra

 bfd/elfnn-aarch64.c                          |   3 +
 bfd/reloc.c                                  |   6 +
 gas/config/tc-aarch64.c                      |  42 +-
 gas/doc/c-aarch64.texi                       |   2 +
 gas/testsuite/gas/aarch64/cmpbr-bad.d        |   4 +
 gas/testsuite/gas/aarch64/cmpbr-bad.l        |  13 +
 gas/testsuite/gas/aarch64/cmpbr-bad.s        |   5 +
 gas/testsuite/gas/aarch64/cmpbr-far.d        |   4 +
 gas/testsuite/gas/aarch64/cmpbr-far.l        |   3 +
 gas/testsuite/gas/aarch64/cmpbr-far.s        |  13 +
 gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.d |   4 +
 gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.l |   3 +
 gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.s |   3 +
 gas/testsuite/gas/aarch64/cmpbr.d            | 967 +++++++++++++++++++
 gas/testsuite/gas/aarch64/cmpbr.s            | 727 ++++++++++++++
 include/opcode/aarch64.h                     |   5 +
 opcodes/aarch64-opc.c                        |   3 +
 opcodes/aarch64-opc.h                        |   1 +
 opcodes/aarch64-tbl.h                        |  66 ++
 19 files changed, 1872 insertions(+), 2 deletions(-)
 create mode 100644 gas/testsuite/gas/aarch64/cmpbr-bad.d
 create mode 100644 gas/testsuite/gas/aarch64/cmpbr-bad.l
 create mode 100644 gas/testsuite/gas/aarch64/cmpbr-bad.s
 create mode 100644 gas/testsuite/gas/aarch64/cmpbr-far.d
 create mode 100644 gas/testsuite/gas/aarch64/cmpbr-far.l
 create mode 100644 gas/testsuite/gas/aarch64/cmpbr-far.s
 create mode 100644 gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.d
 create mode 100644 gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.l
 create mode 100644 gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.s
 create mode 100644 gas/testsuite/gas/aarch64/cmpbr.d
 create mode 100644 gas/testsuite/gas/aarch64/cmpbr.s

diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index 548da1f8b30..8f399204f04 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -2268,6 +2268,9 @@ elfNN_aarch64_howto_from_bfd_reloc (bfd_reloc_code_real_type code)
   if (code == BFD_RELOC_AARCH64_NONE)
     return &elfNN_aarch64_howto_none;
 
+  if (code == BFD_RELOC_AARCH64_BRANCH9)
+    return &elfNN_aarch64_howto_none;
+
   return NULL;
 }
 
diff --git a/bfd/reloc.c b/bfd/reloc.c
index d3ddafb7305..c9d53bb9e11 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -7418,6 +7418,12 @@ ENUM
 ENUMDOC
   AArch64 pseudo relocation code to be used internally by the AArch64
   assembler and not (currently) written to any object files.
+ENUM
+  BFD_RELOC_AARCH64_BRANCH9
+ENUMDOC
+  AArch64 9 bit pc-relative conditional branch and compare & branch.
+  The lowest two bits must be zero and are not stored in the
+  instruction, giving an 11 bit signed byte offset.
 ENUM
   BFD_RELOC_TILEPRO_COPY
 ENUMX
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index acb56044fb5..e6bd6a7e2f9 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -5175,6 +5175,13 @@ encode_branch_ofs_26 (uint32_t ofs)
   return ofs & ((1 << 26) - 1);
 }
 
+/* encode the 9-bit offset of FEAT_CMPBR compare and branch */
+static inline uint32_t
+encode_cond_branch_ofs_9 (uint32_t ofs)
+{
+  return (ofs & ((1 << 9) - 1)) << 5;
+}
+
 /* encode the 19-bit offset of conditional branch and compare & branch */
 static inline uint32_t
 encode_cond_branch_ofs_19 (uint32_t ofs)
@@ -6388,6 +6395,8 @@ process_omitted_operand (enum aarch64_opnd type, const aarch64_opcode *opcode,
     case AARCH64_OPND_UIMM3_OP2:
     case AARCH64_OPND_IMM:
     case AARCH64_OPND_IMM_2:
+    case AARCH64_OPND_IMMP1_2:
+    case AARCH64_OPND_IMMS1_2:
     case AARCH64_OPND_WIDTH:
     case AARCH64_OPND_UIMM7:
     case AARCH64_OPND_NZCV:
@@ -7154,6 +7163,16 @@ parse_operands (char *str, const aarch64_opcode *opcode)
 	  info->imm.value = val;
 	  break;
 
+	case AARCH64_OPND_IMMP1_2:
+	  po_imm_or_fail (1, 64);
+	  info->imm.value = val - 1;
+	  break;
+
+	case AARCH64_OPND_IMMS1_2:
+	  po_imm_or_fail (-1, 62);
+	  info->imm.value = val + 1;
+	  break;
+
 	case AARCH64_OPND_SVE_AIMM:
 	case AARCH64_OPND_SVE_ASIMM:
 	  po_imm_nc_or_fail ();
@@ -7450,6 +7469,7 @@ parse_operands (char *str, const aarch64_opcode *opcode)
 	  info->imm.value = 0;
 	  break;
 
+	case AARCH64_OPND_ADDR_PCREL9:
 	case AARCH64_OPND_ADDR_PCREL14:
 	case AARCH64_OPND_ADDR_PCREL19:
 	case AARCH64_OPND_ADDR_PCREL21:
@@ -7487,8 +7507,11 @@ parse_operands (char *str, const aarch64_opcode *opcode)
 		  case compbranch:
 		  case condbranch:
 		    /* e.g. CBZ or B.COND  */
-		    gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL19);
-		    inst.reloc.type = BFD_RELOC_AARCH64_BRANCH19;
+		    gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL9
+		                || operands[i] == AARCH64_OPND_ADDR_PCREL19);
+		    inst.reloc.type = (operands[i] == AARCH64_OPND_ADDR_PCREL9)
+		                       ? BFD_RELOC_AARCH64_BRANCH9
+		                       : BFD_RELOC_AARCH64_BRANCH19;
 		    break;
 		  case testbranch:
 		    /* e.g. TBZ  */
@@ -9670,6 +9693,20 @@ md_apply_fix (fixS * fixP, valueT * valP, segT seg)
 	}
       break;
 
+    case BFD_RELOC_AARCH64_BRANCH9:
+      if (fixP->fx_done || !seg->use_rela_p)
+	{
+	  if (value & 3)
+	    as_bad_where (fixP->fx_file, fixP->fx_line,
+			  _("conditional branch target not word aligned"));
+	  if (signed_overflow (value, 11))
+	    as_bad_where (fixP->fx_file, fixP->fx_line,
+			  _("conditional branch out of range"));
+	  insn = get_aarch64_insn (buf);
+	  insn |= encode_cond_branch_ofs_9 (value >> 2);
+	  put_aarch64_insn (buf, insn);
+	}
+        break;
     case BFD_RELOC_AARCH64_BRANCH19:
       if (fixP->fx_done || !seg->use_rela_p)
 	{
@@ -10672,6 +10709,7 @@ static const struct aarch64_option_cpu_value_table aarch64_features[] = {
   {"rng",		AARCH64_FEATURE (RNG), AARCH64_NO_FEATURES},
   {"ssbs",		AARCH64_FEATURE (SSBS), AARCH64_NO_FEATURES},
   {"memtag",		AARCH64_FEATURE (MEMTAG), AARCH64_NO_FEATURES},
+  {"cmpbr",		AARCH64_FEATURE (CMPBR), AARCH64_NO_FEATURES},
   {"sve2",		AARCH64_FEATURE (SVE2), AARCH64_FEATURE (SVE)},
   {"sve2-sm4",		AARCH64_FEATURE (SVE2_SM4),
 			AARCH64_FEATURES (2, SVE2, SM4)},
diff --git a/gas/doc/c-aarch64.texi b/gas/doc/c-aarch64.texi
index 10888d1e78f..3a8e2819c5b 100644
--- a/gas/doc/c-aarch64.texi
+++ b/gas/doc/c-aarch64.texi
@@ -167,6 +167,8 @@ automatically cause those extensions to be disabled.
  @tab Enable the Branch Record Buffer extension.
 @item @code{chk} @tab
  @tab Enable the Check Feature Status Extension.
+@item @code{cmpbr} @tab
+ @tab Enable Compare and Branch instructions.
 @item @code{compnum} @tab @code{simd}
  @tab Enable the complex number SIMD extensions.  An alias of @code{fcma}.
 @item @code{cpa} @tab
diff --git a/gas/testsuite/gas/aarch64/cmpbr-bad.d b/gas/testsuite/gas/aarch64/cmpbr-bad.d
new file mode 100644
index 00000000000..6487979e85f
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/cmpbr-bad.d
@@ -0,0 +1,4 @@
+#name: Test of invalid cmpbr operands
+#source: cmpbr-bad.s
+#as: -march=armv8-a+cmpbr
+#error_output: cmpbr-bad.l
diff --git a/gas/testsuite/gas/aarch64/cmpbr-bad.l b/gas/testsuite/gas/aarch64/cmpbr-bad.l
new file mode 100644
index 00000000000..f705cfd0043
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/cmpbr-bad.l
@@ -0,0 +1,13 @@
+.[^ :]+: Assembler messages:
+[^ :]+:[0-9]+: Error: operand mismatch -- `cbgt w0,x1,a'
+[^ :]+:[0-9]+: Info:    did you mean this\?
+[^ :]+:[0-9]+: Info:    	cbgt w0, w1, #0x0
+[^ :]+:[0-9]+: Info:    other valid variant\(s\):
+[^ :]+:[0-9]+: Info:    	cbgt x0, x1, #0x0
+[^ :]+:[0-9]+: Error: immediate value out of range 0 to 63 at operand 2 -- `cbgt w0,#64,a'
+[^ :]+:[0-9]+: Error: operand mismatch -- `cbbgt x0,x1,a'
+[^ :]+:[0-9]+: Info:    did you mean this\?
+[^ :]+:[0-9]+: Info:    	cbbgt w0, w1, #0x0
+[^ :]+:[0-9]+: Error: operand mismatch -- `cbhgt x0,x1,a'
+[^ :]+:[0-9]+: Info:    did you mean this\?
+[^ :]+:[0-9]+: Info:    	cbhgt w0, w1, #0x0
diff --git a/gas/testsuite/gas/aarch64/cmpbr-bad.s b/gas/testsuite/gas/aarch64/cmpbr-bad.s
new file mode 100644
index 00000000000..8fb1e617254
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/cmpbr-bad.s
@@ -0,0 +1,5 @@
+a:
+	cbgt	w0, x1, a
+	cbgt	w0, #64, a
+	cbbgt	x0, x1, a
+	cbhgt	x0, x1, a
diff --git a/gas/testsuite/gas/aarch64/cmpbr-far.d b/gas/testsuite/gas/aarch64/cmpbr-far.d
new file mode 100644
index 00000000000..a027cdfb837
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/cmpbr-far.d
@@ -0,0 +1,4 @@
+#name: CMPBR instructions that branch too far
+#source: cmpbr-far.s
+#as: -march=armv8-a+cmpbr
+#error_output: cmpbr-far.l
diff --git a/gas/testsuite/gas/aarch64/cmpbr-far.l b/gas/testsuite/gas/aarch64/cmpbr-far.l
new file mode 100644
index 00000000000..6432035a1f3
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/cmpbr-far.l
@@ -0,0 +1,3 @@
+.[^ :]+: Assembler messages:
+[^ :]+:[0-9]+: Error: conditional branch out of range
+[^ :]+:[0-9]+: Error: conditional branch out of range
diff --git a/gas/testsuite/gas/aarch64/cmpbr-far.s b/gas/testsuite/gas/aarch64/cmpbr-far.s
new file mode 100644
index 00000000000..927d4229a60
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/cmpbr-far.s
@@ -0,0 +1,13 @@
+a:
+	.rept 257
+	nop
+	.endr
+	cbgt w0, w1, a
+
+	cbgt w0, w1, b
+	.rept 255
+	nop
+	.endr
+
+b:
+	nop
diff --git a/gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.d b/gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.d
new file mode 100644
index 00000000000..444b554a8d9
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.d
@@ -0,0 +1,4 @@
+#name: Test of out-of-range cmpbr operands
+#source: cmpbr-pseudo-bad.s
+#as: -march=armv8-a+cmpbr
+#error_output: cmpbr-pseudo-bad.l
diff --git a/gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.l b/gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.l
new file mode 100644
index 00000000000..3839baf9772
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.l
@@ -0,0 +1,3 @@
+.[^ :]+: Assembler messages:
+[^ :]+:[0-9]+: Error: immediate value out of range 1 to 64 at operand 2 -- `cbge w0,#0,a'
+[^ :]+:[0-9]+: Error: immediate value out of range -1 to 62 at operand 2 -- `cble w0,#63,a'
diff --git a/gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.s b/gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.s
new file mode 100644
index 00000000000..1fd0c3a3909
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/cmpbr-pseudo-bad.s
@@ -0,0 +1,3 @@
+a:
+	cbge	w0, #0, a
+	cble	w0, #63, a
diff --git a/gas/testsuite/gas/aarch64/cmpbr.d b/gas/testsuite/gas/aarch64/cmpbr.d
new file mode 100644
index 00000000000..457fdd732cc
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/cmpbr.d
@@ -0,0 +1,967 @@
+#name: Test for FEAT_CMPBR
+#as: -march=armv8-a+cmpbr
+#objdump: -dr
+
+.*:     file format .*
+
+Disassembly of section .text:
+
+.* <cbgt_0>:
+.*:	75000000 	cbgt	w0, #0, 0 <cbgt_0>
+.*:	75003fe0 	cbgt	w0, #0, 0 <cbgt_0>
+
+.* <cbgt_1>:
+.*:	751f8000 	cbgt	w0, #63, 8 <cbgt_1>
+.*:	751fbfe0 	cbgt	w0, #63, 8 <cbgt_1>
+
+.* <cbgt_2>:
+.*:	7500001f 	cbgt	wzr, #0, 10 <cbgt_2>
+.*:	75003fff 	cbgt	wzr, #0, 10 <cbgt_2>
+
+.* <cbgt_3>:
+.*:	751f801f 	cbgt	wzr, #63, 18 <cbgt_3>
+.*:	751fbfff 	cbgt	wzr, #63, 18 <cbgt_3>
+
+.* <cbgt_4>:
+.*:	f5000000 	cbgt	x0, #0, 20 <cbgt_4>
+.*:	f5003fe0 	cbgt	x0, #0, 20 <cbgt_4>
+
+.* <cbgt_5>:
+.*:	f51f8000 	cbgt	x0, #63, 28 <cbgt_5>
+.*:	f51fbfe0 	cbgt	x0, #63, 28 <cbgt_5>
+
+.* <cbgt_6>:
+.*:	f500001f 	cbgt	xzr, #0, 30 <cbgt_6>
+.*:	f5003fff 	cbgt	xzr, #0, 30 <cbgt_6>
+
+.* <cbgt_7>:
+.*:	f51f801f 	cbgt	xzr, #63, 38 <cbgt_7>
+.*:	f51fbfff 	cbgt	xzr, #63, 38 <cbgt_7>
+
+.* <cblt_0>:
+.*:	75200000 	cblt	w0, #0, 40 <cblt_0>
+.*:	75203fe0 	cblt	w0, #0, 40 <cblt_0>
+
+.* <cblt_1>:
+.*:	753f8000 	cblt	w0, #63, 48 <cblt_1>
+.*:	753fbfe0 	cblt	w0, #63, 48 <cblt_1>
+
+.* <cblt_2>:
+.*:	7520001f 	cblt	wzr, #0, 50 <cblt_2>
+.*:	75203fff 	cblt	wzr, #0, 50 <cblt_2>
+
+.* <cblt_3>:
+.*:	753f801f 	cblt	wzr, #63, 58 <cblt_3>
+.*:	753fbfff 	cblt	wzr, #63, 58 <cblt_3>
+
+.* <cblt_4>:
+.*:	f5200000 	cblt	x0, #0, 60 <cblt_4>
+.*:	f5203fe0 	cblt	x0, #0, 60 <cblt_4>
+
+.* <cblt_5>:
+.*:	f53f8000 	cblt	x0, #63, 68 <cblt_5>
+.*:	f53fbfe0 	cblt	x0, #63, 68 <cblt_5>
+
+.* <cblt_6>:
+.*:	f520001f 	cblt	xzr, #0, 70 <cblt_6>
+.*:	f5203fff 	cblt	xzr, #0, 70 <cblt_6>
+
+.* <cblt_7>:
+.*:	f53f801f 	cblt	xzr, #63, 78 <cblt_7>
+.*:	f53fbfff 	cblt	xzr, #63, 78 <cblt_7>
+
+.* <cbhi_0>:
+.*:	75400000 	cbhi	w0, #0, 80 <cbhi_0>
+.*:	75403fe0 	cbhi	w0, #0, 80 <cbhi_0>
+
+.* <cbhi_1>:
+.*:	755f8000 	cbhi	w0, #63, 88 <cbhi_1>
+.*:	755fbfe0 	cbhi	w0, #63, 88 <cbhi_1>
+
+.* <cbhi_2>:
+.*:	7540001f 	cbhi	wzr, #0, 90 <cbhi_2>
+.*:	75403fff 	cbhi	wzr, #0, 90 <cbhi_2>
+
+.* <cbhi_3>:
+.*:	755f801f 	cbhi	wzr, #63, 98 <cbhi_3>
+.*:	755fbfff 	cbhi	wzr, #63, 98 <cbhi_3>
+
+.* <cbhi_4>:
+.*:	f5400000 	cbhi	x0, #0, a0 <cbhi_4>
+.*:	f5403fe0 	cbhi	x0, #0, a0 <cbhi_4>
+
+.* <cbhi_5>:
+.*:	f55f8000 	cbhi	x0, #63, a8 <cbhi_5>
+.*:	f55fbfe0 	cbhi	x0, #63, a8 <cbhi_5>
+
+.* <cbhi_6>:
+.*:	f540001f 	cbhi	xzr, #0, b0 <cbhi_6>
+.*:	f5403fff 	cbhi	xzr, #0, b0 <cbhi_6>
+
+.* <cbhi_7>:
+.*:	f55f801f 	cbhi	xzr, #63, b8 <cbhi_7>
+.*:	f55fbfff 	cbhi	xzr, #63, b8 <cbhi_7>
+
+.* <cblo_0>:
+.*:	75600000 	cblo	w0, #0, c0 <cblo_0>
+.*:	75603fe0 	cblo	w0, #0, c0 <cblo_0>
+
+.* <cblo_1>:
+.*:	757f8000 	cblo	w0, #63, c8 <cblo_1>
+.*:	757fbfe0 	cblo	w0, #63, c8 <cblo_1>
+
+.* <cblo_2>:
+.*:	7560001f 	cblo	wzr, #0, d0 <cblo_2>
+.*:	75603fff 	cblo	wzr, #0, d0 <cblo_2>
+
+.* <cblo_3>:
+.*:	757f801f 	cblo	wzr, #63, d8 <cblo_3>
+.*:	757fbfff 	cblo	wzr, #63, d8 <cblo_3>
+
+.* <cblo_4>:
+.*:	f5600000 	cblo	x0, #0, e0 <cblo_4>
+.*:	f5603fe0 	cblo	x0, #0, e0 <cblo_4>
+
+.* <cblo_5>:
+.*:	f57f8000 	cblo	x0, #63, e8 <cblo_5>
+.*:	f57fbfe0 	cblo	x0, #63, e8 <cblo_5>
+
+.* <cblo_6>:
+.*:	f560001f 	cblo	xzr, #0, f0 <cblo_6>
+.*:	f5603fff 	cblo	xzr, #0, f0 <cblo_6>
+
+.* <cblo_7>:
+.*:	f57f801f 	cblo	xzr, #63, f8 <cblo_7>
+.*:	f57fbfff 	cblo	xzr, #63, f8 <cblo_7>
+
+.* <cbeq_0>:
+.*:	75c00000 	cbeq	w0, #0, 100 <cbeq_0>
+.*:	75c03fe0 	cbeq	w0, #0, 100 <cbeq_0>
+
+.* <cbeq_1>:
+.*:	75df8000 	cbeq	w0, #63, 108 <cbeq_1>
+.*:	75dfbfe0 	cbeq	w0, #63, 108 <cbeq_1>
+
+.* <cbeq_2>:
+.*:	75c0001f 	cbeq	wzr, #0, 110 <cbeq_2>
+.*:	75c03fff 	cbeq	wzr, #0, 110 <cbeq_2>
+
+.* <cbeq_3>:
+.*:	75df801f 	cbeq	wzr, #63, 118 <cbeq_3>
+.*:	75dfbfff 	cbeq	wzr, #63, 118 <cbeq_3>
+
+.* <cbeq_4>:
+.*:	f5c00000 	cbeq	x0, #0, 120 <cbeq_4>
+.*:	f5c03fe0 	cbeq	x0, #0, 120 <cbeq_4>
+
+.* <cbeq_5>:
+.*:	f5df8000 	cbeq	x0, #63, 128 <cbeq_5>
+.*:	f5dfbfe0 	cbeq	x0, #63, 128 <cbeq_5>
+
+.* <cbeq_6>:
+.*:	f5c0001f 	cbeq	xzr, #0, 130 <cbeq_6>
+.*:	f5c03fff 	cbeq	xzr, #0, 130 <cbeq_6>
+
+.* <cbeq_7>:
+.*:	f5df801f 	cbeq	xzr, #63, 138 <cbeq_7>
+.*:	f5dfbfff 	cbeq	xzr, #63, 138 <cbeq_7>
+
+.* <cbne_0>:
+.*:	75e00000 	cbne	w0, #0, 140 <cbne_0>
+.*:	75e03fe0 	cbne	w0, #0, 140 <cbne_0>
+
+.* <cbne_1>:
+.*:	75ff8000 	cbne	w0, #63, 148 <cbne_1>
+.*:	75ffbfe0 	cbne	w0, #63, 148 <cbne_1>
+
+.* <cbne_2>:
+.*:	75e0001f 	cbne	wzr, #0, 150 <cbne_2>
+.*:	75e03fff 	cbne	wzr, #0, 150 <cbne_2>
+
+.* <cbne_3>:
+.*:	75ff801f 	cbne	wzr, #63, 158 <cbne_3>
+.*:	75ffbfff 	cbne	wzr, #63, 158 <cbne_3>
+
+.* <cbne_4>:
+.*:	f5e00000 	cbne	x0, #0, 160 <cbne_4>
+.*:	f5e03fe0 	cbne	x0, #0, 160 <cbne_4>
+
+.* <cbne_5>:
+.*:	f5ff8000 	cbne	x0, #63, 168 <cbne_5>
+.*:	f5ffbfe0 	cbne	x0, #63, 168 <cbne_5>
+
+.* <cbne_6>:
+.*:	f5e0001f 	cbne	xzr, #0, 170 <cbne_6>
+.*:	f5e03fff 	cbne	xzr, #0, 170 <cbne_6>
+
+.* <cbne_7>:
+.*:	f5ff801f 	cbne	xzr, #63, 178 <cbne_7>
+.*:	f5ffbfff 	cbne	xzr, #63, 178 <cbne_7>
+
+.* <cbgt_8>:
+.*:	74000000 	cbgt	w0, w0, 180 <cbgt_8>
+.*:	74003fe0 	cbgt	w0, w0, 180 <cbgt_8>
+
+.* <cbgt_9>:
+.*:	741f0000 	cbgt	w0, wzr, 188 <cbgt_9>
+.*:	741f3fe0 	cbgt	w0, wzr, 188 <cbgt_9>
+
+.* <cbgt_10>:
+.*:	7400001f 	cbgt	wzr, w0, 190 <cbgt_10>
+.*:	74003fff 	cbgt	wzr, w0, 190 <cbgt_10>
+
+.* <cbgt_11>:
+.*:	741f001f 	cbgt	wzr, wzr, 198 <cbgt_11>
+.*:	741f3fff 	cbgt	wzr, wzr, 198 <cbgt_11>
+
+.* <cbgt_12>:
+.*:	f4000000 	cbgt	x0, x0, 1a0 <cbgt_12>
+.*:	f4003fe0 	cbgt	x0, x0, 1a0 <cbgt_12>
+
+.* <cbgt_13>:
+.*:	f41f0000 	cbgt	x0, xzr, 1a8 <cbgt_13>
+.*:	f41f3fe0 	cbgt	x0, xzr, 1a8 <cbgt_13>
+
+.* <cbgt_14>:
+.*:	f400001f 	cbgt	xzr, x0, 1b0 <cbgt_14>
+.*:	f4003fff 	cbgt	xzr, x0, 1b0 <cbgt_14>
+
+.* <cbgt_15>:
+.*:	f41f001f 	cbgt	xzr, xzr, 1b8 <cbgt_15>
+.*:	f41f3fff 	cbgt	xzr, xzr, 1b8 <cbgt_15>
+
+.* <cbge_8>:
+.*:	74200000 	cbge	w0, w0, 1c0 <cbge_8>
+.*:	74203fe0 	cbge	w0, w0, 1c0 <cbge_8>
+
+.* <cbge_9>:
+.*:	743f0000 	cbge	w0, wzr, 1c8 <cbge_9>
+.*:	743f3fe0 	cbge	w0, wzr, 1c8 <cbge_9>
+
+.* <cbge_10>:
+.*:	7420001f 	cbge	wzr, w0, 1d0 <cbge_10>
+.*:	74203fff 	cbge	wzr, w0, 1d0 <cbge_10>
+
+.* <cbge_11>:
+.*:	743f001f 	cbge	wzr, wzr, 1d8 <cbge_11>
+.*:	743f3fff 	cbge	wzr, wzr, 1d8 <cbge_11>
+
+.* <cbge_12>:
+.*:	f4200000 	cbge	x0, x0, 1e0 <cbge_12>
+.*:	f4203fe0 	cbge	x0, x0, 1e0 <cbge_12>
+
+.* <cbge_13>:
+.*:	f43f0000 	cbge	x0, xzr, 1e8 <cbge_13>
+.*:	f43f3fe0 	cbge	x0, xzr, 1e8 <cbge_13>
+
+.* <cbge_14>:
+.*:	f420001f 	cbge	xzr, x0, 1f0 <cbge_14>
+.*:	f4203fff 	cbge	xzr, x0, 1f0 <cbge_14>
+
+.* <cbge_15>:
+.*:	f43f001f 	cbge	xzr, xzr, 1f8 <cbge_15>
+.*:	f43f3fff 	cbge	xzr, xzr, 1f8 <cbge_15>
+
+.* <cbhi_8>:
+.*:	74400000 	cbhi	w0, w0, 200 <cbhi_8>
+.*:	74403fe0 	cbhi	w0, w0, 200 <cbhi_8>
+
+.* <cbhi_9>:
+.*:	745f0000 	cbhi	w0, wzr, 208 <cbhi_9>
+.*:	745f3fe0 	cbhi	w0, wzr, 208 <cbhi_9>
+
+.* <cbhi_10>:
+.*:	7440001f 	cbhi	wzr, w0, 210 <cbhi_10>
+.*:	74403fff 	cbhi	wzr, w0, 210 <cbhi_10>
+
+.* <cbhi_11>:
+.*:	745f001f 	cbhi	wzr, wzr, 218 <cbhi_11>
+.*:	745f3fff 	cbhi	wzr, wzr, 218 <cbhi_11>
+
+.* <cbhi_12>:
+.*:	f4400000 	cbhi	x0, x0, 220 <cbhi_12>
+.*:	f4403fe0 	cbhi	x0, x0, 220 <cbhi_12>
+
+.* <cbhi_13>:
+.*:	f45f0000 	cbhi	x0, xzr, 228 <cbhi_13>
+.*:	f45f3fe0 	cbhi	x0, xzr, 228 <cbhi_13>
+
+.* <cbhi_14>:
+.*:	f440001f 	cbhi	xzr, x0, 230 <cbhi_14>
+.*:	f4403fff 	cbhi	xzr, x0, 230 <cbhi_14>
+
+.* <cbhi_15>:
+.*:	f45f001f 	cbhi	xzr, xzr, 238 <cbhi_15>
+.*:	f45f3fff 	cbhi	xzr, xzr, 238 <cbhi_15>
+
+.* <cbhs_8>:
+.*:	74600000 	cbhs	w0, w0, 240 <cbhs_8>
+.*:	74603fe0 	cbhs	w0, w0, 240 <cbhs_8>
+
+.* <cbhs_9>:
+.*:	747f0000 	cbhs	w0, wzr, 248 <cbhs_9>
+.*:	747f3fe0 	cbhs	w0, wzr, 248 <cbhs_9>
+
+.* <cbhs_10>:
+.*:	7460001f 	cbhs	wzr, w0, 250 <cbhs_10>
+.*:	74603fff 	cbhs	wzr, w0, 250 <cbhs_10>
+
+.* <cbhs_11>:
+.*:	747f001f 	cbhs	wzr, wzr, 258 <cbhs_11>
+.*:	747f3fff 	cbhs	wzr, wzr, 258 <cbhs_11>
+
+.* <cbhs_12>:
+.*:	f4600000 	cbhs	x0, x0, 260 <cbhs_12>
+.*:	f4603fe0 	cbhs	x0, x0, 260 <cbhs_12>
+
+.* <cbhs_13>:
+.*:	f47f0000 	cbhs	x0, xzr, 268 <cbhs_13>
+.*:	f47f3fe0 	cbhs	x0, xzr, 268 <cbhs_13>
+
+.* <cbhs_14>:
+.*:	f460001f 	cbhs	xzr, x0, 270 <cbhs_14>
+.*:	f4603fff 	cbhs	xzr, x0, 270 <cbhs_14>
+
+.* <cbhs_15>:
+.*:	f47f001f 	cbhs	xzr, xzr, 278 <cbhs_15>
+.*:	f47f3fff 	cbhs	xzr, xzr, 278 <cbhs_15>
+
+.* <cbeq_8>:
+.*:	74c00000 	cbeq	w0, w0, 280 <cbeq_8>
+.*:	74c03fe0 	cbeq	w0, w0, 280 <cbeq_8>
+
+.* <cbeq_9>:
+.*:	74df0000 	cbeq	w0, wzr, 288 <cbeq_9>
+.*:	74df3fe0 	cbeq	w0, wzr, 288 <cbeq_9>
+
+.* <cbeq_10>:
+.*:	74c0001f 	cbeq	wzr, w0, 290 <cbeq_10>
+.*:	74c03fff 	cbeq	wzr, w0, 290 <cbeq_10>
+
+.* <cbeq_11>:
+.*:	74df001f 	cbeq	wzr, wzr, 298 <cbeq_11>
+.*:	74df3fff 	cbeq	wzr, wzr, 298 <cbeq_11>
+
+.* <cbeq_12>:
+.*:	f4c00000 	cbeq	x0, x0, 2a0 <cbeq_12>
+.*:	f4c03fe0 	cbeq	x0, x0, 2a0 <cbeq_12>
+
+.* <cbeq_13>:
+.*:	f4df0000 	cbeq	x0, xzr, 2a8 <cbeq_13>
+.*:	f4df3fe0 	cbeq	x0, xzr, 2a8 <cbeq_13>
+
+.* <cbeq_14>:
+.*:	f4c0001f 	cbeq	xzr, x0, 2b0 <cbeq_14>
+.*:	f4c03fff 	cbeq	xzr, x0, 2b0 <cbeq_14>
+
+.* <cbeq_15>:
+.*:	f4df001f 	cbeq	xzr, xzr, 2b8 <cbeq_15>
+.*:	f4df3fff 	cbeq	xzr, xzr, 2b8 <cbeq_15>
+
+.* <cbne_8>:
+.*:	74e00000 	cbne	w0, w0, 2c0 <cbne_8>
+.*:	74e03fe0 	cbne	w0, w0, 2c0 <cbne_8>
+
+.* <cbne_9>:
+.*:	74ff0000 	cbne	w0, wzr, 2c8 <cbne_9>
+.*:	74ff3fe0 	cbne	w0, wzr, 2c8 <cbne_9>
+
+.* <cbne_10>:
+.*:	74e0001f 	cbne	wzr, w0, 2d0 <cbne_10>
+.*:	74e03fff 	cbne	wzr, w0, 2d0 <cbne_10>
+
+.* <cbne_11>:
+.*:	74ff001f 	cbne	wzr, wzr, 2d8 <cbne_11>
+.*:	74ff3fff 	cbne	wzr, wzr, 2d8 <cbne_11>
+
+.* <cbne_12>:
+.*:	f4e00000 	cbne	x0, x0, 2e0 <cbne_12>
+.*:	f4e03fe0 	cbne	x0, x0, 2e0 <cbne_12>
+
+.* <cbne_13>:
+.*:	f4ff0000 	cbne	x0, xzr, 2e8 <cbne_13>
+.*:	f4ff3fe0 	cbne	x0, xzr, 2e8 <cbne_13>
+
+.* <cbne_14>:
+.*:	f4e0001f 	cbne	xzr, x0, 2f0 <cbne_14>
+.*:	f4e03fff 	cbne	xzr, x0, 2f0 <cbne_14>
+
+.* <cbne_15>:
+.*:	f4ff001f 	cbne	xzr, xzr, 2f8 <cbne_15>
+.*:	f4ff3fff 	cbne	xzr, xzr, 2f8 <cbne_15>
+
+.* <cbbgt_0>:
+.*:	74008000 	cbbgt	w0, w0, 300 <cbbgt_0>
+.*:	7400bfe0 	cbbgt	w0, w0, 300 <cbbgt_0>
+
+.* <cbbgt_1>:
+.*:	741f8000 	cbbgt	w0, wzr, 308 <cbbgt_1>
+.*:	741fbfe0 	cbbgt	w0, wzr, 308 <cbbgt_1>
+
+.* <cbbgt_2>:
+.*:	7400801f 	cbbgt	wzr, w0, 310 <cbbgt_2>
+.*:	7400bfff 	cbbgt	wzr, w0, 310 <cbbgt_2>
+
+.* <cbbgt_3>:
+.*:	741f801f 	cbbgt	wzr, wzr, 318 <cbbgt_3>
+.*:	741fbfff 	cbbgt	wzr, wzr, 318 <cbbgt_3>
+
+.* <cbbge_0>:
+.*:	74208000 	cbbge	w0, w0, 320 <cbbge_0>
+.*:	7420bfe0 	cbbge	w0, w0, 320 <cbbge_0>
+
+.* <cbbge_1>:
+.*:	743f8000 	cbbge	w0, wzr, 328 <cbbge_1>
+.*:	743fbfe0 	cbbge	w0, wzr, 328 <cbbge_1>
+
+.* <cbbge_2>:
+.*:	7420801f 	cbbge	wzr, w0, 330 <cbbge_2>
+.*:	7420bfff 	cbbge	wzr, w0, 330 <cbbge_2>
+
+.* <cbbge_3>:
+.*:	743f801f 	cbbge	wzr, wzr, 338 <cbbge_3>
+.*:	743fbfff 	cbbge	wzr, wzr, 338 <cbbge_3>
+
+.* <cbbhi_0>:
+.*:	74408000 	cbbhi	w0, w0, 340 <cbbhi_0>
+.*:	7440bfe0 	cbbhi	w0, w0, 340 <cbbhi_0>
+
+.* <cbbhi_1>:
+.*:	745f8000 	cbbhi	w0, wzr, 348 <cbbhi_1>
+.*:	745fbfe0 	cbbhi	w0, wzr, 348 <cbbhi_1>
+
+.* <cbbhi_2>:
+.*:	7440801f 	cbbhi	wzr, w0, 350 <cbbhi_2>
+.*:	7440bfff 	cbbhi	wzr, w0, 350 <cbbhi_2>
+
+.* <cbbhi_3>:
+.*:	745f801f 	cbbhi	wzr, wzr, 358 <cbbhi_3>
+.*:	745fbfff 	cbbhi	wzr, wzr, 358 <cbbhi_3>
+
+.* <cbbhs_0>:
+.*:	74608000 	cbbhs	w0, w0, 360 <cbbhs_0>
+.*:	7460bfe0 	cbbhs	w0, w0, 360 <cbbhs_0>
+
+.* <cbbhs_1>:
+.*:	747f8000 	cbbhs	w0, wzr, 368 <cbbhs_1>
+.*:	747fbfe0 	cbbhs	w0, wzr, 368 <cbbhs_1>
+
+.* <cbbhs_2>:
+.*:	7460801f 	cbbhs	wzr, w0, 370 <cbbhs_2>
+.*:	7460bfff 	cbbhs	wzr, w0, 370 <cbbhs_2>
+
+.* <cbbhs_3>:
+.*:	747f801f 	cbbhs	wzr, wzr, 378 <cbbhs_3>
+.*:	747fbfff 	cbbhs	wzr, wzr, 378 <cbbhs_3>
+
+.* <cbbeq_0>:
+.*:	74c08000 	cbbeq	w0, w0, 380 <cbbeq_0>
+.*:	74c0bfe0 	cbbeq	w0, w0, 380 <cbbeq_0>
+
+.* <cbbeq_1>:
+.*:	74df8000 	cbbeq	w0, wzr, 388 <cbbeq_1>
+.*:	74dfbfe0 	cbbeq	w0, wzr, 388 <cbbeq_1>
+
+.* <cbbeq_2>:
+.*:	74c0801f 	cbbeq	wzr, w0, 390 <cbbeq_2>
+.*:	74c0bfff 	cbbeq	wzr, w0, 390 <cbbeq_2>
+
+.* <cbbeq_3>:
+.*:	74df801f 	cbbeq	wzr, wzr, 398 <cbbeq_3>
+.*:	74dfbfff 	cbbeq	wzr, wzr, 398 <cbbeq_3>
+
+.* <cbbne_0>:
+.*:	74e08000 	cbbne	w0, w0, 3a0 <cbbne_0>
+.*:	74e0bfe0 	cbbne	w0, w0, 3a0 <cbbne_0>
+
+.* <cbbne_1>:
+.*:	74ff8000 	cbbne	w0, wzr, 3a8 <cbbne_1>
+.*:	74ffbfe0 	cbbne	w0, wzr, 3a8 <cbbne_1>
+
+.* <cbbne_2>:
+.*:	74e0801f 	cbbne	wzr, w0, 3b0 <cbbne_2>
+.*:	74e0bfff 	cbbne	wzr, w0, 3b0 <cbbne_2>
+
+.* <cbbne_3>:
+.*:	74ff801f 	cbbne	wzr, wzr, 3b8 <cbbne_3>
+.*:	74ffbfff 	cbbne	wzr, wzr, 3b8 <cbbne_3>
+
+.* <cbhgt_0>:
+.*:	7400c000 	cbhgt	w0, w0, 3c0 <cbhgt_0>
+.*:	7400ffe0 	cbhgt	w0, w0, 3c0 <cbhgt_0>
+
+.* <cbhgt_1>:
+.*:	741fc000 	cbhgt	w0, wzr, 3c8 <cbhgt_1>
+.*:	741fffe0 	cbhgt	w0, wzr, 3c8 <cbhgt_1>
+
+.* <cbhgt_2>:
+.*:	7400c01f 	cbhgt	wzr, w0, 3d0 <cbhgt_2>
+.*:	7400ffff 	cbhgt	wzr, w0, 3d0 <cbhgt_2>
+
+.* <cbhgt_3>:
+.*:	741fc01f 	cbhgt	wzr, wzr, 3d8 <cbhgt_3>
+.*:	741fffff 	cbhgt	wzr, wzr, 3d8 <cbhgt_3>
+
+.* <cbhge_0>:
+.*:	7420c000 	cbhge	w0, w0, 3e0 <cbhge_0>
+.*:	7420ffe0 	cbhge	w0, w0, 3e0 <cbhge_0>
+
+.* <cbhge_1>:
+.*:	743fc000 	cbhge	w0, wzr, 3e8 <cbhge_1>
+.*:	743fffe0 	cbhge	w0, wzr, 3e8 <cbhge_1>
+
+.* <cbhge_2>:
+.*:	7420c01f 	cbhge	wzr, w0, 3f0 <cbhge_2>
+.*:	7420ffff 	cbhge	wzr, w0, 3f0 <cbhge_2>
+
+.* <cbhge_3>:
+.*:	743fc01f 	cbhge	wzr, wzr, 3f8 <cbhge_3>
+.*:	743fffff 	cbhge	wzr, wzr, 3f8 <cbhge_3>
+
+.* <cbhhi_0>:
+.*:	7440c000 	cbhhi	w0, w0, 400 <cbhhi_0>
+.*:	7440ffe0 	cbhhi	w0, w0, 400 <cbhhi_0>
+
+.* <cbhhi_1>:
+.*:	745fc000 	cbhhi	w0, wzr, 408 <cbhhi_1>
+.*:	745fffe0 	cbhhi	w0, wzr, 408 <cbhhi_1>
+
+.* <cbhhi_2>:
+.*:	7440c01f 	cbhhi	wzr, w0, 410 <cbhhi_2>
+.*:	7440ffff 	cbhhi	wzr, w0, 410 <cbhhi_2>
+
+.* <cbhhi_3>:
+.*:	745fc01f 	cbhhi	wzr, wzr, 418 <cbhhi_3>
+.*:	745fffff 	cbhhi	wzr, wzr, 418 <cbhhi_3>
+
+.* <cbhhs_0>:
+.*:	7460c000 	cbhhs	w0, w0, 420 <cbhhs_0>
+.*:	7460ffe0 	cbhhs	w0, w0, 420 <cbhhs_0>
+
+.* <cbhhs_1>:
+.*:	747fc000 	cbhhs	w0, wzr, 428 <cbhhs_1>
+.*:	747fffe0 	cbhhs	w0, wzr, 428 <cbhhs_1>
+
+.* <cbhhs_2>:
+.*:	7460c01f 	cbhhs	wzr, w0, 430 <cbhhs_2>
+.*:	7460ffff 	cbhhs	wzr, w0, 430 <cbhhs_2>
+
+.* <cbhhs_3>:
+.*:	747fc01f 	cbhhs	wzr, wzr, 438 <cbhhs_3>
+.*:	747fffff 	cbhhs	wzr, wzr, 438 <cbhhs_3>
+
+.* <cbheq_0>:
+.*:	74c0c000 	cbheq	w0, w0, 440 <cbheq_0>
+.*:	74c0ffe0 	cbheq	w0, w0, 440 <cbheq_0>
+
+.* <cbheq_1>:
+.*:	74dfc000 	cbheq	w0, wzr, 448 <cbheq_1>
+.*:	74dfffe0 	cbheq	w0, wzr, 448 <cbheq_1>
+
+.* <cbheq_2>:
+.*:	74c0c01f 	cbheq	wzr, w0, 450 <cbheq_2>
+.*:	74c0ffff 	cbheq	wzr, w0, 450 <cbheq_2>
+
+.* <cbheq_3>:
+.*:	74dfc01f 	cbheq	wzr, wzr, 458 <cbheq_3>
+.*:	74dfffff 	cbheq	wzr, wzr, 458 <cbheq_3>
+
+.* <cbhne_0>:
+.*:	74e0c000 	cbhne	w0, w0, 460 <cbhne_0>
+.*:	74e0ffe0 	cbhne	w0, w0, 460 <cbhne_0>
+
+.* <cbhne_1>:
+.*:	74ffc000 	cbhne	w0, wzr, 468 <cbhne_1>
+.*:	74ffffe0 	cbhne	w0, wzr, 468 <cbhne_1>
+
+.* <cbhne_2>:
+.*:	74e0c01f 	cbhne	wzr, w0, 470 <cbhne_2>
+.*:	74e0ffff 	cbhne	wzr, w0, 470 <cbhne_2>
+
+.* <cbhne_3>:
+.*:	74ffc01f 	cbhne	wzr, wzr, 478 <cbhne_3>
+.*:	74ffffff 	cbhne	wzr, wzr, 478 <cbhne_3>
+
+.* <cbge_0>:
+.*:	75000000 	cbgt	w0, #0, 480 <cbge_0>
+.*:	75003fe0 	cbgt	w0, #0, 480 <cbge_0>
+
+.* <cbge_1>:
+.*:	751f8000 	cbgt	w0, #63, 488 <cbge_1>
+.*:	751fbfe0 	cbgt	w0, #63, 488 <cbge_1>
+
+.* <cbge_2>:
+.*:	7500001f 	cbgt	wzr, #0, 490 <cbge_2>
+.*:	75003fff 	cbgt	wzr, #0, 490 <cbge_2>
+
+.* <cbge_3>:
+.*:	751f801f 	cbgt	wzr, #63, 498 <cbge_3>
+.*:	751fbfff 	cbgt	wzr, #63, 498 <cbge_3>
+
+.* <cbge_4>:
+.*:	f5000000 	cbgt	x0, #0, 4a0 <cbge_4>
+.*:	f5003fe0 	cbgt	x0, #0, 4a0 <cbge_4>
+
+.* <cbge_5>:
+.*:	f51f8000 	cbgt	x0, #63, 4a8 <cbge_5>
+.*:	f51fbfe0 	cbgt	x0, #63, 4a8 <cbge_5>
+
+.* <cbge_6>:
+.*:	f500001f 	cbgt	xzr, #0, 4b0 <cbge_6>
+.*:	f5003fff 	cbgt	xzr, #0, 4b0 <cbge_6>
+
+.* <cbge_7>:
+.*:	f51f801f 	cbgt	xzr, #63, 4b8 <cbge_7>
+.*:	f51fbfff 	cbgt	xzr, #63, 4b8 <cbge_7>
+
+.* <cble_0>:
+.*:	75200000 	cblt	w0, #0, 4c0 <cble_0>
+.*:	75203fe0 	cblt	w0, #0, 4c0 <cble_0>
+
+.* <cble_1>:
+.*:	753f8000 	cblt	w0, #63, 4c8 <cble_1>
+.*:	753fbfe0 	cblt	w0, #63, 4c8 <cble_1>
+
+.* <cble_2>:
+.*:	7520001f 	cblt	wzr, #0, 4d0 <cble_2>
+.*:	75203fff 	cblt	wzr, #0, 4d0 <cble_2>
+
+.* <cble_3>:
+.*:	753f801f 	cblt	wzr, #63, 4d8 <cble_3>
+.*:	753fbfff 	cblt	wzr, #63, 4d8 <cble_3>
+
+.* <cble_4>:
+.*:	f5200000 	cblt	x0, #0, 4e0 <cble_4>
+.*:	f5203fe0 	cblt	x0, #0, 4e0 <cble_4>
+
+.* <cble_5>:
+.*:	f53f8000 	cblt	x0, #63, 4e8 <cble_5>
+.*:	f53fbfe0 	cblt	x0, #63, 4e8 <cble_5>
+
+.* <cble_6>:
+.*:	f520001f 	cblt	xzr, #0, 4f0 <cble_6>
+.*:	f5203fff 	cblt	xzr, #0, 4f0 <cble_6>
+
+.* <cble_7>:
+.*:	f53f801f 	cblt	xzr, #63, 4f8 <cble_7>
+.*:	f53fbfff 	cblt	xzr, #63, 4f8 <cble_7>
+
+.* <cbhs_0>:
+.*:	75400000 	cbhi	w0, #0, 500 <cbhs_0>
+.*:	75403fe0 	cbhi	w0, #0, 500 <cbhs_0>
+
+.* <cbhs_1>:
+.*:	755f8000 	cbhi	w0, #63, 508 <cbhs_1>
+.*:	755fbfe0 	cbhi	w0, #63, 508 <cbhs_1>
+
+.* <cbhs_2>:
+.*:	7540001f 	cbhi	wzr, #0, 510 <cbhs_2>
+.*:	75403fff 	cbhi	wzr, #0, 510 <cbhs_2>
+
+.* <cbhs_3>:
+.*:	755f801f 	cbhi	wzr, #63, 518 <cbhs_3>
+.*:	755fbfff 	cbhi	wzr, #63, 518 <cbhs_3>
+
+.* <cbhs_4>:
+.*:	f5400000 	cbhi	x0, #0, 520 <cbhs_4>
+.*:	f5403fe0 	cbhi	x0, #0, 520 <cbhs_4>
+
+.* <cbhs_5>:
+.*:	f55f8000 	cbhi	x0, #63, 528 <cbhs_5>
+.*:	f55fbfe0 	cbhi	x0, #63, 528 <cbhs_5>
+
+.* <cbhs_6>:
+.*:	f540001f 	cbhi	xzr, #0, 530 <cbhs_6>
+.*:	f5403fff 	cbhi	xzr, #0, 530 <cbhs_6>
+
+.* <cbhs_7>:
+.*:	f55f801f 	cbhi	xzr, #63, 538 <cbhs_7>
+.*:	f55fbfff 	cbhi	xzr, #63, 538 <cbhs_7>
+
+.* <cbls_0>:
+.*:	75600000 	cblo	w0, #0, 540 <cbls_0>
+.*:	75603fe0 	cblo	w0, #0, 540 <cbls_0>
+
+.* <cbls_1>:
+.*:	757f8000 	cblo	w0, #63, 548 <cbls_1>
+.*:	757fbfe0 	cblo	w0, #63, 548 <cbls_1>
+
+.* <cbls_2>:
+.*:	7560001f 	cblo	wzr, #0, 550 <cbls_2>
+.*:	75603fff 	cblo	wzr, #0, 550 <cbls_2>
+
+.* <cbls_3>:
+.*:	757f801f 	cblo	wzr, #63, 558 <cbls_3>
+.*:	757fbfff 	cblo	wzr, #63, 558 <cbls_3>
+
+.* <cbls_4>:
+.*:	f5600000 	cblo	x0, #0, 560 <cbls_4>
+.*:	f5603fe0 	cblo	x0, #0, 560 <cbls_4>
+
+.* <cbls_5>:
+.*:	f57f8000 	cblo	x0, #63, 568 <cbls_5>
+.*:	f57fbfe0 	cblo	x0, #63, 568 <cbls_5>
+
+.* <cbls_6>:
+.*:	f560001f 	cblo	xzr, #0, 570 <cbls_6>
+.*:	f5603fff 	cblo	xzr, #0, 570 <cbls_6>
+
+.* <cbls_7>:
+.*:	f57f801f 	cblo	xzr, #63, 578 <cbls_7>
+.*:	f57fbfff 	cblo	xzr, #63, 578 <cbls_7>
+
+.* <cblt_8>:
+.*:	74000000 	cbgt	w0, w0, 580 <cblt_8>
+.*:	74003fe0 	cbgt	w0, w0, 580 <cblt_8>
+
+.* <cblt_9>:
+.*:	7400001f 	cbgt	wzr, w0, 588 <cblt_9>
+.*:	74003fff 	cbgt	wzr, w0, 588 <cblt_9>
+
+.* <cblt_10>:
+.*:	741f0000 	cbgt	w0, wzr, 590 <cblt_10>
+.*:	741f3fe0 	cbgt	w0, wzr, 590 <cblt_10>
+
+.* <cblt_11>:
+.*:	741f001f 	cbgt	wzr, wzr, 598 <cblt_11>
+.*:	741f3fff 	cbgt	wzr, wzr, 598 <cblt_11>
+
+.* <cblt_12>:
+.*:	f4000000 	cbgt	x0, x0, 5a0 <cblt_12>
+.*:	f4003fe0 	cbgt	x0, x0, 5a0 <cblt_12>
+
+.* <cblt_13>:
+.*:	f400001f 	cbgt	xzr, x0, 5a8 <cblt_13>
+.*:	f4003fff 	cbgt	xzr, x0, 5a8 <cblt_13>
+
+.* <cblt_14>:
+.*:	f41f0000 	cbgt	x0, xzr, 5b0 <cblt_14>
+.*:	f41f3fe0 	cbgt	x0, xzr, 5b0 <cblt_14>
+
+.* <cblt_15>:
+.*:	f41f001f 	cbgt	xzr, xzr, 5b8 <cblt_15>
+.*:	f41f3fff 	cbgt	xzr, xzr, 5b8 <cblt_15>
+
+.* <cble_8>:
+.*:	74200000 	cbge	w0, w0, 5c0 <cble_8>
+.*:	74203fe0 	cbge	w0, w0, 5c0 <cble_8>
+
+.* <cble_9>:
+.*:	7420001f 	cbge	wzr, w0, 5c8 <cble_9>
+.*:	74203fff 	cbge	wzr, w0, 5c8 <cble_9>
+
+.* <cble_10>:
+.*:	743f0000 	cbge	w0, wzr, 5d0 <cble_10>
+.*:	743f3fe0 	cbge	w0, wzr, 5d0 <cble_10>
+
+.* <cble_11>:
+.*:	743f001f 	cbge	wzr, wzr, 5d8 <cble_11>
+.*:	743f3fff 	cbge	wzr, wzr, 5d8 <cble_11>
+
+.* <cble_12>:
+.*:	f4200000 	cbge	x0, x0, 5e0 <cble_12>
+.*:	f4203fe0 	cbge	x0, x0, 5e0 <cble_12>
+
+.* <cble_13>:
+.*:	f420001f 	cbge	xzr, x0, 5e8 <cble_13>
+.*:	f4203fff 	cbge	xzr, x0, 5e8 <cble_13>
+
+.* <cble_14>:
+.*:	f43f0000 	cbge	x0, xzr, 5f0 <cble_14>
+.*:	f43f3fe0 	cbge	x0, xzr, 5f0 <cble_14>
+
+.* <cble_15>:
+.*:	f43f001f 	cbge	xzr, xzr, 5f8 <cble_15>
+.*:	f43f3fff 	cbge	xzr, xzr, 5f8 <cble_15>
+
+.* <cblo_8>:
+.*:	74400000 	cbhi	w0, w0, 600 <cblo_8>
+.*:	74403fe0 	cbhi	w0, w0, 600 <cblo_8>
+
+.* <cblo_9>:
+.*:	7440001f 	cbhi	wzr, w0, 608 <cblo_9>
+.*:	74403fff 	cbhi	wzr, w0, 608 <cblo_9>
+
+.* <cblo_10>:
+.*:	745f0000 	cbhi	w0, wzr, 610 <cblo_10>
+.*:	745f3fe0 	cbhi	w0, wzr, 610 <cblo_10>
+
+.* <cblo_11>:
+.*:	745f001f 	cbhi	wzr, wzr, 618 <cblo_11>
+.*:	745f3fff 	cbhi	wzr, wzr, 618 <cblo_11>
+
+.* <cblo_12>:
+.*:	f4400000 	cbhi	x0, x0, 620 <cblo_12>
+.*:	f4403fe0 	cbhi	x0, x0, 620 <cblo_12>
+
+.* <cblo_13>:
+.*:	f440001f 	cbhi	xzr, x0, 628 <cblo_13>
+.*:	f4403fff 	cbhi	xzr, x0, 628 <cblo_13>
+
+.* <cblo_14>:
+.*:	f45f0000 	cbhi	x0, xzr, 630 <cblo_14>
+.*:	f45f3fe0 	cbhi	x0, xzr, 630 <cblo_14>
+
+.* <cblo_15>:
+.*:	f45f001f 	cbhi	xzr, xzr, 638 <cblo_15>
+.*:	f45f3fff 	cbhi	xzr, xzr, 638 <cblo_15>
+
+.* <cbls_8>:
+.*:	74600000 	cbhs	w0, w0, 640 <cbls_8>
+.*:	74603fe0 	cbhs	w0, w0, 640 <cbls_8>
+
+.* <cbls_9>:
+.*:	7460001f 	cbhs	wzr, w0, 648 <cbls_9>
+.*:	74603fff 	cbhs	wzr, w0, 648 <cbls_9>
+
+.* <cbls_10>:
+.*:	747f0000 	cbhs	w0, wzr, 650 <cbls_10>
+.*:	747f3fe0 	cbhs	w0, wzr, 650 <cbls_10>
+
+.* <cbls_11>:
+.*:	747f001f 	cbhs	wzr, wzr, 658 <cbls_11>
+.*:	747f3fff 	cbhs	wzr, wzr, 658 <cbls_11>
+
+.* <cbls_12>:
+.*:	f4600000 	cbhs	x0, x0, 660 <cbls_12>
+.*:	f4603fe0 	cbhs	x0, x0, 660 <cbls_12>
+
+.* <cbls_13>:
+.*:	f460001f 	cbhs	xzr, x0, 668 <cbls_13>
+.*:	f4603fff 	cbhs	xzr, x0, 668 <cbls_13>
+
+.* <cbls_14>:
+.*:	f47f0000 	cbhs	x0, xzr, 670 <cbls_14>
+.*:	f47f3fe0 	cbhs	x0, xzr, 670 <cbls_14>
+
+.* <cbls_15>:
+.*:	f47f001f 	cbhs	xzr, xzr, 678 <cbls_15>
+.*:	f47f3fff 	cbhs	xzr, xzr, 678 <cbls_15>
+
+.* <cbblt_0>:
+.*:	74008000 	cbbgt	w0, w0, 680 <cbblt_0>
+.*:	7400bfe0 	cbbgt	w0, w0, 680 <cbblt_0>
+
+.* <cbblt_1>:
+.*:	7400801f 	cbbgt	wzr, w0, 688 <cbblt_1>
+.*:	7400bfff 	cbbgt	wzr, w0, 688 <cbblt_1>
+
+.* <cbblt_2>:
+.*:	741f8000 	cbbgt	w0, wzr, 690 <cbblt_2>
+.*:	741fbfe0 	cbbgt	w0, wzr, 690 <cbblt_2>
+
+.* <cbblt_3>:
+.*:	741f801f 	cbbgt	wzr, wzr, 698 <cbblt_3>
+.*:	741fbfff 	cbbgt	wzr, wzr, 698 <cbblt_3>
+
+.* <cbble_0>:
+.*:	74208000 	cbbge	w0, w0, 6a0 <cbble_0>
+.*:	7420bfe0 	cbbge	w0, w0, 6a0 <cbble_0>
+
+.* <cbble_1>:
+.*:	7420801f 	cbbge	wzr, w0, 6a8 <cbble_1>
+.*:	7420bfff 	cbbge	wzr, w0, 6a8 <cbble_1>
+
+.* <cbble_2>:
+.*:	743f8000 	cbbge	w0, wzr, 6b0 <cbble_2>
+.*:	743fbfe0 	cbbge	w0, wzr, 6b0 <cbble_2>
+
+.* <cbble_3>:
+.*:	743f801f 	cbbge	wzr, wzr, 6b8 <cbble_3>
+.*:	743fbfff 	cbbge	wzr, wzr, 6b8 <cbble_3>
+
+.* <cbblo_0>:
+.*:	74408000 	cbbhi	w0, w0, 6c0 <cbblo_0>
+.*:	7440bfe0 	cbbhi	w0, w0, 6c0 <cbblo_0>
+
+.* <cbblo_1>:
+.*:	7440801f 	cbbhi	wzr, w0, 6c8 <cbblo_1>
+.*:	7440bfff 	cbbhi	wzr, w0, 6c8 <cbblo_1>
+
+.* <cbblo_2>:
+.*:	745f8000 	cbbhi	w0, wzr, 6d0 <cbblo_2>
+.*:	745fbfe0 	cbbhi	w0, wzr, 6d0 <cbblo_2>
+
+.* <cbblo_3>:
+.*:	745f801f 	cbbhi	wzr, wzr, 6d8 <cbblo_3>
+.*:	745fbfff 	cbbhi	wzr, wzr, 6d8 <cbblo_3>
+
+.* <cbbls_0>:
+.*:	74608000 	cbbhs	w0, w0, 6e0 <cbbls_0>
+.*:	7460bfe0 	cbbhs	w0, w0, 6e0 <cbbls_0>
+
+.* <cbbls_1>:
+.*:	7460801f 	cbbhs	wzr, w0, 6e8 <cbbls_1>
+.*:	7460bfff 	cbbhs	wzr, w0, 6e8 <cbbls_1>
+
+.* <cbbls_2>:
+.*:	747f8000 	cbbhs	w0, wzr, 6f0 <cbbls_2>
+.*:	747fbfe0 	cbbhs	w0, wzr, 6f0 <cbbls_2>
+
+.* <cbbls_3>:
+.*:	747f801f 	cbbhs	wzr, wzr, 6f8 <cbbls_3>
+.*:	747fbfff 	cbbhs	wzr, wzr, 6f8 <cbbls_3>
+
+.* <cbhlt_0>:
+.*:	7400c000 	cbhgt	w0, w0, 700 <cbhlt_0>
+.*:	7400ffe0 	cbhgt	w0, w0, 700 <cbhlt_0>
+
+.* <cbhlt_1>:
+.*:	7400c01f 	cbhgt	wzr, w0, 708 <cbhlt_1>
+.*:	7400ffff 	cbhgt	wzr, w0, 708 <cbhlt_1>
+
+.* <cbhlt_2>:
+.*:	741fc000 	cbhgt	w0, wzr, 710 <cbhlt_2>
+.*:	741fffe0 	cbhgt	w0, wzr, 710 <cbhlt_2>
+
+.* <cbhlt_3>:
+.*:	741fc01f 	cbhgt	wzr, wzr, 718 <cbhlt_3>
+.*:	741fffff 	cbhgt	wzr, wzr, 718 <cbhlt_3>
+
+.* <cbhle_0>:
+.*:	7420c000 	cbhge	w0, w0, 720 <cbhle_0>
+.*:	7420ffe0 	cbhge	w0, w0, 720 <cbhle_0>
+
+.* <cbhle_1>:
+.*:	7420c01f 	cbhge	wzr, w0, 728 <cbhle_1>
+.*:	7420ffff 	cbhge	wzr, w0, 728 <cbhle_1>
+
+.* <cbhle_2>:
+.*:	743fc000 	cbhge	w0, wzr, 730 <cbhle_2>
+.*:	743fffe0 	cbhge	w0, wzr, 730 <cbhle_2>
+
+.* <cbhle_3>:
+.*:	743fc01f 	cbhge	wzr, wzr, 738 <cbhle_3>
+.*:	743fffff 	cbhge	wzr, wzr, 738 <cbhle_3>
+
+.* <cbhlo_0>:
+.*:	7440c000 	cbhhi	w0, w0, 740 <cbhlo_0>
+.*:	7440ffe0 	cbhhi	w0, w0, 740 <cbhlo_0>
+
+.* <cbhlo_1>:
+.*:	7440c01f 	cbhhi	wzr, w0, 748 <cbhlo_1>
+.*:	7440ffff 	cbhhi	wzr, w0, 748 <cbhlo_1>
+
+.* <cbhlo_2>:
+.*:	745fc000 	cbhhi	w0, wzr, 750 <cbhlo_2>
+.*:	745fffe0 	cbhhi	w0, wzr, 750 <cbhlo_2>
+
+.* <cbhlo_3>:
+.*:	745fc01f 	cbhhi	wzr, wzr, 758 <cbhlo_3>
+.*:	745fffff 	cbhhi	wzr, wzr, 758 <cbhlo_3>
+
+.* <cbhls_0>:
+.*:	7460c000 	cbhhs	w0, w0, 760 <cbhls_0>
+.*:	7460ffe0 	cbhhs	w0, w0, 760 <cbhls_0>
+
+.* <cbhls_1>:
+.*:	7460c01f 	cbhhs	wzr, w0, 768 <cbhls_1>
+.*:	7460ffff 	cbhhs	wzr, w0, 768 <cbhls_1>
+
+.* <cbhls_2>:
+.*:	747fc000 	cbhhs	w0, wzr, 770 <cbhls_2>
+.*:	747fffe0 	cbhhs	w0, wzr, 770 <cbhls_2>
+
+.* <cbhls_3>:
+.*:	747fc01f 	cbhhs	wzr, wzr, 778 <cbhls_3>
+.*:	747fffff 	cbhhs	wzr, wzr, 778 <cbhls_3>
diff --git a/gas/testsuite/gas/aarch64/cmpbr.s b/gas/testsuite/gas/aarch64/cmpbr.s
new file mode 100644
index 00000000000..ed6b1790762
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/cmpbr.s
@@ -0,0 +1,727 @@
+cbgt_0:
+	cbgt	w0, #0, cbgt_0
+	cbgt	w0, #0, cbgt_0
+cbgt_1:
+	cbgt	w0, #63, cbgt_1
+	cbgt	w0, #63, cbgt_1
+cbgt_2:
+	cbgt	wzr, #0, cbgt_2
+	cbgt	wzr, #0, cbgt_2
+cbgt_3:
+	cbgt	wzr, #63, cbgt_3
+	cbgt	wzr, #63, cbgt_3
+cbgt_4:
+	cbgt	x0, #0, cbgt_4
+	cbgt	x0, #0, cbgt_4
+cbgt_5:
+	cbgt	x0, #63, cbgt_5
+	cbgt	x0, #63, cbgt_5
+cbgt_6:
+	cbgt	xzr, #0, cbgt_6
+	cbgt	xzr, #0, cbgt_6
+cbgt_7:
+	cbgt	xzr, #63, cbgt_7
+	cbgt	xzr, #63, cbgt_7
+cblt_0:
+	cblt	w0, #0, cblt_0
+	cblt	w0, #0, cblt_0
+cblt_1:
+	cblt	w0, #63, cblt_1
+	cblt	w0, #63, cblt_1
+cblt_2:
+	cblt	wzr, #0, cblt_2
+	cblt	wzr, #0, cblt_2
+cblt_3:
+	cblt	wzr, #63, cblt_3
+	cblt	wzr, #63, cblt_3
+cblt_4:
+	cblt	x0, #0, cblt_4
+	cblt	x0, #0, cblt_4
+cblt_5:
+	cblt	x0, #63, cblt_5
+	cblt	x0, #63, cblt_5
+cblt_6:
+	cblt	xzr, #0, cblt_6
+	cblt	xzr, #0, cblt_6
+cblt_7:
+	cblt	xzr, #63, cblt_7
+	cblt	xzr, #63, cblt_7
+cbhi_0:
+	cbhi	w0, #0, cbhi_0
+	cbhi	w0, #0, cbhi_0
+cbhi_1:
+	cbhi	w0, #63, cbhi_1
+	cbhi	w0, #63, cbhi_1
+cbhi_2:
+	cbhi	wzr, #0, cbhi_2
+	cbhi	wzr, #0, cbhi_2
+cbhi_3:
+	cbhi	wzr, #63, cbhi_3
+	cbhi	wzr, #63, cbhi_3
+cbhi_4:
+	cbhi	x0, #0, cbhi_4
+	cbhi	x0, #0, cbhi_4
+cbhi_5:
+	cbhi	x0, #63, cbhi_5
+	cbhi	x0, #63, cbhi_5
+cbhi_6:
+	cbhi	xzr, #0, cbhi_6
+	cbhi	xzr, #0, cbhi_6
+cbhi_7:
+	cbhi	xzr, #63, cbhi_7
+	cbhi	xzr, #63, cbhi_7
+cblo_0:
+	cblo	w0, #0, cblo_0
+	cblo	w0, #0, cblo_0
+cblo_1:
+	cblo	w0, #63, cblo_1
+	cblo	w0, #63, cblo_1
+cblo_2:
+	cblo	wzr, #0, cblo_2
+	cblo	wzr, #0, cblo_2
+cblo_3:
+	cblo	wzr, #63, cblo_3
+	cblo	wzr, #63, cblo_3
+cblo_4:
+	cblo	x0, #0, cblo_4
+	cblo	x0, #0, cblo_4
+cblo_5:
+	cblo	x0, #63, cblo_5
+	cblo	x0, #63, cblo_5
+cblo_6:
+	cblo	xzr, #0, cblo_6
+	cblo	xzr, #0, cblo_6
+cblo_7:
+	cblo	xzr, #63, cblo_7
+	cblo	xzr, #63, cblo_7
+cbeq_0:
+	cbeq	w0, #0, cbeq_0
+	cbeq	w0, #0, cbeq_0
+cbeq_1:
+	cbeq	w0, #63, cbeq_1
+	cbeq	w0, #63, cbeq_1
+cbeq_2:
+	cbeq	wzr, #0, cbeq_2
+	cbeq	wzr, #0, cbeq_2
+cbeq_3:
+	cbeq	wzr, #63, cbeq_3
+	cbeq	wzr, #63, cbeq_3
+cbeq_4:
+	cbeq	x0, #0, cbeq_4
+	cbeq	x0, #0, cbeq_4
+cbeq_5:
+	cbeq	x0, #63, cbeq_5
+	cbeq	x0, #63, cbeq_5
+cbeq_6:
+	cbeq	xzr, #0, cbeq_6
+	cbeq	xzr, #0, cbeq_6
+cbeq_7:
+	cbeq	xzr, #63, cbeq_7
+	cbeq	xzr, #63, cbeq_7
+cbne_0:
+	cbne	w0, #0, cbne_0
+	cbne	w0, #0, cbne_0
+cbne_1:
+	cbne	w0, #63, cbne_1
+	cbne	w0, #63, cbne_1
+cbne_2:
+	cbne	wzr, #0, cbne_2
+	cbne	wzr, #0, cbne_2
+cbne_3:
+	cbne	wzr, #63, cbne_3
+	cbne	wzr, #63, cbne_3
+cbne_4:
+	cbne	x0, #0, cbne_4
+	cbne	x0, #0, cbne_4
+cbne_5:
+	cbne	x0, #63, cbne_5
+	cbne	x0, #63, cbne_5
+cbne_6:
+	cbne	xzr, #0, cbne_6
+	cbne	xzr, #0, cbne_6
+cbne_7:
+	cbne	xzr, #63, cbne_7
+	cbne	xzr, #63, cbne_7
+
+cbgt_8:
+	cbgt	w0, w0, cbgt_8
+	cbgt	w0, w0, cbgt_8
+cbgt_9:
+	cbgt	w0, wzr, cbgt_9
+	cbgt	w0, wzr, cbgt_9
+cbgt_10:
+	cbgt	wzr, w0, cbgt_10
+	cbgt	wzr, w0, cbgt_10
+cbgt_11:
+	cbgt	wzr, wzr, cbgt_11
+	cbgt	wzr, wzr, cbgt_11
+cbgt_12:
+	cbgt	x0, x0, cbgt_12
+	cbgt	x0, x0, cbgt_12
+cbgt_13:
+	cbgt	x0, xzr, cbgt_13
+	cbgt	x0, xzr, cbgt_13
+cbgt_14:
+	cbgt	xzr, x0, cbgt_14
+	cbgt	xzr, x0, cbgt_14
+cbgt_15:
+	cbgt	xzr, xzr, cbgt_15
+	cbgt	xzr, xzr, cbgt_15
+cbge_8:
+	cbge	w0, w0, cbge_8
+	cbge	w0, w0, cbge_8
+cbge_9:
+	cbge	w0, wzr, cbge_9
+	cbge	w0, wzr, cbge_9
+cbge_10:
+	cbge	wzr, w0, cbge_10
+	cbge	wzr, w0, cbge_10
+cbge_11:
+	cbge	wzr, wzr, cbge_11
+	cbge	wzr, wzr, cbge_11
+cbge_12:
+	cbge	x0, x0, cbge_12
+	cbge	x0, x0, cbge_12
+cbge_13:
+	cbge	x0, xzr, cbge_13
+	cbge	x0, xzr, cbge_13
+cbge_14:
+	cbge	xzr, x0, cbge_14
+	cbge	xzr, x0, cbge_14
+cbge_15:
+	cbge	xzr, xzr, cbge_15
+	cbge	xzr, xzr, cbge_15
+cbhi_8:
+	cbhi	w0, w0, cbhi_8
+	cbhi	w0, w0, cbhi_8
+cbhi_9:
+	cbhi	w0, wzr, cbhi_9
+	cbhi	w0, wzr, cbhi_9
+cbhi_10:
+	cbhi	wzr, w0, cbhi_10
+	cbhi	wzr, w0, cbhi_10
+cbhi_11:
+	cbhi	wzr, wzr, cbhi_11
+	cbhi	wzr, wzr, cbhi_11
+cbhi_12:
+	cbhi	x0, x0, cbhi_12
+	cbhi	x0, x0, cbhi_12
+cbhi_13:
+	cbhi	x0, xzr, cbhi_13
+	cbhi	x0, xzr, cbhi_13
+cbhi_14:
+	cbhi	xzr, x0, cbhi_14
+	cbhi	xzr, x0, cbhi_14
+cbhi_15:
+	cbhi	xzr, xzr, cbhi_15
+	cbhi	xzr, xzr, cbhi_15
+cbhs_8:
+	cbhs	w0, w0, cbhs_8
+	cbhs	w0, w0, cbhs_8
+cbhs_9:
+	cbhs	w0, wzr, cbhs_9
+	cbhs	w0, wzr, cbhs_9
+cbhs_10:
+	cbhs	wzr, w0, cbhs_10
+	cbhs	wzr, w0, cbhs_10
+cbhs_11:
+	cbhs	wzr, wzr, cbhs_11
+	cbhs	wzr, wzr, cbhs_11
+cbhs_12:
+	cbhs	x0, x0, cbhs_12
+	cbhs	x0, x0, cbhs_12
+cbhs_13:
+	cbhs	x0, xzr, cbhs_13
+	cbhs	x0, xzr, cbhs_13
+cbhs_14:
+	cbhs	xzr, x0, cbhs_14
+	cbhs	xzr, x0, cbhs_14
+cbhs_15:
+	cbhs	xzr, xzr, cbhs_15
+	cbhs	xzr, xzr, cbhs_15
+cbeq_8:
+	cbeq	w0, w0, cbeq_8
+	cbeq	w0, w0, cbeq_8
+cbeq_9:
+	cbeq	w0, wzr, cbeq_9
+	cbeq	w0, wzr, cbeq_9
+cbeq_10:
+	cbeq	wzr, w0, cbeq_10
+	cbeq	wzr, w0, cbeq_10
+cbeq_11:
+	cbeq	wzr, wzr, cbeq_11
+	cbeq	wzr, wzr, cbeq_11
+cbeq_12:
+	cbeq	x0, x0, cbeq_12
+	cbeq	x0, x0, cbeq_12
+cbeq_13:
+	cbeq	x0, xzr, cbeq_13
+	cbeq	x0, xzr, cbeq_13
+cbeq_14:
+	cbeq	xzr, x0, cbeq_14
+	cbeq	xzr, x0, cbeq_14
+cbeq_15:
+	cbeq	xzr, xzr, cbeq_15
+	cbeq	xzr, xzr, cbeq_15
+cbne_8:
+	cbne	w0, w0, cbne_8
+	cbne	w0, w0, cbne_8
+cbne_9:
+	cbne	w0, wzr, cbne_9
+	cbne	w0, wzr, cbne_9
+cbne_10:
+	cbne	wzr, w0, cbne_10
+	cbne	wzr, w0, cbne_10
+cbne_11:
+	cbne	wzr, wzr, cbne_11
+	cbne	wzr, wzr, cbne_11
+cbne_12:
+	cbne	x0, x0, cbne_12
+	cbne	x0, x0, cbne_12
+cbne_13:
+	cbne	x0, xzr, cbne_13
+	cbne	x0, xzr, cbne_13
+cbne_14:
+	cbne	xzr, x0, cbne_14
+	cbne	xzr, x0, cbne_14
+cbne_15:
+	cbne	xzr, xzr, cbne_15
+	cbne	xzr, xzr, cbne_15
+
+cbbgt_0:
+	cbbgt	w0, w0, cbbgt_0
+	cbbgt	w0, w0, cbbgt_0
+cbbgt_1:
+	cbbgt	w0, wzr, cbbgt_1
+	cbbgt	w0, wzr, cbbgt_1
+cbbgt_2:
+	cbbgt	wzr, w0, cbbgt_2
+	cbbgt	wzr, w0, cbbgt_2
+cbbgt_3:
+	cbbgt	wzr, wzr, cbbgt_3
+	cbbgt	wzr, wzr, cbbgt_3
+cbbge_0:
+	cbbge	w0, w0, cbbge_0
+	cbbge	w0, w0, cbbge_0
+cbbge_1:
+	cbbge	w0, wzr, cbbge_1
+	cbbge	w0, wzr, cbbge_1
+cbbge_2:
+	cbbge	wzr, w0, cbbge_2
+	cbbge	wzr, w0, cbbge_2
+cbbge_3:
+	cbbge	wzr, wzr, cbbge_3
+	cbbge	wzr, wzr, cbbge_3
+cbbhi_0:
+	cbbhi	w0, w0, cbbhi_0
+	cbbhi	w0, w0, cbbhi_0
+cbbhi_1:
+	cbbhi	w0, wzr, cbbhi_1
+	cbbhi	w0, wzr, cbbhi_1
+cbbhi_2:
+	cbbhi	wzr, w0, cbbhi_2
+	cbbhi	wzr, w0, cbbhi_2
+cbbhi_3:
+	cbbhi	wzr, wzr, cbbhi_3
+	cbbhi	wzr, wzr, cbbhi_3
+cbbhs_0:
+	cbbhs	w0, w0, cbbhs_0
+	cbbhs	w0, w0, cbbhs_0
+cbbhs_1:
+	cbbhs	w0, wzr, cbbhs_1
+	cbbhs	w0, wzr, cbbhs_1
+cbbhs_2:
+	cbbhs	wzr, w0, cbbhs_2
+	cbbhs	wzr, w0, cbbhs_2
+cbbhs_3:
+	cbbhs	wzr, wzr, cbbhs_3
+	cbbhs	wzr, wzr, cbbhs_3
+cbbeq_0:
+	cbbeq	w0, w0, cbbeq_0
+	cbbeq	w0, w0, cbbeq_0
+cbbeq_1:
+	cbbeq	w0, wzr, cbbeq_1
+	cbbeq	w0, wzr, cbbeq_1
+cbbeq_2:
+	cbbeq	wzr, w0, cbbeq_2
+	cbbeq	wzr, w0, cbbeq_2
+cbbeq_3:
+	cbbeq	wzr, wzr, cbbeq_3
+	cbbeq	wzr, wzr, cbbeq_3
+cbbne_0:
+	cbbne	w0, w0, cbbne_0
+	cbbne	w0, w0, cbbne_0
+cbbne_1:
+	cbbne	w0, wzr, cbbne_1
+	cbbne	w0, wzr, cbbne_1
+cbbne_2:
+	cbbne	wzr, w0, cbbne_2
+	cbbne	wzr, w0, cbbne_2
+cbbne_3:
+	cbbne	wzr, wzr, cbbne_3
+	cbbne	wzr, wzr, cbbne_3
+
+cbhgt_0:
+	cbhgt	w0, w0, cbhgt_0
+	cbhgt	w0, w0, cbhgt_0
+cbhgt_1:
+	cbhgt	w0, wzr, cbhgt_1
+	cbhgt	w0, wzr, cbhgt_1
+cbhgt_2:
+	cbhgt	wzr, w0, cbhgt_2
+	cbhgt	wzr, w0, cbhgt_2
+cbhgt_3:
+	cbhgt	wzr, wzr, cbhgt_3
+	cbhgt	wzr, wzr, cbhgt_3
+cbhge_0:
+	cbhge	w0, w0, cbhge_0
+	cbhge	w0, w0, cbhge_0
+cbhge_1:
+	cbhge	w0, wzr, cbhge_1
+	cbhge	w0, wzr, cbhge_1
+cbhge_2:
+	cbhge	wzr, w0, cbhge_2
+	cbhge	wzr, w0, cbhge_2
+cbhge_3:
+	cbhge	wzr, wzr, cbhge_3
+	cbhge	wzr, wzr, cbhge_3
+cbhhi_0:
+	cbhhi	w0, w0, cbhhi_0
+	cbhhi	w0, w0, cbhhi_0
+cbhhi_1:
+	cbhhi	w0, wzr, cbhhi_1
+	cbhhi	w0, wzr, cbhhi_1
+cbhhi_2:
+	cbhhi	wzr, w0, cbhhi_2
+	cbhhi	wzr, w0, cbhhi_2
+cbhhi_3:
+	cbhhi	wzr, wzr, cbhhi_3
+	cbhhi	wzr, wzr, cbhhi_3
+cbhhs_0:
+	cbhhs	w0, w0, cbhhs_0
+	cbhhs	w0, w0, cbhhs_0
+cbhhs_1:
+	cbhhs	w0, wzr, cbhhs_1
+	cbhhs	w0, wzr, cbhhs_1
+cbhhs_2:
+	cbhhs	wzr, w0, cbhhs_2
+	cbhhs	wzr, w0, cbhhs_2
+cbhhs_3:
+	cbhhs	wzr, wzr, cbhhs_3
+	cbhhs	wzr, wzr, cbhhs_3
+cbheq_0:
+	cbheq	w0, w0, cbheq_0
+	cbheq	w0, w0, cbheq_0
+cbheq_1:
+	cbheq	w0, wzr, cbheq_1
+	cbheq	w0, wzr, cbheq_1
+cbheq_2:
+	cbheq	wzr, w0, cbheq_2
+	cbheq	wzr, w0, cbheq_2
+cbheq_3:
+	cbheq	wzr, wzr, cbheq_3
+	cbheq	wzr, wzr, cbheq_3
+cbhne_0:
+	cbhne	w0, w0, cbhne_0
+	cbhne	w0, w0, cbhne_0
+cbhne_1:
+	cbhne	w0, wzr, cbhne_1
+	cbhne	w0, wzr, cbhne_1
+cbhne_2:
+	cbhne	wzr, w0, cbhne_2
+	cbhne	wzr, w0, cbhne_2
+cbhne_3:
+	cbhne	wzr, wzr, cbhne_3
+	cbhne	wzr, wzr, cbhne_3
+
+cbge_0:
+	cbge	w0, #1, cbge_0
+	cbge	w0, #1, cbge_0
+cbge_1:
+	cbge	w0, #64, cbge_1
+	cbge	w0, #64, cbge_1
+cbge_2:
+	cbge	wzr, #1, cbge_2
+	cbge	wzr, #1, cbge_2
+cbge_3:
+	cbge	wzr, #64, cbge_3
+	cbge	wzr, #64, cbge_3
+cbge_4:
+	cbge	x0, #1, cbge_4
+	cbge	x0, #1, cbge_4
+cbge_5:
+	cbge	x0, #64, cbge_5
+	cbge	x0, #64, cbge_5
+cbge_6:
+	cbge	xzr, #1, cbge_6
+	cbge	xzr, #1, cbge_6
+cbge_7:
+	cbge	xzr, #64, cbge_7
+	cbge	xzr, #64, cbge_7
+cble_0:
+	cble	w0, #-1, cble_0
+	cble	w0, #-1, cble_0
+cble_1:
+	cble	w0, #62, cble_1
+	cble	w0, #62, cble_1
+cble_2:
+	cble	wzr, #-1, cble_2
+	cble	wzr, #-1, cble_2
+cble_3:
+	cble	wzr, #62, cble_3
+	cble	wzr, #62, cble_3
+cble_4:
+	cble	x0, #-1, cble_4
+	cble	x0, #-1, cble_4
+cble_5:
+	cble	x0, #62, cble_5
+	cble	x0, #62, cble_5
+cble_6:
+	cble	xzr, #-1, cble_6
+	cble	xzr, #-1, cble_6
+cble_7:
+	cble	xzr, #62, cble_7
+	cble	xzr, #62, cble_7
+cbhs_0:
+	cbhs	w0, #1, cbhs_0
+	cbhs	w0, #1, cbhs_0
+cbhs_1:
+	cbhs	w0, #64, cbhs_1
+	cbhs	w0, #64, cbhs_1
+cbhs_2:
+	cbhs	wzr, #1, cbhs_2
+	cbhs	wzr, #1, cbhs_2
+cbhs_3:
+	cbhs	wzr, #64, cbhs_3
+	cbhs	wzr, #64, cbhs_3
+cbhs_4:
+	cbhs	x0, #1, cbhs_4
+	cbhs	x0, #1, cbhs_4
+cbhs_5:
+	cbhs	x0, #64, cbhs_5
+	cbhs	x0, #64, cbhs_5
+cbhs_6:
+	cbhs	xzr, #1, cbhs_6
+	cbhs	xzr, #1, cbhs_6
+cbhs_7:
+	cbhs	xzr, #64, cbhs_7
+	cbhs	xzr, #64, cbhs_7
+cbls_0:
+	cbls	w0, #-1, cbls_0
+	cbls	w0, #-1, cbls_0
+cbls_1:
+	cbls	w0, #62, cbls_1
+	cbls	w0, #62, cbls_1
+cbls_2:
+	cbls	wzr, #-1, cbls_2
+	cbls	wzr, #-1, cbls_2
+cbls_3:
+	cbls	wzr, #62, cbls_3
+	cbls	wzr, #62, cbls_3
+cbls_4:
+	cbls	x0, #-1, cbls_4
+	cbls	x0, #-1, cbls_4
+cbls_5:
+	cbls	x0, #62, cbls_5
+	cbls	x0, #62, cbls_5
+cbls_6:
+	cbls	xzr, #-1, cbls_6
+	cbls	xzr, #-1, cbls_6
+cbls_7:
+	cbls	xzr, #62, cbls_7
+	cbls	xzr, #62, cbls_7
+
+cblt_8:
+	cblt	w0, w0, cblt_8
+	cblt	w0, w0, cblt_8
+cblt_9:
+	cblt	w0, wzr, cblt_9
+	cblt	w0, wzr, cblt_9
+cblt_10:
+	cblt	wzr, w0, cblt_10
+	cblt	wzr, w0, cblt_10
+cblt_11:
+	cblt	wzr, wzr, cblt_11
+	cblt	wzr, wzr, cblt_11
+cblt_12:
+	cblt	x0, x0, cblt_12
+	cblt	x0, x0, cblt_12
+cblt_13:
+	cblt	x0, xzr, cblt_13
+	cblt	x0, xzr, cblt_13
+cblt_14:
+	cblt	xzr, x0, cblt_14
+	cblt	xzr, x0, cblt_14
+cblt_15:
+	cblt	xzr, xzr, cblt_15
+	cblt	xzr, xzr, cblt_15
+cble_8:
+	cble	w0, w0, cble_8
+	cble	w0, w0, cble_8
+cble_9:
+	cble	w0, wzr, cble_9
+	cble	w0, wzr, cble_9
+cble_10:
+	cble	wzr, w0, cble_10
+	cble	wzr, w0, cble_10
+cble_11:
+	cble	wzr, wzr, cble_11
+	cble	wzr, wzr, cble_11
+cble_12:
+	cble	x0, x0, cble_12
+	cble	x0, x0, cble_12
+cble_13:
+	cble	x0, xzr, cble_13
+	cble	x0, xzr, cble_13
+cble_14:
+	cble	xzr, x0, cble_14
+	cble	xzr, x0, cble_14
+cble_15:
+	cble	xzr, xzr, cble_15
+	cble	xzr, xzr, cble_15
+cblo_8:
+	cblo	w0, w0, cblo_8
+	cblo	w0, w0, cblo_8
+cblo_9:
+	cblo	w0, wzr, cblo_9
+	cblo	w0, wzr, cblo_9
+cblo_10:
+	cblo	wzr, w0, cblo_10
+	cblo	wzr, w0, cblo_10
+cblo_11:
+	cblo	wzr, wzr, cblo_11
+	cblo	wzr, wzr, cblo_11
+cblo_12:
+	cblo	x0, x0, cblo_12
+	cblo	x0, x0, cblo_12
+cblo_13:
+	cblo	x0, xzr, cblo_13
+	cblo	x0, xzr, cblo_13
+cblo_14:
+	cblo	xzr, x0, cblo_14
+	cblo	xzr, x0, cblo_14
+cblo_15:
+	cblo	xzr, xzr, cblo_15
+	cblo	xzr, xzr, cblo_15
+cbls_8:
+	cbls	w0, w0, cbls_8
+	cbls	w0, w0, cbls_8
+cbls_9:
+	cbls	w0, wzr, cbls_9
+	cbls	w0, wzr, cbls_9
+cbls_10:
+	cbls	wzr, w0, cbls_10
+	cbls	wzr, w0, cbls_10
+cbls_11:
+	cbls	wzr, wzr, cbls_11
+	cbls	wzr, wzr, cbls_11
+cbls_12:
+	cbls	x0, x0, cbls_12
+	cbls	x0, x0, cbls_12
+cbls_13:
+	cbls	x0, xzr, cbls_13
+	cbls	x0, xzr, cbls_13
+cbls_14:
+	cbls	xzr, x0, cbls_14
+	cbls	xzr, x0, cbls_14
+cbls_15:
+	cbls	xzr, xzr, cbls_15
+	cbls	xzr, xzr, cbls_15
+
+cbblt_0:
+	cbblt	w0, w0, cbblt_0
+	cbblt	w0, w0, cbblt_0
+cbblt_1:
+	cbblt	w0, wzr, cbblt_1
+	cbblt	w0, wzr, cbblt_1
+cbblt_2:
+	cbblt	wzr, w0, cbblt_2
+	cbblt	wzr, w0, cbblt_2
+cbblt_3:
+	cbblt	wzr, wzr, cbblt_3
+	cbblt	wzr, wzr, cbblt_3
+cbble_0:
+	cbble	w0, w0, cbble_0
+	cbble	w0, w0, cbble_0
+cbble_1:
+	cbble	w0, wzr, cbble_1
+	cbble	w0, wzr, cbble_1
+cbble_2:
+	cbble	wzr, w0, cbble_2
+	cbble	wzr, w0, cbble_2
+cbble_3:
+	cbble	wzr, wzr, cbble_3
+	cbble	wzr, wzr, cbble_3
+cbblo_0:
+	cbblo	w0, w0, cbblo_0
+	cbblo	w0, w0, cbblo_0
+cbblo_1:
+	cbblo	w0, wzr, cbblo_1
+	cbblo	w0, wzr, cbblo_1
+cbblo_2:
+	cbblo	wzr, w0, cbblo_2
+	cbblo	wzr, w0, cbblo_2
+cbblo_3:
+	cbblo	wzr, wzr, cbblo_3
+	cbblo	wzr, wzr, cbblo_3
+cbbls_0:
+	cbbls	w0, w0, cbbls_0
+	cbbls	w0, w0, cbbls_0
+cbbls_1:
+	cbbls	w0, wzr, cbbls_1
+	cbbls	w0, wzr, cbbls_1
+cbbls_2:
+	cbbls	wzr, w0, cbbls_2
+	cbbls	wzr, w0, cbbls_2
+cbbls_3:
+	cbbls	wzr, wzr, cbbls_3
+	cbbls	wzr, wzr, cbbls_3
+
+cbhlt_0:
+	cbhlt	w0, w0, cbhlt_0
+	cbhlt	w0, w0, cbhlt_0
+cbhlt_1:
+	cbhlt	w0, wzr, cbhlt_1
+	cbhlt	w0, wzr, cbhlt_1
+cbhlt_2:
+	cbhlt	wzr, w0, cbhlt_2
+	cbhlt	wzr, w0, cbhlt_2
+cbhlt_3:
+	cbhlt	wzr, wzr, cbhlt_3
+	cbhlt	wzr, wzr, cbhlt_3
+cbhle_0:
+	cbhle	w0, w0, cbhle_0
+	cbhle	w0, w0, cbhle_0
+cbhle_1:
+	cbhle	w0, wzr, cbhle_1
+	cbhle	w0, wzr, cbhle_1
+cbhle_2:
+	cbhle	wzr, w0, cbhle_2
+	cbhle	wzr, w0, cbhle_2
+cbhle_3:
+	cbhle	wzr, wzr, cbhle_3
+	cbhle	wzr, wzr, cbhle_3
+cbhlo_0:
+	cbhlo	w0, w0, cbhlo_0
+	cbhlo	w0, w0, cbhlo_0
+cbhlo_1:
+	cbhlo	w0, wzr, cbhlo_1
+	cbhlo	w0, wzr, cbhlo_1
+cbhlo_2:
+	cbhlo	wzr, w0, cbhlo_2
+	cbhlo	wzr, w0, cbhlo_2
+cbhlo_3:
+	cbhlo	wzr, wzr, cbhlo_3
+	cbhlo	wzr, wzr, cbhlo_3
+cbhls_0:
+	cbhls	w0, w0, cbhls_0
+	cbhls	w0, w0, cbhls_0
+cbhls_1:
+	cbhls	w0, wzr, cbhls_1
+	cbhls	w0, wzr, cbhls_1
+cbhls_2:
+	cbhls	wzr, w0, cbhls_2
+	cbhls	wzr, w0, cbhls_2
+cbhls_3:
+	cbhls	wzr, wzr, cbhls_3
+	cbhls	wzr, wzr, cbhls_3
diff --git a/include/opcode/aarch64.h b/include/opcode/aarch64.h
index dfe3f05820a..0b124de59d7 100644
--- a/include/opcode/aarch64.h
+++ b/include/opcode/aarch64.h
@@ -135,6 +135,8 @@ enum aarch64_feature_bit {
   AARCH64_FEATURE_ID_PFR2,
   /* SSBS mechanism enabled.  */
   AARCH64_FEATURE_SSBS,
+  /* Compare and branch instructions.  */
+  AARCH64_FEATURE_CMPBR,
   /* Memory Tagging Extension.  */
   AARCH64_FEATURE_MEMTAG,
   /* Transactional Memory Extension.  */
@@ -618,6 +620,8 @@ enum aarch64_opnd
   AARCH64_OPND_WIDTH,	/* Immediate #<width> in e.g. BFI.  */
   AARCH64_OPND_IMM,	/* Immediate.  */
   AARCH64_OPND_IMM_2,	/* Immediate.  */
+  AARCH64_OPND_IMMP1_2,	/* Immediate plus 1.  */
+  AARCH64_OPND_IMMS1_2,	/* Immediate minus 1.  */
   AARCH64_OPND_UIMM3_OP1,/* Unsigned 3-bit immediate in the op1 field.  */
   AARCH64_OPND_UIMM3_OP2,/* Unsigned 3-bit immediate in the op2 field.  */
   AARCH64_OPND_UIMM4,	/* Unsigned 4-bit immediate in the CRm field.  */
@@ -645,6 +649,7 @@ enum aarch64_opnd
   AARCH64_OPND_COND1,	/* Same as the above, but excluding AL and NV.  */
 
   AARCH64_OPND_ADDR_ADRP,	/* Memory address for ADRP */
+  AARCH64_OPND_ADDR_PCREL9,	/* 9-bit PC-relative address for e.g. CB<cc>.  */
   AARCH64_OPND_ADDR_PCREL14,	/* 14-bit PC-relative address for e.g. TBZ.  */
   AARCH64_OPND_ADDR_PCREL19,	/* 19-bit PC-relative address for e.g. LDR.  */
   AARCH64_OPND_ADDR_PCREL21,	/* 21-bit PC-relative address for e.g. ADR.  */
diff --git a/opcodes/aarch64-opc.c b/opcodes/aarch64-opc.c
index 4f0c71696fa..b93c7069ef6 100644
--- a/opcodes/aarch64-opc.c
+++ b/opcodes/aarch64-opc.c
@@ -381,6 +381,7 @@ const aarch64_field fields[] =
     { 15,  7 },	/* imm7: in load/store pair pre/post index instructions.  */
     { 13,  8 },	/* imm8: in floating-point scalar move immediate inst.  */
     { 12,  9 },	/* imm9: in load/store pre/post index instructions.  */
+    {  5,  9 },	/* imm9_5: in CB<cc> (immediate).  */
     { 10, 12 },	/* imm12: in ld/st unsigned imm or add/sub shifted inst.  */
     {  5, 14 },	/* imm14: in test bit and branch instructions.  */
     {  0, 16 },	/* imm16_0: in udf instruction. */
@@ -2417,6 +2418,7 @@ operand_general_constraint_met_p (const aarch64_opnd_info *opnds, int idx,
 	    }
 	  break;
 
+	case AARCH64_OPND_ADDR_PCREL9:
 	case AARCH64_OPND_ADDR_PCREL14:
 	case AARCH64_OPND_ADDR_PCREL19:
 	case AARCH64_OPND_ADDR_PCREL21:
@@ -4781,6 +4783,7 @@ aarch64_print_operand (char *buf, size_t size, bfd_vma pc,
       snprintf (buf, size, "%s", style_addr (styler, "#0x%" PRIx64 , addr));
       break;
 
+    case AARCH64_OPND_ADDR_PCREL9:
     case AARCH64_OPND_ADDR_PCREL14:
     case AARCH64_OPND_ADDR_PCREL19:
     case AARCH64_OPND_ADDR_PCREL21:
diff --git a/opcodes/aarch64-opc.h b/opcodes/aarch64-opc.h
index 9ab9bdf5123..3086f0285d8 100644
--- a/opcodes/aarch64-opc.h
+++ b/opcodes/aarch64-opc.h
@@ -185,6 +185,7 @@ enum aarch64_field_kind
   FLD_imm7,
   FLD_imm8,
   FLD_imm9,
+  FLD_imm9_5,
   FLD_imm12,
   FLD_imm14,
   FLD_imm16_0,
diff --git a/opcodes/aarch64-tbl.h b/opcodes/aarch64-tbl.h
index 8b64eb07067..4f22f3491e5 100644
--- a/opcodes/aarch64-tbl.h
+++ b/opcodes/aarch64-tbl.h
@@ -136,6 +136,19 @@
   QLF2(X,NIL),			\
 }
 
+/* e.g. CBBGT <Wt>, <Wm>, <label>.  */
+#define QL_W2NIL		\
+{				\
+  QLF3(W,W,NIL),		\
+}
+
+/* e.g. CBGT <Wt>, #<imm6>, <label>.  */
+#define QL_R_IMM_NIL		\
+{				\
+  QLF3(W,imm_0_63,NIL),		\
+  QLF3(X,imm_0_63,NIL),		\
+}
+
 /* e.g. LDR <Dt>, <label>.  */
 #define QL_FP_PCREL		\
 {				\
@@ -2737,6 +2750,8 @@ static const aarch64_feature_set aarch64_feature_predres =
   AARCH64_FEATURE (PREDRES);
 static const aarch64_feature_set aarch64_feature_predres2 =
   AARCH64_FEATURES (2, PREDRES, PREDRES2);
+static const aarch64_feature_set aarch64_feature_cmpbr =
+  AARCH64_FEATURE (CMPBR);
 static const aarch64_feature_set aarch64_feature_memtag =
   AARCH64_FEATURE (MEMTAG);
 static const aarch64_feature_set aarch64_feature_bfloat16 =
@@ -2897,6 +2912,7 @@ static const aarch64_feature_set aarch64_feature_sve2p1_sme2p1 =
 #define SB		&aarch64_feature_sb
 #define PREDRES		&aarch64_feature_predres
 #define PREDRES2	&aarch64_feature_predres2
+#define CMPBR		&aarch64_feature_cmpbr
 #define MEMTAG		&aarch64_feature_memtag
 #define TME		&aarch64_feature_tme
 #define SVE2		&aarch64_feature_sve2
@@ -3022,6 +3038,8 @@ static const aarch64_feature_set aarch64_feature_sve2p1_sme2p1 =
   { NAME, OPCODE, MASK, CLASS, 0, SB, OPS, QUALS, FLAGS, 0, 0, NULL }
 #define PREDRES_INSN(NAME,OPCODE,MASK,CLASS,OPS,QUALS,FLAGS) \
   { NAME, OPCODE, MASK, CLASS, 0, PREDRES, OPS, QUALS, FLAGS, 0, 0, NULL }
+#define CMPBR_INSN(NAME,OPCODE,MASK,CLASS,OPS,QUALS,FLAGS) \
+  { NAME, OPCODE, MASK, CLASS, 0, CMPBR, OPS, QUALS, FLAGS, 0, 0, NULL }
 #define MEMTAG_INSN(NAME,OPCODE,MASK,CLASS,OPS,QUALS,FLAGS) \
   { NAME, OPCODE, MASK, CLASS, 0, MEMTAG, OPS, QUALS, FLAGS, 0, 0, NULL }
 #define _TME_INSN(NAME,OPCODE,MASK,CLASS,OP,OPS,QUALS,FLAGS) \
@@ -3965,6 +3983,50 @@ const struct aarch64_opcode aarch64_opcode_table[] =
   CORE_INSN ("cbnz", 0x35000000, 0x7f000000, compbranch, 0, OP2 (Rt, ADDR_PCREL19), QL_R_PCREL, F_SF),
   /* Conditional branch (immediate).  */
   CORE_INSN ("b.c", 0x54000000, 0xff000010, condbranch, 0, OP1 (ADDR_PCREL19), QL_PCREL_NIL, F_COND),
+  /* Compare registers and branch. */
+  CMPBR_INSN ("cbgt", 0x74000000, 0x7fe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_R2NIL, F_SF | F_HAS_ALIAS),
+  CMPBR_INSN ("cblt", 0x74000000, 0x7fe0c000, compbranch, OP3 (Rm, Rt, ADDR_PCREL9), QL_R2NIL, F_SF | F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbge", 0x74200000, 0x7fe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_R2NIL, F_SF | F_HAS_ALIAS),
+  CMPBR_INSN ("cble", 0x74200000, 0x7fe0c000, compbranch, OP3 (Rm, Rt, ADDR_PCREL9), QL_R2NIL, F_SF | F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbhi", 0x74400000, 0x7fe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_R2NIL, F_SF | F_HAS_ALIAS),
+  CMPBR_INSN ("cblo", 0x74400000, 0x7fe0c000, compbranch, OP3 (Rm, Rt, ADDR_PCREL9), QL_R2NIL, F_SF | F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbhs", 0x74600000, 0x7fe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_R2NIL, F_SF | F_HAS_ALIAS),
+  CMPBR_INSN ("cbls", 0x74600000, 0x7fe0c000, compbranch, OP3 (Rm, Rt, ADDR_PCREL9), QL_R2NIL, F_SF | F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbeq", 0x74c00000, 0x7fe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_R2NIL, F_SF),
+  CMPBR_INSN ("cbne", 0x74e00000, 0x7fe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_R2NIL, F_SF),
+  /* Compare register with immediate and branch.  */
+  CMPBR_INSN ("cbgt", 0x75000000, 0x7fe04000, compbranch, OP3 (Rt, IMM_2, ADDR_PCREL9), QL_R_IMM_NIL, F_SF | F_HAS_ALIAS),
+  CMPBR_INSN ("cbge", 0x75000000, 0x7fe04000, compbranch, OP3 (Rt, IMMP1_2, ADDR_PCREL9), QL_R_IMM_NIL, F_SF | F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cblt", 0x75200000, 0x7fe04000, compbranch, OP3 (Rt, IMM_2, ADDR_PCREL9), QL_R_IMM_NIL, F_SF | F_HAS_ALIAS),
+  CMPBR_INSN ("cble", 0x75200000, 0x7fe04000, compbranch, OP3 (Rt, IMMS1_2, ADDR_PCREL9), QL_R_IMM_NIL, F_SF | F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbhi", 0x75400000, 0x7fe04000, compbranch, OP3 (Rt, IMM_2, ADDR_PCREL9), QL_R_IMM_NIL, F_SF | F_HAS_ALIAS),
+  CMPBR_INSN ("cbhs", 0x75400000, 0x7fe04000, compbranch, OP3 (Rt, IMMP1_2, ADDR_PCREL9), QL_R_IMM_NIL, F_SF | F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cblo", 0x75600000, 0x7fe04000, compbranch, OP3 (Rt, IMM_2, ADDR_PCREL9), QL_R_IMM_NIL, F_SF | F_HAS_ALIAS),
+  CMPBR_INSN ("cbls", 0x75600000, 0x7fe04000, compbranch, OP3 (Rt, IMMS1_2, ADDR_PCREL9), QL_R_IMM_NIL, F_SF | F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbeq", 0x75c00000, 0x7fe04000, compbranch, OP3 (Rt, IMM_2, ADDR_PCREL9), QL_R_IMM_NIL, F_SF),
+  CMPBR_INSN ("cbne", 0x75e00000, 0x7fe04000, compbranch, OP3 (Rt, IMM_2, ADDR_PCREL9), QL_R_IMM_NIL, F_SF),
+  /* Compare bytes and branch.  */
+  CMPBR_INSN ("cbbgt", 0x74008000, 0xffe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_W2NIL, F_HAS_ALIAS),
+  CMPBR_INSN ("cbblt", 0x74008000, 0xffe0c000, compbranch, OP3 (Rm, Rt, ADDR_PCREL9), QL_W2NIL, F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbbge", 0x74208000, 0xffe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_W2NIL, F_HAS_ALIAS),
+  CMPBR_INSN ("cbble", 0x74208000, 0xffe0c000, compbranch, OP3 (Rm, Rt, ADDR_PCREL9), QL_W2NIL, F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbbhi", 0x74408000, 0xffe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_W2NIL, F_HAS_ALIAS),
+  CMPBR_INSN ("cbblo", 0x74408000, 0xffe0c000, compbranch, OP3 (Rm, Rt, ADDR_PCREL9), QL_W2NIL, F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbbhs", 0x74608000, 0xffe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_W2NIL, F_HAS_ALIAS),
+  CMPBR_INSN ("cbbls", 0x74608000, 0xffe0c000, compbranch, OP3 (Rm, Rt, ADDR_PCREL9), QL_W2NIL, F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbbeq", 0x74c08000, 0xffe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_W2NIL, 0),
+  CMPBR_INSN ("cbbne", 0x74e08000, 0xffe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_W2NIL, 0),
+  /* Compare halfwords and branch.  */
+  CMPBR_INSN ("cbhgt", 0x7400c000, 0xffe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_W2NIL, F_HAS_ALIAS),
+  CMPBR_INSN ("cbhlt", 0x7400c000, 0xffe0c000, compbranch, OP3 (Rm, Rt, ADDR_PCREL9), QL_W2NIL, F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbhge", 0x7420c000, 0xffe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_W2NIL, F_HAS_ALIAS),
+  CMPBR_INSN ("cbhle", 0x7420c000, 0xffe0c000, compbranch, OP3 (Rm, Rt, ADDR_PCREL9), QL_W2NIL, F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbhhi", 0x7440c000, 0xffe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_W2NIL, F_HAS_ALIAS),
+  CMPBR_INSN ("cbhlo", 0x7440c000, 0xffe0c000, compbranch, OP3 (Rm, Rt, ADDR_PCREL9), QL_W2NIL, F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbhhs", 0x7460c000, 0xffe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_W2NIL, F_HAS_ALIAS),
+  CMPBR_INSN ("cbhls", 0x7460c000, 0xffe0c000, compbranch, OP3 (Rm, Rt, ADDR_PCREL9), QL_W2NIL, F_ALIAS | F_PSEUDO),
+  CMPBR_INSN ("cbheq", 0x74c0c000, 0xffe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_W2NIL, 0),
+  CMPBR_INSN ("cbhne", 0x74e0c000, 0xffe0c000, compbranch, OP3 (Rt, Rm, ADDR_PCREL9), QL_W2NIL, 0),
   /* Conditional compare (immediate).  */
   CORE_INSN ("ccmn", 0x3a400800, 0x7fe00c10, condcmp_imm, 0, OP4 (Rn, CCMP_IMM, NZCV, COND), QL_CCMP_IMM, F_SF),
   CORE_INSN ("ccmp", 0x7a400800, 0x7fe00c10, condcmp_imm, 0, OP4 (Rn, CCMP_IMM, NZCV, COND), QL_CCMP_IMM, F_SF),
@@ -7126,6 +7188,8 @@ const struct aarch64_opcode aarch64_opcode_table[] =
       "the width of the bit-field")					\
     Y(IMMEDIATE, imm, "IMM", 0, F(FLD_imm6_10), "an immediate")         \
     Y(IMMEDIATE, imm, "IMM_2", 0, F(FLD_imm6_15), "an immediate")       \
+    Y(IMMEDIATE, imm, "IMMP1_2", 0, F(FLD_imm6_15), "an immediate plus 1")       \
+    Y(IMMEDIATE, imm, "IMMS1_2", 0, F(FLD_imm6_15), "an immediate minus 1")       \
     Y(IMMEDIATE, imm, "UIMM3_OP1", 0, F(FLD_op1),			\
       "a 3-bit unsigned immediate")					\
     Y(IMMEDIATE, imm, "UIMM3_OP2", 0, F(FLD_op2),			\
@@ -7170,6 +7234,8 @@ const struct aarch64_opcode aarch64_opcode_table[] =
       "one of the standard conditions, excluding AL and NV.")		\
     X(ADDRESS, 0, ext_imm, "ADDR_ADRP", OPD_F_SEXT, F(FLD_immhi, FLD_immlo),\
       "21-bit PC-relative address of a 4KB page")			\
+    Y(ADDRESS, imm, "ADDR_PCREL9", OPD_F_SEXT | OPD_F_SHIFT_BY_2,	\
+      F(FLD_imm9_5), "9-bit PC-relative address")			\
     Y(ADDRESS, imm, "ADDR_PCREL14", OPD_F_SEXT | OPD_F_SHIFT_BY_2,	\
       F(FLD_imm14), "14-bit PC-relative address")			\
     Y(ADDRESS, imm, "ADDR_PCREL19", OPD_F_SEXT | OPD_F_SHIFT_BY_2,	\
-- 
2.45.2



More information about the Binutils mailing list