supported by the instruction, and to set inst.reloc.type.  */
 
 static bfd_boolean
-parse_address_main (char **str, aarch64_opnd_info *operand, int reloc,
-                   int accept_reg_post_index)
+parse_address_main (char **str, aarch64_opnd_info *operand)
 {
   char *p = *str;
   const reg_entry *reg;
 
       /* #:<reloc_op>:<symbol>  */
       skip_past_char (&p, '#');
-      if (reloc && skip_past_char (&p, ':'))
+      if (skip_past_char (&p, ':'))
        {
          bfd_reloc_code_real_type ty;
          struct reloc_table_entry *entry;
        {
          /* [Xn,#:<reloc_op>:<symbol>  */
          skip_past_char (&p, '#');
-         if (reloc && skip_past_char (&p, ':'))
+         if (skip_past_char (&p, ':'))
            {
              struct reloc_table_entry *entry;
 
          return FALSE;
        }
 
-      if (accept_reg_post_index
-         && (reg = aarch64_reg_parse_32_64 (&p, &offset_qualifier)))
+      reg = aarch64_reg_parse_32_64 (&p, &offset_qualifier);
+      if (reg)
        {
          /* [Xn],Xm */
          if (!aarch64_check_reg_type (reg, REG_TYPE_R_64))
   return TRUE;
 }
 
-/* Return TRUE on success; otherwise return FALSE.  */
-static bfd_boolean
-parse_address (char **str, aarch64_opnd_info *operand,
-              int accept_reg_post_index)
-{
-  return parse_address_main (str, operand, 0, accept_reg_post_index);
-}
-
-/* Return TRUE on success; otherwise return FALSE.  */
+/* Parse a base AArch64 address (as opposed to an SVE one).  Return TRUE
+   on success.  */
 static bfd_boolean
-parse_address_reloc (char **str, aarch64_opnd_info *operand)
+parse_address (char **str, aarch64_opnd_info *operand)
 {
-  return parse_address_main (str, operand, 1, 0);
+  return parse_address_main (str, operand);
 }
 
 /* Parse an operand for a MOVZ, MOVN or MOVK instruction.
        case AARCH64_OPND_ADDR_PCREL19:
        case AARCH64_OPND_ADDR_PCREL21:
        case AARCH64_OPND_ADDR_PCREL26:
-         po_misc_or_fail (parse_address_reloc (&str, info));
+         po_misc_or_fail (parse_address (&str, info));
          if (!info->addr.pcrel)
            {
              set_syntax_error (_("invalid pc-relative address"));
            char *start = str;
            /* First use the normal address-parsing routines, to get
               the usual syntax errors.  */
-           po_misc_or_fail (parse_address (&str, info, 0));
+           po_misc_or_fail (parse_address (&str, info));
            if (info->addr.pcrel || info->addr.offset.is_reg
                || !info->addr.preind || info->addr.postind
                || info->addr.writeback)
 
        case AARCH64_OPND_ADDR_REGOFF:
          /* [<Xn|SP>, <R><m>{, <extend> {<amount>}}]  */
-         po_misc_or_fail (parse_address (&str, info, 0));
+         po_misc_or_fail (parse_address (&str, info));
          if (info->addr.pcrel || !info->addr.offset.is_reg
              || !info->addr.preind || info->addr.postind
              || info->addr.writeback)
          break;
 
        case AARCH64_OPND_ADDR_SIMM7:
-         po_misc_or_fail (parse_address (&str, info, 0));
+         po_misc_or_fail (parse_address (&str, info));
          if (info->addr.pcrel || info->addr.offset.is_reg
              || (!info->addr.preind && !info->addr.postind))
            {
              set_syntax_error (_("invalid addressing mode"));
              goto failure;
            }
+         if (inst.reloc.type != BFD_RELOC_UNUSED)
+           {
+             set_syntax_error (_("relocation not allowed"));
+             goto failure;
+           }
          assign_imm_if_const_or_fixup_later (&inst.reloc, info,
                                              /* addr_off_p */ 1,
                                              /* need_libopcodes_p */ 1,
 
        case AARCH64_OPND_ADDR_SIMM9:
        case AARCH64_OPND_ADDR_SIMM9_2:
-         po_misc_or_fail (parse_address_reloc (&str, info));
+         po_misc_or_fail (parse_address (&str, info));
          if (info->addr.pcrel || info->addr.offset.is_reg
              || (!info->addr.preind && !info->addr.postind)
              || (operands[i] == AARCH64_OPND_ADDR_SIMM9_2
          break;
 
        case AARCH64_OPND_ADDR_UIMM12:
-         po_misc_or_fail (parse_address_reloc (&str, info));
+         po_misc_or_fail (parse_address (&str, info));
          if (info->addr.pcrel || info->addr.offset.is_reg
              || !info->addr.preind || info->addr.writeback)
            {
 
        case AARCH64_OPND_SIMD_ADDR_POST:
          /* [<Xn|SP>], <Xm|#<amount>>  */
-         po_misc_or_fail (parse_address (&str, info, 1));
+         po_misc_or_fail (parse_address (&str, info));
          if (!info->addr.postind || !info->addr.writeback)
            {
              set_syntax_error (_("invalid addressing mode"));
 
 [^:]*:264: Error: invalid floating-point constant at operand 2 -- `fmov s0,-2'
 [^:]*:266: Error: integer 64-bit register expected at operand 2 -- `st2 {v0.4s,v1.4s},\[sp\],xzr'
 [^:]*:267: Error: integer or zero register expected at operand 2 -- `str x1,\[x2,sp\]'
+[^:]*:270: Error: relocation not allowed at operand 3 -- `ldnp x1,x2,\[x3,#:lo12:foo\]'
+[^:]*:271: Error: invalid addressing mode at operand 2 -- `ld1 {v0\.4s},\[x3,#:lo12:foo\]'
+[^:]*:272: Error: the optional immediate offset can only be 0 at operand 2 -- `stuminl x0,\[x3,#:lo12:foo\]'
+[^:]*:273: Error: relocation not allowed at operand 2 -- `prfum pldl1keep,\[x3,#:lo12:foo\]'
+[^:]*:275: Error: invalid addressing mode at operand 2 -- `ldr x0,\[x3\],x4'
+[^:]*:276: Error: invalid addressing mode at operand 3 -- `ldnp x1,x2,\[x3\],x4'
+[^:]*:278: Error: invalid addressing mode at operand 2 -- `stuminl x0,\[x3\],x4'
+[^:]*:279: Error: invalid addressing mode at operand 2 -- `prfum pldl1keep,\[x3\],x4'