master
   1.{
   2    // C6.2.1 ADC
   3    .{
   4        .pattern = "ADC <Wd>, <Wn>, <Wm>",
   5        .symbols = .{
   6            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
   7            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
   8            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
   9        },
  10        .encode = .{ .adc, .Wd, .Wn, .Wm },
  11    },
  12    .{
  13        .pattern = "ADC <Xd>, <Xn>, <Xm>",
  14        .symbols = .{
  15            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
  16            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
  17            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
  18        },
  19        .encode = .{ .adc, .Xd, .Xn, .Xm },
  20    },
  21    // C6.2.2 ADCS
  22    .{
  23        .pattern = "ADCS <Wd>, <Wn>, <Wm>",
  24        .symbols = .{
  25            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
  26            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
  27            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
  28        },
  29        .encode = .{ .adcs, .Wd, .Wn, .Wm },
  30    },
  31    .{
  32        .pattern = "ADCS <Xd>, <Xn>, <Xm>",
  33        .symbols = .{
  34            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
  35            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
  36            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
  37        },
  38        .encode = .{ .adcs, .Xd, .Xn, .Xm },
  39    },
  40    // C6.2.3 ADD (extended register)
  41    .{
  42        .pattern = "ADD <Wd|WSP>, <Wn|WSP>, <Wm>",
  43        .symbols = .{
  44            .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
  45            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
  46            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
  47        },
  48        .encode = .{ .add, .Wd, .Wn, .{ .register = .Wm } },
  49    },
  50    .{
  51        .pattern = "ADD <Wd|WSP>, <Wn|WSP>, <Wm>, <extend>",
  52        .symbols = .{
  53            .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
  54            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
  55            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
  56            .extend = .{ .extend = .{} },
  57        },
  58        .encode = .{ .add, .Wd, .Wn, .{ .extended_register_explicit = .{
  59            .register = .Wm,
  60            .option = .extend,
  61            .amount = 0,
  62        } } },
  63    },
  64    .{
  65        .pattern = "ADD <Wd|WSP>, <Wn|WSP>, <Wm>, <extend> #<amount>",
  66        .symbols = .{
  67            .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
  68            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
  69            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
  70            .extend = .{ .extend = .{} },
  71            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
  72        },
  73        .encode = .{ .add, .Wd, .Wn, .{ .extended_register_explicit = .{
  74            .register = .Wm,
  75            .option = .extend,
  76            .amount = .amount,
  77        } } },
  78    },
  79    .{
  80        .pattern = "ADD <Xd|SP>, <Xn|SP>, <Xm>",
  81        .symbols = .{
  82            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
  83            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
  84            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
  85        },
  86        .encode = .{ .add, .Xd, .Xn, .{ .register = .Xm } },
  87    },
  88    .{
  89        .pattern = "ADD <Xd|SP>, <Xn|SP>, <Wm>, <extend>",
  90        .symbols = .{
  91            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
  92            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
  93            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
  94            .extend = .{ .extend = .{ .size = .word } },
  95        },
  96        .encode = .{ .add, .Xd, .Xn, .{ .extended_register_explicit = .{
  97            .register = .Wm,
  98            .option = .extend,
  99            .amount = 0,
 100        } } },
 101    },
 102    .{
 103        .pattern = "ADD <Xd|SP>, <Xn|SP>, <Wm>, <extend> #<amount>",
 104        .symbols = .{
 105            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 106            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 107            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 108            .extend = .{ .extend = .{ .size = .word } },
 109            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
 110        },
 111        .encode = .{ .add, .Xd, .Xn, .{ .extended_register_explicit = .{
 112            .register = .Wm,
 113            .option = .extend,
 114            .amount = .amount,
 115        } } },
 116    },
 117    .{
 118        .pattern = "ADD <Xd|SP>, <Xn|SP>, <Xm>, <extend>",
 119        .symbols = .{
 120            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 121            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 122            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 123            .extend = .{ .extend = .{ .size = .doubleword } },
 124        },
 125        .encode = .{ .add, .Xd, .Xn, .{ .extended_register_explicit = .{
 126            .register = .Xm,
 127            .option = .extend,
 128            .amount = 0,
 129        } } },
 130    },
 131    .{
 132        .pattern = "ADD <Xd|SP>, <Xn|SP>, <Xm>, <extend> #<amount>",
 133        .symbols = .{
 134            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 135            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 136            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 137            .extend = .{ .extend = .{ .size = .doubleword } },
 138            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
 139        },
 140        .encode = .{ .add, .Xd, .Xn, .{ .extended_register_explicit = .{
 141            .register = .Xm,
 142            .option = .extend,
 143            .amount = .amount,
 144        } } },
 145    },
 146    // C6.2.4 ADD (immediate)
 147    .{
 148        .pattern = "ADD <Wd|WSP>, <Wn|WSP>, #<imm>",
 149        .symbols = .{
 150            .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
 151            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
 152            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
 153        },
 154        .encode = .{ .add, .Wd, .Wn, .{ .immediate = .imm } },
 155    },
 156    .{
 157        .pattern = "ADD <Wd|WSP>, <Wn|WSP>, #<imm>, LSL #<shift>",
 158        .symbols = .{
 159            .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
 160            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
 161            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
 162            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
 163        },
 164        .encode = .{ .add, .Wd, .Wn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
 165    },
 166    .{
 167        .pattern = "ADD <Xd|SP>, <Xn|SP>, #<imm>",
 168        .symbols = .{
 169            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 170            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 171            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
 172        },
 173        .encode = .{ .add, .Xd, .Xn, .{ .immediate = .imm } },
 174    },
 175    .{
 176        .pattern = "ADD <Xd|SP>, <Xn|SP>, #<imm>, LSL #<shift>",
 177        .symbols = .{
 178            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 179            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 180            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
 181            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
 182        },
 183        .encode = .{ .add, .Xd, .Xn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
 184    },
 185    // C6.2.5 ADD (shifted register)
 186    .{
 187        .pattern = "ADD <Wd>, <Wn>, <Wm>",
 188        .symbols = .{
 189            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 190            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 191            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 192        },
 193        .encode = .{ .add, .Wd, .Wn, .{ .register = .Wm } },
 194    },
 195    .{
 196        .pattern = "ADD <Wd>, <Wn>, <Wm>, <shift> #<amount>",
 197        .symbols = .{
 198            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 199            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 200            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 201            .shift = .{ .shift = .{ .allow_ror = false } },
 202            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
 203        },
 204        .encode = .{ .add, .Wd, .Wn, .{ .shifted_register_explicit = .{
 205            .register = .Wm,
 206            .shift = .shift,
 207            .amount = .amount,
 208        } } },
 209    },
 210    .{
 211        .pattern = "ADD <Xd>, <Xn>, <Xm>",
 212        .symbols = .{
 213            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 214            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 215            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 216        },
 217        .encode = .{ .add, .Xd, .Xn, .{ .register = .Xm } },
 218    },
 219    .{
 220        .pattern = "ADD <Xd>, <Xn>, <Xm>, <shift> #<amount>",
 221        .symbols = .{
 222            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 223            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 224            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 225            .shift = .{ .shift = .{ .allow_ror = false } },
 226            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
 227        },
 228        .encode = .{ .add, .Xd, .Xn, .{ .shifted_register_explicit = .{
 229            .register = .Xm,
 230            .shift = .shift,
 231            .amount = .amount,
 232        } } },
 233    },
 234    // C6.2.6 ADDG
 235    .{
 236        .requires = .{.mte},
 237        .pattern = "ADDG <Xd|SP>, <Xn|SP>, #<uimm6>,  #<uimm4>",
 238        .symbols = .{
 239            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 240            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 241            .uimm6 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 10 }, .multiple_of = 16 } },
 242            .uimm4 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
 243        },
 244        .encode = .{ .addg, .Xd, .Xn, .uimm6, .uimm4 },
 245    },
 246    // C6.2.7 ADDS (extended register)
 247    .{
 248        .pattern = "ADDS <Wd>, <Wn|WSP>, <Wm>",
 249        .symbols = .{
 250            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 251            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
 252            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 253        },
 254        .encode = .{ .adds, .Wd, .Wn, .{ .register = .Wm } },
 255    },
 256    .{
 257        .pattern = "ADDS <Wd>, <Wn|WSP>, <Wm>, <extend>",
 258        .symbols = .{
 259            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 260            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
 261            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 262            .extend = .{ .extend = .{} },
 263        },
 264        .encode = .{ .adds, .Wd, .Wn, .{ .extended_register_explicit = .{
 265            .register = .Wm,
 266            .option = .extend,
 267            .amount = 0,
 268        } } },
 269    },
 270    .{
 271        .pattern = "ADDS <Wd>, <Wn|WSP>, <Wm>, <extend> #<amount>",
 272        .symbols = .{
 273            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 274            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
 275            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 276            .extend = .{ .extend = .{} },
 277            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
 278        },
 279        .encode = .{ .adds, .Wd, .Wn, .{ .extended_register_explicit = .{
 280            .register = .Wm,
 281            .option = .extend,
 282            .amount = .amount,
 283        } } },
 284    },
 285    .{
 286        .pattern = "ADDS <Xd>, <Xn|SP>, <Xm>",
 287        .symbols = .{
 288            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 289            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 290            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 291        },
 292        .encode = .{ .adds, .Xd, .Xn, .{ .register = .Xm } },
 293    },
 294    .{
 295        .pattern = "ADDS <Xd>, <Xn|SP>, <Wm>, <extend>",
 296        .symbols = .{
 297            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 298            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 299            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 300            .extend = .{ .extend = .{ .size = .word } },
 301        },
 302        .encode = .{ .adds, .Xd, .Xn, .{ .extended_register_explicit = .{
 303            .register = .Wm,
 304            .option = .extend,
 305            .amount = 0,
 306        } } },
 307    },
 308    .{
 309        .pattern = "ADDS <Xd>, <Xn|SP>, <Wm>, <extend> #<amount>",
 310        .symbols = .{
 311            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 312            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 313            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 314            .extend = .{ .extend = .{ .size = .word } },
 315            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
 316        },
 317        .encode = .{ .adds, .Xd, .Xn, .{ .extended_register_explicit = .{
 318            .register = .Wm,
 319            .option = .extend,
 320            .amount = .amount,
 321        } } },
 322    },
 323    .{
 324        .pattern = "ADDS <Xd>, <Xn|SP>, <Xm>, <extend>",
 325        .symbols = .{
 326            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 327            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 328            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 329            .extend = .{ .extend = .{ .size = .doubleword } },
 330        },
 331        .encode = .{ .adds, .Xd, .Xn, .{ .extended_register_explicit = .{
 332            .register = .Xm,
 333            .option = .extend,
 334            .amount = 0,
 335        } } },
 336    },
 337    .{
 338        .pattern = "ADDS <Xd>, <Xn|SP>, <Xm>, <extend> #<amount>",
 339        .symbols = .{
 340            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 341            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 342            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 343            .extend = .{ .extend = .{ .size = .doubleword } },
 344            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
 345        },
 346        .encode = .{ .adds, .Xd, .Xn, .{ .extended_register_explicit = .{
 347            .register = .Xm,
 348            .option = .extend,
 349            .amount = .amount,
 350        } } },
 351    },
 352    // C6.2.8 ADDS (immediate)
 353    .{
 354        .pattern = "ADDS <Wd>, <Wn|WSP>, #<imm>",
 355        .symbols = .{
 356            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 357            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
 358            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
 359        },
 360        .encode = .{ .adds, .Wd, .Wn, .{ .immediate = .imm } },
 361    },
 362    .{
 363        .pattern = "ADDS <Wd>, <Wn|WSP>, #<imm>, LSL #<shift>",
 364        .symbols = .{
 365            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 366            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
 367            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
 368            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
 369        },
 370        .encode = .{ .adds, .Wd, .Wn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
 371    },
 372    .{
 373        .pattern = "ADDS <Xd>, <Xn|SP>, #<imm>",
 374        .symbols = .{
 375            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 376            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 377            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
 378        },
 379        .encode = .{ .adds, .Xd, .Xn, .{ .immediate = .imm } },
 380    },
 381    .{
 382        .pattern = "ADDS <Xd>, <Xn|SP>, #<imm>, LSL #<shift>",
 383        .symbols = .{
 384            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 385            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
 386            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
 387            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
 388        },
 389        .encode = .{ .adds, .Xd, .Xn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
 390    },
 391    // C6.2.9 ADDS (shifted register)
 392    .{
 393        .pattern = "ADDS <Wd>, <Wn>, <Wm>",
 394        .symbols = .{
 395            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 396            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 397            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 398        },
 399        .encode = .{ .adds, .Wd, .Wn, .{ .register = .Wm } },
 400    },
 401    .{
 402        .pattern = "ADDS <Wd>, <Wn>, <Wm>, <shift> #<amount>",
 403        .symbols = .{
 404            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 405            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 406            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 407            .shift = .{ .shift = .{ .allow_ror = false } },
 408            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
 409        },
 410        .encode = .{ .adds, .Wd, .Wn, .{ .shifted_register_explicit = .{
 411            .register = .Wm,
 412            .shift = .shift,
 413            .amount = .amount,
 414        } } },
 415    },
 416    .{
 417        .pattern = "ADDS <Xd>, <Xn>, <Xm>",
 418        .symbols = .{
 419            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 420            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 421            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 422        },
 423        .encode = .{ .adds, .Xd, .Xn, .{ .register = .Xm } },
 424    },
 425    .{
 426        .pattern = "ADDS <Xd>, <Xn>, <Xm>, <shift> #<amount>",
 427        .symbols = .{
 428            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 429            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 430            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 431            .shift = .{ .shift = .{ .allow_ror = false } },
 432            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
 433        },
 434        .encode = .{ .adds, .Xd, .Xn, .{ .shifted_register_explicit = .{
 435            .register = .Xm,
 436            .shift = .shift,
 437            .amount = .amount,
 438        } } },
 439    },
 440    // C6.2.13 AND (shifted register)
 441    .{
 442        .pattern = "AND <Wd>, <Wn>, <Wm>",
 443        .symbols = .{
 444            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 445            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 446            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 447        },
 448        .encode = .{ .@"and", .Wd, .Wn, .{ .register = .Wm } },
 449    },
 450    .{
 451        .pattern = "AND <Wd>, <Wn>, <Wm>, <shift> #<amount>",
 452        .symbols = .{
 453            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 454            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 455            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 456            .shift = .{ .shift = .{} },
 457            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
 458        },
 459        .encode = .{ .@"and", .Wd, .Wn, .{ .shifted_register_explicit = .{
 460            .register = .Wm,
 461            .shift = .shift,
 462            .amount = .amount,
 463        } } },
 464    },
 465    .{
 466        .pattern = "AND <Xd>, <Xn>, <Xm>",
 467        .symbols = .{
 468            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 469            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 470            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 471        },
 472        .encode = .{ .@"and", .Xd, .Xn, .{ .register = .Xm } },
 473    },
 474    .{
 475        .pattern = "AND <Xd>, <Xn>, <Xm>, <shift> #<amount>",
 476        .symbols = .{
 477            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 478            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 479            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 480            .shift = .{ .shift = .{} },
 481            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
 482        },
 483        .encode = .{ .@"and", .Xd, .Xn, .{ .shifted_register_explicit = .{
 484            .register = .Xm,
 485            .shift = .shift,
 486            .amount = .amount,
 487        } } },
 488    },
 489    // C6.2.15 ANDS (shifted register)
 490    .{
 491        .pattern = "ANDS <Wd>, <Wn>, <Wm>",
 492        .symbols = .{
 493            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 494            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 495            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 496        },
 497        .encode = .{ .ands, .Wd, .Wn, .{ .register = .Wm } },
 498    },
 499    .{
 500        .pattern = "ANDS <Wd>, <Wn>, <Wm>, <shift> #<amount>",
 501        .symbols = .{
 502            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 503            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 504            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 505            .shift = .{ .shift = .{} },
 506            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
 507        },
 508        .encode = .{ .ands, .Wd, .Wn, .{ .shifted_register_explicit = .{
 509            .register = .Wm,
 510            .shift = .shift,
 511            .amount = .amount,
 512        } } },
 513    },
 514    .{
 515        .pattern = "ANDS <Xd>, <Xn>, <Xm>",
 516        .symbols = .{
 517            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 518            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 519            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 520        },
 521        .encode = .{ .ands, .Xd, .Xn, .{ .register = .Xm } },
 522    },
 523    .{
 524        .pattern = "ANDS <Xd>, <Xn>, <Xm>, <shift> #<amount>",
 525        .symbols = .{
 526            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 527            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 528            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 529            .shift = .{ .shift = .{} },
 530            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
 531        },
 532        .encode = .{ .ands, .Xd, .Xn, .{ .shifted_register_explicit = .{
 533            .register = .Xm,
 534            .shift = .shift,
 535            .amount = .amount,
 536        } } },
 537    },
 538    // C6.2.16 ASR (register)
 539    .{
 540        .pattern = "ASR <Wd>, <Wn>, <Wm>",
 541        .symbols = .{
 542            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 543            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 544            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 545        },
 546        .encode = .{ .asrv, .Wd, .Wn, .Wm },
 547    },
 548    .{
 549        .pattern = "ASR <Xd>, <Xn>, <Xm>",
 550        .symbols = .{
 551            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 552            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 553            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 554        },
 555        .encode = .{ .asrv, .Xd, .Xn, .Xm },
 556    },
 557    // C6.2.17 ASR (immediate)
 558    .{
 559        .pattern = "ASR <Wd>, <Wn>, #<shift>",
 560        .symbols = .{
 561            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 562            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 563            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
 564        },
 565        .encode = .{ .sbfm, .Wd, .Wn, .{ .N = .word, .immr = .shift, .imms = 31 } },
 566    },
 567    .{
 568        .pattern = "ASR <Xd>, <Xn>, #<shift>",
 569        .symbols = .{
 570            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 571            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 572            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
 573        },
 574        .encode = .{ .sbfm, .Xd, .Xn, .{ .N = .doubleword, .immr = .shift, .imms = 63 } },
 575    },
 576    // C6.2.18 ASRV
 577    .{
 578        .pattern = "ASRV <Wd>, <Wn>, <Wm>",
 579        .symbols = .{
 580            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 581            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 582            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 583        },
 584        .encode = .{ .asrv, .Wd, .Wn, .Wm },
 585    },
 586    .{
 587        .pattern = "ASRV <Xd>, <Xn>, <Xm>",
 588        .symbols = .{
 589            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 590            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 591            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 592        },
 593        .encode = .{ .asrv, .Xd, .Xn, .Xm },
 594    },
 595    // C6.2.24 AXFLAG
 596    .{
 597        .requires = .{.altnzcv},
 598        .pattern = "AXFLAG",
 599        .symbols = .{},
 600        .encode = .{.axflag},
 601    },
 602    // C6.2.28 BFC
 603    .{
 604        .pattern = "BFC <Wd>, #<lsb>, #<width>",
 605        .symbols = .{
 606            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 607            .lsb = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .adjust = .neg_wrap } },
 608            .width = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .adjust = .dec } },
 609        },
 610        .encode = .{ .bfm, .Wd, .wzr, .{ .N = .word, .immr = .lsb, .imms = .width } },
 611    },
 612    .{
 613        .pattern = "BFC <Xd>, #<lsb>, #<width>",
 614        .symbols = .{
 615            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 616            .lsb = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .adjust = .neg_wrap } },
 617            .width = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .adjust = .dec } },
 618        },
 619        .encode = .{ .bfm, .Xd, .xzr, .{ .N = .doubleword, .immr = .lsb, .imms = .width } },
 620    },
 621    // C6.2.29 BFI
 622    .{
 623        .pattern = "BFI <Wd>, <Wn>, #<lsb>, #<width>",
 624        .symbols = .{
 625            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 626            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 627            .lsb = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .adjust = .neg_wrap } },
 628            .width = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .adjust = .dec } },
 629        },
 630        .encode = .{ .bfm, .Wd, .Wn, .{ .N = .word, .immr = .lsb, .imms = .width } },
 631    },
 632    .{
 633        .pattern = "BFI <Xd>, <Xn>, #<lsb>, #<width>",
 634        .symbols = .{
 635            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 636            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 637            .lsb = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .adjust = .neg_wrap } },
 638            .width = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .adjust = .dec } },
 639        },
 640        .encode = .{ .bfm, .Xd, .Xn, .{ .N = .doubleword, .immr = .lsb, .imms = .width } },
 641    },
 642    // C6.2.30 BFM
 643    .{
 644        .pattern = "BFM <Wd>, <Wn>, #<immr>, #<imms>",
 645        .symbols = .{
 646            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 647            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 648            .immr = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
 649            .imms = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
 650        },
 651        .encode = .{ .bfm, .Wd, .Wn, .{ .N = .word, .immr = .immr, .imms = .imms } },
 652    },
 653    .{
 654        .pattern = "BFM <Xd>, <Xn>, #<immr>, #<imms>",
 655        .symbols = .{
 656            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 657            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 658            .immr = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
 659            .imms = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
 660        },
 661        .encode = .{ .bfm, .Xd, .Xn, .{ .N = .doubleword, .immr = .immr, .imms = .imms } },
 662    },
 663    // C6.2.35 BLR
 664    .{
 665        .pattern = "BLR <Xn>",
 666        .symbols = .{
 667            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 668        },
 669        .encode = .{ .blr, .Xn },
 670    },
 671    // C6.2.37 BR
 672    .{
 673        .pattern = "BR <Xn>",
 674        .symbols = .{
 675            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 676        },
 677        .encode = .{ .br, .Xn },
 678    },
 679    // C6.2.40 BRK
 680    .{
 681        .pattern = "BRK #<imm>",
 682        .symbols = .{
 683            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
 684        },
 685        .encode = .{ .brk, .imm },
 686    },
 687    // C6.2.52 CFINV
 688    .{
 689        .requires = .{.flagm},
 690        .pattern = "CFINV",
 691        .symbols = .{},
 692        .encode = .{.cfinv},
 693    },
 694    // C6.2.56 CLREX
 695    .{
 696        .pattern = "CLREX",
 697        .symbols = .{},
 698        .encode = .{ .clrex, 0b1111 },
 699    },
 700    .{
 701        .pattern = "CLREX #<imm>",
 702        .symbols = .{
 703            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
 704        },
 705        .encode = .{ .clrex, .imm },
 706    },
 707    // C6.2.57 CLS
 708    .{
 709        .pattern = "CLS <Wd>, <Wn>",
 710        .symbols = .{
 711            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 712            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 713        },
 714        .encode = .{ .cls, .Wd, .Wn },
 715    },
 716    .{
 717        .pattern = "CLS <Xd>, <Xn>",
 718        .symbols = .{
 719            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 720            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 721        },
 722        .encode = .{ .cls, .Xd, .Xn },
 723    },
 724    // C6.2.58 CLZ
 725    .{
 726        .pattern = "CLZ <Wd>, <Wn>",
 727        .symbols = .{
 728            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 729            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 730        },
 731        .encode = .{ .clz, .Wd, .Wn },
 732    },
 733    .{
 734        .pattern = "CLZ <Xd>, <Xn>",
 735        .symbols = .{
 736            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 737            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 738        },
 739        .encode = .{ .clz, .Xd, .Xn },
 740    },
 741    // C6.2.109 DC
 742    .{
 743        .pattern = "DC IVAC, <Xt>",
 744        .symbols = .{
 745            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 746        },
 747        .encode = .{ .sys, 0b000, 0b0111, 0b0110, 0b001, .Xt },
 748    },
 749    .{
 750        .pattern = "DC ISW, <Xt>",
 751        .symbols = .{
 752            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 753        },
 754        .encode = .{ .sys, 0b000, 0b0111, 0b0110, 0b010, .Xt },
 755    },
 756    .{
 757        .pattern = "DC CSW, <Xt>",
 758        .symbols = .{
 759            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 760        },
 761        .encode = .{ .sys, 0b000, 0b0111, 0b1010, 0b010, .Xt },
 762    },
 763    .{
 764        .pattern = "DC CISW, <Xt>",
 765        .symbols = .{
 766            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 767        },
 768        .encode = .{ .sys, 0b000, 0b0111, 0b1110, 0b010, .Xt },
 769    },
 770    .{
 771        .pattern = "DC ZVA, <Xt>",
 772        .symbols = .{
 773            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 774        },
 775        .encode = .{ .sys, 0b011, 0b0111, 0b0100, 0b001, .Xt },
 776    },
 777    .{
 778        .pattern = "DC CVAC, <Xt>",
 779        .symbols = .{
 780            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 781        },
 782        .encode = .{ .sys, 0b011, 0b0111, 0b1010, 0b001, .Xt },
 783    },
 784    .{
 785        .pattern = "DC CVAU, <Xt>",
 786        .symbols = .{
 787            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 788        },
 789        .encode = .{ .sys, 0b011, 0b0111, 0b1011, 0b001, .Xt },
 790    },
 791    .{
 792        .pattern = "DC CIVAC, <Xt>",
 793        .symbols = .{
 794            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 795        },
 796        .encode = .{ .sys, 0b011, 0b0111, 0b1110, 0b001, .Xt },
 797    },
 798    // C6.2.110 DCPS1
 799    .{
 800        .pattern = "DCPS1",
 801        .symbols = .{},
 802        .encode = .{ .dcps1, 0 },
 803    },
 804    .{
 805        .pattern = "DCPS1 #<imm>",
 806        .symbols = .{
 807            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
 808        },
 809        .encode = .{ .dcps1, .imm },
 810    },
 811    // C6.2.111 DCPS2
 812    .{
 813        .pattern = "DCPS2",
 814        .symbols = .{},
 815        .encode = .{ .dcps2, 0 },
 816    },
 817    .{
 818        .pattern = "DCPS2 #<imm>",
 819        .symbols = .{
 820            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
 821        },
 822        .encode = .{ .dcps2, .imm },
 823    },
 824    // C6.2.112 DCPS3
 825    .{
 826        .pattern = "DCPS3",
 827        .symbols = .{},
 828        .encode = .{ .dcps3, 0 },
 829    },
 830    .{
 831        .pattern = "DCPS3 #<imm>",
 832        .symbols = .{
 833            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
 834        },
 835        .encode = .{ .dcps3, .imm },
 836    },
 837    // C6.2.116 DSB
 838    .{
 839        .pattern = "DSB <option>",
 840        .symbols = .{
 841            .option = .{ .barrier = .{} },
 842        },
 843        .encode = .{ .dsb, .option },
 844    },
 845    .{
 846        .pattern = "DSB #<imm>",
 847        .symbols = .{
 848            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
 849        },
 850        .encode = .{ .dsb, .imm },
 851    },
 852    // C6.2.120 EOR (shifted register)
 853    .{
 854        .pattern = "EOR <Wd>, <Wn>, <Wm>",
 855        .symbols = .{
 856            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 857            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 858            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 859        },
 860        .encode = .{ .eor, .Wd, .Wn, .{ .register = .Wm } },
 861    },
 862    .{
 863        .pattern = "EOR <Wd>, <Wn>, <Wm>, <shift> #<amount>",
 864        .symbols = .{
 865            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 866            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 867            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 868            .shift = .{ .shift = .{} },
 869            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
 870        },
 871        .encode = .{ .eor, .Wd, .Wn, .{ .shifted_register_explicit = .{
 872            .register = .Wm,
 873            .shift = .shift,
 874            .amount = .amount,
 875        } } },
 876    },
 877    .{
 878        .pattern = "EOR <Xd>, <Xn>, <Xm>",
 879        .symbols = .{
 880            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 881            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 882            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 883        },
 884        .encode = .{ .eor, .Xd, .Xn, .{ .register = .Xm } },
 885    },
 886    .{
 887        .pattern = "EOR <Xd>, <Xn>, <Xm>, <shift> #<amount>",
 888        .symbols = .{
 889            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 890            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 891            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 892            .shift = .{ .shift = .{} },
 893            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
 894        },
 895        .encode = .{ .eor, .Xd, .Xn, .{ .shifted_register_explicit = .{
 896            .register = .Xm,
 897            .shift = .shift,
 898            .amount = .amount,
 899        } } },
 900    },
 901    // C6.2.124 EXTR
 902    .{
 903        .pattern = "EXTR <Wd>, <Wn>, <Wm>, #<lsb>",
 904        .symbols = .{
 905            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
 906            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
 907            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
 908            .lsb = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
 909        },
 910        .encode = .{ .extr, .Wd, .Wn, .Wm, .lsb },
 911    },
 912    .{
 913        .pattern = "EXTR <Xd>, <Xn>, <Xm>, #<lsb>",
 914        .symbols = .{
 915            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 916            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 917            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 918            .lsb = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
 919        },
 920        .encode = .{ .extr, .Xd, .Xn, .Xm, .lsb },
 921    },
 922    // C6.2.126 HINT
 923    .{
 924        .pattern = "HINT #<imm>",
 925        .symbols = .{
 926            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 7 } } },
 927        },
 928        .encode = .{ .hint, .imm },
 929    },
 930    // C6.2.127 HLT
 931    .{
 932        .pattern = "HLT #<imm>",
 933        .symbols = .{
 934            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
 935        },
 936        .encode = .{ .hlt, .imm },
 937    },
 938    // C6.2.128 HVC
 939    .{
 940        .pattern = "HVC #<imm>",
 941        .symbols = .{
 942            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
 943        },
 944        .encode = .{ .hvc, .imm },
 945    },
 946    // C6.2.129 IC
 947    .{
 948        .pattern = "IC IALLUIS",
 949        .symbols = .{},
 950        .encode = .{ .sys, 0b000, 0b0111, 0b0001, 0b000, .xzr },
 951    },
 952    .{
 953        .pattern = "IC IALLUIS, <Xt>",
 954        .symbols = .{
 955            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 956        },
 957        .encode = .{ .sys, 0b000, 0b0111, 0b0001, 0b000, .Xt },
 958    },
 959    .{
 960        .pattern = "IC IALLU",
 961        .symbols = .{},
 962        .encode = .{ .sys, 0b000, 0b0111, 0b0101, 0b000, .xzr },
 963    },
 964    .{
 965        .pattern = "IC IALLU, <Xt>",
 966        .symbols = .{
 967            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 968        },
 969        .encode = .{ .sys, 0b000, 0b0111, 0b0101, 0b000, .Xt },
 970    },
 971    .{
 972        .pattern = "IC IVAU",
 973        .symbols = .{},
 974        .encode = .{ .sys, 0b011, 0b0111, 0b0101, 0b001, .xzr },
 975    },
 976    .{
 977        .pattern = "IC IVAU, <Xt>",
 978        .symbols = .{
 979            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
 980        },
 981        .encode = .{ .sys, 0b011, 0b0111, 0b0101, 0b001, .Xt },
 982    },
 983    // C6.2.131 ISB
 984    .{
 985        .pattern = "ISB",
 986        .symbols = .{},
 987        .encode = .{ .isb, .sy },
 988    },
 989    .{
 990        .pattern = "ISB <option>",
 991        .symbols = .{
 992            .option = .{ .barrier = .{ .only_sy = true } },
 993        },
 994        .encode = .{ .isb, .option },
 995    },
 996    .{
 997        .pattern = "ISB #<imm>",
 998        .symbols = .{
 999            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
1000        },
1001        .encode = .{ .isb, .imm },
1002    },
1003    // C6.2.164 LDP
1004    .{
1005        .pattern = "LDP <Wt1>, <Wt2>, [<Xn|SP>], #<imm>",
1006        .symbols = .{
1007            .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1008            .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1009            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1010            .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 }, .multiple_of = 4 } },
1011        },
1012        .encode = .{ .ldp, .Wt1, .Wt2, .{ .post_index = .{ .base = .Xn, .index = .imm } } },
1013    },
1014    .{
1015        .pattern = "LDP <Xt1>, <Xt2>, [<Xn|SP>], #<imm>",
1016        .symbols = .{
1017            .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1018            .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1019            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1020            .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 10 }, .multiple_of = 8 } },
1021        },
1022        .encode = .{ .ldp, .Xt1, .Xt2, .{ .post_index = .{ .base = .Xn, .index = .imm } } },
1023    },
1024    .{
1025        .pattern = "LDP <Wt1>, <Wt2>, [<Xn|SP>, #<imm>]!",
1026        .symbols = .{
1027            .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1028            .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1029            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1030            .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 }, .multiple_of = 4 } },
1031        },
1032        .encode = .{ .ldp, .Wt1, .Wt2, .{ .pre_index = .{ .base = .Xn, .index = .imm } } },
1033    },
1034    .{
1035        .pattern = "LDP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]!",
1036        .symbols = .{
1037            .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1038            .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1039            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1040            .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 10 }, .multiple_of = 8 } },
1041        },
1042        .encode = .{ .ldp, .Xt1, .Xt2, .{ .pre_index = .{ .base = .Xn, .index = .imm } } },
1043    },
1044    .{
1045        .pattern = "LDP <Wt1>, <Wt2>, [<Xn|SP>]",
1046        .symbols = .{
1047            .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1048            .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1049            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1050        },
1051        .encode = .{ .ldp, .Wt1, .Wt2, .{ .base = .Xn } },
1052    },
1053    .{
1054        .pattern = "LDP <Wt1>, <Wt2>, [<Xn|SP>, #<imm>]",
1055        .symbols = .{
1056            .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1057            .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1058            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1059            .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 }, .multiple_of = 4 } },
1060        },
1061        .encode = .{ .ldp, .Wt1, .Wt2, .{ .signed_offset = .{ .base = .Xn, .offset = .imm } } },
1062    },
1063    .{
1064        .pattern = "LDP <Xt1>, <Xt2>, [<Xn|SP>]",
1065        .symbols = .{
1066            .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1067            .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1068            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1069        },
1070        .encode = .{ .ldp, .Xt1, .Xt2, .{ .base = .Xn } },
1071    },
1072    .{
1073        .pattern = "LDP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]",
1074        .symbols = .{
1075            .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1076            .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1077            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1078            .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 10 }, .multiple_of = 8 } },
1079        },
1080        .encode = .{ .ldp, .Xt1, .Xt2, .{ .signed_offset = .{ .base = .Xn, .offset = .imm } } },
1081    },
1082    // C6.2.166 LDR (immediate)
1083    .{
1084        .pattern = "LDR <Wt>, [<Xn|SP>], #<simm>",
1085        .symbols = .{
1086            .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
1087            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1088            .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1089        },
1090        .encode = .{ .ldr, .Wt, .{ .post_index = .{ .base = .Xn, .index = .simm } } },
1091    },
1092    .{
1093        .pattern = "LDR <Xt>, [<Xn|SP>], #<simm>",
1094        .symbols = .{
1095            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1096            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1097            .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1098        },
1099        .encode = .{ .ldr, .Xt, .{ .post_index = .{ .base = .Xn, .index = .simm } } },
1100    },
1101    .{
1102        .pattern = "LDR <Wt>, [<Xn|SP>, #<simm>]!",
1103        .symbols = .{
1104            .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
1105            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1106            .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1107        },
1108        .encode = .{ .ldr, .Wt, .{ .pre_index = .{ .base = .Xn, .index = .simm } } },
1109    },
1110    .{
1111        .pattern = "LDR <Xt>, [<Xn|SP>, #<simm>]!",
1112        .symbols = .{
1113            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1114            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1115            .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1116        },
1117        .encode = .{ .ldr, .Xt, .{ .pre_index = .{ .base = .Xn, .index = .simm } } },
1118    },
1119    .{
1120        .pattern = "LDR <Wt>, [<Xn|SP>]",
1121        .symbols = .{
1122            .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
1123            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1124        },
1125        .encode = .{ .ldr, .Wt, .{ .base = .Xn } },
1126    },
1127    .{
1128        .pattern = "LDR <Wt>, [<Xn|SP>, #<pimm>]",
1129        .symbols = .{
1130            .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
1131            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1132            .pimm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 14 }, .multiple_of = 4 } },
1133        },
1134        .encode = .{ .ldr, .Wt, .{ .unsigned_offset = .{ .base = .Xn, .offset = .pimm } } },
1135    },
1136    .{
1137        .pattern = "LDR <Xt>, [<Xn|SP>]",
1138        .symbols = .{
1139            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1140            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1141        },
1142        .encode = .{ .ldr, .Xt, .{ .base = .Xn } },
1143    },
1144    .{
1145        .pattern = "LDR <Xt>, [<Xn|SP>, #<pimm>]",
1146        .symbols = .{
1147            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1148            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1149            .pimm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 15 }, .multiple_of = 8 } },
1150        },
1151        .encode = .{ .ldr, .Xt, .{ .unsigned_offset = .{ .base = .Xn, .offset = .pimm } } },
1152    },
1153    // C6.2.212 LSL (register)
1154    .{
1155        .pattern = "LSL <Wd>, <Wn>, <Wm>",
1156        .symbols = .{
1157            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1158            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1159            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1160        },
1161        .encode = .{ .lslv, .Wd, .Wn, .Wm },
1162    },
1163    .{
1164        .pattern = "LSL <Xd>, <Xn>, <Xm>",
1165        .symbols = .{
1166            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1167            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1168            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1169        },
1170        .encode = .{ .lslv, .Xd, .Xn, .Xm },
1171    },
1172    // C6.2.214 LSLV
1173    .{
1174        .pattern = "LSLV <Wd>, <Wn>, <Wm>",
1175        .symbols = .{
1176            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1177            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1178            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1179        },
1180        .encode = .{ .lslv, .Wd, .Wn, .Wm },
1181    },
1182    .{
1183        .pattern = "LSLV <Xd>, <Xn>, <Xm>",
1184        .symbols = .{
1185            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1186            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1187            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1188        },
1189        .encode = .{ .lslv, .Xd, .Xn, .Xm },
1190    },
1191    // C6.2.215 LSR (register)
1192    .{
1193        .pattern = "LSR <Wd>, <Wn>, <Wm>",
1194        .symbols = .{
1195            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1196            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1197            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1198        },
1199        .encode = .{ .lsrv, .Wd, .Wn, .Wm },
1200    },
1201    .{
1202        .pattern = "LSR <Xd>, <Xn>, <Xm>",
1203        .symbols = .{
1204            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1205            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1206            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1207        },
1208        .encode = .{ .lsrv, .Xd, .Xn, .Xm },
1209    },
1210    // C6.2.217 LSRV
1211    .{
1212        .pattern = "LSRV <Wd>, <Wn>, <Wm>",
1213        .symbols = .{
1214            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1215            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1216            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1217        },
1218        .encode = .{ .lsrv, .Wd, .Wn, .Wm },
1219    },
1220    .{
1221        .pattern = "LSRV <Xd>, <Xn>, <Xm>",
1222        .symbols = .{
1223            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1224            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1225            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1226        },
1227        .encode = .{ .lsrv, .Xd, .Xn, .Xm },
1228    },
1229    // C6.2.218 MADD
1230    .{
1231        .pattern = "MADD <Wd>, <Wn>, <Wm>, <Wa>",
1232        .symbols = .{
1233            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1234            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1235            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1236            .Wa = .{ .reg = .{ .format = .{ .general = .word } } },
1237        },
1238        .encode = .{ .madd, .Wd, .Wn, .Wm, .Wa },
1239    },
1240    .{
1241        .pattern = "MADD <Xd>, <Xn>, <Xm>, <Xa>",
1242        .symbols = .{
1243            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1244            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1245            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1246            .Xa = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1247        },
1248        .encode = .{ .madd, .Xd, .Xn, .Xm, .Xa },
1249    },
1250    // C6.2.219 MNEG
1251    .{
1252        .pattern = "MNEG <Wd>, <Wn>, <Wm>",
1253        .symbols = .{
1254            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1255            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1256            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1257        },
1258        .encode = .{ .msub, .Wd, .Wn, .Wm, .wzr },
1259    },
1260    .{
1261        .pattern = "MNEG <Xd>, <Xn>, <Xm>",
1262        .symbols = .{
1263            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1264            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1265            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1266        },
1267        .encode = .{ .msub, .Xd, .Xn, .Xm, .xzr },
1268    },
1269    // C6.2.220 MOV (to/from SP)
1270    .{
1271        .pattern = "MOV WSP, <Wn|WSP>",
1272        .symbols = .{
1273            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
1274        },
1275        .encode = .{ .add, .wsp, .Wn, .{ .immediate = 0 } },
1276    },
1277    .{
1278        .pattern = "MOV <Wd|WSP>, WSP",
1279        .symbols = .{
1280            .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
1281        },
1282        .encode = .{ .add, .Wd, .wsp, .{ .immediate = 0 } },
1283    },
1284    .{
1285        .pattern = "MOV SP, <Xn|SP>",
1286        .symbols = .{
1287            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1288        },
1289        .encode = .{ .add, .sp, .Xn, .{ .immediate = 0 } },
1290    },
1291    .{
1292        .pattern = "MOV <Xd|SP>, SP",
1293        .symbols = .{
1294            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1295        },
1296        .encode = .{ .add, .Xd, .sp, .{ .immediate = 0 } },
1297    },
1298    // C6.2.222 MOV (wide immediate)
1299    .{
1300        .pattern = "MOV <Wd>, #<imm>",
1301        .symbols = .{
1302            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1303            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1304        },
1305        .encode = .{ .movz, .Wd, .imm, .{ .lsl = .@"0" } },
1306    },
1307    .{
1308        .pattern = "MOV <Xd>, #<imm>",
1309        .symbols = .{
1310            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1311            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1312        },
1313        .encode = .{ .movz, .Xd, .imm, .{ .lsl = .@"0" } },
1314    },
1315    // C6.2.224 MOV (register)
1316    .{
1317        .pattern = "MOV <Wd>, <Wm>",
1318        .symbols = .{
1319            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1320            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1321        },
1322        .encode = .{ .orr, .Wd, .wzr, .{ .register = .Wm } },
1323    },
1324    .{
1325        .pattern = "MOV <Xd>, <Xm>",
1326        .symbols = .{
1327            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1328            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1329        },
1330        .encode = .{ .orr, .Xd, .xzr, .{ .register = .Xm } },
1331    },
1332    // C6.2.225 MOVK
1333    .{
1334        .pattern = "MOVK <Wd>, #<imm>",
1335        .symbols = .{
1336            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1337            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1338        },
1339        .encode = .{ .movk, .Wd, .imm, .{} },
1340    },
1341    .{
1342        .pattern = "MOVK <Wd>, #<imm>, LSL #<shift>",
1343        .symbols = .{
1344            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1345            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1346            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .multiple_of = 16 } },
1347        },
1348        .encode = .{ .movk, .Wd, .imm, .{ .lsl = .shift } },
1349    },
1350    .{
1351        .pattern = "MOVK <Xd>, #<imm>",
1352        .symbols = .{
1353            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1354            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1355        },
1356        .encode = .{ .movk, .Xd, .imm, .{} },
1357    },
1358    .{
1359        .pattern = "MOVK <Xd>, #<imm>, LSL #<shift>",
1360        .symbols = .{
1361            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1362            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1363            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .multiple_of = 16 } },
1364        },
1365        .encode = .{ .movk, .Xd, .imm, .{ .lsl = .shift } },
1366    },
1367    // C6.2.226 MOVN
1368    .{
1369        .pattern = "MOVN <Wd>, #<imm>",
1370        .symbols = .{
1371            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1372            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1373        },
1374        .encode = .{ .movn, .Wd, .imm, .{} },
1375    },
1376    .{
1377        .pattern = "MOVN <Wd>, #<imm>, LSL #<shift>",
1378        .symbols = .{
1379            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1380            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1381            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .multiple_of = 16 } },
1382        },
1383        .encode = .{ .movn, .Wd, .imm, .{ .lsl = .shift } },
1384    },
1385    .{
1386        .pattern = "MOVN <Xd>, #<imm>",
1387        .symbols = .{
1388            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1389            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1390        },
1391        .encode = .{ .movn, .Xd, .imm, .{} },
1392    },
1393    .{
1394        .pattern = "MOVN <Xd>, #<imm>, LSL #<shift>",
1395        .symbols = .{
1396            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1397            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1398            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .multiple_of = 16 } },
1399        },
1400        .encode = .{ .movn, .Xd, .imm, .{ .lsl = .shift } },
1401    },
1402    // C6.2.227 MOVZ
1403    .{
1404        .pattern = "MOVZ <Wd>, #<imm>",
1405        .symbols = .{
1406            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1407            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1408        },
1409        .encode = .{ .movz, .Wd, .imm, .{} },
1410    },
1411    .{
1412        .pattern = "MOVZ <Wd>, #<imm>, LSL #<shift>",
1413        .symbols = .{
1414            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1415            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1416            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .multiple_of = 16 } },
1417        },
1418        .encode = .{ .movz, .Wd, .imm, .{ .lsl = .shift } },
1419    },
1420    .{
1421        .pattern = "MOVZ <Xd>, #<imm>",
1422        .symbols = .{
1423            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1424            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1425        },
1426        .encode = .{ .movz, .Xd, .imm, .{} },
1427    },
1428    .{
1429        .pattern = "MOVZ <Xd>, #<imm>, LSL #<shift>",
1430        .symbols = .{
1431            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1432            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1433            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .multiple_of = 16 } },
1434        },
1435        .encode = .{ .movz, .Xd, .imm, .{ .lsl = .shift } },
1436    },
1437    // C6.2.228 MRS
1438    .{
1439        .pattern = "MRS <Xt>, <systemreg>",
1440        .symbols = .{
1441            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1442            .systemreg = .systemreg,
1443        },
1444        .encode = .{ .mrs, .Xt, .systemreg },
1445    },
1446    // C6.2.230 MSR (register)
1447    .{
1448        .pattern = "MSR <systemreg>, <Xt>",
1449        .symbols = .{
1450            .systemreg = .systemreg,
1451            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1452        },
1453        .encode = .{ .msr, .systemreg, .Xt },
1454    },
1455    // C6.2.231 MSUB
1456    .{
1457        .pattern = "MSUB <Wd>, <Wn>, <Wm>, <Wa>",
1458        .symbols = .{
1459            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1460            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1461            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1462            .Wa = .{ .reg = .{ .format = .{ .general = .word } } },
1463        },
1464        .encode = .{ .msub, .Wd, .Wn, .Wm, .Wa },
1465    },
1466    .{
1467        .pattern = "MSUB <Xd>, <Xn>, <Xm>, <Xa>",
1468        .symbols = .{
1469            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1470            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1471            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1472            .Xa = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1473        },
1474        .encode = .{ .msub, .Xd, .Xn, .Xm, .Xa },
1475    },
1476    // C6.2.232 MUL
1477    .{
1478        .pattern = "MUL <Wd>, <Wn>, <Wm>",
1479        .symbols = .{
1480            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1481            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1482            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1483        },
1484        .encode = .{ .madd, .Wd, .Wn, .Wm, .wzr },
1485    },
1486    .{
1487        .pattern = "MUL <Xd>, <Xn>, <Xm>",
1488        .symbols = .{
1489            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1490            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1491            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1492        },
1493        .encode = .{ .madd, .Xd, .Xn, .Xm, .xzr },
1494    },
1495    // C6.2.234 NEG
1496    .{
1497        .pattern = "NEG <Wd>, <Wm>",
1498        .symbols = .{
1499            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1500            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1501        },
1502        .encode = .{ .sub, .Wd, .wzr, .{ .register = .Wm } },
1503    },
1504    .{
1505        .pattern = "NEG <Wd>, <Wm>, <shift> #<amount>",
1506        .symbols = .{
1507            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1508            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1509            .shift = .{ .shift = .{ .allow_ror = false } },
1510            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
1511        },
1512        .encode = .{ .sub, .Wd, .wzr, .{ .shifted_register_explicit = .{
1513            .register = .Wm,
1514            .shift = .shift,
1515            .amount = .amount,
1516        } } },
1517    },
1518    .{
1519        .pattern = "NEG <Xd>, <Xm>",
1520        .symbols = .{
1521            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1522            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1523        },
1524        .encode = .{ .sub, .Xd, .xzr, .{ .register = .Xm } },
1525    },
1526    .{
1527        .pattern = "NEG <Xd>, <Xm>, <shift> #<amount>",
1528        .symbols = .{
1529            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1530            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1531            .shift = .{ .shift = .{ .allow_ror = false } },
1532            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
1533        },
1534        .encode = .{ .sub, .Xd, .xzr, .{ .shifted_register_explicit = .{
1535            .register = .Xm,
1536            .shift = .shift,
1537            .amount = .amount,
1538        } } },
1539    },
1540    // C6.2.238 NOP
1541    .{
1542        .pattern = "NOP",
1543        .symbols = .{},
1544        .encode = .{.nop},
1545    },
1546    // C6.2.241 ORR (shifted register)
1547    .{
1548        .pattern = "ORR <Wd>, <Wn>, <Wm>",
1549        .symbols = .{
1550            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1551            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1552            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1553        },
1554        .encode = .{ .orr, .Wd, .Wn, .{ .register = .Wm } },
1555    },
1556    .{
1557        .pattern = "ORR <Wd>, <Wn>, <Wm>, <shift> #<amount>",
1558        .symbols = .{
1559            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1560            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1561            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1562            .shift = .{ .shift = .{} },
1563            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
1564        },
1565        .encode = .{ .orr, .Wd, .Wn, .{ .shifted_register_explicit = .{
1566            .register = .Wm,
1567            .shift = .shift,
1568            .amount = .amount,
1569        } } },
1570    },
1571    .{
1572        .pattern = "ORR <Xd>, <Xn>, <Xm>",
1573        .symbols = .{
1574            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1575            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1576            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1577        },
1578        .encode = .{ .orr, .Xd, .Xn, .{ .register = .Xm } },
1579    },
1580    .{
1581        .pattern = "ORR <Xd>, <Xn>, <Xm>, <shift> #<amount>",
1582        .symbols = .{
1583            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1584            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1585            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1586            .shift = .{ .shift = .{} },
1587            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
1588        },
1589        .encode = .{ .orr, .Xd, .Xn, .{ .shifted_register_explicit = .{
1590            .register = .Xm,
1591            .shift = .shift,
1592            .amount = .amount,
1593        } } },
1594    },
1595    // C6.2.253 RBIT
1596    .{
1597        .pattern = "RBIT <Wd>, <Wn>",
1598        .symbols = .{
1599            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1600            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1601        },
1602        .encode = .{ .rbit, .Wd, .Wn },
1603    },
1604    .{
1605        .pattern = "RBIT <Xd>, <Xn>",
1606        .symbols = .{
1607            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1608            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1609        },
1610        .encode = .{ .rbit, .Xd, .Xn },
1611    },
1612    // C6.2.254 RET
1613    .{
1614        .pattern = "RET",
1615        .symbols = .{},
1616        .encode = .{ .ret, .x30 },
1617    },
1618    .{
1619        .pattern = "RET <Xn>",
1620        .symbols = .{
1621            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1622        },
1623        .encode = .{ .ret, .Xn },
1624    },
1625    // C6.2.256 REV
1626    .{
1627        .pattern = "REV <Wd>, <Wn>",
1628        .symbols = .{
1629            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1630            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1631        },
1632        .encode = .{ .rev, .Wd, .Wn },
1633    },
1634    .{
1635        .pattern = "REV <Xd>, <Xn>",
1636        .symbols = .{
1637            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1638            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1639        },
1640        .encode = .{ .rev, .Xd, .Xn },
1641    },
1642    // C6.2.257 REV16
1643    .{
1644        .pattern = "REV16 <Wd>, <Wn>",
1645        .symbols = .{
1646            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1647            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1648        },
1649        .encode = .{ .rev16, .Wd, .Wn },
1650    },
1651    .{
1652        .pattern = "REV16 <Xd>, <Xn>",
1653        .symbols = .{
1654            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1655            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1656        },
1657        .encode = .{ .rev16, .Xd, .Xn },
1658    },
1659    // C6.2.258 REV32
1660    .{
1661        .pattern = "REV32 <Xd>, <Xn>",
1662        .symbols = .{
1663            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1664            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1665        },
1666        .encode = .{ .rev32, .Xd, .Xn },
1667    },
1668    // C6.2.259 REV64
1669    .{
1670        .pattern = "REV64 <Xd>, <Xn>",
1671        .symbols = .{
1672            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1673            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1674        },
1675        .encode = .{ .rev, .Xd, .Xn },
1676    },
1677    // C6.2.261 ROR (immediate)
1678    .{
1679        .pattern = "ROR <Wd>, <Ws>, #<shift>",
1680        .symbols = .{
1681            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1682            .Ws = .{ .reg = .{ .format = .{ .general = .word } } },
1683            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
1684        },
1685        .encode = .{ .extr, .Wd, .Ws, .Ws, .shift },
1686    },
1687    .{
1688        .pattern = "ROR <Xd>, <Xs>, #<shift>",
1689        .symbols = .{
1690            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1691            .Xs = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1692            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
1693        },
1694        .encode = .{ .extr, .Xd, .Xs, .Xs, .shift },
1695    },
1696    // C6.2.262 ROR (register)
1697    .{
1698        .pattern = "ROR <Wd>, <Wn>, <Wm>",
1699        .symbols = .{
1700            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1701            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1702            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1703        },
1704        .encode = .{ .rorv, .Wd, .Wn, .Wm },
1705    },
1706    .{
1707        .pattern = "ROR <Xd>, <Xn>, <Xm>",
1708        .symbols = .{
1709            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1710            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1711            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1712        },
1713        .encode = .{ .rorv, .Xd, .Xn, .Xm },
1714    },
1715    // C6.2.263 RORV
1716    .{
1717        .pattern = "RORV <Wd>, <Wn>, <Wm>",
1718        .symbols = .{
1719            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1720            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1721            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1722        },
1723        .encode = .{ .rorv, .Wd, .Wn, .Wm },
1724    },
1725    .{
1726        .pattern = "RORV <Xd>, <Xn>, <Xm>",
1727        .symbols = .{
1728            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1729            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1730            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1731        },
1732        .encode = .{ .rorv, .Xd, .Xn, .Xm },
1733    },
1734    // C6.2.265 SBC
1735    .{
1736        .pattern = "SBC <Wd>, <Wn>, <Wm>",
1737        .symbols = .{
1738            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1739            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1740            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1741        },
1742        .encode = .{ .sbc, .Wd, .Wn, .Wm },
1743    },
1744    .{
1745        .pattern = "SBC <Xd>, <Xn>, <Xm>",
1746        .symbols = .{
1747            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1748            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1749            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1750        },
1751        .encode = .{ .sbc, .Xd, .Xn, .Xm },
1752    },
1753    // C6.2.266 SBCS
1754    .{
1755        .pattern = "SBCS <Wd>, <Wn>, <Wm>",
1756        .symbols = .{
1757            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1758            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1759            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1760        },
1761        .encode = .{ .sbcs, .Wd, .Wn, .Wm },
1762    },
1763    .{
1764        .pattern = "SBCS <Xd>, <Xn>, <Xm>",
1765        .symbols = .{
1766            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1767            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1768            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1769        },
1770        .encode = .{ .sbcs, .Xd, .Xn, .Xm },
1771    },
1772    // C6.2.268 SBFM
1773    .{
1774        .pattern = "SBFM <Wd>, <Wn>, #<immr>, #<imms>",
1775        .symbols = .{
1776            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1777            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1778            .immr = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
1779            .imms = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
1780        },
1781        .encode = .{ .sbfm, .Wd, .Wn, .{ .N = .word, .immr = .immr, .imms = .imms } },
1782    },
1783    .{
1784        .pattern = "SBFM <Xd>, <Xn>, #<immr>, #<imms>",
1785        .symbols = .{
1786            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1787            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1788            .immr = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
1789            .imms = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
1790        },
1791        .encode = .{ .sbfm, .Xd, .Xn, .{ .N = .doubleword, .immr = .immr, .imms = .imms } },
1792    },
1793    // C6.2.270 SDIV
1794    .{
1795        .pattern = "SDIV <Wd>, <Wn>, <Wm>",
1796        .symbols = .{
1797            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1798            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1799            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1800        },
1801        .encode = .{ .sdiv, .Wd, .Wn, .Wm },
1802    },
1803    .{
1804        .pattern = "SDIV <Xd>, <Xn>, <Xm>",
1805        .symbols = .{
1806            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1807            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1808            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1809        },
1810        .encode = .{ .sdiv, .Xd, .Xn, .Xm },
1811    },
1812    // C6.2.280 SEV
1813    .{
1814        .pattern = "SEV",
1815        .symbols = .{},
1816        .encode = .{.sev},
1817    },
1818    // C6.2.281 SEVL
1819    .{
1820        .pattern = "SEVL",
1821        .symbols = .{},
1822        .encode = .{.sevl},
1823    },
1824    // C6.2.282 SMADDL
1825    .{
1826        .pattern = "SMADDL <Xd>, <Wn>, <Wm>, <Xa>",
1827        .symbols = .{
1828            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1829            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1830            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1831            .Xa = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1832        },
1833        .encode = .{ .smaddl, .Xd, .Wn, .Wm, .Xa },
1834    },
1835    // C6.2.283 SMC
1836    .{
1837        .pattern = "SMC #<imm>",
1838        .symbols = .{
1839            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1840        },
1841        .encode = .{ .smc, .imm },
1842    },
1843    // C6.2.284 SMNEGL
1844    .{
1845        .pattern = "SMNEGL <Xd>, <Wn>, <Wm>",
1846        .symbols = .{
1847            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1848            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1849            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1850        },
1851        .encode = .{ .smsubl, .Xd, .Wn, .Wm, .xzr },
1852    },
1853    // C6.2.287 SMSUBL
1854    .{
1855        .pattern = "SMSUBL <Xd>, <Wn>, <Wm>, <Xa>",
1856        .symbols = .{
1857            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1858            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1859            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1860            .Xa = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1861        },
1862        .encode = .{ .smsubl, .Xd, .Wn, .Wm, .Xa },
1863    },
1864    // C6.2.288 SMULH
1865    .{
1866        .pattern = "SMULH <Xd>, <Xn>, <Xm>",
1867        .symbols = .{
1868            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1869            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1870            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1871        },
1872        .encode = .{ .smulh, .Xd, .Xn, .Xm },
1873    },
1874    // C6.2.289 SMULL
1875    .{
1876        .pattern = "SMULL <Xd>, <Wn>, <Wm>",
1877        .symbols = .{
1878            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1879            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1880            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1881        },
1882        .encode = .{ .smaddl, .Xd, .Wn, .Wm, .xzr },
1883    },
1884    // C6.2.321 STP
1885    .{
1886        .pattern = "STP <Wt1>, <Wt2>, [<Xn|SP>], #<imm>",
1887        .symbols = .{
1888            .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1889            .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1890            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1891            .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 }, .multiple_of = 4 } },
1892        },
1893        .encode = .{ .stp, .Wt1, .Wt2, .{ .post_index = .{ .base = .Xn, .index = .imm } } },
1894    },
1895    .{
1896        .pattern = "STP <Xt1>, <Xt2>, [<Xn|SP>], #<imm>",
1897        .symbols = .{
1898            .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1899            .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1900            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1901            .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 10 }, .multiple_of = 8 } },
1902        },
1903        .encode = .{ .stp, .Xt1, .Xt2, .{ .post_index = .{ .base = .Xn, .index = .imm } } },
1904    },
1905    .{
1906        .pattern = "STP <Wt1>, <Wt2>, [<Xn|SP>, #<imm>]!",
1907        .symbols = .{
1908            .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1909            .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1910            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1911            .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 }, .multiple_of = 4 } },
1912        },
1913        .encode = .{ .stp, .Wt1, .Wt2, .{ .pre_index = .{ .base = .Xn, .index = .imm } } },
1914    },
1915    .{
1916        .pattern = "STP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]!",
1917        .symbols = .{
1918            .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1919            .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1920            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1921            .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 10 }, .multiple_of = 8 } },
1922        },
1923        .encode = .{ .stp, .Xt1, .Xt2, .{ .pre_index = .{ .base = .Xn, .index = .imm } } },
1924    },
1925    .{
1926        .pattern = "STP <Wt1>, <Wt2>, [<Xn|SP>]",
1927        .symbols = .{
1928            .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1929            .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1930            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1931        },
1932        .encode = .{ .stp, .Wt1, .Wt2, .{ .base = .Xn } },
1933    },
1934    .{
1935        .pattern = "STP <Wt1>, <Wt2>, [<Xn|SP>, #<imm>]",
1936        .symbols = .{
1937            .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1938            .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1939            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1940            .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 }, .multiple_of = 4 } },
1941        },
1942        .encode = .{ .stp, .Wt1, .Wt2, .{ .signed_offset = .{ .base = .Xn, .offset = .imm } } },
1943    },
1944    .{
1945        .pattern = "STP <Xt1>, <Xt2>, [<Xn|SP>]",
1946        .symbols = .{
1947            .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1948            .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1949            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1950        },
1951        .encode = .{ .stp, .Xt1, .Xt2, .{ .base = .Xn } },
1952    },
1953    .{
1954        .pattern = "STP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]",
1955        .symbols = .{
1956            .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1957            .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1958            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1959            .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 10 }, .multiple_of = 8 } },
1960        },
1961        .encode = .{ .stp, .Xt1, .Xt2, .{ .signed_offset = .{ .base = .Xn, .offset = .imm } } },
1962    },
1963    // C6.2.322 STR (immediate)
1964    .{
1965        .pattern = "STR <Wt>, [<Xn|SP>], #<simm>",
1966        .symbols = .{
1967            .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
1968            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1969            .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1970        },
1971        .encode = .{ .str, .Wt, .{ .post_index = .{ .base = .Xn, .index = .simm } } },
1972    },
1973    .{
1974        .pattern = "STR <Xt>, [<Xn|SP>], #<simm>",
1975        .symbols = .{
1976            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1977            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1978            .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1979        },
1980        .encode = .{ .str, .Xt, .{ .post_index = .{ .base = .Xn, .index = .simm } } },
1981    },
1982    .{
1983        .pattern = "STR <Wt>, [<Xn|SP>, #<simm>]!",
1984        .symbols = .{
1985            .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
1986            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1987            .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1988        },
1989        .encode = .{ .str, .Wt, .{ .pre_index = .{ .base = .Xn, .index = .simm } } },
1990    },
1991    .{
1992        .pattern = "STR <Xt>, [<Xn|SP>, #<simm>]!",
1993        .symbols = .{
1994            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1995            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1996            .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1997        },
1998        .encode = .{ .str, .Xt, .{ .pre_index = .{ .base = .Xn, .index = .simm } } },
1999    },
2000    .{
2001        .pattern = "STR <Wt>, [<Xn|SP>]",
2002        .symbols = .{
2003            .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
2004            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2005        },
2006        .encode = .{ .str, .Wt, .{ .base = .Xn } },
2007    },
2008    .{
2009        .pattern = "STR <Wt>, [<Xn|SP>, #<pimm>]",
2010        .symbols = .{
2011            .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
2012            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2013            .pimm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 14 }, .multiple_of = 4 } },
2014        },
2015        .encode = .{ .str, .Wt, .{ .unsigned_offset = .{ .base = .Xn, .offset = .pimm } } },
2016    },
2017    .{
2018        .pattern = "STR <Xt>, [<Xn|SP>]",
2019        .symbols = .{
2020            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2021            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2022        },
2023        .encode = .{ .str, .Xt, .{ .base = .Xn } },
2024    },
2025    .{
2026        .pattern = "STR <Xt>, [<Xn|SP>, #<pimm>]",
2027        .symbols = .{
2028            .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2029            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2030            .pimm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 15 }, .multiple_of = 8 } },
2031        },
2032        .encode = .{ .str, .Xt, .{ .unsigned_offset = .{ .base = .Xn, .offset = .pimm } } },
2033    },
2034    // C6.2.356 SUB (extended register)
2035    .{
2036        .pattern = "SUB <Wd|WSP>, <Wn|WSP>, <Wm>",
2037        .symbols = .{
2038            .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2039            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2040            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2041        },
2042        .encode = .{ .sub, .Wd, .Wn, .{ .register = .Wm } },
2043    },
2044    .{
2045        .pattern = "SUB <Wd|WSP>, <Wn|WSP>, <Wm>, <extend>",
2046        .symbols = .{
2047            .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2048            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2049            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2050            .extend = .{ .extend = .{} },
2051        },
2052        .encode = .{ .sub, .Wd, .Wn, .{ .extended_register_explicit = .{
2053            .register = .Wm,
2054            .option = .extend,
2055            .amount = 0,
2056        } } },
2057    },
2058    .{
2059        .pattern = "SUB <Wd|WSP>, <Wn|WSP>, <Wm>, <extend> #<amount>",
2060        .symbols = .{
2061            .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2062            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2063            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2064            .extend = .{ .extend = .{} },
2065            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
2066        },
2067        .encode = .{ .sub, .Wd, .Wn, .{ .extended_register_explicit = .{
2068            .register = .Wm,
2069            .option = .extend,
2070            .amount = .amount,
2071        } } },
2072    },
2073    .{
2074        .pattern = "SUB <Xd|SP>, <Xn|SP>, <Xm>",
2075        .symbols = .{
2076            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2077            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2078            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2079        },
2080        .encode = .{ .sub, .Xd, .Xn, .{ .register = .Xm } },
2081    },
2082    .{
2083        .pattern = "SUB <Xd|SP>, <Xn|SP>, <Wm>, <extend>",
2084        .symbols = .{
2085            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2086            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2087            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2088            .extend = .{ .extend = .{ .size = .word } },
2089        },
2090        .encode = .{ .sub, .Xd, .Xn, .{ .extended_register_explicit = .{
2091            .register = .Wm,
2092            .option = .extend,
2093            .amount = 0,
2094        } } },
2095    },
2096    .{
2097        .pattern = "SUB <Xd|SP>, <Xn|SP>, <Wm>, <extend> #<amount>",
2098        .symbols = .{
2099            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2100            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2101            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2102            .extend = .{ .extend = .{ .size = .word } },
2103            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
2104        },
2105        .encode = .{ .sub, .Xd, .Xn, .{ .extended_register_explicit = .{
2106            .register = .Wm,
2107            .option = .extend,
2108            .amount = .amount,
2109        } } },
2110    },
2111    .{
2112        .pattern = "SUB <Xd|SP>, <Xn|SP>, <Xm>, <extend>",
2113        .symbols = .{
2114            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2115            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2116            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2117            .extend = .{ .extend = .{ .size = .doubleword } },
2118        },
2119        .encode = .{ .sub, .Xd, .Xn, .{ .extended_register_explicit = .{
2120            .register = .Xm,
2121            .option = .extend,
2122            .amount = 0,
2123        } } },
2124    },
2125    .{
2126        .pattern = "SUB <Xd|SP>, <Xn|SP>, <Xm>, <extend> #<amount>",
2127        .symbols = .{
2128            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2129            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2130            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2131            .extend = .{ .extend = .{ .size = .doubleword } },
2132            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
2133        },
2134        .encode = .{ .sub, .Xd, .Xn, .{ .extended_register_explicit = .{
2135            .register = .Xm,
2136            .option = .extend,
2137            .amount = .amount,
2138        } } },
2139    },
2140    // C6.2.357 SUB (immediate)
2141    .{
2142        .pattern = "SUB <Wd|WSP>, <Wn|WSP>, #<imm>",
2143        .symbols = .{
2144            .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2145            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2146            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2147        },
2148        .encode = .{ .sub, .Wd, .Wn, .{ .immediate = .imm } },
2149    },
2150    .{
2151        .pattern = "SUB <Wd|WSP>, <Wn|WSP>, #<imm>, LSL #<shift>",
2152        .symbols = .{
2153            .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2154            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2155            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2156            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
2157        },
2158        .encode = .{ .sub, .Wd, .Wn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
2159    },
2160    .{
2161        .pattern = "SUB <Xd|SP>, <Xn|SP>, #<imm>",
2162        .symbols = .{
2163            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2164            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2165            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2166        },
2167        .encode = .{ .sub, .Xd, .Xn, .{ .immediate = .imm } },
2168    },
2169    .{
2170        .pattern = "SUB <Xd|SP>, <Xn|SP>, #<imm>, LSL #<shift>",
2171        .symbols = .{
2172            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2173            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2174            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2175            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
2176        },
2177        .encode = .{ .sub, .Xd, .Xn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
2178    },
2179    // C6.2.358 SUB (shifted register)
2180    .{
2181        .pattern = "SUB <Wd>, <Wn>, <Wm>",
2182        .symbols = .{
2183            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2184            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2185            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2186        },
2187        .encode = .{ .sub, .Wd, .Wn, .{ .register = .Wm } },
2188    },
2189    .{
2190        .pattern = "SUB <Wd>, <Wn>, <Wm>, <shift> #<amount>",
2191        .symbols = .{
2192            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2193            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2194            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2195            .shift = .{ .shift = .{ .allow_ror = false } },
2196            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
2197        },
2198        .encode = .{ .sub, .Wd, .Wn, .{ .shifted_register_explicit = .{
2199            .register = .Wm,
2200            .shift = .shift,
2201            .amount = .amount,
2202        } } },
2203    },
2204    .{
2205        .pattern = "SUB <Xd>, <Xn>, <Xm>",
2206        .symbols = .{
2207            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2208            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2209            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2210        },
2211        .encode = .{ .sub, .Xd, .Xn, .{ .register = .Xm } },
2212    },
2213    .{
2214        .pattern = "SUB <Xd>, <Xn>, <Xm>, <shift> #<amount>",
2215        .symbols = .{
2216            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2217            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2218            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2219            .shift = .{ .shift = .{ .allow_ror = false } },
2220            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
2221        },
2222        .encode = .{ .sub, .Xd, .Xn, .{ .shifted_register_explicit = .{
2223            .register = .Xm,
2224            .shift = .shift,
2225            .amount = .amount,
2226        } } },
2227    },
2228    // C6.2.359 SUBG
2229    .{
2230        .requires = .{.mte},
2231        .pattern = "SUBG <Xd|SP>, <Xn|SP>, #<uimm6>,  #<uimm4>",
2232        .symbols = .{
2233            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2234            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2235            .uimm6 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 10 }, .multiple_of = 16 } },
2236            .uimm4 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
2237        },
2238        .encode = .{ .subg, .Xd, .Xn, .uimm6, .uimm4 },
2239    },
2240    // C6.2.362 SUBS (extended register)
2241    .{
2242        .pattern = "SUBS <Wd>, <Wn|WSP>, <Wm>",
2243        .symbols = .{
2244            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2245            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2246            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2247        },
2248        .encode = .{ .subs, .Wd, .Wn, .{ .register = .Wm } },
2249    },
2250    .{
2251        .pattern = "SUBS <Wd>, <Wn|WSP>, <Wm>, <extend>",
2252        .symbols = .{
2253            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2254            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2255            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2256            .extend = .{ .extend = .{} },
2257        },
2258        .encode = .{ .subs, .Wd, .Wn, .{ .extended_register_explicit = .{
2259            .register = .Wm,
2260            .option = .extend,
2261            .amount = 0,
2262        } } },
2263    },
2264    .{
2265        .pattern = "SUBS <Wd>, <Wn|WSP>, <Wm>, <extend> #<amount>",
2266        .symbols = .{
2267            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2268            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2269            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2270            .extend = .{ .extend = .{} },
2271            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
2272        },
2273        .encode = .{ .subs, .Wd, .Wn, .{ .extended_register_explicit = .{
2274            .register = .Wm,
2275            .option = .extend,
2276            .amount = .amount,
2277        } } },
2278    },
2279    .{
2280        .pattern = "SUBS <Xd>, <Xn|SP>, <Xm>",
2281        .symbols = .{
2282            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2283            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2284            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2285        },
2286        .encode = .{ .subs, .Xd, .Xn, .{ .register = .Xm } },
2287    },
2288    .{
2289        .pattern = "SUBS <Xd>, <Xn|SP>, <Wm>, <extend>",
2290        .symbols = .{
2291            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2292            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2293            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2294            .extend = .{ .extend = .{ .size = .word } },
2295        },
2296        .encode = .{ .subs, .Xd, .Xn, .{ .extended_register_explicit = .{
2297            .register = .Wm,
2298            .option = .extend,
2299            .amount = 0,
2300        } } },
2301    },
2302    .{
2303        .pattern = "SUBS <Xd>, <Xn|SP>, <Wm>, <extend> #<amount>",
2304        .symbols = .{
2305            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2306            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2307            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2308            .extend = .{ .extend = .{ .size = .word } },
2309            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
2310        },
2311        .encode = .{ .subs, .Xd, .Xn, .{ .extended_register_explicit = .{
2312            .register = .Wm,
2313            .option = .extend,
2314            .amount = .amount,
2315        } } },
2316    },
2317    .{
2318        .pattern = "SUBS <Xd>, <Xn|SP>, <Xm>, <extend>",
2319        .symbols = .{
2320            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2321            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2322            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2323            .extend = .{ .extend = .{ .size = .doubleword } },
2324        },
2325        .encode = .{ .subs, .Xd, .Xn, .{ .extended_register_explicit = .{
2326            .register = .Xm,
2327            .option = .extend,
2328            .amount = 0,
2329        } } },
2330    },
2331    .{
2332        .pattern = "SUBS <Xd>, <Xn|SP>, <Xm>, <extend> #<amount>",
2333        .symbols = .{
2334            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2335            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2336            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2337            .extend = .{ .extend = .{ .size = .doubleword } },
2338            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
2339        },
2340        .encode = .{ .subs, .Xd, .Xn, .{ .extended_register_explicit = .{
2341            .register = .Xm,
2342            .option = .extend,
2343            .amount = .amount,
2344        } } },
2345    },
2346    // C6.2.363 SUBS (immediate)
2347    .{
2348        .pattern = "SUBS <Wd>, <Wn|WSP>, #<imm>",
2349        .symbols = .{
2350            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2351            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2352            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2353        },
2354        .encode = .{ .subs, .Wd, .Wn, .{ .immediate = .imm } },
2355    },
2356    .{
2357        .pattern = "SUBS <Wd>, <Wn|WSP>, #<imm>, LSL #<shift>",
2358        .symbols = .{
2359            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2360            .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2361            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2362            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
2363        },
2364        .encode = .{ .subs, .Wd, .Wn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
2365    },
2366    .{
2367        .pattern = "SUBS <Xd>, <Xn|SP>, #<imm>",
2368        .symbols = .{
2369            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2370            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2371            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2372        },
2373        .encode = .{ .subs, .Xd, .Xn, .{ .immediate = .imm } },
2374    },
2375    .{
2376        .pattern = "SUBS <Xd>, <Xn|SP>, #<imm>, LSL #<shift>",
2377        .symbols = .{
2378            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2379            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2380            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2381            .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
2382        },
2383        .encode = .{ .subs, .Xd, .Xn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
2384    },
2385    // C6.2.364 SUBS (shifted register)
2386    .{
2387        .pattern = "SUBS <Wd>, <Wn>, <Wm>",
2388        .symbols = .{
2389            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2390            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2391            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2392        },
2393        .encode = .{ .subs, .Wd, .Wn, .{ .register = .Wm } },
2394    },
2395    .{
2396        .pattern = "SUBS <Wd>, <Wn>, <Wm>, <shift> #<amount>",
2397        .symbols = .{
2398            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2399            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2400            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2401            .shift = .{ .shift = .{ .allow_ror = false } },
2402            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
2403        },
2404        .encode = .{ .subs, .Wd, .Wn, .{ .shifted_register_explicit = .{
2405            .register = .Wm,
2406            .shift = .shift,
2407            .amount = .amount,
2408        } } },
2409    },
2410    .{
2411        .pattern = "SUBS <Xd>, <Xn>, <Xm>",
2412        .symbols = .{
2413            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2414            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2415            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2416        },
2417        .encode = .{ .subs, .Xd, .Xn, .{ .register = .Xm } },
2418    },
2419    .{
2420        .pattern = "SUBS <Xd>, <Xn>, <Xm>, <shift> #<amount>",
2421        .symbols = .{
2422            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2423            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2424            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2425            .shift = .{ .shift = .{ .allow_ror = false } },
2426            .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
2427        },
2428        .encode = .{ .subs, .Xd, .Xn, .{ .shifted_register_explicit = .{
2429            .register = .Xm,
2430            .shift = .shift,
2431            .amount = .amount,
2432        } } },
2433    },
2434    // C6.2.365 SVC
2435    .{
2436        .pattern = "SVC #<imm>",
2437        .symbols = .{
2438            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
2439        },
2440        .encode = .{ .svc, .imm },
2441    },
2442    // C6.2.376 TCANCEL
2443    .{
2444        .pattern = "TCANCEL #<imm>",
2445        .symbols = .{
2446            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
2447        },
2448        .encode = .{ .tcancel, .imm },
2449    },
2450    // C6.2.385 UBFM
2451    .{
2452        .pattern = "UBFM <Wd>, <Wn>, #<immr>, #<imms>",
2453        .symbols = .{
2454            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2455            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2456            .immr = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
2457            .imms = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
2458        },
2459        .encode = .{ .ubfm, .Wd, .Wn, .{ .N = .word, .immr = .immr, .imms = .imms } },
2460    },
2461    .{
2462        .pattern = "UBFM <Xd>, <Xn>, #<immr>, #<imms>",
2463        .symbols = .{
2464            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2465            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2466            .immr = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
2467            .imms = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
2468        },
2469        .encode = .{ .ubfm, .Xd, .Xn, .{ .N = .doubleword, .immr = .immr, .imms = .imms } },
2470    },
2471    // C6.2.388 UDIV
2472    .{
2473        .pattern = "UDIV <Wd>, <Wn>, <Wm>",
2474        .symbols = .{
2475            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2476            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2477            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2478        },
2479        .encode = .{ .udiv, .Wd, .Wn, .Wm },
2480    },
2481    .{
2482        .pattern = "UDIV <Xd>, <Xn>, <Xm>",
2483        .symbols = .{
2484            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2485            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2486            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2487        },
2488        .encode = .{ .udiv, .Xd, .Xn, .Xm },
2489    },
2490    // C6.2.387 UDF
2491    .{
2492        .pattern = "UDF #<imm>",
2493        .symbols = .{
2494            .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
2495        },
2496        .encode = .{ .udf, .imm },
2497    },
2498    // C6.2.389 UMADDL
2499    .{
2500        .pattern = "UMADDL <Xd>, <Wn>, <Wm>, <Xa>",
2501        .symbols = .{
2502            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2503            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2504            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2505            .Xa = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2506        },
2507        .encode = .{ .umaddl, .Xd, .Wn, .Wm, .Xa },
2508    },
2509    // C6.2.390 UMNEGL
2510    .{
2511        .pattern = "UMNEGL <Xd>, <Wn>, <Wm>",
2512        .symbols = .{
2513            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2514            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2515            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2516        },
2517        .encode = .{ .umsubl, .Xd, .Wn, .Wm, .xzr },
2518    },
2519    // C6.2.391 UMSUBL
2520    .{
2521        .pattern = "UMSUBL <Xd>, <Wn>, <Wm>, <Xa>",
2522        .symbols = .{
2523            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2524            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2525            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2526            .Xa = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2527        },
2528        .encode = .{ .umsubl, .Xd, .Wn, .Wm, .Xa },
2529    },
2530    // C6.2.292 UMULH
2531    .{
2532        .pattern = "UMULH <Xd>, <Xn>, <Xm>",
2533        .symbols = .{
2534            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2535            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2536            .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2537        },
2538        .encode = .{ .umulh, .Xd, .Xn, .Xm },
2539    },
2540    // C6.2.393 UMULL
2541    .{
2542        .pattern = "UMULL <Xd>, <Wn>, <Wm>",
2543        .symbols = .{
2544            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2545            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2546            .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2547        },
2548        .encode = .{ .umaddl, .Xd, .Wn, .Wm, .xzr },
2549    },
2550    // C6.2.396 WFE
2551    .{
2552        .pattern = "WFE",
2553        .symbols = .{},
2554        .encode = .{.wfe},
2555    },
2556    // C6.2.398 WFI
2557    .{
2558        .pattern = "WFI",
2559        .symbols = .{},
2560        .encode = .{.wfi},
2561    },
2562    // C6.2.400 XAFLAG
2563    .{
2564        .requires = .{.altnzcv},
2565        .pattern = "XAFLAG",
2566        .symbols = .{},
2567        .encode = .{.xaflag},
2568    },
2569    // C6.2.402 YIELD
2570    .{
2571        .pattern = "YIELD",
2572        .symbols = .{},
2573        .encode = .{.yield},
2574    },
2575
2576    // C7.2.1 ABS
2577    .{
2578        .pattern = "ABS <Vd>, <Vn>",
2579        .symbols = .{
2580            .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2581            .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2582        },
2583        .encode = .{ .abs, .Vd, .Vn },
2584    },
2585    .{
2586        .pattern = "ABS <Vd>.<T>, <Vn>.<T>",
2587        .symbols = .{
2588            .Vd = .{ .reg_alias = .vector },
2589            .T = .{ .arrangement = .{ .min_valid_len = 2 } },
2590            .Vn = .{ .reg_alias = .vector },
2591        },
2592        .encode = .{
2593            .abs,
2594            .{ .alias = .Vd, .format = .{ .vector = .T } },
2595            .{ .alias = .Vn, .format = .{ .vector = .T } },
2596        },
2597    },
2598    // C7.2.28 CMEQ (zero)
2599    .{
2600        .pattern = "CMEQ <Vd>, <Vn>, #<0>",
2601        .symbols = .{
2602            .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2603            .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2604            .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2605        },
2606        .encode = .{ .cmeq, .Vd, .Vn, .zero },
2607    },
2608    .{
2609        .pattern = "CMEQ <Vd>.<T>, <Vn>.<T>, #<0>",
2610        .symbols = .{
2611            .Vd = .{ .reg_alias = .vector },
2612            .T = .{ .arrangement = .{ .min_valid_len = 2 } },
2613            .Vn = .{ .reg_alias = .vector },
2614            .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2615        },
2616        .encode = .{
2617            .cmeq,
2618            .{ .alias = .Vd, .format = .{ .vector = .T } },
2619            .{ .alias = .Vn, .format = .{ .vector = .T } },
2620            .zero,
2621        },
2622    },
2623    // C7.2.30 CMGE (zero)
2624    .{
2625        .pattern = "CMGE <Vd>, <Vn>, #<0>",
2626        .symbols = .{
2627            .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2628            .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2629            .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2630        },
2631        .encode = .{ .cmge, .Vd, .Vn, .zero },
2632    },
2633    .{
2634        .pattern = "CMGE <Vd>.<T>, <Vn>.<T>, #<0>",
2635        .symbols = .{
2636            .Vd = .{ .reg_alias = .vector },
2637            .T = .{ .arrangement = .{ .min_valid_len = 2 } },
2638            .Vn = .{ .reg_alias = .vector },
2639            .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2640        },
2641        .encode = .{
2642            .cmge,
2643            .{ .alias = .Vd, .format = .{ .vector = .T } },
2644            .{ .alias = .Vn, .format = .{ .vector = .T } },
2645            .zero,
2646        },
2647    },
2648    // C7.2.32 CMGT (zero)
2649    .{
2650        .pattern = "CMGT <Vd>, <Vn>, #<0>",
2651        .symbols = .{
2652            .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2653            .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2654            .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2655        },
2656        .encode = .{ .cmgt, .Vd, .Vn, .zero },
2657    },
2658    .{
2659        .pattern = "CMGT <Vd>.<T>, <Vn>.<T>, #<0>",
2660        .symbols = .{
2661            .Vd = .{ .reg_alias = .vector },
2662            .T = .{ .arrangement = .{ .min_valid_len = 2 } },
2663            .Vn = .{ .reg_alias = .vector },
2664            .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2665        },
2666        .encode = .{
2667            .cmgt,
2668            .{ .alias = .Vd, .format = .{ .vector = .T } },
2669            .{ .alias = .Vn, .format = .{ .vector = .T } },
2670            .zero,
2671        },
2672    },
2673    // C7.2.35 CMLE (zero)
2674    .{
2675        .pattern = "CMLE <Vd>, <Vn>, #<0>",
2676        .symbols = .{
2677            .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2678            .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2679            .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2680        },
2681        .encode = .{ .cmle, .Vd, .Vn, .zero },
2682    },
2683    .{
2684        .pattern = "CMLE <Vd>.<T>, <Vn>.<T>, #<0>",
2685        .symbols = .{
2686            .Vd = .{ .reg_alias = .vector },
2687            .T = .{ .arrangement = .{ .min_valid_len = 2 } },
2688            .Vn = .{ .reg_alias = .vector },
2689            .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2690        },
2691        .encode = .{
2692            .cmle,
2693            .{ .alias = .Vd, .format = .{ .vector = .T } },
2694            .{ .alias = .Vn, .format = .{ .vector = .T } },
2695            .zero,
2696        },
2697    },
2698    // C7.2.36 CMLT (zero)
2699    .{
2700        .pattern = "CMLT <Vd>, <Vn>, #<0>",
2701        .symbols = .{
2702            .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2703            .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2704            .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2705        },
2706        .encode = .{ .cmlt, .Vd, .Vn, .zero },
2707    },
2708    .{
2709        .pattern = "CMLT <Vd>.<T>, <Vn>.<T>, #<0>",
2710        .symbols = .{
2711            .Vd = .{ .reg_alias = .vector },
2712            .T = .{ .arrangement = .{ .min_valid_len = 2 } },
2713            .Vn = .{ .reg_alias = .vector },
2714            .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2715        },
2716        .encode = .{
2717            .cmlt,
2718            .{ .alias = .Vd, .format = .{ .vector = .T } },
2719            .{ .alias = .Vn, .format = .{ .vector = .T } },
2720            .zero,
2721        },
2722    },
2723    // C7.2.38 CNT
2724    .{
2725        .pattern = "CNT <Vd>.<T>, <Vn>.<T>",
2726        .symbols = .{
2727            .Vd = .{ .reg_alias = .vector },
2728            .T = .{ .arrangement = .{ .elem_size = .byte } },
2729            .Vn = .{ .reg_alias = .vector },
2730        },
2731        .encode = .{
2732            .cnt,
2733            .{ .alias = .Vd, .format = .{ .vector = .T } },
2734            .{ .alias = .Vn, .format = .{ .vector = .T } },
2735        },
2736    },
2737    // C7.2.39 DUP (element)
2738    .{
2739        .pattern = "DUP <Vd>, <Vn>.B[<index>]",
2740        .symbols = .{
2741            .Vd = .{ .reg = .{ .format = .{ .scalar = .byte } } },
2742            .Vn = .{ .reg_alias = .vector },
2743            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
2744        },
2745        .encode = .{
2746            .dup,
2747            .Vd,
2748            .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index } } },
2749        },
2750    },
2751    .{
2752        .pattern = "DUP <Vd>, <Vn>.H[<index>]",
2753        .symbols = .{
2754            .Vd = .{ .reg = .{ .format = .{ .scalar = .half } } },
2755            .Vn = .{ .reg_alias = .vector },
2756            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
2757        },
2758        .encode = .{
2759            .dup,
2760            .Vd,
2761            .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index } } },
2762        },
2763    },
2764    .{
2765        .pattern = "DUP <Vd>, <Vn>.S[<index>]",
2766        .symbols = .{
2767            .Vd = .{ .reg = .{ .format = .{ .scalar = .single } } },
2768            .Vn = .{ .reg_alias = .vector },
2769            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
2770        },
2771        .encode = .{
2772            .dup,
2773            .Vd,
2774            .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index } } },
2775        },
2776    },
2777    .{
2778        .pattern = "DUP <Vd>, <Vn>.D[<index>]",
2779        .symbols = .{
2780            .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2781            .Vn = .{ .reg_alias = .vector },
2782            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
2783        },
2784        .encode = .{
2785            .dup,
2786            .Vd,
2787            .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index } } },
2788        },
2789    },
2790    .{
2791        .pattern = "DUP <Vd>.<T>, <Vn>.B[<index>]",
2792        .symbols = .{
2793            .Vd = .{ .reg_alias = .vector },
2794            .T = .{ .arrangement = .{ .elem_size = .byte } },
2795            .Vn = .{ .reg_alias = .vector },
2796            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
2797        },
2798        .encode = .{
2799            .dup,
2800            .{ .alias = .Vd, .format = .{ .vector = .T } },
2801            .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index } } },
2802        },
2803    },
2804    .{
2805        .pattern = "DUP <Vd>.<T>, <Vn>.H[<index>]",
2806        .symbols = .{
2807            .Vd = .{ .reg_alias = .vector },
2808            .T = .{ .arrangement = .{ .elem_size = .half } },
2809            .Vn = .{ .reg_alias = .vector },
2810            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
2811        },
2812        .encode = .{
2813            .dup,
2814            .{ .alias = .Vd, .format = .{ .vector = .T } },
2815            .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index } } },
2816        },
2817    },
2818    .{
2819        .pattern = "DUP <Vd>.<T>, <Vn>.S[<index>]",
2820        .symbols = .{
2821            .Vd = .{ .reg_alias = .vector },
2822            .T = .{ .arrangement = .{ .elem_size = .single } },
2823            .Vn = .{ .reg_alias = .vector },
2824            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
2825        },
2826        .encode = .{
2827            .dup,
2828            .{ .alias = .Vd, .format = .{ .vector = .T } },
2829            .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index } } },
2830        },
2831    },
2832    .{
2833        .pattern = "DUP <Vd>.2D, <Vn>.D[<index>]",
2834        .symbols = .{
2835            .Vd = .{ .reg_alias = .vector },
2836            .Vn = .{ .reg_alias = .vector },
2837            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
2838        },
2839        .encode = .{
2840            .dup,
2841            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
2842            .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index } } },
2843        },
2844    },
2845    // C7.2.40 DUP (general)
2846    .{
2847        .pattern = "DUP <Vd>.<T>, <Wn>",
2848        .symbols = .{
2849            .Vd = .{ .reg_alias = .vector },
2850            .T = .{ .arrangement = .{ .allow_double = false } },
2851            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2852        },
2853        .encode = .{ .dup, .{ .alias = .Vd, .format = .{ .vector = .T } }, .Wn },
2854    },
2855    .{
2856        .pattern = "DUP <Vd>.2D, <Xn>",
2857        .symbols = .{
2858            .Vd = .{ .reg_alias = .vector },
2859            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2860        },
2861        .encode = .{ .dup, .{ .alias = .Vd, .format = .{ .vector = .@"2d" } }, .Xn },
2862    },
2863    // C7.2.57 FCMEQ (zero)
2864    .{
2865        .requires = .{.fullfp16},
2866        .pattern = "FCMEQ <Hd>, <Hn>, #<0.0>",
2867        .symbols = .{
2868            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
2869            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
2870            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2871        },
2872        .encode = .{ .fcmeq, .Hd, .Hn, .zero },
2873    },
2874    .{
2875        .pattern = "FCMEQ <Sd>, <Sn>, #<0.0>",
2876        .symbols = .{
2877            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
2878            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
2879            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2880        },
2881        .encode = .{ .fcmeq, .Sd, .Sn, .zero },
2882    },
2883    .{
2884        .pattern = "FCMEQ <Dd>, <Dn>, #<0.0>",
2885        .symbols = .{
2886            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2887            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2888            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2889        },
2890        .encode = .{ .fcmeq, .Dd, .Dn, .zero },
2891    },
2892    .{
2893        .requires = .{.fullfp16},
2894        .pattern = "FCMEQ <Vd>.<T>, <Vn>.<T>, #<0.0>",
2895        .symbols = .{
2896            .Vd = .{ .reg_alias = .vector },
2897            .T = .{ .arrangement = .{ .elem_size = .half } },
2898            .Vn = .{ .reg_alias = .vector },
2899            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2900        },
2901        .encode = .{
2902            .fcmeq,
2903            .{ .alias = .Vd, .format = .{ .vector = .T } },
2904            .{ .alias = .Vn, .format = .{ .vector = .T } },
2905            .zero,
2906        },
2907    },
2908    .{
2909        .pattern = "FCMEQ <Vd>.<T>, <Vn>.<T>, #<0.0>",
2910        .symbols = .{
2911            .Vd = .{ .reg_alias = .vector },
2912            .T = .{ .arrangement = .{ .elem_size = .single } },
2913            .Vn = .{ .reg_alias = .vector },
2914            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2915        },
2916        .encode = .{
2917            .fcmeq,
2918            .{ .alias = .Vd, .format = .{ .vector = .T } },
2919            .{ .alias = .Vn, .format = .{ .vector = .T } },
2920            .zero,
2921        },
2922    },
2923    .{
2924        .pattern = "FCMEQ <Vd>.2D, <Vn>.2D, #<0.0>",
2925        .symbols = .{
2926            .Vd = .{ .reg_alias = .vector },
2927            .Vn = .{ .reg_alias = .vector },
2928            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2929        },
2930        .encode = .{
2931            .fcmeq,
2932            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
2933            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
2934            .zero,
2935        },
2936    },
2937    // C7.2.59 FCMGE (zero)
2938    .{
2939        .requires = .{.fullfp16},
2940        .pattern = "FCMGE <Hd>, <Hn>, #<0.0>",
2941        .symbols = .{
2942            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
2943            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
2944            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2945        },
2946        .encode = .{ .fcmge, .Hd, .Hn, .zero },
2947    },
2948    .{
2949        .pattern = "FCMGE <Sd>, <Sn>, #<0.0>",
2950        .symbols = .{
2951            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
2952            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
2953            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2954        },
2955        .encode = .{ .fcmge, .Sd, .Sn, .zero },
2956    },
2957    .{
2958        .pattern = "FCMGE <Dd>, <Dn>, #<0.0>",
2959        .symbols = .{
2960            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2961            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2962            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2963        },
2964        .encode = .{ .fcmge, .Dd, .Dn, .zero },
2965    },
2966    .{
2967        .requires = .{.fullfp16},
2968        .pattern = "FCMGE <Vd>.<T>, <Vn>.<T>, #<0.0>",
2969        .symbols = .{
2970            .Vd = .{ .reg_alias = .vector },
2971            .T = .{ .arrangement = .{ .elem_size = .half } },
2972            .Vn = .{ .reg_alias = .vector },
2973            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2974        },
2975        .encode = .{
2976            .fcmge,
2977            .{ .alias = .Vd, .format = .{ .vector = .T } },
2978            .{ .alias = .Vn, .format = .{ .vector = .T } },
2979            .zero,
2980        },
2981    },
2982    .{
2983        .pattern = "FCMGE <Vd>.<T>, <Vn>.<T>, #<0.0>",
2984        .symbols = .{
2985            .Vd = .{ .reg_alias = .vector },
2986            .T = .{ .arrangement = .{ .elem_size = .single } },
2987            .Vn = .{ .reg_alias = .vector },
2988            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2989        },
2990        .encode = .{
2991            .fcmge,
2992            .{ .alias = .Vd, .format = .{ .vector = .T } },
2993            .{ .alias = .Vn, .format = .{ .vector = .T } },
2994            .zero,
2995        },
2996    },
2997    .{
2998        .pattern = "FCMGE <Vd>.2D, <Vn>.2D, #<0.0>",
2999        .symbols = .{
3000            .Vd = .{ .reg_alias = .vector },
3001            .Vn = .{ .reg_alias = .vector },
3002            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3003        },
3004        .encode = .{
3005            .fcmge,
3006            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3007            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3008            .zero,
3009        },
3010    },
3011    // C7.2.61 FCMGT (zero)
3012    .{
3013        .requires = .{.fullfp16},
3014        .pattern = "FCMGT <Hd>, <Hn>, #<0.0>",
3015        .symbols = .{
3016            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3017            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3018            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3019        },
3020        .encode = .{ .fcmgt, .Hd, .Hn, .zero },
3021    },
3022    .{
3023        .pattern = "FCMGT <Sd>, <Sn>, #<0.0>",
3024        .symbols = .{
3025            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3026            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3027            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3028        },
3029        .encode = .{ .fcmgt, .Sd, .Sn, .zero },
3030    },
3031    .{
3032        .pattern = "FCMGT <Dd>, <Dn>, #<0.0>",
3033        .symbols = .{
3034            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3035            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3036            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3037        },
3038        .encode = .{ .fcmgt, .Dd, .Dn, .zero },
3039    },
3040    .{
3041        .requires = .{.fullfp16},
3042        .pattern = "FCMGT <Vd>.<T>, <Vn>.<T>, #<0.0>",
3043        .symbols = .{
3044            .Vd = .{ .reg_alias = .vector },
3045            .T = .{ .arrangement = .{ .elem_size = .half } },
3046            .Vn = .{ .reg_alias = .vector },
3047            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3048        },
3049        .encode = .{
3050            .fcmgt,
3051            .{ .alias = .Vd, .format = .{ .vector = .T } },
3052            .{ .alias = .Vn, .format = .{ .vector = .T } },
3053            .zero,
3054        },
3055    },
3056    .{
3057        .pattern = "FCMGT <Vd>.<T>, <Vn>.<T>, #<0.0>",
3058        .symbols = .{
3059            .Vd = .{ .reg_alias = .vector },
3060            .T = .{ .arrangement = .{ .elem_size = .single } },
3061            .Vn = .{ .reg_alias = .vector },
3062            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3063        },
3064        .encode = .{
3065            .fcmgt,
3066            .{ .alias = .Vd, .format = .{ .vector = .T } },
3067            .{ .alias = .Vn, .format = .{ .vector = .T } },
3068            .zero,
3069        },
3070    },
3071    .{
3072        .pattern = "FCMGT <Vd>.2D, <Vn>.2D, #<0.0>",
3073        .symbols = .{
3074            .Vd = .{ .reg_alias = .vector },
3075            .Vn = .{ .reg_alias = .vector },
3076            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3077        },
3078        .encode = .{
3079            .fcmgt,
3080            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3081            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3082            .zero,
3083        },
3084    },
3085    // C7.2.64 FCMLE (zero)
3086    .{
3087        .requires = .{.fullfp16},
3088        .pattern = "FCMLE <Hd>, <Hn>, #<0.0>",
3089        .symbols = .{
3090            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3091            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3092            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3093        },
3094        .encode = .{ .fcmle, .Hd, .Hn, .zero },
3095    },
3096    .{
3097        .pattern = "FCMLE <Sd>, <Sn>, #<0.0>",
3098        .symbols = .{
3099            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3100            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3101            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3102        },
3103        .encode = .{ .fcmle, .Sd, .Sn, .zero },
3104    },
3105    .{
3106        .pattern = "FCMLE <Dd>, <Dn>, #<0.0>",
3107        .symbols = .{
3108            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3109            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3110            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3111        },
3112        .encode = .{ .fcmle, .Dd, .Dn, .zero },
3113    },
3114    .{
3115        .requires = .{.fullfp16},
3116        .pattern = "FCMLE <Vd>.<T>, <Vn>.<T>, #<0.0>",
3117        .symbols = .{
3118            .Vd = .{ .reg_alias = .vector },
3119            .T = .{ .arrangement = .{ .elem_size = .half } },
3120            .Vn = .{ .reg_alias = .vector },
3121            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3122        },
3123        .encode = .{
3124            .fcmle,
3125            .{ .alias = .Vd, .format = .{ .vector = .T } },
3126            .{ .alias = .Vn, .format = .{ .vector = .T } },
3127            .zero,
3128        },
3129    },
3130    .{
3131        .pattern = "FCMLE <Vd>.<T>, <Vn>.<T>, #<0.0>",
3132        .symbols = .{
3133            .Vd = .{ .reg_alias = .vector },
3134            .T = .{ .arrangement = .{ .elem_size = .single } },
3135            .Vn = .{ .reg_alias = .vector },
3136            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3137        },
3138        .encode = .{
3139            .fcmle,
3140            .{ .alias = .Vd, .format = .{ .vector = .T } },
3141            .{ .alias = .Vn, .format = .{ .vector = .T } },
3142            .zero,
3143        },
3144    },
3145    .{
3146        .pattern = "FCMLE <Vd>.2D, <Vn>.2D, #<0.0>",
3147        .symbols = .{
3148            .Vd = .{ .reg_alias = .vector },
3149            .Vn = .{ .reg_alias = .vector },
3150            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3151        },
3152        .encode = .{
3153            .fcmle,
3154            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3155            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3156            .zero,
3157        },
3158    },
3159    // C7.2.65 FCMLT (zero)
3160    .{
3161        .requires = .{.fullfp16},
3162        .pattern = "FCMLT <Hd>, <Hn>, #<0.0>",
3163        .symbols = .{
3164            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3165            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3166            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3167        },
3168        .encode = .{ .fcmlt, .Hd, .Hn, .zero },
3169    },
3170    .{
3171        .pattern = "FCMLT <Sd>, <Sn>, #<0.0>",
3172        .symbols = .{
3173            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3174            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3175            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3176        },
3177        .encode = .{ .fcmlt, .Sd, .Sn, .zero },
3178    },
3179    .{
3180        .pattern = "FCMLT <Dd>, <Dn>, #<0.0>",
3181        .symbols = .{
3182            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3183            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3184            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3185        },
3186        .encode = .{ .fcmlt, .Dd, .Dn, .zero },
3187    },
3188    .{
3189        .requires = .{.fullfp16},
3190        .pattern = "FCMLT <Vd>.<T>, <Vn>.<T>, #<0.0>",
3191        .symbols = .{
3192            .Vd = .{ .reg_alias = .vector },
3193            .T = .{ .arrangement = .{ .elem_size = .half } },
3194            .Vn = .{ .reg_alias = .vector },
3195            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3196        },
3197        .encode = .{
3198            .fcmlt,
3199            .{ .alias = .Vd, .format = .{ .vector = .T } },
3200            .{ .alias = .Vn, .format = .{ .vector = .T } },
3201            .zero,
3202        },
3203    },
3204    .{
3205        .pattern = "FCMLT <Vd>.<T>, <Vn>.<T>, #<0.0>",
3206        .symbols = .{
3207            .Vd = .{ .reg_alias = .vector },
3208            .T = .{ .arrangement = .{ .elem_size = .single } },
3209            .Vn = .{ .reg_alias = .vector },
3210            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3211        },
3212        .encode = .{
3213            .fcmlt,
3214            .{ .alias = .Vd, .format = .{ .vector = .T } },
3215            .{ .alias = .Vn, .format = .{ .vector = .T } },
3216            .zero,
3217        },
3218    },
3219    .{
3220        .pattern = "FCMLT <Vd>.2D, <Vn>.2D, #<0.0>",
3221        .symbols = .{
3222            .Vd = .{ .reg_alias = .vector },
3223            .Vn = .{ .reg_alias = .vector },
3224            .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3225        },
3226        .encode = .{
3227            .fcmlt,
3228            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3229            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3230            .zero,
3231        },
3232    },
3233    // C7.2.70 FCVTAS (vector)
3234    .{
3235        .requires = .{.fullfp16},
3236        .pattern = "FCVTAS <Hd>, <Hn>",
3237        .symbols = .{
3238            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3239            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3240        },
3241        .encode = .{ .fcvtas, .Hd, .Hn },
3242    },
3243    .{
3244        .pattern = "FCVTAS <Sd>, <Sn>",
3245        .symbols = .{
3246            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3247            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3248        },
3249        .encode = .{ .fcvtas, .Sd, .Sn },
3250    },
3251    .{
3252        .pattern = "FCVTAS <Dd>, <Dn>",
3253        .symbols = .{
3254            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3255            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3256        },
3257        .encode = .{ .fcvtas, .Dd, .Dn },
3258    },
3259    .{
3260        .requires = .{.fullfp16},
3261        .pattern = "FCVTAS <Vd>.<T>, <Vn>.<T>",
3262        .symbols = .{
3263            .Vd = .{ .reg_alias = .vector },
3264            .T = .{ .arrangement = .{ .elem_size = .half } },
3265            .Vn = .{ .reg_alias = .vector },
3266        },
3267        .encode = .{
3268            .fcvtas,
3269            .{ .alias = .Vd, .format = .{ .vector = .T } },
3270            .{ .alias = .Vn, .format = .{ .vector = .T } },
3271        },
3272    },
3273    .{
3274        .pattern = "FCVTAS <Vd>.<T>, <Vn>.<T>",
3275        .symbols = .{
3276            .Vd = .{ .reg_alias = .vector },
3277            .T = .{ .arrangement = .{ .elem_size = .single } },
3278            .Vn = .{ .reg_alias = .vector },
3279        },
3280        .encode = .{
3281            .fcvtas,
3282            .{ .alias = .Vd, .format = .{ .vector = .T } },
3283            .{ .alias = .Vn, .format = .{ .vector = .T } },
3284        },
3285    },
3286    .{
3287        .pattern = "FCVTAS <Vd>.2D, <Vn>.2D",
3288        .symbols = .{
3289            .Vd = .{ .reg_alias = .vector },
3290            .Vn = .{ .reg_alias = .vector },
3291        },
3292        .encode = .{
3293            .fcvtas,
3294            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3295            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3296        },
3297    },
3298    // C7.2.71 FCVTAS (scalar)
3299    .{
3300        .requires = .{.fullfp16},
3301        .pattern = "FCVTAS <Wd>, <Hn>",
3302        .symbols = .{
3303            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3304            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3305        },
3306        .encode = .{ .fcvtas, .Wd, .Hn },
3307    },
3308    .{
3309        .requires = .{.fullfp16},
3310        .pattern = "FCVTAS <Xd>, <Hn>",
3311        .symbols = .{
3312            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3313            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3314        },
3315        .encode = .{ .fcvtas, .Xd, .Hn },
3316    },
3317    .{
3318        .pattern = "FCVTAS <Wd>, <Sn>",
3319        .symbols = .{
3320            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3321            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3322        },
3323        .encode = .{ .fcvtas, .Wd, .Sn },
3324    },
3325    .{
3326        .pattern = "FCVTAS <Xd>, <Sn>",
3327        .symbols = .{
3328            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3329            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3330        },
3331        .encode = .{ .fcvtas, .Xd, .Sn },
3332    },
3333    .{
3334        .pattern = "FCVTAS <Wd>, <Dn>",
3335        .symbols = .{
3336            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3337            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3338        },
3339        .encode = .{ .fcvtas, .Wd, .Dn },
3340    },
3341    .{
3342        .pattern = "FCVTAS <Xd>, <Dn>",
3343        .symbols = .{
3344            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3345            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3346        },
3347        .encode = .{ .fcvtas, .Xd, .Dn },
3348    },
3349    // C7.2.72 FCVTAU (vector)
3350    .{
3351        .requires = .{.fullfp16},
3352        .pattern = "FCVTAU <Hd>, <Hn>",
3353        .symbols = .{
3354            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3355            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3356        },
3357        .encode = .{ .fcvtau, .Hd, .Hn },
3358    },
3359    .{
3360        .pattern = "FCVTAU <Sd>, <Sn>",
3361        .symbols = .{
3362            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3363            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3364        },
3365        .encode = .{ .fcvtau, .Sd, .Sn },
3366    },
3367    .{
3368        .pattern = "FCVTAU <Dd>, <Dn>",
3369        .symbols = .{
3370            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3371            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3372        },
3373        .encode = .{ .fcvtau, .Dd, .Dn },
3374    },
3375    .{
3376        .requires = .{.fullfp16},
3377        .pattern = "FCVTAU <Vd>.<T>, <Vn>.<T>",
3378        .symbols = .{
3379            .Vd = .{ .reg_alias = .vector },
3380            .T = .{ .arrangement = .{ .elem_size = .half } },
3381            .Vn = .{ .reg_alias = .vector },
3382        },
3383        .encode = .{
3384            .fcvtau,
3385            .{ .alias = .Vd, .format = .{ .vector = .T } },
3386            .{ .alias = .Vn, .format = .{ .vector = .T } },
3387        },
3388    },
3389    .{
3390        .pattern = "FCVTAU <Vd>.<T>, <Vn>.<T>",
3391        .symbols = .{
3392            .Vd = .{ .reg_alias = .vector },
3393            .T = .{ .arrangement = .{ .elem_size = .single } },
3394            .Vn = .{ .reg_alias = .vector },
3395        },
3396        .encode = .{
3397            .fcvtau,
3398            .{ .alias = .Vd, .format = .{ .vector = .T } },
3399            .{ .alias = .Vn, .format = .{ .vector = .T } },
3400        },
3401    },
3402    .{
3403        .pattern = "FCVTAU <Vd>.2D, <Vn>.2D",
3404        .symbols = .{
3405            .Vd = .{ .reg_alias = .vector },
3406            .Vn = .{ .reg_alias = .vector },
3407        },
3408        .encode = .{
3409            .fcvtau,
3410            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3411            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3412        },
3413    },
3414    // C7.2.73 FCVTAU (scalar)
3415    .{
3416        .requires = .{.fullfp16},
3417        .pattern = "FCVTAU <Wd>, <Hn>",
3418        .symbols = .{
3419            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3420            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3421        },
3422        .encode = .{ .fcvtau, .Wd, .Hn },
3423    },
3424    .{
3425        .requires = .{.fullfp16},
3426        .pattern = "FCVTAU <Xd>, <Hn>",
3427        .symbols = .{
3428            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3429            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3430        },
3431        .encode = .{ .fcvtau, .Xd, .Hn },
3432    },
3433    .{
3434        .pattern = "FCVTAU <Wd>, <Sn>",
3435        .symbols = .{
3436            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3437            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3438        },
3439        .encode = .{ .fcvtau, .Wd, .Sn },
3440    },
3441    .{
3442        .pattern = "FCVTAU <Xd>, <Sn>",
3443        .symbols = .{
3444            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3445            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3446        },
3447        .encode = .{ .fcvtau, .Xd, .Sn },
3448    },
3449    .{
3450        .pattern = "FCVTAU <Wd>, <Dn>",
3451        .symbols = .{
3452            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3453            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3454        },
3455        .encode = .{ .fcvtau, .Wd, .Dn },
3456    },
3457    .{
3458        .pattern = "FCVTAU <Xd>, <Dn>",
3459        .symbols = .{
3460            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3461            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3462        },
3463        .encode = .{ .fcvtau, .Xd, .Dn },
3464    },
3465    // C7.2.75 FCVTMS (vector)
3466    .{
3467        .requires = .{.fullfp16},
3468        .pattern = "FCVTMS <Hd>, <Hn>",
3469        .symbols = .{
3470            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3471            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3472        },
3473        .encode = .{ .fcvtms, .Hd, .Hn },
3474    },
3475    .{
3476        .pattern = "FCVTMS <Sd>, <Sn>",
3477        .symbols = .{
3478            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3479            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3480        },
3481        .encode = .{ .fcvtms, .Sd, .Sn },
3482    },
3483    .{
3484        .pattern = "FCVTMS <Dd>, <Dn>",
3485        .symbols = .{
3486            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3487            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3488        },
3489        .encode = .{ .fcvtms, .Dd, .Dn },
3490    },
3491    .{
3492        .requires = .{.fullfp16},
3493        .pattern = "FCVTMS <Vd>.<T>, <Vn>.<T>",
3494        .symbols = .{
3495            .Vd = .{ .reg_alias = .vector },
3496            .T = .{ .arrangement = .{ .elem_size = .half } },
3497            .Vn = .{ .reg_alias = .vector },
3498        },
3499        .encode = .{
3500            .fcvtms,
3501            .{ .alias = .Vd, .format = .{ .vector = .T } },
3502            .{ .alias = .Vn, .format = .{ .vector = .T } },
3503        },
3504    },
3505    .{
3506        .pattern = "FCVTMS <Vd>.<T>, <Vn>.<T>",
3507        .symbols = .{
3508            .Vd = .{ .reg_alias = .vector },
3509            .T = .{ .arrangement = .{ .elem_size = .single } },
3510            .Vn = .{ .reg_alias = .vector },
3511        },
3512        .encode = .{
3513            .fcvtms,
3514            .{ .alias = .Vd, .format = .{ .vector = .T } },
3515            .{ .alias = .Vn, .format = .{ .vector = .T } },
3516        },
3517    },
3518    .{
3519        .pattern = "FCVTMS <Vd>.2D, <Vn>.2D",
3520        .symbols = .{
3521            .Vd = .{ .reg_alias = .vector },
3522            .Vn = .{ .reg_alias = .vector },
3523        },
3524        .encode = .{
3525            .fcvtms,
3526            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3527            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3528        },
3529    },
3530    // C7.2.76 FCVTMS (scalar)
3531    .{
3532        .requires = .{.fullfp16},
3533        .pattern = "FCVTMS <Wd>, <Hn>",
3534        .symbols = .{
3535            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3536            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3537        },
3538        .encode = .{ .fcvtms, .Wd, .Hn },
3539    },
3540    .{
3541        .requires = .{.fullfp16},
3542        .pattern = "FCVTMS <Xd>, <Hn>",
3543        .symbols = .{
3544            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3545            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3546        },
3547        .encode = .{ .fcvtms, .Xd, .Hn },
3548    },
3549    .{
3550        .pattern = "FCVTMS <Wd>, <Sn>",
3551        .symbols = .{
3552            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3553            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3554        },
3555        .encode = .{ .fcvtms, .Wd, .Sn },
3556    },
3557    .{
3558        .pattern = "FCVTMS <Xd>, <Sn>",
3559        .symbols = .{
3560            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3561            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3562        },
3563        .encode = .{ .fcvtms, .Xd, .Sn },
3564    },
3565    .{
3566        .pattern = "FCVTMS <Wd>, <Dn>",
3567        .symbols = .{
3568            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3569            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3570        },
3571        .encode = .{ .fcvtms, .Wd, .Dn },
3572    },
3573    .{
3574        .pattern = "FCVTMS <Xd>, <Dn>",
3575        .symbols = .{
3576            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3577            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3578        },
3579        .encode = .{ .fcvtms, .Xd, .Dn },
3580    },
3581    // C7.2.77 FCVTMU (vector)
3582    .{
3583        .requires = .{.fullfp16},
3584        .pattern = "FCVTMU <Hd>, <Hn>",
3585        .symbols = .{
3586            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3587            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3588        },
3589        .encode = .{ .fcvtmu, .Hd, .Hn },
3590    },
3591    .{
3592        .pattern = "FCVTMU <Sd>, <Sn>",
3593        .symbols = .{
3594            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3595            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3596        },
3597        .encode = .{ .fcvtmu, .Sd, .Sn },
3598    },
3599    .{
3600        .pattern = "FCVTMU <Dd>, <Dn>",
3601        .symbols = .{
3602            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3603            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3604        },
3605        .encode = .{ .fcvtmu, .Dd, .Dn },
3606    },
3607    .{
3608        .requires = .{.fullfp16},
3609        .pattern = "FCVTMU <Vd>.<T>, <Vn>.<T>",
3610        .symbols = .{
3611            .Vd = .{ .reg_alias = .vector },
3612            .T = .{ .arrangement = .{ .elem_size = .half } },
3613            .Vn = .{ .reg_alias = .vector },
3614        },
3615        .encode = .{
3616            .fcvtmu,
3617            .{ .alias = .Vd, .format = .{ .vector = .T } },
3618            .{ .alias = .Vn, .format = .{ .vector = .T } },
3619        },
3620    },
3621    .{
3622        .pattern = "FCVTMU <Vd>.<T>, <Vn>.<T>",
3623        .symbols = .{
3624            .Vd = .{ .reg_alias = .vector },
3625            .T = .{ .arrangement = .{ .elem_size = .single } },
3626            .Vn = .{ .reg_alias = .vector },
3627        },
3628        .encode = .{
3629            .fcvtmu,
3630            .{ .alias = .Vd, .format = .{ .vector = .T } },
3631            .{ .alias = .Vn, .format = .{ .vector = .T } },
3632        },
3633    },
3634    .{
3635        .pattern = "FCVTMU <Vd>.2D, <Vn>.2D",
3636        .symbols = .{
3637            .Vd = .{ .reg_alias = .vector },
3638            .Vn = .{ .reg_alias = .vector },
3639        },
3640        .encode = .{
3641            .fcvtmu,
3642            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3643            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3644        },
3645    },
3646    // C7.2.78 FCVTMU (scalar)
3647    .{
3648        .requires = .{.fullfp16},
3649        .pattern = "FCVTMU <Wd>, <Hn>",
3650        .symbols = .{
3651            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3652            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3653        },
3654        .encode = .{ .fcvtmu, .Wd, .Hn },
3655    },
3656    .{
3657        .requires = .{.fullfp16},
3658        .pattern = "FCVTMU <Xd>, <Hn>",
3659        .symbols = .{
3660            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3661            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3662        },
3663        .encode = .{ .fcvtmu, .Xd, .Hn },
3664    },
3665    .{
3666        .pattern = "FCVTMU <Wd>, <Sn>",
3667        .symbols = .{
3668            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3669            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3670        },
3671        .encode = .{ .fcvtmu, .Wd, .Sn },
3672    },
3673    .{
3674        .pattern = "FCVTMU <Xd>, <Sn>",
3675        .symbols = .{
3676            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3677            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3678        },
3679        .encode = .{ .fcvtmu, .Xd, .Sn },
3680    },
3681    .{
3682        .pattern = "FCVTMU <Wd>, <Dn>",
3683        .symbols = .{
3684            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3685            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3686        },
3687        .encode = .{ .fcvtmu, .Wd, .Dn },
3688    },
3689    .{
3690        .pattern = "FCVTMU <Xd>, <Dn>",
3691        .symbols = .{
3692            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3693            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3694        },
3695        .encode = .{ .fcvtmu, .Xd, .Dn },
3696    },
3697    // C7.2.80 FCVTNS (vector)
3698    .{
3699        .requires = .{.fullfp16},
3700        .pattern = "FCVTNS <Hd>, <Hn>",
3701        .symbols = .{
3702            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3703            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3704        },
3705        .encode = .{ .fcvtns, .Hd, .Hn },
3706    },
3707    .{
3708        .pattern = "FCVTNS <Sd>, <Sn>",
3709        .symbols = .{
3710            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3711            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3712        },
3713        .encode = .{ .fcvtns, .Sd, .Sn },
3714    },
3715    .{
3716        .pattern = "FCVTNS <Dd>, <Dn>",
3717        .symbols = .{
3718            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3719            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3720        },
3721        .encode = .{ .fcvtns, .Dd, .Dn },
3722    },
3723    .{
3724        .requires = .{.fullfp16},
3725        .pattern = "FCVTNS <Vd>.<T>, <Vn>.<T>",
3726        .symbols = .{
3727            .Vd = .{ .reg_alias = .vector },
3728            .T = .{ .arrangement = .{ .elem_size = .half } },
3729            .Vn = .{ .reg_alias = .vector },
3730        },
3731        .encode = .{
3732            .fcvtns,
3733            .{ .alias = .Vd, .format = .{ .vector = .T } },
3734            .{ .alias = .Vn, .format = .{ .vector = .T } },
3735        },
3736    },
3737    .{
3738        .pattern = "FCVTNS <Vd>.<T>, <Vn>.<T>",
3739        .symbols = .{
3740            .Vd = .{ .reg_alias = .vector },
3741            .T = .{ .arrangement = .{ .elem_size = .single } },
3742            .Vn = .{ .reg_alias = .vector },
3743        },
3744        .encode = .{
3745            .fcvtns,
3746            .{ .alias = .Vd, .format = .{ .vector = .T } },
3747            .{ .alias = .Vn, .format = .{ .vector = .T } },
3748        },
3749    },
3750    .{
3751        .pattern = "FCVTNS <Vd>.2D, <Vn>.2D",
3752        .symbols = .{
3753            .Vd = .{ .reg_alias = .vector },
3754            .Vn = .{ .reg_alias = .vector },
3755        },
3756        .encode = .{
3757            .fcvtns,
3758            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3759            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3760        },
3761    },
3762    // C7.2.81 FCVTNS (scalar)
3763    .{
3764        .requires = .{.fullfp16},
3765        .pattern = "FCVTNS <Wd>, <Hn>",
3766        .symbols = .{
3767            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3768            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3769        },
3770        .encode = .{ .fcvtns, .Wd, .Hn },
3771    },
3772    .{
3773        .requires = .{.fullfp16},
3774        .pattern = "FCVTNS <Xd>, <Hn>",
3775        .symbols = .{
3776            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3777            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3778        },
3779        .encode = .{ .fcvtns, .Xd, .Hn },
3780    },
3781    .{
3782        .pattern = "FCVTNS <Wd>, <Sn>",
3783        .symbols = .{
3784            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3785            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3786        },
3787        .encode = .{ .fcvtns, .Wd, .Sn },
3788    },
3789    .{
3790        .pattern = "FCVTNS <Xd>, <Sn>",
3791        .symbols = .{
3792            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3793            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3794        },
3795        .encode = .{ .fcvtns, .Xd, .Sn },
3796    },
3797    .{
3798        .pattern = "FCVTNS <Wd>, <Dn>",
3799        .symbols = .{
3800            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3801            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3802        },
3803        .encode = .{ .fcvtns, .Wd, .Dn },
3804    },
3805    .{
3806        .pattern = "FCVTNS <Xd>, <Dn>",
3807        .symbols = .{
3808            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3809            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3810        },
3811        .encode = .{ .fcvtns, .Xd, .Dn },
3812    },
3813    // C7.2.82 FCVTNU (vector)
3814    .{
3815        .requires = .{.fullfp16},
3816        .pattern = "FCVTNU <Hd>, <Hn>",
3817        .symbols = .{
3818            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3819            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3820        },
3821        .encode = .{ .fcvtnu, .Hd, .Hn },
3822    },
3823    .{
3824        .pattern = "FCVTNU <Sd>, <Sn>",
3825        .symbols = .{
3826            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3827            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3828        },
3829        .encode = .{ .fcvtnu, .Sd, .Sn },
3830    },
3831    .{
3832        .pattern = "FCVTNU <Dd>, <Dn>",
3833        .symbols = .{
3834            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3835            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3836        },
3837        .encode = .{ .fcvtnu, .Dd, .Dn },
3838    },
3839    .{
3840        .requires = .{.fullfp16},
3841        .pattern = "FCVTNU <Vd>.<T>, <Vn>.<T>",
3842        .symbols = .{
3843            .Vd = .{ .reg_alias = .vector },
3844            .T = .{ .arrangement = .{ .elem_size = .half } },
3845            .Vn = .{ .reg_alias = .vector },
3846        },
3847        .encode = .{
3848            .fcvtnu,
3849            .{ .alias = .Vd, .format = .{ .vector = .T } },
3850            .{ .alias = .Vn, .format = .{ .vector = .T } },
3851        },
3852    },
3853    .{
3854        .pattern = "FCVTNU <Vd>.<T>, <Vn>.<T>",
3855        .symbols = .{
3856            .Vd = .{ .reg_alias = .vector },
3857            .T = .{ .arrangement = .{ .elem_size = .single } },
3858            .Vn = .{ .reg_alias = .vector },
3859        },
3860        .encode = .{
3861            .fcvtnu,
3862            .{ .alias = .Vd, .format = .{ .vector = .T } },
3863            .{ .alias = .Vn, .format = .{ .vector = .T } },
3864        },
3865    },
3866    .{
3867        .pattern = "FCVTNU <Vd>.2D, <Vn>.2D",
3868        .symbols = .{
3869            .Vd = .{ .reg_alias = .vector },
3870            .Vn = .{ .reg_alias = .vector },
3871        },
3872        .encode = .{
3873            .fcvtnu,
3874            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3875            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3876        },
3877    },
3878    // C7.2.83 FCVTNU (scalar)
3879    .{
3880        .requires = .{.fullfp16},
3881        .pattern = "FCVTNU <Wd>, <Hn>",
3882        .symbols = .{
3883            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3884            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3885        },
3886        .encode = .{ .fcvtnu, .Wd, .Hn },
3887    },
3888    .{
3889        .requires = .{.fullfp16},
3890        .pattern = "FCVTNU <Xd>, <Hn>",
3891        .symbols = .{
3892            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3893            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3894        },
3895        .encode = .{ .fcvtnu, .Xd, .Hn },
3896    },
3897    .{
3898        .pattern = "FCVTNU <Wd>, <Sn>",
3899        .symbols = .{
3900            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3901            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3902        },
3903        .encode = .{ .fcvtnu, .Wd, .Sn },
3904    },
3905    .{
3906        .pattern = "FCVTNU <Xd>, <Sn>",
3907        .symbols = .{
3908            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3909            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3910        },
3911        .encode = .{ .fcvtnu, .Xd, .Sn },
3912    },
3913    .{
3914        .pattern = "FCVTNU <Wd>, <Dn>",
3915        .symbols = .{
3916            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3917            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3918        },
3919        .encode = .{ .fcvtnu, .Wd, .Dn },
3920    },
3921    .{
3922        .pattern = "FCVTNU <Xd>, <Dn>",
3923        .symbols = .{
3924            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3925            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3926        },
3927        .encode = .{ .fcvtnu, .Xd, .Dn },
3928    },
3929    // C7.2.84 FCVTPS (vector)
3930    .{
3931        .requires = .{.fullfp16},
3932        .pattern = "FCVTPS <Hd>, <Hn>",
3933        .symbols = .{
3934            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3935            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3936        },
3937        .encode = .{ .fcvtps, .Hd, .Hn },
3938    },
3939    .{
3940        .pattern = "FCVTPS <Sd>, <Sn>",
3941        .symbols = .{
3942            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3943            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3944        },
3945        .encode = .{ .fcvtps, .Sd, .Sn },
3946    },
3947    .{
3948        .pattern = "FCVTPS <Dd>, <Dn>",
3949        .symbols = .{
3950            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3951            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3952        },
3953        .encode = .{ .fcvtps, .Dd, .Dn },
3954    },
3955    .{
3956        .requires = .{.fullfp16},
3957        .pattern = "FCVTPS <Vd>.<T>, <Vn>.<T>",
3958        .symbols = .{
3959            .Vd = .{ .reg_alias = .vector },
3960            .T = .{ .arrangement = .{ .elem_size = .half } },
3961            .Vn = .{ .reg_alias = .vector },
3962        },
3963        .encode = .{
3964            .fcvtps,
3965            .{ .alias = .Vd, .format = .{ .vector = .T } },
3966            .{ .alias = .Vn, .format = .{ .vector = .T } },
3967        },
3968    },
3969    .{
3970        .pattern = "FCVTPS <Vd>.<T>, <Vn>.<T>",
3971        .symbols = .{
3972            .Vd = .{ .reg_alias = .vector },
3973            .T = .{ .arrangement = .{ .elem_size = .single } },
3974            .Vn = .{ .reg_alias = .vector },
3975        },
3976        .encode = .{
3977            .fcvtps,
3978            .{ .alias = .Vd, .format = .{ .vector = .T } },
3979            .{ .alias = .Vn, .format = .{ .vector = .T } },
3980        },
3981    },
3982    .{
3983        .pattern = "FCVTPS <Vd>.2D, <Vn>.2D",
3984        .symbols = .{
3985            .Vd = .{ .reg_alias = .vector },
3986            .Vn = .{ .reg_alias = .vector },
3987        },
3988        .encode = .{
3989            .fcvtps,
3990            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3991            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3992        },
3993    },
3994    // C7.2.85 FCVTPS (scalar)
3995    .{
3996        .requires = .{.fullfp16},
3997        .pattern = "FCVTPS <Wd>, <Hn>",
3998        .symbols = .{
3999            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4000            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4001        },
4002        .encode = .{ .fcvtps, .Wd, .Hn },
4003    },
4004    .{
4005        .requires = .{.fullfp16},
4006        .pattern = "FCVTPS <Xd>, <Hn>",
4007        .symbols = .{
4008            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4009            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4010        },
4011        .encode = .{ .fcvtps, .Xd, .Hn },
4012    },
4013    .{
4014        .pattern = "FCVTPS <Wd>, <Sn>",
4015        .symbols = .{
4016            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4017            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4018        },
4019        .encode = .{ .fcvtps, .Wd, .Sn },
4020    },
4021    .{
4022        .pattern = "FCVTPS <Xd>, <Sn>",
4023        .symbols = .{
4024            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4025            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4026        },
4027        .encode = .{ .fcvtps, .Xd, .Sn },
4028    },
4029    .{
4030        .pattern = "FCVTPS <Wd>, <Dn>",
4031        .symbols = .{
4032            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4033            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4034        },
4035        .encode = .{ .fcvtps, .Wd, .Dn },
4036    },
4037    .{
4038        .pattern = "FCVTPS <Xd>, <Dn>",
4039        .symbols = .{
4040            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4041            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4042        },
4043        .encode = .{ .fcvtps, .Xd, .Dn },
4044    },
4045    // C7.2.86 FCVTPU (vector)
4046    .{
4047        .requires = .{.fullfp16},
4048        .pattern = "FCVTPU <Hd>, <Hn>",
4049        .symbols = .{
4050            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4051            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4052        },
4053        .encode = .{ .fcvtpu, .Hd, .Hn },
4054    },
4055    .{
4056        .pattern = "FCVTPU <Sd>, <Sn>",
4057        .symbols = .{
4058            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4059            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4060        },
4061        .encode = .{ .fcvtpu, .Sd, .Sn },
4062    },
4063    .{
4064        .pattern = "FCVTPU <Dd>, <Dn>",
4065        .symbols = .{
4066            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4067            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4068        },
4069        .encode = .{ .fcvtpu, .Dd, .Dn },
4070    },
4071    .{
4072        .requires = .{.fullfp16},
4073        .pattern = "FCVTPU <Vd>.<T>, <Vn>.<T>",
4074        .symbols = .{
4075            .Vd = .{ .reg_alias = .vector },
4076            .T = .{ .arrangement = .{ .elem_size = .half } },
4077            .Vn = .{ .reg_alias = .vector },
4078        },
4079        .encode = .{
4080            .fcvtpu,
4081            .{ .alias = .Vd, .format = .{ .vector = .T } },
4082            .{ .alias = .Vn, .format = .{ .vector = .T } },
4083        },
4084    },
4085    .{
4086        .pattern = "FCVTPU <Vd>.<T>, <Vn>.<T>",
4087        .symbols = .{
4088            .Vd = .{ .reg_alias = .vector },
4089            .T = .{ .arrangement = .{ .elem_size = .single } },
4090            .Vn = .{ .reg_alias = .vector },
4091        },
4092        .encode = .{
4093            .fcvtpu,
4094            .{ .alias = .Vd, .format = .{ .vector = .T } },
4095            .{ .alias = .Vn, .format = .{ .vector = .T } },
4096        },
4097    },
4098    .{
4099        .pattern = "FCVTPU <Vd>.2D, <Vn>.2D",
4100        .symbols = .{
4101            .Vd = .{ .reg_alias = .vector },
4102            .Vn = .{ .reg_alias = .vector },
4103        },
4104        .encode = .{
4105            .fcvtpu,
4106            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4107            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4108        },
4109    },
4110    // C7.2.87 FCVTPU (scalar)
4111    .{
4112        .requires = .{.fullfp16},
4113        .pattern = "FCVTPU <Wd>, <Hn>",
4114        .symbols = .{
4115            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4116            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4117        },
4118        .encode = .{ .fcvtpu, .Wd, .Hn },
4119    },
4120    .{
4121        .requires = .{.fullfp16},
4122        .pattern = "FCVTPU <Xd>, <Hn>",
4123        .symbols = .{
4124            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4125            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4126        },
4127        .encode = .{ .fcvtpu, .Xd, .Hn },
4128    },
4129    .{
4130        .pattern = "FCVTPU <Wd>, <Sn>",
4131        .symbols = .{
4132            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4133            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4134        },
4135        .encode = .{ .fcvtpu, .Wd, .Sn },
4136    },
4137    .{
4138        .pattern = "FCVTPU <Xd>, <Sn>",
4139        .symbols = .{
4140            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4141            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4142        },
4143        .encode = .{ .fcvtpu, .Xd, .Sn },
4144    },
4145    .{
4146        .pattern = "FCVTPU <Wd>, <Dn>",
4147        .symbols = .{
4148            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4149            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4150        },
4151        .encode = .{ .fcvtpu, .Wd, .Dn },
4152    },
4153    .{
4154        .pattern = "FCVTPU <Xd>, <Dn>",
4155        .symbols = .{
4156            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4157            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4158        },
4159        .encode = .{ .fcvtpu, .Xd, .Dn },
4160    },
4161    // C7.2.90 FCVTZS (vector, integer)
4162    .{
4163        .requires = .{.fullfp16},
4164        .pattern = "FCVTZS <Hd>, <Hn>",
4165        .symbols = .{
4166            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4167            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4168        },
4169        .encode = .{ .fcvtzs, .Hd, .Hn },
4170    },
4171    .{
4172        .pattern = "FCVTZS <Sd>, <Sn>",
4173        .symbols = .{
4174            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4175            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4176        },
4177        .encode = .{ .fcvtzs, .Sd, .Sn },
4178    },
4179    .{
4180        .pattern = "FCVTZS <Dd>, <Dn>",
4181        .symbols = .{
4182            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4183            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4184        },
4185        .encode = .{ .fcvtzs, .Dd, .Dn },
4186    },
4187    .{
4188        .requires = .{.fullfp16},
4189        .pattern = "FCVTZS <Vd>.<T>, <Vn>.<T>",
4190        .symbols = .{
4191            .Vd = .{ .reg_alias = .vector },
4192            .T = .{ .arrangement = .{ .elem_size = .half } },
4193            .Vn = .{ .reg_alias = .vector },
4194        },
4195        .encode = .{
4196            .fcvtzs,
4197            .{ .alias = .Vd, .format = .{ .vector = .T } },
4198            .{ .alias = .Vn, .format = .{ .vector = .T } },
4199        },
4200    },
4201    .{
4202        .pattern = "FCVTZS <Vd>.<T>, <Vn>.<T>",
4203        .symbols = .{
4204            .Vd = .{ .reg_alias = .vector },
4205            .T = .{ .arrangement = .{ .elem_size = .single } },
4206            .Vn = .{ .reg_alias = .vector },
4207        },
4208        .encode = .{
4209            .fcvtzs,
4210            .{ .alias = .Vd, .format = .{ .vector = .T } },
4211            .{ .alias = .Vn, .format = .{ .vector = .T } },
4212        },
4213    },
4214    .{
4215        .pattern = "FCVTZS <Vd>.2D, <Vn>.2D",
4216        .symbols = .{
4217            .Vd = .{ .reg_alias = .vector },
4218            .Vn = .{ .reg_alias = .vector },
4219        },
4220        .encode = .{
4221            .fcvtzs,
4222            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4223            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4224        },
4225    },
4226    // C7.2.92 FCVTZS (scalar, integer)
4227    .{
4228        .requires = .{.fullfp16},
4229        .pattern = "FCVTZS <Wd>, <Hn>",
4230        .symbols = .{
4231            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4232            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4233        },
4234        .encode = .{ .fcvtzs, .Wd, .Hn },
4235    },
4236    .{
4237        .requires = .{.fullfp16},
4238        .pattern = "FCVTZS <Xd>, <Hn>",
4239        .symbols = .{
4240            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4241            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4242        },
4243        .encode = .{ .fcvtzs, .Xd, .Hn },
4244    },
4245    .{
4246        .pattern = "FCVTZS <Wd>, <Sn>",
4247        .symbols = .{
4248            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4249            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4250        },
4251        .encode = .{ .fcvtzs, .Wd, .Sn },
4252    },
4253    .{
4254        .pattern = "FCVTZS <Xd>, <Sn>",
4255        .symbols = .{
4256            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4257            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4258        },
4259        .encode = .{ .fcvtzs, .Xd, .Sn },
4260    },
4261    .{
4262        .pattern = "FCVTZS <Wd>, <Dn>",
4263        .symbols = .{
4264            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4265            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4266        },
4267        .encode = .{ .fcvtzs, .Wd, .Dn },
4268    },
4269    .{
4270        .pattern = "FCVTZS <Xd>, <Dn>",
4271        .symbols = .{
4272            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4273            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4274        },
4275        .encode = .{ .fcvtzs, .Xd, .Dn },
4276    },
4277    // C7.2.94 FCVTZU (vector, integer)
4278    .{
4279        .requires = .{.fullfp16},
4280        .pattern = "FCVTZU <Hd>, <Hn>",
4281        .symbols = .{
4282            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4283            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4284        },
4285        .encode = .{ .fcvtzu, .Hd, .Hn },
4286    },
4287    .{
4288        .pattern = "FCVTZU <Sd>, <Sn>",
4289        .symbols = .{
4290            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4291            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4292        },
4293        .encode = .{ .fcvtzu, .Sd, .Sn },
4294    },
4295    .{
4296        .pattern = "FCVTZU <Dd>, <Dn>",
4297        .symbols = .{
4298            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4299            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4300        },
4301        .encode = .{ .fcvtzu, .Dd, .Dn },
4302    },
4303    .{
4304        .requires = .{.fullfp16},
4305        .pattern = "FCVTZU <Vd>.<T>, <Vn>.<T>",
4306        .symbols = .{
4307            .Vd = .{ .reg_alias = .vector },
4308            .T = .{ .arrangement = .{ .elem_size = .half } },
4309            .Vn = .{ .reg_alias = .vector },
4310        },
4311        .encode = .{
4312            .fcvtzu,
4313            .{ .alias = .Vd, .format = .{ .vector = .T } },
4314            .{ .alias = .Vn, .format = .{ .vector = .T } },
4315        },
4316    },
4317    .{
4318        .pattern = "FCVTZU <Vd>.<T>, <Vn>.<T>",
4319        .symbols = .{
4320            .Vd = .{ .reg_alias = .vector },
4321            .T = .{ .arrangement = .{ .elem_size = .single } },
4322            .Vn = .{ .reg_alias = .vector },
4323        },
4324        .encode = .{
4325            .fcvtzu,
4326            .{ .alias = .Vd, .format = .{ .vector = .T } },
4327            .{ .alias = .Vn, .format = .{ .vector = .T } },
4328        },
4329    },
4330    .{
4331        .pattern = "FCVTZU <Vd>.2D, <Vn>.2D",
4332        .symbols = .{
4333            .Vd = .{ .reg_alias = .vector },
4334            .Vn = .{ .reg_alias = .vector },
4335        },
4336        .encode = .{
4337            .fcvtzu,
4338            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4339            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4340        },
4341    },
4342    // C7.2.96 FCVTZU (scalar, integer)
4343    .{
4344        .requires = .{.fullfp16},
4345        .pattern = "FCVTZU <Wd>, <Hn>",
4346        .symbols = .{
4347            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4348            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4349        },
4350        .encode = .{ .fcvtzu, .Wd, .Hn },
4351    },
4352    .{
4353        .requires = .{.fullfp16},
4354        .pattern = "FCVTZU <Xd>, <Hn>",
4355        .symbols = .{
4356            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4357            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4358        },
4359        .encode = .{ .fcvtzu, .Xd, .Hn },
4360    },
4361    .{
4362        .pattern = "FCVTZU <Wd>, <Sn>",
4363        .symbols = .{
4364            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4365            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4366        },
4367        .encode = .{ .fcvtzu, .Wd, .Sn },
4368    },
4369    .{
4370        .pattern = "FCVTZU <Xd>, <Sn>",
4371        .symbols = .{
4372            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4373            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4374        },
4375        .encode = .{ .fcvtzu, .Xd, .Sn },
4376    },
4377    .{
4378        .pattern = "FCVTZU <Wd>, <Dn>",
4379        .symbols = .{
4380            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4381            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4382        },
4383        .encode = .{ .fcvtzu, .Wd, .Dn },
4384    },
4385    .{
4386        .pattern = "FCVTZU <Xd>, <Dn>",
4387        .symbols = .{
4388            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4389            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4390        },
4391        .encode = .{ .fcvtzu, .Xd, .Dn },
4392    },
4393    // C7.2.129 FMOV (vector, immediate)
4394    .{
4395        .requires = .{.fullfp16},
4396        .pattern = "FMOV <Vd>.<T>, #<imm>",
4397        .symbols = .{
4398            .Vd = .{ .reg_alias = .vector },
4399            .T = .{ .arrangement = .{ .elem_size = .half } },
4400            .imm = .{ .fimm = .{} },
4401        },
4402        .encode = .{ .fmov, .{ .alias = .Vd, .format = .{ .vector = .T } }, .{ .immediate = .imm } },
4403    },
4404    .{
4405        .pattern = "FMOV <Vd>.<T>, #<imm>",
4406        .symbols = .{
4407            .Vd = .{ .reg_alias = .vector },
4408            .T = .{ .arrangement = .{ .elem_size = .single } },
4409            .imm = .{ .fimm = .{} },
4410        },
4411        .encode = .{ .fmov, .{ .alias = .Vd, .format = .{ .vector = .T } }, .{ .immediate = .imm } },
4412    },
4413    .{
4414        .pattern = "FMOV <Vd>.2D, #<imm>",
4415        .symbols = .{
4416            .Vd = .{ .reg_alias = .vector },
4417            .imm = .{ .fimm = .{} },
4418        },
4419        .encode = .{ .fmov, .{ .alias = .Vd, .format = .{ .vector = .@"2d" } }, .{ .immediate = .imm } },
4420    },
4421    // C7.2.130 FMOV (register)
4422    .{
4423        .requires = .{.fullfp16},
4424        .pattern = "FMOV <Hd>, <Hn>",
4425        .symbols = .{
4426            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4427            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4428        },
4429        .encode = .{ .fmov, .Hd, .{ .register = .Hn } },
4430    },
4431    .{
4432        .pattern = "FMOV <Sd>, <Sn>",
4433        .symbols = .{
4434            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4435            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4436        },
4437        .encode = .{ .fmov, .Sd, .{ .register = .Sn } },
4438    },
4439    .{
4440        .pattern = "FMOV <Dd>, <Dn>",
4441        .symbols = .{
4442            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4443            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4444        },
4445        .encode = .{ .fmov, .Dd, .{ .register = .Dn } },
4446    },
4447    // C7.2.131 FMOV (general)
4448    .{
4449        .requires = .{.fullfp16},
4450        .pattern = "FMOV <Wd>, <Hn>",
4451        .symbols = .{
4452            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4453            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4454        },
4455        .encode = .{ .fmov, .Wd, .{ .register = .Hn } },
4456    },
4457    .{
4458        .requires = .{.fullfp16},
4459        .pattern = "FMOV <Xd>, <Hn>",
4460        .symbols = .{
4461            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4462            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4463        },
4464        .encode = .{ .fmov, .Xd, .{ .register = .Hn } },
4465    },
4466    .{
4467        .requires = .{.fullfp16},
4468        .pattern = "FMOV <Hd>, <Wn>",
4469        .symbols = .{
4470            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4471            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
4472        },
4473        .encode = .{ .fmov, .Hd, .{ .register = .Wn } },
4474    },
4475    .{
4476        .pattern = "FMOV <Sd>, <Wn>",
4477        .symbols = .{
4478            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4479            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
4480        },
4481        .encode = .{ .fmov, .Sd, .{ .register = .Wn } },
4482    },
4483    .{
4484        .pattern = "FMOV <Wd>, <Sn>",
4485        .symbols = .{
4486            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4487            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4488        },
4489        .encode = .{ .fmov, .Wd, .{ .register = .Sn } },
4490    },
4491    .{
4492        .requires = .{.fullfp16},
4493        .pattern = "FMOV <Hd>, <Xn>",
4494        .symbols = .{
4495            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4496            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4497        },
4498        .encode = .{ .fmov, .Hd, .{ .register = .Xn } },
4499    },
4500    .{
4501        .pattern = "FMOV <Dd>, <Xn>",
4502        .symbols = .{
4503            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4504            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4505        },
4506        .encode = .{ .fmov, .Dd, .{ .register = .Xn } },
4507    },
4508    .{
4509        .pattern = "FMOV <Vd>.D[<index>], <Xn>",
4510        .symbols = .{
4511            .Vd = .{ .reg_alias = .vector },
4512            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 }, .min_valid = 1 } },
4513            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4514        },
4515        .encode = .{
4516            .fmov,
4517            .{ .alias = .Vd, .format = .{ .element = .{ .size = .double, .index = .index } } },
4518            .{ .register = .Xn },
4519        },
4520    },
4521    .{
4522        .pattern = "FMOV <Xd>, <Dn>",
4523        .symbols = .{
4524            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4525            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4526        },
4527        .encode = .{ .fmov, .Xd, .{ .register = .Dn } },
4528    },
4529    .{
4530        .pattern = "FMOV <Xd>, <Vn>.D[<index>]",
4531        .symbols = .{
4532            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4533            .Vn = .{ .reg_alias = .vector },
4534            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 }, .min_valid = 1 } },
4535        },
4536        .encode = .{ .fmov, .Xd, .{
4537            .register = .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index } } },
4538        } },
4539    },
4540    // C7.2.132 FMOV (scalar, immediate)
4541    .{
4542        .requires = .{.fullfp16},
4543        .pattern = "FMOV <Hd>, #<imm>",
4544        .symbols = .{
4545            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4546            .imm = .{ .fimm = .{} },
4547        },
4548        .encode = .{ .fmov, .Hd, .{ .immediate = .imm } },
4549    },
4550    .{
4551        .pattern = "FMOV <Sd>, #<imm>",
4552        .symbols = .{
4553            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4554            .imm = .{ .fimm = .{} },
4555        },
4556        .encode = .{ .fmov, .Sd, .{ .immediate = .imm } },
4557    },
4558    .{
4559        .pattern = "FMOV <Dd>, #<imm>",
4560        .symbols = .{
4561            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4562            .imm = .{ .fimm = .{} },
4563        },
4564        .encode = .{ .fmov, .Dd, .{ .immediate = .imm } },
4565    },
4566    // C7.2.157 FRINTI (vector)
4567    .{
4568        .requires = .{.fullfp16},
4569        .pattern = "FRINTI <Vd>.<T>, <Vn>.<T>",
4570        .symbols = .{
4571            .Vd = .{ .reg_alias = .vector },
4572            .T = .{ .arrangement = .{ .elem_size = .half } },
4573            .Vn = .{ .reg_alias = .vector },
4574        },
4575        .encode = .{
4576            .frinti,
4577            .{ .alias = .Vd, .format = .{ .vector = .T } },
4578            .{ .alias = .Vn, .format = .{ .vector = .T } },
4579        },
4580    },
4581    .{
4582        .pattern = "FRINTI <Vd>.<T>, <Vn>.<T>",
4583        .symbols = .{
4584            .Vd = .{ .reg_alias = .vector },
4585            .T = .{ .arrangement = .{ .elem_size = .single } },
4586            .Vn = .{ .reg_alias = .vector },
4587        },
4588        .encode = .{
4589            .frinti,
4590            .{ .alias = .Vd, .format = .{ .vector = .T } },
4591            .{ .alias = .Vn, .format = .{ .vector = .T } },
4592        },
4593    },
4594    .{
4595        .pattern = "FRINTI <Vd>.2D, <Vn>.2D",
4596        .symbols = .{
4597            .Vd = .{ .reg_alias = .vector },
4598            .Vn = .{ .reg_alias = .vector },
4599        },
4600        .encode = .{
4601            .frinti,
4602            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4603            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4604        },
4605    },
4606    // C7.2.168 FRINTI (scalar)
4607    .{
4608        .requires = .{.fullfp16},
4609        .pattern = "FRINTI <Hd>, <Hn>",
4610        .symbols = .{
4611            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4612            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4613        },
4614        .encode = .{ .frinti, .Hd, .Hn },
4615    },
4616    .{
4617        .pattern = "FRINTI <Sd>, <Sn>",
4618        .symbols = .{
4619            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4620            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4621        },
4622        .encode = .{ .frinti, .Sd, .Sn },
4623    },
4624    .{
4625        .pattern = "FRINTI <Dd>, <Dn>",
4626        .symbols = .{
4627            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4628            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4629        },
4630        .encode = .{ .frinti, .Dd, .Dn },
4631    },
4632    // C7.2.159 FRINTM (vector)
4633    .{
4634        .requires = .{.fullfp16},
4635        .pattern = "FRINTM <Vd>.<T>, <Vn>.<T>",
4636        .symbols = .{
4637            .Vd = .{ .reg_alias = .vector },
4638            .T = .{ .arrangement = .{ .elem_size = .half } },
4639            .Vn = .{ .reg_alias = .vector },
4640        },
4641        .encode = .{
4642            .frintm,
4643            .{ .alias = .Vd, .format = .{ .vector = .T } },
4644            .{ .alias = .Vn, .format = .{ .vector = .T } },
4645        },
4646    },
4647    .{
4648        .pattern = "FRINTM <Vd>.<T>, <Vn>.<T>",
4649        .symbols = .{
4650            .Vd = .{ .reg_alias = .vector },
4651            .T = .{ .arrangement = .{ .elem_size = .single } },
4652            .Vn = .{ .reg_alias = .vector },
4653        },
4654        .encode = .{
4655            .frintm,
4656            .{ .alias = .Vd, .format = .{ .vector = .T } },
4657            .{ .alias = .Vn, .format = .{ .vector = .T } },
4658        },
4659    },
4660    .{
4661        .pattern = "FRINTM <Vd>.2D, <Vn>.2D",
4662        .symbols = .{
4663            .Vd = .{ .reg_alias = .vector },
4664            .Vn = .{ .reg_alias = .vector },
4665        },
4666        .encode = .{
4667            .frintm,
4668            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4669            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4670        },
4671    },
4672    // C7.2.160 FRINTM (scalar)
4673    .{
4674        .requires = .{.fullfp16},
4675        .pattern = "FRINTM <Hd>, <Hn>",
4676        .symbols = .{
4677            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4678            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4679        },
4680        .encode = .{ .frintm, .Hd, .Hn },
4681    },
4682    .{
4683        .pattern = "FRINTM <Sd>, <Sn>",
4684        .symbols = .{
4685            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4686            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4687        },
4688        .encode = .{ .frintm, .Sd, .Sn },
4689    },
4690    .{
4691        .pattern = "FRINTM <Dd>, <Dn>",
4692        .symbols = .{
4693            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4694            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4695        },
4696        .encode = .{ .frintm, .Dd, .Dn },
4697    },
4698    // C7.2.161 FRINTN (vector)
4699    .{
4700        .requires = .{.fullfp16},
4701        .pattern = "FRINTN <Vd>.<T>, <Vn>.<T>",
4702        .symbols = .{
4703            .Vd = .{ .reg_alias = .vector },
4704            .T = .{ .arrangement = .{ .elem_size = .half } },
4705            .Vn = .{ .reg_alias = .vector },
4706        },
4707        .encode = .{
4708            .frintn,
4709            .{ .alias = .Vd, .format = .{ .vector = .T } },
4710            .{ .alias = .Vn, .format = .{ .vector = .T } },
4711        },
4712    },
4713    .{
4714        .pattern = "FRINTN <Vd>.<T>, <Vn>.<T>",
4715        .symbols = .{
4716            .Vd = .{ .reg_alias = .vector },
4717            .T = .{ .arrangement = .{ .elem_size = .single } },
4718            .Vn = .{ .reg_alias = .vector },
4719        },
4720        .encode = .{
4721            .frintn,
4722            .{ .alias = .Vd, .format = .{ .vector = .T } },
4723            .{ .alias = .Vn, .format = .{ .vector = .T } },
4724        },
4725    },
4726    .{
4727        .pattern = "FRINTN <Vd>.2D, <Vn>.2D",
4728        .symbols = .{
4729            .Vd = .{ .reg_alias = .vector },
4730            .Vn = .{ .reg_alias = .vector },
4731        },
4732        .encode = .{
4733            .frintn,
4734            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4735            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4736        },
4737    },
4738    // C7.2.162 FRINTN (scalar)
4739    .{
4740        .requires = .{.fullfp16},
4741        .pattern = "FRINTN <Hd>, <Hn>",
4742        .symbols = .{
4743            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4744            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4745        },
4746        .encode = .{ .frintn, .Hd, .Hn },
4747    },
4748    .{
4749        .pattern = "FRINTN <Sd>, <Sn>",
4750        .symbols = .{
4751            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4752            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4753        },
4754        .encode = .{ .frintn, .Sd, .Sn },
4755    },
4756    .{
4757        .pattern = "FRINTN <Dd>, <Dn>",
4758        .symbols = .{
4759            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4760            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4761        },
4762        .encode = .{ .frintn, .Dd, .Dn },
4763    },
4764    // C7.2.163 FRINTP (vector)
4765    .{
4766        .requires = .{.fullfp16},
4767        .pattern = "FRINTP <Vd>.<T>, <Vn>.<T>",
4768        .symbols = .{
4769            .Vd = .{ .reg_alias = .vector },
4770            .T = .{ .arrangement = .{ .elem_size = .half } },
4771            .Vn = .{ .reg_alias = .vector },
4772        },
4773        .encode = .{
4774            .frintp,
4775            .{ .alias = .Vd, .format = .{ .vector = .T } },
4776            .{ .alias = .Vn, .format = .{ .vector = .T } },
4777        },
4778    },
4779    .{
4780        .pattern = "FRINTP <Vd>.<T>, <Vn>.<T>",
4781        .symbols = .{
4782            .Vd = .{ .reg_alias = .vector },
4783            .T = .{ .arrangement = .{ .elem_size = .single } },
4784            .Vn = .{ .reg_alias = .vector },
4785        },
4786        .encode = .{
4787            .frintp,
4788            .{ .alias = .Vd, .format = .{ .vector = .T } },
4789            .{ .alias = .Vn, .format = .{ .vector = .T } },
4790        },
4791    },
4792    .{
4793        .pattern = "FRINTP <Vd>.2D, <Vn>.2D",
4794        .symbols = .{
4795            .Vd = .{ .reg_alias = .vector },
4796            .Vn = .{ .reg_alias = .vector },
4797        },
4798        .encode = .{
4799            .frintp,
4800            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4801            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4802        },
4803    },
4804    // C7.2.164 FRINTP (scalar)
4805    .{
4806        .requires = .{.fullfp16},
4807        .pattern = "FRINTP <Hd>, <Hn>",
4808        .symbols = .{
4809            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4810            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4811        },
4812        .encode = .{ .frintp, .Hd, .Hn },
4813    },
4814    .{
4815        .pattern = "FRINTP <Sd>, <Sn>",
4816        .symbols = .{
4817            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4818            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4819        },
4820        .encode = .{ .frintp, .Sd, .Sn },
4821    },
4822    .{
4823        .pattern = "FRINTP <Dd>, <Dn>",
4824        .symbols = .{
4825            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4826            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4827        },
4828        .encode = .{ .frintp, .Dd, .Dn },
4829    },
4830    // C7.2.167 FRINTZ (vector)
4831    .{
4832        .requires = .{.fullfp16},
4833        .pattern = "FRINTZ <Vd>.<T>, <Vn>.<T>",
4834        .symbols = .{
4835            .Vd = .{ .reg_alias = .vector },
4836            .T = .{ .arrangement = .{ .elem_size = .half } },
4837            .Vn = .{ .reg_alias = .vector },
4838        },
4839        .encode = .{
4840            .frintz,
4841            .{ .alias = .Vd, .format = .{ .vector = .T } },
4842            .{ .alias = .Vn, .format = .{ .vector = .T } },
4843        },
4844    },
4845    .{
4846        .pattern = "FRINTZ <Vd>.<T>, <Vn>.<T>",
4847        .symbols = .{
4848            .Vd = .{ .reg_alias = .vector },
4849            .T = .{ .arrangement = .{ .elem_size = .single } },
4850            .Vn = .{ .reg_alias = .vector },
4851        },
4852        .encode = .{
4853            .frintz,
4854            .{ .alias = .Vd, .format = .{ .vector = .T } },
4855            .{ .alias = .Vn, .format = .{ .vector = .T } },
4856        },
4857    },
4858    .{
4859        .pattern = "FRINTZ <Vd>.2D, <Vn>.2D",
4860        .symbols = .{
4861            .Vd = .{ .reg_alias = .vector },
4862            .Vn = .{ .reg_alias = .vector },
4863        },
4864        .encode = .{
4865            .frintz,
4866            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4867            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4868        },
4869    },
4870    // C7.2.168 FRINTZ (scalar)
4871    .{
4872        .requires = .{.fullfp16},
4873        .pattern = "FRINTZ <Hd>, <Hn>",
4874        .symbols = .{
4875            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4876            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4877        },
4878        .encode = .{ .frintz, .Hd, .Hn },
4879    },
4880    .{
4881        .pattern = "FRINTZ <Sd>, <Sn>",
4882        .symbols = .{
4883            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4884            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4885        },
4886        .encode = .{ .frintz, .Sd, .Sn },
4887    },
4888    .{
4889        .pattern = "FRINTZ <Dd>, <Dn>",
4890        .symbols = .{
4891            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4892            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4893        },
4894        .encode = .{ .frintz, .Dd, .Dn },
4895    },
4896    // C7.2.175 INS (element)
4897    .{
4898        .pattern = "INS <Vd>.B[<index1>], <Vn>.B[<index2>]",
4899        .symbols = .{
4900            .Vd = .{ .reg_alias = .vector },
4901            .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
4902            .Vn = .{ .reg_alias = .vector },
4903            .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
4904        },
4905        .encode = .{
4906            .ins,
4907            .{ .alias = .Vd, .format = .{ .element = .{ .size = .byte, .index = .index1 } } },
4908            .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index2 } } },
4909        },
4910    },
4911    .{
4912        .pattern = "INS <Vd>.H[<index1>], <Vn>.H[<index2>]",
4913        .symbols = .{
4914            .Vd = .{ .reg_alias = .vector },
4915            .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
4916            .Vn = .{ .reg_alias = .vector },
4917            .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
4918        },
4919        .encode = .{
4920            .ins,
4921            .{ .alias = .Vd, .format = .{ .element = .{ .size = .half, .index = .index1 } } },
4922            .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index2 } } },
4923        },
4924    },
4925    .{
4926        .pattern = "INS <Vd>.S[<index1>], <Vn>.S[<index2>]",
4927        .symbols = .{
4928            .Vd = .{ .reg_alias = .vector },
4929            .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
4930            .Vn = .{ .reg_alias = .vector },
4931            .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
4932        },
4933        .encode = .{
4934            .ins,
4935            .{ .alias = .Vd, .format = .{ .element = .{ .size = .single, .index = .index1 } } },
4936            .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index2 } } },
4937        },
4938    },
4939    .{
4940        .pattern = "INS <Vd>.D[<index1>], <Vn>.D[<index2>]",
4941        .symbols = .{
4942            .Vd = .{ .reg_alias = .vector },
4943            .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
4944            .Vn = .{ .reg_alias = .vector },
4945            .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
4946        },
4947        .encode = .{
4948            .ins,
4949            .{ .alias = .Vd, .format = .{ .element = .{ .size = .double, .index = .index1 } } },
4950            .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index2 } } },
4951        },
4952    },
4953    // C7.2.176 INS (general)
4954    .{
4955        .pattern = "INS <Vd>.B[<index>], <Wn>",
4956        .symbols = .{
4957            .Vd = .{ .reg_alias = .vector },
4958            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
4959            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
4960        },
4961        .encode = .{
4962            .ins,
4963            .{ .alias = .Vd, .format = .{ .element = .{ .size = .byte, .index = .index } } },
4964            .Wn,
4965        },
4966    },
4967    .{
4968        .pattern = "INS <Vd>.H[<index>], <Wn>",
4969        .symbols = .{
4970            .Vd = .{ .reg_alias = .vector },
4971            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
4972            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
4973        },
4974        .encode = .{
4975            .ins,
4976            .{ .alias = .Vd, .format = .{ .element = .{ .size = .half, .index = .index } } },
4977            .Wn,
4978        },
4979    },
4980    .{
4981        .pattern = "INS <Vd>.S[<index>], <Wn>",
4982        .symbols = .{
4983            .Vd = .{ .reg_alias = .vector },
4984            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
4985            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
4986        },
4987        .encode = .{
4988            .ins,
4989            .{ .alias = .Vd, .format = .{ .element = .{ .size = .single, .index = .index } } },
4990            .Wn,
4991        },
4992    },
4993    .{
4994        .pattern = "INS <Vd>.D[<index>], <Xn>",
4995        .symbols = .{
4996            .Vd = .{ .reg_alias = .vector },
4997            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
4998            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4999        },
5000        .encode = .{
5001            .ins,
5002            .{ .alias = .Vd, .format = .{ .element = .{ .size = .double, .index = .index } } },
5003            .Xn,
5004        },
5005    },
5006    // C7.2.199 MOV (scalar)
5007    .{
5008        .pattern = "MOV <Vd>, <Vn>.B[<index>]",
5009        .symbols = .{
5010            .Vd = .{ .reg = .{ .format = .{ .scalar = .byte } } },
5011            .Vn = .{ .reg_alias = .vector },
5012            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5013        },
5014        .encode = .{
5015            .dup,
5016            .Vd,
5017            .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index } } },
5018        },
5019    },
5020    .{
5021        .pattern = "MOV <Vd>, <Vn>.H[<index>]",
5022        .symbols = .{
5023            .Vd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5024            .Vn = .{ .reg_alias = .vector },
5025            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5026        },
5027        .encode = .{
5028            .dup,
5029            .Vd,
5030            .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index } } },
5031        },
5032    },
5033    .{
5034        .pattern = "MOV <Vd>, <Vn>.S[<index>]",
5035        .symbols = .{
5036            .Vd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5037            .Vn = .{ .reg_alias = .vector },
5038            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5039        },
5040        .encode = .{
5041            .dup,
5042            .Vd,
5043            .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index } } },
5044        },
5045    },
5046    .{
5047        .pattern = "MOV <Vd>, <Vn>.D[<index>]",
5048        .symbols = .{
5049            .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5050            .Vn = .{ .reg_alias = .vector },
5051            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
5052        },
5053        .encode = .{
5054            .dup,
5055            .Vd,
5056            .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index } } },
5057        },
5058    },
5059    // C7.2.200 MOV (element)
5060    .{
5061        .pattern = "MOV <Vd>.B[<index1>], <Vn>.B[<index2>]",
5062        .symbols = .{
5063            .Vd = .{ .reg_alias = .vector },
5064            .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5065            .Vn = .{ .reg_alias = .vector },
5066            .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5067        },
5068        .encode = .{
5069            .ins,
5070            .{ .alias = .Vd, .format = .{ .element = .{ .size = .byte, .index = .index1 } } },
5071            .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index2 } } },
5072        },
5073    },
5074    .{
5075        .pattern = "MOV <Vd>.H[<index1>], <Vn>.H[<index2>]",
5076        .symbols = .{
5077            .Vd = .{ .reg_alias = .vector },
5078            .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5079            .Vn = .{ .reg_alias = .vector },
5080            .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5081        },
5082        .encode = .{
5083            .ins,
5084            .{ .alias = .Vd, .format = .{ .element = .{ .size = .half, .index = .index1 } } },
5085            .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index2 } } },
5086        },
5087    },
5088    .{
5089        .pattern = "MOV <Vd>.S[<index1>], <Vn>.S[<index2>]",
5090        .symbols = .{
5091            .Vd = .{ .reg_alias = .vector },
5092            .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5093            .Vn = .{ .reg_alias = .vector },
5094            .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5095        },
5096        .encode = .{
5097            .ins,
5098            .{ .alias = .Vd, .format = .{ .element = .{ .size = .single, .index = .index1 } } },
5099            .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index2 } } },
5100        },
5101    },
5102    .{
5103        .pattern = "MOV <Vd>.D[<index1>], <Vn>.D[<index2>]",
5104        .symbols = .{
5105            .Vd = .{ .reg_alias = .vector },
5106            .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
5107            .Vn = .{ .reg_alias = .vector },
5108            .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
5109        },
5110        .encode = .{
5111            .ins,
5112            .{ .alias = .Vd, .format = .{ .element = .{ .size = .double, .index = .index1 } } },
5113            .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index2 } } },
5114        },
5115    },
5116    // C7.2.201 MOV (from general)
5117    .{
5118        .pattern = "MOV <Vd>.B[<index>], <Wn>",
5119        .symbols = .{
5120            .Vd = .{ .reg_alias = .vector },
5121            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5122            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5123        },
5124        .encode = .{
5125            .ins,
5126            .{ .alias = .Vd, .format = .{ .element = .{ .size = .byte, .index = .index } } },
5127            .Wn,
5128        },
5129    },
5130    .{
5131        .pattern = "MOV <Vd>.H[<index>], <Wn>",
5132        .symbols = .{
5133            .Vd = .{ .reg_alias = .vector },
5134            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5135            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5136        },
5137        .encode = .{
5138            .ins,
5139            .{ .alias = .Vd, .format = .{ .element = .{ .size = .half, .index = .index } } },
5140            .Wn,
5141        },
5142    },
5143    .{
5144        .pattern = "MOV <Vd>.S[<index>], <Wn>",
5145        .symbols = .{
5146            .Vd = .{ .reg_alias = .vector },
5147            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5148            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5149        },
5150        .encode = .{
5151            .ins,
5152            .{ .alias = .Vd, .format = .{ .element = .{ .size = .single, .index = .index } } },
5153            .Wn,
5154        },
5155    },
5156    .{
5157        .pattern = "MOV <Vd>.D[<index>], <Xn>",
5158        .symbols = .{
5159            .Vd = .{ .reg_alias = .vector },
5160            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
5161            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5162        },
5163        .encode = .{
5164            .ins,
5165            .{ .alias = .Vd, .format = .{ .element = .{ .size = .double, .index = .index } } },
5166            .Xn,
5167        },
5168    },
5169    // C7.2.202 MOV (vector)
5170    .{
5171        .pattern = "MOV <Vd>.<T>, <Vn>.<T>",
5172        .symbols = .{
5173            .Vd = .{ .reg_alias = .vector },
5174            .T = .{ .arrangement = .{ .elem_size = .byte } },
5175            .Vn = .{ .reg_alias = .vector },
5176        },
5177        .encode = .{
5178            .orr,
5179            .{ .alias = .Vd, .format = .{ .vector = .T } },
5180            .{ .alias = .Vn, .format = .{ .vector = .T } },
5181            .{ .register = .{ .alias = .Vn, .format = .{ .vector = .T } } },
5182        },
5183    },
5184    // C7.2.203 MOV (to general)
5185    .{
5186        .pattern = "MOV <Wd>, <Vn>.S[<index>]",
5187        .symbols = .{
5188            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
5189            .Vn = .{ .reg_alias = .vector },
5190            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5191        },
5192        .encode = .{
5193            .umov,
5194            .Wd,
5195            .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index } } },
5196        },
5197    },
5198    .{
5199        .pattern = "MOV <Xd>, <Vn>.D[<index>]",
5200        .symbols = .{
5201            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5202            .Vn = .{ .reg_alias = .vector },
5203            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
5204        },
5205        .encode = .{
5206            .umov,
5207            .Xd,
5208            .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index } } },
5209        },
5210    },
5211    // C7.2.209 NEG (vector)
5212    .{
5213        .pattern = "NEG <Vd>, <Vn>",
5214        .symbols = .{
5215            .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5216            .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
5217        },
5218        .encode = .{ .neg, .Vd, .Vn },
5219    },
5220    .{
5221        .pattern = "NEG <Vd>.<T>, <Vn>.<T>",
5222        .symbols = .{
5223            .Vd = .{ .reg_alias = .vector },
5224            .T = .{ .arrangement = .{ .min_valid_len = 2 } },
5225            .Vn = .{ .reg_alias = .vector },
5226        },
5227        .encode = .{
5228            .neg,
5229            .{ .alias = .Vd, .format = .{ .vector = .T } },
5230            .{ .alias = .Vn, .format = .{ .vector = .T } },
5231        },
5232    },
5233    // C7.2.210 NOT
5234    .{
5235        .pattern = "NOT <Vd>.<T>, <Vn>.<T>",
5236        .symbols = .{
5237            .Vd = .{ .reg_alias = .vector },
5238            .T = .{ .arrangement = .{ .elem_size = .byte } },
5239            .Vn = .{ .reg_alias = .vector },
5240        },
5241        .encode = .{
5242            .not,
5243            .{ .alias = .Vd, .format = .{ .vector = .T } },
5244            .{ .alias = .Vn, .format = .{ .vector = .T } },
5245        },
5246    },
5247    // C7.2.234 SCVTF (vector, integer)
5248    .{
5249        .requires = .{.fullfp16},
5250        .pattern = "SCVTF <Hd>, <Hn>",
5251        .symbols = .{
5252            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5253            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
5254        },
5255        .encode = .{ .scvtf, .Hd, .Hn },
5256    },
5257    .{
5258        .pattern = "SCVTF <Sd>, <Sn>",
5259        .symbols = .{
5260            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5261            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
5262        },
5263        .encode = .{ .scvtf, .Sd, .Sn },
5264    },
5265    .{
5266        .pattern = "SCVTF <Dd>, <Dn>",
5267        .symbols = .{
5268            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5269            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
5270        },
5271        .encode = .{ .scvtf, .Dd, .Dn },
5272    },
5273    .{
5274        .requires = .{.fullfp16},
5275        .pattern = "SCVTF <Vd>.<T>, <Vn>.<T>",
5276        .symbols = .{
5277            .Vd = .{ .reg_alias = .vector },
5278            .T = .{ .arrangement = .{ .elem_size = .half } },
5279            .Vn = .{ .reg_alias = .vector },
5280        },
5281        .encode = .{
5282            .scvtf,
5283            .{ .alias = .Vd, .format = .{ .vector = .T } },
5284            .{ .alias = .Vn, .format = .{ .vector = .T } },
5285        },
5286    },
5287    .{
5288        .pattern = "SCVTF <Vd>.<T>, <Vn>.<T>",
5289        .symbols = .{
5290            .Vd = .{ .reg_alias = .vector },
5291            .T = .{ .arrangement = .{ .elem_size = .single } },
5292            .Vn = .{ .reg_alias = .vector },
5293        },
5294        .encode = .{
5295            .scvtf,
5296            .{ .alias = .Vd, .format = .{ .vector = .T } },
5297            .{ .alias = .Vn, .format = .{ .vector = .T } },
5298        },
5299    },
5300    .{
5301        .pattern = "SCVTF <Vd>.2D, <Vn>.2D",
5302        .symbols = .{
5303            .Vd = .{ .reg_alias = .vector },
5304            .Vn = .{ .reg_alias = .vector },
5305        },
5306        .encode = .{
5307            .scvtf,
5308            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
5309            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
5310        },
5311    },
5312    // C7.2.236 SCVTF (scalar, integer)
5313    .{
5314        .requires = .{.fullfp16},
5315        .pattern = "SCVTF <Hd>, <Wn>",
5316        .symbols = .{
5317            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5318            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5319        },
5320        .encode = .{ .scvtf, .Hd, .Wn },
5321    },
5322    .{
5323        .pattern = "SCVTF <Sd>, <Wn>",
5324        .symbols = .{
5325            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5326            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5327        },
5328        .encode = .{ .scvtf, .Sd, .Wn },
5329    },
5330    .{
5331        .pattern = "SCVTF <Dd>, <Wn>",
5332        .symbols = .{
5333            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5334            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5335        },
5336        .encode = .{ .scvtf, .Dd, .Wn },
5337    },
5338    .{
5339        .requires = .{.fullfp16},
5340        .pattern = "SCVTF <Hd>, <Xn>",
5341        .symbols = .{
5342            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5343            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5344        },
5345        .encode = .{ .scvtf, .Hd, .Xn },
5346    },
5347    .{
5348        .pattern = "SCVTF <Sd>, <Xn>",
5349        .symbols = .{
5350            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5351            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5352        },
5353        .encode = .{ .scvtf, .Sd, .Xn },
5354    },
5355    .{
5356        .pattern = "SCVTF <Dd>, <Xn>",
5357        .symbols = .{
5358            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5359            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5360        },
5361        .encode = .{ .scvtf, .Dd, .Xn },
5362    },
5363    // C7.2.279 SMOV
5364    .{
5365        .pattern = "SMOV <Wd>, <Vn>.B[<index>]",
5366        .symbols = .{
5367            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
5368            .Vn = .{ .reg_alias = .vector },
5369            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5370        },
5371        .encode = .{
5372            .smov,
5373            .Wd,
5374            .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index } } },
5375        },
5376    },
5377    .{
5378        .pattern = "SMOV <Xd>, <Vn>.B[<index>]",
5379        .symbols = .{
5380            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5381            .Vn = .{ .reg_alias = .vector },
5382            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5383        },
5384        .encode = .{
5385            .smov,
5386            .Xd,
5387            .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index } } },
5388        },
5389    },
5390    .{
5391        .pattern = "SMOV <Wd>, <Vn>.H[<index>]",
5392        .symbols = .{
5393            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
5394            .Vn = .{ .reg_alias = .vector },
5395            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5396        },
5397        .encode = .{
5398            .smov,
5399            .Wd,
5400            .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index } } },
5401        },
5402    },
5403    .{
5404        .pattern = "SMOV <Xd>, <Vn>.H[<index>]",
5405        .symbols = .{
5406            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5407            .Vn = .{ .reg_alias = .vector },
5408            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5409        },
5410        .encode = .{
5411            .smov,
5412            .Xd,
5413            .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index } } },
5414        },
5415    },
5416    .{
5417        .pattern = "SMOV <Xd>, <Vn>.S[<index>]",
5418        .symbols = .{
5419            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5420            .Vn = .{ .reg_alias = .vector },
5421            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5422        },
5423        .encode = .{
5424            .smov,
5425            .Xd,
5426            .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index } } },
5427        },
5428    },
5429    // C7.2.282 SQABS
5430    .{
5431        .pattern = "SQABS <Vd>, <Vn>",
5432        .symbols = .{
5433            .Vd = .{ .reg = .{ .format = .{ .scalar = .byte } } },
5434            .Vn = .{ .reg = .{ .format = .{ .scalar = .byte } } },
5435        },
5436        .encode = .{ .sqabs, .Vd, .Vn },
5437    },
5438    .{
5439        .pattern = "SQABS <Vd>, <Vn>",
5440        .symbols = .{
5441            .Vd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5442            .Vn = .{ .reg = .{ .format = .{ .scalar = .half } } },
5443        },
5444        .encode = .{ .sqabs, .Vd, .Vn },
5445    },
5446    .{
5447        .pattern = "SQABS <Vd>, <Vn>",
5448        .symbols = .{
5449            .Vd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5450            .Vn = .{ .reg = .{ .format = .{ .scalar = .single } } },
5451        },
5452        .encode = .{ .sqabs, .Vd, .Vn },
5453    },
5454    .{
5455        .pattern = "SQABS <Vd>, <Vn>",
5456        .symbols = .{
5457            .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5458            .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
5459        },
5460        .encode = .{ .sqabs, .Vd, .Vn },
5461    },
5462    .{
5463        .pattern = "SQABS <Vd>.<T>, <Vn>.<T>",
5464        .symbols = .{
5465            .Vd = .{ .reg_alias = .vector },
5466            .T = .{ .arrangement = .{ .min_valid_len = 2 } },
5467            .Vn = .{ .reg_alias = .vector },
5468        },
5469        .encode = .{
5470            .sqabs,
5471            .{ .alias = .Vd, .format = .{ .vector = .T } },
5472            .{ .alias = .Vn, .format = .{ .vector = .T } },
5473        },
5474    },
5475    // C7.2.308 SQXTN, SQXTN2
5476    .{
5477        .pattern = "SQXTN <Vd>, <Vn>",
5478        .symbols = .{
5479            .Vd = .{ .reg = .{ .format = .{ .scalar = .byte } } },
5480            .Vn = .{ .reg = .{ .format = .{ .scalar = .half } } },
5481        },
5482        .encode = .{ .sqxtn, .Vd, .Vn },
5483    },
5484    .{
5485        .pattern = "SQXTN <Vd>, <Vn>",
5486        .symbols = .{
5487            .Vd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5488            .Vn = .{ .reg = .{ .format = .{ .scalar = .single } } },
5489        },
5490        .encode = .{ .sqxtn, .Vd, .Vn },
5491    },
5492    .{
5493        .pattern = "SQXTN <Vd>, <Vn>",
5494        .symbols = .{
5495            .Vd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5496            .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
5497        },
5498        .encode = .{ .sqxtn, .Vd, .Vn },
5499    },
5500    .{
5501        .pattern = "SQXTN <Vd>.8B, <Vn>.8H",
5502        .symbols = .{
5503            .Vd = .{ .reg_alias = .vector },
5504            .Vn = .{ .reg_alias = .vector },
5505        },
5506        .encode = .{
5507            .sqxtn,
5508            .{ .alias = .Vd, .format = .{ .vector = .@"8b" } },
5509            .{ .alias = .Vn, .format = .{ .vector = .@"8h" } },
5510        },
5511    },
5512    .{
5513        .pattern = "SQXTN2 <Vd>.16B, <Vn>.8H",
5514        .symbols = .{
5515            .Vd = .{ .reg_alias = .vector },
5516            .Vn = .{ .reg_alias = .vector },
5517        },
5518        .encode = .{
5519            .sqxtn2,
5520            .{ .alias = .Vd, .format = .{ .vector = .@"16b" } },
5521            .{ .alias = .Vn, .format = .{ .vector = .@"8h" } },
5522        },
5523    },
5524    .{
5525        .pattern = "SQXTN <Vd>.4H, <Vn>.4S",
5526        .symbols = .{
5527            .Vd = .{ .reg_alias = .vector },
5528            .Vn = .{ .reg_alias = .vector },
5529        },
5530        .encode = .{
5531            .sqxtn,
5532            .{ .alias = .Vd, .format = .{ .vector = .@"4h" } },
5533            .{ .alias = .Vn, .format = .{ .vector = .@"4s" } },
5534        },
5535    },
5536    .{
5537        .pattern = "SQXTN2 <Vd>.8H, <Vn>.4S",
5538        .symbols = .{
5539            .Vd = .{ .reg_alias = .vector },
5540            .Vn = .{ .reg_alias = .vector },
5541        },
5542        .encode = .{
5543            .sqxtn2,
5544            .{ .alias = .Vd, .format = .{ .vector = .@"8h" } },
5545            .{ .alias = .Vn, .format = .{ .vector = .@"4s" } },
5546        },
5547    },
5548    .{
5549        .pattern = "SQXTN <Vd>.2S, <Vn>.2D",
5550        .symbols = .{
5551            .Vd = .{ .reg_alias = .vector },
5552            .Vn = .{ .reg_alias = .vector },
5553        },
5554        .encode = .{
5555            .sqxtn,
5556            .{ .alias = .Vd, .format = .{ .vector = .@"2s" } },
5557            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
5558        },
5559    },
5560    .{
5561        .pattern = "SQXTN2 <Vd>.4S, <Vn>.2D",
5562        .symbols = .{
5563            .Vd = .{ .reg_alias = .vector },
5564            .Vn = .{ .reg_alias = .vector },
5565        },
5566        .encode = .{
5567            .sqxtn2,
5568            .{ .alias = .Vd, .format = .{ .vector = .@"4s" } },
5569            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
5570        },
5571    },
5572    // C7.2.337 SUQADD
5573    .{
5574        .pattern = "SUQADD <Vd>, <Vn>",
5575        .symbols = .{
5576            .Vd = .{ .reg = .{ .format = .{ .scalar = .byte } } },
5577            .Vn = .{ .reg = .{ .format = .{ .scalar = .byte } } },
5578        },
5579        .encode = .{ .suqadd, .Vd, .Vn },
5580    },
5581    .{
5582        .pattern = "SUQADD <Vd>, <Vn>",
5583        .symbols = .{
5584            .Vd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5585            .Vn = .{ .reg = .{ .format = .{ .scalar = .half } } },
5586        },
5587        .encode = .{ .suqadd, .Vd, .Vn },
5588    },
5589    .{
5590        .pattern = "SUQADD <Vd>, <Vn>",
5591        .symbols = .{
5592            .Vd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5593            .Vn = .{ .reg = .{ .format = .{ .scalar = .single } } },
5594        },
5595        .encode = .{ .suqadd, .Vd, .Vn },
5596    },
5597    .{
5598        .pattern = "SUQADD <Vd>, <Vn>",
5599        .symbols = .{
5600            .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5601            .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
5602        },
5603        .encode = .{ .suqadd, .Vd, .Vn },
5604    },
5605    .{
5606        .pattern = "SUQADD <Vd>.<T>, <Vn>.<T>",
5607        .symbols = .{
5608            .Vd = .{ .reg_alias = .vector },
5609            .T = .{ .arrangement = .{ .min_valid_len = 2 } },
5610            .Vn = .{ .reg_alias = .vector },
5611        },
5612        .encode = .{
5613            .suqadd,
5614            .{ .alias = .Vd, .format = .{ .vector = .T } },
5615            .{ .alias = .Vn, .format = .{ .vector = .T } },
5616        },
5617    },
5618    // C7.2.353 UCVTF (vector, integer)
5619    .{
5620        .requires = .{.fullfp16},
5621        .pattern = "UCVTF <Hd>, <Hn>",
5622        .symbols = .{
5623            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5624            .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
5625        },
5626        .encode = .{ .ucvtf, .Hd, .Hn },
5627    },
5628    .{
5629        .pattern = "UCVTF <Sd>, <Sn>",
5630        .symbols = .{
5631            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5632            .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
5633        },
5634        .encode = .{ .ucvtf, .Sd, .Sn },
5635    },
5636    .{
5637        .pattern = "UCVTF <Dd>, <Dn>",
5638        .symbols = .{
5639            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5640            .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
5641        },
5642        .encode = .{ .ucvtf, .Dd, .Dn },
5643    },
5644    .{
5645        .requires = .{.fullfp16},
5646        .pattern = "UCVTF <Vd>.<T>, <Vn>.<T>",
5647        .symbols = .{
5648            .Vd = .{ .reg_alias = .vector },
5649            .T = .{ .arrangement = .{ .elem_size = .half } },
5650            .Vn = .{ .reg_alias = .vector },
5651        },
5652        .encode = .{
5653            .ucvtf,
5654            .{ .alias = .Vd, .format = .{ .vector = .T } },
5655            .{ .alias = .Vn, .format = .{ .vector = .T } },
5656        },
5657    },
5658    .{
5659        .pattern = "UCVTF <Vd>.<T>, <Vn>.<T>",
5660        .symbols = .{
5661            .Vd = .{ .reg_alias = .vector },
5662            .T = .{ .arrangement = .{ .elem_size = .single } },
5663            .Vn = .{ .reg_alias = .vector },
5664        },
5665        .encode = .{
5666            .ucvtf,
5667            .{ .alias = .Vd, .format = .{ .vector = .T } },
5668            .{ .alias = .Vn, .format = .{ .vector = .T } },
5669        },
5670    },
5671    .{
5672        .pattern = "UCVTF <Vd>.2D, <Vn>.2D",
5673        .symbols = .{
5674            .Vd = .{ .reg_alias = .vector },
5675            .Vn = .{ .reg_alias = .vector },
5676        },
5677        .encode = .{
5678            .ucvtf,
5679            .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
5680            .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
5681        },
5682    },
5683    // C7.2.355 UCVTF (scalar, integer)
5684    .{
5685        .requires = .{.fullfp16},
5686        .pattern = "UCVTF <Hd>, <Wn>",
5687        .symbols = .{
5688            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5689            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5690        },
5691        .encode = .{ .ucvtf, .Hd, .Wn },
5692    },
5693    .{
5694        .pattern = "UCVTF <Sd>, <Wn>",
5695        .symbols = .{
5696            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5697            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5698        },
5699        .encode = .{ .ucvtf, .Sd, .Wn },
5700    },
5701    .{
5702        .pattern = "UCVTF <Dd>, <Wn>",
5703        .symbols = .{
5704            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5705            .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5706        },
5707        .encode = .{ .ucvtf, .Dd, .Wn },
5708    },
5709    .{
5710        .requires = .{.fullfp16},
5711        .pattern = "UCVTF <Hd>, <Xn>",
5712        .symbols = .{
5713            .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5714            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5715        },
5716        .encode = .{ .ucvtf, .Hd, .Xn },
5717    },
5718    .{
5719        .pattern = "UCVTF <Sd>, <Xn>",
5720        .symbols = .{
5721            .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5722            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5723        },
5724        .encode = .{ .ucvtf, .Sd, .Xn },
5725    },
5726    .{
5727        .pattern = "UCVTF <Dd>, <Xn>",
5728        .symbols = .{
5729            .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5730            .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5731        },
5732        .encode = .{ .ucvtf, .Dd, .Xn },
5733    },
5734    // C7.2.371 UMOV
5735    .{
5736        .pattern = "UMOV <Wd>, <Vn>.B[<index>]",
5737        .symbols = .{
5738            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
5739            .Vn = .{ .reg_alias = .vector },
5740            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5741        },
5742        .encode = .{
5743            .umov,
5744            .Wd,
5745            .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index } } },
5746        },
5747    },
5748    .{
5749        .pattern = "UMOV <Wd>, <Vn>.H[<index>]",
5750        .symbols = .{
5751            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
5752            .Vn = .{ .reg_alias = .vector },
5753            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5754        },
5755        .encode = .{
5756            .umov,
5757            .Wd,
5758            .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index } } },
5759        },
5760    },
5761    .{
5762        .pattern = "UMOV <Wd>, <Vn>.S[<index>]",
5763        .symbols = .{
5764            .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
5765            .Vn = .{ .reg_alias = .vector },
5766            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5767        },
5768        .encode = .{
5769            .umov,
5770            .Wd,
5771            .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index } } },
5772        },
5773    },
5774    .{
5775        .pattern = "UMOV <Xd>, <Vn>.D[<index>]",
5776        .symbols = .{
5777            .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5778            .Vn = .{ .reg_alias = .vector },
5779            .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
5780        },
5781        .encode = .{
5782            .umov,
5783            .Xd,
5784            .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index } } },
5785        },
5786    },
5787}