{
  "architecture": "ARM",
  "instructions": [
    {
      "mnemonic": "at",
      "architecture": "ARMv8-A",
      "full_name": "Address Translate (Stage 1 Current)",
      "summary": "Performs stage 1 address translation for current EL.",
      "syntax": "AT S1E1R, <Xt>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 0 | 01 | op1 | 0111 | CRm | op2 | Rt",
        "hex_opcode": "0xD5087800",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Virt Addr"
        }
      ],
      "extension": "Base (System)",
      "description": "Performs stage 1 address translation for a virtual address in the current execution level, treating the access as a read. The translation result (physical address and attributes) is written to the PAR_EL1 register. No condition flags are affected. This is an AArch64-only instruction that requires appropriate privilege level to access the address translation system registers.",
      "example": "AT S1E1R, x3",
      "pseudocode": "address ← Xt\ntranslation_result ← TranslateAddress(address, S1E1R, current_EL)\nPAR_EL1 ← translation_result"
    },
    {
      "mnemonic": "at",
      "architecture": "ARMv8-A",
      "full_name": "Address Translate (Stage 1 Write)",
      "summary": "Performs stage 1 address translation for write permission.",
      "syntax": "AT S1E1W, <Xt>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 0 | 01 | op1 | 0111 | CRm | op2 | Rt",
        "hex_opcode": "0xD5087800",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Virt Addr"
        }
      ],
      "extension": "Base (System)",
      "description": "Performs stage 1 address translation for a virtual address in the current execution level, treating the access as a write. The translation result (physical address and attributes) is written to the PAR_EL1 register. No condition flags are affected. This is an AArch64-only instruction that requires appropriate privilege level to access the address translation system registers.",
      "example": "AT S1E1W, x3",
      "pseudocode": "address ← Xt\ntranslation_result ← TranslateAddress(address, S1E1W, current_EL)\nPAR_EL1 ← translation_result"
    },
    {
      "mnemonic": "tlbi",
      "architecture": "ARMv8-A",
      "full_name": "TLB Invalidate (All)",
      "summary": "Invalidates all TLB entries in the inner shareable domain.",
      "syntax": "TLBI VMALLE1IS",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 0 | 01 | op1 | CRn | CRm | op2 | Rt",
        "hex_opcode": "0xD5088000",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "Base (System)",
      "description": "Invalidates all TLB entries in the inner shareable domain, affecting all PEs in the shareable domain. This is an AArch64-only instruction requiring EL1 or higher privilege. No condition flags are affected; the instruction generates an exception if executed at EL0.",
      "example": "TLBI VMALLE1IS",
      "pseudocode": "TLBInvalidateAll(InnerShareable); DSB(SY); ISB()"
    },
    {
      "mnemonic": "tlbi",
      "architecture": "ARMv8-A",
      "full_name": "TLB Invalidate (VA)",
      "summary": "Invalidates TLB entries by Virtual Address.",
      "syntax": "TLBI VAE1, <Xt>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 0 | 01 | op1 | CRn | CRm | op2 | Rt",
        "hex_opcode": "0xD5088000",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "VA"
        }
      ],
      "extension": "Base (System)",
      "description": "Invalidates TLB entries matching the virtual address supplied in the register operand, at the current exception level. This is an AArch64-only instruction requiring EL1 or higher privilege. No condition flags are affected; the instruction generates an exception if executed at EL0.",
      "example": "TLBI VAE1, x3",
      "pseudocode": "TLBInvalidateByVA(Xt, EL1); DSB(SY); ISB()"
    },
    {
      "mnemonic": "mcr",
      "architecture": "ARMv8-A",
      "full_name": "Move to Coprocessor from Register (A32)",
      "summary": "Writes a general-purpose register to a coprocessor register (e.g., CP15).",
      "syntax": "MCR<c> <coproc>, <opc1>, <Rt>, <CRn>, <CRm>{, <opc2>}",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "cond | 1110 | opc1 | 0 | CRn | Rt | 111 | coproc<0> | opc2 | 1 | CRm",
        "hex_opcode": "0x0E000E10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "opc1",
            "clean": "opc1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "coproc<0>",
            "clean": "coproc<0>"
          },
          {
            "raw": "opc2",
            "clean": "opc2"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:9 | 8 | 7:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "CRn",
          "desc": "Dest CP Reg"
        }
      ],
      "extension": "A32 (System)",
      "description": "Moves data from a general-purpose register into a coprocessor register (typically CP15 for system control). The instruction is conditional and executes only if the condition code is satisfied. No ARM condition flags (N, Z, C, V) are modified by this instruction. This is an A32-only instruction with implementation-specific side effects depending on the target coprocessor register.",
      "example": "MCR p15, 0, r3, c1, c2",
      "pseudocode": "if ConditionPassed(cond) then\n  CP[coproc, opc1, CRn, CRm, opc2] ← Rt"
    },
    {
      "mnemonic": "mrc",
      "architecture": "ARMv8-A",
      "full_name": "Move to Register from Coprocessor (A32)",
      "summary": "Reads a coprocessor register into a general-purpose register.",
      "syntax": "MRC<c> <coproc>, <opc1>, <Rt>, <CRn>, <CRm>{, <opc2>}",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "cond | 1110 | opc1 | 1 | CRn | Rt | 111 | coproc<0> | opc2 | 1 | CRm",
        "hex_opcode": "0x0E100E10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "opc1",
            "clean": "opc1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "coproc<0>",
            "clean": "coproc<0>"
          },
          {
            "raw": "opc2",
            "clean": "opc2"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:9 | 8 | 7:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "CRn",
          "desc": "Src CP Reg"
        }
      ],
      "extension": "A32 (System)",
      "description": "Moves data from a coprocessor register (typically CP15 for system control) into a general-purpose register. The instruction is conditional and executes only if the condition code is satisfied. The N, Z, C, V flags may be modified depending on the coprocessor register being read. This is an A32-only instruction with implementation-specific behavior depending on the source coprocessor register.",
      "example": "MRC p15, 0, r3, c1, c2",
      "pseudocode": "if ConditionPassed(cond) then\n  Rt ← CP[coproc, opc1, CRn, CRm, opc2]\n  condition_flags may be updated by coprocessor"
    },
    {
      "mnemonic": "mcrr",
      "architecture": "ARMv8-A",
      "full_name": "Move to Coprocessor from Two Registers (A32)",
      "summary": "Writes two general-purpose registers to a coprocessor (64-bit transfer).",
      "syntax": "MCRR<c> <coproc>, <opc1>, <Rt>, <Rt2>, <CRm>",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "cond | 11000 | 1 | 0 | 0 | Rt2 | Rt | 111 | coproc<0> | opc1 | CRm",
        "hex_opcode": "0x0C400E00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11000",
            "clean": "11000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "coproc<0>",
            "clean": "coproc<0>"
          },
          {
            "raw": "opc1",
            "clean": "opc1"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rt2",
          "desc": "Second transfer register (load/store pair)"
        }
      ],
      "extension": "A32 (System)",
      "description": "Moves data from two consecutive general-purpose registers into a coprocessor (64-bit data transfer). The instruction is conditional and executes only if the condition code is satisfied. No ARM condition flags are modified. This is an A32-only instruction; the two source registers are treated as a 64-bit value with Rt containing the lower 32 bits.",
      "example": "MCRR p15, 0, r3, r4, c2",
      "pseudocode": "if ConditionPassed(cond) then\n  CP64[coproc, opc1, CRm] ← (Rt2:Rt)\n  // Rt holds bits [31:0], Rt2 holds bits [63:32]"
    },
    {
      "mnemonic": "mrrc",
      "architecture": "ARMv8-A",
      "full_name": "Move to Two Registers from Coprocessor (A32)",
      "summary": "Reads a coprocessor register into two general-purpose registers.",
      "syntax": "MRRC<c> <coproc>, <opc1>, <Rt>, <Rt2>, <CRm>",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "cond | 11000 | 1 | 0 | 1 | Rt2 | Rt | 111 | coproc<0> | opc1 | CRm",
        "hex_opcode": "0x0C500E00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11000",
            "clean": "11000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "coproc<0>",
            "clean": "coproc<0>"
          },
          {
            "raw": "opc1",
            "clean": "opc1"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "Rt",
          "desc": "Dest 1"
        },
        {
          "name": "Rt2",
          "desc": "Dest 2"
        }
      ],
      "extension": "A32 (System)",
      "description": "Moves data from a coprocessor into two consecutive general-purpose registers (64-bit data transfer). The instruction is conditional and executes only if the condition code is satisfied. No ARM condition flags are modified by this instruction itself, though the coprocessor may affect them. This is an A32-only instruction; the 64-bit result is split with Rt receiving the lower 32 bits and Rt2 the upper 32 bits.",
      "example": "MRRC p15, 0, r3, r4, c2",
      "pseudocode": "if ConditionPassed(cond) then\n  data64 ← CP64[coproc, opc1, CRm]\n  Rt ← data64[31:0]\n  Rt2 ← data64[63:32]"
    },
    {
      "mnemonic": "ldc",
      "architecture": "ARMv8-A",
      "full_name": "Load Coprocessor (A32)",
      "summary": "Loads memory into a coprocessor.",
      "syntax": "LDC{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "cond | 110 | 1 | U | 0 | 1 | 1 | Rn | 0101 | 111 | 0 | imm8",
        "hex_opcode": "0x0D305E00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:9 | 8 | 7:0"
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "CRd",
          "desc": "Destination coprocessor register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (System)",
      "description": "Loads data from memory into a coprocessor register, with pre/post-indexed addressing. This is an A32-only instruction that executes conditionally based on the condition field. The base register Rn is updated if the write-back bit W is set; no condition flags are affected by this instruction.",
      "example": "LDC p15, c0, [r1, #+/-#16]!",
      "pseudocode": "if ConditionPassed(cond) then\n  address ← if P then (Rn + (imm8 << 2)) else Rn\n  if U then address ← Rn + (imm8 << 2) else address ← Rn - (imm8 << 2)\n  Coproc_load(address, CRd)\n  if W then Rn ← address"
    },
    {
      "mnemonic": "stc",
      "architecture": "ARMv8-A",
      "full_name": "Store Coprocessor (A32)",
      "summary": "Stores coprocessor contents to memory.",
      "syntax": "STC{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "cond | 110 | 1 | U | 0 | 1 | 0 | Rn | 0101 | 111 | 0 | imm8",
        "hex_opcode": "0x0D205E00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:9 | 8 | 7:0"
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "CRd",
          "desc": "Destination coprocessor register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (System)",
      "description": "Stores coprocessor register contents to memory, with pre/post-indexed addressing. This is an A32-only instruction that executes conditionally based on the condition field. The base register Rn is updated if the write-back bit W is set; no condition flags are affected by this instruction.",
      "example": "STC p15, c0, [r1, #+/-#16]!",
      "pseudocode": "if ConditionPassed(cond) then\n  address ← if P then (Rn + (imm8 << 2)) else Rn\n  if U then address ← Rn + (imm8 << 2) else address ← Rn - (imm8 << 2)\n  [address] ← Coproc_store(CRd)\n  if W then Rn ← address"
    },
    {
      "mnemonic": "vmrs",
      "architecture": "ARMv8-A",
      "full_name": "Move VFP System Register to Register",
      "summary": "Reads a VFP system register (like FPSCR).",
      "syntax": "VMRS<c> <Rt>, <spec_reg>",
      "encoding": {
        "format": "VFP System",
        "binary_pattern": "cond | 1110111 | 1 | reg | Rt | 1010 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0",
        "hex_opcode": "0x0EF00A10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110111",
            "clean": "1110111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "reg",
            "clean": "reg"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          }
        ],
        "bit_positions": "31:28 | 27:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Dest (or APSR_nzcv)"
        },
        {
          "name": "spec_reg",
          "desc": "FPSCR"
        }
      ],
      "extension": "VFP (System)",
      "description": "Reads a VFP system register (typically FPSCR) and transfers its value to a general-purpose register or the APSR condition flags. This is an A32/T32 instruction that executes conditionally. If Rt is R15, the N, Z, C, V flags are updated from FPSCR bits; otherwise no flags are modified.",
      "example": "VMRS r3, nzcv",
      "pseudocode": "if ConditionPassed(cond) then\n  if Rt == 15 then\n    APSR_nzcv ← FPSCR[31:28]\n  else\n    Rt ← FPSCR"
    },
    {
      "mnemonic": "vmsr",
      "architecture": "ARMv8-A",
      "full_name": "Move Register to VFP System Register",
      "summary": "Writes to a VFP system register.",
      "syntax": "VMSR<c> <spec_reg>, <Rt>",
      "encoding": {
        "format": "VFP System",
        "binary_pattern": "cond | 1110111 | 0 | reg | Rt | 1010 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0",
        "hex_opcode": "0x0EE00A10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110111",
            "clean": "1110111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "reg",
            "clean": "reg"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          }
        ],
        "bit_positions": "31:28 | 27:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0"
      },
      "operands": [
        {
          "name": "spec_reg",
          "desc": "FPSCR"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        }
      ],
      "extension": "VFP (System)",
      "description": "Writes a general-purpose register value to a VFP system register (typically FPSCR). This is an A32/T32 instruction that executes conditionally. If Rt is R15, the APSR condition flags are written to FPSCR; the instruction may modify exception flags and rounding modes in FPSCR.",
      "example": "VMSR nzcv, r3",
      "pseudocode": "if ConditionPassed(cond) then\n  if Rt == 15 then\n    FPSCR[31:28] ← APSR_nzcv\n  else\n    FPSCR ← Rt"
    },
    {
      "mnemonic": "ldrexb",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Exclusive Byte (A32)",
      "summary": "Loads a byte and marks address as exclusive.",
      "syntax": "LDREXB<c> <Rt>, [<Rn>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "cond | 00011 | 10 | 1 | Rn | Rt | 1 | 1 | 1 | 1 | 1001 | 1111",
        "hex_opcode": "0x01D00F9F",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Loads a byte from memory into a register and marks the address as exclusive for synchronization. The byte is zero-extended to 32 bits in the destination register. No condition flags are modified. This is an A32-only instruction that atomically acquires an exclusive lock on the target byte address; the lock is released by a matching STREXB or other exclusive store.",
      "example": "LDREXB r3, [r1]",
      "pseudocode": "if ConditionPassed(cond) then\n  address ← Rn\n  Rt ← ZeroExtend([address], 8)\n  SetExclusiveMonitor(address, 1)"
    },
    {
      "mnemonic": "strexb",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Exclusive Byte (A32)",
      "summary": "Stores a byte if address is still exclusive.",
      "syntax": "STREXB<c> <Rd>, <Rt>, [<Rn>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "cond | 00011 | 10 | 0 | Rn | Rd | 1 | 1 | 1 | 1 | 1001 | Rt",
        "hex_opcode": "0x01C00F90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Status"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Conditionally stores a byte to memory if the address is still marked as exclusive, returning a status in Rd (0=success, 1=failure). No condition flags are modified by the store result; success/failure is reported only in Rd. This is an A32-only instruction that atomically releases the exclusive lock and performs the write only if the lock is still held from a prior LDREXB.",
      "example": "STREXB r0, r3, [r1]",
      "pseudocode": "if ConditionPassed(cond) then\n  address ← Rn\n  byte_value ← Rt[7:0]\n  if ExclusiveMonitorSet(address, 1) then\n    [address] ← byte_value\n    Rd ← 0\n    ClearExclusiveMonitor(address, 1)\n  else\n    Rd ← 1"
    },
    {
      "mnemonic": "ldrexh",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Exclusive Halfword (A32)",
      "summary": "Loads a halfword and marks address as exclusive.",
      "syntax": "LDREXH<c> <Rt>, [<Rn>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "cond | 00011 | 11 | 1 | Rn | Rt | 1 | 1 | 1 | 1 | 1001 | 1111",
        "hex_opcode": "0x01F00F9F",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Loads a 16-bit value from memory at the address in Rn and marks that address as exclusive for the current processor. The loaded halfword is zero-extended and placed in Rt. No condition flags are affected. This A32 instruction requires a matching STREXH to conditionally store; if the exclusive monitor is cleared, a subsequent STREXH will fail.",
      "example": "LDREXH r3, [r1]",
      "pseudocode": "address ← Rn; Rt ← ZeroExtend(MemU[address, 2]); ExclusiveMonitorsMarkExclusive(address, ProcessorID(), 2);"
    },
    {
      "mnemonic": "strexh",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Exclusive Halfword (A32)",
      "summary": "Stores a halfword if address is still exclusive.",
      "syntax": "STREXH<c> <Rd>, <Rt>, [<Rn>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "cond | 00011 | 11 | 0 | Rn | Rd | 1 | 1 | 1 | 1 | 1001 | Rt",
        "hex_opcode": "0x01E00F90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Status"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Conditionally stores a 16-bit value from Rt to memory at the address in Rn if that address is still marked exclusive by the current processor. Writes 0 to Rd if the store succeeds, or 1 if it fails due to loss of exclusivity. No condition flags are affected by the instruction result itself; the exclusive monitor behavior determines success/failure.",
      "example": "STREXH r0, r3, [r1]",
      "pseudocode": "address ← Rn; if ExclusiveMonitorsCheckExclusive(address, ProcessorID(), 2) then MemU[address, 2] ← Rt[15:0]; Rd ← 0; ExclusiveMonitorsClearExclusive(ProcessorID()); else Rd ← 1;"
    },
    {
      "mnemonic": "ldrexd",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Exclusive Double (A32)",
      "summary": "Loads a doubleword and marks address as exclusive.",
      "syntax": "LDREXD<c> <Rt>, <Rt2>, [<Rn>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "cond | 00011 | 01 | 1 | Rn | Rt | 1 | 1 | 1 | 1 | 1001 | 1111",
        "hex_opcode": "0x01B00F9F",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Dest 1"
        },
        {
          "name": "Rt2",
          "desc": "Dest 2"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Loads a 64-bit doubleword from memory at the address in Rn and marks that address as exclusive for the current processor. The loaded value is split across Rt (lower 32 bits) and Rt2 (upper 32 bits). No condition flags are affected. This A32 instruction requires matching STREXD for conditional storage; Rt and Rt2 must be consecutive registers.",
      "example": "LDREXD r3, r4, [r1]",
      "pseudocode": "address ← Rn; value ← MemU[address, 8]; Rt ← value[31:0]; Rt2 ← value[63:32]; ExclusiveMonitorsMarkExclusive(address, ProcessorID(), 8);"
    },
    {
      "mnemonic": "strexd",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Exclusive Double (A32)",
      "summary": "Stores a doubleword if address is still exclusive.",
      "syntax": "STREXD<c> <Rd>, <Rt>, <Rt2>, [<Rn>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "cond | 00011 | 01 | 0 | Rn | Rd | 1 | 1 | 1 | 1 | 1001 | Rt",
        "hex_opcode": "0x01A00F90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Status"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rt2",
          "desc": "Second transfer register (load/store pair)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Conditionally stores a 64-bit doubleword from Rt and Rt2 to memory at the address in Rn if that address is still marked exclusive by the current processor. Writes 0 to Rd on success or 1 on failure. No condition flags are affected; exclusive monitor state determines the outcome.",
      "example": "STREXD r0, r3, r4, [r1]",
      "pseudocode": "address ← Rn; if ExclusiveMonitorsCheckExclusive(address, ProcessorID(), 8) then MemU[address, 8] ← Rt || Rt2; Rd ← 0; ExclusiveMonitorsClearExclusive(ProcessorID()); else Rd ← 1;"
    },
    {
      "mnemonic": "dcps1",
      "architecture": "ARMv8-A",
      "full_name": "Debug Change PE State to EL1 (A32)",
      "summary": "Switches execution to EL1 (Debug).",
      "syntax": "DCPS1",
      "encoding": {
        "format": "System",
        "binary_pattern": "111101111000 | 1111 | 1000 | 0000000000 | 01",
        "hex_opcode": "0xF78F8001",
        "visual_parts": [
          {
            "raw": "111101111000",
            "clean": "111101111000"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "0000000000",
            "clean": "0000000000"
          },
          {
            "raw": "01",
            "clean": "01"
          }
        ],
        "bit_positions": "31:20 | 19:16 | 15:12 | 11:2 | 1:0"
      },
      "operands": [],
      "extension": "A32 (System)",
      "description": "Changes PE execution state to EL1 for debugging purposes. This is an A32-only instruction that immediately changes exception level and may update execution state; it does not return (implicit branch to debug handler). Condition flags are not affected by the instruction itself but are context-switched at the target exception level.",
      "example": "DCPS1",
      "pseudocode": "DebugChangeEL(EL1); // Changes exception level and branches to debug handler"
    },
    {
      "mnemonic": "dcps2",
      "architecture": "ARMv8-A",
      "full_name": "Debug Change PE State to EL2 (A32)",
      "summary": "Switches execution to EL2 (Debug).",
      "syntax": "DCPS2",
      "encoding": {
        "format": "System",
        "binary_pattern": "111101111000 | 1111 | 1000 | 0000000000 | 10",
        "hex_opcode": "0xF78F8002",
        "visual_parts": [
          {
            "raw": "111101111000",
            "clean": "111101111000"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "0000000000",
            "clean": "0000000000"
          },
          {
            "raw": "10",
            "clean": "10"
          }
        ],
        "bit_positions": "31:20 | 19:16 | 15:12 | 11:2 | 1:0"
      },
      "operands": [],
      "extension": "A32 (System)",
      "description": "Changes PE execution state to EL2 for debugging purposes. This is an A32-only instruction that immediately changes exception level and may update execution state; it does not return (implicit branch to debug handler). Condition flags are not affected by the instruction itself but are context-switched at the target exception level.",
      "example": "DCPS2",
      "pseudocode": "DebugChangeEL(EL2); // Changes exception level and branches to debug handler"
    },
    {
      "mnemonic": "dcps3",
      "architecture": "ARMv8-A",
      "full_name": "Debug Change PE State to EL3 (A32)",
      "summary": "Switches execution to EL3 (Debug).",
      "syntax": "DCPS3",
      "encoding": {
        "format": "System",
        "binary_pattern": "111101111000 | 1111 | 1000 | 0000000000 | 11",
        "hex_opcode": "0xF78F8003",
        "visual_parts": [
          {
            "raw": "111101111000",
            "clean": "111101111000"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "0000000000",
            "clean": "0000000000"
          },
          {
            "raw": "11",
            "clean": "11"
          }
        ],
        "bit_positions": "31:20 | 19:16 | 15:12 | 11:2 | 1:0"
      },
      "operands": [],
      "extension": "A32 (System)",
      "description": "Debug Change PE State to EL3 switches the processor to Exception Level 3 (EL3) in debug state without saving the current processor state. This instruction is used by debuggers to enter the highest privilege level. It is available only in A32 instruction set and requires debug authentication. No condition flags are modified.",
      "example": "DCPS3",
      "pseudocode": "CurrentEL ← EL3; PSTATE.EL ← '11'; PSTATE.SS ← '0';"
    },
    {
      "mnemonic": "setpan",
      "architecture": "ARMv8-A",
      "full_name": "Set Privileged Access Never (A32)",
      "summary": "Enables/Disables PAN (Prevents kernel accessing user memory).",
      "syntax": "SETPAN #<imm>",
      "encoding": {
        "format": "System",
        "binary_pattern": "111100010001 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | imm1 | 0 | 0000 | 0 | 0 | 0 | 0",
        "hex_opcode": "0xF1100000",
        "visual_parts": [
          {
            "raw": "111100010001",
            "clean": "111100010001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm1",
            "clean": "imm1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3 | 2 | 1 | 0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "0/1"
        }
      ],
      "extension": "A32 (System)",
      "description": "Set Privileged Access Never enables or disables the PAN (Privileged Access Never) control bit, which prevents privileged software from accessing user-mode memory. When PAN is enabled (imm=1), privileged accesses to user memory are trapped; when disabled (imm=0), such accesses are permitted. This instruction is available in A32 and requires appropriate privilege level. No condition flags are modified.",
      "example": "SETPAN #16",
      "pseudocode": "PSTATE.PAN ← imm;"
    },
    {
      "mnemonic": "esb",
      "architecture": "ARMv8-A",
      "full_name": "Error Synchronization Barrier (A32)",
      "summary": "Synchronizes system errors (v8.2).",
      "syntax": "ESB",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "cond | 00110 | 0 | 10 | 0000 | 1 | 1 | 1 | 1 | 000000010000",
        "hex_opcode": "0x0320F010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000010000",
            "clean": "000000010000"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [],
      "extension": "A32 (RAS)",
      "description": "Error Synchronization Barrier (v8.2) for RAS (Reliability, Availability, and Serviceability) synchronizes system error handling, ensuring that error detection and processing operations complete in order. This instruction is essential in fault-tolerance and error recovery scenarios and does not modify general-purpose registers or condition flags. Available in A32 instruction set.",
      "example": "ESB",
      "pseudocode": "// Synchronize error handling\nErrorSynchronizationBarrier()\n// All pending error detection and processing operations complete"
    },
    {
      "mnemonic": "csdb",
      "architecture": "ARMv8-A",
      "full_name": "Consumption of Speculative Data Barrier (A32)",
      "summary": "Prevents speculative data consumption (v8.0).",
      "syntax": "CSDB",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "cond | 00110 | 0 | 10 | 0000 | 1 | 1 | 1 | 1 | 000000010100",
        "hex_opcode": "0x0320F014",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000010100",
            "clean": "000000010100"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [],
      "extension": "A32 (v8.0)",
      "description": "Consumption of Speculative Data Barrier (v8.0) prevents the CPU from using speculatively-loaded data in subsequent operations, protecting against attacks that exploit speculative data consumption side channels. Instructions following CSDB cannot use data speculatively loaded before this barrier. Available in A32 instruction set; does not modify condition flags.",
      "example": "CSDB",
      "pseudocode": "// Prevent consumption of speculatively-loaded data\nConsumptionBarrier()\n// Subsequent instructions cannot use data obtained through speculative execution prior to this barrier"
    },
    {
      "mnemonic": "vldm",
      "architecture": "ARMv8-A",
      "full_name": "Vector Load Multiple (VFP)",
      "summary": "Loads multiple VFP registers from memory.",
      "syntax": "VLDM<c><mode> <Rn>{!}, <list>",
      "encoding": {
        "format": "VFP Load Multiple",
        "binary_pattern": "cond | 110 | 0 | 1 | D | W | 1 | Rn | Vd | 10 | 10 | imm8",
        "hex_opcode": "0x0C900A00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "W",
            "clean": "W"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "list",
          "desc": "Registers"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Load Multiple loads multiple consecutive double-precision or single-precision floating-point registers from memory using the address in a general-purpose base register. The base register can be optionally auto-incremented by the total bytes loaded. Condition flags (N, Z, C, V) are unaffected unless an exception occurs.",
      "example": "VLDMia r1!, {r0-r3",
      "pseudocode": "address ← Rn; for i = 0 to (list_count - 1) do; Driestlist[i] ← [address]; address ← address + (register_size / 8); end; if !(!) then Rn ← address;"
    },
    {
      "mnemonic": "vstm",
      "architecture": "ARMv8-A",
      "full_name": "Vector Store Multiple (VFP)",
      "summary": "Stores multiple VFP registers to memory.",
      "syntax": "VSTM<c><mode> <Rn>{!}, <list>",
      "encoding": {
        "format": "VFP Store Multiple",
        "binary_pattern": "cond | 110 | 0 | 1 | D | W | 0 | Rn | Vd | 10 | 10 | imm8",
        "hex_opcode": "0x0C800A00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "W",
            "clean": "W"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "list",
          "desc": "Registers"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Store Multiple stores multiple consecutive double-precision or single-precision floating-point registers to memory using the address in a general-purpose base register. The base register can be optionally auto-incremented by the total bytes stored. Condition flags (N, Z, C, V) are unaffected unless an exception occurs.",
      "example": "VSTMia r1!, {r0-r3",
      "pseudocode": "address ← Rn; for i = 0 to (list_count - 1) do; [address] ← Vriestlist[i]; address ← address + (register_size / 8); end; if !(!) then Rn ← address;"
    },
    {
      "mnemonic": "vcmp",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare Zero (VFP)",
      "summary": "Compares a floating-point value with #0.0.",
      "syntax": "VCMP<c>.F32 <Sd>, #0.0",
      "encoding": {
        "format": "VFP Compare",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 101 | Vd | 10 | 10 | 0 | 1 | 0 | 0 | 0000",
        "hex_opcode": "0x0EB50A40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Compare Zero compares a single-precision floating-point value against zero and updates the VFP condition flags (FPSCR bits 28-31) based on the result. The comparison sets flags for signed magnitude comparison: N, Z, C, V flags in FPSCR are updated; FPSCR.E bit may be set if an exception occurs. Available in A32 VFP extension.",
      "example": "VCMP.F32 s0, #0.0",
      "pseudocode": "result ← Sd - 0.0; UpdateFPSCRConditionFlags(result); if exception then SetFPSCRException();"
    },
    {
      "mnemonic": "vdiv",
      "architecture": "ARMv8-A",
      "full_name": "Vector Divide (Double)",
      "summary": "Divides two double-precision registers.",
      "syntax": "VDIV<c>.F64 <Dd>, <Dn>, <Dm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 1 | D | 00 | Vn | Vd | 10 | 11 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0x0E800B00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dn",
          "desc": "Dividend"
        },
        {
          "name": "Dm",
          "desc": "Divisor"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Divides the 64-bit double-precision value in Dn by the value in Dm and places the floating-point result in Dd. The operation follows IEEE 754 semantics for rounding and exception handling. FPSCR condition flags (N, Z, C, V) may be set based on the result and any exceptions; this instruction is available only in A32 and T32 with VFP support.",
      "example": "VDIV.F64 d0, d1, d2",
      "pseudocode": "Dd ← FPDiv(Dn, Dm); FPSCR.N ← Dd[63]; FPSCR.Z ← (Dd == 0.0); FPSCR.C ← FPExceptionRaised(); FPSCR.V ← FPInvalidOp();"
    },
    {
      "mnemonic": "vabs",
      "architecture": "ARMv8-A",
      "full_name": "Vector Absolute Value (Double)",
      "summary": "Absolute value of double-precision register.",
      "syntax": "VABS<c>.F64 <Dd>, <Dm>",
      "encoding": {
        "format": "VFP Unary",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 000 | Vd | 10 | 11 | 1 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB00BC0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Absolute Value computes the absolute value of a 64-bit double-precision floating-point register and stores the result in the destination register. The sign bit is cleared while the exponent and significand are preserved. Condition flags are unaffected unless an exception occurs. Available in A32 VFP extension.",
      "example": "VABS.F64 d0, d2",
      "pseudocode": "Dd.sign ← 0; Dd.exponent ← Dm.exponent; Dd.fraction ← Dm.fraction;"
    },
    {
      "mnemonic": "vneg",
      "architecture": "ARMv8-A",
      "full_name": "Vector Negate (Double)",
      "summary": "Negates double-precision register.",
      "syntax": "VNEG<c>.F64 <Dd>, <Dm>",
      "encoding": {
        "format": "VFP Unary",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 001 | Vd | 10 | 11 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB10B40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Negates a double-precision floating-point value in the source register and stores the result in the destination register. This is a unary VFP operation that inverts the sign bit of the IEEE 754 double-precision number. No condition flags are affected. Requires VFP extension and executes only in A32 instruction set.",
      "example": "VNEG.F64 d0, d2",
      "pseudocode": "Dd ← -Dm\nFPSCR.NZCV unchanged"
    },
    {
      "mnemonic": "vsqrt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Square Root (Double)",
      "summary": "Square root of double-precision register.",
      "syntax": "VSQRT<c>.F64 <Dd>, <Dm>",
      "encoding": {
        "format": "VFP Unary",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 001 | Vd | 10 | 11 | 1 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB10BC0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Computes the square root of a double-precision floating-point value and stores the result in the destination register. This is a unary VFP operation that performs IEEE 754 compliant square-root computation; if the source is negative (excluding -0), the result is NaN. FPSCR exception flags may be set based on input and result. Requires VFP extension and executes only in A32 instruction set.",
      "example": "VSQRT.F64 d0, d2",
      "pseudocode": "Dd ← sqrt(Dm)\nFPSCR.IOC ← 1 if Dm < 0.0 and Dm ≠ -0.0 (invalid operation)\nFPSCR.UFC ← 1 if result is subnormal (underflow)\nFPSCR.OFC ← 1 if result overflows\nFPSCR.IXC ← 1 if result is inexact"
    },
    {
      "mnemonic": "vfma",
      "architecture": "ARMv8-A",
      "full_name": "Vector Fused Multiply Accumulate (Double)",
      "summary": "Fused multiply-add (Double).",
      "syntax": "VFMA<c>.F64 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 1 | D | 10 | Vn | Vd | 10 | 11 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0x0EA00B00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "VFPv4 (Float)",
      "description": "Performs a fused multiply-accumulate operation on two double-precision values with a third double-precision accumulator value: Qd ← Qd + (Qn × Qm). The operation is a single fused operation with one rounding step, providing higher precision than separate multiply and add instructions. FPSCR exception flags may be set. Requires VFPv4 extension and executes only in A32 instruction set.",
      "example": "VFMA.F64 q0, q1, q2",
      "pseudocode": "Qd ← Qd + (Qn × Qm)\nFPSCR.IOC ← 1 if invalid operand\nFPSCR.UFC ← 1 if result underflows\nFPSCR.OFC ← 1 if result overflows\nFPSCR.IXC ← 1 if result is inexact"
    },
    {
      "mnemonic": "vfms",
      "architecture": "ARMv8-A",
      "full_name": "Vector Fused Multiply Subtract (Double)",
      "summary": "Fused multiply-subtract (Double).",
      "syntax": "VFMS<c>.F64 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 1 | D | 10 | Vn | Vd | 10 | 11 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EA00B40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "VFPv4 (Float)",
      "description": "Performs a fused multiply-subtract on 128-bit NEON registers: computes Qd = Qd - (Qn × Qm) for double-precision (F64) elements with a single rounding step. This VFPv4 instruction is more accurate than separate multiply and subtract operations. Floating-point exception flags in FPSCR may be set; condition codes N, Z, C, V are not directly modified.",
      "example": "VFMS.F64 q0, q1, q2",
      "pseudocode": "Qd ← FPMulSubFused(Qd, Qn, Qm);"
    },
    {
      "mnemonic": "vcmp",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare (Double)",
      "summary": "Compares two double-precision values.",
      "syntax": "VCMP<c>.F64 <Dd>, <Dm>",
      "encoding": {
        "format": "VFP Compare",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 100 | Vd | 10 | 11 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB40B40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Compares two double-precision floating-point values and sets the FPSCR condition flags based on the comparison result (equal, less than, greater than, or unordered). The instruction does not produce a destination register value; it only updates FPSCR flags (N, Z, C, V). Requires VFP extension and executes only in A32 instruction set.",
      "example": "VCMP.F64 d0, d2",
      "pseudocode": "result ← Dd - Dm\nFPSCR.N ← sign bit of result\nFPSCR.Z ← 1 if values equal\nFPSCR.C ← 1 if Dd ≥ Dm\nFPSCR.V ← 1 if either operand is NaN (unordered)"
    },
    {
      "mnemonic": "vmov",
      "architecture": "ARMv8-A",
      "full_name": "Vector Move (Double)",
      "summary": "Moves data between Double registers.",
      "syntax": "VMOV<c>.F64 <Dd>, <Dm>",
      "encoding": {
        "format": "VFP Move",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 000 | Vd | 10 | size | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB00B40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Copies a 64-bit double-precision floating-point value from Dm to Dd with no arithmetic or rounding. This is a register-to-register move within the VFP register file. No condition flags are affected, and this instruction executes unconditionally (though it respects the condition code in A32/T32).",
      "example": "VMOV.F64 d0, d2",
      "pseudocode": "Dd ← Dm;"
    },
    {
      "mnemonic": "vmov",
      "architecture": "ARMv8-A",
      "full_name": "Vector Move (Double <-> 2xGPR)",
      "summary": "Moves a Double register to/from two Core registers.",
      "syntax": "VMOV<c> <Rt>, <Rt2>, <Dm>",
      "encoding": {
        "format": "VFP Transfer",
        "binary_pattern": "cond | 11000 | 1 | 0 | 0 | Rt2 | Rt | 10 | 11 | 00 | M | 1 | Vm",
        "hex_opcode": "0x0C400B10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11000",
            "clean": "11000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Low"
        },
        {
          "name": "Rt2",
          "desc": "High"
        },
        {
          "name": "Dm",
          "desc": "VFP"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Transfers a 64-bit value between a VFP double-precision register (Dm) and two consecutive ARM core registers (Rt for bits [31:0], Rt2 for bits [63:32]). Direction is determined by the opcode bit pattern: from core to VFP or VFP to core. No condition flags are affected.",
      "example": "VMOV r3, r4, d2",
      "pseudocode": "if direction == 'core_to_vfp' then Dm ← Rt2 || Rt; else Rt ← Dm[31:0]; Rt2 ← Dm[63:32];"
    },
    {
      "mnemonic": "vcvta",
      "architecture": "ARMv8-A",
      "full_name": "Vector Convert to Integer (Nearest, Double)",
      "summary": "Converts double to integer, rounding to nearest.",
      "syntax": "VCVTA<c>.<dt>.F64 <Sd>, <Dm>",
      "encoding": {
        "format": "VFP Convert",
        "binary_pattern": "111111101 | D | 111 | 1 | 00 | Vd | 10 | 11 | op | 1 | M | 0 | Vm",
        "hex_opcode": "0xFEBC0B40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "op",
            "clean": "op"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:19 | 18 | 17:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Converts a 64-bit double-precision floating-point value to a 32-bit integer, rounding to nearest (away from zero on tie). Executes conditionally in A32 and writes the integer result to a 32-bit floating-point register. No condition flags are affected by this instruction.",
      "example": "VCVTA.dt.F64 s0, d2",
      "pseudocode": "if ConditionPassed() then\n  Sd = ConvertToInt(Dm, RoundingMode=RoundToNearest)"
    },
    {
      "mnemonic": "vcvtn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Convert to Integer (Nearest Even, Double)",
      "summary": "Converts double to integer, rounding to nearest even.",
      "syntax": "VCVTN<c>.<dt>.F64 <Sd>, <Dm>",
      "encoding": {
        "format": "VFP Convert",
        "binary_pattern": "111111101 | D | 111 | 1 | 01 | Vd | 10 | 11 | op | 1 | M | 0 | Vm",
        "hex_opcode": "0xFEBD0B40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "op",
            "clean": "op"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:19 | 18 | 17:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Converts a 64-bit double-precision floating-point value to a 32-bit integer, rounding to nearest even (banker's rounding). Executes conditionally in A32 and writes the integer result to a 32-bit floating-point register. No condition flags are affected by this instruction.",
      "example": "VCVTN.dt.F64 s0, d2",
      "pseudocode": "if ConditionPassed() then\n  Sd = ConvertToInt(Dm, RoundingMode=RoundToNearestEven)"
    },
    {
      "mnemonic": "vcvt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Convert (Fixed Point)",
      "summary": "Converts between floating-point and fixed-point.",
      "syntax": "VCVT<c>.<Td>.<Tm> <Qd>, <Qm>, #<fbits>",
      "encoding": {
        "format": "VFP Convert",
        "binary_pattern": "cond | 11101 | D | 11 | 1 | 1 | 1 | U | Vd | 10 | 10 | sx | 1 | i | 0 | imm4",
        "hex_opcode": "0x0EBE0A40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "sx",
            "clean": "sx"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "i",
            "clean": "i"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18 | 17 | 16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "fbits",
          "desc": "Number of fractional bits"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Converts between floating-point and fixed-point formats in 128-bit SIMD registers with a specified number of fractional bits. This is a NEON instruction that operates element-wise on the vector operands. No condition flags are affected.",
      "example": "VCVT.Td.Tm q0, q2, #8",
      "pseudocode": "if ConditionPassed() then\n  for i = 0 to elements-1\n    if Tm == F32 then\n      Qd[i] = FixedPointConvert(Qm[i], fbits)\n    else\n      Qd[i] = FloatingPointConvert(Qm[i], fbits)"
    },
    {
      "mnemonic": "addg",
      "architecture": "ARMv8-A",
      "full_name": "Add with Tag",
      "summary": "Adds an immediate to an address, modifying the Allocation Tag (MTE).",
      "syntax": "ADDG <Xd|SP>, <Xn|SP>, #<uimm6>, #<uimm4>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 0 | 0 | 1000110 | uimm6 | 00 | uimm4 | Xn | Xd",
        "hex_opcode": "0x91800000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1000110",
            "clean": "1000110"
          },
          {
            "raw": "uimm6",
            "clean": "uimm6"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "uimm4",
            "clean": "uimm4"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xd",
            "clean": "Xd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:22 | 21:16 | 15:14 | 13:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "uimm6",
          "desc": "Address Offset"
        },
        {
          "name": "uimm4",
          "desc": "Tag Offset"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Adds a scaled immediate offset (uimm6 × 16) to an address in the source register and simultaneously updates the Memory Tagging Extension (MTE) Allocation Tag in bits [59:56] by adding uimm4. The result is stored in the destination register. This is an AArch64-only instruction that modifies both address and tag atomically. No condition flags are affected.",
      "example": "ADDG x0, x1, #8, #3",
      "pseudocode": "address_offset ← uimm6 × 16\ntag_offset ← uimm4\nif Xn == SP then\n  Xd ← (Xn + address_offset)[63:0]\n  Xd[59:56] ← (Xn[59:56] + tag_offset) AND 0xF\nelse\n  Xd ← (Xn + address_offset)[63:0]\n  Xd[59:56] ← (Xn[59:56] + tag_offset) AND 0xF"
    },
    {
      "mnemonic": "subg",
      "architecture": "ARMv8-A",
      "full_name": "Subtract with Tag",
      "summary": "Subtracts an immediate from an address, modifying the Allocation Tag (MTE).",
      "syntax": "SUBG <Xd|SP>, <Xn|SP>, #<uimm6>, #<uimm4>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 1000110 | uimm6 | 00 | uimm4 | Xn | Xd",
        "hex_opcode": "0xD1800000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1000110",
            "clean": "1000110"
          },
          {
            "raw": "uimm6",
            "clean": "uimm6"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "uimm4",
            "clean": "uimm4"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xd",
            "clean": "Xd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:22 | 21:16 | 15:14 | 13:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "uimm6",
          "desc": "Address Offset"
        },
        {
          "name": "uimm4",
          "desc": "Tag Offset"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Subtracts a scaled immediate offset (uimm6 × 16) from an address in the source register and simultaneously updates the Memory Tagging Extension (MTE) Allocation Tag in bits [59:56] by adding uimm4. The result is stored in the destination register. This is an AArch64-only instruction that modifies both address and tag atomically. No condition flags are affected.",
      "example": "SUBG x0, x1, #8, #3",
      "pseudocode": "address_offset ← uimm6 × 16\ntag_offset ← uimm4\nif Xn == SP then\n  Xd ← (Xn - address_offset)[63:0]\n  Xd[59:56] ← (Xn[59:56] + tag_offset) AND 0xF\nelse\n  Xd ← (Xn - address_offset)[63:0]\n  Xd[59:56] ← (Xn[59:56] + tag_offset) AND 0xF"
    },
    {
      "mnemonic": "cosp",
      "architecture": "ARMv8-A",
      "full_name": "Call Out Speculation",
      "summary": "Prevents speculation from determining that the instruction is executed.",
      "syntax": "COSP <Xt>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 0 | 01 | 011 | 0111 | 0011 | 110 | Rt",
        "hex_opcode": "0xD50B73C0",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Reg"
        }
      ],
      "extension": "FEAT_CSV3 (Speculation)",
      "description": "Call Out Speculation: prevents speculation from reaching instructions beyond this point until the operand register is committed. This instruction is part of the CSV3 speculation control feature and executes in AArch64 state only. It does not affect any condition flags and requires the source register value to be resolved before execution can proceed speculatively.",
      "example": "COSP x3",
      "pseudocode": "if FEAT_CSV3 == '0' then\n  UNDEFINED\nelse\n  CommitSpeculation(X[t])"
    },
    {
      "mnemonic": "cpp",
      "architecture": "ARMv8-A",
      "full_name": "Cache Prefetch Prediction Pruning",
      "summary": "Prevents cache prefetch prediction past this instruction.",
      "syntax": "CPPP <Xt>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 0 | 01 | 011 | 0111 | 0011 | 111 | Rt",
        "hex_opcode": "0xD50B73E0",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Reg"
        }
      ],
      "extension": "FEAT_CPP",
      "description": "Prevents cache prefetch prediction from reordering beyond this instruction, allowing precise control over cache prefetch behavior. This is an AArch64-only instruction requiring FEAT_CPP (Cache Prefetch Prediction). The source register Xt is ignored; the instruction acts as a prefetch prediction barrier. No condition flags are affected.",
      "example": "CPPP x3",
      "pseudocode": "Cache_Prefetch_Prediction_Barrier()"
    },
    {
      "mnemonic": "rcwswpp",
      "architecture": "ARMv8-A",
      "full_name": "Read Check Write Swap Pair",
      "summary": "Atomically swaps a 128-bit register pair with a checked descriptor in memory (Translation Hardening).",
      "syntax": "RCWSWPP <Xt>, <Xt+1>, [<Xn>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "0 | 0 | 011001 | 0 | 0 | 1 | Rt2 | 1 | 010 | 00 | Rn | Rt",
        "hex_opcode": "0x1920A000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011001",
            "clean": "011001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Data/Status"
        },
        {
          "name": "Xt+1",
          "desc": "Second register of the data pair"
        },
        {
          "name": "Xn",
          "desc": "Address"
        }
      ],
      "extension": "FEAT_THE (Hardening)",
      "description": "Atomically reads a 128-bit translation table descriptor from memory, checks its validity, and conditionally writes it back with hardening constraints (FEAT_THE). The instruction requires 128-bit alignment and is available only in AArch64. Acquire-Release semantics are not applied; results are returned in a pair of 64-bit registers with status flags.",
      "example": "RCWSWPP x2, x3, [x1]",
      "pseudocode": "address ← Xn; data ← Mem[address, 16]; ValidateAndProcess(data); if validated then Mem[address, 16] ← data; Xt ← data[63:0]; Xt+1 ← data[127:64];"
    },
    {
      "mnemonic": "ldff1b",
      "architecture": "ARMv8-A",
      "full_name": "SVE Load First-Fault Contiguous Bytes",
      "summary": "Loads bytes speculatively; suppresses faults after the first active element.",
      "syntax": "LDFF1B { <Zt>.B }, <Pg>/Z, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Load",
        "binary_pattern": "1010010 | 000 | 0 | Rm | 011 | Pg | Rn | Zt",
        "hex_opcode": "0xA4006000",
        "visual_parts": [
          {
            "raw": "1010010",
            "clean": "1010010"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24:22 | 21 | 20:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Transfer scalable vector register (SVE load/store)"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "SVE",
      "description": "Loads bytes from memory into a scalable vector register with first-fault semantics; subsequent faults are suppressed if any active element has already been loaded. Only elements where the predicate is true are loaded. This instruction is AArch64-only and requires SVE. No condition flags are set.",
      "example": "LDFF1B p0/m/Z, [x1]",
      "pseudocode": "for i ← 0 to (VL/8 - 1) do if Pg[i] then Zt[i*8+7:i*8] ← [Xn + i]; faulted ← false; end if; if fault_occurs and faulted then suppress_fault; faulted ← true; end if; end for"
    },
    {
      "mnemonic": "ldff1h",
      "architecture": "ARMv8-A",
      "full_name": "SVE Load First-Fault Contiguous Halfwords",
      "summary": "Loads halfwords speculatively; suppresses faults after the first active element.",
      "syntax": "LDFF1H { <Zt>.H }, <Pg>/Z, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Load",
        "binary_pattern": "1010010 | 010 | 1 | Rm | 011 | Pg | Rn | Zt",
        "hex_opcode": "0xA4A06000",
        "visual_parts": [
          {
            "raw": "1010010",
            "clean": "1010010"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24:22 | 21 | 20:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Transfer scalable vector register (SVE load/store)"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "SVE",
      "description": "Loads halfwords from memory into a scalable vector register with first-fault semantics; subsequent faults are suppressed if any active element has already been loaded. Only elements where the predicate is true are loaded. This instruction is AArch64-only and requires SVE. No condition flags are set.",
      "example": "LDFF1H p0/m/Z, [x1]",
      "pseudocode": "for i ← 0 to (VL/16 - 1) do if Pg[i] then Zt[i*16+15:i*16] ← [Xn + i*2]; faulted ← false; end if; if fault_occurs and faulted then suppress_fault; faulted ← true; end if; end for"
    },
    {
      "mnemonic": "ldff1w",
      "architecture": "ARMv8-A",
      "full_name": "SVE Load First-Fault Contiguous Words",
      "summary": "Loads words speculatively; suppresses faults after the first active element.",
      "syntax": "LDFF1W { <Zt>.S }, <Pg>/Z, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Load",
        "binary_pattern": "1000010 | 1 | 0 | xs | 0 | Zm | 0 | 1 | 1 | Pg | Rn | Zt",
        "hex_opcode": "0x85006000",
        "visual_parts": [
          {
            "raw": "1000010",
            "clean": "1000010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "xs",
            "clean": "xs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21 | 20:16 | 15 | 14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Transfer scalable vector register (SVE load/store)"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "SVE",
      "description": "Loads words from memory into a scalable vector register with first-fault semantics; subsequent faults are suppressed if any active element has already been loaded. Only elements where the predicate is true are loaded. This instruction is AArch64-only and requires SVE. No condition flags are set.",
      "example": "LDFF1W p0/m/Z, [x1]",
      "pseudocode": "for i ← 0 to (VL/32 - 1) do if Pg[i] then Zt[i*32+31:i*32] ← [Xn + i*4]; faulted ← false; end if; if fault_occurs and faulted then suppress_fault; faulted ← true; end if; end for"
    },
    {
      "mnemonic": "ldff1d",
      "architecture": "ARMv8-A",
      "full_name": "SVE Load First-Fault Contiguous Doublewords",
      "summary": "Loads doublewords speculatively; suppresses faults after the first active element.",
      "syntax": "LDFF1D { <Zt>.D }, <Pg>/Z, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Load",
        "binary_pattern": "1100010 | 1 | 1 | 10 | Zm | 1 | 1 | 1 | Pg | Rn | Zt",
        "hex_opcode": "0xC5C0E000",
        "visual_parts": [
          {
            "raw": "1100010",
            "clean": "1100010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22:21 | 20:16 | 15 | 14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Transfer scalable vector register (SVE load/store)"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "SVE",
      "description": "Loads doublewords from memory into a scalable vector register with first-fault semantics; subsequent faults are suppressed if any active element has already been loaded. Only elements where the predicate is true are loaded. This instruction is AArch64-only and requires SVE. No condition flags are set.",
      "example": "LDFF1D p0/m/Z, [x1]",
      "pseudocode": "for i ← 0 to (VL/64 - 1) do if Pg[i] then Zt[i*64+63:i*64] ← [Xn + i*8]; faulted ← false; end if; if fault_occurs and faulted then suppress_fault; faulted ← true; end if; end for"
    },
    {
      "mnemonic": "ldnf1b",
      "architecture": "ARMv8-A",
      "full_name": "SVE Load Non-Fault Contiguous Bytes",
      "summary": "Loads bytes without faulting; returns 0 if fault occurs.",
      "syntax": "LDNF1B { <Zt>.B }, <Pg>/Z, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Load",
        "binary_pattern": "1010010 | 000 | 0 | 1 | imm4 | 101 | Pg | Rn | Zt",
        "hex_opcode": "0xA410A000",
        "visual_parts": [
          {
            "raw": "1010010",
            "clean": "1010010"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24:22 | 21 | 20 | 19:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Transfer scalable vector register (SVE load/store)"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "SVE",
      "description": "Loads bytes from memory into a scalable vector register without raising faults; elements that would fault are loaded as zero. Only elements where the predicate is true are accessed. This instruction is AArch64-only and requires SVE. No condition flags are set.",
      "example": "LDNF1B p0/m/Z, [x1]",
      "pseudocode": "for i ← 0 to (VL/8 - 1) do if Pg[i] then if fault_would_occur then Zt[i*8+7:i*8] ← 0; else Zt[i*8+7:i*8] ← [Xn + i]; end if; end if; end for"
    },
    {
      "mnemonic": "ldnf1h",
      "architecture": "ARMv8-A",
      "full_name": "SVE Load Non-Fault Contiguous Halfwords",
      "summary": "Loads halfwords without faulting.",
      "syntax": "LDNF1H { <Zt>.H }, <Pg>/Z, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Load",
        "binary_pattern": "1010010 | 010 | 1 | 1 | imm4 | 101 | Pg | Rn | Zt",
        "hex_opcode": "0xA4B0A000",
        "visual_parts": [
          {
            "raw": "1010010",
            "clean": "1010010"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24:22 | 21 | 20 | 19:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Transfer scalable vector register (SVE load/store)"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "SVE",
      "description": "Loads halfwords from memory into a scalable vector register without raising faults; elements that would fault are loaded as zero. Only elements where the predicate is true are accessed. This instruction is AArch64-only and requires SVE. No condition flags are set.",
      "example": "LDNF1H p0/m/Z, [x1]",
      "pseudocode": "for i ← 0 to (VL/16 - 1) do if Pg[i] then if fault_would_occur then Zt[i*16+15:i*16] ← 0; else Zt[i*16+15:i*16] ← [Xn + i*2]; end if; end if; end for"
    },
    {
      "mnemonic": "ldnf1w",
      "architecture": "ARMv8-A",
      "full_name": "SVE Load Non-Fault Contiguous Words",
      "summary": "Loads words without faulting.",
      "syntax": "LDNF1W { <Zt>.S }, <Pg>/Z, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Load",
        "binary_pattern": "1010010 | 101 | 0 | 1 | imm4 | 101 | Pg | Rn | Zt",
        "hex_opcode": "0xA550A000",
        "visual_parts": [
          {
            "raw": "1010010",
            "clean": "1010010"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24:22 | 21 | 20 | 19:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Transfer scalable vector register (SVE load/store)"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "SVE",
      "description": "Loads words from memory into a scalable vector register without raising faults; elements that would fault are loaded as zero. Only elements where the predicate is true are accessed. This instruction is AArch64-only and requires SVE. No condition flags are set.",
      "example": "LDNF1W p0/m/Z, [x1]",
      "pseudocode": "for i ← 0 to (VL/32 - 1) do if Pg[i] then if fault_would_occur then Zt[i*32+31:i*32] ← 0; else Zt[i*32+31:i*32] ← [Xn + i*4]; end if; end if; end for"
    },
    {
      "mnemonic": "ldnf1d",
      "architecture": "ARMv8-A",
      "full_name": "SVE Load Non-Fault Contiguous Doublewords",
      "summary": "Loads doublewords without faulting.",
      "syntax": "LDNF1D { <Zt>.D }, <Pg>/Z, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Load",
        "binary_pattern": "1010010 | 111 | 1 | 1 | imm4 | 101 | Pg | Rn | Zt",
        "hex_opcode": "0xA5F0A000",
        "visual_parts": [
          {
            "raw": "1010010",
            "clean": "1010010"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24:22 | 21 | 20 | 19:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Transfer scalable vector register (SVE load/store)"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "SVE",
      "description": "Loads contiguous doublewords (64-bit elements) from memory into a scalable vector register without generating a fault if a load would be out-of-bounds or inaccessible. Only elements where the corresponding predicate bit in Pg is true are loaded; others are zeroed in the destination Zt. This instruction is AArch64-only, requires SVE support, and does not affect condition flags.",
      "example": "LDNF1D p0/m/Z, [x1]",
      "pseudocode": "for i = 0 to VL/64-1\n  if Pg[i] == 1 then\n    Zt.D[i] ← [Xn + (i × 8)]\n  else\n    Zt.D[i] ← 0\n  endif\nendfor"
    },
    {
      "mnemonic": "whilelo",
      "architecture": "ARMv8-A",
      "full_name": "SVE While Lower (Unsigned)",
      "summary": "Generates predicate for unsigned loop (while Xn < Xm).",
      "syntax": "WHILELO <Pd>.<T>, <Xn>, <Xm>",
      "encoding": {
        "format": "SVE Compare",
        "binary_pattern": "00100101 | size | 1 | Rm | 000 | sf | 1 | 1 | Rn | 0 | Pd",
        "hex_opcode": "0x25200C00",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "sf",
            "clean": "sf"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11 | 10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Destination predicate register (SVE)"
        },
        {
          "name": "Xn",
          "desc": "Start"
        },
        {
          "name": "Xm",
          "desc": "Limit"
        }
      ],
      "extension": "SVE",
      "description": "Generates a predicate where each element is true if the corresponding loop counter (Xn + element_index) is less than Xm (unsigned comparison). The output predicate Pd has element width determined by <T> (byte, halfword, word, or doubleword). This is an AArch64-only SVE instruction; all condition flags are unaffected.",
      "example": "WHILELO p0.T, x1, x2",
      "pseudocode": "element_size ← size_in_bytes(<T>)\nfor i = 0 to VL/element_size-1\n  if (Xn + i) < Xm then\n    Pd[i] ← 1\n  else\n    Pd[i] ← 0\n  endif\nendfor"
    },
    {
      "mnemonic": "whilels",
      "architecture": "ARMv8-A",
      "full_name": "SVE While Lower or Same (Unsigned)",
      "summary": "Generates predicate for unsigned loop (while Xn <= Xm).",
      "syntax": "WHILELS <Pd>.<T>, <Xn>, <Xm>",
      "encoding": {
        "format": "SVE Compare",
        "binary_pattern": "00100101 | size | 1 | Rm | 000 | sf | 1 | 1 | Rn | 1 | Pd",
        "hex_opcode": "0x25200C10",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "sf",
            "clean": "sf"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11 | 10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Destination predicate register (SVE)"
        },
        {
          "name": "Xn",
          "desc": "Start"
        },
        {
          "name": "Xm",
          "desc": "Limit"
        }
      ],
      "extension": "SVE",
      "description": "Generates a predicate where each element is true if the corresponding loop counter (Xn + element_index) is less than or equal to Xm (unsigned comparison). The output predicate Pd has element width determined by <T>. This is an AArch64-only SVE instruction; all condition flags are unaffected.",
      "example": "WHILELS p0.T, x1, x2",
      "pseudocode": "element_size ← size_in_bytes(<T>)\nfor i = 0 to VL/element_size-1\n  if (Xn + i) <= Xm then\n    Pd[i] ← 1\n  else\n    Pd[i] ← 0\n  endif\nendfor"
    },
    {
      "mnemonic": "whilehi",
      "architecture": "ARMv8-A",
      "full_name": "SVE While Higher (Unsigned)",
      "summary": "Generates predicate for unsigned loop (while Xn > Xm).",
      "syntax": "WHILEHI <Pd>.<T>, <Xn>, <Xm>",
      "encoding": {
        "format": "SVE Compare",
        "binary_pattern": "00100101 | size | 1 | Rm | 000 | sf | 1 | 0 | Rn | 1 | Pd",
        "hex_opcode": "0x25200810",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "sf",
            "clean": "sf"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11 | 10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Destination predicate register (SVE)"
        },
        {
          "name": "Xn",
          "desc": "Start"
        },
        {
          "name": "Xm",
          "desc": "Limit"
        }
      ],
      "extension": "SVE",
      "description": "Generates a predicate where each element is true if the corresponding loop counter (Xn + element_index) is greater than Xm (unsigned comparison). The output predicate Pd has element width determined by <T>. This is an AArch64-only SVE instruction; all condition flags are unaffected.",
      "example": "WHILEHI p0.T, x1, x2",
      "pseudocode": "element_size ← size_in_bytes(<T>)\nfor i = 0 to VL/element_size-1\n  if (Xn + i) > Xm then\n    Pd[i] ← 1\n  else\n    Pd[i] ← 0\n  endif\nendfor"
    },
    {
      "mnemonic": "whilehs",
      "architecture": "ARMv8-A",
      "full_name": "SVE While Higher or Same (Unsigned)",
      "summary": "Generates predicate for unsigned loop (while Xn >= Xm).",
      "syntax": "WHILEHS <Pd>.<T>, <Xn>, <Xm>",
      "encoding": {
        "format": "SVE Compare",
        "binary_pattern": "00100101 | size | 1 | Rm | 000 | sf | 1 | 0 | Rn | 0 | Pd",
        "hex_opcode": "0x25200800",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "sf",
            "clean": "sf"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11 | 10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Destination predicate register (SVE)"
        },
        {
          "name": "Xn",
          "desc": "Start"
        },
        {
          "name": "Xm",
          "desc": "Limit"
        }
      ],
      "extension": "SVE",
      "description": "Generates a predicate where each element is true if the corresponding loop counter (Xn + element_index) is greater than or equal to Xm (unsigned comparison). The output predicate Pd has element width determined by <T>. This is an AArch64-only SVE instruction; all condition flags are unaffected.",
      "example": "WHILEHS p0.T, x1, x2",
      "pseudocode": "element_size ← size_in_bytes(<T>)\nfor i = 0 to VL/element_size-1\n  if (Xn + i) >= Xm then\n    Pd[i] ← 1\n  else\n    Pd[i] ← 0\n  endif\nendfor"
    },
    {
      "mnemonic": "cntp",
      "architecture": "ARMv8-A",
      "full_name": "SVE Count Active Predicates",
      "summary": "Counts the number of true elements in a predicate.",
      "syntax": "CNTP <Xn>, <Pg>, <Pn>.<T>",
      "encoding": {
        "format": "SVE Count",
        "binary_pattern": "00100101 | size | 100 | 00 | 0 | 10 | Pg | 0 | Pn | Rd",
        "hex_opcode": "0x25208000",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pn",
            "clean": "Pn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:14 | 13:10 | 9 | 8:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xn",
          "desc": "Dest GPR"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Pn",
          "desc": "First source predicate register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Counts the number of true bits in Pn.T (where the element size <T> determines the predicate width) that are also true in the governing predicate Pg, and writes the 64-bit count to the general-purpose register Xn. This is an AArch64-only SVE instruction; all condition flags are unaffected.",
      "example": "CNTP x1, p0/m, p1.T",
      "pseudocode": "count ← 0\nelement_size ← size_in_bytes(<T>)\nfor i = 0 to VL/element_size-1\n  if Pg[i] == 1 and Pn[i] == 1 then\n    count ← count + 1\n  endif\nendfor\nXn ← count"
    },
    {
      "mnemonic": "ptest",
      "architecture": "ARMv8-A",
      "full_name": "SVE Predicate Test",
      "summary": "Updates processor flags (NZCV) based on predicate state.",
      "syntax": "PTEST <Pg>, <Pn>.B",
      "encoding": {
        "format": "SVE Predicate",
        "binary_pattern": "00 | 100101 | 0 | 1 | 01 | 000011 | Pg | 0 | Pn | 0 | 0 | 0 | 0 | 0",
        "hex_opcode": "0x2550C000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "100101",
            "clean": "100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "000011",
            "clean": "000011"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pn",
            "clean": "Pn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          }
        ],
        "bit_positions": "31:30 | 29:24 | 23 | 22 | 21:20 | 19:14 | 13:10 | 9 | 8:5 | 4 | 3 | 2 | 1 | 0"
      },
      "operands": [
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Pn",
          "desc": "First source predicate register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Tests the predicate Pn.B (byte-wide elements) under the control of governing predicate Pg and updates the condition flags (N, Z, C, V) to indicate the result. Sets Z=1 if all tested elements are false, C=1 if any tested element is true, N and V are set according to the logical AND and OR of tested bits. This is an AArch64-only SVE instruction.",
      "example": "PTEST p0/m, p1.B",
      "pseudocode": "result_any ← 0\nresult_all ← 1\nfor i = 0 to VL/8-1\n  if Pg[i] == 1 then\n    if Pn[i] == 1 then\n      result_any ← 1\n      result_all ← result_all AND 1\n    else\n      result_all ← 0\n    endif\n  endif\nendfor\nZ ← (result_any == 0)\nC ← result_any\nN ← result_all\nV ← 0"
    },
    {
      "mnemonic": "pfirst",
      "architecture": "ARMv8-A",
      "full_name": "SVE Predicate First Active",
      "summary": "Sets destination predicate to true only at the first active element.",
      "syntax": "PFIRST <Pd>.B, <Pg>, <Pn>.B",
      "encoding": {
        "format": "SVE Predicate",
        "binary_pattern": "00100101 | 0 | 1 | 011000110000 | 0 | Pg | 0 | Pdn",
        "hex_opcode": "0x2558C000",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011000110000",
            "clean": "011000110000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pdn",
            "clean": "Pdn"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:10 | 9 | 8:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Dest Pred"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Pn",
          "desc": "First source predicate register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Sets the destination predicate Pd.B such that only the first element (in vector order) where both Pg and Pn are true is set to true; all other elements are set to false. This is useful for scalar tail-processing in loops. This is an AArch64-only SVE instruction; all condition flags are unaffected.",
      "example": "PFIRST p0.B, p0/m, p1.B",
      "pseudocode": "for i = 0 to VL/8-1\n  if Pg[i] == 1 and Pn[i] == 1 then\n    Pd[i] ← 1\n    break\n  else\n    Pd[i] ← 0\n  endif\nendfor\nfor j = i+1 to VL/8-1\n  Pd[j] ← 0\nendfor"
    },
    {
      "mnemonic": "clasta",
      "architecture": "ARMv8-A",
      "full_name": "SVE Conditional Last Element After",
      "summary": "Extracts element after the last active element.",
      "syntax": "CLASTA <Rdn>, <Pg>, <Rdn>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Extract",
        "binary_pattern": "00000101 | size | 11000 | 0 | 101 | Pg | Zm | Rdn",
        "hex_opcode": "0x0530A000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "11000",
            "clean": "11000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Rdn",
            "clean": "Rdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Rdn",
          "desc": "Dest/Fallback"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Zm",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "Extracts the element immediately after the last active element (as determined by the predicate) from a SVE vector and writes it to a scalar register; if no active elements exist, the destination register is unchanged. This instruction operates only in AArch64 state and does not modify the condition flags.",
      "example": "CLASTA r0, p0/m, r0, z2.s.T",
      "pseudocode": "activecount ← CountActiveLanes(Pg, esize)\nif activecount == VL/esize then\n  Rdn ← Zm[0]\nelse if activecount > 0 then\n  Rdn ← Zm[activecount]\nelse\n  Rdn ← Rdn"
    },
    {
      "mnemonic": "clastb",
      "architecture": "ARMv8-A",
      "full_name": "SVE Conditional Last Element Before",
      "summary": "Extracts the last active element.",
      "syntax": "CLASTB <Rdn>, <Pg>, <Rdn>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Extract",
        "binary_pattern": "00000101 | size | 11000 | 1 | 101 | Pg | Zm | Rdn",
        "hex_opcode": "0x0531A000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "11000",
            "clean": "11000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Rdn",
            "clean": "Rdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Rdn",
          "desc": "Dest/Fallback"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Zm",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "Extracts the last active element (as determined by the predicate) from a SVE vector and writes it to a scalar register; if no active elements exist, the destination register is unchanged. This instruction operates only in AArch64 state and does not modify the condition flags.",
      "example": "CLASTB r0, p0/m, r0, z2.s.T",
      "pseudocode": "activecount ← CountActiveLanes(Pg, esize)\nif activecount > 0 then\n  Rdn ← Zm[activecount - 1]\nelse\n  Rdn ← Rdn"
    },
    {
      "mnemonic": "lasta",
      "architecture": "ARMv8-A",
      "full_name": "SVE Extract Last Element After",
      "summary": "Extracts element after last active (SIMD scalar destination).",
      "syntax": "LASTA <Vd>.<T>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Extract",
        "binary_pattern": "00000101 | size | 10001 | 0 | 100 | Pg | Zn | Vd",
        "hex_opcode": "0x05228000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10001",
            "clean": "10001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "Extracts the element immediately after the last active element (as determined by the predicate) from a SVE vector and writes it to a SIMD scalar register; if no active elements exist, the destination register is unchanged. This instruction operates only in AArch64 state and does not modify the condition flags.",
      "example": "LASTA v0.4s.T, p0/m, z1.s.T",
      "pseudocode": "activecount ← CountActiveLanes(Pg, esize)\nif activecount == VL/esize then\n  Vd ← Zn[0]\nelse if activecount > 0 then\n  Vd ← Zn[activecount]\nelse\n  Vd ← Vd"
    },
    {
      "mnemonic": "lastb",
      "architecture": "ARMv8-A",
      "full_name": "SVE Extract Last Element Before",
      "summary": "Extracts last active element (SIMD scalar destination).",
      "syntax": "LASTB <Vd>.<T>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Extract",
        "binary_pattern": "00000101 | size | 10001 | 1 | 100 | Pg | Zn | Vd",
        "hex_opcode": "0x05238000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10001",
            "clean": "10001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "Extracts the last active element (as determined by the predicate) from a SVE vector and writes it to a SIMD scalar register; if no active elements exist, the destination register is unchanged. This instruction operates only in AArch64 state and does not modify the condition flags.",
      "example": "LASTB v0.4s.T, p0/m, z1.s.T",
      "pseudocode": "activecount ← CountActiveLanes(Pg, esize)\nif activecount > 0 then\n  Vd ← Zn[activecount - 1]\nelse\n  Vd ← Vd"
    },
    {
      "mnemonic": "insr",
      "architecture": "ARMv8-A",
      "full_name": "SVE Insert Scalar",
      "summary": "Inserts scalar into bottom of vector, shifting other elements up.",
      "syntax": "INSR <Zdn>.<T>, <R><m>",
      "encoding": {
        "format": "SVE Move",
        "binary_pattern": "00000101 | size | 100100001110 | Rm | Zdn",
        "hex_opcode": "0x05243800",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "100100001110",
            "clean": "100100001110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Rm",
          "desc": "Scalar Src"
        }
      ],
      "extension": "SVE",
      "description": "Inserts a scalar register value into the bottom element of a SVE vector, shifting all other elements upward (toward higher element indices), with the top element discarded. This instruction operates only in AArch64 state and does not modify the condition flags.",
      "example": "INSR z0.s.T, Rm",
      "pseudocode": "elements ← VL / esize\nfor i = elements - 1 downto 1\n  Zdn[i] ← Zdn[i-1]\nZdn[0] ← Rm"
    },
    {
      "mnemonic": "ext",
      "architecture": "ARMv8-A",
      "full_name": "SVE Extract Vector",
      "summary": "Extracts a vector from a pair (sliding window) using immediate byte index.",
      "syntax": "EXT <Zdn>.<T>, <Zdn>.<T>, <Zm>.<T>, #<imm>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101001 | imm8h | 000 | imm8l | Zm | Zdn",
        "hex_opcode": "0x05200000",
        "visual_parts": [
          {
            "raw": "00000101001",
            "clean": "00000101001"
          },
          {
            "raw": "imm8h",
            "clean": "imm8h"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "imm8l",
            "clean": "imm8l"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:21 | 20:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Low"
        },
        {
          "name": "Zm",
          "desc": "High"
        },
        {
          "name": "imm",
          "desc": "Index"
        }
      ],
      "extension": "SVE",
      "description": "Extracts a contiguous sequence of bytes from the concatenation of two SVE vectors (the low vector followed by the high vector) starting at a byte offset, and places the result in the destination vector. This instruction operates only in AArch64 state and does not modify the condition flags.",
      "example": "EXT z0.s.T, z0.s.T, z2.s.T, #16",
      "pseudocode": "offset ← imm\nresult ← Concatenate(Zdn, Zm)[offset:offset + (VL/8) - 1]\nZdn ← result"
    },
    {
      "mnemonic": "rev",
      "architecture": "ARMv8-A",
      "full_name": "SVE Reverse Vector",
      "summary": "Reverses the order of elements in the vector.",
      "syntax": "REV <Zd>.<T>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 111000001110 | Zn | Zd",
        "hex_opcode": "0x05383800",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "111000001110",
            "clean": "111000001110"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Reverses the order of elements within a SVE vector; the element at index 0 is moved to the last position, and the last element is moved to index 0. This instruction operates only in AArch64 state and does not modify the condition flags.",
      "example": "REV z0.s.T, z1.s.T",
      "pseudocode": "elements ← VL / esize\nfor i = 0 to elements - 1\n  Zd[i] ← Zn[elements - 1 - i]"
    },
    {
      "mnemonic": "revb",
      "architecture": "ARMv8-A",
      "full_name": "SVE Reverse Bytes in Elements",
      "summary": "Reverses bytes within 16/32/64-bit elements.",
      "syntax": "REVB <Zd>.<T>, <Pg>/M, <Zn>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1001 | 0 | 0 | 100 | Pg | Zn | Zd",
        "hex_opcode": "0x05248000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Reverses the byte order within each element of a SVE vector under predicate control; for 16-bit elements 2 bytes are reversed, for 32-bit elements 4 bytes, and for 64-bit elements 8 bytes. This instruction operates only in AArch64 state and does not modify the condition flags.",
      "example": "REVB z0.s.T, p0/m/M, z1.s.T",
      "pseudocode": "elements ← VL / esize\nfor i = 0 to elements - 1\n  if Pg[i] then\n    Zd[i] ← ReverseBytes(Zn[i], esize)\n  else\n    Zd[i] ← Zd[i]"
    },
    {
      "mnemonic": "revh",
      "architecture": "ARMv8-A",
      "full_name": "SVE Reverse Halfwords in Elements",
      "summary": "Reverses halfwords within 32/64-bit elements.",
      "syntax": "REVH <Zd>.<T>, <Pg>/M, <Zn>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1001 | 0 | 1 | 100 | Pg | Zn | Zd",
        "hex_opcode": "0x05258000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Reverses the byte order of halfwords (16-bit elements) within 32-bit or 64-bit SVE vector elements, operating under predicate control. No condition flags are affected. This instruction is AArch64-only and available with the SVE extension; it performs element-wise reversals where each 32-bit or 64-bit element has its constituent halfwords byte-reversed in place.",
      "example": "REVH z0.s.T, p0/m/M, z1.s.T",
      "pseudocode": "for i = 0 to VL/esize-1\n  if Pg[i] then\n    case esize of\n      32: Zd[i+1:i] ← reverse_halfwords_in_32bit(Zn[i+1:i])\n      64: Zd[i+1:i] ← reverse_halfwords_in_64bit(Zn[i+1:i])\n  else\n    Zd[i+1:i] ← Zd[i+1:i]"
    },
    {
      "mnemonic": "revw",
      "architecture": "ARMv8-A",
      "full_name": "SVE Reverse Words in Elements",
      "summary": "Reverses words within 64-bit elements.",
      "syntax": "REVW <Zd>.D, <Pg>/M, <Zn>.D",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1001 | 1 | 0 | 100 | Pg | Zn | Zd",
        "hex_opcode": "0x05268000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Reverses the byte order of words (32-bit elements) within 64-bit SVE vector elements, operating under predicate control. No condition flags are affected. This instruction is AArch64-only and available with the SVE extension; it swaps the two 32-bit words in each 64-bit element.",
      "example": "REVW z0.s.D, p0/m/M, z1.s.D",
      "pseudocode": "for i = 0 to VL/64-1\n  if Pg[i] then\n    Zd[i+1:i] ← {Zn[i+31:i], Zn[i+63:i+32]}\n  else\n    Zd[i+1:i] ← Zd[i+1:i]"
    },
    {
      "mnemonic": "rbit",
      "architecture": "ARMv8-A",
      "full_name": "SVE Reverse Bits",
      "summary": "Reverses bits in each element.",
      "syntax": "RBIT <Zd>.<T>, <Pg>/M, <Zn>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1001 | 1 | 1 | 100 | Pg | Zn | Zd",
        "hex_opcode": "0x05278000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Reverses the bit order within each SVE vector element, operating under predicate control. No condition flags are affected. This instruction is AArch64-only and available with the SVE extension; each element's bits are reversed such that bit 0 becomes the MSB and the MSB becomes bit 0.",
      "example": "RBIT z0.s.T, p0/m/M, z1.s.T",
      "pseudocode": "for i = 0 to VL/esize-1\n  if Pg[i] then\n    Zd[i+1:i] ← reverse_bits(Zn[i+1:i], esize)\n  else\n    Zd[i+1:i] ← Zd[i+1:i]"
    },
    {
      "mnemonic": "sunpklo",
      "architecture": "ARMv8-A",
      "full_name": "SVE Signed Unpack Low",
      "summary": "Unpacks and sign-extends lower half of vector elements.",
      "syntax": "SUNPKLO <Zd>.<T>, <Zn>.<Tb>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1100 | 0 | 0 | 001110 | Zn | Zd",
        "hex_opcode": "0x05303800",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001110",
            "clean": "001110"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Unpacks the lower half of each source element and sign-extends it to the destination element size in SVE vectors. No condition flags are affected. This instruction is AArch64-only and available with the SVE extension; destination elements are twice the width of source elements, with sign extension applied to the lower elements.",
      "example": "SUNPKLO z0.s.T, z1.s.Tb",
      "pseudocode": "for i = 0 to VL/esize_dst-1\n  Zd[i+1:i] ← sign_extend(Zn[i+esize_src/2-1:i], esize_dst)"
    },
    {
      "mnemonic": "sunpkhi",
      "architecture": "ARMv8-A",
      "full_name": "SVE Signed Unpack High",
      "summary": "Unpacks and sign-extends upper half of vector elements.",
      "syntax": "SUNPKHI <Zd>.<T>, <Zn>.<Tb>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1100 | 0 | 1 | 001110 | Zn | Zd",
        "hex_opcode": "0x05313800",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "001110",
            "clean": "001110"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Unpacks the upper half of each source element and sign-extends it to the destination element size in SVE vectors. No condition flags are affected. This instruction is AArch64-only and available with the SVE extension; destination elements are twice the width of source elements, with sign extension applied to the upper elements.",
      "example": "SUNPKHI z0.s.T, z1.s.Tb",
      "pseudocode": "for i = 0 to VL/esize_dst-1\n  Zd[i+1:i] ← sign_extend(Zn[i+esize_src-1:i+esize_src/2], esize_dst)"
    },
    {
      "mnemonic": "uunpklo",
      "architecture": "ARMv8-A",
      "full_name": "SVE Unsigned Unpack Low",
      "summary": "Unpacks and zero-extends lower half of vector elements.",
      "syntax": "UUNPKLO <Zd>.<T>, <Zn>.<Tb>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1100 | 1 | 0 | 001110 | Zn | Zd",
        "hex_opcode": "0x05323800",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001110",
            "clean": "001110"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Unpacks the lower half of each source element and zero-extends it to the destination element size in SVE vectors. No condition flags are affected. This instruction is AArch64-only and available with the SVE extension; destination elements are twice the width of source elements, with zero extension applied to the lower elements.",
      "example": "UUNPKLO z0.s.T, z1.s.Tb",
      "pseudocode": "for i = 0 to VL/esize_dst-1\n  Zd[i+1:i] ← zero_extend(Zn[i+esize_src/2-1:i], esize_dst)"
    },
    {
      "mnemonic": "uunpkhi",
      "architecture": "ARMv8-A",
      "full_name": "SVE Unsigned Unpack High",
      "summary": "Unpacks and zero-extends upper half of vector elements.",
      "syntax": "UUNPKHI <Zd>.<T>, <Zn>.<Tb>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1100 | 1 | 1 | 001110 | Zn | Zd",
        "hex_opcode": "0x05333800",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "001110",
            "clean": "001110"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Unpacks the upper half of each source element and zero-extends it to the destination element size in SVE vectors. No condition flags are affected. This instruction is AArch64-only and available with the SVE extension; destination elements are twice the width of source elements, with zero extension applied to the upper elements.",
      "example": "UUNPKHI z0.s.T, z1.s.Tb",
      "pseudocode": "for i = 0 to VL/esize_dst-1\n  Zd[i+1:i] ← zero_extend(Zn[i+esize_src-1:i+esize_src/2], esize_dst)"
    },
    {
      "mnemonic": "sdot",
      "architecture": "ARMv8-A",
      "full_name": "SVE Signed Dot Product",
      "summary": "Computes dot product of signed integers (AI Acceleration).",
      "syntax": "SDOT <Zda>.<T>, <Zn>.<Tb>, <Zm>.<Tb>",
      "encoding": {
        "format": "SVE Dot Product",
        "binary_pattern": "01000100 | size | 0 | Zm | 00000 | 0 | Zn | Zda",
        "hex_opcode": "0x44000000",
        "visual_parts": [
          {
            "raw": "01000100",
            "clean": "01000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zda",
            "clean": "Zda"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zda",
          "desc": "Accumulator"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Computes the dot product of signed integer vectors and accumulates the result into the destination register, supporting AI acceleration. No condition flags are affected. This instruction is AArch64-only and available with the SVE extension; the destination is widened relative to the sources, and the accumulation is added to existing values in Zda.",
      "example": "SDOT z0.s.T, z1.s.Tb, z2.s.Tb",
      "pseudocode": "for i = 0 to VL/esize_dst-1\n  product ← 0\n  for j = 0 to (esize_dst / esize_src) - 1\n    product ← product + sign_extend(Zn[i*esize_dst + (j+1)*esize_src - 1 : i*esize_dst + j*esize_src], esize_dst) * sign_extend(Zm[i*esize_dst + (j+1)*esize_src - 1 : i*esize_dst + j*esize_src], esize_dst)\n  Zda[i+1:i] ← Zda[i+1:i] + product"
    },
    {
      "mnemonic": "udot",
      "architecture": "ARMv8-A",
      "full_name": "SVE Unsigned Dot Product",
      "summary": "Computes dot product of unsigned integers.",
      "syntax": "UDOT <Zda>.<T>, <Zn>.<Tb>, <Zm>.<Tb>",
      "encoding": {
        "format": "SVE Dot Product",
        "binary_pattern": "01000100 | size | 0 | Zm | 00000 | 1 | Zn | Zda",
        "hex_opcode": "0x44000400",
        "visual_parts": [
          {
            "raw": "01000100",
            "clean": "01000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zda",
            "clean": "Zda"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zda",
          "desc": "Accumulator"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE unsigned dot product: accumulates the sum of element-wise products of unsigned integers from Zn and Zm into Zda. The element size of Zn and Zm (Tb) is half that of Zda (T), allowing 2, 4, or 8 products to be summed per destination element depending on the vector length. No condition flags are affected. This is an AArch64-only instruction requiring SVE support.",
      "example": "UDOT z0.s.T, z1.s.Tb, z2.s.Tb",
      "pseudocode": "for e = 0 to VL/getElementSize(T)-1\n  element_pairs = getElements(Zn[e], Tb) × getElements(Zm[e], Tb)\n  Zda[e] ← Zda[e] + sum(element_pairs)\nend for"
    },
    {
      "mnemonic": "smax",
      "architecture": "ARMv8-A",
      "full_name": "SVE Signed Maximum",
      "summary": "Determines maximum signed value per element.",
      "syntax": "SMAX <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Integer Binary",
        "binary_pattern": "00000100 | size | 001 | 0 | 0 | 0 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x04080000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE signed maximum: computes the element-wise maximum of two signed integer vectors (Zdn and Zm), writing results to Zdn under predicate mask control (Pg). Only elements where the predicate is active are updated; inactive elements retain their original values in Zdn. No condition flags are affected. This is an AArch64-only instruction requiring SVE support.",
      "example": "SMAX z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for e = 0 to VL/getElementSize(T)-1\n  if Pg[e] == 1 then\n    Zdn[e] ← max_signed(Zdn[e], Zm[e])\n  end if\nend for"
    },
    {
      "mnemonic": "smin",
      "architecture": "ARMv8-A",
      "full_name": "SVE Signed Minimum",
      "summary": "Determines minimum signed value per element.",
      "syntax": "SMIN <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Integer Binary",
        "binary_pattern": "00000100 | size | 001 | 0 | 1 | 0 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x040A0000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE signed minimum: computes the element-wise minimum of two signed integer vectors (Zdn and Zm), writing results to Zdn under predicate mask control (Pg). Only elements where the predicate is active are updated; inactive elements retain their original values in Zdn. No condition flags are affected. This is an AArch64-only instruction requiring SVE support.",
      "example": "SMIN z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for e = 0 to VL/getElementSize(T)-1\n  if Pg[e] == 1 then\n    Zdn[e] ← min_signed(Zdn[e], Zm[e])\n  end if\nend for"
    },
    {
      "mnemonic": "umax",
      "architecture": "ARMv8-A",
      "full_name": "SVE Unsigned Maximum",
      "summary": "Determines maximum unsigned value per element.",
      "syntax": "UMAX <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Integer Binary",
        "binary_pattern": "00000100 | size | 001 | 0 | 0 | 1 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x04090000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE unsigned maximum: computes the element-wise maximum of two unsigned integer vectors (Zdn and Zm), writing results to Zdn under predicate mask control (Pg). Only elements where the predicate is active are updated; inactive elements retain their original values in Zdn. No condition flags are affected. This is an AArch64-only instruction requiring SVE support.",
      "example": "UMAX z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for e = 0 to VL/getElementSize(T)-1\n  if Pg[e] == 1 then\n    Zdn[e] ← max_unsigned(Zdn[e], Zm[e])\n  end if\nend for"
    },
    {
      "mnemonic": "umin",
      "architecture": "ARMv8-A",
      "full_name": "SVE Unsigned Minimum",
      "summary": "Determines minimum unsigned value per element.",
      "syntax": "UMIN <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Integer Binary",
        "binary_pattern": "00000100 | size | 001 | 0 | 1 | 1 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x040B0000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE unsigned minimum: computes the element-wise minimum of two unsigned integer vectors (Zdn and Zm), writing results to Zdn under predicate mask control (Pg). Only elements where the predicate is active are updated; inactive elements retain their original values in Zdn. No condition flags are affected. This is an AArch64-only instruction requiring SVE support.",
      "example": "UMIN z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for e = 0 to VL/getElementSize(T)-1\n  if Pg[e] == 1 then\n    Zdn[e] ← min_unsigned(Zdn[e], Zm[e])\n  end if\nend for"
    },
    {
      "mnemonic": "abs",
      "architecture": "ARMv8-A",
      "full_name": "SVE Absolute Value",
      "summary": "Calculates absolute value of integers.",
      "syntax": "ABS <Zdn>.<T>, <Pg>/M, <Zdn>.<T>",
      "encoding": {
        "format": "SVE Integer Unary",
        "binary_pattern": "00000100 | size | 010 | 11 | 0 | 101 | Pg | Zn | Zd",
        "hex_opcode": "0x0416A000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        }
      ],
      "extension": "SVE",
      "description": "SVE absolute value: computes the element-wise absolute value of signed integers in Zdn, writing results back to Zdn under predicate mask control (Pg). Only elements where the predicate is active are updated; inactive elements retain their original values. No condition flags are affected. This is an AArch64-only instruction requiring SVE support.",
      "example": "ABS z0.s.T, p0/m/M, z0.s.T",
      "pseudocode": "for e = 0 to VL/getElementSize(T)-1\n  if Pg[e] == 1 then\n    Zdn[e] ← abs_signed(Zdn[e])\n  end if\nend for"
    },
    {
      "mnemonic": "neg",
      "architecture": "ARMv8-A",
      "full_name": "SVE Negate",
      "summary": "Negates integers.",
      "syntax": "NEG <Zdn>.<T>, <Pg>/M, <Zdn>.<T>",
      "encoding": {
        "format": "SVE Integer Unary",
        "binary_pattern": "00000100 | size | 010 | 11 | 1 | 101 | Pg | Zn | Zd",
        "hex_opcode": "0x0417A000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        }
      ],
      "extension": "SVE",
      "description": "SVE negate: computes the element-wise negation (two's complement) of integers in Zdn, writing results back to Zdn under predicate mask control (Pg). Only elements where the predicate is active are updated; inactive elements retain their original values. No condition flags are affected. This is an AArch64-only instruction requiring SVE support.",
      "example": "NEG z0.s.T, p0/m/M, z0.s.T",
      "pseudocode": "for e = 0 to VL/getElementSize(T)-1\n  if Pg[e] == 1 then\n    Zdn[e] ← -Zdn[e]\n  end if\nend for"
    },
    {
      "mnemonic": "not",
      "architecture": "ARMv8-A",
      "full_name": "SVE Bitwise NOT",
      "summary": "Inverts bits.",
      "syntax": "NOT <Zdn>.<T>, <Pg>/M, <Zdn>.<T>",
      "encoding": {
        "format": "SVE Integer Unary",
        "binary_pattern": "00000100 | size | 011 | 11 | 0 | 101 | Pg | Zn | Zd",
        "hex_opcode": "0x041EA000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        }
      ],
      "extension": "SVE",
      "description": "SVE bitwise NOT: inverts all bits in each element of Zdn under predicate mask control (Pg), writing the results back to Zdn. Only elements where the predicate is active are updated; inactive elements retain their original values. No condition flags are affected. This is an AArch64-only instruction requiring SVE support.",
      "example": "NOT z0.s.T, p0/m/M, z0.s.T",
      "pseudocode": "for e = 0 to VL/getElementSize(T)-1\n  if Pg[e] == 1 then\n    Zdn[e] ← ~Zdn[e]\n  end if\nend for"
    },
    {
      "mnemonic": "sdiv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Signed Divide",
      "summary": "Divides signed integers.",
      "syntax": "SDIV <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Integer Binary",
        "binary_pattern": "00000100 | size | 0101 | 0 | 0 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x04140000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Dividend"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Divisor"
        }
      ],
      "extension": "SVE",
      "description": "SVE signed integer divide: divides each active element of Zdn (dividend) by the corresponding element of Zm (divisor), storing the quotient back in Zdn. Elements where the predicate is false are left unchanged. No condition flags are affected. This is an SVE-only instruction and does not raise exceptions on division by zero; instead, undefined results are written to inactive elements.",
      "example": "SDIV z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL-1\n  if Pg[i] == '1' then\n    Zdn[i] ← Zdn[i] / Zm[i]\n  // else Zdn[i] unchanged"
    },
    {
      "mnemonic": "udiv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Unsigned Divide",
      "summary": "Divides unsigned integers.",
      "syntax": "UDIV <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Integer Binary",
        "binary_pattern": "00000100 | size | 0101 | 0 | 1 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x04150000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Dividend"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Divisor"
        }
      ],
      "extension": "SVE",
      "description": "SVE unsigned integer divide: divides each active element of Zdn (dividend) by the corresponding element of Zm (divisor) as unsigned values, storing the quotient back in Zdn. Elements where the predicate is false are left unchanged. No condition flags are affected. This is an SVE-only instruction and does not raise exceptions on division by zero.",
      "example": "UDIV z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL-1\n  if Pg[i] == '1' then\n    Zdn[i] ← UnsignedDivide(Zdn[i], Zm[i])\n  // else Zdn[i] unchanged"
    },
    {
      "mnemonic": "fsqrt",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Square Root",
      "summary": "Calculates square root of floats.",
      "syntax": "FSQRT <Zdn>.<T>, <Pg>/M, <Zdn>.<T>",
      "encoding": {
        "format": "SVE FP Unary",
        "binary_pattern": "01100101 | size | 0011 | 0 | 1 | 101 | Pg | Zn | Zd",
        "hex_opcode": "0x650DA000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        }
      ],
      "extension": "SVE",
      "description": "SVE floating-point square root: computes the square root of each active element in Zdn and stores the result back in Zdn. Elements where the predicate is false are left unchanged. Floating-point exception flags (IOC, DZC, OFC, UFC, IXC) are updated according to the IEEE 754 standard; no integer condition flags are affected. This is an SVE-only instruction.",
      "example": "FSQRT z0.s.T, p0/m/M, z0.s.T",
      "pseudocode": "for i = 0 to VL-1\n  if Pg[i] == '1' then\n    Zdn[i] ← FPSquareRoot(Zdn[i])\n  // else Zdn[i] unchanged\n// FP exception flags updated per IEEE 754"
    },
    {
      "mnemonic": "fabs",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Absolute Value",
      "summary": "Calculates absolute value of floats.",
      "syntax": "FABS <Zdn>.<T>, <Pg>/M, <Zdn>.<T>",
      "encoding": {
        "format": "SVE FP Unary",
        "binary_pattern": "00000100 | size | 011 | 10 | 0 | 101 | Pg | Zn | Zd",
        "hex_opcode": "0x041CA000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        }
      ],
      "extension": "SVE",
      "description": "SVE floating-point absolute value: computes the absolute value of each active element in Zdn and stores the result back in Zdn, clearing the sign bit. Elements where the predicate is false are left unchanged. No condition flags or floating-point exceptions are affected. This is an SVE-only instruction.",
      "example": "FABS z0.s.T, p0/m/M, z0.s.T",
      "pseudocode": "for i = 0 to VL-1\n  if Pg[i] == '1' then\n    Zdn[i] ← FPAbs(Zdn[i])\n  // else Zdn[i] unchanged"
    },
    {
      "mnemonic": "fneg",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Negate",
      "summary": "Negates floats.",
      "syntax": "FNEG <Zdn>.<T>, <Pg>/M, <Zdn>.<T>",
      "encoding": {
        "format": "SVE FP Unary",
        "binary_pattern": "00000100 | size | 011 | 10 | 1 | 101 | Pg | Zn | Zd",
        "hex_opcode": "0x041DA000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        }
      ],
      "extension": "SVE",
      "description": "SVE floating-point negate: flips the sign bit of each active element in Zdn and stores the result back in Zdn. Elements where the predicate is false are left unchanged. No condition flags or floating-point exceptions are affected. This is an SVE-only instruction.",
      "example": "FNEG z0.s.T, p0/m/M, z0.s.T",
      "pseudocode": "for i = 0 to VL-1\n  if Pg[i] == '1' then\n    Zdn[i] ← FPNegate(Zdn[i])\n  // else Zdn[i] unchanged"
    },
    {
      "mnemonic": "fcadd",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Complex Add",
      "summary": "Performs complex addition with rotation.",
      "syntax": "FCADD <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>, #<rot>",
      "encoding": {
        "format": "SVE FP Complex",
        "binary_pattern": "01100100 | size | 00000 | rot | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x64008000",
        "visual_parts": [
          {
            "raw": "01100100",
            "clean": "01100100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "rot",
            "clean": "rot"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        },
        {
          "name": "rot",
          "desc": "Rotation (90, 270)"
        }
      ],
      "extension": "SVE",
      "description": "SVE floating-point complex add: performs a predicate-masked complex addition of Zdn and Zm with a 90° or 270° rotation applied to Zm before addition. For rot=90, computes Zdn + i*Zm; for rot=270, computes Zdn - i*Zm. Elements where the predicate is false are left unchanged. Floating-point exceptions are signaled per IEEE 754. This is an SVE-only instruction.",
      "example": "FCADD z0.s.T, p0/m/M, z0.s.T, z2.s.T, #rot",
      "pseudocode": "for i = 0 to VL-1\n  if Pg[i] == '1' then\n    rotated ← RotateComplex(Zm[i], rot)\n    Zdn[i] ← FPAdd(Zdn[i], rotated)\n  // else Zdn[i] unchanged"
    },
    {
      "mnemonic": "fcmla",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Complex Multiply-Add",
      "summary": "Performs complex multiply-accumulate.",
      "syntax": "FCMLA <Zda>.<T>, <Pg>/M, <Zn>.<T>, <Zm>.<T>, #<rot>",
      "encoding": {
        "format": "SVE FP Complex",
        "binary_pattern": "01100100 | size | 0 | Zm | 0 | rot | Pg | Zn | Zda",
        "hex_opcode": "0x64000000",
        "visual_parts": [
          {
            "raw": "01100100",
            "clean": "01100100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "rot",
            "clean": "rot"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zda",
            "clean": "Zda"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15 | 14:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zda",
          "desc": "Accumulator scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        },
        {
          "name": "rot",
          "desc": "Rot"
        }
      ],
      "extension": "SVE",
      "description": "SVE floating-point complex multiply-add: performs a predicate-masked complex multiply-accumulate operation where Zn and Zm are multiplied with rotation, and the result is added to Zda. For each rotation value (0°, 90°, 180°, 270°), a different complex multiplication result is accumulated. Elements where the predicate is false leave Zda unchanged. Floating-point exceptions are signaled per IEEE 754. This is an SVE-only instruction.",
      "example": "FCMLA z0.s.T, p0/m/M, z1.s.T, z2.s.T, #rot",
      "pseudocode": "for i = 0 to VL-1\n  if Pg[i] == '1' then\n    product ← FPComplexMultiply(Zn[i], Zm[i], rot)\n    Zda[i] ← FPAdd(Zda[i], product)\n  // else Zda[i] unchanged"
    },
    {
      "mnemonic": "saddv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Signed Integer Add Reduction",
      "summary": "Sums all active signed elements into a scalar result.",
      "syntax": "SADDV <Vd>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Reduction",
        "binary_pattern": "00000100 | size | 0000 | 0 | 0 | 001 | Pg | Zn | Vd",
        "hex_opcode": "0x04002000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "SVE signed integer add reduction: sums all active signed elements of the SVE vector Zn across the vector length and accumulates the result into the scalar destination Vd, sign-extending to the element width. Only elements where the corresponding predicate bit is set participate in the reduction. No condition flags are affected. This is an SVE-only instruction.",
      "example": "SADDV v0.4s, p0/m, z1.s.T",
      "pseudocode": "result ← 0\nfor i = 0 to VL-1\n  if Pg[i] == '1' then\n    result ← result + SignExtend(Zn[i])\nVd ← result"
    },
    {
      "mnemonic": "smaxv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Signed Maximum Reduction",
      "summary": "Finds max signed element in vector.",
      "syntax": "SMAXV <Vd>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Reduction",
        "binary_pattern": "00000100 | size | 0010 | 0 | 0 | 001 | Pg | Zn | Vd",
        "hex_opcode": "0x04082000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "SVE signed maximum reduction: finds the maximum signed element in vector Zn according to predicate mask Pg, and stores the result as a scalar in Vd. The operation reads all active elements from Zn, compares them as signed integers (element size determined by sz), and reduces to a single scalar value. No NZCV flags are affected by this instruction.",
      "example": "SMAXV v0.4s, p0/m, z1.s.T",
      "pseudocode": "bits(esize) result = MIN_INT(esize);\nfor i = 0 to VL/esize - 1\n  if Pg[i] == '1' then\n    element = Zn[i*esize +: esize];\n    if element > result (signed) then result = element;\nVd[0 +: esize] ← result;"
    },
    {
      "mnemonic": "umaxv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Unsigned Maximum Reduction",
      "summary": "Finds max unsigned element in vector.",
      "syntax": "UMAXV <Vd>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Reduction",
        "binary_pattern": "00000100 | size | 0010 | 0 | 1 | 001 | Pg | Zn | Vd",
        "hex_opcode": "0x04092000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "SVE unsigned maximum reduction: finds the maximum unsigned element in vector Zn according to predicate mask Pg, and stores the result as a scalar in Vd. The operation compares all active elements as unsigned integers (element size determined by sz) and reduces to a single scalar. No NZCV flags are affected by this instruction.",
      "example": "UMAXV v0.4s, p0/m, z1.s.T",
      "pseudocode": "bits(esize) result = 0;\nfor i = 0 to VL/esize - 1\n  if Pg[i] == '1' then\n    element = Zn[i*esize +: esize];\n    if element > result (unsigned) then result = element;\nVd[0 +: esize] ← result;"
    },
    {
      "mnemonic": "sminv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Signed Minimum Reduction",
      "summary": "Finds min signed element in vector.",
      "syntax": "SMINV <Vd>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Reduction",
        "binary_pattern": "00000100 | size | 0010 | 1 | 0 | 001 | Pg | Zn | Vd",
        "hex_opcode": "0x040A2000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "SVE signed minimum reduction: finds the minimum signed element in vector Zn according to predicate mask Pg, and stores the result as a scalar in Vd. The operation reads all active elements from Zn, compares them as signed integers (element size determined by sz), and reduces to a single scalar value. No NZCV flags are affected by this instruction.",
      "example": "SMINV v0.4s, p0/m, z1.s.T",
      "pseudocode": "bits(esize) result = MAX_INT(esize);\nfor i = 0 to VL/esize - 1\n  if Pg[i] == '1' then\n    element = Zn[i*esize +: esize];\n    if element < result (signed) then result = element;\nVd[0 +: esize] ← result;"
    },
    {
      "mnemonic": "uminv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Unsigned Minimum Reduction",
      "summary": "Finds min unsigned element in vector.",
      "syntax": "UMINV <Vd>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Reduction",
        "binary_pattern": "00000100 | size | 0010 | 1 | 1 | 001 | Pg | Zn | Vd",
        "hex_opcode": "0x040B2000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "SVE unsigned minimum reduction: finds the minimum unsigned element in vector Zn according to predicate mask Pg, and stores the result as a scalar in Vd. The operation compares all active elements as unsigned integers (element size determined by sz) and reduces to a single scalar. No NZCV flags are affected by this instruction.",
      "example": "UMINV v0.4s, p0/m, z1.s.T",
      "pseudocode": "bits(esize) result = ALL_ONES(esize);\nfor i = 0 to VL/esize - 1\n  if Pg[i] == '1' then\n    element = Zn[i*esize +: esize];\n    if element < result (unsigned) then result = element;\nVd[0 +: esize] ← result;"
    },
    {
      "mnemonic": "fmaxv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Maximum Reduction",
      "summary": "Finds max float in vector.",
      "syntax": "FMAXV <Vd>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Reduction",
        "binary_pattern": "01100101 | size | 000 | 11 | 0 | 001 | Pg | Zn | Vd",
        "hex_opcode": "0x65062000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "SVE floating-point maximum reduction: finds the maximum floating-point element in vector Zn according to predicate mask Pg, and stores the result as a scalar in Vd. The operation compares all active elements as IEEE 754 floats (precision determined by sz: 0=half, 1=single or double) using quiet comparison semantics, and reduces to a single scalar. No NZCV flags are affected; SNaNs propagate as the maximum.",
      "example": "FMAXV v0.4s, p0/m, z1.s.T",
      "pseudocode": "bits(esize) result = NegInfinity(esize);\nfor i = 0 to VL/esize - 1\n  if Pg[i] == '1' then\n    element = Zn[i*esize +: esize];\n    if element > result (FP) || IsNaN(result) then result = element;\nVd[0 +: esize] ← result;"
    },
    {
      "mnemonic": "fminv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Minimum Reduction",
      "summary": "Finds min float in vector.",
      "syntax": "FMINV <Vd>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Reduction",
        "binary_pattern": "01100101 | size | 000 | 11 | 1 | 001 | Pg | Zn | Vd",
        "hex_opcode": "0x65072000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "SVE floating-point minimum reduction: finds the minimum floating-point element in vector Zn according to predicate mask Pg, and stores the result as a scalar in Vd. The operation compares all active elements as IEEE 754 floats (precision determined by sz: 0=half, 1=single or double) using quiet comparison semantics, and reduces to a single scalar. No NZCV flags are affected; SNaNs propagate as the minimum.",
      "example": "FMINV v0.4s, p0/m, z1.s.T",
      "pseudocode": "bits(esize) result = PosInfinity(esize);\nfor i = 0 to VL/esize - 1\n  if Pg[i] == '1' then\n    element = Zn[i*esize +: esize];\n    if element < result (FP) || IsNaN(result) then result = element;\nVd[0 +: esize] ← result;"
    },
    {
      "mnemonic": "andv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Bitwise AND Reduction",
      "summary": "ANDs all active elements into a scalar.",
      "syntax": "ANDV <Vd>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Reduction",
        "binary_pattern": "00000100 | size | 0110 | 1 | 0 | 001 | Pg | Zn | Vd",
        "hex_opcode": "0x041A2000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "SVE bitwise AND reduction: performs a bitwise AND of all active elements in vector Zn according to predicate mask Pg, and stores the result as a scalar in Vd. The operation reduces a vector of integers to a single scalar by bitwise AND across all selected elements (element size determined by sz). No NZCV flags are affected by this instruction.",
      "example": "ANDV v0.4s, p0/m, z1.s.T",
      "pseudocode": "bits(esize) result = ALL_ONES(esize);\nfor i = 0 to VL/esize - 1\n  if Pg[i] == '1' then\n    element = Zn[i*esize +: esize];\n    result = result AND element;\nVd[0 +: esize] ← result;"
    },
    {
      "mnemonic": "orv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Bitwise OR Reduction",
      "summary": "ORs all active elements into a scalar.",
      "syntax": "ORV <Vd>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Reduction",
        "binary_pattern": "00000100 | size | 0110 | 0 | 0 | 001 | Pg | Zn | Vd",
        "hex_opcode": "0x04182000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "SVE bitwise OR reduction: performs a bitwise OR of all active elements in vector Zn according to predicate mask Pg, and stores the result as a scalar in Vd. The operation reduces a vector of integers to a single scalar by bitwise OR across all selected elements (element size determined by sz). No NZCV flags are affected by this instruction.",
      "example": "ORV v0.4s, p0/m, z1.s.T",
      "pseudocode": "bits(esize) result = 0;\nfor i = 0 to VL/esize - 1\n  if Pg[i] == '1' then\n    element = Zn[i*esize +: esize];\n    result = result OR element;\nVd[0 +: esize] ← result;"
    },
    {
      "mnemonic": "eorv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Bitwise EOR Reduction",
      "summary": "XORs all active elements into a scalar.",
      "syntax": "EORV <Vd>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Reduction",
        "binary_pattern": "00000100 | size | 0110 | 0 | 1 | 001 | Pg | Zn | Vd",
        "hex_opcode": "0x04192000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "SVE bitwise XOR reduction that combines all active predicated elements of a scalable vector into a scalar result. The operation iteratively XORs each active element into the destination scalar register. No condition flags are affected by this instruction. This is an AArch64-only SVE instruction.",
      "example": "EORV v0.4s, p0/m, z1.s.T",
      "pseudocode": "bits(smax(8*datasize,32)) result = Vd<smax(8*datasize,32)-1:0>;\nfor i = 0 to (VL/esize)-1\n    if Pg[i]\n        result = result XOR Zn[i*esize+esize-1:i*esize]\nVd = result<smax(8*datasize,32)-1:0>;"
    },
    {
      "mnemonic": "scvtf",
      "architecture": "ARMv8-A",
      "full_name": "SVE Signed Integer Convert to Floating-Point",
      "summary": "Converts signed integers to floats.",
      "syntax": "SCVTF <Zdn>.<T>, <Pg>/M, <Zdn>.<T>",
      "encoding": {
        "format": "SVE Conversion",
        "binary_pattern": "01100101 | 0 | 1 | 010 | 0 | 1 | 0 | 101 | Pg | Zn | Zd",
        "hex_opcode": "0x6552A000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:19 | 18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        }
      ],
      "extension": "SVE",
      "description": "SVE instruction that converts signed integer elements in a scalable vector to floating-point representation. Only active predicated elements are converted; inactive elements are zeroed. The instruction operates under predicate control with zeroing (/Z) semantics. This is an AArch64-only SVE instruction with no NZCV flag effects.",
      "example": "SCVTF z0.s.T, p0/m/M, z0.s.T",
      "pseudocode": "for i = 0 to (VL/esize)-1\n    if Pg[i]\n        Zdn[i*esize+esize-1:i*esize] = ConvertSignedIntegerToFP(Zdn[i*esize+esize-1:i*esize])\n    else\n        Zdn[i*esize+esize-1:i*esize] = 0"
    },
    {
      "mnemonic": "ucvtf",
      "architecture": "ARMv8-A",
      "full_name": "SVE Unsigned Integer Convert to Floating-Point",
      "summary": "Converts unsigned integers to floats.",
      "syntax": "UCVTF <Zdn>.<T>, <Pg>/M, <Zdn>.<T>",
      "encoding": {
        "format": "SVE Conversion",
        "binary_pattern": "01100101 | 0 | 1 | 010 | 0 | 1 | 1 | 101 | Pg | Zn | Zd",
        "hex_opcode": "0x6553A000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:19 | 18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        }
      ],
      "extension": "SVE",
      "description": "SVE instruction that converts unsigned integer elements in a scalable vector to floating-point representation. Only active predicated elements are converted; inactive elements are zeroed. The instruction operates under predicate control with zeroing (/Z) semantics. This is an AArch64-only SVE instruction with no NZCV flag effects.",
      "example": "UCVTF z0.s.T, p0/m/M, z0.s.T",
      "pseudocode": "for i = 0 to (VL/esize)-1\n    if Pg[i]\n        Zdn[i*esize+esize-1:i*esize] = ConvertUnsignedIntegerToFP(Zdn[i*esize+esize-1:i*esize])\n    else\n        Zdn[i*esize+esize-1:i*esize] = 0"
    },
    {
      "mnemonic": "fcvtzs",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Convert to Signed Integer",
      "summary": "Converts floats to signed integers (Truncate).",
      "syntax": "FCVTZS <Zdn>.<T>, <Pg>/M, <Zdn>.<T>",
      "encoding": {
        "format": "SVE Conversion",
        "binary_pattern": "01100101 | 0 | 1 | 011 | 0 | 1 | 0 | 101 | Pg | Zn | Zd",
        "hex_opcode": "0x655AA000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:19 | 18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        }
      ],
      "extension": "SVE",
      "description": "SVE instruction that converts floating-point elements in a scalable vector to signed integer representation by truncation toward zero. Only active predicated elements are converted; inactive elements are zeroed. The instruction operates under predicate control with zeroing (/Z) semantics. This is an AArch64-only SVE instruction with no NZCV flag effects.",
      "example": "FCVTZS z0.s.T, p0/m/M, z0.s.T",
      "pseudocode": "for i = 0 to (VL/esize)-1\n    if Pg[i]\n        Zdn[i*esize+esize-1:i*esize] = ConvertFPToSignedIntegerTruncate(Zdn[i*esize+esize-1:i*esize])\n    else\n        Zdn[i*esize+esize-1:i*esize] = 0"
    },
    {
      "mnemonic": "fcvtzu",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Convert to Unsigned Integer",
      "summary": "Converts floats to unsigned integers (Truncate).",
      "syntax": "FCVTZU <Zdn>.<T>, <Pg>/M, <Zdn>.<T>",
      "encoding": {
        "format": "SVE Conversion",
        "binary_pattern": "01100101 | 0 | 1 | 011 | 0 | 1 | 1 | 101 | Pg | Zn | Zd",
        "hex_opcode": "0x655BA000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:19 | 18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        }
      ],
      "extension": "SVE",
      "description": "SVE instruction that converts floating-point elements in a scalable vector to unsigned integer representation by truncation toward zero. Only active predicated elements are converted; inactive elements are zeroed. The instruction operates under predicate control with zeroing (/Z) semantics. This is an AArch64-only SVE instruction with no NZCV flag effects.",
      "example": "FCVTZU z0.s.T, p0/m/M, z0.s.T",
      "pseudocode": "for i = 0 to (VL/esize)-1\n    if Pg[i]\n        Zdn[i*esize+esize-1:i*esize] = ConvertFPToUnsignedIntegerTruncate(Zdn[i*esize+esize-1:i*esize])\n    else\n        Zdn[i*esize+esize-1:i*esize] = 0"
    },
    {
      "mnemonic": "smulbb",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply (Bottom x Bottom)",
      "summary": "Multiplies bottom 16 bits of Rn and Rm.",
      "syntax": "SMULBB<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 11 | 0 | Rd | 0000 | Rm | 1 | 0 | 0 | 0 | Rn",
        "hex_opcode": "0x01600080",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Src 1 (Bot)"
        },
        {
          "name": "Rm",
          "desc": "Src 2 (Bot)"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Multiplies the bottom 16 bits (bits [15:0]) of Rn by the bottom 16 bits of Rm as signed integers, producing a 32-bit signed result in Rd. This is an A32 DSP instruction that does not update condition flags.",
      "example": "SMULBB r0, r1, r2",
      "pseudocode": "if ConditionPassed() then\n  operand1 = SignExtend(Rn[15:0], 32)\n  operand2 = SignExtend(Rm[15:0], 32)\n  Rd = operand1 * operand2"
    },
    {
      "mnemonic": "smulbt",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply (Bottom x Top)",
      "summary": "Multiplies bottom 16 bits of Rn and top 16 bits of Rm.",
      "syntax": "SMULBT<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 11 | 0 | Rd | 0000 | Rm | 1 | 1 | 0 | 0 | Rn",
        "hex_opcode": "0x016000C0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Src 1 (Bot)"
        },
        {
          "name": "Rm",
          "desc": "Src 2 (Top)"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "A32 DSP multiply instruction that multiplies the bottom 16 bits (signed) of Rn by the top 16 bits (signed) of Rm and stores the 32-bit result in Rd. The instruction is conditional and does not affect the NZCV condition flags. Q flag behavior is not documented for this instruction in standard architectures.",
      "example": "SMULBT r0, r1, r2",
      "pseudocode": "operand1 = SignExtend(Rn<15:0>, 32)\noperand2 = SignExtend(Rm<31:16>, 32)\nRd = (operand1 * operand2)<31:0>"
    },
    {
      "mnemonic": "smultb",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply (Top x Bottom)",
      "summary": "Multiplies top 16 bits of Rn and bottom 16 bits of Rm.",
      "syntax": "SMULTB<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 11 | 0 | Rd | 0000 | Rm | 1 | 0 | 1 | 0 | Rn",
        "hex_opcode": "0x016000A0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Src 1 (Top)"
        },
        {
          "name": "Rm",
          "desc": "Src 2 (Bot)"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "A32 DSP multiply instruction that multiplies the top 16 bits (signed) of Rn by the bottom 16 bits (signed) of Rm and stores the 32-bit result in Rd. The instruction is conditional and does not affect the NZCV condition flags. Q flag behavior is not documented for this instruction in standard architectures.",
      "example": "SMULTB r0, r1, r2",
      "pseudocode": "operand1 = SignExtend(Rn<31:16>, 32)\noperand2 = SignExtend(Rm<15:0>, 32)\nRd = (operand1 * operand2)<31:0>"
    },
    {
      "mnemonic": "smultt",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply (Top x Top)",
      "summary": "Multiplies top 16 bits of Rn and top 16 bits of Rm.",
      "syntax": "SMULTT<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 11 | 0 | Rd | 0000 | Rm | 1 | 1 | 1 | 0 | Rn",
        "hex_opcode": "0x016000E0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Src 1 (Top)"
        },
        {
          "name": "Rm",
          "desc": "Src 2 (Top)"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "A32 DSP multiply instruction that multiplies the top 16 bits (signed) of Rn by the top 16 bits (signed) of Rm and stores the 32-bit result in Rd. The instruction is conditional and does not affect the NZCV condition flags. Q flag behavior is not documented for this instruction in standard architectures.",
      "example": "SMULTT r0, r1, r2",
      "pseudocode": "operand1 = SignExtend(Rn<31:16>, 32)\noperand2 = SignExtend(Rm<31:16>, 32)\nRd = (operand1 * operand2)<31:0>"
    },
    {
      "mnemonic": "smlabb",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate (Bottom x Bottom)",
      "summary": "Accumulates (Rn.B * Rm.B) into Ra.",
      "syntax": "SMLABB<c> <Rd>, <Rn>, <Rm>, <Ra>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 00 | 0 | Rd | Ra | Rm | 1 | 0 | 0 | 0 | Rn",
        "hex_opcode": "0x01000080",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Ra",
          "desc": "Acc"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed multiply-accumulate of the bottom 16-bit halfwords of Rn and Rm, with the 32-bit product added to Ra and stored in Rd. This is an A32 DSP instruction that operates on 16-bit subregisters. The Q flag may be set if overflow occurs during accumulation, but N, Z, C, V flags are unchanged.",
      "example": "SMLABB r0, r1, r2, r5",
      "pseudocode": "temp ← SignExtend(Rn[15:0], 32) * SignExtend(Rm[15:0], 32);\nresult ← temp + Ra;\nif OverflowFrom_Addition(temp, Ra) then Q ← 1; end if;\nRd ← result;"
    },
    {
      "mnemonic": "smlabt",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate (Bottom x Top)",
      "summary": "Accumulates (Rn.B * Rm.T) into Ra.",
      "syntax": "SMLABT<c> <Rd>, <Rn>, <Rm>, <Ra>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 00 | 0 | Rd | Ra | Rm | 1 | 1 | 0 | 0 | Rn",
        "hex_opcode": "0x010000C0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Ra",
          "desc": "Acc"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed multiply-accumulate of the bottom 16-bit halfword of Rn and the top 16-bit halfword of Rm, with the 32-bit product added to Ra and stored in Rd. This is an A32 DSP instruction that operates on 16-bit subregisters. The Q flag may be set if overflow occurs during accumulation, but N, Z, C, V flags are unchanged.",
      "example": "SMLABT r0, r1, r2, r5",
      "pseudocode": "temp ← SignExtend(Rn[15:0], 32) * SignExtend(Rm[31:16], 32);\nresult ← temp + Ra;\nif OverflowFrom_Addition(temp, Ra) then Q ← 1; end if;\nRd ← result;"
    },
    {
      "mnemonic": "smlatb",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate (Top x Bottom)",
      "summary": "Accumulates (Rn.T * Rm.B) into Ra.",
      "syntax": "SMLATB<c> <Rd>, <Rn>, <Rm>, <Ra>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 00 | 0 | Rd | Ra | Rm | 1 | 0 | 1 | 0 | Rn",
        "hex_opcode": "0x010000A0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Ra",
          "desc": "Acc"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed multiply-accumulate of the top 16-bit halfword of Rn and the bottom 16-bit halfword of Rm, with the 32-bit product added to Ra and stored in Rd. This is an A32 DSP instruction that operates on 16-bit subregisters. The Q flag may be set if overflow occurs during accumulation, but N, Z, C, V flags are unchanged.",
      "example": "SMLATB r0, r1, r2, r5",
      "pseudocode": "temp ← SignExtend(Rn[31:16], 32) * SignExtend(Rm[15:0], 32);\nresult ← temp + Ra;\nif OverflowFrom_Addition(temp, Ra) then Q ← 1; end if;\nRd ← result;"
    },
    {
      "mnemonic": "smlatt",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate (Top x Top)",
      "summary": "Accumulates (Rn.T * Rm.T) into Ra.",
      "syntax": "SMLATT<c> <Rd>, <Rn>, <Rm>, <Ra>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 00 | 0 | Rd | Ra | Rm | 1 | 1 | 1 | 0 | Rn",
        "hex_opcode": "0x010000E0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Ra",
          "desc": "Acc"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed multiply-accumulate of the top 16-bit halfwords of Rn and Rm, with the 32-bit product added to Ra and stored in Rd. This is an A32 DSP instruction that operates on 16-bit subregisters. The Q flag may be set if overflow occurs during accumulation, but N, Z, C, V flags are unchanged.",
      "example": "SMLATT r0, r1, r2, r5",
      "pseudocode": "temp ← SignExtend(Rn[31:16], 32) * SignExtend(Rm[31:16], 32);\nresult ← temp + Ra;\nif OverflowFrom_Addition(temp, Ra) then Q ← 1; end if;\nRd ← result;"
    },
    {
      "mnemonic": "smulwb",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply (Word x Bottom)",
      "summary": "Multiplies 32-bit Rn by bottom 16-bits of Rm, takes top 32-bits of result.",
      "syntax": "SMULWB<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 01 | 0 | Rd | 0000 | Rm | 1 | 0 | 1 | 0 | Rn",
        "hex_opcode": "0x012000A0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Word Src"
        },
        {
          "name": "Rm",
          "desc": "Half Src"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed multiply of the 32-bit Rn by the bottom 16-bit halfword of Rm, extracting the top 32 bits of the 48-bit product into Rd. This is an A32 DSP instruction that produces no flag changes; overflow is not indicated.",
      "example": "SMULWB r0, r1, r2",
      "pseudocode": "product ← SignExtend(Rn[31:0], 48) * SignExtend(Rm[15:0], 48);\nRd ← product[47:16];"
    },
    {
      "mnemonic": "smulwt",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply (Word x Top)",
      "summary": "Multiplies 32-bit Rn by top 16-bits of Rm, takes top 32-bits of result.",
      "syntax": "SMULWT<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 01 | 0 | Rd | 0000 | Rm | 1 | 1 | 1 | 0 | Rn",
        "hex_opcode": "0x012000E0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Word Src"
        },
        {
          "name": "Rm",
          "desc": "Half Src"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed multiply of the 32-bit Rn by the top 16-bit halfword of Rm, extracting the top 32 bits of the 48-bit product into Rd. This is an A32 DSP instruction that produces no flag changes; overflow is not indicated.",
      "example": "SMULWT r0, r1, r2",
      "pseudocode": "product ← SignExtend(Rn[31:0], 48) * SignExtend(Rm[31:16], 48);\nRd ← product[47:16];"
    },
    {
      "mnemonic": "smlawb",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate (Word x Bottom)",
      "summary": "Performs SMULWB and adds to accumulator.",
      "syntax": "SMLAWB<c> <Rd>, <Rn>, <Rm>, <Ra>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 01 | 0 | Rd | Ra | Rm | 1 | 0 | 0 | 0 | Rn",
        "hex_opcode": "0x01200080",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Word"
        },
        {
          "name": "Rm",
          "desc": "Half"
        },
        {
          "name": "Ra",
          "desc": "Acc"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed multiply-accumulate combining SMULWB with addition of Ra; multiplies 32-bit Rn by the bottom 16-bit halfword of Rm, takes the top 32 bits of the product, adds Ra, and stores in Rd. This is an A32 DSP instruction. The Q flag may be set if overflow occurs during accumulation, but N, Z, C, V flags are unchanged.",
      "example": "SMLAWB r0, r1, r2, r5",
      "pseudocode": "product ← SignExtend(Rn[31:0], 48) * SignExtend(Rm[15:0], 48);\ntemp ← product[47:16];\nresult ← temp + Ra;\nif OverflowFrom_Addition(temp, Ra) then Q ← 1; end if;\nRd ← result;"
    },
    {
      "mnemonic": "smlawt",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate (Word x Top)",
      "summary": "Performs SMULWT and adds to accumulator.",
      "syntax": "SMLAWT<c> <Rd>, <Rn>, <Rm>, <Ra>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 01 | 0 | Rd | Ra | Rm | 1 | 1 | 0 | 0 | Rn",
        "hex_opcode": "0x012000C0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Word"
        },
        {
          "name": "Rm",
          "desc": "Half"
        },
        {
          "name": "Ra",
          "desc": "Acc"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed multiply-accumulate combining SMULWT with addition of Ra; multiplies 32-bit Rn by the top 16-bit halfword of Rm, takes the top 32 bits of the product, adds Ra, and stores in Rd. This is an A32 DSP instruction. The Q flag may be set if overflow occurs during accumulation, but N, Z, C, V flags are unchanged.",
      "example": "SMLAWT r0, r1, r2, r5",
      "pseudocode": "product ← SignExtend(Rn[31:0], 48) * SignExtend(Rm[31:16], 48);\ntemp ← product[47:16];\nresult ← temp + Ra;\nif OverflowFrom_Addition(temp, Ra) then Q ← 1; end if;\nRd ← result;"
    },
    {
      "mnemonic": "smlalbb",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate Long (Bottom x Bottom)",
      "summary": "Accumulates (Rn.B * Rm.B) into 64-bit pair.",
      "syntax": "SMLALBB<c> <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 10 | 0 | RdHi | RdLo | Rm | 1 | 0 | 0 | 0 | Rn",
        "hex_opcode": "0x01400080",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Lo"
        },
        {
          "name": "RdHi",
          "desc": "Hi"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed Multiply Accumulate Long (Bottom × Bottom) multiplies the bottom 16 bits of Rn by the bottom 16 bits of Rm, treating both as signed, and accumulates the 32-bit result into the 64-bit value formed by RdHi:RdLo. This A32 DSP extension instruction does not update condition flags and is not available in AArch64.",
      "example": "SMLALBB r1, r0, r1, r2",
      "pseudocode": "operand1 ← SignExtend(Rn[15:0], 32);\noperand2 ← SignExtend(Rm[15:0], 32);\nresult ← operand1 * operand2;\nRdHi:RdLo ← RdHi:RdLo + result;"
    },
    {
      "mnemonic": "smlalbt",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate Long (Bottom x Top)",
      "summary": "Accumulates (Rn.B * Rm.T) into 64-bit pair.",
      "syntax": "SMLALBT<c> <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 10 | 0 | RdHi | RdLo | Rm | 1 | 1 | 0 | 0 | Rn",
        "hex_opcode": "0x014000C0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Lo"
        },
        {
          "name": "RdHi",
          "desc": "Hi"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed Multiply Accumulate Long (Bottom × Top) multiplies the bottom 16 bits of Rn by the top 16 bits of Rm, treating both as signed, and accumulates the 32-bit result into the 64-bit value formed by RdHi:RdLo. This A32 DSP extension instruction does not update condition flags and is not available in AArch64.",
      "example": "SMLALBT r1, r0, r1, r2",
      "pseudocode": "operand1 ← SignExtend(Rn[15:0], 32);\noperand2 ← SignExtend(Rm[31:16], 32);\nresult ← operand1 * operand2;\nRdHi:RdLo ← RdHi:RdLo + result;"
    },
    {
      "mnemonic": "smlaltb",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate Long (Top x Bottom)",
      "summary": "Accumulates (Rn.T * Rm.B) into 64-bit pair.",
      "syntax": "SMLALTB<c> <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 10 | 0 | RdHi | RdLo | Rm | 1 | 0 | 1 | 0 | Rn",
        "hex_opcode": "0x014000A0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Lo"
        },
        {
          "name": "RdHi",
          "desc": "Hi"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed Multiply Accumulate Long (Top × Bottom) multiplies the top 16 bits of Rn by the bottom 16 bits of Rm, treating both as signed, and accumulates the 32-bit result into the 64-bit value formed by RdHi:RdLo. This A32 DSP extension instruction does not update condition flags and is not available in AArch64.",
      "example": "SMLALTB r1, r0, r1, r2",
      "pseudocode": "operand1 ← SignExtend(Rn[31:16], 32);\noperand2 ← SignExtend(Rm[15:0], 32);\nresult ← operand1 * operand2;\nRdHi:RdLo ← RdHi:RdLo + result;"
    },
    {
      "mnemonic": "smlaltt",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate Long (Top x Top)",
      "summary": "Accumulates (Rn.T * Rm.T) into 64-bit pair.",
      "syntax": "SMLALTT<c> <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 00010 | 10 | 0 | RdHi | RdLo | Rm | 1 | 1 | 1 | 0 | Rn",
        "hex_opcode": "0x014000E0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Lo"
        },
        {
          "name": "RdHi",
          "desc": "Hi"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed Multiply Accumulate Long (Top × Top) multiplies the top 16 bits of Rn by the top 16 bits of Rm, treating both as signed, and accumulates the 32-bit result into the 64-bit value formed by RdHi:RdLo. This A32 DSP extension instruction does not update condition flags and is not available in AArch64.",
      "example": "SMLALTT r1, r0, r1, r2",
      "pseudocode": "operand1 ← SignExtend(Rn[31:16], 32);\noperand2 ← SignExtend(Rm[31:16], 32);\nresult ← operand1 * operand2;\nRdHi:RdLo ← RdHi:RdLo + result;"
    },
    {
      "mnemonic": "mia",
      "architecture": "ARMv8-A",
      "full_name": "Multiply with Internal Accumulate",
      "summary": "Multiplies two 32-bit values and adds to 40-bit internal acc (XScale Legacy).",
      "syntax": "MIA<c> <Acc>, <Rn>, <Rm>",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "cond | 11100010 | 0000 | Rn | Acc | 0000 | 0001 | Rm",
        "hex_opcode": "0x0E200010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11100010",
            "clean": "11100010"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Acc",
            "clean": "Acc"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ]
      },
      "operands": [
        {
          "name": "Acc",
          "desc": "Accumulator"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (XScale)",
      "description": "Multiply with Internal Accumulate multiplies two 32-bit values (Rn and Rm) and adds the 64-bit result to a 40-bit internal accumulator indexed by Acc. This XScale legacy A32 instruction is encoded as a coprocessor operation; condition flags are not updated, and this instruction is deprecated in modern ARM implementations.",
      "example": "MIA Acc, r1, r2",
      "pseudocode": "operand1 ← SignExtend(Rn, 64);\noperand2 ← SignExtend(Rm, 64);\nproduct ← operand1 * operand2;\ninternalAccumulator[Acc] ← internalAccumulator[Acc] + product;"
    },
    {
      "mnemonic": "miaph",
      "architecture": "ARMv8-A",
      "full_name": "Multiply with Internal Accumulate Packed Halfwords",
      "summary": "SIMD multiply of packed halfwords to internal acc (XScale Legacy).",
      "syntax": "MIAPH<c> <Acc>, <Rn>, <Rm>",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "cond | 11100010 | 1000 | Rn | Acc | 0000 | 0001 | Rm",
        "hex_opcode": "0x0E280010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11100010",
            "clean": "11100010"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Acc",
            "clean": "Acc"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ]
      },
      "operands": [
        {
          "name": "Acc",
          "desc": "Accumulator"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (XScale)",
      "description": "Multiply with Internal Accumulate Packed Halfwords performs SIMD multiplication of two packed 16-bit signed halfwords from Rn and Rm, accumulating each product into corresponding 40-bit internal accumulators. This XScale legacy A32 instruction is encoded as a coprocessor operation; condition flags are not updated, and this instruction is deprecated in modern ARM implementations.",
      "example": "MIAPH Acc, r1, r2",
      "pseudocode": "operand1_low ← SignExtend(Rn[15:0], 32);\noperand1_high ← SignExtend(Rn[31:16], 32);\noperand2_low ← SignExtend(Rm[15:0], 32);\noperand2_high ← SignExtend(Rm[31:16], 32);\nproduct_low ← operand1_low * operand2_low;\nproduct_high ← operand1_high * operand2_high;\ninternalAccumulator[Acc] ← internalAccumulator[Acc] + product_low;\ninternalAccumulator[Acc+1] ← internalAccumulator[Acc+1] + product_high;"
    },
    {
      "mnemonic": "sha256h",
      "architecture": "ARMv8-A",
      "full_name": "SHA256 Hash Part 1 (A32)",
      "summary": "SHA256 hash update (part 1).",
      "syntax": "SHA256H.32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "Crypto 3-Reg",
        "binary_pattern": "11110011 | 0 | 0 | 0 | Vn | Vd | 1100 | N | Q | M | 0 | Vm",
        "hex_opcode": "0xF3000C00",
        "visual_parts": [
          {
            "raw": "11110011",
            "clean": "11110011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ]
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "State"
        },
        {
          "name": "Qn",
          "desc": "Hash"
        },
        {
          "name": "Qm",
          "desc": "Data"
        }
      ],
      "extension": "Crypto",
      "description": "SHA256 Hash Part 1 performs the first half of a SHA256 hash update operation on 128-bit NEON registers, processing the W array intermediate values. Qd receives updated hash state W[t] and W[t+1]; Qn provides the previous hash state; Qm provides the input data block words. This A32 Crypto extension instruction does not update condition flags and requires NEON support.",
      "example": "SHA256H.32 q0, q1, q2",
      "pseudocode": "hash_state ← Qd;\nw_data ← Qn;\ndata_words ← Qm;\ntemp ← SHA256_CH(hash_state.word[1], hash_state.word[2], hash_state.word[3]);\ntemp ← temp + SHA256_SUM1(hash_state.word[1]);\ntemp ← temp + data_words;\nQd.word[0] ← Qd.word[0] + temp;\nQd.word[1] ← hash_state.word[0];"
    },
    {
      "mnemonic": "sha256h2",
      "architecture": "ARMv8-A",
      "full_name": "SHA256 Hash Part 2 (A32)",
      "summary": "SHA256 hash update (part 2).",
      "syntax": "SHA256H2.32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "Crypto 3-Reg",
        "binary_pattern": "11110011 | 0 | 0 | 0 | Vn | Vd | 1100 | N | Q | M | 1 | Vm",
        "hex_opcode": "0xF3100C00",
        "visual_parts": [
          {
            "raw": "11110011",
            "clean": "11110011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ]
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "State"
        },
        {
          "name": "Qn",
          "desc": "Hash"
        },
        {
          "name": "Qm",
          "desc": "Data"
        }
      ],
      "extension": "Crypto",
      "description": "SHA256 Hash Part 2 performs the second half of a SHA256 hash update operation on 128-bit NEON registers, processing the W array and final hash update. Qd receives the final hash state; Qn provides the hash value from the previous SHA256H instruction; Qm provides the input data block words. This A32 Crypto extension instruction does not update condition flags and requires NEON support.",
      "example": "SHA256H2.32 q0, q1, q2",
      "pseudocode": "hash_state ← Qd;\nw_data ← Qn;\ndata_words ← Qm;\ntemp ← SHA256_CH(hash_state.word[0], hash_state.word[1], hash_state.word[2]);\ntemp ← temp + SHA256_SUM1(hash_state.word[0]);\ntemp ← temp + data_words;\nQd.word[1] ← Qd.word[1] + temp;\nQd.word[0] ← hash_state.word[3];"
    },
    {
      "mnemonic": "sha256su0",
      "architecture": "ARMv8-A",
      "full_name": "SHA256 Schedule Update 0 (A32)",
      "summary": "SHA256 schedule update instruction 0.",
      "syntax": "SHA256SU0.32 <Qd>, <Qm>",
      "encoding": {
        "format": "Crypto 2-Reg",
        "binary_pattern": "11110011 | 1 | D | 11 | 10 | 10 | Vd | 00100 | Q | M | 0 | Vm",
        "hex_opcode": "0xF3B203C0",
        "visual_parts": [
          {
            "raw": "11110011",
            "clean": "11110011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00100",
            "clean": "00100"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "Crypto",
      "description": "SHA256 Schedule Update 0 performs the first part of SHA256 message schedule expansion on four 32-bit words held in a 128-bit SIMD register. It processes the sigma_0 function as part of the SHA256 cryptographic algorithm. No condition flags are modified. This instruction requires the ARM Cryptography Extensions and executes only in A32 (ARM) state.",
      "example": "SHA256SU0.32 q0, q2",
      "pseudocode": "W[t] ← (W[t] >>> 7) XOR (W[t] >>> 18) XOR (W[t] >> 3); Qd ← result of applying this transformation to each 32-bit element of Qm"
    },
    {
      "mnemonic": "sha256su1",
      "architecture": "ARMv8-A",
      "full_name": "SHA256 Schedule Update 1 (A32)",
      "summary": "SHA256 schedule update instruction 1.",
      "syntax": "SHA256SU1.32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "Crypto 3-Reg",
        "binary_pattern": "11110011 | 0 | 0 | 0 | Vn | Vd | 1101 | N | Q | M | 0 | Vm",
        "hex_opcode": "0xF3200C00",
        "visual_parts": [
          {
            "raw": "11110011",
            "clean": "11110011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ]
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "Crypto",
      "description": "SHA256 Schedule Update 1 performs the second part of SHA256 message schedule expansion, combining three 128-bit registers to compute new message schedule words. It implements the full sigma_0(W[t-15]) + W[t-7] + sigma_1(W[t-2]) + W[t-16] operation. No condition flags are modified. This instruction requires the ARM Cryptography Extensions and executes only in A32 (ARM) state.",
      "example": "SHA256SU1.32 q0, q1, q2",
      "pseudocode": "Qd ← Qd + (Qn >>> 17) XOR (Qn >>> 19) XOR (Qn >> 10) + (Qm <<< 25) XOR (Qm <<< 14) XOR (Qm >> 6); (applied element-wise to 32-bit values)"
    },
    {
      "mnemonic": "sdot",
      "architecture": "ARMv8-A",
      "full_name": "Signed Dot Product (A32)",
      "summary": "Signed Dot Product (vector by vector).",
      "syntax": "SDOT<c>.S8 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "01000100000 | Zm | 11001 | 0 | Zn | Zda",
        "hex_opcode": "0x4400C800",
        "visual_parts": [
          {
            "raw": "01000100000",
            "clean": "01000100000"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "11001",
            "clean": "11001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zda",
            "clean": "Zda"
          }
        ],
        "bit_positions": "31:21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (DotProd)",
      "description": "Signed Dot Product computes the dot product of four signed 8-bit integer elements from Qn and Qm, accumulating the result into the corresponding 32-bit element of Qd. Four separate dot products are computed in parallel across the 128-bit vectors. No condition flags are modified. This instruction requires the NEON Dot Product extension and executes in A32 (ARM) state.",
      "example": "SDOT.S8 q0, q1, q2",
      "pseudocode": "for i in [0, 1, 2, 3]:\n  Qd[i*32+31:i*32] ← Qd[i*32+31:i*32] + SignedDotProduct(Qn[i*32+31:i*32], Qm[i*32+31:i*32])"
    },
    {
      "mnemonic": "udot",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Dot Product (A32)",
      "summary": "Unsigned Dot Product (vector by vector).",
      "syntax": "UDOT<c>.U8 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "01000100000 | Zm | 11001 | 1 | Zn | Zda",
        "hex_opcode": "0x4400CC00",
        "visual_parts": [
          {
            "raw": "01000100000",
            "clean": "01000100000"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "11001",
            "clean": "11001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zda",
            "clean": "Zda"
          }
        ],
        "bit_positions": "31:21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (DotProd)",
      "description": "Unsigned Dot Product computes the dot product of four unsigned 8-bit integer elements from Qn and Qm, accumulating the result into the corresponding 32-bit element of Qd. Four separate dot products are computed in parallel across the 128-bit vectors. No condition flags are modified. This instruction requires the NEON Dot Product extension and executes in A32 (ARM) state.",
      "example": "UDOT.U8 q0, q1, q2",
      "pseudocode": "for i in [0, 1, 2, 3]:\n  Qd[i*32+31:i*32] ← Qd[i*32+31:i*32] + UnsignedDotProduct(Qn[i*32+31:i*32], Qm[i*32+31:i*32])"
    },
    {
      "mnemonic": "vmmla",
      "architecture": "ARMv8-A",
      "full_name": "Matrix Multiply Accumulate (A32)",
      "summary": "Matrix multiply-accumulate (BFloat16/Int8).",
      "syntax": "VMMLA<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111110 | 00 | D | 0 | 0 | Vn | Vd | 1 | 1 | 0 | 0 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xFC000C40",
        "visual_parts": [
          {
            "raw": "1111110",
            "clean": "1111110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (MatMul)",
      "description": "Vector Matrix Multiply-Accumulate performs a 4×4 matrix multiply-accumulate operation on either 8-bit integers or BFloat16 values, with results accumulated into Qd. When sz=0, operates on signed/unsigned 8-bit elements; when sz=1, operates on BFloat16 elements. No condition flags are modified. This instruction requires the NEON Matrix Multiply extension and executes in A32 (ARM) state.",
      "example": "VMMLA.dt q0, q1, q2",
      "pseudocode": "if sz == 0:\n  Qd ← Qd + MatMul_Int8(Qn, Qm)  (4x4 matrix multiply of int8 elements)\nelse:\n  Qd ← Qd + MatMul_BF16(Qn, Qm) (4x4 matrix multiply of bfloat16 elements)"
    },
    {
      "mnemonic": "usdot",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Signed Dot Product (A32)",
      "summary": "Dot product of unsigned and signed integers.",
      "syntax": "USDOT<c>.S8 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "01000100 | 1 | 0 | 0 | Zm | 011110 | Zn | Zda",
        "hex_opcode": "0x44807800",
        "visual_parts": [
          {
            "raw": "01000100",
            "clean": "01000100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "011110",
            "clean": "011110"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zda",
            "clean": "Zda"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "Unsigned"
        },
        {
          "name": "Qm",
          "desc": "Signed"
        }
      ],
      "extension": "NEON (DotProd)",
      "description": "Unsigned-Signed Dot Product computes the dot product of unsigned 8-bit integers from Qn and signed 8-bit integers from Qm, accumulating into the corresponding 32-bit element of Qd. Four separate dot products are computed in parallel. No condition flags are modified. This instruction requires the NEON Dot Product extension and executes in A32 (ARM) state.",
      "example": "USDOT.S8 q0, q1, q2",
      "pseudocode": "for i in [0, 1, 2, 3]:\n  Qd[i*32+31:i*32] ← Qd[i*32+31:i*32] + USSignedDotProduct(UnsignedQn[i*32+31:i*32], SignedQm[i*32+31:i*32])"
    },
    {
      "mnemonic": "sxtb",
      "architecture": "ARMv8-A",
      "full_name": "Signed Extend Byte (Thumb)",
      "summary": "Sign-extends byte to word (Thumb).",
      "syntax": "SXTB <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb Data Proc",
        "binary_pattern": "10110010 | 0 | 1 | Rm | Rd",
        "hex_opcode": "0xB240",
        "visual_parts": [
          {
            "raw": "10110010",
            "clean": "10110010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "15:8 | 7 | 6 | 5:3 | 2:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Sign-extends an 8-bit byte value to a 32-bit word in the T32 (Thumb) instruction set. The least-significant byte of Rm is sign-extended and written to Rd. No condition flags are affected.",
      "example": "SXTB r0, r2",
      "pseudocode": "Rd = SignExtend(Rm[7:0], 32)"
    },
    {
      "mnemonic": "sxth",
      "architecture": "ARMv8-A",
      "full_name": "Signed Extend Halfword (Thumb)",
      "summary": "Sign-extends halfword to word (Thumb).",
      "syntax": "SXTH <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb Data Proc",
        "binary_pattern": "10110010 | 0 | 0 | Rm | Rd",
        "hex_opcode": "0xB200",
        "visual_parts": [
          {
            "raw": "10110010",
            "clean": "10110010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "15:8 | 7 | 6 | 5:3 | 2:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Sign-extends a 16-bit halfword value to a 32-bit word in the T32 (Thumb) instruction set. The least-significant halfword of Rm is sign-extended and written to Rd. No condition flags are affected.",
      "example": "SXTH r0, r2",
      "pseudocode": "Rd = SignExtend(Rm[15:0], 32)"
    },
    {
      "mnemonic": "uxtb",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Extend Byte (Thumb)",
      "summary": "Zero-extends byte to word (Thumb).",
      "syntax": "UXTB <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb Data Proc",
        "binary_pattern": "10110010 | 1 | 1 | Rm | Rd",
        "hex_opcode": "0xB2C0",
        "visual_parts": [
          {
            "raw": "10110010",
            "clean": "10110010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "15:8 | 7 | 6 | 5:3 | 2:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Zero-extends an 8-bit byte value to a 32-bit word in the T32 (Thumb) instruction set. The least-significant byte of Rm is zero-extended and written to Rd. No condition flags are affected.",
      "example": "UXTB r0, r2",
      "pseudocode": "Rd = ZeroExtend(Rm[7:0], 32)"
    },
    {
      "mnemonic": "uxth",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Extend Halfword (Thumb)",
      "summary": "Zero-extends halfword to word (Thumb).",
      "syntax": "UXTH <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb Data Proc",
        "binary_pattern": "10110010 | 1 | 0 | Rm | Rd",
        "hex_opcode": "0xB280",
        "visual_parts": [
          {
            "raw": "10110010",
            "clean": "10110010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "15:8 | 7 | 6 | 5:3 | 2:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Zero-extends a 16-bit halfword value to a 32-bit word in the T32 (Thumb) instruction set. The least-significant halfword of Rm is zero-extended and written to Rd. No condition flags are affected.",
      "example": "UXTH r0, r2",
      "pseudocode": "Rd = ZeroExtend(Rm[15:0], 32)"
    },
    {
      "mnemonic": "rev",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bytes (Thumb)",
      "summary": "Endian swap (Thumb).",
      "syntax": "REV <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb Data Proc",
        "binary_pattern": "10111010 | 00 | Rm | Rd",
        "hex_opcode": "0xBA00",
        "visual_parts": [
          {
            "raw": "10111010",
            "clean": "10111010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "15:8 | 7:6 | 5:3 | 2:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Reverses the byte order of a 32-bit value in a general-purpose register. The four bytes of the source register are swapped to convert between big-endian and little-endian representations. This instruction does not affect the condition flags. Execution is restricted to T32 (Thumb) instruction set.",
      "example": "REV r0, r2",
      "pseudocode": "Rd ← (Rm[7:0] << 24) | (Rm[15:8] << 16) | (Rm[23:16] << 8) | Rm[31:24]"
    },
    {
      "mnemonic": "rev16",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bytes Halfword (Thumb)",
      "summary": "Reverse bytes in halfwords (Thumb).",
      "syntax": "REV16 <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb Data Proc",
        "binary_pattern": "10111010 | 01 | Rm | Rd",
        "hex_opcode": "0xBA40",
        "visual_parts": [
          {
            "raw": "10111010",
            "clean": "10111010"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "15:8 | 7:6 | 5:3 | 2:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Reverses the byte order within each 16-bit halfword of a 32-bit register independently. Bytes [7:0] and [15:8] are swapped, and bytes [23:16] and [31:24] are swapped. This instruction does not affect the condition flags. Execution is restricted to T32 (Thumb) instruction set.",
      "example": "REV16 r0, r2",
      "pseudocode": "Rd ← (Rm[7:0] << 8) | Rm[15:8] | (Rm[23:16] << 8) | Rm[31:24]"
    },
    {
      "mnemonic": "revsh",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Signed Halfword (Thumb)",
      "summary": "Reverse bytes in low halfword, sign extend (Thumb).",
      "syntax": "REVSH <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb Data Proc",
        "binary_pattern": "10111010 | 11 | Rm | Rd",
        "hex_opcode": "0xBAC0",
        "visual_parts": [
          {
            "raw": "10111010",
            "clean": "10111010"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "15:8 | 7:6 | 5:3 | 2:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Reverse Signed Halfword reverses the byte order of the low 16 bits of Rm, then sign-extends the result to 32 bits and writes it to Rd. This is commonly used to perform endian conversion on signed 16-bit values. No condition flags are modified. This instruction executes only in T32 (Thumb) state.",
      "example": "REVSH r0, r2",
      "pseudocode": "halfword ← Rm[15:0];\nreversed ← (halfword[7:0] << 8) | halfword[15:8];\nRd ← SignExtend(reversed, 16)"
    },
    {
      "mnemonic": "fabs",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Absolute Value (Scalar)",
      "summary": "Calculates the absolute value of a float.",
      "syntax": "FABS <Hd|Sd|Dd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 10000 | 01 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E20C000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Computes the absolute value of a scalar floating-point operand, clearing the sign bit while preserving all other bits. Floating-point exception conditions (invalid operation, etc.) are not generated. The instruction operates on Half-precision (16-bit), Single-precision (32-bit), or Double-precision (64-bit) formats, determined by the type field. This is an AArch64-only instruction.",
      "example": "FABS Dd, Dn",
      "pseudocode": "Rd ← abs(Rn)\nif (type == 00) then Rd is H-register (16-bit)\nelse if (type == 01) then Rd is S-register (32-bit)\nelse if (type == 10) then Rd is D-register (64-bit)"
    },
    {
      "mnemonic": "fadd",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Add (Scalar)",
      "summary": "Adds two floating-point values.",
      "syntax": "FADD <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 001 | 0 | 10 | Rn | Rd",
        "hex_opcode": "0x1E202800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Adds two scalar floating-point operands and writes the result to the destination register. The operation respects IEEE 754 rounding modes and may generate floating-point exception conditions (invalid, overflow, underflow, inexact). The instruction operates on Half-precision (16-bit), Single-precision (32-bit), or Double-precision (64-bit) formats, determined by the type field. This is an AArch64-only instruction.",
      "example": "FADD Dd, Dn, Dm",
      "pseudocode": "Rd ← FP_Add(Rn, Rm)\nif (type == 00) then operands are H-registers (16-bit)\nelse if (type == 01) then operands are S-registers (32-bit)\nelse if (type == 10) then operands are D-registers (64-bit)"
    },
    {
      "mnemonic": "fsub",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Subtract (Scalar)",
      "summary": "Subtracts two floating-point values.",
      "syntax": "FSUB <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 001 | 1 | 10 | Rn | Rd",
        "hex_opcode": "0x1E203800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Subtracts one scalar floating-point operand from another and writes the result to the destination register. The operation respects IEEE 754 rounding modes and may generate floating-point exception conditions (invalid, overflow, underflow, inexact). The instruction operates on Half-precision (16-bit), Single-precision (32-bit), or Double-precision (64-bit) formats, determined by the type field. This is an AArch64-only instruction.",
      "example": "FSUB Dd, Dn, Dm",
      "pseudocode": "Rd ← FP_Subtract(Rn, Rm)\nif (type == 00) then operands are H-registers (16-bit)\nelse if (type == 01) then operands are S-registers (32-bit)\nelse if (type == 10) then operands are D-registers (64-bit)"
    },
    {
      "mnemonic": "fmul",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Multiply (Scalar)",
      "summary": "Multiplies two floating-point values.",
      "syntax": "FMUL <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 0 | 00010 | Rn | Rd",
        "hex_opcode": "0x1E200800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Multiplies two scalar floating-point operands and writes the result to the destination register. The operation respects IEEE 754 rounding modes and may generate floating-point exception conditions (invalid, overflow, underflow, inexact). The instruction operates on Half-precision (16-bit), Single-precision (32-bit), or Double-precision (64-bit) formats, determined by the type field. This is an AArch64-only instruction.",
      "example": "FMUL Dd, Dn, Dm",
      "pseudocode": "Rd ← FP_Multiply(Rn, Rm)\nif (type == 00) then operands are H-registers (16-bit)\nelse if (type == 01) then operands are S-registers (32-bit)\nelse if (type == 10) then operands are D-registers (64-bit)"
    },
    {
      "mnemonic": "fdiv",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Divide (Scalar)",
      "summary": "Divides two floating-point values.",
      "syntax": "FDIV <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 0001 | 10 | Rn | Rd",
        "hex_opcode": "0x1E201800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Divides one scalar floating-point operand by another and writes the result to the destination register. The operation respects IEEE 754 rounding modes and may generate floating-point exception conditions (invalid, overflow, underflow, inexact, divide-by-zero). The instruction operates on Half-precision (16-bit), Single-precision (32-bit), or Double-precision (64-bit) formats, determined by the type field. This is an AArch64-only instruction.",
      "example": "FDIV Dd, Dn, Dm",
      "pseudocode": "Rd ← FP_Divide(Rn, Rm)\nif (type == 00) then operands are H-registers (16-bit)\nelse if (type == 01) then operands are S-registers (32-bit)\nelse if (type == 10) then operands are D-registers (64-bit)"
    },
    {
      "mnemonic": "fmadd",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Fused Multiply-Add (Scalar)",
      "summary": "Calculates (Vn * Vm) + Va without intermediate rounding.",
      "syntax": "FMADD <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>, <Ha|Sa|Da>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11111 | 00 | 0 | Rm | 0 | Ra | Rn | Rd",
        "hex_opcode": "0x1F000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Ha|Sa|Da",
          "desc": "Third source (accumulator) SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Computes a fused multiply-add operation: (Rn × Rm) + Ra, with a single rounding step applied to the final result. This guarantees higher precision than separate multiply and add instructions. Floating-point exception conditions (invalid, overflow, underflow, inexact) may be generated. The instruction operates on Half-precision (16-bit), Single-precision (32-bit), or Double-precision (64-bit) formats, determined by the type field. This is an AArch64-only instruction.",
      "example": "FMADD Dd, Dn, Dm, Da",
      "pseudocode": "Rd ← FP_FusedMultiplyAdd(Rn, Rm, Ra)\nif (type == 00) then operands are H-registers (16-bit)\nelse if (type == 01) then operands are S-registers (32-bit)\nelse if (type == 10) then operands are D-registers (64-bit)"
    },
    {
      "mnemonic": "fmsub",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Fused Multiply-Subtract (Scalar)",
      "summary": "Calculates (Vn * Vm) - Va.",
      "syntax": "FMSUB <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>, <Ha|Sa|Da>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11111 | 00 | 0 | Rm | 1 | Ra | Rn | Rd",
        "hex_opcode": "0x1F008000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Ha|Sa|Da",
          "desc": "Third source (accumulator) SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Floating-point fused multiply-subtract: computes (Vn × Vm) - Va and stores the result in Vd as a single fused operation with a single rounding step. Supports half-precision (H), single-precision (S), and double-precision (D) floating-point formats. No condition flags are affected; exceptions may be generated for invalid operations, overflow, underflow, inexact results, or input denormals depending on FPCR settings. AArch64 only.",
      "example": "FMSUB Dd, Dn, Dm, Da",
      "pseudocode": "if HaveFPExt() then\n  Vd ← FPMulSub(Vn, Vm, Va)\nelse\n  UNDEFINED"
    },
    {
      "mnemonic": "fnmadd",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Fused Negated Multiply-Add (Scalar)",
      "summary": "Calculates -((Vn * Vm) + Va).",
      "syntax": "FNMADD <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>, <Ha|Sa|Da>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11111 | 00 | 1 | Rm | 0 | Ra | Rn | Rd",
        "hex_opcode": "0x1F200000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Ha|Sa|Da",
          "desc": "Third source (accumulator) SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Floating-point fused negated multiply-add: computes -((Vn × Vm) + Va) and stores the result in Vd as a single fused operation with a single rounding step. Supports half-precision (H), single-precision (S), and double-precision (D) floating-point formats. No condition flags are affected; exceptions may be generated for invalid operations, overflow, underflow, inexact results, or input denormals depending on FPCR settings. AArch64 only.",
      "example": "FNMADD Dd, Dn, Dm, Da",
      "pseudocode": "if HaveFPExt() then\n  Vd ← FPNegMulAdd(Vn, Vm, Va)\nelse\n  UNDEFINED"
    },
    {
      "mnemonic": "fnmsub",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Fused Negated Multiply-Subtract (Scalar)",
      "summary": "Calculates -((Vn * Vm) - Va).",
      "syntax": "FNMSUB <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>, <Ha|Sa|Da>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11111 | 00 | 1 | Rm | 1 | Ra | Rn | Rd",
        "hex_opcode": "0x1F208000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Ha|Sa|Da",
          "desc": "Third source (accumulator) SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Floating-point fused negated multiply-subtract: computes -((Vn × Vm) - Va) and stores the result in Vd as a single fused operation with a single rounding step. Supports half-precision (H), single-precision (S), and double-precision (D) floating-point formats. No condition flags are affected; exceptions may be generated for invalid operations, overflow, underflow, inexact results, or input denormals depending on FPCR settings. AArch64 only.",
      "example": "FNMSUB Dd, Dn, Dm, Da",
      "pseudocode": "if HaveFPExt() then\n  Vd ← FPNegMulSub(Vn, Vm, Va)\nelse\n  UNDEFINED"
    },
    {
      "mnemonic": "fnmul",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Negated Multiply (Scalar)",
      "summary": "Calculates -(Vn * Vm).",
      "syntax": "FNMUL <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 1 | 00010 | Rn | Rd",
        "hex_opcode": "0x1E208800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Floating-Point Negated Multiply computes the negation of the product of two floating-point values: -(Vn × Vm), writing the result to Vd. Supports half-precision (type=0, 16-bit), single-precision (type=1, 32-bit), and double-precision (type=2, 64-bit) operands. FPSR exception flags may be set based on invalid, inexact, or overflow conditions. This instruction executes only in AArch64 state.",
      "example": "FNMUL Dd, Dn, Dm",
      "pseudocode": "if type == 0:\n  Vd ← -(Vn_float16 × Vm_float16)\nelse if type == 1:\n  Vd ← -(Vn_float32 × Vm_float32)\nelse if type == 2:\n  Vd ← -(Vn_float64 × Vm_float64)"
    },
    {
      "mnemonic": "fsqrt",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Square Root (Scalar)",
      "summary": "Calculates square root.",
      "syntax": "FSQRT <Hd|Sd|Dd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 10000 | 11 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E21C000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Floating-point square root: computes the square root of Vn and stores the result in Vd. Supports half-precision (H), single-precision (S), and double-precision (D) floating-point formats. No condition flags are affected; exceptions may be generated for invalid operations (negative non-zero inputs), underflow, inexact results, or input denormals depending on FPCR settings. AArch64 only.",
      "example": "FSQRT Dd, Dn",
      "pseudocode": "if HaveFPExt() then\n  Vd ← FPSqrt(Vn)\nelse\n  UNDEFINED"
    },
    {
      "mnemonic": "fneg",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Negate (Scalar)",
      "summary": "Negates the value (flips sign bit).",
      "syntax": "FNEG <Hd|Sd|Dd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 11 | 10000 | 10 | 10000 | Rn | Rd",
        "hex_opcode": "0x1EE14000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Floating-point negate: flips the sign bit of Vn and stores the result in Vd, converting positive to negative and vice versa (including sign of zero). Supports half-precision (H), single-precision (S), and double-precision (D) floating-point formats. No condition flags are affected; no floating-point exceptions are generated. AArch64 only.",
      "example": "FNEG Dd, Dn",
      "pseudocode": "if HaveFPExt() then\n  Vd ← FPNeg(Vn)\nelse\n  UNDEFINED"
    },
    {
      "mnemonic": "fmax",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Maximum (Scalar)",
      "summary": "Returns the larger of two values.",
      "syntax": "FMAX <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 01 | 00 | 10 | Rn | Rd",
        "hex_opcode": "0x1E204800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Floating-point maximum: returns the larger of Vn and Vm and stores it in Vd. Supports half-precision (H), single-precision (S), and double-precision (D) floating-point formats. Follows IEEE 754 rules where if either operand is NaN, NaN is returned; if one operand is zero and the other is -0, returns +0. No condition flags are affected; exceptions may be generated for invalid operations or input denormals depending on FPCR settings. AArch64 only.",
      "example": "FMAX Dd, Dn, Dm",
      "pseudocode": "if HaveFPExt() then\n  Vd ← FPMax(Vn, Vm)\nelse\n  UNDEFINED"
    },
    {
      "mnemonic": "fmin",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Minimum (Scalar)",
      "summary": "Returns the smaller of two values.",
      "syntax": "FMIN <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 01 | 01 | 10 | Rn | Rd",
        "hex_opcode": "0x1E205800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Floating-point minimum: returns the smaller of Vn and Vm and stores it in Vd. Supports half-precision (H), single-precision (S), and double-precision (D) floating-point formats. Follows IEEE 754 rules where if either operand is NaN, NaN is returned; if one operand is zero and the other is -0, returns -0. No condition flags are affected; exceptions may be generated for invalid operations or input denormals depending on FPCR settings. AArch64 only.",
      "example": "FMIN Dd, Dn, Dm",
      "pseudocode": "if HaveFPExt() then\n  Vd ← FPMin(Vn, Vm)\nelse\n  UNDEFINED"
    },
    {
      "mnemonic": "fmaxnm",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Max Number (Scalar)",
      "summary": "Returns larger value, handling NaNs according to IEEE 754-2008 'maxNum'.",
      "syntax": "FMAXNM <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 01 | 10 | 10 | Rn | Rd",
        "hex_opcode": "0x1E206800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Floating-point maximum number: returns the larger of two floating-point numbers Vn and Vm according to IEEE 754-2008 'maxNum' semantics, where if one operand is NaN and the other is a number, the number is returned. Supports half-precision (H), single-precision (S), and double-precision (D) floating-point formats. No condition flags are affected; exceptions may be generated for invalid operations or input denormals depending on FPCR settings. AArch64 only.",
      "example": "FMAXNM Dd, Dn, Dm",
      "pseudocode": "if HaveFPExt() then\n  Vd ← FPMaxNum(Vn, Vm)\nelse\n  UNDEFINED"
    },
    {
      "mnemonic": "fminnm",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Min Number (Scalar)",
      "summary": "Returns smaller value, handling NaNs according to IEEE 754-2008 'minNum'.",
      "syntax": "FMINNM <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 01 | 11 | 10 | Rn | Rd",
        "hex_opcode": "0x1E207800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Floating-point minimum of two scalar values, returning the number (non-NaN) operand when one operand is NaN, per IEEE 754-2008 minNum semantics. Condition flags (N, Z, C, V) are not affected. AArch64-only instruction.",
      "example": "FMINNM Dd, Dn, Dm",
      "pseudocode": "if IsNaN(Vn) then\n  result ← Vm\nelsif IsNaN(Vm) then\n  result ← Vn\nelse\n  result ← min(Vn, Vm)\nVd ← result"
    },
    {
      "mnemonic": "fcmp",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Compare (Scalar)",
      "summary": "Compares two floating-point values and updates process flags (NZCV).",
      "syntax": "FCMP <Hn|Sn|Dn>, <Hm|Sm|Dm|#0.0>",
      "encoding": {
        "format": "FP Compare",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 00 | 1000 | Rn | 00 | 000",
        "hex_opcode": "0x1E202000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "000",
            "clean": "000"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13:10 | 9:5 | 4:3 | 2:0"
      },
      "operands": [
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm|0.0",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "Floating Point",
      "description": "Compares two floating-point scalar values and updates the NZCV condition flags based on the result. The comparison is performed on the values in the two source registers, and flags are set to reflect whether the first operand is less than, equal to, greater than, or unordered with respect to the second. This is an AArch64-only instruction that does not modify any registers, only the NZCV flags.",
      "example": "FCMP Dn, Dm|#0.0",
      "pseudocode": "result ← FPCompare(Vn, Vm)\nN ← result.N\nZ ← result.Z\nC ← result.C\nV ← result.V"
    },
    {
      "mnemonic": "fccmp",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Conditional Compare (Scalar)",
      "summary": "Compares floats only if condition is met, else sets flags to immediate.",
      "syntax": "FCCMP <Hn|Sn|Dn>, <Hm|Sm|Dm>, #<nzcv>, <cond>",
      "encoding": {
        "format": "FP Compare",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | cond | 01 | Rn | 0 | nzcv",
        "hex_opcode": "0x1E200400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "nzcv",
            "clean": "nzcv"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11:10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "nzcv",
          "desc": "Def Flags"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Floating Point",
      "description": "Conditionally compares two floating-point scalar values if the specified condition is true, updating NZCV flags with the comparison result; if the condition is false, sets NZCV to the immediate value provided. This is an AArch64-only instruction that allows conditional flag updates without branching, useful for implementing conditional chains and complex control flow.",
      "example": "FCCMP Dn, Dm, #nzcv, cond",
      "pseudocode": "if ConditionHolds(cond) then\n  result ← FPCompare(Vn, Vm)\n  N ← result.N\n  Z ← result.Z\n  C ← result.C\n  V ← result.V\nelse\n  N ← nzcv[3]\n  Z ← nzcv[2]\n  C ← nzcv[1]\n  V ← nzcv[0]"
    },
    {
      "mnemonic": "fcsel",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Conditional Select (Scalar)",
      "summary": "Selects one of two floats based on condition flags.",
      "syntax": "FCSEL <Hd|Sd|Dd>, <Hn|Sn|Dn>, <Hm|Sm|Dm>, <cond>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | cond | 11 | Rn | Rd",
        "hex_opcode": "0x1E200C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hm|Sm|Dm",
          "desc": "Second source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Floating Point",
      "description": "Selects between two floating-point scalar values based on the current condition flags, writing the selected value to the destination register. If the condition is true, Vn is selected; otherwise, Vm is selected. This is an AArch64-only instruction that does not modify condition flags or any register other than the destination.",
      "example": "FCSEL Dd, Dn, Dm, cond",
      "pseudocode": "if ConditionHolds(cond) then\n  Vd ← Vn\nelse\n  Vd ← Vm"
    },
    {
      "mnemonic": "fcvt",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert (Scalar)",
      "summary": "Converts between float precisions (e.g., Half <-> Single <-> Double).",
      "syntax": "FCVT <Hd|Sd|Dd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 11 | 10001 | 00 | 10000 | Rn | Rd",
        "hex_opcode": "0x1EE24000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "10001",
            "clean": "10001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts a scalar floating-point value between precision formats (e.g., Half ↔ Single ↔ Double). The rounding mode is determined by FPCR.RMode. Condition flags are not affected. AArch64-only instruction.",
      "example": "FCVT Dd, Dn",
      "pseudocode": "operand ← Vn\nresult ← ConvertFP(operand, source_precision, destination_precision, FPCR.RMode)\nVd ← result"
    },
    {
      "mnemonic": "fcvtas",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert to Signed Integer (Nearest)",
      "summary": "Converts float to signed integer, rounding to nearest.",
      "syntax": "FCVTAS <Wd|Xd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 11 | 1 | 00 | 100 | 000000 | Rn | Rd",
        "hex_opcode": "0x1EE40000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd|Xd",
          "desc": "Destination general-purpose register (32-bit/64-bit)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts a scalar floating-point value to a signed integer, rounding to nearest with ties away from zero. Sets condition flags based on the integer result. Raises Invalid Operation exception on overflow or invalid input. AArch64-only instruction.",
      "example": "FCVTAS Wd, Dn",
      "pseudocode": "operand ← Vn\nintval ← RoundTowardNearestAwayFromZero(operand)\nif intval > MaxInt(destination_width) or intval < MinInt(destination_width) then\n  GenerateException(InvalidOperation)\nelse\n  Rd ← SignExtend(intval)\n  UpdateFlags(intval)\nend"
    },
    {
      "mnemonic": "fcvtau",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert to Unsigned Integer (Nearest)",
      "summary": "Converts float to unsigned integer, rounding to nearest.",
      "syntax": "FCVTAU <Wd|Xd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 11 | 1 | 00 | 101 | 000000 | Rn | Rd",
        "hex_opcode": "0x1EE50000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd|Xd",
          "desc": "Destination general-purpose register (32-bit/64-bit)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts a scalar floating-point value to an unsigned integer, rounding to nearest with ties away from zero. Sets condition flags based on the integer result. Raises Invalid Operation exception on overflow or invalid input. AArch64-only instruction.",
      "example": "FCVTAU Wd, Dn",
      "pseudocode": "operand ← Vn\nintval ← RoundTowardNearestAwayFromZero(operand)\nif intval > MaxUInt(destination_width) or intval < 0 then\n  GenerateException(InvalidOperation)\nelse\n  Rd ← ZeroExtend(intval)\n  UpdateFlags(intval)\nend"
    },
    {
      "mnemonic": "fcvtms",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert to Signed Integer (Minus Infinity)",
      "summary": "Converts float to signed integer, rounding towards minus infinity (Floor).",
      "syntax": "FCVTMS <Wd|Xd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | 10 | 000 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E300000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd|Xd",
          "desc": "Destination general-purpose register (32-bit/64-bit)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts a scalar floating-point value to a signed integer, rounding towards negative infinity (floor). Sets condition flags based on the integer result. Raises Invalid Operation exception on overflow or invalid input. AArch64-only instruction.",
      "example": "FCVTMS Wd, Dn",
      "pseudocode": "operand ← Vn\nintval ← Floor(operand)\nif intval > MaxInt(destination_width) or intval < MinInt(destination_width) then\n  GenerateException(InvalidOperation)\nelse\n  Rd ← SignExtend(intval)\n  UpdateFlags(intval)\nend"
    },
    {
      "mnemonic": "fcvtmu",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert to Unsigned Integer (Minus Infinity)",
      "summary": "Converts float to unsigned integer, rounding towards minus infinity.",
      "syntax": "FCVTMU <Wd|Xd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | 10 | 001 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E310000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd|Xd",
          "desc": "Destination general-purpose register (32-bit/64-bit)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts a scalar floating-point value to an unsigned integer, rounding towards negative infinity (floor). Sets condition flags based on the integer result. Raises Invalid Operation exception on overflow or invalid input. AArch64-only instruction.",
      "example": "FCVTMU Wd, Dn",
      "pseudocode": "operand ← Vn\nintval ← Floor(operand)\nif intval > MaxUInt(destination_width) or intval < 0 then\n  GenerateException(InvalidOperation)\nelse\n  Rd ← ZeroExtend(intval)\n  UpdateFlags(intval)\nend"
    },
    {
      "mnemonic": "fcvtns",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert to Signed Integer (Nearest, ties to Even)",
      "summary": "Converts float to signed integer, rounding to nearest (bankers' round).",
      "syntax": "FCVTNS <Wd|Xd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | 00 | 000 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E200000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd|Xd",
          "desc": "Destination general-purpose register (32-bit/64-bit)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts a scalar floating-point value to a signed integer, rounding to nearest with ties to even (bankers' round). Sets condition flags based on the integer result. Raises Invalid Operation exception on overflow or invalid input. AArch64-only instruction.",
      "example": "FCVTNS Wd, Dn",
      "pseudocode": "operand ← Vn\nintval ← RoundTowardNearestEven(operand)\nif intval > MaxInt(destination_width) or intval < MinInt(destination_width) then\n  GenerateException(InvalidOperation)\nelse\n  Rd ← SignExtend(intval)\n  UpdateFlags(intval)\nend"
    },
    {
      "mnemonic": "fcvtnu",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert to Unsigned Integer (Nearest, ties to Even)",
      "summary": "Converts float to unsigned integer, rounding to nearest (bankers' round).",
      "syntax": "FCVTNU <Wd|Xd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | 00 | 001 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E210000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd|Xd",
          "desc": "Destination general-purpose register (32-bit/64-bit)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts a scalar floating-point value to an unsigned integer, rounding to nearest with ties to even (bankers' round). Sets condition flags based on the integer result. Raises Invalid Operation exception on overflow or invalid input. AArch64-only instruction.",
      "example": "FCVTNU Wd, Dn",
      "pseudocode": "operand ← Vn\nintval ← RoundTowardNearestEven(operand)\nif intval > MaxUInt(destination_width) or intval < 0 then\n  GenerateException(InvalidOperation)\nelse\n  Rd ← ZeroExtend(intval)\n  UpdateFlags(intval)\nend"
    },
    {
      "mnemonic": "fcvtps",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert to Signed Integer (Plus Infinity)",
      "summary": "Converts float to signed integer, rounding towards plus infinity (Ceil).",
      "syntax": "FCVTPS <Wd|Xd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | 01 | 000 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E280000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd|Xd",
          "desc": "Destination general-purpose register (32-bit/64-bit)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts a floating-point value to a signed integer, rounding towards plus infinity (ceiling). The source is read from a half-precision (H), single-precision (S), or double-precision (D) FP register, and the result is written to a 32-bit (W) or 64-bit (X) general-purpose register. NZCV flags are not affected by this instruction. This is an AArch64-only instruction that executes at any privilege level.",
      "example": "FCVTPS Wd, Dn",
      "pseudocode": "if source_is_nan then\n  result ← 0\nelse\n  result ← round_to_plus_infinity(FP_to_signed_integer(Vn))\nRd ← result"
    },
    {
      "mnemonic": "fcvtpu",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert to Unsigned Integer (Plus Infinity)",
      "summary": "Converts float to unsigned integer, rounding towards plus infinity.",
      "syntax": "FCVTPU <Wd|Xd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | 01 | 001 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E290000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd|Xd",
          "desc": "Destination general-purpose register (32-bit/64-bit)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts a floating-point value to an unsigned integer, rounding towards plus infinity (ceiling). The source is read from a half-precision (H), single-precision (S), or double-precision (D) FP register, and the result is written to a 32-bit (W) or 64-bit (X) general-purpose register. NZCV flags are not affected by this instruction. This is an AArch64-only instruction that executes at any privilege level.",
      "example": "FCVTPU Wd, Dn",
      "pseudocode": "if source_is_nan then\n  result ← 0\nelse\n  result ← round_to_plus_infinity(FP_to_unsigned_integer(Vn))\nRd ← result"
    },
    {
      "mnemonic": "fcvtzs",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert to Signed Integer (Zero)",
      "summary": "Converts float to signed integer, rounding towards zero (Truncate).",
      "syntax": "FCVTZS <Wd|Xd>, <Hn|Sn|Dn> {, #<fbits>}",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | 11 | 000 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E380000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd|Xd",
          "desc": "Destination general-purpose register (32-bit/64-bit)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "fbits",
          "desc": "Number of fractional bits"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts a floating-point value to a signed integer, rounding towards zero (truncation). The source is read from a half-precision (H), single-precision (S), or double-precision (D) FP register, and the result is written to a 32-bit (W) or 64-bit (X) general-purpose register. An optional fixed-point shift parameter (fbits) can scale the result by 2^fbits. NZCV flags are not affected by this instruction. This is an AArch64-only instruction that executes at any privilege level.",
      "example": "FCVTZS Wd, Dn",
      "pseudocode": "if source_is_nan then\n  result ← 0\nelse\n  if fbits_present then\n    result ← round_towards_zero(FP_to_signed_integer(Vn) × 2^fbits)\n  else\n    result ← round_towards_zero(FP_to_signed_integer(Vn))\nRd ← result"
    },
    {
      "mnemonic": "fcvtzu",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert to Unsigned Integer (Zero)",
      "summary": "Converts float to unsigned integer, rounding towards zero (Truncate).",
      "syntax": "FCVTZU <Wd|Xd>, <Hn|Sn|Dn> {, #<fbits>}",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | 11 | 001 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E390000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd|Xd",
          "desc": "Destination general-purpose register (32-bit/64-bit)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "fbits",
          "desc": "Number of fractional bits"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts a floating-point value to an unsigned integer, rounding towards zero (truncation). The source is read from a half-precision (H), single-precision (S), or double-precision (D) FP register, and the result is written to a 32-bit (W) or 64-bit (X) general-purpose register. An optional fixed-point shift parameter (fbits) can scale the result by 2^fbits. NZCV flags are not affected by this instruction. This is an AArch64-only instruction that executes at any privilege level.",
      "example": "FCVTZU Wd, Dn",
      "pseudocode": "if source_is_nan then\n  result ← 0\nelse\n  if fbits_present then\n    result ← round_towards_zero(FP_to_unsigned_integer(Vn) × 2^fbits)\n  else\n    result ← round_towards_zero(FP_to_unsigned_integer(Vn))\nRd ← result"
    },
    {
      "mnemonic": "scvtf",
      "architecture": "ARMv8-A",
      "full_name": "Signed Integer Convert to Floating-Point",
      "summary": "Converts signed integer (GPR) to floating-point.",
      "syntax": "SCVTF <Hd|Sd|Dd>, <Wn|Xn> {, #<fbits>}",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | 00 | 010 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E220000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Wn|Xn",
          "desc": "First source general-purpose register (32-bit/64-bit)"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts a signed integer value from a GPR to floating-point format and writes the result to an FP scalar register. The conversion respects an optional fixed-point scaling factor (fbits) if provided, effectively dividing the result by 2^fbits. This is an AArch64-only instruction that does not modify condition flags.",
      "example": "SCVTF Dd, Wn",
      "pseudocode": "int_val ← SignExtend(Rn)\nif fbits != 0 then\n  fp_val ← ConvertToFP(int_val / 2^fbits)\nelse\n  fp_val ← ConvertToFP(int_val)\nVd ← fp_val"
    },
    {
      "mnemonic": "ucvtf",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Integer Convert to Floating-Point",
      "summary": "Converts unsigned integer (GPR) to floating-point.",
      "syntax": "UCVTF <Hd|Sd|Dd>, <Wn|Xn> {, #<fbits>}",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | 00 | 011 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E230000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Wn|Xn",
          "desc": "First source general-purpose register (32-bit/64-bit)"
        }
      ],
      "extension": "Floating Point",
      "description": "Converts an unsigned integer value from a GPR to floating-point format and writes the result to an FP scalar register. The conversion respects an optional fixed-point scaling factor (fbits) if provided, effectively dividing the result by 2^fbits. This is an AArch64-only instruction that does not modify condition flags.",
      "example": "UCVTF Dd, Wn",
      "pseudocode": "uint_val ← ZeroExtend(Rn)\nif fbits != 0 then\n  fp_val ← ConvertToFP(uint_val / 2^fbits)\nelse\n  fp_val ← ConvertToFP(uint_val)\nVd ← fp_val"
    },
    {
      "mnemonic": "frinta",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Round to Integral (Nearest)",
      "summary": "Rounds float to nearest integral value (ties away from zero).",
      "syntax": "FRINTA <Hd|Sd|Dd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1001 | 100 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E264000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:18 | 17:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Rounds a floating-point scalar value to the nearest integral value, with ties rounded away from zero. The rounding mode is always \"round to nearest, ties away from zero\" regardless of the FPCR rounding mode setting. This is an AArch64-only instruction that does not modify condition flags.",
      "example": "FRINTA Dd, Dn",
      "pseudocode": "rounded_val ← RoundToIntegral_TiesAwayFromZero(Vn)\nVd ← rounded_val"
    },
    {
      "mnemonic": "frinti",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Round to Integral (Current)",
      "summary": "Rounds float to integral value using current FPCR rounding mode.",
      "syntax": "FRINTI <Hd|Sd|Dd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1001 | 111 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E27C000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:18 | 17:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Rounds a floating-point scalar value to an integral value using the current rounding mode specified in the FPCR (Floating-Point Control Register). The rounding behavior depends on the RMode field in FPCR. This is an AArch64-only instruction that does not modify condition flags.",
      "example": "FRINTI Dd, Dn",
      "pseudocode": "rounded_val ← RoundToIntegral_CurrentMode(Vn)   \nVd ← rounded_val"
    },
    {
      "mnemonic": "frintm",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Round to Integral (Minus Infinity)",
      "summary": "Rounds float to integral value towards minus infinity (Floor).",
      "syntax": "FRINTM <Hd|Sd|Dd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1001 | 010 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E254000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:18 | 17:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Rounds a floating-point scalar value towards negative infinity (floor). The rounding mode is always \"round towards minus infinity\" regardless of the FPCR rounding mode setting. This is an AArch64-only instruction that does not modify condition flags.",
      "example": "FRINTM Dd, Dn",
      "pseudocode": "rounded_val ← RoundToIntegral_MinusInfinity(Vn)\nVd ← rounded_val"
    },
    {
      "mnemonic": "frintn",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Round to Integral (Nearest Even)",
      "summary": "Rounds float to integral value nearest, ties to even.",
      "syntax": "FRINTN <Hd|Sd|Dd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1001 | 000 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E244000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:18 | 17:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Rounds the floating-point value in the source register to the nearest integer using round-to-nearest-ties-to-even mode, and writes the result to the destination register. The instruction does not set any condition flags (N, Z, C, V remain unaffected). Execution is AArch64-only and may generate floating-point exceptions based on the source operand and enabled exception controls.",
      "example": "FRINTN Dd, Dn",
      "pseudocode": "Vd ← RoundToNearestEven(Vn)"
    },
    {
      "mnemonic": "frintp",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Round to Integral (Plus Infinity)",
      "summary": "Rounds float to integral value towards plus infinity (Ceil).",
      "syntax": "FRINTP <Hd|Sd|Dd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1001 | 001 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E24C000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:18 | 17:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Rounds the floating-point value in the source register to the nearest integer towards positive infinity (ceiling), and writes the result to the destination register. The instruction does not set any condition flags (N, Z, C, V remain unaffected). Execution is AArch64-only and may generate floating-point exceptions based on the source operand and enabled exception controls.",
      "example": "FRINTP Dd, Dn",
      "pseudocode": "Vd ← RoundTowardsPlusInfinity(Vn)"
    },
    {
      "mnemonic": "frintx",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Round to Integral (Exact)",
      "summary": "Rounds float to integral value using current mode, raising Inexact exception.",
      "syntax": "FRINTX <Hd|Sd|Dd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1001 | 110 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E274000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:18 | 17:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Rounds the floating-point value in the source register to the nearest integer using the current rounding mode and raises an Inexact floating-point exception if the result differs from the input. The instruction does not set condition flags (N, Z, C, V remain unaffected). Execution is AArch64-only and always signals the Inexact exception condition when rounding occurs.",
      "example": "FRINTX Dd, Dn",
      "pseudocode": "Vd ← RoundToIntegral(Vn); if Vd ≠ Vn then RaiseInexactException()"
    },
    {
      "mnemonic": "frintz",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Round to Integral (Zero)",
      "summary": "Rounds float to integral value towards zero (Truncate).",
      "syntax": "FRINTZ <Hd|Sd|Dd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1001 | 011 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E25C000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:18 | 17:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Rounds the floating-point value in the source register to the nearest integer towards zero (truncation), and writes the result to the destination register. The instruction does not set any condition flags (N, Z, C, V remain unaffected). Execution is AArch64-only and may generate floating-point exceptions based on the source operand and enabled exception controls.",
      "example": "FRINTZ Dd, Dn",
      "pseudocode": "Vd ← RoundTowardsZero(Vn)"
    },
    {
      "mnemonic": "fmov",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Move (Immediate)",
      "summary": "Moves a floating-point immediate into a scalar register.",
      "syntax": "FMOV <Hd|Sd|Dd>, #<fimm>",
      "encoding": {
        "format": "FP Immediate",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | imm8 | 100 | 00000 | Rd",
        "hex_opcode": "0x1E201000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "fimm",
          "desc": "Floating-point immediate value"
        }
      ],
      "extension": "Floating Point",
      "description": "Moves a floating-point immediate constant into a half-precision (H), single-precision (S), or double-precision (D) scalar FP register. The immediate is encoded as an 8-bit value and expanded to full precision according to the IEEE 754 floating-point format. NZCV flags are not affected. This is an AArch64-only instruction that executes at any privilege level.",
      "example": "FMOV Dd, #1.0",
      "pseudocode": "Vd ← decode_fp_immediate(imm8, type)"
    },
    {
      "mnemonic": "fmov",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Move (Register)",
      "summary": "Copies a value from one scalar FP register to another.",
      "syntax": "FMOV <Hd|Sd|Dd>, <Hn|Sn|Dn>",
      "encoding": {
        "format": "FP Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 10000 | 00 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E204000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Hd|Sd|Dd",
          "desc": "Destination SIMD&FP register (half, single or double-precision)"
        },
        {
          "name": "Hn|Sn|Dn",
          "desc": "First source SIMD&FP register (half, single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Copies a floating-point value from one scalar FP register to another, preserving the value and precision. Both source and destination must be the same type (half-precision, single-precision, or double-precision). NZCV flags are not affected. This is an AArch64-only instruction that executes at any privilege level.",
      "example": "FMOV Dd, Dn",
      "pseudocode": "Vd ← Vn"
    },
    {
      "mnemonic": "fmov",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Move (General)",
      "summary": "Copies bits between a General-Purpose Register (W/X) and FP Register (S/D).",
      "syntax": "FMOV <Wd|Xd>, <Sn|Dn>",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | 00 | 110 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E260000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd|Xd",
          "desc": "Destination general-purpose register (32-bit/64-bit)"
        },
        {
          "name": "Sn|Dn",
          "desc": "First source SIMD&FP register (single or double-precision)"
        }
      ],
      "extension": "Floating Point",
      "description": "Copies the bit pattern from a floating-point register (single-precision or double-precision) to a general-purpose register (32-bit or 64-bit), treating the value as an opaque bit sequence without any floating-point interpretation. NZCV flags are not affected. This is an AArch64-only instruction that executes at any privilege level.",
      "example": "FMOV Wd, Sn",
      "pseudocode": "Rd ← bits(Vn)"
    },
    {
      "mnemonic": "fmov",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Move (General to FP)",
      "summary": "Copies bits from a General-Purpose Register (W/X) to FP Register (S/D).",
      "syntax": "FMOV <Sd|Dd>, <Wn|Xn>",
      "encoding": {
        "format": "FP Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | 00 | 111 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E270000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Sd|Dd",
          "desc": "Destination SIMD&FP register (single or double-precision)"
        },
        {
          "name": "Wn|Xn",
          "desc": "First source general-purpose register (32-bit/64-bit)"
        }
      ],
      "extension": "Floating Point",
      "description": "Copies the bit pattern from a general-purpose register (32-bit or 64-bit) to a floating-point register (single-precision or double-precision), treating the value as an opaque bit sequence without any floating-point interpretation. NZCV flags are not affected. This is an AArch64-only instruction that executes at any privilege level.",
      "example": "FMOV Sd, Wn",
      "pseudocode": "Vd ← bits(Rn)"
    },
    {
      "mnemonic": "ldr",
      "architecture": "ARMv8-A",
      "full_name": "Load SIMD&FP Register (Immediate)",
      "summary": "Loads a floating-point/SIMD register from memory.",
      "syntax": "LDR <Bt|Ht|St|Dt|Qt>, [<Xn|SP>, #<pimm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "10 | 111 | 1 | 01 | 01 | imm12 | Rn | Rt",
        "hex_opcode": "0xBD400000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Bt|Ht|St|Dt|Qt",
          "desc": "Transfer SIMD&FP register (byte, half, single, double or quad-precision)"
        },
        {
          "name": "Xn|SP",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "pimm",
          "desc": "Positive immediate offset"
        }
      ],
      "extension": "Floating Point",
      "description": "The Load SIMD&FP Register instruction loads a floating-point/SIMD register from memory.",
      "example": "LDR Qt, [x1, #16]",
      "pseudocode": "Vt ← Memory[address]"
    },
    {
      "mnemonic": "str",
      "architecture": "ARMv8-A",
      "full_name": "Store SIMD&FP Register (Immediate)",
      "summary": "Stores a floating-point/SIMD register to memory.",
      "syntax": "STR <Bt|Ht|St|Dt|Qt>, [<Xn|SP>, #<pimm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "10 | 111 | 1 | 01 | 00 | imm12 | Rn | Rt",
        "hex_opcode": "0xBD000000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Bt|Ht|St|Dt|Qt",
          "desc": "Transfer SIMD&FP register (byte, half, single, double or quad-precision)"
        },
        {
          "name": "Xn|SP",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "pimm",
          "desc": "Positive immediate offset"
        }
      ],
      "extension": "Floating Point",
      "description": "The Store SIMD&FP Register instruction stores a floating-point/SIMD register to memory.",
      "example": "STR Qt, [x1, #16]",
      "pseudocode": "Memory[address] ← Xn"
    },
    {
      "mnemonic": "ldp",
      "architecture": "ARMv8-A",
      "full_name": "Load Pair SIMD&FP Registers",
      "summary": "Loads two floating-point/SIMD registers.",
      "syntax": "LDP <St1|Dt1|Qt1>, <St2|Dt2|Qt2>, [<Xn|SP>, #<imm>]",
      "encoding": {
        "format": "Load/Store Pair",
        "binary_pattern": "00 | 101 | 1 | 010 | 1 | imm7 | Rt2 | Rn | Rt",
        "hex_opcode": "0x2D400000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm7",
            "clean": "imm7"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:23 | 22 | 21:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "St1|Dt1|Qt1",
          "desc": "First transfer SIMD&FP register (single, double or quad-precision)"
        },
        {
          "name": "St2|Dt2|Qt2",
          "desc": "Second transfer SIMD&FP register (single, double or quad-precision)"
        },
        {
          "name": "Xn|SP",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "Floating Point",
      "description": "Loads two consecutive floating-point or SIMD vector registers from memory at an address calculated from a base register and a scaled signed immediate offset. The two values are loaded atomically as a pair, and no condition flags are affected. Execution is AArch64-only; the immediate is scaled by the operand size (4 bytes for 32-bit, 8 bytes for 64-bit, 16 bytes for 128-bit).",
      "example": "LDP Qt1, Qt2, [x1, #16]",
      "pseudocode": "address ← (Xn | SP) + (imm7 << scale); Vt1 ← [address]; Vt2 ← [address + operand_size]"
    },
    {
      "mnemonic": "stp",
      "architecture": "ARMv8-A",
      "full_name": "Store Pair SIMD&FP Registers",
      "summary": "Stores two floating-point/SIMD registers.",
      "syntax": "STP <St1|Dt1|Qt1>, <St2|Dt2|Qt2>, [<Xn|SP>, #<imm>]",
      "encoding": {
        "format": "Load/Store Pair",
        "binary_pattern": "00 | 101 | 1 | 010 | 0 | imm7 | Rt2 | Rn | Rt",
        "hex_opcode": "0x2D000000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm7",
            "clean": "imm7"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:23 | 22 | 21:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "St1|Dt1|Qt1",
          "desc": "First transfer SIMD&FP register (single, double or quad-precision)"
        },
        {
          "name": "St2|Dt2|Qt2",
          "desc": "Second transfer SIMD&FP register (single, double or quad-precision)"
        },
        {
          "name": "Xn|SP",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "Floating Point",
      "description": "Stores two consecutive floating-point or SIMD vector registers to memory at an address calculated from a base register and a scaled signed immediate offset. The two values are stored atomically as a pair, and no condition flags are affected. Execution is AArch64-only; the immediate is scaled by the operand size (4 bytes for 32-bit, 8 bytes for 64-bit, 16 bytes for 128-bit).",
      "example": "STP Qt1, Qt2, [x1, #16]",
      "pseudocode": "address ← (Xn | SP) + (imm7 << scale); [address] ← Vt1; [address + operand_size] ← Vt2"
    },
    {
      "mnemonic": "ldrb",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Byte (Immediate)",
      "summary": "Loads a byte from memory (zero-extended) using immediate offset.",
      "syntax": "LDRB <Wt>, [<Xn|SP>, #<pimm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "00 | 111 | 0 | 01 | 01 | imm12 | Rn | Rt",
        "hex_opcode": "0x39400000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "pimm",
          "desc": "Positive immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Loads an unsigned byte from memory using immediate offset and zero-extends it to 32 bits, writing the result to a 32-bit register. No condition flags are affected. This is an AArch64 Base instruction that executes in all privilege levels.",
      "example": "LDRB w3, [x1, #16]",
      "pseudocode": "address ← Xn + (pimm << 0);\nWt ← ZeroExtend(Mem[address, 1], 32);"
    },
    {
      "mnemonic": "ldrb",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Byte (Register)",
      "summary": "Loads a byte from memory (zero-extended) using register offset.",
      "syntax": "LDRB <Wt>, [<Xn|SP>, <R><m> {, <extend> <amount>}]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "00 | 111 | 0 | 00 | 01 | 1 | Rm | option | S | 10 | Rn | Rt",
        "hex_opcode": "0x38600800",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Rm",
          "desc": "Offset Reg"
        }
      ],
      "extension": "Base",
      "description": "Loads an unsigned byte from memory using register offset with optional shift/extension and zero-extends it to 32 bits. No condition flags are affected. This is an AArch64 Base instruction that executes in all privilege levels.",
      "example": "LDRB w3, [x1, Rm ]",
      "pseudocode": "offset ← ExtendReg(Rm, extend_type, shift_amount);\naddress ← Xn + offset;\nWt ← ZeroExtend(Mem[address, 1], 32);"
    },
    {
      "mnemonic": "ldrh",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Halfword (Immediate)",
      "summary": "Loads a halfword from memory (zero-extended).",
      "syntax": "LDRH <Wt>, [<Xn|SP>, #<pimm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "01 | 111 | 0 | 01 | 01 | imm12 | Rn | Rt",
        "hex_opcode": "0x79400000",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "pimm",
          "desc": "Positive immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Loads an unsigned halfword from memory using immediate offset and zero-extends it to 32 bits. No condition flags are affected. This is an AArch64 Base instruction that executes in all privilege levels.",
      "example": "LDRH w3, [x1, #16]",
      "pseudocode": "address ← Xn + (pimm << 1);\nWt ← ZeroExtend(Mem[address, 2], 32);"
    },
    {
      "mnemonic": "ldrh",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Halfword (Register)",
      "summary": "Loads a halfword from memory (zero-extended) using register offset.",
      "syntax": "LDRH <Wt>, [<Xn|SP>, <R><m> {, <extend> <amount>}]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "01 | 111 | 0 | 00 | 01 | 1 | Rm | option | S | 10 | Rn | Rt",
        "hex_opcode": "0x78600800",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Rm",
          "desc": "Offset Reg"
        }
      ],
      "extension": "Base",
      "description": "Loads an unsigned halfword from memory using register offset with optional extension and zero-extends it to 32 bits. No condition flags are affected. This is an AArch64 Base instruction that executes in all privilege levels.",
      "example": "LDRH w3, [x1, Rm ]",
      "pseudocode": "offset ← ExtendReg(Rm, extend_type, shift_amount);\naddress ← Xn + offset;\nWt ← ZeroExtend(Mem[address, 2], 32);"
    },
    {
      "mnemonic": "ldrsb",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Signed Byte (Immediate)",
      "summary": "Loads a byte and sign-extends it to 32-bits.",
      "syntax": "LDRSB <Wt>, [<Xn|SP>, #<pimm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "00 | 111 | 0 | 01 | 11 | imm12 | Rn | Rt",
        "hex_opcode": "0x39C00000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "pimm",
          "desc": "Positive immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Loads a signed byte from memory using immediate offset and sign-extends it to 32 bits. No condition flags are affected. This is an AArch64 Base instruction that executes in all privilege levels.",
      "example": "LDRSB w3, [x1, #16]",
      "pseudocode": "address ← Xn + (pimm << 0);\nWt ← SignExtend(Mem[address, 1], 32);"
    },
    {
      "mnemonic": "ldrsb",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Signed Byte (64-bit Immediate)",
      "summary": "Loads a byte and sign-extends it to 64-bits.",
      "syntax": "LDRSB <Xt>, [<Xn|SP>, #<pimm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "00 | 111 | 0 | 01 | 10 | imm12 | Rn | Rt",
        "hex_opcode": "0x39800000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Transfer 64-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "pimm",
          "desc": "Positive immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Loads a signed byte from memory using immediate offset and sign-extends it to 64 bits. No condition flags are affected. This is an AArch64 Base instruction that executes in all privilege levels.",
      "example": "LDRSB x3, [x1, #16]",
      "pseudocode": "address ← Xn + (pimm << 0);\nXt ← SignExtend(Mem[address, 1], 64);"
    },
    {
      "mnemonic": "ldrsw",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Signed Word (Immediate)",
      "summary": "Loads a word and sign-extends it to 64-bits.",
      "syntax": "LDRSW <Xt>, [<Xn|SP>, #<pimm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "10 | 111 | 0 | 01 | 10 | imm12 | Rn | Rt",
        "hex_opcode": "0xB9800000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Transfer 64-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "pimm",
          "desc": "Positive immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Loads a signed word from memory using immediate offset and sign-extends it to 64 bits. No condition flags are affected. This is an AArch64 Base instruction that executes in all privilege levels.",
      "example": "LDRSW x3, [x1, #16]",
      "pseudocode": "address ← Xn + (pimm << 2);\nXt ← SignExtend(Mem[address, 4], 64);"
    },
    {
      "mnemonic": "ldrsw",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Signed Word (Literal)",
      "summary": "Loads a word from PC-relative address and sign-extends to 64-bits.",
      "syntax": "LDRSW <Xt>, <label>",
      "encoding": {
        "format": "Load Literal",
        "binary_pattern": "10 | 011 | 0 | 00 | imm19 | Rt",
        "hex_opcode": "0x98000000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "imm19",
            "clean": "imm19"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Transfer 64-bit integer register (load/store)"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Loads a signed word from memory at a PC-relative address (literal) and sign-extends it to 64 bits. No condition flags are affected. This is an AArch64 Base instruction that executes in all privilege levels.",
      "example": "LDRSW x3, label",
      "pseudocode": "address ← PC + SignExtend(imm19 << 2, 64);\nXt ← SignExtend(Mem[address, 4], 64);"
    },
    {
      "mnemonic": "ldtr",
      "architecture": "ARMv8-A",
      "full_name": "Load Register (Unprivileged)",
      "summary": "Loads a word as if in EL0 (User mode).",
      "syntax": "LDTR <Wt>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "10 | 111 | 0 | 00 | 01 | 0 | imm9 | 10 | Rn | Rt",
        "hex_opcode": "0xB8400800",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Loads a 32-bit word from memory using an address calculated from a base register and a signed immediate offset, with the access performed as if executing at EL0 (User mode) privilege level. This instruction is typically used for debugging or privilege crossing and does not affect condition flags (N, Z, C, V remain unaffected). Execution is AArch64-only and restricted to privileged exception levels (EL1 or higher); using it at EL0 results in an illegal instruction exception.",
      "example": "LDTR w3, [x1, #-8]",
      "pseudocode": "address ← (Xn | SP) + SignExtend(imm9, 64); Wt ← ZeroExtend([address]<31:0>, 64)"
    },
    {
      "mnemonic": "ldur",
      "architecture": "ARMv8-A",
      "full_name": "Load Register (Unscaled)",
      "summary": "Loads a word using an unscaled immediate offset.",
      "syntax": "LDUR <Wt>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "10 | 111 | 0 | 00 | 01 | 0 | imm9 | 00 | Rn | Rt",
        "hex_opcode": "0xB8400000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Loads a 32-bit word from memory using an address calculated from a base register and an unscaled signed immediate offset. No condition flags are affected (N, Z, C, V remain unaffected). Execution is AArch64-only; the offset is applied directly without scaling and allows for more flexible address formation than scaled-offset variants.",
      "example": "LDUR w3, [x1, #-8]",
      "pseudocode": "address ← (Xn | SP) + SignExtend(imm9, 64); Wt ← ZeroExtend([address]<31:0>, 64)"
    },
    {
      "mnemonic": "ldxr",
      "architecture": "ARMv8-A",
      "full_name": "Load Exclusive Register",
      "summary": "Loads a word and marks physical address as exclusive access.",
      "syntax": "LDXR <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "10 | 0010000 | 1 | 0 | 11111 | 0 | 11111 | Rn | Rt",
        "hex_opcode": "0x885F7C00",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Loads a 32-bit word from memory at the address in Xn|SP and marks the physical address as exclusive for subsequent store-exclusive operations. No condition flags are affected. This is an AArch64-only instruction that requires Execute permission on the accessed memory and generates an alignment fault if the address is not word-aligned.",
      "example": "LDXR w3, [x1]",
      "pseudocode": "address ← [Xn|SP]\nWt ← [address]\nExclusiveMonitors.MarkExclusive(address, ProcessorID, 4)"
    },
    {
      "mnemonic": "ldxp",
      "architecture": "ARMv8-A",
      "full_name": "Load Exclusive Pair",
      "summary": "Loads two words as an exclusive operation.",
      "syntax": "LDXP <Wt1>, <Wt2>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "1 | 0 | 0010000 | 1 | 1 | 11111 | 0 | Rt2 | Rn | Rt",
        "hex_opcode": "0x887F0000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt1",
          "desc": "Target 1"
        },
        {
          "name": "Wt2",
          "desc": "Target 2"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Loads two consecutive 32-bit words from memory at the address in Xn|SP and marks the physical address pair as exclusive for subsequent store-exclusive operations. No condition flags are affected. This is an AArch64-only instruction that requires Execute permission and generates an alignment fault if the address is not 8-byte aligned.",
      "example": "LDXP w3, w4, [x1]",
      "pseudocode": "address ← [Xn|SP]\nWt1 ← [address]\nWt2 ← [address + 4]\nExclusiveMonitors.MarkExclusive(address, ProcessorID, 8)"
    },
    {
      "mnemonic": "lsl",
      "architecture": "ARMv8-A",
      "full_name": "Logical Shift Left (Register)",
      "summary": "Shifts register left by variable amount.",
      "syntax": "LSLV <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11010110 | Rm | 0010 | 00 | Rn | Rd",
        "hex_opcode": "0x1AC02000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Shift Reg"
        }
      ],
      "extension": "Base",
      "description": "Logical Shift Left by variable register count. Shifts the value in Wn left by the number of bits specified in the lower 5 bits of Wm, shifting in zeros from the right. Does not affect the condition flags (N, Z, C, V remain unchanged). AArch64-only instruction.",
      "example": "LSLV w0, w1, w2",
      "pseudocode": "shift_amount ← Wm[4:0]\nWd ← Wn << shift_amount"
    },
    {
      "mnemonic": "lsr",
      "architecture": "ARMv8-A",
      "full_name": "Logical Shift Right (Register)",
      "summary": "Shifts register right by variable amount.",
      "syntax": "LSRV <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11010110 | Rm | 0010 | 01 | Rn | Rd",
        "hex_opcode": "0x1AC02400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Shift Reg"
        }
      ],
      "extension": "Base",
      "description": "Logical Shift Right by variable register count. Shifts the value in Wn right by the number of bits specified in the lower 5 bits of Wm, shifting in zeros from the left. Does not affect the condition flags (N, Z, C, V remain unchanged). AArch64-only instruction.",
      "example": "LSRV w0, w1, w2",
      "pseudocode": "shift_amount ← Wm[4:0]\nWd ← Wn >> shift_amount"
    },
    {
      "mnemonic": "madd",
      "architecture": "ARMv8-A",
      "full_name": "Multiply-Add",
      "summary": "Calculates (Ra + (Rn * Rm)).",
      "syntax": "MADD <Wd>, <Wn>, <Wm>, <Wa>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 00 | 11011 | 000 | Rm | 0 | Ra | Rn | Rd",
        "hex_opcode": "0x1B000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11011",
            "clean": "11011"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        },
        {
          "name": "Wa",
          "desc": "Addend"
        }
      ],
      "extension": "Base",
      "description": "Multiplies Wn by Wm and adds the result to Wa, storing the result in Wd. All intermediate values are computed with full 64-bit precision before truncating to 32 bits. No condition flags are affected. This is an AArch64-only instruction that does not generate any exceptions.",
      "example": "MADD w0, w1, w2, w5",
      "pseudocode": "temp ← (Wn × Wm) + Wa\nWd ← temp[31:0]"
    },
    {
      "mnemonic": "madd",
      "architecture": "ARMv8-A",
      "full_name": "Multiply-Add (64-bit)",
      "summary": "Calculates (Xa + (Xn * Xm)).",
      "syntax": "MADD <Xd>, <Xn>, <Xm>, <Xa>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 00 | 11011 | 000 | Rm | 0 | Ra | Rn | Rd",
        "hex_opcode": "0x9B000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11011",
            "clean": "11011"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Second source / offset 64-bit integer register"
        },
        {
          "name": "Xa",
          "desc": "Addend"
        }
      ],
      "extension": "Base",
      "description": "Multiply-Add: multiplies Xn by Xm and adds the result to Xa, storing the 64-bit result in Xd. Does not affect condition flags. AArch64-only instruction with no privilege restrictions.",
      "example": "MADD x0, x1, x2, x5",
      "pseudocode": "Xd ← Xa + (Xn × Xm)"
    },
    {
      "mnemonic": "msub",
      "architecture": "ARMv8-A",
      "full_name": "Multiply-Subtract",
      "summary": "Calculates (Ra - (Rn * Rm)).",
      "syntax": "MSUB <Wd>, <Wn>, <Wm>, <Wa>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 00 | 11011 | 000 | Rm | 1 | Ra | Rn | Rd",
        "hex_opcode": "0x1B008000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11011",
            "clean": "11011"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        },
        {
          "name": "Wa",
          "desc": "Minuend"
        }
      ],
      "extension": "Base",
      "description": "Multiplies Wn by Wm and subtracts the result from Wa, storing the result in Wd. All intermediate values are computed with full 64-bit precision before truncating to 32 bits. No condition flags are affected. This is an AArch64-only instruction that does not generate any exceptions.",
      "example": "MSUB w0, w1, w2, w5",
      "pseudocode": "temp ← Wa - (Wn × Wm)\nWd ← temp[31:0]"
    },
    {
      "mnemonic": "movk",
      "architecture": "ARMv8-A",
      "full_name": "Move Keep",
      "summary": "Inserts a 16-bit immediate into a register, keeping other bits unchanged.",
      "syntax": "MOVK <Wd>, #<imm16> {, lsl #<shift>}",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 11 | 100101 | hw | imm16 | Rd",
        "hex_opcode": "0x72800000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "100101",
            "clean": "100101"
          },
          {
            "raw": "hw",
            "clean": "hw"
          },
          {
            "raw": "imm16",
            "clean": "imm16"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22:21 | 20:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "imm16",
          "desc": "Imm"
        },
        {
          "name": "shift",
          "desc": "Shift (0,16)"
        }
      ],
      "extension": "Base",
      "description": "Inserts a 16-bit immediate value into Wd at the position specified by the shift, leaving other 16-bit half-words unchanged. No condition flags are affected. This is an AArch64-only instruction commonly used to build large constants or patch specific 16-bit fields in registers.",
      "example": "MOVK w0, #16",
      "pseudocode": "shift_amount ← hw × 16\nmask ← 0xFFFF ≪ shift_amount\nWd ← (Wd ∧ ¬mask) ∨ (imm16 ≪ shift_amount)"
    },
    {
      "mnemonic": "movn",
      "architecture": "ARMv8-A",
      "full_name": "Move Not",
      "summary": "Moves inverted 16-bit immediate to register.",
      "syntax": "MOVN <Wd>, #<imm16> {, lsl #<shift>}",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 00 | 100101 | hw | imm16 | Rd",
        "hex_opcode": "0x12800000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "100101",
            "clean": "100101"
          },
          {
            "raw": "hw",
            "clean": "hw"
          },
          {
            "raw": "imm16",
            "clean": "imm16"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22:21 | 20:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "imm16",
          "desc": "Imm"
        },
        {
          "name": "shift",
          "desc": "Shift amount"
        }
      ],
      "extension": "Base",
      "description": "Moves the bitwise NOT of a 16-bit immediate into Wd (at the position specified by shift), zeroing other 16-bit half-words. No condition flags are affected. This is an AArch64-only instruction useful for loading negative or inverted constants into registers.",
      "example": "MOVN w0, #16",
      "pseudocode": "shift_amount ← hw × 16\nmask ← 0xFFFF ≪ shift_amount\nWd ← (Wd ∧ ¬mask) ∨ ((¬imm16) ≪ shift_amount)"
    },
    {
      "mnemonic": "movz",
      "architecture": "ARMv8-A",
      "full_name": "Move Zero",
      "summary": "Moves 16-bit immediate to register, zeroing other bits.",
      "syntax": "MOVZ <Wd>, #<imm16> {, lsl #<shift>}",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 10 | 100101 | hw | imm16 | Rd",
        "hex_opcode": "0x52800000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "100101",
            "clean": "100101"
          },
          {
            "raw": "hw",
            "clean": "hw"
          },
          {
            "raw": "imm16",
            "clean": "imm16"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22:21 | 20:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "imm16",
          "desc": "Imm"
        },
        {
          "name": "shift",
          "desc": "Shift amount"
        }
      ],
      "extension": "Base",
      "description": "Moves a 16-bit immediate into Wd at the position specified by shift, zeroing all other 16-bit half-words. No condition flags are affected. This is an AArch64-only instruction commonly used as the first instruction when building large constants, often followed by MOVK instructions.",
      "example": "MOVZ w0, #16",
      "pseudocode": "shift_amount ← hw × 16\nWd ← imm16 ≪ shift_amount"
    },
    {
      "mnemonic": "mrs",
      "architecture": "ARMv8-A",
      "full_name": "Move System Register",
      "summary": "Moves system register to general-purpose register.",
      "syntax": "MRS <Xt>, <system_reg>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 1 | 1 | o0 | op1 | CRn | CRm | op2 | Rt",
        "hex_opcode": "0xD5300000",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "o0",
            "clean": "o0"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20 | 19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Transfer 64-bit integer register (load/store)"
        },
        {
          "name": "system_reg",
          "desc": "Sys Reg"
        }
      ],
      "extension": "System",
      "description": "Reads the value of a system register and copies it to the 64-bit general-purpose register Xt. No condition flags are affected. This is an AArch64-only instruction that requires appropriate privilege level (EL0 or higher depending on register access permissions) and generates an exception if the register is not accessible at the current privilege level.",
      "example": "MRS x3, system_reg",
      "pseudocode": "Xt ← SystemRegister[imm15]"
    },
    {
      "mnemonic": "msr",
      "architecture": "ARMv8-A",
      "full_name": "Move to System Register",
      "summary": "Moves general-purpose register to system register.",
      "syntax": "MSR <system_reg>, <Xt>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 0 | 1 | o0 | op1 | CRn | CRm | op2 | Rt",
        "hex_opcode": "0xD5100000",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "o0",
            "clean": "o0"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20 | 19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "system_reg",
          "desc": "Sys Reg"
        },
        {
          "name": "Xt",
          "desc": "Transfer 64-bit integer register (load/store)"
        }
      ],
      "extension": "System",
      "description": "Moves the value from a 64-bit general-purpose register to a system register, enabling modification of processor state, exception handling, and memory management controls. The instruction is AArch64-only and typically requires sufficient privilege level to access the target system register; attempting to write a register without privilege raises an exception. Condition flags are not affected by this instruction.",
      "example": "MSR system_reg, x3",
      "pseudocode": "SystemRegister[system_reg] ← Xt"
    },
    {
      "mnemonic": "orn",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise OR NOT",
      "summary": "ORs register with NOT of shifted register.",
      "syntax": "ORN <Wd>, <Wn>, <Wm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "0 | 01 | 01010 | shift | 1 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x2A200000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Performs a bitwise OR between a register and the bitwise NOT of a second (optionally shifted) register, storing the result in the destination. All condition flags (N, Z, C, V) are updated based on the result; N and Z are set according to the result value, while C and V are cleared to zero. This is a 32-bit operation in the W-register form; a 64-bit X-register form also exists with identical semantics.",
      "example": "ORN w0, w1, w2",
      "pseudocode": "result ← Wn | ~(Wm << shift_amount)\nWd ← result\nN ← result[31]\nZ ← (result == 0)\nC ← 0\nV ← 0"
    },
    {
      "mnemonic": "orr",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise OR (Immediate)",
      "summary": "ORs register with logical immediate.",
      "syntax": "ORR <Wd|Wsp>, <Wn>, #<imm>",
      "encoding": {
        "format": "Logical (Immediate)",
        "binary_pattern": "0 | 01 | 100100 | 0 | immr | imms | Rn | Rd",
        "hex_opcode": "0x32000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "100100",
            "clean": "100100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "immr",
            "clean": "immr"
          },
          {
            "raw": "imms",
            "clean": "imms"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Imm"
        }
      ],
      "extension": "Base",
      "description": "Bitwise OR with logical immediate. Performs bitwise OR between Wn and a 32-bit bitmask immediate, storing the result in Wd. The immediate is expanded using the logical immediate encoding (N:immr:imms). Sets the Z flag if the result is zero; N, C, V flags are unaffected. AArch64-only instruction.",
      "example": "ORR Wd, w1, #16",
      "pseudocode": "imm32 ← LogicalImmediate(N, immr, imms, 32)\nWd ← Wn | imm32\nZ ← (Wd == 0)"
    },
    {
      "mnemonic": "orr",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise OR (Shifted Register)",
      "summary": "ORs two registers.",
      "syntax": "ORR <Wd>, <Wn>, <Wm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "0 | 01 | 01010 | shift | 0 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x2A000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Bitwise OR with shifted register. Performs bitwise OR between Wn and a shifted version of Wm (shifted by amount in imm6), storing the result in Wd. Does not affect condition flags (N, Z, C, V remain unchanged). AArch64-only instruction.",
      "example": "ORR w0, w1, w2",
      "pseudocode": "shift_amount ← imm6\nshift_type ← LSL\noperand ← Wm << shift_amount\nWd ← Wn | operand"
    },
    {
      "mnemonic": "rbit",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bits",
      "summary": "Reverses the bit order in a register.",
      "syntax": "RBIT <Wd>, <Wn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 0 | 11010110 | 00000 | 000000 | Rn | Rd",
        "hex_opcode": "0x5AC00000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Reverses the order of all bits in a 32-bit register, placing the least-significant bit in the most-significant position and vice versa. Condition flags are not affected by this instruction. This is a pure bit-reversal operation with no side effects.",
      "example": "RBIT w0, w1",
      "pseudocode": "result ← BitReverse(Wn)\nWd ← result"
    },
    {
      "mnemonic": "ret",
      "architecture": "ARMv8-A",
      "full_name": "Return from Subroutine",
      "summary": "Branches to address in LR (or specified register).",
      "syntax": "RET {<Xn>}",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "1101011 | 0 | 0 | 10 | 11111 | 0000 | 0 | 0 | Rn | 00000",
        "hex_opcode": "0xD65F0000",
        "visual_parts": [
          {
            "raw": "1101011",
            "clean": "1101011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "00000",
            "clean": "00000"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xn",
          "desc": "Addr (Def: X30)"
        }
      ],
      "extension": "Base",
      "description": "Performs an indirect branch to the address held in a register, with a default of the link register (X30/LR) if no register is specified, typically used to return from a subroutine. The instruction is AArch64-only and sets the program counter to the target address; no condition flags are affected. This instruction may generate an exception if branch target prediction is enabled and the target address prediction fails (Branch Target Prediction/BTI).",
      "example": "RET",
      "pseudocode": "if Xn is not specified then\n  target ← X30\nelse\n  target ← Xn\nPC ← target"
    },
    {
      "mnemonic": "rev",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bytes (64-bit)",
      "summary": "Reverses byte order in a 64-bit register.",
      "syntax": "REV <Xd>, <Xn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00000 | 0000 | 11 | Rn | Rd",
        "hex_opcode": "0xDAC00C00",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Reverse byte order in a 64-bit register. Reverses the byte order of the 64-bit value in Xn and stores the result in Xd. Does not affect condition flags. AArch64-only instruction.",
      "example": "REV x0, x1",
      "pseudocode": "Xd[63:56] ← Xn[7:0]\nXd[55:48] ← Xn[15:8]\nXd[47:40] ← Xn[23:16]\nXd[39:32] ← Xn[31:24]\nXd[31:24] ← Xn[39:32]\nXd[23:16] ← Xn[47:40]\nXd[15:8] ← Xn[55:48]\nXd[7:0] ← Xn[63:56]"
    },
    {
      "mnemonic": "rev16",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bytes in Halfwords",
      "summary": "Reverses bytes in each 16-bit halfword.",
      "syntax": "REV16 <Wd>, <Wn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 0 | 11010110 | 00000 | 0000 | 01 | Rn | Rd",
        "hex_opcode": "0x5AC00400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Reverses the byte order within each 16-bit halfword of a 32-bit register independently, leaving halfword boundaries intact. Condition flags are not affected by this instruction. This is useful for converting individual 16-bit values between endianness without affecting the halfword order.",
      "example": "REV16 w0, w1",
      "pseudocode": "result[7:0] ← Wn[15:8]\nresult[15:8] ← Wn[7:0]\nresult[23:16] ← Wn[31:24]\nresult[31:24] ← Wn[23:16]\nWd ← result"
    },
    {
      "mnemonic": "rev32",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bytes in Words",
      "summary": "Reverses bytes in each 32-bit word (64-bit op).",
      "syntax": "REV32 <Xd>, <Xn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00000 | 0000 | 10 | Rn | Rd",
        "hex_opcode": "0xDAC00800",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Reverses the byte order within each 32-bit word of a 64-bit register independently, leaving word boundaries intact. Condition flags are not affected by this instruction. This operation is performed on 64-bit registers (X-registers) and processes two 32-bit words in parallel.",
      "example": "REV32 x0, x1",
      "pseudocode": "result[7:0] ← Xn[39:32]\nresult[15:8] ← Xn[31:24]\nresult[23:16] ← Xn[23:16]\nresult[31:24] ← Xn[15:8]\nresult[39:32] ← Xn[7:0]\nresult[47:40] ← Xn[63:56]\nresult[55:48] ← Xn[55:48]\nresult[63:56] ← Xn[47:40]\nXd ← result"
    },
    {
      "mnemonic": "rorv",
      "architecture": "ARMv8-A",
      "full_name": "Rotate Right (Register)",
      "summary": "Rotates register right by variable amount.",
      "syntax": "RORV <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11010110 | Rm | 0010 | 11 | Rn | Rd",
        "hex_opcode": "0x1AC02C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Shift Reg"
        }
      ],
      "extension": "Base",
      "description": "Rotate Right by variable register count. Rotates the value in Wn right by the number of bits specified in the lower 5 bits of Wm; bits rotated off the right are inserted at the left. Does not affect condition flags (N, Z, C, V remain unchanged). AArch64-only instruction.",
      "example": "RORV w0, w1, w2",
      "pseudocode": "shift_amount ← Wm[4:0]\nWd ← (Wn >> shift_amount) | (Wn << (32 - shift_amount))"
    },
    {
      "mnemonic": "sbc",
      "architecture": "ARMv8-A",
      "full_name": "Subtract with Carry",
      "summary": "Subtracts with borrow (Carry - 1).",
      "syntax": "SBC <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 0 | 11010000 | Rm | 000000 | Rn | Rd",
        "hex_opcode": "0x5A000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010000",
            "clean": "11010000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Subtracts one register from another with a borrow (carry-in), computing Wd = Wn - (Wm + NOT(C)), where the carry flag is inverted before use as a borrow. All condition flags (N, Z, C, V) are updated: N and Z reflect the result, C is set if no borrow occurred (result ≥ 0 in unsigned arithmetic), and V is set if signed overflow occurred. This is a 32-bit operation; a 64-bit variant (SBC for X-registers) exists with identical semantics.",
      "example": "SBC w0, w1, w2",
      "pseudocode": "borrow ← NOT(C)\nresult ← Wn - (Wm + borrow)\nWd ← result\nN ← result[31]\nZ ← (result == 0)\nC ← NOT(BorrowFrom(Wn - (Wm + borrow)))\nV ← OverflowFrom(Wn - (Wm + borrow))"
    },
    {
      "mnemonic": "sbcs",
      "architecture": "ARMv8-A",
      "full_name": "Subtract with Carry and Set Flags",
      "summary": "Subtracts with borrow and updates flags.",
      "syntax": "SBCS <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 1 | 11010000 | Rm | 000000 | Rn | Rd",
        "hex_opcode": "0x7A000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11010000",
            "clean": "11010000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Subtracts the value in Wm and the inverted Carry flag from Wn, storing the result in Wd and updating the condition flags. The Carry flag is inverted before subtraction, so if C=0 (no carry), a borrow of 1 is subtracted. All four flags (N, Z, C, V) are updated based on the result. This instruction is available in AArch64 and A32/T32 variants.",
      "example": "SBCS w0, w1, w2",
      "pseudocode": "result ← Wn - Wm - (1 - C)\nWd ← result[31:0]\nN ← result[31]\nZ ← (result == 0)\nC ← NOT(BorrowFrom(Wn - Wm - (1 - C)))\nV ← OverflowFrom(Wn - Wm - (1 - C))"
    },
    {
      "mnemonic": "sbfm",
      "architecture": "ARMv8-A",
      "full_name": "Signed Bitfield Move",
      "summary": "Extracts/Inserts bitfield with sign extension.",
      "syntax": "SBFM <Wd>, <Wn>, #<immr>, #<imms>",
      "encoding": {
        "format": "Bitfield",
        "binary_pattern": "0 | 00 | 100110 | 0 | immr | imms | Rn | Rd",
        "hex_opcode": "0x13000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "100110",
            "clean": "100110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "immr",
            "clean": "immr"
          },
          {
            "raw": "imms",
            "clean": "imms"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "immr",
          "desc": "Rotate"
        },
        {
          "name": "imms",
          "desc": "Size"
        }
      ],
      "extension": "Base",
      "description": "Extracts a bitfield from Wn with sign extension and places it in Wd. The bitfield is defined by immr (rotate right amount) and imms (field size), with the field width determined by the difference between imms and immr (plus 1). The extracted value is sign-extended to fill the 32-bit destination. No condition flags are affected. This is an AArch64 instruction.",
      "example": "SBFM w0, w1, #immr, #imms",
      "pseudocode": "width ← imms - immr + 1\nif imms >= immr then\n  extracted ← ROR(Wn, immr)[width-1:0]\n  Wd ← SignExtend(extracted, width)\nelse\n  extracted ← ROR(Wn, immr)[width-1:0]\n  Wd ← SignExtend(extracted, width)\nN ← unchanged\nZ ← unchanged\nC ← unchanged\nV ← unchanged"
    },
    {
      "mnemonic": "sdiv",
      "architecture": "ARMv8-A",
      "full_name": "Signed Divide",
      "summary": "Divides two signed registers.",
      "syntax": "SDIV <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11010110 | Rm | 00001 | 1 | Rn | Rd",
        "hex_opcode": "0x1AC00C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "Dividend"
        },
        {
          "name": "Wm",
          "desc": "Divisor"
        }
      ],
      "extension": "Base",
      "description": "Divides the signed 32-bit integer in Wn by the signed 32-bit integer in Wm and places the quotient in Wd. If Wm is zero, the result is zero (no exception is raised). No condition flags are affected. This instruction is available in AArch64, ARMv7 with IDIV extension, and Thumb with IDIV extension.",
      "example": "SDIV w0, w1, w2",
      "pseudocode": "if Wm == 0 then\n  Wd ← 0\nelse\n  Wd ← SignedDiv(Wn, Wm)\nN ← unchanged\nZ ← unchanged\nC ← unchanged\nV ← unchanged"
    },
    {
      "mnemonic": "smaddl",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply-Add Long",
      "summary": "Multiplies two 32-bit registers, adds to 64-bit register (64-bit result).",
      "syntax": "SMADDL <Xd>, <Wn>, <Wm>, <Xa>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 00 | 11011 | 0 | 01 | Rm | 0 | Ra | Rn | Rd",
        "hex_opcode": "0x9B200000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11011",
            "clean": "11011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23 | 22:21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        },
        {
          "name": "Xa",
          "desc": "Addend"
        }
      ],
      "extension": "Base",
      "description": "Multiplies the signed 32-bit values in Wn and Wm to produce a 64-bit result, then adds the 64-bit value in Xa and places the 64-bit sum in Xd. This is used for wider multiply-accumulate operations. No condition flags are affected. This instruction is AArch64-only.",
      "example": "SMADDL x0, w1, w2, x5",
      "pseudocode": "product ← SignExtend(Wn, 64) * SignExtend(Wm, 64)\nXd ← product + Xa\nN ← unchanged\nZ ← unchanged\nC ← unchanged\nV ← unchanged"
    },
    {
      "mnemonic": "smsubl",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply-Subtract Long",
      "summary": "Calculates (Xa - (Wn * Wm)) (64-bit result).",
      "syntax": "SMSUBL <Xd>, <Wn>, <Wm>, <Xa>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 00 | 11011 | 0 | 01 | Rm | 1 | Ra | Rn | Rd",
        "hex_opcode": "0x9B208000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11011",
            "clean": "11011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23 | 22:21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        },
        {
          "name": "Xa",
          "desc": "Minuend"
        }
      ],
      "extension": "Base",
      "description": "Multiplies the signed 32-bit values in Wn and Wm to produce a 64-bit result, then subtracts this product from the 64-bit value in Xa and places the 64-bit difference in Xd. This is used for wider multiply-subtract operations. No condition flags are affected. This instruction is AArch64-only.",
      "example": "SMSUBL x0, w1, w2, x5",
      "pseudocode": "product ← SignExtend(Wn, 64) * SignExtend(Wm, 64)\nXd ← Xa - product\nN ← unchanged\nZ ← unchanged\nC ← unchanged\nV ← unchanged"
    },
    {
      "mnemonic": "smulh",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply High",
      "summary": "Multiplies two 64-bit registers, keeps high 64 bits.",
      "syntax": "SMULH <Xd>, <Xn>, <Xm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 00 | 11011 | 0 | 10 | Rm | 0 | 11111 | Rn | Rd",
        "hex_opcode": "0x9B407C00",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11011",
            "clean": "11011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23 | 22:21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Second source / offset 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Multiplies two signed 64-bit integers in Xn and Xm and places the high 64 bits of the 128-bit result in Xd. This instruction is used when the full precision of a 64×64 signed multiplication is needed. No condition flags are affected. This instruction is AArch64-only.",
      "example": "SMULH x0, x1, x2",
      "pseudocode": "result ← Xn * Xm\nXd ← result[127:64]\nN ← unchanged\nZ ← unchanged\nC ← unchanged\nV ← unchanged"
    },
    {
      "mnemonic": "stlr",
      "architecture": "ARMv8-A",
      "full_name": "Store-Release Register",
      "summary": "Stores a word with Release semantics.",
      "syntax": "STLR <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "10 | 0010001 | 0 | 0 | 11111 | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x889FFC00",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0010001",
            "clean": "0010001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Stores the 32-bit value in Wt to memory at the address specified by Xn (or SP), with Release semantics for synchronization. The Release semantics ensure that all memory operations before this instruction are visible to observers before the store completes. No condition flags are affected. This instruction is AArch64-only and requires the Load-Acquire/Store-Release extension.",
      "example": "STLR w3, [x1]",
      "pseudocode": "address ← Xn\nMemoryOrder(Release)\n[address] ← Wt[31:0]"
    },
    {
      "mnemonic": "stlrb",
      "architecture": "ARMv8-A",
      "full_name": "Store-Release Register Byte",
      "summary": "Stores a byte with Release semantics.",
      "syntax": "STLRB <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "00 | 0010001 | 0 | 0 | 11111 | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x089FFC00",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0010001",
            "clean": "0010001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Stores the least significant byte of Wt to memory at the address specified by Xn (or SP), with Release semantics for synchronization. The Release semantics ensure that all memory operations before this instruction are visible to observers before the byte store completes. No condition flags are affected. This instruction is AArch64-only and requires the Load-Acquire/Store-Release extension.",
      "example": "STLRB w3, [x1]",
      "pseudocode": "address ← Xn\nMemoryOrder(Release)\n[address] ← Wt[7:0]"
    },
    {
      "mnemonic": "stlrh",
      "architecture": "ARMv8-A",
      "full_name": "Store-Release Register Halfword",
      "summary": "Stores a halfword with Release semantics.",
      "syntax": "STLRH <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "01 | 0010001 | 0 | 0 | 11111 | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x489FFC00",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0010001",
            "clean": "0010001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Stores a halfword from Wt to memory at the address in Xn with Release semantics, ensuring all prior memory operations are observed before the store completes. This is an AArch64-only instruction used for synchronization in multi-threaded code. No condition flags are affected.",
      "example": "STLRH w3, [x1]",
      "pseudocode": "[Xn] ← Wt<15:0>; Release semantics applied"
    },
    {
      "mnemonic": "stlxr",
      "architecture": "ARMv8-A",
      "full_name": "Store-Release Exclusive Register",
      "summary": "Stores a word with Release Exclusive semantics.",
      "syntax": "STLXR <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "10 | 0010000 | 0 | 0 | Rs | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x8800FC00",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Status"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Attempts an exclusive store of a 32-bit word from Wt to memory at the address in Xn with Release semantics, writing 0 to Ws if successful or 1 if the exclusive monitor was not held. This is an AArch64-only instruction used for atomic operations. No condition flags are affected.",
      "example": "STLXR w6, w3, [x1]",
      "pseudocode": "if ExclusiveMonitorHeld(Xn) then { [Xn] ← Wt; Ws ← 0; Release semantics applied } else { Ws ← 1 }"
    },
    {
      "mnemonic": "stlxrb",
      "architecture": "ARMv8-A",
      "full_name": "Store-Release Exclusive Register Byte",
      "summary": "Stores a byte with Release Exclusive semantics.",
      "syntax": "STLXRB <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "00 | 0010000 | 0 | 0 | Rs | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x0800FC00",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Status"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Attempts an exclusive store of a byte from Wt to memory at the address in Xn with Release semantics, writing 0 to Ws if successful or 1 if the exclusive monitor was not held. This is an AArch64-only instruction used for atomic byte operations. No condition flags are affected.",
      "example": "STLXRB w6, w3, [x1]",
      "pseudocode": "if ExclusiveMonitorHeld(Xn) then { [Xn] ← Wt<7:0>; Ws ← 0; Release semantics applied } else { Ws ← 1 }"
    },
    {
      "mnemonic": "stlxrh",
      "architecture": "ARMv8-A",
      "full_name": "Store-Release Exclusive Register Halfword",
      "summary": "Stores a halfword with Release Exclusive semantics.",
      "syntax": "STLXRH <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "01 | 0010000 | 0 | 0 | Rs | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x4800FC00",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Status"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Attempts an exclusive store of a halfword from Wt to memory at the address in Xn with Release semantics, writing 0 to Ws if successful or 1 if the exclusive monitor was not held. This is an AArch64-only instruction used for atomic halfword operations. No condition flags are affected.",
      "example": "STLXRH w6, w3, [x1]",
      "pseudocode": "if ExclusiveMonitorHeld(Xn) then { [Xn] ← Wt<15:0>; Ws ← 0; Release semantics applied } else { Ws ← 1 }"
    },
    {
      "mnemonic": "stnp",
      "architecture": "ARMv8-A",
      "full_name": "Store Pair (Non-temporal)",
      "summary": "Stores two registers, hinting non-temporal data.",
      "syntax": "STNP <Wt1>, <Wt2>, [<Xn|SP>, #<imm>]",
      "encoding": {
        "format": "Load/Store Pair",
        "binary_pattern": "00 | 101 | 0 | 000 | 0 | imm7 | Rt2 | Rn | Rt",
        "hex_opcode": "0x28000000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm7",
            "clean": "imm7"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:23 | 22 | 21:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt1",
          "desc": "First transfer 32-bit register (load/store pair)"
        },
        {
          "name": "Wt2",
          "desc": "Second transfer 32-bit register (load/store pair)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "Base",
      "description": "Store Pair (Non-temporal): stores two consecutive 32-bit registers (Wt1 and Wt2) to memory at the address computed from Xn plus a signed scaled offset (imm7 × 4). The non-temporal hint indicates the data is unlikely to be reused soon. Does not affect condition flags. AArch64-only instruction.",
      "example": "STNP w3, w4, [x1, #16]",
      "pseudocode": "offset ← imm7 << 2\naddress ← Xn + offset\n[address] ← Wt1\n[address + 4] ← Wt2"
    },
    {
      "mnemonic": "stp",
      "architecture": "ARMv8-A",
      "full_name": "Store Pair of Registers",
      "summary": "Stores two 32-bit registers.",
      "syntax": "STP <Wt1>, <Wt2>, [<Xn|SP>, #<imm>]",
      "encoding": {
        "format": "Load/Store Pair",
        "binary_pattern": "00 | 101 | 0 | 010 | 0 | imm7 | Rt2 | Rn | Rt",
        "hex_opcode": "0x29000000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm7",
            "clean": "imm7"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:23 | 22 | 21:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt1",
          "desc": "First transfer 32-bit register (load/store pair)"
        },
        {
          "name": "Wt2",
          "desc": "Second transfer 32-bit register (load/store pair)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "Base",
      "description": "Stores a pair of 32-bit registers (Wt1 and Wt2) to consecutive memory locations at [Xn + (imm7 << 2)] with a signed immediate offset. This is an AArch64-only instruction commonly used for stack operations. No condition flags are affected.",
      "example": "STP w3, w4, [x1, #16]",
      "pseudocode": "address ← Xn + (imm7 << 2); [address] ← Wt1; [address + 4] ← Wt2"
    },
    {
      "mnemonic": "stp",
      "architecture": "ARMv8-A",
      "full_name": "Store Pair of Registers (64-bit)",
      "summary": "Stores two 64-bit registers.",
      "syntax": "STP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]",
      "encoding": {
        "format": "Load/Store Pair",
        "binary_pattern": "10 | 101 | 0 | 010 | 0 | imm7 | Rt2 | Rn | Rt",
        "hex_opcode": "0xA9000000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm7",
            "clean": "imm7"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:23 | 22 | 21:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt1",
          "desc": "First transfer 64-bit register (load/store pair)"
        },
        {
          "name": "Xt2",
          "desc": "Second transfer 64-bit register (load/store pair)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "Base",
      "description": "Stores two consecutive 64-bit registers to memory at an address calculated from a base register and a signed immediate offset (scaled by 8). Does not affect condition flags. AArch64-only instruction; the immediate offset is encoded as imm7 and scaled by 8 to form the actual offset.",
      "example": "STP x3, x4, [x1, #16]",
      "pseudocode": "address ← Xn + (imm7 << 3)\n[address] ← Xt1\n[address + 8] ← Xt2"
    },
    {
      "mnemonic": "str",
      "architecture": "ARMv8-A",
      "full_name": "Store Register (Immediate)",
      "summary": "Stores a register to memory (Immediate offset).",
      "syntax": "STR <Wt>, [<Xn|SP>, #<pimm>]",
      "encoding": {
        "format": "Load/Store Imm",
        "binary_pattern": "10 | 111 | 0 | 01 | 00 | imm12 | Rn | Rt",
        "hex_opcode": "0xB9000000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "pimm",
          "desc": "Positive immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Stores a 32-bit register to memory at an address calculated from a base register and a positive immediate offset (scaled by 4). Does not affect condition flags. AArch64-only instruction; the immediate is encoded as imm12 and scaled by 4.",
      "example": "STR w3, [x1, #16]",
      "pseudocode": "address ← Xn + (imm12 << 2)\n[address] ← Wt[31:0]"
    },
    {
      "mnemonic": "str",
      "architecture": "ARMv8-A",
      "full_name": "Store Register (Register)",
      "summary": "Stores a register to memory (Register offset).",
      "syntax": "STR <Wt>, [<Xn|SP>, <R><m> {, <extend> <amount>}]",
      "encoding": {
        "format": "Load/Store Reg",
        "binary_pattern": "10 | 111 | 0 | 00 | 00 | 1 | Rm | option | S | 10 | Rn | Rt",
        "hex_opcode": "0xB8200800",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Rm",
          "desc": "Offset Reg"
        }
      ],
      "extension": "Base",
      "description": "Stores a 32-bit register to memory using register-based addressing with optional extension and shift of the offset register. Does not affect condition flags. AArch64-only; supports UXTW, UXTX, SXTW, SXTX extensions with optional left shift.",
      "example": "STR w3, [x1, Rm ]",
      "pseudocode": "offset ← ExtendValue(Rm, option, S)\naddress ← Xn + offset\n[address] ← Wt[31:0]"
    },
    {
      "mnemonic": "strb",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Byte (Immediate)",
      "summary": "Stores the low byte of a register.",
      "syntax": "STRB <Wt>, [<Xn|SP>, #<pimm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "00 | 111 | 0 | 01 | 00 | imm12 | Rn | Rt",
        "hex_opcode": "0x39000000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "pimm",
          "desc": "Positive immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Stores the low byte (bits 7:0) of a 32-bit register to memory at an address calculated from a base register and a positive immediate offset (unscaled). Does not affect condition flags. AArch64-only instruction.",
      "example": "STRB w3, [x1, #16]",
      "pseudocode": "address ← Xn + imm12\n[address] ← Wt[7:0]"
    },
    {
      "mnemonic": "strb",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Byte (Register)",
      "summary": "Stores the low byte of a register using register offset.",
      "syntax": "STRB <Wt>, [<Xn|SP>, <R><m> {, <extend> <amount>}]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "00 | 111 | 0 | 00 | 00 | 1 | Rm | option | S | 10 | Rn | Rt",
        "hex_opcode": "0x38200800",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Rm",
          "desc": "Offset Reg"
        }
      ],
      "extension": "Base",
      "description": "Stores the low byte (bits 7:0) of a 32-bit register to memory using register-based addressing with optional extension and shift of the offset register. Does not affect condition flags. AArch64-only; supports UXTW, UXTX, SXTW, SXTX extensions.",
      "example": "STRB w3, [x1, Rm ]",
      "pseudocode": "offset ← ExtendValue(Rm, option, S)\naddress ← Xn + offset\n[address] ← Wt[7:0]"
    },
    {
      "mnemonic": "strh",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Halfword (Immediate)",
      "summary": "Stores the low halfword of a register.",
      "syntax": "STRH <Wt>, [<Xn|SP>, #<pimm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "01 | 111 | 0 | 01 | 00 | imm12 | Rn | Rt",
        "hex_opcode": "0x79000000",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "pimm",
          "desc": "Positive immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Stores the low halfword (bits 15:0) of a 32-bit register to memory at an address calculated from a base register and a positive immediate offset (scaled by 2). Does not affect condition flags. AArch64-only instruction.",
      "example": "STRH w3, [x1, #16]",
      "pseudocode": "address ← Xn + (imm12 << 1)\n[address] ← Wt[15:0]"
    },
    {
      "mnemonic": "strh",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Halfword (Register)",
      "summary": "Stores the low halfword of a register using register offset.",
      "syntax": "STRH <Wt>, [<Xn|SP>, <R><m> {, <extend> <amount>}]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "01 | 111 | 0 | 00 | 00 | 1 | Rm | option | S | 10 | Rn | Rt",
        "hex_opcode": "0x78200800",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Rm",
          "desc": "Offset Reg"
        }
      ],
      "extension": "Base",
      "description": "Stores the low halfword (bits 15:0) of a 32-bit register to memory using register-based addressing with optional extension and shift of the offset register. Does not affect condition flags. AArch64-only; supports UXTW, UXTX, SXTW, SXTX extensions with optional left shift.",
      "example": "STRH w3, [x1, Rm ]",
      "pseudocode": "offset ← ExtendValue(Rm, option, S)\naddress ← Xn + offset\n[address] ← Wt[15:0]"
    },
    {
      "mnemonic": "sttr",
      "architecture": "ARMv8-A",
      "full_name": "Store Register (Unprivileged)",
      "summary": "Stores a register as if in EL0 (User mode).",
      "syntax": "STTR <Wt>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "10 | 111 | 0 | 00 | 00 | 0 | imm9 | 10 | Rn | Rt",
        "hex_opcode": "0xB8000800",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Stores a 32-bit word from Wt to memory at [Xn + simm] with unprivileged semantics, as if the access were made from EL0. This is an AArch64-only instruction that may be used from higher privilege levels. No condition flags are affected.",
      "example": "STTR w3, [x1, #-8]",
      "pseudocode": "address ← Xn + SignExtend(imm9); [address] ← Wt; access performed at EL0 privilege level"
    },
    {
      "mnemonic": "sttrb",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Byte (Unprivileged)",
      "summary": "Stores a byte as if in EL0.",
      "syntax": "STTRB <Wt>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "00 | 111 | 0 | 00 | 00 | 0 | imm9 | 10 | Rn | Rt",
        "hex_opcode": "0x38000800",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Stores a byte from Wt to memory at [Xn + simm] with unprivileged semantics, as if the access were made from EL0. This is an AArch64-only instruction that may be used from higher privilege levels. No condition flags are affected.",
      "example": "STTRB w3, [x1, #-8]",
      "pseudocode": "address ← Xn + SignExtend(imm9); [address] ← Wt<7:0>; access performed at EL0 privilege level"
    },
    {
      "mnemonic": "sttrh",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Halfword (Unprivileged)",
      "summary": "Stores a halfword as if in EL0.",
      "syntax": "STTRH <Wt>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "01 | 111 | 0 | 00 | 00 | 0 | imm9 | 10 | Rn | Rt",
        "hex_opcode": "0x78000800",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Stores a halfword from Wt to memory at [Xn + simm] with unprivileged semantics, as if the access were made from EL0. This is an AArch64-only instruction that may be used from higher privilege levels. No condition flags are affected.",
      "example": "STTRH w3, [x1, #-8]",
      "pseudocode": "address ← Xn + SignExtend(imm9); [address] ← Wt<15:0>; access performed at EL0 privilege level"
    },
    {
      "mnemonic": "stur",
      "architecture": "ARMv8-A",
      "full_name": "Store Register (Unscaled)",
      "summary": "Stores a register using an unscaled immediate offset.",
      "syntax": "STUR <Wt>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "10 | 111 | 0 | 00 | 00 | 0 | imm9 | 00 | Rn | Rt",
        "hex_opcode": "0xB8000000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Stores a 32-bit word from register Wt to memory at address Xn+simm using an unscaled immediate offset. No condition flags are affected. AArch64-only instruction that may generate an alignment fault or translation fault exception if the address is invalid or unaligned.",
      "example": "STUR w3, [x1, #-8]",
      "pseudocode": "address ← Xn + SignExtend(imm9, 64)\n[address, 4] ← Wt[31:0]"
    },
    {
      "mnemonic": "sturb",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Byte (Unscaled)",
      "summary": "Stores a byte using an unscaled immediate offset.",
      "syntax": "STURB <Wt>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "00 | 111 | 0 | 00 | 00 | 0 | imm9 | 00 | Rn | Rt",
        "hex_opcode": "0x38000000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Stores a single byte from the least-significant byte of register Wt to memory at address Xn+simm using an unscaled immediate offset. No condition flags are affected. AArch64-only instruction that may generate a translation fault exception if the address is invalid.",
      "example": "STURB w3, [x1, #-8]",
      "pseudocode": "address ← Xn + SignExtend(imm9, 64)\n[address, 1] ← Wt[7:0]"
    },
    {
      "mnemonic": "sturh",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Halfword (Unscaled)",
      "summary": "Stores a halfword using an unscaled immediate offset.",
      "syntax": "STURH <Wt>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "01 | 111 | 0 | 00 | 00 | 0 | imm9 | 00 | Rn | Rt",
        "hex_opcode": "0x78000000",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Stores a halfword (16 bits) from the least-significant halfword of register Wt to memory at address Xn+simm using an unscaled immediate offset. No condition flags are affected. AArch64-only instruction that may generate an alignment fault or translation fault exception if the address is invalid or unaligned.",
      "example": "STURH w3, [x1, #-8]",
      "pseudocode": "address ← Xn + SignExtend(imm9, 64)\n[address, 2] ← Wt[15:0]"
    },
    {
      "mnemonic": "stxr",
      "architecture": "ARMv8-A",
      "full_name": "Store Exclusive Register",
      "summary": "Stores a word if exclusive monitor matches.",
      "syntax": "STXR <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "10 | 0010000 | 0 | 0 | Rs | 0 | 11111 | Rn | Rt",
        "hex_opcode": "0x88007C00",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Status"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Conditionally stores a 32-bit word from Wt to memory at address Xn if the exclusive monitor for that address is marked exclusive; writes the store status (0=success, 1=failure) to Ws. No condition flags are affected. AArch64-only instruction that interacts with the exclusive monitor and may generate exception faults.",
      "example": "STXR w6, w3, [x1]",
      "pseudocode": "address ← Xn\nif ExclusiveMonitorMatch(address, WORD) then\n  [address, 4] ← Wt[31:0]\n  Ws ← 0\n  ClearExclusiveMonitor(address)\nelse\n  Ws ← 1"
    },
    {
      "mnemonic": "stxrb",
      "architecture": "ARMv8-A",
      "full_name": "Store Exclusive Register Byte",
      "summary": "Stores a byte if exclusive monitor matches.",
      "syntax": "STXRB <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "00 | 0010000 | 0 | 0 | Rs | 0 | 11111 | Rn | Rt",
        "hex_opcode": "0x08007C00",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Status"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Conditionally stores a single byte from Wt to memory at address Xn if the exclusive monitor for that address is marked exclusive; writes the store status (0=success, 1=failure) to Ws. No condition flags are affected. AArch64-only instruction that interacts with the exclusive monitor and may generate exception faults.",
      "example": "STXRB w6, w3, [x1]",
      "pseudocode": "address ← Xn\nif ExclusiveMonitorMatch(address, BYTE) then\n  [address, 1] ← Wt[7:0]\n  Ws ← 0\n  ClearExclusiveMonitor(address)\nelse\n  Ws ← 1"
    },
    {
      "mnemonic": "stxrh",
      "architecture": "ARMv8-A",
      "full_name": "Store Exclusive Register Halfword",
      "summary": "Stores a halfword if exclusive monitor matches.",
      "syntax": "STXRH <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "01 | 0010000 | 0 | 0 | Rs | 0 | 11111 | Rn | Rt",
        "hex_opcode": "0x48007C00",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Status"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Conditionally stores a halfword (16 bits) from Wt to memory at address Xn if the exclusive monitor for that address is marked exclusive; writes the store status (0=success, 1=failure) to Ws. No condition flags are affected. AArch64-only instruction that interacts with the exclusive monitor and may generate exception faults.",
      "example": "STXRH w6, w3, [x1]",
      "pseudocode": "address ← Xn\nif ExclusiveMonitorMatch(address, HALFWORD) then\n  [address, 2] ← Wt[15:0]\n  Ws ← 0\n  ClearExclusiveMonitor(address)\nelse\n  Ws ← 1"
    },
    {
      "mnemonic": "stxp",
      "architecture": "ARMv8-A",
      "full_name": "Store Exclusive Pair",
      "summary": "Stores two registers if exclusive monitor matches.",
      "syntax": "STXP <Ws>, <Wt1>, <Wt2>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "1 | 0 | 0010000 | 0 | 1 | Rs | 0 | Rt2 | Rn | Rt",
        "hex_opcode": "0x88200000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Status"
        },
        {
          "name": "Wt1",
          "desc": "First transfer 32-bit register (load/store pair)"
        },
        {
          "name": "Wt2",
          "desc": "Second transfer 32-bit register (load/store pair)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Conditionally stores two consecutive 32-bit words from Wt1 and Wt2 to memory at addresses Xn and Xn+4 if the exclusive monitor for that address range is marked exclusive; writes the store status (0=success, 1=failure) to Ws. No condition flags are affected. AArch64-only instruction that interacts with the exclusive monitor and may generate exception faults.",
      "example": "STXP w6, w3, w4, [x1]",
      "pseudocode": "address ← Xn\nif ExclusiveMonitorMatch(address, DWORD) then\n  [address, 4] ← Wt1[31:0]\n  [address + 4, 4] ← Wt2[31:0]\n  Ws ← 0\n  ClearExclusiveMonitor(address)\nelse\n  Ws ← 1"
    },
    {
      "mnemonic": "sub",
      "architecture": "ARMv8-A",
      "full_name": "Subtract (Extended Register)",
      "summary": "Subtracts extended register from register.",
      "syntax": "SUB <Wd|Wsp>, <Wn|Wsp>, <Wm> {, <extend> {#<amount>}}",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 0 | 01011 | 00 | 1 | Rm | option | imm3 | Rn | Rd",
        "hex_opcode": "0x4B200000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Subtracts an extended 32-bit register value from a 32-bit register and writes the result to the destination register. Sets the N, Z, C, V condition flags based on the result. AArch64-only instruction; supports sign/zero extension of Wm with optional left shift (0-4).",
      "example": "SUB Wd, Wn, w2",
      "pseudocode": "offset ← ExtendValue(Wm, option, imm3)\nresult ← Wn - offset\nWd ← result[31:0]\nN ← result[31]\nZ ← (result == 0)\nC ← (unsigned_result == result)\nV ← SignedOverflow(Wn, offset, result)"
    },
    {
      "mnemonic": "sub",
      "architecture": "ARMv8-A",
      "full_name": "Subtract (Immediate)",
      "summary": "Subtracts immediate from register.",
      "syntax": "SUB <Wd|Wsp>, <Wn|Wsp>, #<imm> {, lsl #<shift>}",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 0 | 100010 | sh | imm12 | Rn | Rd",
        "hex_opcode": "0x51000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100010",
            "clean": "100010"
          },
          {
            "raw": "sh",
            "clean": "sh"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Imm"
        }
      ],
      "extension": "Base",
      "description": "Subtracts a 12-bit immediate value (optionally shifted left by 0 or 12 bits) from the 32-bit source register and writes the result to the destination register. The condition flags (N, Z, C, V) are not affected. This instruction executes in AArch64 state and requires no special privileges.",
      "example": "SUB Wd, Wn, #16",
      "pseudocode": "Wd ← Wn - (imm12 << (sh * 12))"
    },
    {
      "mnemonic": "sub",
      "architecture": "ARMv8-A",
      "full_name": "Subtract (Shifted Register)",
      "summary": "Subtracts shifted register from register.",
      "syntax": "SUB <Wd>, <Wn>, <Wm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 0 | 01011 | shift | 0 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x4B000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Subtracts the value in the second source register (optionally shifted) from the first source register and writes the result to the destination register. The shift can be LSL, LSR, ASR, or ROR by an amount specified in the immediate field. The condition flags (N, Z, C, V) are not affected. This instruction executes in AArch64 state and requires no special privileges.",
      "example": "SUB w0, w1, w2",
      "pseudocode": "shift_amount ← imm6; shifted_Wm ← ApplyShift(Wm, shift_type, shift_amount); Wd ← Wn - shifted_Wm"
    },
    {
      "mnemonic": "subs",
      "architecture": "ARMv8-A",
      "full_name": "Subtract and Set Flags (Extended)",
      "summary": "Subtracts extended register and updates flags.",
      "syntax": "SUBS <Wd>, <Wn|Wsp>, <Wm> {, <extend> {#<amount>}}",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 1 | 01011 | 00 | 1 | Rm | option | imm3 | Rn | Rd",
        "hex_opcode": "0x6B200000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Subtracts an extended register (with optional shift) from the source register and updates all condition flags. The second operand is sign- or zero-extended based on the extend type before shifting. The N, Z, C, and V flags are set according to the result. This instruction executes in AArch64 state and requires no special privileges.",
      "example": "SUBS w0, Wn, w2",
      "pseudocode": "extended_Wm ← ExtendRegister(Wm, option); shifted_Wm ← extended_Wm << imm3; result ← Wn - shifted_Wm; Wd ← result; N ← result[31]; Z ← (result == 0); C ← BorrowFrom(Wn, shifted_Wm); V ← OverflowFrom(Wn, shifted_Wm, result)"
    },
    {
      "mnemonic": "subs",
      "architecture": "ARMv8-A",
      "full_name": "Subtract and Set Flags (Immediate)",
      "summary": "Subtracts immediate and updates flags.",
      "syntax": "SUBS <Wd>, <Wn|Wsp>, #<imm> {, lsl #<shift>}",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 1 | 100010 | sh | imm12 | Rn | Rd",
        "hex_opcode": "0x71000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100010",
            "clean": "100010"
          },
          {
            "raw": "sh",
            "clean": "sh"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Imm"
        }
      ],
      "extension": "Base",
      "description": "Subtracts a 12-bit immediate value (optionally shifted left by 0 or 12 bits) from the source register and updates all condition flags. The N, Z, C, and V flags are set according to the result. This instruction executes in AArch64 state and requires no special privileges.",
      "example": "SUBS w0, Wn, #16",
      "pseudocode": "imm_val ← (imm12 << (sh * 12)); result ← Wn - imm_val; Wd ← result; N ← result[31]; Z ← (result == 0); C ← BorrowFrom(Wn, imm_val); V ← OverflowFrom(Wn, imm_val, result)"
    },
    {
      "mnemonic": "subs",
      "architecture": "ARMv8-A",
      "full_name": "Subtract and Set Flags (Shifted)",
      "summary": "Subtracts shifted register and updates flags.",
      "syntax": "SUBS <Wd>, <Wn>, <Wm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 1 | 01011 | shift | 0 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x6B000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Subtracts the value in the second source register (optionally shifted) from the first source register and updates all condition flags. The shift can be LSL, LSR, ASR, or ROR by an amount specified in the immediate field. The N, Z, C, and V flags are set according to the result. This instruction executes in AArch64 state and requires no special privileges.",
      "example": "SUBS w0, w1, w2",
      "pseudocode": "shift_amount ← imm6; shifted_Wm ← ApplyShift(Wm, shift_type, shift_amount); result ← Wn - shifted_Wm; Wd ← result; N ← result[31]; Z ← (result == 0); C ← BorrowFrom(Wn, shifted_Wm); V ← OverflowFrom(Wn, shifted_Wm, result)"
    },
    {
      "mnemonic": "svc",
      "architecture": "ARMv8-A",
      "full_name": "Supervisor Call",
      "summary": "Causes a Supervisor Call exception (to EL1).",
      "syntax": "SVC #<imm>",
      "encoding": {
        "format": "Exception",
        "binary_pattern": "11010100 | 000 | imm16 | 000 | 01",
        "hex_opcode": "0xD4000001",
        "visual_parts": [
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "imm16",
            "clean": "imm16"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "01",
            "clean": "01"
          }
        ],
        "bit_positions": "31:24 | 23:21 | 20:5 | 4:2 | 1:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "System",
      "description": "Generates a Supervisor Call exception, transitioning from the current privilege level to EL1 and saving the return address in ELR_EL1. The immediate is stored in the ESR_EL1 for handling software. AArch64-only exception-generating instruction; the immediate operand is conventionally used to identify the requested system service.",
      "example": "SVC #16",
      "pseudocode": "ELR_EL1 ← PC\nESR_EL1.ISS[15:0] ← imm16\nESR_EL1.EC ← 0b010001\nPSTATE.DAIF ← PSTATE.DAIF OR 0b1111\nPC ← ExceptionVectorAddress(EL1, SVC)"
    },
    {
      "mnemonic": "sys",
      "architecture": "ARMv8-A",
      "full_name": "System Instruction",
      "summary": "Executes a system instruction (cache/TLB maintenance).",
      "syntax": "SYS #<op1>, Cn, Cm, #<op2> {, <Xt>}",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 0 | 01 | op1 | CRn | CRm | op2 | Rt",
        "hex_opcode": "0xD5080000",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "op1",
          "desc": "Op1"
        },
        {
          "name": "Cn",
          "desc": "CRn"
        },
        {
          "name": "Cm",
          "desc": "CRm"
        },
        {
          "name": "op2",
          "desc": "Op2"
        }
      ],
      "extension": "System",
      "description": "Executes a system instruction that performs cache, TLB, or other system maintenance operations based on op1, Cn, Cm, and op2 fields. The optional Xt operand transfers data to/from a system register. This instruction is AArch64-only and typically requires EL1 or higher privilege level. No arithmetic flags are affected; execution may cause synchronization side effects.",
      "example": "SYS #op1, Cn, Cm, #op2",
      "pseudocode": "IMPLEMENTATION_DEFINED system operation based on (op1, Cn, Cm, op2); if Xt is present then Xt ← system_register_value or system_register_value ← Xt"
    },
    {
      "mnemonic": "tbnz",
      "architecture": "ARMv8-A",
      "full_name": "Test Bit Not Zero",
      "summary": "Branches if specified bit is 1.",
      "syntax": "TBNZ <Wt|Xt>, #<imm>, <label>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "b5 | 011011 | 1 | b40 | imm14 | Rt",
        "hex_opcode": "0x37000000",
        "visual_parts": [
          {
            "raw": "b5",
            "clean": "b5"
          },
          {
            "raw": "011011",
            "clean": "011011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "b40",
            "clean": "b40"
          },
          {
            "raw": "imm14",
            "clean": "imm14"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30:25 | 24 | 23:19 | 18:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Reg"
        },
        {
          "name": "imm",
          "desc": "Bit"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Tests the bit at position imm in register Wt|Xt; if the bit is 1 (non-zero), branches to label. The bit position is specified by b5:imm14 (6-bit total index). This is an AArch64-only instruction. No arithmetic flags are modified by the test itself; the branch updates PC.",
      "example": "TBNZ Wt, #16, label",
      "pseudocode": "bit_index ← (b5 << 5) | imm14; if (Wt|Xt)[bit_index] == 1 then PC ← label"
    },
    {
      "mnemonic": "tbz",
      "architecture": "ARMv8-A",
      "full_name": "Test Bit Zero",
      "summary": "Branches if specified bit is 0.",
      "syntax": "TBZ <Wt|Xt>, #<imm>, <label>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "b5 | 011011 | 0 | b40 | imm14 | Rt",
        "hex_opcode": "0x36000000",
        "visual_parts": [
          {
            "raw": "b5",
            "clean": "b5"
          },
          {
            "raw": "011011",
            "clean": "011011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "b40",
            "clean": "b40"
          },
          {
            "raw": "imm14",
            "clean": "imm14"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30:25 | 24 | 23:19 | 18:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Reg"
        },
        {
          "name": "imm",
          "desc": "Bit"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Tests the bit at position imm in register Wt|Xt; if the bit is 0 (zero), branches to label. The bit position is specified by b5:imm14 (6-bit total index). This is an AArch64-only instruction. No arithmetic flags are modified by the test itself; the branch updates PC.",
      "example": "TBZ Wt, #16, label",
      "pseudocode": "bit_index ← (b5 << 5) | imm14; if (Wt|Xt)[bit_index] == 0 then PC ← label"
    },
    {
      "mnemonic": "ubfm",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Bitfield Move",
      "summary": "Extracts/Inserts bitfield (Zero Extend).",
      "syntax": "UBFM <Wd>, <Wn>, #<immr>, #<imms>",
      "encoding": {
        "format": "Bitfield",
        "binary_pattern": "0 | 10 | 100110 | 0 | immr | imms | Rn | Rd",
        "hex_opcode": "0x53000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "100110",
            "clean": "100110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "immr",
            "clean": "immr"
          },
          {
            "raw": "imms",
            "clean": "imms"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "immr",
          "desc": "Rotate"
        },
        {
          "name": "imms",
          "desc": "Size"
        }
      ],
      "extension": "Base",
      "description": "Extracts a bitfield from Wn (or Xn in 64-bit variant) and zero-extends it into Wd (or Xd). The bitfield is selected by rotating right by immr positions and then masking imms bits. No arithmetic flags are affected. This is AArch64-only and commonly used for zero-extension of bit ranges.",
      "example": "UBFM w0, w1, #immr, #imms",
      "pseudocode": "width ← size; elem ← (Wn >> immr) | (Wn << (width - immr)); mask ← (1 << (imms + 1)) - 1; Wd ← elem & mask; Wd[63:32] ← 0"
    },
    {
      "mnemonic": "udiv",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Divide",
      "summary": "Divides two unsigned registers.",
      "syntax": "UDIV <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11010110 | Rm | 00001 | 0 | Rn | Rd",
        "hex_opcode": "0x1AC00800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "Dividend"
        },
        {
          "name": "Wm",
          "desc": "Divisor"
        }
      ],
      "extension": "Base",
      "description": "Divides the unsigned 32-bit value in Wn by the unsigned 32-bit value in Wm, writing the quotient to Wd. Division by zero produces zero in Wd (no exception). This is AArch64-only. No arithmetic flags (N, Z, C, V) are affected.",
      "example": "UDIV w0, w1, w2",
      "pseudocode": "if Wm == 0 then Wd ← 0 else Wd ← Wn / Wm"
    },
    {
      "mnemonic": "umaddl",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Multiply-Add Long",
      "summary": "Multiplies two 32-bit regs, adds to 64-bit reg (Unsigned).",
      "syntax": "UMADDL <Xd>, <Wn>, <Wm>, <Xa>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 00 | 11011 | 1 | 01 | Rm | 0 | Ra | Rn | Rd",
        "hex_opcode": "0x9BA00000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11011",
            "clean": "11011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23 | 22:21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        },
        {
          "name": "Xa",
          "desc": "Addend"
        }
      ],
      "extension": "Base",
      "description": "Multiplies the unsigned 32-bit values in Wn and Wm as an unsigned product (64-bit intermediate), then adds the 64-bit value in Xa, storing the 64-bit result in Xd. This is AArch64-only. No arithmetic flags are affected.",
      "example": "UMADDL x0, w1, w2, x5",
      "pseudocode": "Xd ← (Wn × Wm) + Xa"
    },
    {
      "mnemonic": "umsubl",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Multiply-Subtract Long",
      "summary": "Calculates (Xa - (Wn * Wm)) (Unsigned 64-bit).",
      "syntax": "UMSUBL <Xd>, <Wn>, <Wm>, <Xa>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 00 | 11011 | 1 | 01 | Rm | 1 | Ra | Rn | Rd",
        "hex_opcode": "0x9BA08000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11011",
            "clean": "11011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23 | 22:21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        },
        {
          "name": "Xa",
          "desc": "Minuend"
        }
      ],
      "extension": "Base",
      "description": "Multiplies the unsigned 32-bit values in Wn and Wm as an unsigned product (64-bit intermediate), then subtracts it from the 64-bit value in Xa, storing the 64-bit result in Xd. This is AArch64-only. No arithmetic flags are affected.",
      "example": "UMSUBL x0, w1, w2, x5",
      "pseudocode": "Xd ← Xa - (Wn × Wm)"
    },
    {
      "mnemonic": "umulh",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Multiply High",
      "summary": "Multiplies two 64-bit registers, keeps high 64 bits (Unsigned).",
      "syntax": "UMULH <Xd>, <Xn>, <Xm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 00 | 11011 | 1 | 10 | Rm | 0 | 11111 | Rn | Rd",
        "hex_opcode": "0x9BC07C00",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11011",
            "clean": "11011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23 | 22:21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Second source / offset 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Multiplies the unsigned 64-bit values in Xn and Xm, treating both as unsigned integers, and stores the high 64 bits of the 128-bit product in Xd. This is AArch64-only. No arithmetic flags are affected.",
      "example": "UMULH x0, x1, x2",
      "pseudocode": "temp ← Xn × Xm; Xd ← temp[127:64]"
    },
    {
      "mnemonic": "vld3",
      "architecture": "ARMv8-A",
      "full_name": "Vector Load Multiple (3-Element Structure)",
      "summary": "Loads three-element structures (e.g., RGB) and de-interleaves them into three registers.",
      "syntax": "VLD3<c>.<size> <list>, [<Rn>]{!}",
      "encoding": {
        "format": "NEON Load",
        "binary_pattern": "111101001 | D | 1 | 0 | Rn | Vd | 00 | 10 | index_align | 1101",
        "hex_opcode": "0xF4A0020D",
        "visual_parts": [
          {
            "raw": "111101001",
            "clean": "111101001"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "index_align",
            "clean": "index_align"
          },
          {
            "raw": "1101",
            "clean": "1101"
          }
        ],
        "bit_positions": "31:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "list",
          "desc": "Dest Registers"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Loads three-element interleaved structures from memory and de-interleaves them into three consecutive NEON registers. The instruction reads (3 × element_size × 8) bits from the address in Rn, distributing elements across three registers. Condition flags (N, Z, C, V) are unaffected. Execution is restricted to A32/T32 with NEON extension; post-index writeback to Rn is optional.",
      "example": "VLD3.size {r0-r3}, [r1]!",
      "pseudocode": "address ← Rn\nfor i = 0 to 7 do\n  element_size_bits ← size_in_bits(size)\n  Vd[i] ← [address + (i * element_size_bits / 8)]\n  Vd+1[i] ← [address + (i * element_size_bits / 8) + (element_size_bits / 8)]\n  Vd+2[i] ← [address + (i * element_size_bits / 8) + (2 * element_size_bits / 8)]\nif (writeback) then\n  Rn ← Rn + (3 * 8 * element_size_bits / 8)"
    },
    {
      "mnemonic": "vld4",
      "architecture": "ARMv8-A",
      "full_name": "Vector Load Multiple (4-Element Structure)",
      "summary": "Loads four-element structures (e.g., RGBA) and de-interleaves them into four registers.",
      "syntax": "VLD4<c>.<size> <list>, [<Rn>]{!}",
      "encoding": {
        "format": "NEON Load",
        "binary_pattern": "111101001 | D | 1 | 0 | Rn | Vd | 00 | 11 | index_align | 1101",
        "hex_opcode": "0xF4A0030D",
        "visual_parts": [
          {
            "raw": "111101001",
            "clean": "111101001"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "index_align",
            "clean": "index_align"
          },
          {
            "raw": "1101",
            "clean": "1101"
          }
        ],
        "bit_positions": "31:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "list",
          "desc": "Dest Registers"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Loads four-element interleaved structures from memory and de-interleaves them into four consecutive NEON registers. The instruction reads (4 × element_size × 8) bits from the address in Rn, distributing elements across four registers. Condition flags (N, Z, C, V) are unaffected. Execution is restricted to A32/T32 with NEON extension; post-index writeback to Rn is optional.",
      "example": "VLD4.size {r0-r3}, [r1]!",
      "pseudocode": "address ← Rn\nfor i = 0 to 7 do\n  element_size_bits ← size_in_bits(size)\n  Vd[i] ← [address + (i * element_size_bits / 8)]\n  Vd+1[i] ← [address + (i * element_size_bits / 8) + (element_size_bits / 8)]\n  Vd+2[i] ← [address + (i * element_size_bits / 8) + (2 * element_size_bits / 8)]\n  Vd+3[i] ← [address + (i * element_size_bits / 8) + (3 * element_size_bits / 8)]\nif (writeback) then\n  Rn ← Rn + (4 * 8 * element_size_bits / 8)"
    },
    {
      "mnemonic": "vst3",
      "architecture": "ARMv8-A",
      "full_name": "Vector Store Multiple (3-Element Structure)",
      "summary": "Interleaves and stores three registers into memory (e.g., RGB).",
      "syntax": "VST3<c>.<size> <list>, [<Rn>]{!}",
      "encoding": {
        "format": "NEON Store",
        "binary_pattern": "111101001 | D | 0 | 0 | Rn | Vd | 00 | 10 | index_align | 1101",
        "hex_opcode": "0xF480020D",
        "visual_parts": [
          {
            "raw": "111101001",
            "clean": "111101001"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "index_align",
            "clean": "index_align"
          },
          {
            "raw": "1101",
            "clean": "1101"
          }
        ],
        "bit_positions": "31:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "list",
          "desc": "Src Registers"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Interleaves and stores three NEON registers into memory as three-element structures. The instruction reads from three consecutive registers and interleaves their elements before writing (3 × element_size × 8) bits to the address in Rn. Condition flags (N, Z, C, V) are unaffected. Execution is restricted to A32/T32 with NEON extension; post-index writeback to Rn is optional.",
      "example": "VST3.size {r0-r3}, [r1]!",
      "pseudocode": "address ← Rn\nfor i = 0 to 7 do\n  element_size_bits ← size_in_bits(size)\n  [address + (i * element_size_bits / 8)] ← Vd[i]\n  [address + (i * element_size_bits / 8) + (element_size_bits / 8)] ← Vd+1[i]\n  [address + (i * element_size_bits / 8) + (2 * element_size_bits / 8)] ← Vd+2[i]\nif (writeback) then\n  Rn ← Rn + (3 * 8 * element_size_bits / 8)"
    },
    {
      "mnemonic": "vst4",
      "architecture": "ARMv8-A",
      "full_name": "Vector Store Multiple (4-Element Structure)",
      "summary": "Interleaves and stores four registers into memory (e.g., RGBA).",
      "syntax": "VST4<c>.<size> <list>, [<Rn>]{!}",
      "encoding": {
        "format": "NEON Store",
        "binary_pattern": "111101000 | D | 0 | 0 | Rn | Vd | itype | size | align | Rm",
        "hex_opcode": "0xF4000000",
        "visual_parts": [
          {
            "raw": "111101000",
            "clean": "111101000"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "itype",
            "clean": "itype"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "align",
            "clean": "align"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "list",
          "desc": "Src Registers"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Interleaves and stores four NEON registers into memory as four-element structures. The instruction reads from four consecutive registers and interleaves their elements before writing (4 × element_size × 8) bits to the address in Rn. Condition flags (N, Z, C, V) are unaffected. Execution is restricted to A32/T32 with NEON extension; post-index writeback to Rn is optional.",
      "example": "VST4.size {r0-r3}, [r1]!",
      "pseudocode": "address ← Rn\nfor i = 0 to 7 do\n  element_size_bits ← size_in_bits(size)\n  [address + (i * element_size_bits / 8)] ← Vd[i]\n  [address + (i * element_size_bits / 8) + (element_size_bits / 8)] ← Vd+1[i]\n  [address + (i * element_size_bits / 8) + (2 * element_size_bits / 8)] ← Vd+2[i]\n  [address + (i * element_size_bits / 8) + (3 * element_size_bits / 8)] ← Vd+3[i]\nif (writeback) then\n  Rn ← Rn + (4 * 8 * element_size_bits / 8)"
    },
    {
      "mnemonic": "vtbx",
      "architecture": "ARMv8-A",
      "full_name": "Vector Table Extension",
      "summary": "Inserts elements into a vector using a table lookup.",
      "syntax": "VTBX<c>.8 <Dd>, <list>, <Dm>",
      "encoding": {
        "format": "NEON Table",
        "binary_pattern": "111100111 | D | 11 | Vn | Vd | 10 | len | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xF3B00840",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "len",
            "clean": "len"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Dest/Base"
        },
        {
          "name": "list",
          "desc": "Table"
        },
        {
          "name": "Dm",
          "desc": "Indices"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a table lookup and extension: for each byte index in Dm, looks up the corresponding byte in the table (1-4 registers starting at Vn) and inserts it into the corresponding position in Dd, leaving unmapped indices unchanged in Dd. Condition flags (N, Z, C, V) are unaffected. Execution is restricted to A32/T32 with NEON extension; out-of-range indices preserve the original element in Dd.",
      "example": "VTBX.8 d0, {r0-r3}, d2",
      "pseudocode": "for i = 0 to 15 do\n  index ← Dm.byte[i]\n  if (index < (len + 1) * 16) then\n    table_reg ← Vn + (index / 16)\n    element_offset ← index mod 16\n    Dd.byte[i] ← [table_reg].byte[element_offset]\n  else\n    Dd.byte[i] ← Dd.byte[i]"
    },
    {
      "mnemonic": "vfma",
      "architecture": "ARMv8-A",
      "full_name": "Vector Fused Multiply Accumulate",
      "summary": "Computes Vd = Vd + (Vn * Vm) with single rounding.",
      "syntax": "VFMA<c>.F32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | 0 | sz | Vn | Vd | 1100 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000C10",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "VFPv4 (SIMD)",
      "description": "Fused multiply-accumulate: computes Qd = Qd + (Qn × Qm) on 32-bit floating-point elements with a single rounding operation, improving precision over separate multiply and add. Condition flags (N, Z, C, V) are unaffected. Execution is restricted to A32/T32 with VFPv4 (NEON) extension; operates on 128-bit quad registers.",
      "example": "VFMA.F32 q0, q1, q2",
      "pseudocode": "for i = 0 to 3 do\n  Qd[i] ← round_to_nearest(Qd[i] + (Qn[i] × Qm[i]))"
    },
    {
      "mnemonic": "vfms",
      "architecture": "ARMv8-A",
      "full_name": "Vector Fused Multiply Subtract",
      "summary": "Computes Vd = Vd - (Vn * Vm) with single rounding.",
      "syntax": "VFMS<c>.F32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | 1 | sz | Vn | Vd | 1100 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2200C10",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "VFPv4 (SIMD)",
      "description": "Fused multiply-subtract: computes Qd = Qd - (Qn × Qm) on 32-bit floating-point elements with a single rounding operation, improving precision over separate multiply and subtract. Condition flags (N, Z, C, V) are unaffected. Execution is restricted to A32/T32 with VFPv4 (NEON) extension; operates on 128-bit quad registers.",
      "example": "VFMS.F32 q0, q1, q2",
      "pseudocode": "for i = 0 to 3 do\n  Qd[i] ← round_to_nearest(Qd[i] - (Qn[i] × Qm[i]))"
    },
    {
      "mnemonic": "vfnma",
      "architecture": "ARMv8-A",
      "full_name": "Vector Fused Negated Multiply Accumulate",
      "summary": "Computes Vd = Vd - (Vn * Vm).",
      "syntax": "VFNMA<c>.F32 <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 1 | D | 01 | Vn | Vd | 10 | 10 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0x0E900A40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFPv4 (Float)",
      "description": "Fused negated multiply-accumulate: computes Sd = Sd - (Sn × Sm) on 32-bit floating-point values with a single rounding operation. Condition flags (N, Z, C, V) are unaffected. Execution is restricted to A32/T32 with VFPv4 (scalar floating-point) extension; operates on 32-bit single-precision registers.",
      "example": "VFNMA.F32 s0, s1, s2",
      "pseudocode": "Sd ← round_to_nearest(Sd - (Sn × Sm))"
    },
    {
      "mnemonic": "vfnms",
      "architecture": "ARMv8-A",
      "full_name": "Vector Fused Negated Multiply Subtract",
      "summary": "Computes Vd = -Vd + (Vn * Vm).",
      "syntax": "VFNMS<c>.F32 <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 1 | D | 01 | Vn | Vd | 10 | 10 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0x0E900A00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFPv4 (Float)",
      "description": "Vector Fused Negated Multiply Subtract computes the negation of the destination plus the product of two operands: Sd = -Sd + (Sn * Sm). This is a single fused operation that performs multiplication and subtraction with only one rounding step, improving precision over separate operations. The instruction is available in VFPv4 and operates on 32-bit single-precision floating-point values. Condition flags (N, Z, C, V) are not affected; floating-point exception flags may be set based on the result.",
      "example": "VFNMS.F32 s0, s1, s2",
      "pseudocode": "Sd ← -Sd + (Sn * Sm)"
    },
    {
      "mnemonic": "vrecps",
      "architecture": "ARMv8-A",
      "full_name": "Vector Reciprocal Step",
      "summary": "Newton-Raphson step for reciprocal refinement: (2 - Vn * Vm).",
      "syntax": "VRECPS<c>.F32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | 0 | sz | Vn | Vd | 1111 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000F10",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Reciprocal Step performs a Newton-Raphson step for reciprocal refinement on 32-bit floating-point SIMD elements: Qd = 2.0 - (Qn * Qm). This operation is typically used iteratively to refine reciprocal approximations. The instruction operates on 128-bit SIMD registers, processing multiple 32-bit float elements in parallel. No integer flags are affected; floating-point exception flags may be set based on the results.",
      "example": "VRECPS.F32 q0, q1, q2",
      "pseudocode": "for i = 0 to 3\n  Qd[i] ← 2.0 - (Qn[i] * Qm[i])"
    },
    {
      "mnemonic": "vrsqrts",
      "architecture": "ARMv8-A",
      "full_name": "Vector Reciprocal Square Root Step",
      "summary": "Newton-Raphson step for reciprocal sqrt refinement: (3 - Vn * Vm) / 2.",
      "syntax": "VRSQRTS<c>.F32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | 1 | sz | Vn | Vd | 1111 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2200F10",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Reciprocal Square Root Step performs a Newton-Raphson step for reciprocal square root refinement on 32-bit floating-point SIMD elements: Qd = (3.0 - (Qn * Qm)) / 2.0. This operation is typically used iteratively to refine reciprocal square root approximations. The instruction operates on 128-bit SIMD registers, processing multiple 32-bit float elements in parallel. No integer flags are affected; floating-point exception flags may be set based on the results.",
      "example": "VRSQRTS.F32 q0, q1, q2",
      "pseudocode": "for i = 0 to 3\n  Qd[i] ← (3.0 - (Qn[i] * Qm[i])) / 2.0"
    },
    {
      "mnemonic": "vpadal",
      "architecture": "ARMv8-A",
      "full_name": "Vector Pairwise Add and Accumulate Long",
      "summary": "Adds adjacent pairs and accumulates into wide destination.",
      "syntax": "VPADAL<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 00 | Vd | 0 | 110 | op | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B00600",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "op",
            "clean": "op"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Pairwise Add and Accumulate Long adds adjacent pairs of elements from the source register and accumulates the results into the destination register, which is widened. The data type and element size are specified by the size field; both signed and unsigned variants exist. No condition flags are affected. The destination elements are wider than the source elements to accommodate the accumulated sums.",
      "example": "VPADAL.dt q0, q2",
      "pseudocode": "for i = 0 to (pairs_in_Qm - 1)\n  Qd[i] ← Qd[i] + (Qm[2*i] + Qm[2*i+1])"
    },
    {
      "mnemonic": "vpaddl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Pairwise Add Long",
      "summary": "Adds adjacent pairs and produces wide result.",
      "syntax": "VPADDL<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 00 | Vd | 0 | 010 | op | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B00200",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "op",
            "clean": "op"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Pairwise Add Long adds adjacent pairs of elements from the source register and produces a widened result in the destination register. The data type and element size are specified by the size field; both signed and unsigned variants exist. No condition flags are affected. The destination elements are wider than the source elements to accommodate the pair sums.",
      "example": "VPADDL.dt q0, q2",
      "pseudocode": "for i = 0 to (pairs_in_Qm - 1)\n  Qd[i] ← Qm[2*i] + Qm[2*i+1]"
    },
    {
      "mnemonic": "vswp",
      "architecture": "ARMv8-A",
      "full_name": "Vector Swap",
      "summary": "Swaps the contents of two vectors.",
      "syntax": "VSWP<c> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | 00 | 10 | Vd | 0 | 0000 | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B20000",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Reg 1"
        },
        {
          "name": "Qm",
          "desc": "Reg 2"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Swap exchanges the entire contents of two SIMD registers. The register sizes (64-bit or 128-bit) are determined by the Q bit in the encoding. This is a data movement operation with no arithmetic or comparison; no condition flags are affected.",
      "example": "VSWP q0, q2",
      "pseudocode": "temp ← Qd\nQd ← Qm\nQm ← temp"
    },
    {
      "mnemonic": "vmaxnm",
      "architecture": "ARMv8-A",
      "full_name": "Vector Maximum Number",
      "summary": "Returns larger value, handling NaNs per IEEE 754-2008.",
      "syntax": "VMAXNM<c>.F32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "111111101 | D | 00 | Vn | Vd | 10 | 10 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xFE800A00",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Maximum Number returns the larger of two 32-bit floating-point values for each lane, handling NaN operands according to IEEE 754-2008 semantics (if one operand is NaN, the non-NaN value is returned). The instruction operates on 128-bit SIMD registers, processing multiple 32-bit float elements in parallel. No integer flags are affected; floating-point exception flags may be set based on the results.",
      "example": "VMAXNM.F32 q0, q1, q2",
      "pseudocode": "for i = 0 to 3\n  if isNaN(Qn[i]) and not isNaN(Qm[i])\n    Qd[i] ← Qm[i]\n  else if isNaN(Qm[i]) and not isNaN(Qn[i])\n    Qd[i] ← Qn[i]\n  else\n    Qd[i] ← max(Qn[i], Qm[i])"
    },
    {
      "mnemonic": "vminnm",
      "architecture": "ARMv8-A",
      "full_name": "Vector Minimum Number",
      "summary": "Returns smaller value, handling NaNs per IEEE 754-2008.",
      "syntax": "VMINNM<c>.F32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "111111101 | D | 00 | Vn | Vd | 10 | 10 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xFE800A40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Minimum Number returns the smaller of two 32-bit floating-point values for each lane, handling NaN operands according to IEEE 754-2008 semantics (if one operand is NaN, the non-NaN value is returned). The instruction operates on 128-bit SIMD registers, processing multiple 32-bit float elements in parallel. No integer flags are affected; floating-point exception flags may be set based on the results.",
      "example": "VMINNM.F32 q0, q1, q2",
      "pseudocode": "for i = 0 to 3\n  if isNaN(Qn[i]) and not isNaN(Qm[i])\n    Qd[i] ← Qm[i]\n  else if isNaN(Qm[i]) and not isNaN(Qn[i])\n    Qd[i] ← Qn[i]\n  else\n    Qd[i] ← min(Qn[i], Qm[i])"
    },
    {
      "mnemonic": "vcvta",
      "architecture": "ARMv8-A",
      "full_name": "Vector Convert to Integer (Nearest)",
      "summary": "Converts float to integer, rounding to nearest.",
      "syntax": "VCVTA<c>.<dt>.F32 <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111111101 | D | 111 | 1 | 00 | Vd | 10 | 10 | op | 1 | M | 0 | Vm",
        "hex_opcode": "0xFEBC0A40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "op",
            "clean": "op"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:19 | 18 | 17:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Converts each floating-point element in the source Q register to a signed or unsigned integer, rounding towards positive infinity (towards +∞), and writes the results to the destination Q register. This is a vector operation where each lane is independently converted. No NEON flags are modified; results follow IEEE 754 rounding semantics. This instruction requires NEON support and executes in AArch32 state (T32/A32).",
      "example": "VCVTA.dt.F32 q0, q2",
      "pseudocode": "for i ← 0 to (128 / element_width) - 1 do; element ← Qm[i]; integer_result ← ConvertToInteger(element, RoundTowardsPlusInfinity, unsigned); Qd[i] ← integer_result; end"
    },
    {
      "mnemonic": "vcvtn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Convert to Integer (Nearest Even)",
      "summary": "Converts float to integer, rounding to nearest even.",
      "syntax": "VCVTN<c>.<dt>.F32 <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111111101 | D | 111 | 1 | 01 | Vd | 10 | 10 | op | 1 | M | 0 | Vm",
        "hex_opcode": "0xFEBD0A40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "op",
            "clean": "op"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:19 | 18 | 17:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Converts each floating-point element in the source Q register to a signed or unsigned integer, rounding to nearest even (banker's rounding), and writes the results to the destination Q register. This is a vector operation where each lane is independently converted. No NEON flags are modified; results follow IEEE 754 rounding semantics. This instruction requires NEON support and executes in AArch32 state (T32/A32).",
      "example": "VCVTN.dt.F32 q0, q2",
      "pseudocode": "for i ← 0 to (128 / element_width) - 1 do; element ← Qm[i]; integer_result ← ConvertToInteger(element, RoundToNearestEven, unsigned); Qd[i] ← integer_result; end"
    },
    {
      "mnemonic": "vcvtp",
      "architecture": "ARMv8-A",
      "full_name": "Vector Convert to Integer (Plus Infinity)",
      "summary": "Converts float to integer, rounding towards +Inf (Ceil).",
      "syntax": "VCVTP<c>.<dt>.F32 <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111111101 | D | 111 | 1 | 10 | Vd | 10 | 10 | op | 1 | M | 0 | Vm",
        "hex_opcode": "0xFEBE0A40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "op",
            "clean": "op"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:19 | 18 | 17:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Converts each floating-point element in the source Q register to a signed or unsigned integer, rounding towards positive infinity (ceiling), and writes the results to the destination Q register. This is a vector operation where each lane is independently converted. No NEON flags are modified; results follow IEEE 754 rounding semantics. This instruction requires NEON support and executes in AArch32 state (T32/A32).",
      "example": "VCVTP.dt.F32 q0, q2",
      "pseudocode": "for i ← 0 to (128 / element_width) - 1 do; element ← Qm[i]; integer_result ← ConvertToInteger(element, RoundTowardsPlusInfinity, unsigned); Qd[i] ← integer_result; end"
    },
    {
      "mnemonic": "vcvtm",
      "architecture": "ARMv8-A",
      "full_name": "Vector Convert to Integer (Minus Infinity)",
      "summary": "Converts float to integer, rounding towards -Inf (Floor).",
      "syntax": "VCVTM<c>.<dt>.F32 <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111111101 | D | 111 | 1 | 11 | Vd | 10 | 10 | op | 1 | M | 0 | Vm",
        "hex_opcode": "0xFEBF0A40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "op",
            "clean": "op"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:19 | 18 | 17:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Converts floating-point values in a NEON vector to signed integers, rounding towards negative infinity (floor). This is a NEON SIMD instruction that operates on 32-bit floating-point elements and produces integer results. No condition flags are affected by this instruction.",
      "example": "VCVTM.dt.F32 q0, q2",
      "pseudocode": "for i = 0 to elements-1\n  Qd[i] ← RoundTowardsMinusInfinity(Qm[i])"
    },
    {
      "mnemonic": "vrinta",
      "architecture": "ARMv8-A",
      "full_name": "Vector Round Floating-Point (Nearest)",
      "summary": "Rounds float to integral float (Nearest).",
      "syntax": "VRINTA<c>.F32 <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111111101 | D | 111 | 0 | 00 | Vd | 10 | 10 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0xFEB80A40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:19 | 18 | 17:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Rounds each 32-bit floating-point element in the source vector to the nearest integer value, using round-to-nearest (ties away from zero) rounding mode, and writes the result as a floating-point value to the destination vector. This instruction does not modify the condition flags. Available in A32/T32 with NEON extension.",
      "example": "VRINTA.F32 q0, q2",
      "pseudocode": "for i = 0 to 3\n  Qd[i] ← RoundToNearest(Qm[i])\nend for"
    },
    {
      "mnemonic": "vrintn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Round Floating-Point (Nearest Even)",
      "summary": "Rounds float to integral float (Nearest Even).",
      "syntax": "VRINTN<c>.F32 <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111111101 | D | 111 | 0 | 01 | Vd | 10 | 10 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0xFEB90A40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:19 | 18 | 17:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Rounds each 32-bit floating-point element in the source vector to the nearest integer value, using round-to-nearest-even (banker's rounding) rounding mode, and writes the result as a floating-point value to the destination vector. This instruction does not modify the condition flags. Available in A32/T32 with NEON extension.",
      "example": "VRINTN.F32 q0, q2",
      "pseudocode": "for i = 0 to 3\n  Qd[i] ← RoundToNearestEven(Qm[i])\nend for"
    },
    {
      "mnemonic": "vrintz",
      "architecture": "ARMv8-A",
      "full_name": "Vector Round Floating-Point (Zero)",
      "summary": "Rounds float to integral float (Towards Zero).",
      "syntax": "VRINTZ<c>.F32 <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 110 | Vd | 10 | 10 | 1 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB60AC0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Rounds each 32-bit floating-point element in the source vector towards zero to an integer value, and writes the result as a floating-point value to the destination vector. This instruction does not modify the condition flags. Available in A32/T32 with NEON extension.",
      "example": "VRINTZ.F32 q0, q2",
      "pseudocode": "for i = 0 to 3\n  Qd[i] ← RoundTowardsZero(Qm[i])\nend for"
    },
    {
      "mnemonic": "vsel",
      "architecture": "ARMv8-A",
      "full_name": "Vector Select",
      "summary": "Selects elements from Dn or Dm based on condition flags (predicated VFP).",
      "syntax": "VSEL<cond>.F32 <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "VFP Misc",
        "binary_pattern": "11111110 | 0 | D | cc | Vn | Vd | 1010 | N | 0 | M | Vm",
        "hex_opcode": "0xFE000A00",
        "visual_parts": [
          {
            "raw": "11111110",
            "clean": "11111110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "cc",
            "clean": "cc"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ]
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Conditionally selects the 32-bit floating-point value from either Sn or Sm based on the current state of the condition flags and writes it to Sd. The condition code (cc) embedded in the instruction determines which flag combination is tested. This instruction does not modify condition flags. Available in A32/T32 with VFP extension.",
      "example": "VSELcond.F32 s0, s1, s2",
      "pseudocode": "if ConditionHolds(cc) then\n  Sd ← Sn\nelse\n  Sd ← Sm\nend if"
    },
    {
      "mnemonic": "aese",
      "architecture": "ARMv8-A",
      "full_name": "AES Encrypt (A32)",
      "summary": "Performs one round of AES encryption (AArch32).",
      "syntax": "AESE.8 <Qd>, <Qm>",
      "encoding": {
        "format": "Crypto 2-Reg",
        "binary_pattern": "11110011 | 1 | D | 11 | 00 | 00 | Vd | 00110 | Q | M | 0 | Vm",
        "hex_opcode": "0xF3B00300",
        "visual_parts": [
          {
            "raw": "11110011",
            "clean": "11110011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Data"
        },
        {
          "name": "Qm",
          "desc": "Key"
        }
      ],
      "extension": "Crypto",
      "description": "Performs a single round of AES encryption (SubBytes, ShiftRows, MixColumns, and AddRoundKey stages) on the 128-bit data block in Qd using the 128-bit round key in Qm. The result is written back to Qd. This instruction does not modify the condition flags. Available in A32/T32 with Crypto extension and requires AES feature.",
      "example": "AESE.8 q0, q2",
      "pseudocode": "state ← Qd\nround_key ← Qm\nstate ← SubBytes(state)\nstate ← ShiftRows(state)\nstate ← MixColumns(state)\nstate ← AddRoundKey(state, round_key)\nQd ← state"
    },
    {
      "mnemonic": "aesd",
      "architecture": "ARMv8-A",
      "full_name": "AES Decrypt (A32)",
      "summary": "Performs one round of AES decryption (AArch32).",
      "syntax": "AESD.8 <Qd>, <Qm>",
      "encoding": {
        "format": "Crypto 2-Reg",
        "binary_pattern": "11110011 | 1 | D | 11 | 00 | 00 | Vd | 00111 | Q | M | 0 | Vm",
        "hex_opcode": "0xF3B00340",
        "visual_parts": [
          {
            "raw": "11110011",
            "clean": "11110011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00111",
            "clean": "00111"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Data"
        },
        {
          "name": "Qm",
          "desc": "Key"
        }
      ],
      "extension": "Crypto",
      "description": "Performs a single round of AES decryption (InvShiftRows, InvSubBytes, AddRoundKey, and InvMixColumns stages) on the 128-bit data block in Qd using the 128-bit round key in Qm. The result is written back to Qd. This instruction does not modify the condition flags. Available in A32/T32 with Crypto extension and requires AES feature.",
      "example": "AESD.8 q0, q2",
      "pseudocode": "state ← Qd\nround_key ← Qm\nstate ← InvShiftRows(state)\nstate ← InvSubBytes(state)\nstate ← AddRoundKey(state, round_key)\nstate ← InvMixColumns(state)\nQd ← state"
    },
    {
      "mnemonic": "aesmc",
      "architecture": "ARMv8-A",
      "full_name": "AES Mix Columns (A32)",
      "summary": "AES Mix Columns transformation.",
      "syntax": "AESMC.8 <Qd>, <Qm>",
      "encoding": {
        "format": "Crypto 2-Reg",
        "binary_pattern": "11110011 | 1 | D | 11 | 00 | 10 | Vd | 00110 | Q | M | 0 | Vm",
        "hex_opcode": "0xF3B00380",
        "visual_parts": [
          {
            "raw": "11110011",
            "clean": "11110011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "Crypto",
      "description": "Applies the AES MixColumns (forward) transformation to each column of the 128-bit state in Qm and writes the result to Qd. This transformation is equivalent to one round's MixColumns operation and is used in key expansion during AES encryption. This instruction does not modify the condition flags. Available in A32/T32 with Crypto extension and requires AES feature.",
      "example": "AESMC.8 q0, q2",
      "pseudocode": "Qd ← AESMixColumns(Qm)"
    },
    {
      "mnemonic": "aesimc",
      "architecture": "ARMv8-A",
      "full_name": "AES Inverse Mix Columns (A32)",
      "summary": "AES Inverse Mix Columns transformation.",
      "syntax": "AESIMC.8 <Qd>, <Qm>",
      "encoding": {
        "format": "Crypto 2-Reg",
        "binary_pattern": "11110011 | 1 | D | 11 | 00 | 10 | Vd | 00111 | Q | M | 0 | Vm",
        "hex_opcode": "0xF3B003C0",
        "visual_parts": [
          {
            "raw": "11110011",
            "clean": "11110011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00111",
            "clean": "00111"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "Crypto",
      "description": "Applies the AES Inverse MixColumns (inverse) transformation to each column of the 128-bit state in Qm and writes the result to Qd. This transformation reverses the forward MixColumns operation and is used in equivalent inverse cipher key expansion during AES decryption. This instruction does not modify the condition flags. Available in A32/T32 with Crypto extension and requires AES feature.",
      "example": "AESIMC.8 q0, q2",
      "pseudocode": "Qd ← AESInverseMixColumns(Qm)"
    },
    {
      "mnemonic": "sha1c",
      "architecture": "ARMv8-A",
      "full_name": "SHA1 Choose (A32)",
      "summary": "SHA1 hash update (Choose).",
      "syntax": "SHA1C.32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "Crypto 3-Reg",
        "binary_pattern": "11110010 | 0 | 0 | 0 | Vn | Vd | 0011 | N | Q | M | 0 | Vm",
        "hex_opcode": "0xF2000C00",
        "visual_parts": [
          {
            "raw": "11110010",
            "clean": "11110010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ]
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "State"
        },
        {
          "name": "Qn",
          "desc": "Hash"
        },
        {
          "name": "Qm",
          "desc": "Data"
        }
      ],
      "extension": "Crypto",
      "description": "SHA1 Choose function: updates SHA1 hash state by computing the Choose operation on 32-bit elements. This instruction performs a cryptographic hash round step specific to SHA1 and is part of the ARM Cryptographic Extension. No condition flags are affected. Available in A32 and T32 with Crypto extension support.",
      "example": "SHA1C.32 q0, q1, q2",
      "pseudocode": "Qd[127:96] ← SHA1_CHOOSE(Qd[127:96], Qn[127:96], Qm[127:96])\nQd[95:64] ← SHA1_CHOOSE(Qd[95:64], Qn[95:64], Qm[95:64])\nQd[63:32] ← SHA1_CHOOSE(Qd[63:32], Qn[63:32], Qm[63:32])\nQd[31:0] ← SHA1_CHOOSE(Qd[31:0], Qn[31:0], Qm[31:0])"
    },
    {
      "mnemonic": "sha1h",
      "architecture": "ARMv8-A",
      "full_name": "SHA1 Hash Update (A32)",
      "summary": "Updates SHA1 hash state.",
      "syntax": "SHA1H.32 <Qd>, <Qm>",
      "encoding": {
        "format": "Crypto 2-Reg",
        "binary_pattern": "11110011 | 1 | D | 11 | 10 | 10 | Vd | 00000 | Q | M | 1 | Vm",
        "hex_opcode": "0xF3B102C0",
        "visual_parts": [
          {
            "raw": "11110011",
            "clean": "11110011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "Crypto",
      "description": "SHA1 Hash Update: performs the final hash update step in the SHA1 algorithm by processing the hash state. This instruction computes the SHA1 hash finalization on four 32-bit words in parallel. No condition flags are affected. Available in A32 and T32 with Crypto extension support.",
      "example": "SHA1H.32 q0, q2",
      "pseudocode": "Qd[127:96] ← ROTATE_LEFT(Qm[127:96], 30)\nQd[95:64] ← ROTATE_LEFT(Qm[95:64], 30)\nQd[63:32] ← ROTATE_LEFT(Qm[63:32], 30)\nQd[31:0] ← ROTATE_LEFT(Qm[31:0], 30)"
    },
    {
      "mnemonic": "sha1m",
      "architecture": "ARMv8-A",
      "full_name": "SHA1 Majority (A32)",
      "summary": "SHA1 hash update (Majority).",
      "syntax": "SHA1M.32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "Crypto 3-Reg",
        "binary_pattern": "11110010 | 0 | 0 | 10 | Vn | Vd | 0011 | N | Q | M | 0 | Vm",
        "hex_opcode": "0xF2200C00",
        "visual_parts": [
          {
            "raw": "11110010",
            "clean": "11110010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "State"
        },
        {
          "name": "Qn",
          "desc": "Hash"
        },
        {
          "name": "Qm",
          "desc": "Data"
        }
      ],
      "extension": "Crypto",
      "description": "SHA1 Majority function: updates SHA1 hash state by computing the Majority operation on 32-bit elements. This instruction performs a cryptographic hash round step specific to SHA1 and is part of the ARM Cryptographic Extension. No condition flags are affected. Available in A32 and T32 with Crypto extension support.",
      "example": "SHA1M.32 q0, q1, q2",
      "pseudocode": "Qd[127:96] ← SHA1_MAJORITY(Qd[127:96], Qn[127:96], Qm[127:96])\nQd[95:64] ← SHA1_MAJORITY(Qd[95:64], Qn[95:64], Qm[95:64])\nQd[63:32] ← SHA1_MAJORITY(Qd[63:32], Qn[63:32], Qm[63:32])\nQd[31:0] ← SHA1_MAJORITY(Qd[31:0], Qn[31:0], Qm[31:0])"
    },
    {
      "mnemonic": "sha1p",
      "architecture": "ARMv8-A",
      "full_name": "SHA1 Parity (A32)",
      "summary": "SHA1 hash update (Parity).",
      "syntax": "SHA1P.32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "Crypto 3-Reg",
        "binary_pattern": "11110010 | 0 | 0 | 01 | Vn | Vd | 0011 | N | Q | M | 0 | Vm",
        "hex_opcode": "0xF2100C00",
        "visual_parts": [
          {
            "raw": "11110010",
            "clean": "11110010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "State"
        },
        {
          "name": "Qn",
          "desc": "Hash"
        },
        {
          "name": "Qm",
          "desc": "Data"
        }
      ],
      "extension": "Crypto",
      "description": "SHA1 Parity function: updates SHA1 hash state by computing the Parity operation on 32-bit elements. This instruction performs a cryptographic hash round step specific to SHA1 and is part of the ARM Cryptographic Extension. No condition flags are affected. Available in A32 and T32 with Crypto extension support.",
      "example": "SHA1P.32 q0, q1, q2",
      "pseudocode": "Qd[127:96] ← SHA1_PARITY(Qd[127:96], Qn[127:96], Qm[127:96])\nQd[95:64] ← SHA1_PARITY(Qd[95:64], Qn[95:64], Qm[95:64])\nQd[63:32] ← SHA1_PARITY(Qd[63:32], Qn[63:32], Qm[63:32])\nQd[31:0] ← SHA1_PARITY(Qd[31:0], Qn[31:0], Qm[31:0])"
    },
    {
      "mnemonic": "crc32b",
      "architecture": "ARMv8-A",
      "full_name": "CRC32 Byte (A32)",
      "summary": "CRC32 checksum update (Byte).",
      "syntax": "CRC32B<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00010 | 00 | 0 | Rn | Rd | 0 | 0 | 0 | 0 | 0100 | Rm",
        "hex_opcode": "0x01000040",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Acc"
        },
        {
          "name": "Rm",
          "desc": "Data"
        }
      ],
      "extension": "CRC",
      "description": "CRC32 Checksum Update (Byte): accumulates a 32-bit CRC checksum by processing a single byte from the input. Rd is updated with CRC32(Rn, Rm[7:0]) using the standard CRC32 polynomial. No condition flags are affected. Subject to condition code in A32; available in A32 only with CRC extension.",
      "example": "CRC32B r0, r1, r2",
      "pseudocode": "Rd ← CRC32_POLYNOMIAL(Rn, Rm[7:0])"
    },
    {
      "mnemonic": "crc32w",
      "architecture": "ARMv8-A",
      "full_name": "CRC32 Word (A32)",
      "summary": "CRC32 checksum update (Word).",
      "syntax": "CRC32W<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00010 | 10 | 0 | Rn | Rd | 0 | 0 | 0 | 0 | 0100 | Rm",
        "hex_opcode": "0x01400040",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Acc"
        },
        {
          "name": "Rm",
          "desc": "Data"
        }
      ],
      "extension": "CRC",
      "description": "CRC32 Checksum Update (Word): accumulates a 32-bit CRC checksum by processing a full 32-bit word from the input. Rd is updated with CRC32(Rn, Rm[31:0]) using the standard CRC32 polynomial. No condition flags are affected. Subject to condition code in A32; available in A32 only with CRC extension.",
      "example": "CRC32W r0, r1, r2",
      "pseudocode": "Rd ← CRC32_POLYNOMIAL(Rn, Rm[31:0])"
    },
    {
      "mnemonic": "smc",
      "architecture": "ARMv8-A",
      "full_name": "Secure Monitor Call (A32)",
      "summary": "Calls the Secure Monitor (EL3).",
      "syntax": "SMC<c> #<imm>",
      "encoding": {
        "format": "System",
        "binary_pattern": "cond | 00010 | 11 | 0 | 000000000000 | 0111 | imm4",
        "hex_opcode": "0x01600070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000000000000",
            "clean": "000000000000"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "A32 (System)",
      "description": "Secure Monitor Call: a synchronous exception that transitions execution to the Secure Monitor at EL3 to handle a secure service request. The immediate value encodes the SMC ID for the handler. This instruction requires Secure state; execution in Non-secure state is subject to the SMCNC trap. Subject to condition code in A32.",
      "example": "SMC #16",
      "pseudocode": "exception_taken ← 'SMC'\nELR_EL3 ← PC + 4\nSPSR_EL3 ← CPSR\nCPSR.M ← '10110' (Monitor mode)\nPC ← VECTOR_SMC"
    },
    {
      "mnemonic": "lda",
      "architecture": "ARMv8-A",
      "full_name": "Load Acquire (A32)",
      "summary": "Loads a word with Acquire semantics.",
      "syntax": "LDA<c> <Rt>, [<Rn>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 00011 | 00 | 1 | Rn | Rt | 1 | 1 | 0 | 0 | 1001 | 1111",
        "hex_opcode": "0x01900C9F",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Load Acquire: loads a 32-bit word from memory with Acquire semantics, ensuring memory synchronization and preventing subsequent memory operations from being reordered before this load. The address is computed from Rn (no offset). No condition flags are affected. Subject to condition code in A32; available in A32 with Atomic extension.",
      "example": "LDA r3, [r1]",
      "pseudocode": "Rt ← [Rn]\nAcquire_Semantics()"
    },
    {
      "mnemonic": "stl",
      "architecture": "ARMv8-A",
      "full_name": "Store Release (A32)",
      "summary": "Stores a word with Release semantics.",
      "syntax": "STL<c> <Rt>, [<Rn>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 00011 | 00 | 0 | Rn | 1111 | 1 | 1 | 0 | 0 | 1001 | Rt",
        "hex_opcode": "0x0180FC90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Stores a 32-bit word to memory with Release semantics, ensuring all prior memory operations are visible to other observers before the store completes. No condition flags are affected. This is an A32-only instruction that provides atomic release semantics for synchronization.",
      "example": "STL r3, [r1]",
      "pseudocode": "address ← Rn\nMemoryOrder ← Release\n[address] ← Rt[31:0]\nDRAIN_RELEASE_BARRIER()"
    },
    {
      "mnemonic": "ldaex",
      "architecture": "ARMv8-A",
      "full_name": "Load Acquire Exclusive (A32)",
      "summary": "Loads a word with Acquire Exclusive semantics.",
      "syntax": "LDAEX<c> <Rt>, [<Rn>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 00011 | 00 | 1 | Rn | Rt | 1 | 1 | 1 | 0 | 1001 | 1111",
        "hex_opcode": "0x01900E9F",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Loads a 32-bit word from memory with Acquire Exclusive semantics, allowing subsequent memory operations to observe earlier loads and stores. The processor acquires exclusive access to the address for potential paired store-exclusive. No condition flags are affected. This is an A32-only instruction.",
      "example": "LDAEX r3, [r1]",
      "pseudocode": "address ← Rn\nMemoryOrder ← Acquire\nRt ← [address]\nSET_EXCLUSIVE_MONITOR(address)\nDRAIN_ACQUIRE_BARRIER()"
    },
    {
      "mnemonic": "stlex",
      "architecture": "ARMv8-A",
      "full_name": "Store Release Exclusive (A32)",
      "summary": "Stores a word with Release Exclusive semantics.",
      "syntax": "STLEX<c> <Rd>, <Rt>, [<Rn>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 00011 | 00 | 0 | Rn | Rd | 1 | 1 | 1 | 0 | 1001 | Rt",
        "hex_opcode": "0x01800E90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Status"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Atomically stores a 32-bit word to memory with Release semantics and exclusive access, writing status to Rd. This A32 instruction is used for inter-processor synchronization and memory ordering. The status register Rd is written with 0 on success or 1 on failure; no condition flags are affected.",
      "example": "STLEX r0, r3, [r1]",
      "pseudocode": "if ExclusiveAccess[Rn] then\n  [Rn] ← Rt\n  Rd ← 0\n  ClearExclusiveAccess()\nelse\n  Rd ← 1"
    },
    {
      "mnemonic": "bfdot",
      "architecture": "ARMv8-A",
      "full_name": "BFloat16 Dot Product (NEON)",
      "summary": "Computes dot product of BFloat16 elements, accumulating to Float32 (NEON).",
      "syntax": "BFDOT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "0 | Q | 1 | 01110 | 01 | 0 | Rm | 1 | 1111 | 1 | Rn | Rd",
        "hex_opcode": "0x2E40FC00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest (F32)"
        },
        {
          "name": "Vn",
          "desc": "Src1 (BF16)"
        },
        {
          "name": "Vm",
          "desc": "Src2 (BF16)"
        }
      ],
      "extension": "FEAT_BF16 (AI)",
      "description": "Computes the dot product of BFloat16 pairs from two NEON vectors and accumulates the Float32 result into the destination vector. Requires FEAT_BF16. No flags are affected. Operates on 128-bit NEON vectors with BFloat16 source elements.",
      "example": "BFDOT v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements-1 do\n  product ← BF16_to_F32(Vn[2*i]) × BF16_to_F32(Vm[2*i]) +\n            BF16_to_F32(Vn[2*i+1]) × BF16_to_F32(Vm[2*i+1])\n  Vd[i] ← Vd[i] + product\nend for"
    },
    {
      "mnemonic": "bfmmla",
      "architecture": "ARMv8-A",
      "full_name": "BFloat16 Matrix Multiply-Accumulate (NEON)",
      "summary": "Performs 2x2 matrix multiplication on BFloat16 tiles (NEON).",
      "syntax": "BFMMLA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "0 | 1 | 1 | 01110 | 01 | 0 | Rm | 1 | 1101 | 1 | Rn | Rd",
        "hex_opcode": "0x6E40EC00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_BF16 (AI)",
      "description": "Performs a 2×2 matrix multiply-accumulate operation on BFloat16 tiles, accumulating the result into Float32 elements of the destination vector. Requires FEAT_BF16. No flags are affected. Operates on 128-bit NEON vectors.",
      "example": "BFMMLA v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to 1 do\n  for j = 0 to 1 do\n    sum ← Vd[i*2+j]\n    for k = 0 to 1 do\n      sum ← sum + (BF16_to_F32(Vn[i*2+k]) × BF16_to_F32(Vm[k*2+j]))\n    end for\n    Vd[i*2+j] ← sum\n  end for\nend for"
    },
    {
      "mnemonic": "bfcvtn",
      "architecture": "ARMv8-A",
      "full_name": "BFloat16 Convert Narrow (NEON)",
      "summary": "Converts Float32 to BFloat16 (Lower Half).",
      "syntax": "BFCVTN <Vd>.<Tb>, <Vn>.<Ta>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "0 | Q | 0 | 01110 | 10 | 10000 | 10110 | 10 | Rn | Rd",
        "hex_opcode": "0x0EA16800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10110",
            "clean": "10110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest (BF16)"
        },
        {
          "name": "Vn",
          "desc": "Src (F32)"
        }
      ],
      "extension": "FEAT_BF16 (AI)",
      "description": "Converts Float32 values from the first half of the source vector to BFloat16 format and stores them in the lower half of the destination vector, leaving the upper half unchanged. Requires FEAT_BF16. No flags are affected. Operates on NEON vectors.",
      "example": "BFCVTN v0.4s.Tb, v1.4s.Ta",
      "pseudocode": "for i = 0 to 3 do\n  Vd[i] ← F32_to_BF16(Vn[i])\nend for\nVd[8:4] ← Vd[8:4]  // Upper half unchanged"
    },
    {
      "mnemonic": "bfcvtn2",
      "architecture": "ARMv8-A",
      "full_name": "BFloat16 Convert Narrow High (NEON)",
      "summary": "Converts Float32 to BFloat16 (Upper Half).",
      "syntax": "BFCVTN2 <Vd>.<Tb>, <Vn>.<Ta>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "0 | Q | 0 | 01110 | 10 | 10000 | 10110 | 10 | Rn | Rd",
        "hex_opcode": "0x0EA16800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10110",
            "clean": "10110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest (BF16)"
        },
        {
          "name": "Vn",
          "desc": "Src (F32)"
        }
      ],
      "extension": "FEAT_BF16 (AI)",
      "description": "Converts Float32 values from the source vector to BFloat16 format and stores them in the upper half of the destination vector, leaving the lower half unchanged. Requires FEAT_BF16. No flags are affected. Operates on NEON vectors.",
      "example": "BFCVTN2 v0.4s.Tb, v1.4s.Ta",
      "pseudocode": "for i = 0 to 3 do\n  Vd[i+4] ← F32_to_BF16(Vn[i])\nend for\nVd[3:0] ← Vd[3:0]  // Lower half unchanged"
    },
    {
      "mnemonic": "smmla",
      "architecture": "ARMv8-A",
      "full_name": "Signed Integer Matrix Multiply-Accumulate (NEON)",
      "summary": "Performs 2x2 matrix multiplication on Signed Int8 tiles.",
      "syntax": "SMMLA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "0 | 1 | 0 | 01110 | 10 | 0 | Rm | 1010 | 0 | 1 | Rn | Rd",
        "hex_opcode": "0x4E80A400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_I8MM (AI)",
      "description": "Performs a 2×2 signed integer matrix multiply-accumulate operation on Int8 tiles, accumulating the result into Int32 elements of the destination vector. Requires FEAT_I8MM. No flags are affected. Operates on 128-bit NEON vectors.",
      "example": "SMMLA v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to 1 do\n  for j = 0 to 1 do\n    sum ← Vd[i*4+j*4 : i*4+j*4+31]\n    for k = 0 to 1 do\n      sum ← sum + (SignExtend(Vn[i*4+k*4 : i*4+k*4+7]) × SignExtend(Vm[k*4+j*4 : k*4+j*4+7]))\n    end for\n    Vd[i*4+j*4 : i*4+j*4+31] ← sum\n  end for\nend for"
    },
    {
      "mnemonic": "ummla",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Integer Matrix Multiply-Accumulate (NEON)",
      "summary": "Performs 2x2 matrix multiplication on Unsigned Int8 tiles.",
      "syntax": "UMMLA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "0 | 1 | 1 | 01110 | 10 | 0 | Rm | 1010 | 0 | 1 | Rn | Rd",
        "hex_opcode": "0x6E80A400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_I8MM (AI)",
      "description": "Performs a 2×2 unsigned integer matrix multiply-accumulate operation on Int8 tiles, accumulating the result into Int32 elements of the destination vector. Requires FEAT_I8MM. No flags are affected. Operates on 128-bit NEON vectors.",
      "example": "UMMLA v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to 1 do\n  for j = 0 to 1 do\n    sum ← Vd[i*4+j*4 : i*4+j*4+31]\n    for k = 0 to 1 do\n      sum ← sum + (ZeroExtend(Vn[i*4+k*4 : i*4+k*4+7]) × ZeroExtend(Vm[k*4+j*4 : k*4+j*4+7]))\n    end for\n    Vd[i*4+j*4 : i*4+j*4+31] ← sum\n  end for\nend for"
    },
    {
      "mnemonic": "usmmla",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned-Signed Matrix Multiply-Accumulate (NEON)",
      "summary": "Matrix multiply Unsigned Int8 with Signed Int8.",
      "syntax": "USMMLA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "0 | 1 | 0 | 01110 | 10 | 0 | Rm | 1010 | 1 | 1 | Rn | Rd",
        "hex_opcode": "0x4E80AC00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "Unsigned"
        },
        {
          "name": "Vm",
          "desc": "Signed"
        }
      ],
      "extension": "FEAT_I8MM (AI)",
      "description": "Performs an unsigned-signed 8-bit integer matrix multiply-accumulate operation, multiplying unsigned Int8 elements from Vn with signed Int8 elements from Vm and accumulating the results into Vd. This instruction operates on 128-bit NEON vectors and requires the FEAT_I8MM (Advanced SIMD and Floating-point Extension 2) architectural feature. No condition flags are affected; this is an AArch64-only instruction.",
      "example": "USMMLA v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for e = 0 to (128 / 32) - 1\n  Vd[e] ← Vd[e] + (Vn[4×e:4×e+3] × Vm[4×e:4×e+3])\n  // Each element is 32-bit int32, products of 4×uint8 × 4×sint8"
    },
    {
      "mnemonic": "usdot",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned-Signed Dot Product (NEON)",
      "summary": "Dot product of Unsigned Int8 and Signed Int8.",
      "syntax": "USDOT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "0 | Q | 0 | 01110 | 10 | 0 | Rm | 1 | 0011 | 1 | Rn | Rd",
        "hex_opcode": "0x0E809C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "Unsigned"
        },
        {
          "name": "Vm",
          "desc": "Signed"
        }
      ],
      "extension": "FEAT_I8MM (AI)",
      "description": "Performs an unsigned-signed 8-bit integer dot product, multiplying unsigned Int8 elements from Vn with signed Int8 elements from Vm and accumulating into 32-bit integer lanes of Vd. This instruction operates on 128-bit NEON vectors and requires the FEAT_I8MM architectural feature. No condition flags are affected; this is an AArch64-only instruction.",
      "example": "USDOT v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for e = 0 to (128 / 32) - 1\n  Vd[e] ← Vd[e] + (uint(Vn[4×e]) × sint(Vm[4×e]) +\n                   uint(Vn[4×e+1]) × sint(Vm[4×e+1]) +\n                   uint(Vn[4×e+2]) × sint(Vm[4×e+2]) +\n                   uint(Vn[4×e+3]) × sint(Vm[4×e+3]))\n  // Each Vd[e] is a 32-bit signed result"
    },
    {
      "mnemonic": "sudot",
      "architecture": "ARMv8-A",
      "full_name": "Signed-Unsigned Dot Product (NEON)",
      "summary": "Dot product of Signed Int8 and Unsigned Int8 (Indexed).",
      "syntax": "SUDOT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>[<index>]",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "0 | Q | 0 | 01111 | 0 | 0 | L | M | Rm | 1111 | H | 0 | Rn | Rd",
        "hex_opcode": "0x0F00F000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01111",
            "clean": "01111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "L",
            "clean": "L"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "H",
            "clean": "H"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "Signed"
        },
        {
          "name": "Vm",
          "desc": "Unsigned"
        }
      ],
      "extension": "FEAT_I8MM (AI)",
      "description": "Performs a signed-unsigned 8-bit integer dot product with an indexed operand, multiplying signed Int8 elements from Vn with unsigned Int8 elements from a specific 32-bit lane of Vm and accumulating into 32-bit integer lanes of Vd. This instruction operates on 128-bit NEON vectors and requires the FEAT_I8MM architectural feature. No condition flags are affected; this is an AArch64-only instruction.",
      "example": "SUDOT v0.4s.T, v1.4s.T, v2.4s.T[index]",
      "pseudocode": "// Vm is indexed; extract the 32-bit lane containing 4 unsigned Int8 values\nfor e = 0 to (128 / 32) - 1\n  lane_data ← Vm[32×index + 0 : 32×index + 31]\n  Vd[e] ← Vd[e] + (sint(Vn[4×e]) × uint(lane_data[7:0]) +\n                   sint(Vn[4×e+1]) × uint(lane_data[15:8]) +\n                   sint(Vn[4×e+2]) × uint(lane_data[23:16]) +\n                   sint(Vn[4×e+3]) × uint(lane_data[31:24]))\n  // Each Vd[e] is a 32-bit signed result"
    },
    {
      "mnemonic": "mrrs",
      "architecture": "ARMv8-A",
      "full_name": "Move to Two Registers from System Register (128-bit)",
      "summary": "Reads a 128-bit system register into two general-purpose registers.",
      "syntax": "MRRS <Xt>, <Xt+1>, <sysreg>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010101 | 1 | 1 | o0 | op1 | CRn | CRm | op2 | Rt",
        "hex_opcode": "0xD5700000",
        "visual_parts": [
          {
            "raw": "1101010101",
            "clean": "1101010101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "o0",
            "clean": "o0"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20 | 19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Lo"
        },
        {
          "name": "Xt+1",
          "desc": "Hi"
        },
        {
          "name": "sysreg",
          "desc": "Reg"
        }
      ],
      "extension": "FEAT_SYSREG128",
      "description": "Reads a 128-bit system register into two consecutive 64-bit general-purpose registers (Xt and Xt+1). This is an AArch64-only instruction requiring FEAT_SYSREG128 and may require elevated privilege depending on the system register being accessed. No condition flags are affected.",
      "example": "MRRS x3, Xt+1, sysreg",
      "pseudocode": "Xt ← SYSREG[sysreg][63:0]\nXt+1 ← SYSREG[sysreg][127:64]"
    },
    {
      "mnemonic": "msrr",
      "architecture": "ARMv8-A",
      "full_name": "Move Two Registers to System Register (128-bit)",
      "summary": "Writes two general-purpose registers into a 128-bit system register.",
      "syntax": "MSRR <sysreg>, <Xt>, <Xt+1>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010101 | 0 | 1 | o0 | op1 | CRn | CRm | op2 | Rt",
        "hex_opcode": "0xD5500000",
        "visual_parts": [
          {
            "raw": "1101010101",
            "clean": "1101010101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "o0",
            "clean": "o0"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20 | 19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "sysreg",
          "desc": "Reg"
        },
        {
          "name": "Xt",
          "desc": "Lo"
        },
        {
          "name": "Xt+1",
          "desc": "Hi"
        }
      ],
      "extension": "FEAT_SYSREG128",
      "description": "Writes two consecutive 64-bit general-purpose registers (Xt and Xt+1) into a 128-bit system register. This is an AArch64-only instruction requiring FEAT_SYSREG128 and may require elevated privilege depending on the system register being accessed. No condition flags are affected.",
      "example": "MSRR sysreg, x3, Xt+1",
      "pseudocode": "SYSREG[sysreg][63:0] ← Xt\nSYSREG[sysreg][127:64] ← Xt+1"
    },
    {
      "mnemonic": "irg",
      "architecture": "ARMv8-A",
      "full_name": "Insert Random Tag",
      "summary": "Inserts a random Allocation Tag into a pointer (MTE).",
      "syntax": "IRG <Xd|SP>, <Xn|SP>{, <Xm>}",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 0 | 0 | 11010110 | Xm | 000100 | Xn | Xd",
        "hex_opcode": "0x9AC01000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Xm",
            "clean": "Xm"
          },
          {
            "raw": "000100",
            "clean": "000100"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xd",
            "clean": "Xd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Dest Ptr"
        },
        {
          "name": "Xn",
          "desc": "Src Ptr"
        },
        {
          "name": "Xm",
          "desc": "Exclude Mask"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Inserts a randomly selected Allocation Tag into a pointer held in Xn or SP, optionally excluding tags specified by a mask in Xm, and stores the result in Xd or SP. This instruction is only available in AArch64 and requires the MTE (Memory Tagging Extension) feature. The random tag selection is unpredictable from software perspective; no condition flags are affected.",
      "example": "IRG x0, x1",
      "pseudocode": "if Xm is not present then\n  exclude_mask ← 0x0000000000000000\nelse\n  exclude_mask ← Xm\ntag ← random_tag_not_in(exclude_mask)\nXd ← (Xn & ~0xF000000000000000) | (tag << 56)"
    },
    {
      "mnemonic": "gmi",
      "architecture": "ARMv8-A",
      "full_name": "Get Memory Tag Intersection",
      "summary": "Calculates a mask of excluded tags (MTE).",
      "syntax": "GMI <Xd>, <Xn|SP>, <Xm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 0 | 0 | 11010110 | Xm | 000101 | Xn | Xd",
        "hex_opcode": "0x9AC01400",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Xm",
            "clean": "Xm"
          },
          {
            "raw": "000101",
            "clean": "000101"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xd",
            "clean": "Xd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Dest Mask"
        },
        {
          "name": "Xn",
          "desc": "Ptr"
        },
        {
          "name": "Xm",
          "desc": "Excluded"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Calculates the intersection of an Allocation Tag mask (tags excluded from Xm) with tags that are NOT present in the pointer Xn, returning a 16-bit mask of valid alternative tags in Xd. This instruction is only available in AArch64 and requires the MTE feature. No condition flags are affected.",
      "example": "GMI x0, x1, x2",
      "pseudocode": "ptr_tag ← (Xn >> 56) & 0xF\nexclude_mask ← Xm & 0xFFFF\nvalid_tags ← ~exclude_mask & 0xFFFF\n// Return mask of tags that are both valid (not excluded) and different from current tag\nXd ← valid_tags & ~(1 << ptr_tag)"
    },
    {
      "mnemonic": "ldg",
      "architecture": "ARMv8-A",
      "full_name": "Load Allocation Tag",
      "summary": "Loads the Allocation Tag from memory.",
      "syntax": "LDG <Xt>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "11011001 | 01 | 1 | imm9 | 00 | Xn | Xt",
        "hex_opcode": "0xD9600000",
        "visual_parts": [
          {
            "raw": "11011001",
            "clean": "11011001"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xt",
            "clean": "Xt"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Transfer 64-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Loads the Allocation Tag from a 16-byte granule in memory at address [Xn + simm] and places it into the tag field (bits [59:56]) of Xt, with the lower 56 bits zeroed. This instruction is only available in AArch64 and requires the MTE feature. The simm9 immediate is scaled by 16 (granule size). No condition flags are affected.",
      "example": "LDG x3, [x1, #-8]",
      "pseudocode": "address ← Xn + (simm << 4)  // simm is a signed 9-bit value, scaled by 16\nmemory_tag ← load_tag_from_memory(address)\nXt ← (memory_tag << 56) & 0xF000000000000000"
    },
    {
      "mnemonic": "stg",
      "architecture": "ARMv8-A",
      "full_name": "Store Allocation Tag",
      "summary": "Stores the Allocation Tag to memory.",
      "syntax": "STG <Xt|SP>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "11011001 | 00 | 1 | imm9 | 01 | Xn | Xt",
        "hex_opcode": "0xD9200400",
        "visual_parts": [
          {
            "raw": "11011001",
            "clean": "11011001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xt",
            "clean": "Xt"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Tag Src"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Stores the Allocation Tag from Xt (bits [59:56]) into the tag storage of a 16-byte granule at address [Xn + simm]. This instruction is only available in AArch64 and requires the MTE feature. The simm9 immediate is scaled by 16. Data in the granule is not modified. No condition flags are affected.",
      "example": "STG Xt, [x1, #-8]",
      "pseudocode": "address ← Xn + (simm << 4)  // simm is a signed 9-bit value, scaled by 16\ntag_to_store ← (Xt >> 56) & 0xF\nstore_tag_to_memory(address, tag_to_store)"
    },
    {
      "mnemonic": "stzg",
      "architecture": "ARMv8-A",
      "full_name": "Store Allocation Tag and Zero",
      "summary": "Stores the Allocation Tag and zeros the data granule.",
      "syntax": "STZG <Xt|SP>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "11011001 | 01 | 1 | imm9 | 10 | Xn | Xt",
        "hex_opcode": "0xD9600800",
        "visual_parts": [
          {
            "raw": "11011001",
            "clean": "11011001"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xt",
            "clean": "Xt"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Tag Src"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Stores the Allocation Tag from Xt (bits [59:56]) into tag storage at address [Xn + simm] and simultaneously zeros all 16 bytes of the data granule at that address. This instruction is only available in AArch64 and requires the MTE feature. The simm9 immediate is scaled by 16. No condition flags are affected; this is a combined tag-write and memory-zero operation.",
      "example": "STZG Xt, [x1, #-8]",
      "pseudocode": "address ← Xn + (simm << 4)  // simm is a signed 9-bit value, scaled by 16\ntag_to_store ← (Xt >> 56) & 0xF\nstore_tag_to_memory(address, tag_to_store)\nfor i = 0 to 15\n  memory[address + i] ← 0"
    },
    {
      "mnemonic": "st2g",
      "architecture": "ARMv8-A",
      "full_name": "Store Allocation Tag (Two Granules)",
      "summary": "Stores the Allocation Tag to two memory granules.",
      "syntax": "ST2G <Xt|SP>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "11011001 | 10 | 1 | imm9 | 10 | Xn | Xt",
        "hex_opcode": "0xD9A00800",
        "visual_parts": [
          {
            "raw": "11011001",
            "clean": "11011001"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xt",
            "clean": "Xt"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Source Tag"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Stores the Allocation Tag from Xt to two consecutive 16-byte memory granules at [Xn + offset]. The offset is scaled by 16. Both granules receive the same tag. No condition flags are affected. AArch64-only; requires MTE extension.",
      "example": "ST2G Xt, [x1, #-8]",
      "pseudocode": "address ← Xn + (SignExtend(imm9, 9) << 4)\ntag ← GetAllocationTag(Xt)\nmemory[address] ← memory[address] with tag set to tag\nmemory[address + 16] ← memory[address + 16] with tag set to tag"
    },
    {
      "mnemonic": "stgp",
      "architecture": "ARMv8-A",
      "full_name": "Store Allocation Tag and Pair",
      "summary": "Stores Tag and two 64-bit data values.",
      "syntax": "STGP <Xt>, <Xt2>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "01 | 101 | 0 | 010 | 0 | simm7 | Xt2 | Xn | Xt",
        "hex_opcode": "0x69000000",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "simm7",
            "clean": "simm7"
          },
          {
            "raw": "Xt2",
            "clean": "Xt2"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xt",
            "clean": "Xt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:23 | 22 | 21:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Data 1"
        },
        {
          "name": "Xt2",
          "desc": "Data 2"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Stores the Allocation Tag to a 16-byte memory address and simultaneously stores two 64-bit values from Xt and Xt2 (the pair register following Xt). The tag is derived from Xt, and the offset is scaled by 16. This instruction requires MTE support, does not modify the condition flags, and operates only in AArch64 execution state.",
      "example": "STGP x3, x4, [x1, #-8]",
      "pseudocode": "address ← (Xn | SP) + (simm7 << 4)\ntag ← Xt[3:0]\nmemory[address:address+7] ← Xt[63:0]\nmemory[address+8:address+15] ← Xt2[63:0]\nmemory[address][3:0] ← tag"
    },
    {
      "mnemonic": "subp",
      "architecture": "ARMv8-A",
      "full_name": "Subtract Pointers",
      "summary": "Subtracts pointers ignoring Tags.",
      "syntax": "SUBP <Xd>, <Xn|SP>, <Xm|SP>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 0 | 0 | 11010110 | Xm | 000000 | Xn | Xd",
        "hex_opcode": "0x9AC00000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Xm",
            "clean": "Xm"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xd",
            "clean": "Xd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "Ptr 1"
        },
        {
          "name": "Xm",
          "desc": "Ptr 2"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Subtracts the pointer in Xm from the pointer in Xn, removing any Allocation Tags from both operands before performing the subtraction. The result is stored in Xd. This instruction does not modify the condition flags and operates only in AArch64 execution state with MTE support.",
      "example": "SUBP x0, x1, x2",
      "pseudocode": "Xd ← (Xn | SP)[55:0] - (Xm | SP)[55:0]"
    },
    {
      "mnemonic": "pacia",
      "architecture": "ARMv8-A",
      "full_name": "Pointer Authentication Code (Inst A)",
      "summary": "Signs a pointer in Xd using Key A and modifier Xm (or SP).",
      "syntax": "PACIA <Xd>, <Xn|SP>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 000 | Rn | Rd",
        "hex_opcode": "0xDAC10000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Ptr"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Signs the pointer in Xd using the Instruction key A and a modifier from Xn or SP, storing the Pointer Authentication Code (PAC) in the high bits of Xd. The instruction does not modify the condition flags and operates only in AArch64 execution state with PAC support. The operation is implementation-defined; a PACIA PACIASP variant uses SP as the modifier when Xn is omitted.",
      "example": "PACIA x0, x1",
      "pseudocode": "modifier ← Xn | SP\nXd ← AddPAC(Xd, modifier, key_a, instruction_key)"
    },
    {
      "mnemonic": "pacib",
      "architecture": "ARMv8-A",
      "full_name": "Pointer Authentication Code (Inst B)",
      "summary": "Signs a pointer in Xd using Key B.",
      "syntax": "PACIB <Xd>, <Xn|SP>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 001 | Rn | Rd",
        "hex_opcode": "0xDAC10400",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Ptr"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Signs the pointer in Xd using the Instruction key B and a modifier from Xn or SP, storing the Pointer Authentication Code (PAC) in the high bits of Xd. The instruction does not modify the condition flags and operates only in AArch64 execution state with PAC support. The operation is implementation-defined; a PACIB PACIBSP variant uses SP as the modifier when Xn is omitted.",
      "example": "PACIB x0, x1",
      "pseudocode": "modifier ← Xn | SP\nXd ← AddPAC(Xd, modifier, key_b, instruction_key)"
    },
    {
      "mnemonic": "pacda",
      "architecture": "ARMv8-A",
      "full_name": "Pointer Authentication Code (Data A)",
      "summary": "Signs a data pointer using Key A.",
      "syntax": "PACDA <Xd>, <Xn|SP>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 010 | Rn | Rd",
        "hex_opcode": "0xDAC10800",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Ptr"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Signs the data pointer in Xd using the Data key A and a modifier from Xn or SP, storing the Pointer Authentication Code (PAC) in the high bits of Xd. The instruction does not modify the condition flags and operates only in AArch64 execution state with PAC support. The operation is implementation-defined and typically used for signing data pointers rather than instruction pointers.",
      "example": "PACDA x0, x1",
      "pseudocode": "modifier ← Xn | SP\nXd ← AddPAC(Xd, modifier, key_a, data_key)"
    },
    {
      "mnemonic": "pacdb",
      "architecture": "ARMv8-A",
      "full_name": "Pointer Authentication Code (Data B)",
      "summary": "Signs a data pointer using Key B.",
      "syntax": "PACDB <Xd>, <Xn|SP>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 011 | Rn | Rd",
        "hex_opcode": "0xDAC10C00",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Ptr"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Signs the data pointer in Xd using the Data key B and a modifier from Xn or SP, storing the Pointer Authentication Code (PAC) in the high bits of Xd. The instruction does not modify the condition flags and operates only in AArch64 execution state with PAC support. The operation is implementation-defined and typically used for signing data pointers rather than instruction pointers.",
      "example": "PACDB x0, x1",
      "pseudocode": "modifier ← Xn | SP\nXd ← AddPAC(Xd, modifier, key_b, data_key)"
    },
    {
      "mnemonic": "autia",
      "architecture": "ARMv8-A",
      "full_name": "Authenticate Code (Inst A)",
      "summary": "Authenticates a pointer signed with Key A. Corrupts pointer if failed.",
      "syntax": "AUTIA <Xd>, <Xn|SP>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 100 | Rn | Rd",
        "hex_opcode": "0xDAC11000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Ptr"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Authenticates a 64-bit pointer in Xd using Key A and a modifier from Xn or SP. If authentication fails, the pointer is corrupted with a known bit pattern. This instruction is AArch64-only and requires the PAC (Pointer Authentication Code) extension. It does not affect the condition flags (N, Z, C, V) but may generate an exception if executed in an inappropriate context.",
      "example": "AUTIA x0, x1",
      "pseudocode": "authenticated_pointer ← AuthenticatePointer(Xd, Xn, KeyA)\nif authentication_fails then\n  Xd ← corrupted_value\nelse\n  Xd ← authenticated_pointer\nend if"
    },
    {
      "mnemonic": "autib",
      "architecture": "ARMv8-A",
      "full_name": "Authenticate Code (Inst B)",
      "summary": "Authenticates a pointer signed with Key B.",
      "syntax": "AUTIB <Xd>, <Xn|SP>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 101 | Rn | Rd",
        "hex_opcode": "0xDAC11400",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Ptr"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Authenticates a 64-bit pointer in Xd using Key B and a modifier from Xn or SP. If authentication fails, the pointer is corrupted with a known bit pattern. This instruction is AArch64-only and requires the PAC (Pointer Authentication Code) extension. It does not affect the condition flags (N, Z, C, V) but may generate an exception if executed in an inappropriate context.",
      "example": "AUTIB x0, x1",
      "pseudocode": "authenticated_pointer ← AuthenticatePointer(Xd, Xn, KeyB)\nif authentication_fails then\n  Xd ← corrupted_value\nelse\n  Xd ← authenticated_pointer\nend if"
    },
    {
      "mnemonic": "xpaci",
      "architecture": "ARMv8-A",
      "full_name": "Strip Pointer Authentication Code (Inst)",
      "summary": "Removes the PAC signature from an instruction pointer.",
      "syntax": "XPACI <Xd>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 01000 | 0 | 11111 | Rd",
        "hex_opcode": "0xDAC143E0",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "01000",
            "clean": "01000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Ptr"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Strips the Pointer Authentication Code from a 64-bit instruction pointer in Xd without verifying the signature. This instruction is AArch64-only and requires the PAC extension. The condition flags (N, Z, C, V) are not affected, and the operation is not privileged.",
      "example": "XPACI x0",
      "pseudocode": "Xd ← StripPAC(Xd, InstructionPointer)"
    },
    {
      "mnemonic": "xpacd",
      "architecture": "ARMv8-A",
      "full_name": "Strip Pointer Authentication Code (Data)",
      "summary": "Removes the PAC signature from a data pointer.",
      "syntax": "XPACD <Xd>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 01000 | 1 | 11111 | Rd",
        "hex_opcode": "0xDAC147E0",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "01000",
            "clean": "01000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Ptr"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Strips the Pointer Authentication Code from a 64-bit data pointer in Xd without verifying the signature. This instruction is AArch64-only and requires the PAC extension. The condition flags (N, Z, C, V) are not affected, and the operation is not privileged.",
      "example": "XPACD x0",
      "pseudocode": "Xd ← StripPAC(Xd, DataPointer)"
    },
    {
      "mnemonic": "ldraa",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Authenticate (Key A)",
      "summary": "Loads a value, authenticating the address with Key A.",
      "syntax": "LDRAA <Xt>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "11 | 111 | 0 | 00 | 0 | S | 1 | imm9 | 0 | 1 | Rn | Rt",
        "hex_opcode": "0xF8200400",
        "visual_parts": [
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Transfer 64-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Loads a 64-bit value from memory using an address authenticated with Pointer Authentication Code (PAC) using Key A. The address is computed from a base register and a signed 9-bit immediate offset. This AArch64-only instruction requires PAC support and will generate an Authentication Failure exception if authentication fails; no condition flags are affected.",
      "example": "LDRAA x3, [x1, #-8]",
      "pseudocode": "address ← Xn|SP + (simm9 << 3)\nauthenticated_address ← AuthenticateAddressA(address)\nXt ← [authenticated_address]"
    },
    {
      "mnemonic": "ldrab",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Authenticate (Key B)",
      "summary": "Loads a value, authenticating the address with Key B.",
      "syntax": "LDRAB <Xt>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "11 | 111 | 0 | 00 | 1 | S | 1 | imm9 | 0 | 1 | Rn | Rt",
        "hex_opcode": "0xF8A00400",
        "visual_parts": [
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Transfer 64-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Loads a 64-bit value from memory using an address authenticated with Pointer Authentication Code (PAC) using Key B. The address is computed from a base register and a signed 9-bit immediate offset. This AArch64-only instruction requires PAC support and will generate an Authentication Failure exception if authentication fails; no condition flags are affected.",
      "example": "LDRAB x3, [x1, #-8]",
      "pseudocode": "address ← Xn|SP + (simm9 << 3)\nauthenticated_address ← AuthenticateAddressB(address)\nXt ← [authenticated_address]"
    },
    {
      "mnemonic": "bti",
      "architecture": "ARMv8-A",
      "full_name": "Branch Target Identification",
      "summary": "Marks a valid target for indirect branches (Guard against JOP/ROP).",
      "syntax": "BTI <target>",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "11010101000000110010 | 0100 | op2 | 11111",
        "hex_opcode": "0xD503241F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "target",
          "desc": "J/C/JC"
        }
      ],
      "extension": "BTI (Security)",
      "description": "Marks a valid branch target for indirect branch instructions, providing defense against Jump-Oriented Programming (JOP) and Return-Oriented Programming (ROP) attacks. This instruction is AArch64-only and requires the BTI (Branch Target Identification) extension. It does not affect condition flags and acts as a hint; execution continues to the next instruction.",
      "example": "BTI target",
      "pseudocode": "if not_valid_branch_target and branch_target_enforcement_enabled then\n  GenerateException(BTYPE_mismatch)\nelse\n  NOP\nend if"
    },
    {
      "mnemonic": "rndr",
      "architecture": "ARMv8-A",
      "full_name": "Random Number",
      "summary": "Reads a random number from hardware entropy source.",
      "syntax": "RNDR <Xt>",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101001 | 00011 | 0011 | 0010 | 010 | Rt",
        "hex_opcode": "0xD53B2400",
        "visual_parts": [
          {
            "raw": "11010101001",
            "clean": "11010101001"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ]
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Transfer 64-bit integer register (load/store)"
        }
      ],
      "extension": "FEAT_RNG",
      "description": "Reads a 64-bit random number from the system's hardware entropy source and writes it to Xt. This instruction is AArch64-only and requires the FEAT_RNG extension. It does not modify condition flags and may set the C flag to indicate failure (entropy unavailable), depending on implementation.",
      "example": "RNDR x3",
      "pseudocode": "Xt ← HardwareRandomNumber()\nif entropy_available then\n  C ← 0\nelse\n  C ← 1\nend if"
    },
    {
      "mnemonic": "rndrrs",
      "architecture": "ARMv8-A",
      "full_name": "Random Number Reseed",
      "summary": "Reads a random number and requests reseed.",
      "syntax": "RNDRRS <Xt>",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101001 | 00011 | 0011 | 0010 | 011 | Rt",
        "hex_opcode": "0xD53B2600",
        "visual_parts": [
          {
            "raw": "11010101001",
            "clean": "11010101001"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ]
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Transfer 64-bit integer register (load/store)"
        }
      ],
      "extension": "FEAT_RNG",
      "description": "Reads a 64-bit random number from the hardware entropy source, writes it to Xt, and requests a reseed of the entropy generator. This instruction is AArch64-only and requires the FEAT_RNG extension. It may set the C flag to indicate entropy availability, similar to RNDR.",
      "example": "RNDRRS x3",
      "pseudocode": "Xt ← HardwareRandomNumber()\nRequestReseed(entropy_generator)\nif entropy_available then\n  C ← 0\nelse\n  C ← 1\nend if"
    },
    {
      "mnemonic": "cfinv",
      "architecture": "ARMv8-A",
      "full_name": "Condition Flag Invert",
      "summary": "Inverts the C (Carry) flag.",
      "syntax": "CFINV",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100000 | 000 | 0100 | 0000 | 000 | 11111",
        "hex_opcode": "0xD500401F",
        "visual_parts": [
          {
            "raw": "1101010100000",
            "clean": "1101010100000"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "FEAT_FlagM",
      "description": "Inverts the Carry flag (C) in the condition flags register. This instruction is AArch64-only and requires the FEAT_FlagM extension. All other condition flags (N, Z, V) remain unchanged. The operation is not privileged.",
      "example": "CFINV",
      "pseudocode": "C ← NOT C"
    },
    {
      "mnemonic": "rmif",
      "architecture": "ARMv8-A",
      "full_name": "Rotate Mask Insert Flags",
      "summary": "Rotates a register and inserts bits into the Process State flags.",
      "syntax": "RMIF <Xn>, #<shift>, #<mask>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 0 | 1 | 11010000 | imm6 | 00001 | Rn | 0 | mask",
        "hex_opcode": "0xBA000400",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11010000",
            "clean": "11010000"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "mask",
            "clean": "mask"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:15 | 14:10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "shift",
          "desc": "Rot"
        },
        {
          "name": "mask",
          "desc": "Flags"
        }
      ],
      "extension": "FEAT_FlagM",
      "description": "Rotates the 64-bit value in Xn right by shift bits, then uses the mask to selectively update PSTATE condition flags (N, Z, C, V). Each bit set in mask causes the corresponding rotated bit to update the corresponding flag. AArch64-only; requires FEAT_FlagM. Does not update any other registers.",
      "example": "RMIF x1, #LSL, #mask",
      "pseudocode": "rotated ← ROR(Xn, shift); if mask<3> then N ← rotated<63>; if mask<2> then Z ← (rotated<width-1:0> == 0); if mask<1> then C ← rotated<0>; if mask<0> then V ← rotated<1>;"
    },
    {
      "mnemonic": "setf8",
      "architecture": "ARMv8-A",
      "full_name": "Set Flags 8-bit",
      "summary": "Sets PSTATE flags based on 8-bit operand.",
      "syntax": "SETF8 <Wn>",
      "encoding": {
        "format": "System",
        "binary_pattern": "0 | 0 | 1 | 11010000 | 000000 | 0 | 0010 | Rn | 0 | 1101",
        "hex_opcode": "0x3A00080D",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11010000",
            "clean": "11010000"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1101",
            "clean": "1101"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:15 | 14 | 13:10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        }
      ],
      "extension": "FEAT_FlagM",
      "description": "Sets PSTATE condition flags (N, Z, C, V) based on the lower 8 bits of the 32-bit source register Wn, interpreting them as a signed 8-bit value. AArch64-only; requires FEAT_FlagM. N is set if bit 7 of Wn is set; Z is set if the lower 8 bits are zero; C and V are cleared.",
      "example": "SETF8 w1",
      "pseudocode": "val8 ← Wn<7:0>; N ← val8<7>; Z ← (val8 == 0); C ← 0; V ← 0;"
    },
    {
      "mnemonic": "setf16",
      "architecture": "ARMv8-A",
      "full_name": "Set Flags 16-bit",
      "summary": "Sets PSTATE flags based on 16-bit operand.",
      "syntax": "SETF16 <Wn>",
      "encoding": {
        "format": "System",
        "binary_pattern": "0 | 0 | 1 | 11010000 | 000000 | 1 | 0010 | Rn | 0 | 1101",
        "hex_opcode": "0x3A00480D",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11010000",
            "clean": "11010000"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1101",
            "clean": "1101"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:15 | 14 | 13:10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        }
      ],
      "extension": "FEAT_FlagM",
      "description": "Sets PSTATE condition flags (N, Z, C, V) based on the lower 16 bits of the 32-bit source register Wn, interpreting them as a signed 16-bit value. AArch64-only; requires FEAT_FlagM. N is set if bit 15 of Wn is set; Z is set if the lower 16 bits are zero; C and V are cleared.",
      "example": "SETF16 w1",
      "pseudocode": "val16 ← Wn<15:0>; N ← val16<15>; Z ← (val16 == 0); C ← 0; V ← 0;"
    },
    {
      "mnemonic": "fjcvtzs",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Javascript Convert",
      "summary": "Converts double to signed 32-bit integer with JS rounding semantics.",
      "syntax": "FJCVTZS <Wd>, <Dn>",
      "encoding": {
        "format": "Float Convert",
        "binary_pattern": "0 | 0 | 0 | 11110 | 01 | 1 | 11 | 110 | 000000 | Rn | Rd",
        "hex_opcode": "0x1E7E0000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        }
      ],
      "extension": "FEAT_JSCVT",
      "description": "Converts the 64-bit floating-point value in Dn to a signed 32-bit integer in Wd using JavaScript rounding semantics (round toward zero, with special handling for NaN and out-of-range values). AArch64-only; requires FEAT_JSCVT. Sets the C flag to 1 if the input is out of range or NaN, otherwise clears it. Other flags are not affected.",
      "example": "FJCVTZS w0, d1",
      "pseudocode": "if IsNaN(Dn) or (Dn > 2^31 - 1) or (Dn < -2^31) then Wd ← 0; C ← 1; else Wd ← SignedSaturate(RoundTowardZero(Dn), 32); C ← 0;"
    },
    {
      "mnemonic": "sbfx",
      "architecture": "ARMv8-A",
      "full_name": "Signed Bit Field Extract (A32)",
      "summary": "Extracts bits from a register and sign-extends them.",
      "syntax": "SBFX<c> <Rd>, <Rn>, #<lsb>, #<width>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01111 | 0 | 1 | widthm1 | Rd | lsb | 101 | Rn",
        "hex_opcode": "0x07A00050",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01111",
            "clean": "01111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "widthm1",
            "clean": "widthm1"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "lsb",
            "clean": "lsb"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21 | 20:16 | 15:12 | 11:7 | 6:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "lsb",
          "desc": "Start Bit"
        },
        {
          "name": "width",
          "desc": "Width"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Extracts a bitfield of width bits starting at position lsb from Rn, sign-extends the extracted value, and writes it to Rd. A32 instruction; available in all A32 processor modes. Does not affect PSTATE flags. The condition code suffix controls execution.",
      "example": "SBFX r0, r1, #0, #width",
      "pseudocode": "extracted ← Rn<(lsb + width - 1):lsb>; if extracted<(width - 1)> == 1 then Rd ← SignExtend(extracted, width) else Rd ← ZeroExtend(extracted, width);"
    },
    {
      "mnemonic": "ubfx",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Bit Field Extract (A32)",
      "summary": "Extracts bits from a register and zero-extends them.",
      "syntax": "UBFX<c> <Rd>, <Rn>, #<lsb>, #<width>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01111 | 1 | 1 | widthm1 | Rd | lsb | 101 | Rn",
        "hex_opcode": "0x07E00050",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01111",
            "clean": "01111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "widthm1",
            "clean": "widthm1"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "lsb",
            "clean": "lsb"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21 | 20:16 | 15:12 | 11:7 | 6:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "lsb",
          "desc": "Start Bit"
        },
        {
          "name": "width",
          "desc": "Width"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Extracts a bitfield of width bits starting at position lsb from Rn, zero-extends the extracted value, and writes it to Rd. A32 instruction; available in all A32 processor modes. Does not affect PSTATE flags. The condition code suffix controls execution.",
      "example": "UBFX r0, r1, #0, #width",
      "pseudocode": "extracted ← Rn<(lsb + width - 1):lsb>; Rd ← ZeroExtend(extracted, width);"
    },
    {
      "mnemonic": "sxtb",
      "architecture": "ARMv8-A",
      "full_name": "Signed Extend Byte (A32)",
      "summary": "Sign-extends the low byte (8-bits) to 32-bits.",
      "syntax": "SXTB<c> <Rd>, <Rm> {, <rotation>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 0 | 10 | 1111 | Rd | rotate | 0 | 0 | 0111 | Rm",
        "hex_opcode": "0x06AF0070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "rotate",
            "clean": "rotate"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Sign-extends the low byte of Rm into the full 32-bit word in Rd, with optional pre-rotation of Rm by 0, 8, 16, or 24 bits. This is an A32 instruction that does not affect any condition flags. The rotation is applied before the sign extension.",
      "example": "SXTB r0, r2",
      "pseudocode": "rotated ← ROR(Rm, rotation)\nRd ← SignExtend(rotated[7:0], 32)"
    },
    {
      "mnemonic": "sxth",
      "architecture": "ARMv8-A",
      "full_name": "Signed Extend Halfword (A32)",
      "summary": "Sign-extends the low halfword (16-bits) to 32-bits.",
      "syntax": "SXTH<c> <Rd>, <Rm> {, <rotation>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 0 | 11 | 1111 | Rd | rotate | 0 | 0 | 0111 | Rm",
        "hex_opcode": "0x06BF0070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "rotate",
            "clean": "rotate"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Sign-extends the low halfword of Rm into the full 32-bit word in Rd, with optional pre-rotation of Rm by 0, 8, 16, or 24 bits. This is an A32 instruction that does not affect any condition flags. The rotation is applied before the sign extension.",
      "example": "SXTH r0, r2",
      "pseudocode": "rotated ← ROR(Rm, rotation)\nRd ← SignExtend(rotated[15:0], 32)"
    },
    {
      "mnemonic": "sxtb16",
      "architecture": "ARMv8-A",
      "full_name": "Signed Extend Byte 16 (A32)",
      "summary": "Sign-extends two bytes to two halfwords.",
      "syntax": "SXTB16<c> <Rd>, <Rm> {, <rotation>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 0 | 00 | 1111 | Rd | rotate | 0 | 0 | 0111 | Rm",
        "hex_opcode": "0x068F0070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "rotate",
            "clean": "rotate"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Sign-extends the two low bytes (bits 7:0 and 15:8) of Rm to two 16-bit halfwords in Rd, with an optional rotation applied to Rm before extraction. A32 instruction; requires DSP extension. Does not affect PSTATE flags. The condition code suffix controls execution.",
      "example": "SXTB16 r0, r2",
      "pseudocode": "rotated ← ROR(Rm, rotation); Rd<15:0> ← SignExtend(rotated<7:0>, 16); Rd<31:16> ← SignExtend(rotated<15:8>, 16);"
    },
    {
      "mnemonic": "uxtb",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Extend Byte (A32)",
      "summary": "Zero-extends the low byte to 32-bits.",
      "syntax": "UXTB<c> <Rd>, <Rm> {, <rotation>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 1 | 10 | 1111 | Rd | rotate | 0 | 0 | 0111 | Rm",
        "hex_opcode": "0x06EF0070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "rotate",
            "clean": "rotate"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Zero-extends the low byte (bits [7:0]) of Rm to the full 32-bit width and stores the result in Rd. An optional rotation (0°, 90°, 180°, or 270°) can be applied to Rm before the extension. No condition flags are affected by this instruction. A32 only; executes in User and Privileged modes.",
      "example": "UXTB r0, r2",
      "pseudocode": "rotated ← ROR(Rm, rotation * 8)\nRd ← ZeroExtend(rotated[7:0], 32)"
    },
    {
      "mnemonic": "uxth",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Extend Halfword (A32)",
      "summary": "Zero-extends the low halfword to 32-bits.",
      "syntax": "UXTH<c> <Rd>, <Rm> {, <rotation>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 1 | 11 | 1111 | Rd | rotate | 0 | 0 | 0111 | Rm",
        "hex_opcode": "0x06FF0070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "rotate",
            "clean": "rotate"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Zero-extends the low halfword (bits [15:0]) of Rm to the full 32-bit width and stores the result in Rd. An optional rotation (0°, 90°, 180°, or 270°) can be applied to Rm before the extension. No condition flags are affected by this instruction. A32 only; executes in User and Privileged modes.",
      "example": "UXTH r0, r2",
      "pseudocode": "rotated ← ROR(Rm, rotation * 8)\nRd ← ZeroExtend(rotated[15:0], 32)"
    },
    {
      "mnemonic": "uxtb16",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Extend Byte 16 (A32)",
      "summary": "Zero-extends two bytes to two halfwords.",
      "syntax": "UXTB16<c> <Rd>, <Rm> {, <rotation>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 1 | 00 | 1111 | Rd | rotate | 0 | 0 | 0111 | Rm",
        "hex_opcode": "0x06CF0070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "rotate",
            "clean": "rotate"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Zero-extends the two low bytes (bits 7:0 and 15:8) of Rm to two 16-bit halfwords in Rd, with an optional rotation applied to Rm before extraction. A32 instruction; requires DSP extension. Does not affect PSTATE flags. The condition code suffix controls execution.",
      "example": "UXTB16 r0, r2",
      "pseudocode": "rotated ← ROR(Rm, rotation); Rd<15:0> ← ZeroExtend(rotated<7:0>, 16); Rd<31:16> ← ZeroExtend(rotated<15:8>, 16);"
    },
    {
      "mnemonic": "ssat",
      "architecture": "ARMv8-A",
      "full_name": "Signed Saturate (A32)",
      "summary": "Saturates a signed value to a specified bit width.",
      "syntax": "SSAT<c> <Rd>, #<imm>, <Rm> {, <shift>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 0 | 1 | sat_imm | Rd | imm5 | 0 | 01 | Rn",
        "hex_opcode": "0x06A00010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "sat_imm",
            "clean": "sat_imm"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21 | 20:16 | 15:12 | 11:7 | 6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Bit Position"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Saturates a signed integer to a specified bit width. The instruction shifts the source value by an optional amount, then saturates the result to a signed range defined by the saturation position. Sets the Q flag if saturation occurs; N, Z, C, V flags are unaffected. A32-only instruction requiring DSP extension.",
      "example": "SSAT r0, #16, r2",
      "pseudocode": "shifted ← Rm << shift_amount\nsat_range ← 2^(imm-1) - 1\nif shifted > sat_range then\n  Rd ← sat_range\n  Q ← 1\nelse if shifted < -(2^(imm-1)) then\n  Rd ← -(2^(imm-1))\n  Q ← 1\nelse\n  Rd ← shifted"
    },
    {
      "mnemonic": "usat",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Saturate (A32)",
      "summary": "Saturates an unsigned value to a specified bit width.",
      "syntax": "USAT<c> <Rd>, #<imm>, <Rm> {, <shift>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 1 | 1 | sat_imm | Rd | imm5 | 0 | 01 | Rn",
        "hex_opcode": "0x06E00010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "sat_imm",
            "clean": "sat_imm"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21 | 20:16 | 15:12 | 11:7 | 6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Bit Position"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Saturates an unsigned integer to a specified bit width. The instruction shifts the source value by an optional amount, then saturates the result to an unsigned range [0, 2^imm-1]. Sets the Q flag if saturation occurs; N, Z, C, V flags are unaffected. A32-only instruction requiring DSP extension.",
      "example": "USAT r0, #16, r2",
      "pseudocode": "shifted ← Rm << shift_amount\nsat_max ← 2^imm - 1\nif shifted > sat_max then\n  Rd ← sat_max\n  Q ← 1\nelse if shifted < 0 then\n  Rd ← 0\n  Q ← 1\nelse\n  Rd ← shifted"
    },
    {
      "mnemonic": "ssat16",
      "architecture": "ARMv8-A",
      "full_name": "Signed Saturate 16 (A32)",
      "summary": "Saturates two signed 16-bit values.",
      "syntax": "SSAT16<c> <Rd>, #<imm>, <Rm>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 0 | 10 | sat_imm | Rd | 1 | 1 | 1 | 1 | 0011 | Rn",
        "hex_opcode": "0x06A00F30",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "sat_imm",
            "clean": "sat_imm"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Bit Position"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Saturates two signed 16-bit halfword values packed in a register to a specified bit width. The upper and lower 16-bit values are independently saturated to the range [-(2^(imm-1)), 2^(imm-1)-1]. Sets the Q flag if either halfword saturates; N, Z, C, V flags are unaffected. A32-only instruction requiring DSP extension.",
      "example": "SSAT16 r0, #16, r2",
      "pseudocode": "lower_hw ← Rm[15:0] (signed)\nupper_hw ← Rm[31:16] (signed)\nsat_range ← 2^(imm-1) - 1\nsat_min ← -(2^(imm-1))\nif lower_hw > sat_range or lower_hw < sat_min then\n  Rd[15:0] ← Clamp(lower_hw, sat_min, sat_range)\n  Q ← 1\nelse\n  Rd[15:0] ← lower_hw\nif upper_hw > sat_range or upper_hw < sat_min then\n  Rd[31:16] ← Clamp(upper_hw, sat_min, sat_range)\n  Q ← 1\nelse\n  Rd[31:16] ← upper_hw"
    },
    {
      "mnemonic": "usat16",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Saturate 16 (A32)",
      "summary": "Saturates two unsigned 16-bit values.",
      "syntax": "USAT16<c> <Rd>, #<imm>, <Rm>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 1 | 10 | sat_imm | Rd | 1 | 1 | 1 | 1 | 0011 | Rn",
        "hex_opcode": "0x06E00F30",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "sat_imm",
            "clean": "sat_imm"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Bit Position"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Saturates two unsigned 16-bit halfword values packed in a register to a specified bit width. The upper and lower 16-bit values are independently saturated to the range [0, 2^imm-1]. Sets the Q flag if either halfword saturates; N, Z, C, V flags are unaffected. A32-only instruction requiring DSP extension.",
      "example": "USAT16 r0, #16, r2",
      "pseudocode": "lower_hw ← Rm[15:0] (unsigned)\nupper_hw ← Rm[31:16] (unsigned)\nsat_max ← 2^imm - 1\nif lower_hw > sat_max then\n  Rd[15:0] ← sat_max\n  Q ← 1\nelse\n  Rd[15:0] ← lower_hw\nif upper_hw > sat_max then\n  Rd[31:16] ← sat_max\n  Q ← 1\nelse\n  Rd[31:16] ← upper_hw"
    },
    {
      "mnemonic": "pkhbt",
      "architecture": "ARMv8-A",
      "full_name": "Pack Halfword Bottom Top",
      "summary": "Combines bottom half of Rn with top half of shifted Rm.",
      "syntax": "PKHBT<c> <Rd>, <Rn>, <Rm> {, LSL #<imm>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101000 | Rn | Rd | imm5 | 0 | 01 | Rm",
        "hex_opcode": "0x06800010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101000",
            "clean": "01101000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:20 | 19:16 | 15:12 | 11:7 | 6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Bottom Src"
        },
        {
          "name": "Rm",
          "desc": "Top Src"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Packs the bottom halfword of Rn with the top halfword of (Rm shifted left). Assembles a 32-bit result by taking bits [15:0] from Rn and bits [31:16] from the shifted Rm. Condition flags N, Z, C, V are unaffected. A32-only instruction requiring DSP extension.",
      "example": "PKHBT r0, r1, r2",
      "pseudocode": "Rd[15:0] ← Rn[15:0]\nshifted_rm ← Rm << shift_imm\nRd[31:16] ← shifted_rm[31:16]"
    },
    {
      "mnemonic": "pkhtb",
      "architecture": "ARMv8-A",
      "full_name": "Pack Halfword Top Bottom",
      "summary": "Combines top half of Rn with bottom half of shifted Rm.",
      "syntax": "PKHTB<c> <Rd>, <Rn>, <Rm> {, ASR #<imm>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101000 | Rn | Rd | imm5 | 1 | 01 | Rm",
        "hex_opcode": "0x06800050",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101000",
            "clean": "01101000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:20 | 19:16 | 15:12 | 11:7 | 6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Top Src"
        },
        {
          "name": "Rm",
          "desc": "Bottom Src"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Packs the top halfword of Rn with the bottom halfword of (Rm shifted right). Assembles a 32-bit result by taking bits [31:16] from Rn and bits [15:0] from the shifted Rm. Condition flags N, Z, C, V are unaffected. A32-only instruction requiring DSP extension.",
      "example": "PKHTB r0, r1, r2",
      "pseudocode": "shifted_rm ← Rm >> shift_imm\nRd[15:0] ← shifted_rm[15:0]\nRd[31:16] ← Rn[31:16]"
    },
    {
      "mnemonic": "sadd16",
      "architecture": "ARMv8-A",
      "full_name": "Signed Add 16 (A32)",
      "summary": "Parallel add of two signed 16-bit halfwords.",
      "syntax": "SADD16<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 001 | Rn | Rd | 1 | 1 | 1 | 1 | 0 | 00 | 1 | Rm",
        "hex_opcode": "0x06100F10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs two independent parallel signed 16-bit additions: the high halfword of Rn is added to the high halfword of Rm, and the low halfword of Rn is added to the low halfword of Rm; results are stored in the corresponding halfwords of Rd. The CPSR GE[3:0] flags are updated to reflect signed overflow in each halfword; N, Z, C, V are unaffected. A32 only; requires DSP extension; executes in User and Privileged modes.",
      "example": "SADD16 r0, r1, r2",
      "pseudocode": "Rd[31:16] ← Rn[31:16] + Rm[31:16]\nRd[15:0] ← Rn[15:0] + Rm[15:0]\nGE[3] ← (Rd[31:16] >= 0) ? 1 : 0\nGE[2] ← (Rd[31:16] < 0) ? 0 : 1\nGE[1] ← (Rd[15:0] >= 0) ? 1 : 0\nGE[0] ← (Rd[15:0] < 0) ? 0 : 1"
    },
    {
      "mnemonic": "uadd16",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Add 16 (A32)",
      "summary": "Parallel add of two unsigned 16-bit halfwords.",
      "syntax": "UADD16<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 101 | Rn | Rd | 1 | 1 | 1 | 1 | 0 | 00 | 1 | Rm",
        "hex_opcode": "0x06500F10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs two independent parallel unsigned 16-bit additions: the high halfword of Rn is added to the high halfword of Rm, and the low halfword of Rn is added to the low halfword of Rm; results are stored in the corresponding halfwords of Rd. The CPSR GE[3:0] flags are updated to reflect unsigned overflow (carry-out) in each halfword; N, Z, C, V are unaffected. A32 only; requires DSP extension; executes in User and Privileged modes.",
      "example": "UADD16 r0, r1, r2",
      "pseudocode": "Rd[31:16] ← Rn[31:16] + Rm[31:16]\nRd[15:0] ← Rn[15:0] + Rm[15:0]\nGE[3] ← (Rn[31:16] + Rm[31:16] < 2^16) ? 0 : 1\nGE[2] ← (Rn[31:16] + Rm[31:16] < 2^16) ? 1 : 0\nGE[1] ← (Rn[15:0] + Rm[15:0] < 2^16) ? 0 : 1\nGE[0] ← (Rn[15:0] + Rm[15:0] < 2^16) ? 1 : 0"
    },
    {
      "mnemonic": "sadd8",
      "architecture": "ARMv8-A",
      "full_name": "Signed Add 8 (A32)",
      "summary": "Parallel add of four signed 8-bit bytes.",
      "syntax": "SADD8<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 001 | Rn | Rd | 1 | 1 | 1 | 1 | 1 | 00 | 1 | Rm",
        "hex_opcode": "0x06100F90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs four independent parallel signed 8-bit additions, one for each byte of Rn and Rm; results are stored in the corresponding bytes of Rd. The CPSR GE[3:0] flags are updated to reflect signed overflow in each byte; N, Z, C, V are unaffected. A32 only; requires DSP extension; executes in User and Privileged modes.",
      "example": "SADD8 r0, r1, r2",
      "pseudocode": "Rd[31:24] ← Rn[31:24] + Rm[31:24]\nRd[23:16] ← Rn[23:16] + Rm[23:16]\nRd[15:8] ← Rn[15:8] + Rm[15:8]\nRd[7:0] ← Rn[7:0] + Rm[7:0]\nfor i = 0 to 3:\n  GE[i] ← (Rd[i*8+7:i*8] >= 0) ? 1 : 0"
    },
    {
      "mnemonic": "uadd8",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Add 8 (A32)",
      "summary": "Parallel add of four unsigned 8-bit bytes.",
      "syntax": "UADD8<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 101 | Rn | Rd | 1 | 1 | 1 | 1 | 1 | 00 | 1 | Rm",
        "hex_opcode": "0x06500F90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs four independent parallel unsigned 8-bit additions, one for each byte of Rn and Rm; results are stored in the corresponding bytes of Rd. The CPSR GE[3:0] flags are updated to reflect unsigned overflow (carry-out) in each byte; N, Z, C, V are unaffected. A32 only; requires DSP extension; executes in User and Privileged modes.",
      "example": "UADD8 r0, r1, r2",
      "pseudocode": "Rd[31:24] ← Rn[31:24] + Rm[31:24]\nRd[23:16] ← Rn[23:16] + Rm[23:16]\nRd[15:8] ← Rn[15:8] + Rm[15:8]\nRd[7:0] ← Rn[7:0] + Rm[7:0]\nfor i = 0 to 3:\n  GE[i] ← (Rn[i*8+7:i*8] + Rm[i*8+7:i*8] < 2^8) ? 0 : 1"
    },
    {
      "mnemonic": "ssub16",
      "architecture": "ARMv8-A",
      "full_name": "Signed Subtract 16 (A32)",
      "summary": "Parallel sub of two signed 16-bit halfwords.",
      "syntax": "SSUB16<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 001 | Rn | Rd | 1 | 1 | 1 | 1 | 0 | 11 | 1 | Rm",
        "hex_opcode": "0x06100F70",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs two independent parallel signed 16-bit subtractions: the high halfword of Rm is subtracted from the high halfword of Rn, and the low halfword of Rm is subtracted from the low halfword of Rn; results are stored in the corresponding halfwords of Rd. The CPSR GE[3:0] flags are updated to reflect signed borrow in each halfword; N, Z, C, V are unaffected. A32 only; requires DSP extension; executes in User and Privileged modes.",
      "example": "SSUB16 r0, r1, r2",
      "pseudocode": "Rd[31:16] ← Rn[31:16] - Rm[31:16]\nRd[15:0] ← Rn[15:0] - Rm[15:0]\nGE[3] ← (Rd[31:16] >= 0) ? 1 : 0\nGE[2] ← (Rd[31:16] < 0) ? 0 : 1\nGE[1] ← (Rd[15:0] >= 0) ? 1 : 0\nGE[0] ← (Rd[15:0] < 0) ? 0 : 1"
    },
    {
      "mnemonic": "usub16",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Subtract 16 (A32)",
      "summary": "Parallel sub of two unsigned 16-bit halfwords.",
      "syntax": "USUB16<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 101 | Rn | Rd | 1 | 1 | 1 | 1 | 0 | 11 | 1 | Rm",
        "hex_opcode": "0x06500F70",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs two independent parallel unsigned 16-bit subtractions: the high halfword of Rm is subtracted from the high halfword of Rn, and the low halfword of Rm is subtracted from the low halfword of Rn; results are stored in the corresponding halfwords of Rd. The CPSR GE[3:0] flags are updated to reflect unsigned borrow (no carry-out) in each halfword; N, Z, C, V are unaffected. A32 only; requires DSP extension; executes in User and Privileged modes.",
      "example": "USUB16 r0, r1, r2",
      "pseudocode": "Rd[31:16] ← Rn[31:16] - Rm[31:16]\nRd[15:0] ← Rn[15:0] - Rm[15:0]\nGE[3] ← (Rn[31:16] >= Rm[31:16]) ? 1 : 0\nGE[2] ← (Rn[31:16] >= Rm[31:16]) ? 0 : 1\nGE[1] ← (Rn[15:0] >= Rm[15:0]) ? 1 : 0\nGE[0] ← (Rn[15:0] >= Rm[15:0]) ? 0 : 1"
    },
    {
      "mnemonic": "usad8",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Sum of Absolute Differences",
      "summary": "Computes sum of absolute differences of bytes (Video Codec).",
      "syntax": "USAD8<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01111000 | Rd | 1111 | Rm | 0001 | Rn",
        "hex_opcode": "0x0780F010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01111000",
            "clean": "01111000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Computes the unsigned sum of absolute differences of four byte-wide values. Treats Rn and Rm as four unsigned bytes each, computes the absolute difference for each byte pair, sums them, and stores the result in Rd. Condition flags N, Z, C, V are unaffected. A32-only instruction requiring DSP extension; commonly used in video codec applications.",
      "example": "USAD8 r0, r1, r2",
      "pseudocode": "diff0 ← |Rn[7:0] - Rm[7:0]|\ndiff1 ← |Rn[15:8] - Rm[15:8]|\ndiff2 ← |Rn[23:16] - Rm[23:16]|\ndiff3 ← |Rn[31:24] - Rm[31:24]|\nRd ← diff0 + diff1 + diff2 + diff3"
    },
    {
      "mnemonic": "usada8",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Sum of Absolute Differences Accumulate",
      "summary": "USAD8 plus accumulator.",
      "syntax": "USADA8<c> <Rd>, <Rn>, <Rm>, <Ra>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01111000 | Rd | Ra | Rm | 0001 | Rn",
        "hex_opcode": "0x07800010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01111000",
            "clean": "01111000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Ra",
          "desc": "Acc"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Computes the unsigned sum of absolute differences of four byte-wide values and adds an accumulator. Treats Rn and Rm as four unsigned bytes each, computes absolute differences for each byte pair, sums them, and adds the value in Ra to produce the result stored in Rd. Condition flags N, Z, C, V are unaffected. A32-only instruction requiring DSP extension.",
      "example": "USADA8 r0, r1, r2, r5",
      "pseudocode": "diff0 ← |Rn[7:0] - Rm[7:0]|\ndiff1 ← |Rn[15:8] - Rm[15:8]|\ndiff2 ← |Rn[23:16] - Rm[23:16]|\ndiff3 ← |Rn[31:24] - Rm[31:24]|\nRd ← (diff0 + diff1 + diff2 + diff3) + Ra"
    },
    {
      "mnemonic": "smmul",
      "architecture": "ARMv8-A",
      "full_name": "Signed Most Significant Word Multiply",
      "summary": "Multiplies and returns the top 32-bits of the 64-bit result.",
      "syntax": "SMMUL{R}<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 01110 | 101 | Rd | 1111 | Rm | 00 | 0 | 1 | Rn",
        "hex_opcode": "0x0750F010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed Most Significant Word Multiply performs a signed 32×32-bit multiply and returns the upper 32 bits of the 64-bit result in Rd. This is commonly used for fixed-point arithmetic and fast DSP operations. No condition flags are affected. Available in A32 instruction set with DSP extension; the optional R suffix rounds the result by adding 0x80000000 before truncation.",
      "example": "SMMUL r0, r1, r2",
      "pseudocode": "product ← SignedMul(Rn, Rm)\nRd ← (product[63:32])"
    },
    {
      "mnemonic": "smmla",
      "architecture": "ARMv8-A",
      "full_name": "Signed Most Significant Word Multiply Accumulate",
      "summary": "SMMUL + Accumulate.",
      "syntax": "SMMLA{R}<c> <Rd>, <Rn>, <Rm>, <Ra>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 01110 | 101 | Rd | Ra | Rm | 00 | 0 | 1 | Rn",
        "hex_opcode": "0x07500010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Ra",
          "desc": "Acc"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Signed Most Significant Word Multiply Accumulate computes the signed product of Rn and Rm, extracts the upper 32 bits, and adds the accumulator register Ra to produce the final result stored in Rd. This combines multiplication and accumulation in a single instruction, useful for DSP and filtering operations. No condition flags are affected. Available in A32 instruction set with DSP extension; the optional R suffix applies rounding.",
      "example": "SMMLA r0, r1, r2, r5",
      "pseudocode": "product ← SignedMul(Rn, Rm)\nRd ← Ra + (product[63:32])"
    },
    {
      "mnemonic": "vadd",
      "architecture": "ARMv8-A",
      "full_name": "Vector Add (VFP)",
      "summary": "Adds two floating-point values.",
      "syntax": "VADD<c>.F32 <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 0 | D | 11 | Vn | Vd | 10 | 10 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0x0E300A00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Adds two single-precision floating-point values (Sn + Sm) and stores the result in Sd. This VFP instruction operates on 32-bit IEEE 754 single-precision operands. The condition flags (N, Z, C, V) are updated based on the floating-point result according to the FPSCR. Execution is conditional based on the <c> condition code and requires VFP extension support in A32/T32 modes.",
      "example": "VADD.F32 s0, s1, s2",
      "pseudocode": "Sd ← Sn + Sm\nFPSCR.NZCV ← FP_CC(result)"
    },
    {
      "mnemonic": "vadd",
      "architecture": "ARMv8-A",
      "full_name": "Vector Add Double (VFP)",
      "summary": "Adds two double-precision floating-point values.",
      "syntax": "VADD<c>.F64 <Dd>, <Dn>, <Dm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 0 | D | 11 | Vn | Vd | 10 | 11 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0x0E300B00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Adds two double-precision floating-point values (Dn + Dm) and stores the result in Dd. This VFP instruction operates on 64-bit IEEE 754 double-precision operands. The condition flags (N, Z, C, V) are updated based on the floating-point result according to the FPSCR. Execution is conditional based on the <c> condition code and requires VFP extension support in A32/T32 modes.",
      "example": "VADD.F64 d0, d1, d2",
      "pseudocode": "Dd ← Dn + Dm\nFPSCR.NZCV ← FP_CC(result)"
    },
    {
      "mnemonic": "vsub",
      "architecture": "ARMv8-A",
      "full_name": "Vector Subtract (VFP)",
      "summary": "Subtracts two floating-point values.",
      "syntax": "VSUB<c>.F32 <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 0 | D | 11 | Vn | Vd | 10 | 10 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0x0E300A40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Subtracts two single-precision floating-point values (Sn - Sm) and stores the result in Sd. This VFP instruction operates on 32-bit IEEE 754 single-precision operands. The condition flags (N, Z, C, V) are updated based on the floating-point result according to the FPSCR. Execution is conditional based on the <c> condition code and requires VFP extension support in A32/T32 modes.",
      "example": "VSUB.F32 s0, s1, s2",
      "pseudocode": "Sd ← Sn - Sm\nFPSCR.NZCV ← FP_CC(result)"
    },
    {
      "mnemonic": "vmul",
      "architecture": "ARMv8-A",
      "full_name": "Vector Multiply (VFP)",
      "summary": "Multiplies two floating-point values.",
      "syntax": "VMUL<c>.F32 <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 0 | D | 10 | Vn | Vd | 10 | 10 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0x0E200A00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Multiply (VFP) performs single-precision floating-point multiplication of Sn and Sm, storing the result in Sd. The operation follows IEEE 754 semantics, updating the FPSCR exception flags (IXC, OFC, UFC, IOC, DZC) based on the result but not affecting the ARM condition flags N, Z, C, V. Available in A32/T32 with VFP extension; execution is conditional based on the condition code suffix.",
      "example": "VMUL.F32 s0, s1, s2",
      "pseudocode": "Sd ← FP_Multiply(Sn, Sm)\nFPSCR ← updated with floating-point exception flags"
    },
    {
      "mnemonic": "vdiv",
      "architecture": "ARMv8-A",
      "full_name": "Vector Divide (VFP)",
      "summary": "Divides two floating-point values.",
      "syntax": "VDIV<c>.F32 <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 1 | D | 00 | Vn | Vd | 10 | 10 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0x0E800A00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "Dividend"
        },
        {
          "name": "Sm",
          "desc": "Divisor"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Divides two single-precision floating-point values (Sn / Sm) and stores the result in Sd. This VFP instruction performs floating-point division on 32-bit IEEE 754 single-precision operands. The condition flags (N, Z, C, V) are updated based on the floating-point result according to the FPSCR; division by zero generates a floating-point exception or returns infinity depending on exception settings. Execution is conditional based on the <c> condition code and requires VFP extension support in A32/T32 modes.",
      "example": "VDIV.F32 s0, s1, s2",
      "pseudocode": "Sd ← Sn / Sm\nFPSCR.NZCV ← FP_CC(result)\nif (Sm == 0.0) then FP_Exception(DivideByZero)"
    },
    {
      "mnemonic": "vmla",
      "architecture": "ARMv8-A",
      "full_name": "Vector Multiply Accumulate (VFP)",
      "summary": "Sd = Sd + (Sn * Sm).",
      "syntax": "VMLA<c>.F32 <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 0 | D | 00 | Vn | Vd | 10 | 10 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0x0E000A00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Multiply Accumulate (VFP) computes Sn × Sm and adds the result to Sd, storing the final value back in Sd. The operation follows IEEE 754 semantics with rounding and exception handling controlled by FPSCR, updating floating-point exception flags but not ARM condition flags. Available in A32/T32 with VFP extension; execution is conditional based on the condition code suffix.",
      "example": "VMLA.F32 s0, s1, s2",
      "pseudocode": "product ← FP_Multiply(Sn, Sm)\nSd ← FP_Add(Sd, product)\nFPSCR ← updated with floating-point exception flags"
    },
    {
      "mnemonic": "vmls",
      "architecture": "ARMv8-A",
      "full_name": "Vector Multiply Subtract (VFP)",
      "summary": "Sd = Sd - (Sn * Sm).",
      "syntax": "VMLS<c>.F32 <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 0 | D | 00 | Vn | Vd | 10 | 10 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0x0E000A40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Multiplies two single-precision floating-point values and subtracts the result from the destination (Sd ← Sd - (Sn × Sm)). This VFP instruction performs a fused multiply-subtract operation on 32-bit IEEE 754 single-precision operands, with Sd serving as both accumulator and destination. The condition flags (N, Z, C, V) are updated based on the final floating-point result according to the FPSCR. Execution is conditional based on the <c> condition code and requires VFP extension support in A32/T32 modes.",
      "example": "VMLS.F32 s0, s1, s2",
      "pseudocode": "Sd ← Sd - (Sn × Sm)\nFPSCR.NZCV ← FP_CC(result)"
    },
    {
      "mnemonic": "vnmul",
      "architecture": "ARMv8-A",
      "full_name": "Vector Negated Multiply (VFP)",
      "summary": "Sd = -(Sn * Sm).",
      "syntax": "VNMUL<c>.F32 <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "VFP Arith",
        "binary_pattern": "cond | 1110 | 0 | D | 10 | Vn | Vd | 10 | 10 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0x0E200A40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Negated Multiply (VFP) computes the negation of Sn × Sm and stores the result in Sd. This is equivalent to multiplying then negating, and follows IEEE 754 semantics for the intermediate product, with sign negation applied afterward. FPSCR exception flags are updated but ARM condition flags N, Z, C, V are not affected. Available in A32/T32 with VFP extension; execution is conditional based on the condition code suffix.",
      "example": "VNMUL.F32 s0, s1, s2",
      "pseudocode": "product ← FP_Multiply(Sn, Sm)\nSd ← FP_Negate(product)\nFPSCR ← updated with floating-point exception flags"
    },
    {
      "mnemonic": "vabs",
      "architecture": "ARMv8-A",
      "full_name": "Vector Absolute Value (VFP)",
      "summary": "Calculates absolute value.",
      "syntax": "VABS<c>.F32 <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Unary",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 000 | Vd | 10 | 10 | 1 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB00AC0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Absolute Value (VFP) computes the absolute value of Sm by clearing the sign bit and storing the result in Sd. This is a unary floating-point operation that follows IEEE 754 semantics, updating FPSCR exception flags but not affecting ARM condition flags. Available in A32/T32 with VFP extension; execution is conditional based on the condition code suffix.",
      "example": "VABS.F32 s0, s2",
      "pseudocode": "Sd ← FP_AbsoluteValue(Sm)\nFPSCR ← updated with floating-point exception flags"
    },
    {
      "mnemonic": "vneg",
      "architecture": "ARMv8-A",
      "full_name": "Vector Negate (VFP)",
      "summary": "Negates the value.",
      "syntax": "VNEG<c>.F32 <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Unary",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 001 | Vd | 10 | 10 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB10A40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Negate (VFP) negates the value in Sm by inverting the sign bit and stores the result in Sd. This is a unary floating-point operation that follows IEEE 754 semantics, affecting only the sign bit and updating FPSCR exception flags but not ARM condition flags. Available in A32/T32 with VFP extension; execution is conditional based on the condition code suffix.",
      "example": "VNEG.F32 s0, s2",
      "pseudocode": "Sd ← FP_Negate(Sm)\nFPSCR ← updated with floating-point exception flags"
    },
    {
      "mnemonic": "vsqrt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Square Root (VFP)",
      "summary": "Calculates square root.",
      "syntax": "VSQRT<c>.F32 <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Unary",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 001 | Vd | 10 | 10 | 1 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB10AC0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Square Root (VFP) computes the square root of Sm using IEEE 754 semantics and stores the result in Sd. This unary floating-point operation may raise exceptions for invalid operands (negative inputs) or precision issues, updating FPSCR exception flags but not affecting ARM condition flags. Available in A32/T32 with VFP extension; execution is conditional based on the condition code suffix.",
      "example": "VSQRT.F32 s0, s2",
      "pseudocode": "Sd ← FP_SquareRoot(Sm)\nFPSCR ← updated with floating-point exception flags"
    },
    {
      "mnemonic": "vcmp",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare (VFP)",
      "summary": "Compares two floating-point values.",
      "syntax": "VCMP<c>.F32 <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Compare",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 100 | Vd | 10 | 10 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB40A40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Compares two single-precision floating-point values in VFP registers and sets the FPSCR condition flags (N, Z, C, V) based on the comparison result. The comparison is quiet (does not raise exceptions for NaN operands). Executed in A32/T32 with VFP extension; condition flags are updated in the floating-point status and control register (FPSCR), not the general-purpose condition flags.",
      "example": "VCMP.F32 s0, s2",
      "pseudocode": "result ← compare(Sd, Sm)\nFPSCR.N ← result.N\nFPSCR.Z ← result.Z\nFPSCR.C ← result.C\nFPSCR.V ← result.V"
    },
    {
      "mnemonic": "vcmpe",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare Exception (VFP)",
      "summary": "Compares values and raises exception on NaN.",
      "syntax": "VCMPE<c>.F32 <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Compare",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 100 | Vd | 10 | 10 | 1 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB40AC0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Compares two single-precision floating-point values in VFP registers and sets the FPSCR condition flags (N, Z, C, V) based on the comparison result. Unlike VCMP, this variant raises an Invalid Operation exception if either operand is NaN (signaling comparison). Executed in A32/T32 with VFP extension; exception behavior depends on FPSCR exception-enable bits.",
      "example": "VCMPE.F32 s0, s2",
      "pseudocode": "if Sd is NaN or Sm is NaN then\n  if FPSCR.IXE then raise InvalidOperationException\nresult ← compare(Sd, Sm)\nFPSCR.N ← result.N\nFPSCR.Z ← result.Z\nFPSCR.C ← result.C\nFPSCR.V ← result.V"
    },
    {
      "mnemonic": "vcvt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Convert (Float to Integer)",
      "summary": "Converts float to signed/unsigned integer.",
      "syntax": "VCVT<c>.<Td>.<Tm> <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Convert",
        "binary_pattern": "cond | 11101 | D | 11 | 1 | 000 | Vd | 10 | 01 | op | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB80940",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "op",
            "clean": "op"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Converts a single-precision floating-point value to a signed or unsigned 32-bit integer and stores the result in Sd. This VFP instruction performs floating-point-to-integer conversion with rounding behavior controlled by the FPSCR rounding mode. The condition flags are not updated; conversion errors (overflow, invalid operand) may set exception bits in the FPSCR depending on exception configuration. Execution is conditional based on the <c> condition code and requires VFP extension support in A32/T32 modes.",
      "example": "VCVT.Td.Tm s0, s2",
      "pseudocode": "result ← Convert_F32_to_Int32(Sm, signed/unsigned, rounding_mode)\nSd ← result\nif (overflow or invalid) then FP_Exception_or_Saturate()"
    },
    {
      "mnemonic": "vmov",
      "architecture": "ARMv8-A",
      "full_name": "Vector Move (Register)",
      "summary": "Moves data between VFP registers.",
      "syntax": "VMOV<c>.F32 <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Move",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 000 | Vd | 10 | size | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB00A40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Moves (copies) a single-precision floating-point value from one VFP register to another (Sd ← Sm). This is a pure register-to-register transfer with no arithmetic; it preserves the bit pattern including NaN payloads and sign. Condition flags are not affected. Execution is conditional based on the <c> condition code and requires VFP extension support in A32/T32 modes.",
      "example": "VMOV.F32 s0, s2",
      "pseudocode": "Sd ← Sm"
    },
    {
      "mnemonic": "vmov",
      "architecture": "ARMv8-A",
      "full_name": "Vector Move (Core <-> VFP)",
      "summary": "Moves data between Core registers (R) and VFP registers (S).",
      "syntax": "VMOV<c> <Sn>, <Rt>",
      "encoding": {
        "format": "VFP Transfer",
        "binary_pattern": "cond | 1110000 | 0 | Vn | Rt | 1010 | N | 0 | 0 | 1 | 0 | 0 | 0 | 0",
        "hex_opcode": "0x0E000A10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110000",
            "clean": "1110000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          }
        ],
        "bit_positions": "31:28 | 27:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0"
      },
      "operands": [
        {
          "name": "Sn",
          "desc": "VFP Reg"
        },
        {
          "name": "Rt",
          "desc": "Core Reg"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Moves a 32-bit value between a core integer register (Rt) and a VFP single-precision register (Sn). The instruction transfers the bit pattern without interpretation; a floating-point value moved to a core register is treated as raw bits. Condition flags are not affected. Execution is conditional based on the <c> condition code and requires VFP extension support in A32/T32 modes.",
      "example": "VMOV s1, r3",
      "pseudocode": "Sn ← Rt (bit-exact transfer)"
    },
    {
      "mnemonic": "vldr",
      "architecture": "ARMv8-A",
      "full_name": "Vector Load Register (VFP)",
      "summary": "Loads a floating-point register from memory.",
      "syntax": "VLDR<c> <Sd>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "VFP Load",
        "binary_pattern": "cond | 110 | 1 | U | D | 0 | 1 | Rn | Vd | 10 | 10 | imm8",
        "hex_opcode": "0x0D100A00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Loads a single-precision floating-point value from memory into a VFP register using a PC-relative or register-relative address with an optional offset. The memory access uses the address [Rn ± (imm8 << 2)]. Executed in A32/T32 with VFP extension; no condition flags are affected.",
      "example": "VLDR s0, [r1, #+/-#16]",
      "pseudocode": "offset ← ZeroExtend(imm8) << 2\nif U == 1 then\n  address ← Rn + offset\nelse\n  address ← Rn - offset\nSd ← [address]"
    },
    {
      "mnemonic": "vstr",
      "architecture": "ARMv8-A",
      "full_name": "Vector Store Register (VFP)",
      "summary": "Stores a floating-point register to memory.",
      "syntax": "VSTR<c> <Sd>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "VFP Store",
        "binary_pattern": "cond | 110 | 1 | U | D | 0 | 0 | Rn | Vd | 10 | 10 | imm8",
        "hex_opcode": "0x0D000A00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Stores a single-precision floating-point value from a VFP register to memory using a register-relative address with an optional offset. The memory access uses the address [Rn ± (imm8 << 2)]. Executed in A32/T32 with VFP extension; no condition flags are affected.",
      "example": "VSTR s0, [r1, #+/-#16]",
      "pseudocode": "offset ← ZeroExtend(imm8) << 2\nif U == 1 then\n  address ← Rn + offset\nelse\n  address ← Rn - offset\n[address] ← Sd"
    },
    {
      "mnemonic": "vpop",
      "architecture": "ARMv8-A",
      "full_name": "Vector Pop (VFP)",
      "summary": "Pops VFP registers from the stack (Alias for VLDMIA SP!).",
      "syntax": "VPOP <list>",
      "encoding": {
        "format": "VFP Load Multiple",
        "binary_pattern": "cond | 110 | 0 | 1 | D | 1 | 1 | 1101 | Vd | 10 | 10 | imm8",
        "hex_opcode": "0x0CBD0A00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:0"
      },
      "operands": [
        {
          "name": "list",
          "desc": "Register List"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Pops VFP floating-point registers from the stack by loading them from memory at the address in SP, then post-incrementing SP. This is an alias for VLDMIA SP! (VFP Load Multiple with post-index). The condition flags (N, Z, C, V) are unaffected by this instruction. Execution is restricted to A32 and T32 instruction sets with VFP extension enabled.",
      "example": "VPOP {r0-r3",
      "pseudocode": "address ← SP; for each register in list (in ascending order): register ← [address]; address ← address + 4 or 8 (depending on register width); SP ← address;"
    },
    {
      "mnemonic": "vpush",
      "architecture": "ARMv8-A",
      "full_name": "Vector Push (VFP)",
      "summary": "Pushes VFP registers to the stack (Alias for VSTMDB SP!).",
      "syntax": "VPUSH <list>",
      "encoding": {
        "format": "VFP Store Multiple",
        "binary_pattern": "cond | 110 | 1 | 0 | D | 1 | 0 | 1101 | Vd | 10 | 10 | imm8",
        "hex_opcode": "0x0D2D0A00",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:0"
      },
      "operands": [
        {
          "name": "list",
          "desc": "Register List"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Pushes VFP floating-point registers onto the stack by decrementing SP and storing them to memory. This is an alias for VSTMDB SP! (VFP Store Multiple with pre-decrement). The condition flags (N, Z, C, V) are unaffected by this instruction. Execution is restricted to A32 and T32 instruction sets with VFP extension enabled.",
      "example": "VPUSH {r0-r3",
      "pseudocode": "address ← SP; for each register in list (in descending order): address ← address - 4 or 8 (depending on register width); [address] ← register; SP ← address;"
    },
    {
      "mnemonic": "adc.w",
      "architecture": "ARMv8-A",
      "full_name": "Add with Carry (Wide)",
      "summary": "Thumb-2 32-bit add with carry (Access high registers/large constants).",
      "syntax": "ADC.W <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 1010 | 0 | Rn | 0 | imm3 | Rd | imm2 | stype | Rm",
        "hex_opcode": "0xEB400000",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Adds Rn and Operand2 plus the Carry flag value, storing the result in Rd. If S=1, the N, Z, C, V flags are updated based on the result; otherwise flags are unaffected. This is a Thumb-2 32-bit instruction that allows use of high registers (R8-R15) and larger constant operands than 16-bit Thumb ADC.",
      "example": "ADC.W r0, r1, r2",
      "pseudocode": "result ← Rn + Operand2 + C; Rd ← result; if S == 1 then: N ← result[31]; Z ← (result == 0); C ← CarryOut(Rn, Operand2, C); V ← OverflowFrom(Rn, Operand2, C);"
    },
    {
      "mnemonic": "add.w",
      "architecture": "ARMv8-A",
      "full_name": "Add (Wide)",
      "summary": "Thumb-2 32-bit add.",
      "syntax": "ADD.W <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 1000 | 0 | Rn | 0 | imm3 | Rd | imm2 | stype | Rm",
        "hex_opcode": "0xEB000000",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Adds Rn and Operand2, storing the result in Rd. If S=1, the N, Z, C, V flags are updated based on the result; otherwise flags are unaffected. This is a Thumb-2 32-bit instruction that allows use of high registers (R8-R15) and larger constant operands than 16-bit Thumb ADD.",
      "example": "ADD.W r0, r1, r2",
      "pseudocode": "result ← Rn + Operand2; Rd ← result; if S == 1 then: N ← result[31]; Z ← (result == 0); C ← CarryOut(Rn, Operand2); V ← OverflowFrom(Rn, Operand2);"
    },
    {
      "mnemonic": "sub.w",
      "architecture": "ARMv8-A",
      "full_name": "Subtract (Wide)",
      "summary": "Thumb-2 32-bit subtract.",
      "syntax": "SUB.W <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 1101 | 0 | Rn | 0 | imm3 | Rd | imm2 | stype | Rm",
        "hex_opcode": "0xEBA00000",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Subtracts Operand2 from Rn, storing the result in Rd. If S=1, the N, Z, C, V flags are updated based on the result; otherwise flags are unaffected. This is a Thumb-2 32-bit instruction that allows use of high registers (R8-R15) and larger constant operands than 16-bit Thumb SUB.",
      "example": "SUB.W r0, r1, r2",
      "pseudocode": "result ← Rn - Operand2; Rd ← result; if S == 1 then: N ← result[31]; Z ← (result == 0); C ← NOT BorrowFrom(Rn, Operand2); V ← OverflowFrom(Rn, -Operand2);"
    },
    {
      "mnemonic": "sbc.w",
      "architecture": "ARMv8-A",
      "full_name": "Subtract with Carry (Wide)",
      "summary": "Thumb-2 32-bit subtract with carry.",
      "syntax": "SBC.W <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 1011 | 0 | Rn | 0 | imm3 | Rd | imm2 | stype | Rm",
        "hex_opcode": "0xEB600000",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "1011",
            "clean": "1011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Subtracts Operand2 and the inverted Carry flag from Rn, storing the result in Rd. If S=1, the N, Z, C, V flags are updated based on the result; otherwise flags are unaffected. This is a Thumb-2 32-bit instruction used for multi-word arithmetic with carry propagation.",
      "example": "SBC.W r0, r1, r2",
      "pseudocode": "result ← Rn - Operand2 - (NOT C); Rd ← result; if S == 1 then: N ← result[31]; Z ← (result == 0); C ← NOT BorrowFrom(Rn, Operand2, NOT C); V ← OverflowFrom(Rn, -Operand2, NOT C);"
    },
    {
      "mnemonic": "rsb.w",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Subtract (Wide)",
      "summary": "Thumb-2 32-bit reverse subtract.",
      "syntax": "RSB.W <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 1110 | 0 | Rn | 0 | imm3 | Rd | imm2 | stype | Rm",
        "hex_opcode": "0xEBC00000",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Reverse-subtracts Rn from Operand2, storing the result in Rd (computes Operand2 - Rn). If S=1, the N, Z, C, V flags are updated based on the result; otherwise flags are unaffected. This is a Thumb-2 32-bit instruction allowing negation and complex arithmetic patterns.",
      "example": "RSB.W r0, r1, r2",
      "pseudocode": "result ← Operand2 - Rn; Rd ← result; if S == 1 then: N ← result[31]; Z ← (result == 0); C ← NOT BorrowFrom(Operand2, Rn); V ← OverflowFrom(Operand2, -Rn);"
    },
    {
      "mnemonic": "and.w",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise AND (Wide)",
      "summary": "Thumb-2 32-bit AND.",
      "syntax": "AND.W <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 0000 | 0 | Rn | 0 | imm3 | Rd | imm2 | stype | Rm",
        "hex_opcode": "0xEA000000",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Performs a bitwise AND of Rn and the shifted Operand2, storing the result in Rd. In Thumb-2, this is a 32-bit instruction that can update the condition flags (N, Z, C) when the S bit is set; V is unaffected. The operand2 can be a register with optional shift or an immediate value.",
      "example": "AND.W r0, r1, r2",
      "pseudocode": "result ← Rn AND Operand2\nRd ← result\nif S == 1 then\n  CPSR.N ← result[31]\n  CPSR.Z ← (result == 0)\n  CPSR.C ← CarryOut(Operand2)\nelse\n  CPSR.C ← CPSR.C"
    },
    {
      "mnemonic": "orr.w",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise OR (Wide)",
      "summary": "Thumb-2 32-bit OR.",
      "syntax": "ORR.W <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 0010 | 0 | Rn | 0 | imm3 | Rd | imm2 | stype | Rm",
        "hex_opcode": "0xEA400000",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Performs a bitwise OR of Rn and the shifted Operand2, storing the result in Rd. In Thumb-2, this is a 32-bit instruction that can update the condition flags (N, Z, C) when the S bit is set; V is unaffected. The operand2 can be a register with optional shift or an immediate value.",
      "example": "ORR.W r0, r1, r2",
      "pseudocode": "result ← Rn OR Operand2\nRd ← result\nif S == 1 then\n  CPSR.N ← result[31]\n  CPSR.Z ← (result == 0)\n  CPSR.C ← CarryOut(Operand2)\nelse\n  CPSR.C ← CPSR.C"
    },
    {
      "mnemonic": "eor.w",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Exclusive OR (Wide)",
      "summary": "Thumb-2 32-bit XOR.",
      "syntax": "EOR.W <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 0100 | 0 | Rn | 0 | imm3 | Rd | imm2 | stype | Rm",
        "hex_opcode": "0xEA800000",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Performs a bitwise exclusive-OR (XOR) of Rn and the shifted Operand2, storing the result in Rd. In Thumb-2, this is a 32-bit instruction that can update the condition flags (N, Z, C) when the S bit is set; V is unaffected. The operand2 can be a register with optional shift or an immediate value.",
      "example": "EOR.W r0, r1, r2",
      "pseudocode": "result ← Rn XOR Operand2\nRd ← result\nif S == 1 then\n  CPSR.N ← result[31]\n  CPSR.Z ← (result == 0)\n  CPSR.C ← CarryOut(Operand2)\nelse\n  CPSR.C ← CPSR.C"
    },
    {
      "mnemonic": "bic.w",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Bit Clear (Wide)",
      "summary": "Thumb-2 32-bit AND NOT.",
      "syntax": "BIC.W <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 0001 | 0 | Rn | 0 | imm3 | Rd | imm2 | stype | Rm",
        "hex_opcode": "0xEA200000",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Performs a bitwise AND of Rn with the bitwise NOT of the shifted Operand2, effectively clearing bits in Rn where Operand2 has set bits. In Thumb-2, this is a 32-bit instruction that can update the condition flags (N, Z, C) when the S bit is set; V is unaffected. The operand2 can be a register with optional shift or an immediate value.",
      "example": "BIC.W r0, r1, r2",
      "pseudocode": "result ← Rn AND NOT Operand2\nRd ← result\nif S == 1 then\n  CPSR.N ← result[31]\n  CPSR.Z ← (result == 0)\n  CPSR.C ← CarryOut(Operand2)\nelse\n  CPSR.C ← CPSR.C"
    },
    {
      "mnemonic": "orn.w",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise OR NOT (Wide)",
      "summary": "Thumb-2 32-bit OR NOT.",
      "syntax": "ORN.W <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 0011 | 0 | Rn | 0 | imm3 | Rd | imm2 | stype | Rm",
        "hex_opcode": "0xEA600000",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Bitwise OR NOT: computes Rd = Rn | ~Operand2, performing a logical OR between Rn and the bitwise NOT of Operand2. The N and Z flags are updated based on the result; C is updated by the shifter; V is unaffected. This is a Thumb-2 (32-bit) instruction available in T32 execution state.",
      "example": "ORN.W r0, r1, r2",
      "pseudocode": "result ← Rn | (NOT Operand2)\nRd ← result\nN ← result[31]\nZ ← (result == 0)\nC ← CarryOut(NOT Operand2)\nV ← unchanged"
    },
    {
      "mnemonic": "mov.w",
      "architecture": "ARMv8-A",
      "full_name": "Move (Wide)",
      "summary": "Thumb-2 32-bit Move.",
      "syntax": "MOV.W <Rd>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 0010 | 0 | 1111 | 0 | imm3 | Rd | imm2 | stype | Rm",
        "hex_opcode": "0xEA4F0000",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Moves Operand2 into Rd without affecting any flags (the S bit is fixed to 0 in this variant). This is a Thumb-2 32-bit instruction that allows encoding of larger immediates (via modified immediate) and access to high registers (R8-R15), providing greater flexibility than 16-bit Thumb MOV.",
      "example": "MOV.W r0, r2",
      "pseudocode": "Rd ← Operand2;"
    },
    {
      "mnemonic": "mvn.w",
      "architecture": "ARMv8-A",
      "full_name": "Move NOT (Wide)",
      "summary": "Thumb-2 32-bit Move Inverse.",
      "syntax": "MVN.W <Rd>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 0011 | 0 | 1111 | 0 | imm3 | Rd | imm2 | stype | Rm",
        "hex_opcode": "0xEA6F0000",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Thumb-2 32-bit bitwise NOT: Rd ← NOT(Operand2). The second operand can be a register or a shifted register. If the S suffix is present, the condition flags N and Z are updated based on the result, and C is updated from the shifter carry-out; V is unaffected. Execution state: T32 only.",
      "example": "MVN.W r0, r2",
      "pseudocode": "result ← NOT(Operand2)\nRd ← result\nif S then\n  N ← result[31]\n  Z ← (result == 0)\n  C ← shifter_carry_out"
    },
    {
      "mnemonic": "tst.w",
      "architecture": "ARMv8-A",
      "full_name": "Test (Wide)",
      "summary": "Thumb-2 32-bit Test (AND and update flags).",
      "syntax": "TST.W <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 0000 | 1 | Rn | 0 | imm3 | 1111 | imm2 | stype | Rm",
        "hex_opcode": "0xEA100F00",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Test (AND and update flags): computes the bitwise AND of Rn and Operand2, updating the N and Z flags based on the result without writing to a destination register. C is updated by the shifter; V is unaffected. This is a Thumb-2 (32-bit) instruction available in T32 execution state.",
      "example": "TST.W r1, r2",
      "pseudocode": "result ← Rn AND Operand2\nN ← result[31]\nZ ← (result == 0)\nC ← CarryOut(Operand2)\nV ← unchanged"
    },
    {
      "mnemonic": "teq.w",
      "architecture": "ARMv8-A",
      "full_name": "Test Equivalence (Wide)",
      "summary": "Thumb-2 32-bit Test Equivalence (XOR and update flags).",
      "syntax": "TEQ.W <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 0100 | 1 | Rn | 0 | imm3 | 1111 | imm2 | stype | Rm",
        "hex_opcode": "0xEA900F00",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Test Equivalence (XOR and update flags): computes the bitwise XOR of Rn and Operand2, updating the N and Z flags based on the result without writing to a destination register. C is updated by the shifter; V is unaffected. This is a Thumb-2 (32-bit) instruction available in T32 execution state.",
      "example": "TEQ.W r1, r2",
      "pseudocode": "result ← Rn XOR Operand2\nN ← result[31]\nZ ← (result == 0)\nC ← CarryOut(Operand2)\nV ← unchanged"
    },
    {
      "mnemonic": "cmp.w",
      "architecture": "ARMv8-A",
      "full_name": "Compare (Wide)",
      "summary": "Thumb-2 32-bit Compare (Subtract and update flags).",
      "syntax": "CMP.W <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 1101 | 1 | Rn | 0 | imm3 | 1111 | imm2 | stype | Rm",
        "hex_opcode": "0xEBB00F00",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Compare (Subtract and update flags): computes Rn - Operand2, updating the N, Z, C, and V flags based on the result without writing to a destination register. This is a Thumb-2 (32-bit) instruction available in T32 execution state and is commonly used to set condition flags for subsequent conditional branches.",
      "example": "CMP.W r1, r2",
      "pseudocode": "result ← Rn - Operand2\nN ← result[31]\nZ ← (result == 0)\nC ← NOT BorrowFrom(Rn - Operand2)\nV ← OverflowFrom(Rn - Operand2)"
    },
    {
      "mnemonic": "cmn.w",
      "architecture": "ARMv8-A",
      "full_name": "Compare Negative (Wide)",
      "summary": "Thumb-2 32-bit Compare Negative (Add and update flags).",
      "syntax": "CMN.W <Rn>, <Operand2>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 1000 | 1 | Rn | 0 | imm3 | 1111 | imm2 | stype | Rm",
        "hex_opcode": "0xEB100F00",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Compare Negative (Add and update flags): computes Rn + Operand2, updating the N, Z, C, and V flags based on the result without writing to a destination register. This is a Thumb-2 (32-bit) instruction available in T32 execution state and is commonly used to compare a register against the negation of a value.",
      "example": "CMN.W r1, r2",
      "pseudocode": "result ← Rn + Operand2\nN ← result[31]\nZ ← (result == 0)\nC ← CarryOut(Rn + Operand2)\nV ← OverflowFrom(Rn + Operand2)"
    },
    {
      "mnemonic": "cdp",
      "architecture": "ARMv8-A",
      "full_name": "Coprocessor Data Processing (A32)",
      "summary": "Initiates a coprocessor data processing operation.",
      "syntax": "CDP<c> <coproc>, <opc1>, <CRd>, <CRn>, <CRm>, <opc2>",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "cond | 1110 | opc1 | CRn | CRd | coproc | opc2 | 0 | CRm",
        "hex_opcode": "0x0E000000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "opc1",
            "clean": "opc1"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "CRd",
            "clean": "CRd"
          },
          {
            "raw": "coproc",
            "clean": "coproc"
          },
          {
            "raw": "opc2",
            "clean": "opc2"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          }
        ]
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "CRd",
          "desc": "Destination coprocessor register"
        },
        {
          "name": "CRn",
          "desc": "First source coprocessor register"
        },
        {
          "name": "CRm",
          "desc": "Second source coprocessor register"
        }
      ],
      "extension": "A32 (System)",
      "description": "Coprocessor Data Processing: initiates a data processing operation in the specified coprocessor using three coprocessor registers and two operation codes. The instruction is conditional based on the condition field and does not modify processor flags. This is an A32 instruction restricted to privileged execution states in systems with a coprocessor.",
      "example": "CDP p15, 0, c0, c1, c2, 0",
      "pseudocode": "if ConditionPassed() then\n  Coprocessor[coproc].DataProcessing(opc1, CRd, CRn, CRm, opc2)"
    },
    {
      "mnemonic": "cdp2",
      "architecture": "ARMv8-A",
      "full_name": "Coprocessor Data Processing 2 (A32)",
      "summary": "Initiates a coprocessor operation (Extension encoding).",
      "syntax": "CDP2<c> <coproc>, <opc1>, <CRd>, <CRn>, <CRm>, <opc2>",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "11111110 | opc1 | CRn | CRd | coproc | opc2 | 0 | CRm",
        "hex_opcode": "0xFE000000",
        "visual_parts": [
          {
            "raw": "11111110",
            "clean": "11111110"
          },
          {
            "raw": "opc1",
            "clean": "opc1"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "CRd",
            "clean": "CRd"
          },
          {
            "raw": "coproc",
            "clean": "coproc"
          },
          {
            "raw": "opc2",
            "clean": "opc2"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          }
        ]
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "CRd",
          "desc": "Destination coprocessor register"
        },
        {
          "name": "CRn",
          "desc": "First source coprocessor register"
        },
        {
          "name": "CRm",
          "desc": "Second source coprocessor register"
        }
      ],
      "extension": "A32 (System)",
      "description": "Coprocessor Data Processing 2 (unconditional extension): initiates a data processing operation in the specified coprocessor using three coprocessor registers and two operation codes. Unlike CDP, this instruction is unconditional and uses the extension encoding (always executes). Restricted to privileged execution states in systems with a coprocessor.",
      "example": "CDP2 p15, 0, c0, c1, c2, 0",
      "pseudocode": "Coprocessor[coproc].DataProcessing(opc1, CRd, CRn, CRm, opc2)"
    },
    {
      "mnemonic": "mcr2",
      "architecture": "ARMv8-A",
      "full_name": "Move to Coprocessor from Register 2 (A32)",
      "summary": "Writes a general-purpose register to a coprocessor (Extension encoding).",
      "syntax": "MCR2<c> <coproc>, <opc1>, <Rt>, <CRn>, <CRm>{, <opc2>}",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "11111110 | opc1 | 0 | CRn | Rt | coproc | opc2 | 1 | CRm",
        "hex_opcode": "0xFE000010",
        "visual_parts": [
          {
            "raw": "11111110",
            "clean": "11111110"
          },
          {
            "raw": "opc1",
            "clean": "opc1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "coproc",
            "clean": "coproc"
          },
          {
            "raw": "opc2",
            "clean": "opc2"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          }
        ]
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "CRn",
          "desc": "Dest CP Reg"
        }
      ],
      "extension": "A32 (System)",
      "description": "A32 coprocessor data transfer (extension encoding): writes the general-purpose register Rt to the coprocessor coproc, register CRm, with operation codes opc1 and opc2. Does not modify condition flags. Execution state: A32 only; requires coprocessor support. May cause an Undefined Instruction exception if the coprocessor does not exist.",
      "example": "MCR2 p15, 0, r3, c1, c2",
      "pseudocode": "Coprocessor[coproc].CRm[opc2] ← Rt"
    },
    {
      "mnemonic": "mrc2",
      "architecture": "ARMv8-A",
      "full_name": "Move to Register from Coprocessor 2 (A32)",
      "summary": "Reads a coprocessor register into a general-purpose register (Extension encoding).",
      "syntax": "MRC2<c> <coproc>, <opc1>, <Rt>, <CRn>, <CRm>{, <opc2>}",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "11111110 | opc1 | 1 | CRn | Rt | coproc | opc2 | 1 | CRm",
        "hex_opcode": "0xFE100010",
        "visual_parts": [
          {
            "raw": "11111110",
            "clean": "11111110"
          },
          {
            "raw": "opc1",
            "clean": "opc1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "coproc",
            "clean": "coproc"
          },
          {
            "raw": "opc2",
            "clean": "opc2"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          }
        ]
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "CRn",
          "desc": "Src CP Reg"
        }
      ],
      "extension": "A32 (System)",
      "description": "A32 coprocessor data transfer (extension encoding): reads a coprocessor register (CRn, CRm) from coproc into the general-purpose register Rt. The opc1 and opc2 fields specify the operation. Does not modify condition flags. Execution state: A32 only; requires coprocessor support. May cause an Undefined Instruction exception if the coprocessor does not exist.",
      "example": "MRC2 p15, 0, r3, c1, c2",
      "pseudocode": "Rt ← Coprocessor[coproc].CRn[opc1] or Coprocessor[coproc].CRm[opc2]"
    },
    {
      "mnemonic": "mcrr2",
      "architecture": "ARMv8-A",
      "full_name": "Move to Coprocessor from Two Registers 2 (A32)",
      "summary": "Writes two registers to a coprocessor (Extension encoding).",
      "syntax": "MCRR2<c> <coproc>, <opc1>, <Rt>, <Rt2>, <CRm>",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "111111000100 | Rt2 | Rt | coproc | opc1 | CRm",
        "hex_opcode": "0xFC400000",
        "visual_parts": [
          {
            "raw": "111111000100",
            "clean": "111111000100"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "coproc",
            "clean": "coproc"
          },
          {
            "raw": "opc1",
            "clean": "opc1"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          }
        ]
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rt2",
          "desc": "Second transfer register (load/store pair)"
        }
      ],
      "extension": "A32 (System)",
      "description": "A32 coprocessor data transfer (extension encoding): writes two general-purpose registers (Rt, Rt2) to the coprocessor coproc, coprocessor register CRm, with operation code opc1. Does not modify condition flags. Execution state: A32 only; requires coprocessor support. May cause an Undefined Instruction exception if the coprocessor does not exist.",
      "example": "MCRR2 p15, 0, r3, r4, c2",
      "pseudocode": "Coprocessor[coproc].CRm ← (Rt2 : Rt)"
    },
    {
      "mnemonic": "mrrc2",
      "architecture": "ARMv8-A",
      "full_name": "Move to Two Registers from Coprocessor 2 (A32)",
      "summary": "Reads a coprocessor register into two registers (Extension encoding).",
      "syntax": "MRRC2<c> <coproc>, <opc1>, <Rt>, <Rt2>, <CRm>",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "111111000101 | Rt2 | Rt | coproc | opc1 | CRm",
        "hex_opcode": "0xFC500000",
        "visual_parts": [
          {
            "raw": "111111000101",
            "clean": "111111000101"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "coproc",
            "clean": "coproc"
          },
          {
            "raw": "opc1",
            "clean": "opc1"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          }
        ]
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "Rt",
          "desc": "Dest 1"
        },
        {
          "name": "Rt2",
          "desc": "Dest 2"
        }
      ],
      "extension": "A32 (System)",
      "description": "A32 coprocessor data transfer (extension encoding): reads a 64-bit value from coprocessor coproc register CRm into two general-purpose registers (Rt, Rt2), with operation code opc1. Does not modify condition flags. Execution state: A32 only; requires coprocessor support. May cause an Undefined Instruction exception if the coprocessor does not exist.",
      "example": "MRRC2 p15, 0, r3, r4, c2",
      "pseudocode": "(Rt2 : Rt) ← Coprocessor[coproc].CRm"
    },
    {
      "mnemonic": "ldc2",
      "architecture": "ARMv8-A",
      "full_name": "Load Coprocessor 2 (A32)",
      "summary": "Loads memory into a coprocessor (Extension encoding).",
      "syntax": "LDC2{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "1111110 | P | U | N | W | 1 | Rn | CRd | coproc | imm8",
        "hex_opcode": "0xFD100000",
        "visual_parts": [
          {
            "raw": "1111110",
            "clean": "1111110"
          },
          {
            "raw": "P",
            "clean": "P"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "W",
            "clean": "W"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "CRd",
            "clean": "CRd"
          },
          {
            "raw": "coproc",
            "clean": "coproc"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ]
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "CRd",
          "desc": "Destination coprocessor register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (System)",
      "description": "Load Coprocessor 2 (unconditional extension): loads a word or multiple words from memory into a coprocessor register, with the memory address computed from Rn plus an optional offset. The P, U, W bits control pre/post-indexing and writeback; the instruction is unconditional and uses the extension encoding. Restricted to privileged execution states and requires a coprocessor.",
      "example": "LDC2 p15, c0, [r1, #+/-#16]!",
      "pseudocode": "if P == 0 and W == 1 then\n  address ← Rn\n  Rn ← Rn + (if U then imm8 << 2 else -(imm8 << 2))\nelse if P == 1 then\n  address ← Rn + (if U then imm8 << 2 else -(imm8 << 2))\n  if W == 1 then Rn ← address\nCoprocessor[coproc].LoadFromMemory(CRd, address)"
    },
    {
      "mnemonic": "stc2",
      "architecture": "ARMv8-A",
      "full_name": "Store Coprocessor 2 (A32)",
      "summary": "Stores coprocessor contents to memory (Extension encoding).",
      "syntax": "STC2{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}",
      "encoding": {
        "format": "Coprocessor",
        "binary_pattern": "1111110 | P | U | N | W | 0 | Rn | CRd | coproc | imm8",
        "hex_opcode": "0xFD000000",
        "visual_parts": [
          {
            "raw": "1111110",
            "clean": "1111110"
          },
          {
            "raw": "P",
            "clean": "P"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "W",
            "clean": "W"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "CRd",
            "clean": "CRd"
          },
          {
            "raw": "coproc",
            "clean": "coproc"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ]
      },
      "operands": [
        {
          "name": "coproc",
          "desc": "CP Num"
        },
        {
          "name": "CRd",
          "desc": "Destination coprocessor register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (System)",
      "description": "Stores coprocessor data to memory using an extension encoding (STC2 variant). The instruction computes an address from base register Rn and an offset (imm8 scaled by 4), and writes coprocessor register CRd to that memory location. The P, U, N, W bits control pre/post-indexing, up/down offset direction, narrow/wide transfer, and write-back. Condition flags are not affected.",
      "example": "STC2 p15, c0, [r1, #+/-#16]!",
      "pseudocode": "if ConditionPassed() then\n  address ← ComputeAddress(Rn, imm8, P, U, W)\n  memory[address] ← CP[coproc, CRd]\n  if W == 1 then Rn ← address"
    },
    {
      "mnemonic": "rrx",
      "architecture": "ARMv8-A",
      "full_name": "Rotate Right with Extend (A32)",
      "summary": "Shifts register right by 1, inserting Carry flag into MSB.",
      "syntax": "RRX{S}<c> <Rd>, <Rm>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00011 | 01 | 0 | 0000 | Rd | 00000 | 11 | 0 | Rm",
        "hex_opcode": "0x01A00060",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "A32 Rotate Right with Extend by 1: Rd ← (C : Rm)[32:1], where the Carry flag is shifted into the MSB and the LSB is shifted out to C. If the S suffix is present, N and Z are updated from the result, and C is updated from the shifted-out bit; V is unaffected. Execution state: A32 only.",
      "example": "RRX r0, r2",
      "pseudocode": "shifted_result ← (C : Rm)[32:1]\nRd ← shifted_result\nif S then\n  N ← shifted_result[31]\n  Z ← (shifted_result == 0)\n  C ← Rm[0]"
    },
    {
      "mnemonic": "rrx",
      "architecture": "ARMv8-A",
      "full_name": "Rotate Right with Extend (Thumb)",
      "summary": "Thumb-2 32-bit Rotate Right with Extend.",
      "syntax": "RRX{S}.W <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb2 Data Proc",
        "binary_pattern": "1110101 | 0010 | 0 | 1111 | 0 | 000 | Rd | 00 | 11 | Rm",
        "hex_opcode": "0xEA4F0030",
        "visual_parts": [
          {
            "raw": "1110101",
            "clean": "1110101"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Thumb-2 32-bit Rotate Right with Extend by 1: Rd ← (C : Rm)[32:1], where the Carry flag is rotated into the MSB and the LSB is shifted out to C. If the S suffix is present, N and Z are updated from the result, and C is updated from the shifted-out bit; V is unaffected. Execution state: T32 only.",
      "example": "RRX.W r0, r2",
      "pseudocode": "shifted_result ← (C : Rm)[32:1]\nRd ← shifted_result\nif S then\n  N ← shifted_result[31]\n  Z ← (shifted_result == 0)\n  C ← Rm[0]"
    },
    {
      "mnemonic": "b.w",
      "architecture": "ARMv8-A",
      "full_name": "Branch (Wide)",
      "summary": "Thumb-2 32-bit Unconditional Branch (large range).",
      "syntax": "B.W <label>",
      "encoding": {
        "format": "Thumb Branch",
        "binary_pattern": "11110 | S | imm10 | 10 | J1 | 1 | J2 | imm11",
        "hex_opcode": "0xF0009000",
        "visual_parts": [
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "imm10",
            "clean": "imm10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "J1",
            "clean": "J1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "J2",
            "clean": "J2"
          },
          {
            "raw": "imm11",
            "clean": "imm11"
          }
        ],
        "bit_positions": "31:27 | 26 | 25:16 | 15:14 | 13 | 12 | 11 | 10:0"
      },
      "operands": [
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Thumb-2 32-bit unconditional branch with large range (±16 MB). Computes the target address by sign-extending the immediate offset (formed from S, imm10, J1, J2, imm11) and adding it to PC. No condition flags are affected; no registers are modified except PC.",
      "example": "B.W label",
      "pseudocode": "if ConditionPassed() then\n  offset ← SignExtend(S || imm10 || J1 || J2 || imm11, 24)\n  PC ← PC + (offset << 1)"
    },
    {
      "mnemonic": "bl.w",
      "architecture": "ARMv8-A",
      "full_name": "Branch with Link (Wide)",
      "summary": "Thumb-2 32-bit Branch with Link.",
      "syntax": "BL.W <label>",
      "encoding": {
        "format": "Thumb Branch",
        "binary_pattern": "11110 | S | imm10 | 11 | J1 | 1 | J2 | imm11",
        "hex_opcode": "0xF000D000",
        "visual_parts": [
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "imm10",
            "clean": "imm10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "J1",
            "clean": "J1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "J2",
            "clean": "J2"
          },
          {
            "raw": "imm11",
            "clean": "imm11"
          }
        ],
        "bit_positions": "31:27 | 26 | 25:16 | 15:14 | 13 | 12 | 11 | 10:0"
      },
      "operands": [
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Thumb-2 32-bit branch with link and large range (±16 MB). Stores return address (next instruction) in LR and branches to the target computed from the S, imm10, J1, J2, imm11 fields. No condition flags are affected.",
      "example": "BL.W label",
      "pseudocode": "if ConditionPassed() then\n  LR ← PC + 4 | 1\n  offset ← SignExtend(S || imm10 || J1 || J2 || imm11, 24)\n  PC ← PC + (offset << 1)"
    },
    {
      "mnemonic": "adr.w",
      "architecture": "ARMv8-A",
      "full_name": "Form PC-relative Address (Wide)",
      "summary": "Thumb-2 32-bit ADR.",
      "syntax": "ADR.W <Rd>, <label>",
      "encoding": {
        "format": "Thumb Data Proc",
        "binary_pattern": "11110 | i | 10 | 0 | 0 | 0 | 0 | 1111 | 0 | imm3 | Rd | imm8",
        "hex_opcode": "0xF20F0000",
        "visual_parts": [
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "i",
            "clean": "i"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "31:27 | 26 | 25:24 | 23 | 22 | 21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Thumb-2 32-bit form PC-relative address: Rd ← PC + offset, where the offset is computed from the immediate fields encoded as a 12-bit modified immediate. The assembler calculates the label-relative offset and encodes it. Does not modify condition flags. Execution state: T32 only.",
      "example": "ADR.W r0, label",
      "pseudocode": "offset ← expand_12bit_imm(i : imm3 : imm8)\nRd ← Align(PC, 4) + offset"
    },
    {
      "mnemonic": "ldr.w",
      "architecture": "ARMv8-A",
      "full_name": "Load Register (Wide)",
      "summary": "Thumb-2 32-bit Load Word.",
      "syntax": "LDR.W <Rt>, [<Rn>, #<imm>]",
      "encoding": {
        "format": "Thumb Load",
        "binary_pattern": "111110001 | 10 | 1 | Rn | Rt | imm12",
        "hex_opcode": "0xF8D00000",
        "visual_parts": [
          {
            "raw": "111110001",
            "clean": "111110001"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:23 | 22:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Load a 32-bit word from memory at address [Rn + imm12] into Rt. The immediate offset is unsigned and ranges from 0 to 4095 bytes. Condition flags (N, Z, C, V) are not affected. T32 (Thumb-2) instruction only.",
      "example": "LDR.W r3, [r1, #16]",
      "pseudocode": "address ← Rn + ZeroExtend(imm12, 32);\nRt ← [address]<31:0>;"
    },
    {
      "mnemonic": "ldrb.w",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Byte (Wide)",
      "summary": "Thumb-2 32-bit Load Byte.",
      "syntax": "LDRB.W <Rt>, [<Rn>, #<imm>]",
      "encoding": {
        "format": "Thumb Load",
        "binary_pattern": "111110001 | 00 | 1 | Rn | Rt | imm12",
        "hex_opcode": "0xF8900000",
        "visual_parts": [
          {
            "raw": "111110001",
            "clean": "111110001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:23 | 22:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Load an 8-bit byte from memory at address [Rn + imm12] into Rt, zero-extending to 32 bits. The immediate offset is unsigned and ranges from 0 to 4095 bytes. Condition flags (N, Z, C, V) are not affected. T32 (Thumb-2) instruction only.",
      "example": "LDRB.W r3, [r1, #16]",
      "pseudocode": "address ← Rn + ZeroExtend(imm12, 32);\nRt ← ZeroExtend([address]<7:0>, 32);"
    },
    {
      "mnemonic": "ldrh.w",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Halfword (Wide)",
      "summary": "Thumb-2 32-bit Load Halfword.",
      "syntax": "LDRH.W <Rt>, [<Rn>, #<imm>]",
      "encoding": {
        "format": "Thumb Load",
        "binary_pattern": "111110001 | 01 | 1 | Rn | Rt | imm12",
        "hex_opcode": "0xF8B00000",
        "visual_parts": [
          {
            "raw": "111110001",
            "clean": "111110001"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:23 | 22:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Load a 16-bit halfword from memory at address [Rn + imm12] into Rt, zero-extending to 32 bits. The immediate offset is unsigned and ranges from 0 to 4095 bytes; the halfword must be 2-byte aligned. Condition flags (N, Z, C, V) are not affected. T32 (Thumb-2) instruction only.",
      "example": "LDRH.W r3, [r1, #16]",
      "pseudocode": "address ← Rn + ZeroExtend(imm12, 32);\nRt ← ZeroExtend([address]<15:0>, 32);"
    },
    {
      "mnemonic": "ldrsb.w",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Signed Byte (Wide)",
      "summary": "Thumb-2 32-bit Load Signed Byte.",
      "syntax": "LDRSB.W <Rt>, [<Rn>, #<imm>]",
      "encoding": {
        "format": "Thumb Load",
        "binary_pattern": "111110011 | 00 | 1 | Rn | Rt | imm12",
        "hex_opcode": "0xF9900000",
        "visual_parts": [
          {
            "raw": "111110011",
            "clean": "111110011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:23 | 22:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Load an 8-bit signed byte from memory at address [Rn + imm12] into Rt, sign-extending to 32 bits. The immediate offset is unsigned and ranges from 0 to 4095 bytes. Condition flags (N, Z, C, V) are not affected. T32 (Thumb-2) instruction only.",
      "example": "LDRSB.W r3, [r1, #16]",
      "pseudocode": "address ← Rn + ZeroExtend(imm12, 32);\nRt ← SignExtend([address]<7:0>, 32);"
    },
    {
      "mnemonic": "ldrsh.w",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Signed Halfword (Wide)",
      "summary": "Thumb-2 32-bit Load Signed Halfword.",
      "syntax": "LDRSH.W <Rt>, [<Rn>, #<imm>]",
      "encoding": {
        "format": "Thumb Load",
        "binary_pattern": "111110011 | 01 | 1 | Rn | Rt | imm12",
        "hex_opcode": "0xF9B00000",
        "visual_parts": [
          {
            "raw": "111110011",
            "clean": "111110011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:23 | 22:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Load a 16-bit signed halfword from memory at address [Rn + imm12] into Rt, sign-extending to 32 bits. The immediate offset is unsigned and ranges from 0 to 4095 bytes; the halfword must be 2-byte aligned. Condition flags (N, Z, C, V) are not affected. T32 (Thumb-2) instruction only.",
      "example": "LDRSH.W r3, [r1, #16]",
      "pseudocode": "address ← Rn + ZeroExtend(imm12, 32);\nRt ← SignExtend([address]<15:0>, 32);"
    },
    {
      "mnemonic": "str.w",
      "architecture": "ARMv8-A",
      "full_name": "Store Register (Wide)",
      "summary": "Thumb-2 32-bit Store Word.",
      "syntax": "STR.W <Rt>, [<Rn>, #<imm>]",
      "encoding": {
        "format": "Thumb Store",
        "binary_pattern": "111110001 | 10 | 0 | Rn | Rt | imm12",
        "hex_opcode": "0xF8C00000",
        "visual_parts": [
          {
            "raw": "111110001",
            "clean": "111110001"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:23 | 22:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Store a 32-bit word from Rt to memory at address [Rn + imm12]. The immediate offset is unsigned and ranges from 0 to 4095 bytes. Condition flags (N, Z, C, V) are not affected. T32 (Thumb-2) instruction only.",
      "example": "STR.W r3, [r1, #16]",
      "pseudocode": "address ← Rn + ZeroExtend(imm12, 32);\n[address]<31:0> ← Rt;"
    },
    {
      "mnemonic": "strb.w",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Byte (Wide)",
      "summary": "Thumb-2 32-bit Store Byte.",
      "syntax": "STRB.W <Rt>, [<Rn>, #<imm>]",
      "encoding": {
        "format": "Thumb Store",
        "binary_pattern": "111110001 | 00 | 0 | Rn | Rt | imm12",
        "hex_opcode": "0xF8800000",
        "visual_parts": [
          {
            "raw": "111110001",
            "clean": "111110001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:23 | 22:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Store the lowest 8 bits of Rt to memory at address [Rn + imm12]. The immediate offset is unsigned and ranges from 0 to 4095 bytes. Condition flags (N, Z, C, V) are not affected. T32 (Thumb-2) instruction only.",
      "example": "STRB.W r3, [r1, #16]",
      "pseudocode": "address ← Rn + ZeroExtend(imm12, 32);\n[address]<7:0> ← Rt<7:0>;"
    },
    {
      "mnemonic": "strh.w",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Halfword (Wide)",
      "summary": "Thumb-2 32-bit Store Halfword.",
      "syntax": "STRH.W <Rt>, [<Rn>, #<imm>]",
      "encoding": {
        "format": "Thumb Store",
        "binary_pattern": "111110001 | 01 | 0 | Rn | Rt | imm12",
        "hex_opcode": "0xF8A00000",
        "visual_parts": [
          {
            "raw": "111110001",
            "clean": "111110001"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:23 | 22:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Store the lowest 16 bits of Rt to memory at address [Rn + imm12]. The immediate offset is unsigned and ranges from 0 to 4095 bytes; the halfword must be 2-byte aligned. Condition flags (N, Z, C, V) are not affected. T32 (Thumb-2) instruction only.",
      "example": "STRH.W r3, [r1, #16]",
      "pseudocode": "address ← Rn + ZeroExtend(imm12, 32);\n[address]<15:0> ← Rt<15:0>;"
    },
    {
      "mnemonic": "ldm.w",
      "architecture": "ARMv8-A",
      "full_name": "Load Multiple (Wide)",
      "summary": "Thumb-2 32-bit Load Multiple.",
      "syntax": "LDM.W <Rn>{!}, <registers>",
      "encoding": {
        "format": "Thumb Load Multiple",
        "binary_pattern": "1110100 | 01 | 0 | W | 1 | Rn | P | M | register_list",
        "hex_opcode": "0xE8900000",
        "visual_parts": [
          {
            "raw": "1110100",
            "clean": "1110100"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "W",
            "clean": "W"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "P",
            "clean": "P"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "register_list",
            "clean": "register_list"
          }
        ],
        "bit_positions": "31:25 | 24:23 | 22 | 21 | 20 | 19:16 | 15 | 14 | 13:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "registers",
          "desc": "List"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Load Multiple (32-bit Thumb-2 encoding) loads a list of general-purpose registers from consecutive memory locations starting at the address in Rn. If the writeback bit (!) is set, Rn is updated to point to the first address after the loaded data. No flags are affected by this instruction. Execution is restricted to T32 (Thumb-2) state.",
      "example": "LDM.W r1!, registers",
      "pseudocode": "address ← Rn\nfor each register in registers (in increasing order):\n  register ← [address]\n  address ← address + 4\nif writeback:\n  Rn ← address"
    },
    {
      "mnemonic": "stm.w",
      "architecture": "ARMv8-A",
      "full_name": "Store Multiple (Wide)",
      "summary": "Thumb-2 32-bit Store Multiple.",
      "syntax": "STM.W <Rn>{!}, <registers>",
      "encoding": {
        "format": "Thumb Store Multiple",
        "binary_pattern": "1110100 | 01 | 0 | W | 0 | Rn | 0 | M | register_list",
        "hex_opcode": "0xE8800000",
        "visual_parts": [
          {
            "raw": "1110100",
            "clean": "1110100"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "W",
            "clean": "W"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "register_list",
            "clean": "register_list"
          }
        ],
        "bit_positions": "31:25 | 24:23 | 22 | 21 | 20 | 19:16 | 15 | 14 | 13:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "registers",
          "desc": "List"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Store Multiple (32-bit Thumb-2 encoding) stores a list of general-purpose registers to consecutive memory locations starting at the address in Rn. If the writeback bit (!) is set, Rn is updated to point to the first address after the stored data. No flags are affected by this instruction. Execution is restricted to T32 (Thumb-2) state.",
      "example": "STM.W r1!, registers",
      "pseudocode": "address ← Rn\nfor each register in registers (in increasing order):\n  [address] ← register\n  address ← address + 4\nif writeback:\n  Rn ← address"
    },
    {
      "mnemonic": "pop.w",
      "architecture": "ARMv8-A",
      "full_name": "Pop (Wide)",
      "summary": "Thumb-2 32-bit Pop.",
      "syntax": "POP.W <registers>",
      "encoding": {
        "format": "Thumb Load Multiple",
        "binary_pattern": "1110100 | 01 | 0 | 1 | 1 | 1101 | P | M | register_list",
        "hex_opcode": "0xE8BD0000",
        "visual_parts": [
          {
            "raw": "1110100",
            "clean": "1110100"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "P",
            "clean": "P"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "register_list",
            "clean": "register_list"
          }
        ],
        "bit_positions": "31:25 | 24:23 | 22 | 21 | 20 | 19:16 | 15 | 14 | 13:0"
      },
      "operands": [
        {
          "name": "registers",
          "desc": "List"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Thumb-2 32-bit pop instruction that loads multiple general-purpose registers from the stack. Loads the registers listed in the register list from memory at [SP], [SP+4], etc., and increments SP by 4×(number of registers). If PC is in the register list, it is loaded and execution jumps to that address.",
      "example": "POP.W registers",
      "pseudocode": "for i = 0 to 15\n  if registers[i] == 1 then\n    Ri ← memory[SP]\n    SP ← SP + 4\nif registers[15] == 1 then\n  PC ← R15"
    },
    {
      "mnemonic": "push.w",
      "architecture": "ARMv8-A",
      "full_name": "Push (Wide)",
      "summary": "Thumb-2 32-bit Push.",
      "syntax": "PUSH.W <registers>",
      "encoding": {
        "format": "Thumb Store Multiple",
        "binary_pattern": "1110100 | 10 | 0 | 1 | 0 | 1101 | 0 | M | register_list",
        "hex_opcode": "0xE92D0000",
        "visual_parts": [
          {
            "raw": "1110100",
            "clean": "1110100"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "register_list",
            "clean": "register_list"
          }
        ],
        "bit_positions": "31:25 | 24:23 | 22 | 21 | 20 | 19:16 | 15 | 14 | 13:0"
      },
      "operands": [
        {
          "name": "registers",
          "desc": "List"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Thumb-2 32-bit push instruction that stores multiple general-purpose registers to the stack. Decrements SP by 4×(number of registers) and stores each register in the list to memory in ascending order of register number. This is equivalent to STMDB SP!, <registers>.",
      "example": "PUSH.W registers",
      "pseudocode": "SP ← SP - 4 * PopCount(registers)\nfor i = 0 to 15\n  if registers[i] == 1 then\n    memory[SP + 4*(count_of_set_bits_below_i)] ← Ri"
    },
    {
      "mnemonic": "vaba",
      "architecture": "ARMv8-A",
      "full_name": "Vector Absolute Difference and Accumulate",
      "summary": "Computes absolute difference and adds to accumulator.",
      "syntax": "VABA<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0111 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000710",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "NEON Vector Absolute Difference and Accumulate: computes the absolute difference between corresponding elements in Qn and Qm, then adds the results to the corresponding elements in Qd (accumulation). The data type (dt) determined by sz (8, 16, 32 bits) specifies element width. NEON flags (FPSCR) are not modified; no general condition flags are affected.",
      "example": "VABA.dt q0, q1, q2",
      "pseudocode": "for i = 0 to num_elements(Qd, dt) - 1\n  diff ← abs(Qn[i] - Qm[i])\n  Qd[i] ← Qd[i] + diff"
    },
    {
      "mnemonic": "vabd",
      "architecture": "ARMv8-A",
      "full_name": "Vector Absolute Difference",
      "summary": "Computes absolute difference between elements.",
      "syntax": "VABD<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0111 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2000700",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "NEON Vector Absolute Difference: computes the absolute difference between corresponding elements in Qn and Qm and stores results in Qd. The data type (dt) determined by sz specifies element width (8, 16, or 32 bits). NEON flags are not modified; no general condition flags are affected.",
      "example": "VABD.dt q0, q1, q2",
      "pseudocode": "for i = 0 to num_elements(Qd, dt) - 1\n  Qd[i] ← abs(Qn[i] - Qm[i])"
    },
    {
      "mnemonic": "vabs",
      "architecture": "ARMv8-A",
      "full_name": "Vector Absolute Value",
      "summary": "Calculates absolute value of integer/float elements.",
      "syntax": "VABS<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 01 | Vd | 0 | F | 110 | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B10300",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "F",
            "clean": "F"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10 | 9:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "NEON Vector Absolute Value: computes the absolute value of each element in Qm and stores the result in Qd. Supports integer (8, 16, 32 bits) and floating-point (32 bits) data types as specified by sz. NEON flags are not modified; no general condition flags are affected.",
      "example": "VABS.dt q0, q2",
      "pseudocode": "for i = 0 to num_elements(Qd, dt) - 1\n  Qd[i] ← abs(Qm[i])"
    },
    {
      "mnemonic": "vadd",
      "architecture": "ARMv8-A",
      "full_name": "Vector Add (Integer)",
      "summary": "Adds integer elements of two vectors.",
      "syntax": "VADD<c>.I<size> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | size | Vn | Vd | 1000 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2000800",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Add (Integer) performs element-wise addition of two NEON 128-bit registers, adding corresponding integer elements of size 8, 16, 32, or 64 bits. The instruction executes in Q-register (128-bit) mode and wraps on overflow without setting flags. This is a NEON SIMD instruction available in both A32 and T32 states when NEON is supported.",
      "example": "VADD.Isize q0, q1, q2",
      "pseudocode": "for each element i in Qd:\n  Qd[i] ← Qn[i] + Qm[i]"
    },
    {
      "mnemonic": "vaddhn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Add High Narrow",
      "summary": "Adds 2N-bit elements, selects high N-bits for result.",
      "syntax": "VADDHN<c>.<dt> <Dd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 1 | D | size | Vn | Vd | 0100 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2800400",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Dest Narrow"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds corresponding 2N-bit elements from two 128-bit NEON registers, then selects the high N bits of each result and stores them as N-bit elements in the destination 64-bit register. This instruction performs unsigned or signed addition at 2× the element width, then narrows the result. No flags are affected.",
      "example": "VADDHN.dt d0, q1, q2",
      "pseudocode": "for i = 0 to pairs-1\n  Dd[i] ← (Qn[i] + Qm[i])[2*N-1:N]"
    },
    {
      "mnemonic": "vaddl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Add Long",
      "summary": "Adds N-bit elements, producing 2N-bit results.",
      "syntax": "VADDL<c>.<dt> <Qd>, <Dn>, <Dm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 1 | D | size | Vn | Vd | 000 | 0 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2800000",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest Wide"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds corresponding N-bit elements from two 64-bit NEON registers and produces 2N-bit results stored in a 128-bit register. This instruction performs widening addition, doubling the element width and producing twice as many result bits. No flags are affected.",
      "example": "VADDL.dt q0, d1, d2",
      "pseudocode": "for i = 0 to pairs-1\n  Qd[i] ← Dn[i] + Dm[i]"
    },
    {
      "mnemonic": "vaddw",
      "architecture": "ARMv8-A",
      "full_name": "Vector Add Wide",
      "summary": "Adds N-bit vector to 2N-bit vector.",
      "syntax": "VADDW<c>.<dt> <Qd>, <Qn>, <Dm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 1 | D | size | Vn | Vd | 000 | 1 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2800100",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest Wide"
        },
        {
          "name": "Qn",
          "desc": "Src Wide"
        },
        {
          "name": "Dm",
          "desc": "Src Narrow"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds a 64-bit vector of N-bit elements to a 128-bit vector of 2N-bit elements, with the narrow operand implicitly widened before addition. The result is stored in the 128-bit destination. This instruction combines widening and addition in a single operation. No flags are affected.",
      "example": "VADDW.dt q0, q1, d2",
      "pseudocode": "for i = 0 to pairs-1\n  Qd[i] ← Qn[i] + widen(Dm[i])"
    },
    {
      "mnemonic": "vand",
      "architecture": "ARMv8-A",
      "full_name": "Vector Bitwise AND",
      "summary": "Bitwise AND of two vectors.",
      "syntax": "VAND<c> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | 00 | Vn | Vd | 0001 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000110",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs bitwise AND on corresponding bits of two 128-bit NEON registers and stores the result in the destination register. This instruction is data-type agnostic and operates on the bit patterns directly. No flags are affected.",
      "example": "VAND q0, q1, q2",
      "pseudocode": "Qd ← Qn AND Qm"
    },
    {
      "mnemonic": "vbic",
      "architecture": "ARMv8-A",
      "full_name": "Vector Bitwise Bit Clear",
      "summary": "ANDs Vd with NOT of Vm (Vd & ~Vm).",
      "syntax": "VBIC<c> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | 01 | Vn | Vd | 0001 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2100110",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs bitwise AND of the first operand with the bitwise NOT of the second operand (Qd ← Qn AND NOT Qm), storing the result in the destination register. This clears bits in Qn where the corresponding bits in Qm are set. No flags are affected.",
      "example": "VBIC q0, q1, q2",
      "pseudocode": "Qd ← Qn AND (NOT Qm)"
    },
    {
      "mnemonic": "vbif",
      "architecture": "ARMv8-A",
      "full_name": "Vector Bit Insert False",
      "summary": "Inserts bits from Vm into Vd where Vn (mask) is 0.",
      "syntax": "VBIF<c> <Qd>, <Qm>, <Qn>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 1 | 0 | D | 11 | Vn | Vd | 0001 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF3300110",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "Mask"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Selectively inserts bits from Qm into Qd where the corresponding bits in Qn (the mask) are 0. Where mask bits are 1, the original Qd bits are retained. This is a masked insert operation. No flags are affected.",
      "example": "VBIF q0, q2, q1",
      "pseudocode": "for i = 0 to 127\n  if Qn[i] == 0 then Qd[i] ← Qm[i]"
    },
    {
      "mnemonic": "vbit",
      "architecture": "ARMv8-A",
      "full_name": "Vector Bit Insert True",
      "summary": "Inserts bits from Vm into Vd where Vn (mask) is 1.",
      "syntax": "VBIT<c> <Qd>, <Qm>, <Qn>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 1 | 0 | D | 10 | Vn | Vd | 0001 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF3200110",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "Mask"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Selectively inserts bits from Qm into Qd where the corresponding bits in Qn (the mask) are 1. Where mask bits are 0, the original Qd bits are retained. This is the complement of VBIF. No flags are affected.",
      "example": "VBIT q0, q2, q1",
      "pseudocode": "for i = 0 to 127\n  if Qn[i] == 1 then Qd[i] ← Qm[i]"
    },
    {
      "mnemonic": "vbsl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Bit Select",
      "summary": "Selects bits from Vn or Vm based on Vd (mask).",
      "syntax": "VBSL<c> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 1 | 0 | D | 01 | Vn | Vd | 0001 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF3100110",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest/Mask"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a bit-select operation using Qd as the mask: selects bits from Qn where Qd bits are 1 and from Qm where Qd bits are 0. The result is stored in Qd. This implements the operation Qd ← (Qd AND Qn) OR (NOT Qd AND Qm). No flags are affected.",
      "example": "VBSL q0, q1, q2",
      "pseudocode": "for i = 0 to 127\n  if Qd[i] == 1 then Qd[i] ← Qn[i] else Qd[i] ← Qm[i]"
    },
    {
      "mnemonic": "vceq",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare Equal",
      "summary": "Sets destination bits to all 1s if elements equal, else 0s.",
      "syntax": "VCEQ<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 1 | 0 | D | size | Vn | Vd | 1000 | N | 1 | M | 1 | Vm",
        "hex_opcode": "0xF3000850",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Compare Equal performs element-wise equality comparison on 128-bit SIMD registers. For each element in Qn and Qm, if they are equal, the corresponding element in Qd is set to all 1s; otherwise, it is set to all 0s. No condition flags are affected. This is a NEON instruction available in both A32 and T32 states.",
      "example": "VCEQ.dt q0, q1, q2",
      "pseudocode": "for i = 0 to (128 / element_size) - 1 do\n  if Qn[i] == Qm[i] then\n    Qd[i] ← all_ones\n  else\n    Qd[i] ← all_zeros\n  end if\nend for"
    },
    {
      "mnemonic": "vcge",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare Greater Than or Equal",
      "summary": "Compares elements (>=) and sets result mask.",
      "syntax": "VCGE<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0011 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000310",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Compare Greater Than or Equal performs signed element-wise comparison on 128-bit SIMD registers. For each element in Qn, if it is greater than or equal to the corresponding element in Qm, the result element in Qd is set to all 1s; otherwise, it is set to all 0s. No condition flags are affected. This is a NEON instruction available in both A32 and T32 states.",
      "example": "VCGE.dt q0, q1, q2",
      "pseudocode": "for i = 0 to (128 / element_size) - 1 do\n  if Qn[i] >= Qm[i] then\n    Qd[i] ← all_ones\n  else\n    Qd[i] ← all_zeros\n  end if\nend for"
    },
    {
      "mnemonic": "vcgt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare Greater Than",
      "summary": "Compares elements (>) and sets result mask.",
      "syntax": "VCGT<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0011 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2000300",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Compare Greater Than performs signed element-wise comparison on 128-bit SIMD registers. For each element in Qn, if it is strictly greater than the corresponding element in Qm, the result element in Qd is set to all 1s; otherwise, it is set to all 0s. No condition flags are affected. This is a NEON instruction available in both A32 and T32 states.",
      "example": "VCGT.dt q0, q1, q2",
      "pseudocode": "for i = 0 to (128 / element_size) - 1 do\n  if Qn[i] > Qm[i] then\n    Qd[i] ← all_ones\n  else\n    Qd[i] ← all_zeros\n  end if\nend for"
    },
    {
      "mnemonic": "vcle",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare Less Than or Equal",
      "summary": "Compares elements (<=). Alias for VCGE with swapped operands.",
      "syntax": "VCLE<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON Alias",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0011 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000310",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Compare Less Than or Equal is an alias that performs signed element-wise comparison on 128-bit SIMD registers with operands swapped relative to VCGE. For each element in Qn, if it is less than or equal to the corresponding element in Qm, the result element in Qd is set to all 1s; otherwise, it is set to all 0s. No condition flags are affected. This is a NEON instruction available in both A32 and T32 states.",
      "example": "VCLE.dt q0, q1, q2",
      "pseudocode": "for i = 0 to (128 / element_size) - 1 do\n  if Qn[i] <= Qm[i] then\n    Qd[i] ← all_ones\n  else\n    Qd[i] ← all_zeros\n  end if\nend for"
    },
    {
      "mnemonic": "vclt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare Less Than",
      "summary": "Compares elements (<). Alias for VCGT with swapped operands.",
      "syntax": "VCLT<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON Alias",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0011 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2000300",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Compare Less Than is an alias that performs signed element-wise comparison on 128-bit SIMD registers with operands swapped relative to VCGT. For each element in Qn, if it is strictly less than the corresponding element in Qm, the result element in Qd is set to all 1s; otherwise, it is set to all 0s. No condition flags are affected. This is a NEON instruction available in both A32 and T32 states.",
      "example": "VCLT.dt q0, q1, q2",
      "pseudocode": "for i = 0 to (128 / element_size) - 1 do\n  if Qn[i] < Qm[i] then\n    Qd[i] ← all_ones\n  else\n    Qd[i] ← all_zeros\n  end if\nend for"
    },
    {
      "mnemonic": "vcls",
      "architecture": "ARMv8-A",
      "full_name": "Vector Count Leading Sign Bits",
      "summary": "Counts number of consecutive sign bits.",
      "syntax": "VCLS<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 00 | Vd | 0 | 1000 | 1 | M | 0 | Vm",
        "hex_opcode": "0xF3B00440",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Count Leading Sign Bits counts the number of consecutive sign bits (bits matching the sign bit) in each element of the source register. For each integer element in Qm, the result in Qd is the count of leading sign bits. The data type determines element size (8, 16, or 32 bits). No condition flags are affected. This is a NEON instruction available in both A32 and T32 states.",
      "example": "VCLS.dt q0, q2",
      "pseudocode": "for i = 0 to (128 / element_size) - 1 do\n  sign_bit ← Qm[i] >> (element_size - 1)\n  count ← 0\n  for j = element_size - 2 downto 0 do\n    if (Qm[i] >> j) & 1 == sign_bit then\n      count ← count + 1\n    else\n      break\n    end if\n  end for\n  Qd[i] ← count\nend for"
    },
    {
      "mnemonic": "vclz",
      "architecture": "ARMv8-A",
      "full_name": "Vector Count Leading Zeros",
      "summary": "Counts number of consecutive zeros.",
      "syntax": "VCLZ<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 00 | Vd | 0 | 1001 | 1 | M | 0 | Vm",
        "hex_opcode": "0xF3B004C0",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Count Leading Zeros counts the number of consecutive zero bits from the most significant bit in each element of the source register. For each integer element in Qm, the result in Qd is the count of leading zeros. The data type determines element size (8, 16, or 32 bits). No condition flags are affected. This is a NEON instruction available in both A32 and T32 states.",
      "example": "VCLZ.dt q0, q2",
      "pseudocode": "for i = 0 to (128 / element_size) - 1 do\n  count ← 0\n  for j = element_size - 1 downto 0 do\n    if (Qm[i] >> j) & 1 == 0 then\n      count ← count + 1\n    else\n      break\n    end if\n  end for\n  Qd[i] ← count\nend for"
    },
    {
      "mnemonic": "vcnt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Count Set Bits",
      "summary": "Population count (number of 1s) per byte.",
      "syntax": "VCNT<c>.8 <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 00 | Vd | 0 | 1010 | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B00500",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Count Set Bits (population count) counts the number of set (1) bits in each 8-bit element of the source register. For each byte element in Qm, the result in Qd is the count of set bits within that byte. The data type is always .8 (8-bit elements). No condition flags are affected. This is a NEON instruction available in both A32 and T32 states.",
      "example": "VCNT.8 q0, q2",
      "pseudocode": "for i = 0 to 15 do\n  count ← 0\n  for j = 0 to 7 do\n    if (Qm[8*i + j] & (1 << j)) != 0 then\n      count ← count + 1\n    end if\n  end for\n  Qd[8*i..8*i+7] ← count\nend for"
    },
    {
      "mnemonic": "vdup",
      "architecture": "ARMv8-A",
      "full_name": "Vector Duplicate (Scalar)",
      "summary": "Duplicates a scalar value to all lanes of a vector.",
      "syntax": "VDUP<c>.<dt> <Qd>, <Dm[x]>",
      "encoding": {
        "format": "NEON Scalar",
        "binary_pattern": "111100111 | D | 11 | imm4 | Vd | 11 | 000 | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B00C00",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Dm[x]",
          "desc": "Scalar"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Duplicates a scalar value from a lane of a NEON register to all lanes of a destination vector. The scalar is extracted from the indexed lane of Dm based on the element size, then broadcast to fill all lanes of Qd. No condition flags are affected. This is an ARMv7 Advanced SIMD (NEON) instruction, executable in both A32 and T32 states.",
      "example": "VDUP.dt q0, Dm[x]",
      "pseudocode": "lane_index ← imm4\nelement_size ← dt_in_bits\nscalar_value ← Dm[lane_index]\nfor i = 0 to (128 / element_size - 1)\n  Qd[i] ← scalar_value"
    },
    {
      "mnemonic": "veor",
      "architecture": "ARMv8-A",
      "full_name": "Vector Exclusive OR",
      "summary": "Bitwise XOR of two vectors.",
      "syntax": "VEOR<c> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 1 | 0 | D | 00 | Vn | Vd | 0001 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF3000110",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a bitwise exclusive OR (XOR) of corresponding lanes in two 128-bit NEON vectors and stores the result in the destination. Each lane of Qn is XORed with the corresponding lane of Qm, producing Qd. No condition flags are affected. This is an ARMv7 Advanced SIMD instruction, executable in both A32 and T32 states.",
      "example": "VEOR q0, q1, q2",
      "pseudocode": "for i = 0 to 127\n  Qd[i] ← Qn[i] XOR Qm[i]"
    },
    {
      "mnemonic": "vext",
      "architecture": "ARMv8-A",
      "full_name": "Vector Extract",
      "summary": "Extracts a new vector from a pair of vectors (Sliding window).",
      "syntax": "VEXT<c>.8 <Qd>, <Qn>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Extract",
        "binary_pattern": "111100101 | D | 11 | Vn | Vd | imm4 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2B00000",
        "visual_parts": [
          {
            "raw": "111100101",
            "clean": "111100101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "Low Src"
        },
        {
          "name": "Qm",
          "desc": "High Src"
        },
        {
          "name": "imm",
          "desc": "Byte Offset"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Extracts a contiguous sequence of bytes from the concatenation of two 128-bit NEON vectors and stores the result in the destination. The vectors Qn and Qm are logically concatenated, then bytes [imm:imm+15] are extracted to form Qd. All operations are on 8-bit granularity. No condition flags are affected. This is an ARMv7 Advanced SIMD instruction, executable in both A32 and T32 states.",
      "example": "VEXT.8 q0, q1, q2, #16",
      "pseudocode": "combined ← (Qn << (imm * 8)) | (Qm >> ((16 - imm) * 8))\nQd ← combined[127:0]\nfor i = 0 to 15\n  Qd[8*i+7:8*i] ← (Qn || Qm)[8*(imm+i)+7:8*(imm+i)]"
    },
    {
      "mnemonic": "vhadd",
      "architecture": "ARMv8-A",
      "full_name": "Vector Halving Add",
      "summary": "Add elements and shift right by 1 (Average).",
      "syntax": "VHADD<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 00 | 0 | 0 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xF2000040",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds corresponding elements of two 128-bit NEON vectors and right-shifts the result by 1 bit (rounded toward zero), effectively computing the average. The operation is performed element-wise according to the data type. No condition flags are affected. This is an ARMv7 Advanced SIMD instruction, executable in both A32 and T32 states.",
      "example": "VHADD.dt q0, q1, q2",
      "pseudocode": "for each lane i of size specified by dt\n  sum ← Qn[i] + Qm[i]\n  Qd[i] ← sum >> 1"
    },
    {
      "mnemonic": "vhsub",
      "architecture": "ARMv8-A",
      "full_name": "Vector Halving Subtract",
      "summary": "Subtract elements and shift right by 1.",
      "syntax": "VHSUB<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 00 | 1 | 0 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2000200",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Subtracts corresponding elements of two 128-bit NEON vectors and right-shifts the result by 1 bit (rounded toward zero). The operation is performed element-wise according to the data type. No condition flags are affected. This is an ARMv7 Advanced SIMD instruction, executable in both A32 and T32 states.",
      "example": "VHSUB.dt q0, q1, q2",
      "pseudocode": "for each lane i of size specified by dt\n  diff ← Qn[i] - Qm[i]\n  Qd[i] ← diff >> 1"
    },
    {
      "mnemonic": "vld1",
      "architecture": "ARMv8-A",
      "full_name": "Vector Load Multiple (Single Element)",
      "summary": "Loads vector data from memory (interleaved or sequential).",
      "syntax": "VLD1<c>.<size> <list>, [<Rn>]{!}",
      "encoding": {
        "format": "NEON Load",
        "binary_pattern": "111101001 | D | 1 | 0 | Rn | Vd | 00 | 00 | index_align | 1101",
        "hex_opcode": "0xF4A0000D",
        "visual_parts": [
          {
            "raw": "111101001",
            "clean": "111101001"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "index_align",
            "clean": "index_align"
          },
          {
            "raw": "1101",
            "clean": "1101"
          }
        ],
        "bit_positions": "31:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "list",
          "desc": "Dest Registers"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Loads one or more NEON vectors from memory at an address specified by a general-purpose register, with optional post-index update. The instruction supports contiguous or strided loading patterns depending on the type field. No condition flags are affected. This is an ARMv7 Advanced SIMD memory instruction, executable in both A32 and T32 states.",
      "example": "VLD1.size {r0-r3}, [r1]!",
      "pseudocode": "address ← Rn\nfor each register in list\n  load vector from address\n  address ← address + stride\nif writeback\n  Rn ← Rn + total_bytes_loaded"
    },
    {
      "mnemonic": "vld2",
      "architecture": "ARMv8-A",
      "full_name": "Vector Load Multiple (2-Element Structure)",
      "summary": "De-interleaves 2 streams of data while loading.",
      "syntax": "VLD2<c>.<size> <list>, [<Rn>]{!}",
      "encoding": {
        "format": "NEON Load",
        "binary_pattern": "111101001 | D | 1 | 0 | Rn | Vd | 00 | 01 | index_align | 1101",
        "hex_opcode": "0xF4A0010D",
        "visual_parts": [
          {
            "raw": "111101001",
            "clean": "111101001"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "index_align",
            "clean": "index_align"
          },
          {
            "raw": "1101",
            "clean": "1101"
          }
        ],
        "bit_positions": "31:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "list",
          "desc": "Dest Registers"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Loads two streams of interleaved data from memory and de-interleaves them into separate 128-bit NEON vectors. The instruction handles 2-element structures, reading from memory and distributing elements to the destination registers in a de-interleaved pattern. No condition flags are affected. This is an ARMv7 Advanced SIMD memory instruction, executable in both A32 and T32 states.",
      "example": "VLD2.size {r0-r3}, [r1]!",
      "pseudocode": "address ← Rn\nfor each 2-element structure at address\n  element0 ← memory[address]\n  element1 ← memory[address + size_bytes]\n  store element0 in first destination register\n  store element1 in second destination register\n  address ← address + 2 * size_bytes\nif writeback\n  Rn ← Rn + total_bytes_loaded"
    },
    {
      "mnemonic": "vmax",
      "architecture": "ARMv8-A",
      "full_name": "Vector Maximum",
      "summary": "Selects maximum value from elements.",
      "syntax": "VMAX<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0110 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2000600",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Compares corresponding lanes of two 128-bit NEON vectors and stores the maximum value in each lane of the destination. The comparison is performed element-wise according to the data type (signed or unsigned integer). No condition flags are affected. This is an ARMv7 Advanced SIMD instruction, executable in both A32 and T32 states.",
      "example": "VMAX.dt q0, q1, q2",
      "pseudocode": "for each lane i of size specified by dt\n  if Qn[i] > Qm[i]\n    Qd[i] ← Qn[i]\n  else\n    Qd[i] ← Qm[i]"
    },
    {
      "mnemonic": "vmin",
      "architecture": "ARMv8-A",
      "full_name": "Vector Minimum",
      "summary": "Selects minimum value from elements.",
      "syntax": "VMIN<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0110 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000610",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs element-wise minimum operation on two 128-bit SIMD registers, selecting the smaller value from each corresponding pair of elements. The data type (sz field) determines whether elements are 32-bit or 16-bit integers. Condition flags N, Z, C, V are unaffected. This is an A32/T32 NEON instruction with no privilege restrictions.",
      "example": "VMIN.dt q0, q1, q2",
      "pseudocode": "for i = 0 to (128 / element_width) - 1:\n  Qd[i] ← min(Qn[i], Qm[i])"
    },
    {
      "mnemonic": "vmla",
      "architecture": "ARMv8-A",
      "full_name": "Vector Multiply Accumulate",
      "summary": "Multiplies and adds to accumulator.",
      "syntax": "VMLA<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | size | Vn | Vd | 1001 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2000900",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies corresponding elements from two source registers and accumulates (adds) the products into the destination register. Performs Qd ← Qd + (Qn × Qm) for each element. The sz field specifies 16-bit or 32-bit element width. Condition flags are unaffected. This is an A32/T32 NEON instruction with no privilege restrictions.",
      "example": "VMLA.dt q0, q1, q2",
      "pseudocode": "for i = 0 to (128 / element_width) - 1:\n  product ← Qn[i] × Qm[i]\n  Qd[i] ← Qd[i] + product"
    },
    {
      "mnemonic": "vmls",
      "architecture": "ARMv8-A",
      "full_name": "Vector Multiply Subtract",
      "summary": "Multiplies and subtracts from accumulator.",
      "syntax": "VMLS<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | 1 | sz | Vn | Vd | 1101 | N | 1 | M | 1 | Vm",
        "hex_opcode": "0xF2200D50",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies corresponding elements from two source registers and subtracts the products from the accumulator. Performs Qd ← Qd - (Qn × Qm) for each element. The sz field specifies 16-bit or 32-bit element width. Condition flags are unaffected. This is an A32/T32 NEON instruction with no privilege restrictions.",
      "example": "VMLS.dt q0, q1, q2",
      "pseudocode": "for i = 0 to (128 / element_width) - 1:\n  product ← Qn[i] × Qm[i]\n  Qd[i] ← Qd[i] - product"
    },
    {
      "mnemonic": "vmov",
      "architecture": "ARMv8-A",
      "full_name": "Vector Move (Immediate)",
      "summary": "Moves immediate value into vector.",
      "syntax": "VMOV<c>.<dt> <Qd>, #<imm>",
      "encoding": {
        "format": "NEON Imm",
        "binary_pattern": "1111001 | i | 1 | D | 000 | imm3 | Vd | cmode | 0 | 0 | 0 | 1 | imm4",
        "hex_opcode": "0xF2800010",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "i",
            "clean": "i"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "cmode",
            "clean": "cmode"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:19 | 18:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "imm",
          "desc": "Value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Move (Immediate) moves an immediate value into all elements of a 128-bit NEON register. The immediate is replicated across elements according to the data type (8, 16, 32, or 64 bits) and element expansion mode (cmode). No flags are affected. This is a NEON instruction available in both A32 and T32 states when NEON is supported.",
      "example": "VMOV.dt q0, #16",
      "pseudocode": "imm_expanded ← ExpandImmediate(imm, cmode)\nfor each element i in Qd:\n  Qd[i] ← imm_expanded"
    },
    {
      "mnemonic": "vmovl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Move Long",
      "summary": "Copies N-bit elements to 2N-bit elements (Widening).",
      "syntax": "VMOVL<c>.<dt> <Qd>, <Dm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "1111001 | U | 1 | D | imm3H | 000 | Vd | 1010 | 0 | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2800A10",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm3H",
            "clean": "imm3H"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:19 | 18:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest Wide"
        },
        {
          "name": "Dm",
          "desc": "Src Narrow"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Widens N-bit elements from a 64-bit source register to 2N-bit elements in a 128-bit destination register, with zero or sign extension based on the data type. The Q field and element size encoding determine which half of the source to use and the widening operation. Condition flags are unaffected. This is an A32/T32 NEON instruction with no privilege restrictions.",
      "example": "VMOVL.dt q0, d2",
      "pseudocode": "for i = 0 to (64 / source_element_width) - 1:\n  Qd[i] ← ZeroExtend(Dm[i]) or SignExtend(Dm[i])"
    },
    {
      "mnemonic": "vmovn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Move Narrow",
      "summary": "Copies 2N-bit elements to N-bit elements (Narrowing).",
      "syntax": "VMOVN<c>.<dt> <Dd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 10 | Vd | 0 | 0100 | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B20200",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Dest Narrow"
        },
        {
          "name": "Qm",
          "desc": "Src Wide"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Narrows 2N-bit elements from a 128-bit source register to N-bit elements in a 64-bit destination register, discarding the upper bits. The sz field determines the source element size (16, 32, or 64 bits) and corresponding destination size. Condition flags are unaffected. This is an A32/T32 NEON instruction with no privilege restrictions.",
      "example": "VMOVN.dt d0, q2",
      "pseudocode": "for i = 0 to (128 / source_element_width) - 1:\n  Dd[i] ← Qm[i][destination_element_width-1:0]"
    },
    {
      "mnemonic": "vmul",
      "architecture": "ARMv8-A",
      "full_name": "Vector Multiply",
      "summary": "Multiplies elements.",
      "syntax": "VMUL<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | op | 0 | D | size | Vn | Vd | 1001 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000910",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "op",
            "clean": "op"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs element-wise multiplication of two 128-bit SIMD registers, storing results in the destination. The sz field determines 16-bit or 32-bit element width. Condition flags N, Z, C, V are unaffected. This is an A32/T32 NEON instruction with no privilege restrictions.",
      "example": "VMUL.dt q0, q1, q2",
      "pseudocode": "for i = 0 to (128 / element_width) - 1:\n  Qd[i] ← Qn[i] × Qm[i]"
    },
    {
      "mnemonic": "vmull",
      "architecture": "ARMv8-A",
      "full_name": "Vector Multiply Long",
      "summary": "Multiplies N-bit elements producing 2N-bit results.",
      "syntax": "VMULL<c>.<dt> <Qd>, <Dn>, <Dm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 1 | D | size | Vn | Vd | 11 | op | 0 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2800C00",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "op",
            "clean": "op"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest Wide"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies N-bit elements from two 64-bit source registers to produce 2N-bit results in a 128-bit destination register. The sz field specifies 8, 16, or 32-bit source element width. Condition flags are unaffected. This is an A32/T32 NEON instruction with no privilege restrictions.",
      "example": "VMULL.dt q0, d1, d2",
      "pseudocode": "for i = 0 to (64 / source_element_width) - 1:\n  Qd[i] ← Dn[i] × Dm[i]"
    },
    {
      "mnemonic": "vmvn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Move NOT",
      "summary": "Moves bitwise inverse of immediate/register.",
      "syntax": "VMVN<c> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 00 | Vd | 0 | 1011 | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B00580",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1011",
            "clean": "1011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs bitwise NOT (inversion) of all bits in a 128-bit SIMD register, storing the result in the destination. This is a data-type-independent operation that works on all bit patterns equally. Condition flags are unaffected. This is an A32/T32 NEON instruction with no privilege restrictions.",
      "example": "VMVN q0, q2",
      "pseudocode": "Qd ← ~Qm"
    },
    {
      "mnemonic": "vneg",
      "architecture": "ARMv8-A",
      "full_name": "Vector Negate",
      "summary": "Negates integer/float elements.",
      "syntax": "VNEG<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 01 | Vd | 0 | F | 111 | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B10380",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "F",
            "clean": "F"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10 | 9:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Negates each element in the source vector and places the result in the destination register. For integer elements, the result is two's complement negation; for floating-point elements, only the sign bit is inverted. No condition flags are affected. Execution is available in both A32 and T32 instruction sets via NEON.",
      "example": "VNEG.dt q0, q2",
      "pseudocode": "for i = 0 to elements-1\n  Qd[i] ← -Qm[i]"
    },
    {
      "mnemonic": "vorn",
      "architecture": "ARMv8-A",
      "full_name": "Vector OR NOT",
      "summary": "Bitwise OR with NOT (Vd = Vn | ~Vm).",
      "syntax": "VORN<c> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | 11 | Vn | Vd | 0001 | N | 1 | M | 1 | Vm",
        "hex_opcode": "0xF2300150",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs bitwise OR of the first operand with the bitwise NOT of the second operand (Qd = Qn | ~Qm), element-wise. No condition flags are affected. Execution is available in both A32 and T32 instruction sets via NEON.",
      "example": "VORN q0, q1, q2",
      "pseudocode": "for i = 0 to 127\n  Qd[i] ← Qn[i] | ~Qm[i]"
    },
    {
      "mnemonic": "vorr",
      "architecture": "ARMv8-A",
      "full_name": "Vector Logical OR",
      "summary": "Bitwise OR of two vectors.",
      "syntax": "VORR<c> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | 10 | Vn | Vd | 0001 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2200110",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs bitwise OR of two vectors element-wise (Qd = Qn | Qm). No condition flags are affected. Execution is available in both A32 and T32 instruction sets via NEON.",
      "example": "VORR q0, q1, q2",
      "pseudocode": "for i = 0 to 127\n  Qd[i] ← Qn[i] | Qm[i]"
    },
    {
      "mnemonic": "vpadd",
      "architecture": "ARMv8-A",
      "full_name": "Vector Pairwise Add",
      "summary": "Adds adjacent pairs of elements.",
      "syntax": "VPADD<c>.<dt> <Dd>, <Dn>, <Dm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | size | Vn | Vd | 1011 | N | Q | M | 1 | Vm",
        "hex_opcode": "0xF2000B10",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1011",
            "clean": "1011"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds adjacent pairs of elements from the source operands and places the results in the destination register, reducing dimensionality by half. For example, in 32-bit mode, pairs of adjacent 32-bit elements are summed to produce 4 results in the 64-bit destination. No condition flags are affected. Execution is available in both A32 and T32 instruction sets via NEON.",
      "example": "VPADD.dt d0, d1, d2",
      "pseudocode": "case dt of\n  when I8:  for i = 0 to 3: Dd[i] ← Dn[2*i] + Dn[2*i+1] + Dm[2*i] + Dm[2*i+1]\n  when I16: for i = 0 to 1: Dd[i] ← Dn[2*i] + Dn[2*i+1] + Dm[2*i] + Dm[2*i+1]\n  when I32: Dd[0] ← Dn[0] + Dn[1]; Dd[1] ← Dm[0] + Dm[1]\n  when F32: Dd[0] ← Dn[0] + Dn[1]; Dd[1] ← Dm[0] + Dm[1]"
    },
    {
      "mnemonic": "vpmin",
      "architecture": "ARMv8-A",
      "full_name": "Vector Pairwise Minimum",
      "summary": "Minimum of adjacent pairs.",
      "syntax": "VPMIN<c>.<dt> <Dd>, <Dn>, <Dm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 1010 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000A10",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes the minimum of adjacent pairs of elements from the source operands and places the results in the destination register, reducing dimensionality by half. For each pair, the smaller element is selected. No condition flags are affected. Execution is available in both A32 and T32 instruction sets via NEON.",
      "example": "VPMIN.dt d0, d1, d2",
      "pseudocode": "case dt of\n  when I8:  for i = 0 to 3: Dd[i] ← min(Dn[2*i], Dn[2*i+1], Dm[2*i], Dm[2*i+1])\n  when I16: for i = 0 to 1: Dd[i] ← min(Dn[2*i], Dn[2*i+1], Dm[2*i], Dm[2*i+1])\n  when I32: Dd[0] ← min(Dn[0], Dn[1]); Dd[1] ← min(Dm[0], Dm[1])\n  when F32: Dd[0] ← min(Dn[0], Dn[1]); Dd[1] ← min(Dm[0], Dm[1])"
    },
    {
      "mnemonic": "vpmax",
      "architecture": "ARMv8-A",
      "full_name": "Vector Pairwise Maximum",
      "summary": "Maximum of adjacent pairs.",
      "syntax": "VPMAX<c>.<dt> <Dd>, <Dn>, <Dm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 1010 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2000A00",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes the maximum of adjacent pairs of elements from the source operands and places the results in the destination register, reducing dimensionality by half. For each pair, the larger element is selected. No condition flags are affected. Execution is available in both A32 and T32 instruction sets via NEON.",
      "example": "VPMAX.dt d0, d1, d2",
      "pseudocode": "case dt of\n  when I8:  for i = 0 to 3: Dd[i] ← max(Dn[2*i], Dn[2*i+1], Dm[2*i], Dm[2*i+1])\n  when I16: for i = 0 to 1: Dd[i] ← max(Dn[2*i], Dn[2*i+1], Dm[2*i], Dm[2*i+1])\n  when I32: Dd[0] ← max(Dn[0], Dn[1]); Dd[1] ← max(Dm[0], Dm[1])\n  when F32: Dd[0] ← max(Dn[0], Dn[1]); Dd[1] ← max(Dm[0], Dm[1])"
    },
    {
      "mnemonic": "vqadd",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Add",
      "summary": "Adds elements with saturation.",
      "syntax": "VQADD<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0000 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000010",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds corresponding elements from two vectors with saturation. If the result overflows or underflows, it is saturated to the data type's maximum or minimum representable value. No condition flags are affected; saturation status is not reflected in APSR. Execution is available in both A32 and T32 instruction sets via NEON.",
      "example": "VQADD.dt q0, q1, q2",
      "pseudocode": "for i = 0 to elements-1\n  Qd[i] ← SatQ(Qn[i] + Qm[i], dt)"
    },
    {
      "mnemonic": "vqsub",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Subtract",
      "summary": "Subtracts elements with saturation.",
      "syntax": "VQSUB<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0010 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000210",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Subtracts the second operand from the first with saturation. If the result overflows or underflows, it is saturated to the data type's maximum or minimum representable value. No condition flags are affected; saturation status is not reflected in APSR. Execution is available in both A32 and T32 instruction sets via NEON.",
      "example": "VQSUB.dt q0, q1, q2",
      "pseudocode": "for i = 0 to elements-1\n  Qd[i] ← SatQ(Qn[i] - Qm[i], dt)"
    },
    {
      "mnemonic": "vrecpe",
      "architecture": "ARMv8-A",
      "full_name": "Vector Reciprocal Estimate",
      "summary": "Estimates reciprocal (1/x).",
      "syntax": "VRECPE<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 11 | Vd | 0 | 10 | F | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0xF3B30440",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "F",
            "clean": "F"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes a vector reciprocal estimate (1/x) for each element in the source register and stores the result in the destination register. This is a Newton-Raphson reciprocal estimate; the result is not fully accurate and is intended as a starting point for iterative refinement. Condition flags (N, Z, C, V) are not affected. Executes in A32/T32 with NEON extension; requires FPEXC.EN = 1 for floating-point operation.",
      "example": "VRECPE.dt q0, q2",
      "pseudocode": "for i = 0 to 127 by element_size:\n  element ← Vm[i+element_size-1:i]\n  Qd[i+element_size-1:i] ← RecipEstimate(element)"
    },
    {
      "mnemonic": "vrsqrte",
      "architecture": "ARMv8-A",
      "full_name": "Vector Reciprocal Square Root Estimate",
      "summary": "Estimates reciprocal square root (1/sqrt(x)).",
      "syntax": "VRSQRTE<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 11 | Vd | 0 | 10 | F | 1 | 1 | M | 0 | Vm",
        "hex_opcode": "0xF3B304C0",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "F",
            "clean": "F"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes a vector reciprocal square root estimate (1/√x) for each element in the source register and stores the result in the destination register. This is a Newton-Raphson reciprocal square root estimate; the result serves as a starting point for iterative refinement. Condition flags (N, Z, C, V) are not affected. Executes in A32/T32 with NEON extension; requires FPEXC.EN = 1 for floating-point operation.",
      "example": "VRSQRTE.dt q0, q2",
      "pseudocode": "for i = 0 to 127 by element_size:\n  element ← Qm[i+element_size-1:i]\n  Qd[i+element_size-1:i] ← RecipSqrtEstimate(element)"
    },
    {
      "mnemonic": "vrev16",
      "architecture": "ARMv8-A",
      "full_name": "Vector Reverse 16",
      "summary": "Reverses bytes within 16-bit halfwords.",
      "syntax": "VREV16<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 00 | Vd | 0 | 00 | 10 | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B00100",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:9 | 8:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Reverses the byte order within each 16-bit halfword element in the source register. For example, bytes [1,0] become [0,1] within each 16-bit element. Condition flags (N, Z, C, V) are not affected. Executes in A32/T32 with NEON extension; operates on integer data types.",
      "example": "VREV16.dt q0, q2",
      "pseudocode": "for i = 0 to 127 by 16:\n  for j = 0 to 15 by 8:\n    Qd[i+j+7:i+j] ← Qm[i+15-j:i+8-j]"
    },
    {
      "mnemonic": "vrev32",
      "architecture": "ARMv8-A",
      "full_name": "Vector Reverse 32",
      "summary": "Reverses elements within 32-bit words.",
      "syntax": "VREV32<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 00 | Vd | 0 | 00 | 01 | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B00080",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:9 | 8:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Reverses the byte or halfword order within each 32-bit word element in the source register, depending on element size. For 8-bit elements, reverses bytes within words; for 16-bit elements, reverses halfwords within words. Condition flags (N, Z, C, V) are not affected. Executes in A32/T32 with NEON extension; operates on integer data types.",
      "example": "VREV32.dt q0, q2",
      "pseudocode": "if element_size == 8:\n  for i = 0 to 127 by 32:\n    for j = 0 to 31 by 8:\n      Qd[i+j+7:i+j] ← Qm[i+31-j:i+24-j]\nelse if element_size == 16:\n  for i = 0 to 127 by 32:\n    Qd[i+31:i+16] ← Qm[i+15:i+0]\n    Qd[i+15:i+0] ← Qm[i+31:i+16]"
    },
    {
      "mnemonic": "vrev64",
      "architecture": "ARMv8-A",
      "full_name": "Vector Reverse 64",
      "summary": "Reverses elements within 64-bit doublewords.",
      "syntax": "VREV64<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 00 | Vd | 0 | 00 | 00 | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B00000",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:9 | 8:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Reverses the order of elements within each 64-bit doubleword in the source register. The granularity of reversal depends on element size: 8-bit elements are reversed within 64-bit units, 16-bit elements are reversed within 64-bit units, and 32-bit elements are reversed within 64-bit units. Condition flags (N, Z, C, V) are not affected. Executes in A32/T32 with NEON extension; operates on integer data types.",
      "example": "VREV64.dt q0, q2",
      "pseudocode": "if element_size == 8:\n  for i = 0 to 127 by 64:\n    for j = 0 to 63 by 8:\n      Qd[i+j+7:i+j] ← Qm[i+63-j:i+56-j]\nelse if element_size == 16:\n  for i = 0 to 127 by 64:\n    for j = 0 to 48 by 16:\n      Qd[i+j+15:i+j] ← Qm[i+63-j:i+48-j]\nelse if element_size == 32:\n  for i = 0 to 127 by 64:\n    Qd[i+63:i+32] ← Qm[i+31:i+0]\n    Qd[i+31:i+0] ← Qm[i+63:i+32]"
    },
    {
      "mnemonic": "vshl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Shift Left (Immediate)",
      "summary": "Shifts elements left.",
      "syntax": "VSHL<c>.<dt> <Qd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "1111001 | 0 | 1 | D | imm6 | Vd | 0101 | L | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2800510",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "L",
            "clean": "L"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each element in the source register left by an immediate number of bits and stores the result in the destination register. Bits shifted out of the left end are lost, and zeros are shifted in from the right. The shift amount is applied uniformly to all elements and is encoded in the imm6 field, with the interpretation dependent on element size (sz). Condition flags (N, Z, C, V) are not affected. Executes in A32/T32 with NEON extension.",
      "example": "VSHL.dt q0, q2, #16",
      "pseudocode": "shift_amount ← DecodeImmShift(imm6, sz)  // Decodes imm6 based on element size\nfor i = 0 to 127 by element_size:\n  element ← Qm[i+element_size-1:i]\n  Qd[i+element_size-1:i] ← element << shift_amount"
    },
    {
      "mnemonic": "vshr",
      "architecture": "ARMv8-A",
      "full_name": "Vector Shift Right (Immediate)",
      "summary": "Shifts elements right.",
      "syntax": "VSHR<c>.<dt> <Qd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "1111001 | U | 1 | D | imm6 | Vd | 0000 | L | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2800010",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "L",
            "clean": "L"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each element in the source register right by an immediate number of bits, performing a logical (unsigned) or arithmetic (signed) shift depending on the data type, and stores the result in the destination register. For unsigned types, zeros are shifted in from the left; for signed types, the sign bit is extended. Condition flags (N, Z, C, V) are not affected. Executes in A32/T32 with NEON extension.",
      "example": "VSHR.dt q0, q2, #16",
      "pseudocode": "shift_amount ← DecodeImmShift(imm6, sz)  // Decodes imm6 based on element size\nfor i = 0 to 127 by element_size:\n  element ← Qm[i+element_size-1:i]\n  if is_signed_type:\n    Qd[i+element_size-1:i] ← arithmetic_shift_right(element, shift_amount)\n  else:\n    Qd[i+element_size-1:i] ← element >> shift_amount"
    },
    {
      "mnemonic": "vshrn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Shift Right Narrow",
      "summary": "Shifts right and narrows result.",
      "syntax": "VSHRN<c>.<dt> <Dd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "1111001 | 0 | 1 | D | imm6 | Vd | 1000 | 0 | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2800810",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Dest Narrow"
        },
        {
          "name": "Qm",
          "desc": "Src Wide"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each element in the 128-bit source register right by an immediate number of bits, narrows the result to half-width, and stores the narrowed values in the 64-bit destination register. For example, 16-bit results from 32-bit elements are stored in a 64-bit destination. Condition flags (N, Z, C, V) are not affected. Executes in A32/T32 with NEON extension.",
      "example": "VSHRN.dt d0, q2, #16",
      "pseudocode": "shift_amount ← DecodeImmShift(imm6, input_element_size)\noutput_element_size ← input_element_size / 2\nfor i = 0 to 63 by output_element_size:\n  element ← Qm[i*2+input_element_size*2-1:i*2]\n  shifted ← element >> shift_amount\n  Dd[i+output_element_size-1:i] ← shifted[output_element_size-1:0]"
    },
    {
      "mnemonic": "vst1",
      "architecture": "ARMv8-A",
      "full_name": "Vector Store Multiple (Single Element)",
      "summary": "Stores vector data to memory.",
      "syntax": "VST1<c>.<size> <list>, [<Rn>]{!}",
      "encoding": {
        "format": "NEON Store",
        "binary_pattern": "111101001 | D | 0 | 0 | Rn | Vd | 00 | 00 | index_align | 1101",
        "hex_opcode": "0xF480000D",
        "visual_parts": [
          {
            "raw": "111101001",
            "clean": "111101001"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "index_align",
            "clean": "index_align"
          },
          {
            "raw": "1101",
            "clean": "1101"
          }
        ],
        "bit_positions": "31:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:10 | 9:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "list",
          "desc": "Src Registers"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Stores one or more NEON vectors to memory at the address held in Rn. The <list> specifies the vector registers to store (1-4 registers), and <size> determines the element width (8, 16, 32, or 64 bits). If ! is present, Rn is post-indexed by the number of bytes stored. No flags are affected. Execution is restricted to A32/T32 with NEON support; privilege level is determined by the memory access.",
      "example": "VST1.size {r0-r3}, [r1]!",
      "pseudocode": "address ← Rn\nfor each register in list:\n  [address] ← register value (element size as specified)\n  address ← address + (register_width_in_bytes)\nif postindex:\n  Rn ← Rn + (total_bytes_stored)"
    },
    {
      "mnemonic": "vsub",
      "architecture": "ARMv8-A",
      "full_name": "Vector Subtract (Integer)",
      "summary": "Subtracts integer elements.",
      "syntax": "VSUB<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | 1 | sz | Vn | Vd | 1101 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xF2200D40",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Subtract (Integer) performs element-wise subtraction of two NEON 128-bit registers, subtracting corresponding integer elements of size 8, 16, 32, or 64 bits. The instruction executes in Q-register (128-bit) mode and wraps on underflow without setting flags. This is a NEON SIMD instruction available in both A32 and T32 states when NEON is supported.",
      "example": "VSUB.dt q0, q1, q2",
      "pseudocode": "for each element i in Qd:\n  Qd[i] ← Qn[i] - Qm[i]"
    },
    {
      "mnemonic": "vtbl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Table Lookup",
      "summary": "Look up elements in a vector table.",
      "syntax": "VTBL<c>.8 <Dd>, <list>, <Dm>",
      "encoding": {
        "format": "NEON Table",
        "binary_pattern": "111100111 | D | 11 | Vn | Vd | 10 | len | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B00800",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "len",
            "clean": "len"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "list",
          "desc": "Table"
        },
        {
          "name": "Dm",
          "desc": "Indices"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a table lookup where each element of Dm is used as an index into the table formed by one or more consecutive NEON registers in <list>, and the corresponding table element is written to Dd. Out-of-range indices produce a zero result. No flags are affected. Execution is restricted to A32/T32 with NEON support; the table may span 1-4 consecutive registers, controlled by the <len> encoding field.",
      "example": "VTBL.8 d0, {r0-r3}, d2",
      "pseudocode": "for i ← 0 to (size_of_Dd / 8) - 1:\n  index ← Dm[i*8 +: 8]\n  if index < (len + 1) * 16:\n    Dd[i*8 +: 8] ← table[index]\n  else:\n    Dd[i*8 +: 8] ← 0"
    },
    {
      "mnemonic": "vtrn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Transpose",
      "summary": "Transposes elements of two vectors.",
      "syntax": "VTRN<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 10 | Vd | 0 | 0001 | 1 | M | 0 | Vm",
        "hex_opcode": "0xF3B200C0",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest/Src1"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Transposes elements of two 128-bit NEON vectors Qd and Qm, swapping odd and even elements. The element size is determined by <dt> (8, 16, or 32 bits). After execution, Qd and Qm contain interleaved even/odd elements from the original vectors. No flags are affected. Execution is restricted to A32/T32 with NEON support.",
      "example": "VTRN.dt q0, q2",
      "pseudocode": "temp_d ← Qd\ntemp_m ← Qm\nfor i ← 0 to (128 / element_width) - 1:\n  if i is even:\n    Qd[i * element_width +: element_width] ← temp_d[i * element_width +: element_width]\n    Qm[i * element_width +: element_width] ← temp_m[i * element_width +: element_width]\n  else:\n    Qd[i * element_width +: element_width] ← temp_m[(i - 1) * element_width +: element_width]\n    Qm[i * element_width +: element_width] ← temp_d[(i - 1) * element_width +: element_width]"
    },
    {
      "mnemonic": "vtst",
      "architecture": "ARMv8-A",
      "full_name": "Vector Test Bits",
      "summary": "Tests if any bits match (Vd = (Vn & Vm) != 0).",
      "syntax": "VTST<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | size | Vn | Vd | 1000 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000810",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Tests if any bits match by computing (Qn AND Qm) per element and writing all 1s (matching element size) to Qd if the result is nonzero, else all 0s. Element size is determined by <dt>. No arithmetic flags are modified. Execution is restricted to A32/T32 with NEON support.",
      "example": "VTST.dt q0, q1, q2",
      "pseudocode": "for i ← 0 to (128 / element_width) - 1:\n  result ← Qn[i * element_width +: element_width] AND Qm[i * element_width +: element_width]\n  if result != 0:\n    Qd[i * element_width +: element_width] ← (element_width bits of 1s)\n  else:\n    Qd[i * element_width +: element_width] ← 0"
    },
    {
      "mnemonic": "vuzp",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unzip",
      "summary": "De-interleaves vectors.",
      "syntax": "VUZP<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 10 | Vd | 0 | 0010 | 1 | M | 0 | Vm",
        "hex_opcode": "0xF3B20140",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest/Src1"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "De-interleaves elements from two 128-bit NEON vectors by extracting all even-indexed or all odd-indexed elements and placing them into Qd and Qm respectively. Element size is determined by <dt>. No flags are affected. Execution is restricted to A32/T32 with NEON support.",
      "example": "VUZP.dt q0, q2",
      "pseudocode": "temp_d ← Qd\ntemp_m ← Qm\nfor i ← 0 to (128 / (2 * element_width)) - 1:\n  Qd[i * element_width +: element_width] ← temp_d[(2 * i) * element_width +: element_width]\n  Qd[(64 + i) * element_width +: element_width] ← temp_m[(2 * i) * element_width +: element_width]\n  Qm[i * element_width +: element_width] ← temp_d[(2 * i + 1) * element_width +: element_width]\n  Qm[(64 + i) * element_width +: element_width] ← temp_m[(2 * i + 1) * element_width +: element_width]"
    },
    {
      "mnemonic": "vzip",
      "architecture": "ARMv8-A",
      "full_name": "Vector Zip",
      "summary": "Interleaves vectors.",
      "syntax": "VZIP<c>.<dt> <Qd>, <Qm>",
      "encoding": {
        "format": "NEON 2-Reg",
        "binary_pattern": "111100111 | D | 11 | size | 10 | Vd | 0 | 0011 | 1 | M | 0 | Vm",
        "hex_opcode": "0xF3B201C0",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest/Src1"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Interleaves elements from two 128-bit NEON vectors by mixing even-indexed elements from Qd with odd-indexed elements from Qm and vice versa. Element size is determined by <dt>. No flags are affected. Execution is restricted to A32/T32 with NEON support.",
      "example": "VZIP.dt q0, q2",
      "pseudocode": "temp_d ← Qd\ntemp_m ← Qm\nfor i ← 0 to (128 / (2 * element_width)) - 1:\n  Qd[2 * i * element_width +: element_width] ← temp_d[i * element_width +: element_width]\n  Qd[(2 * i + 1) * element_width +: element_width] ← temp_m[i * element_width +: element_width]\n  Qm[2 * i * element_width +: element_width] ← temp_d[(64 + i) * element_width +: element_width]\n  Qm[(2 * i + 1) * element_width +: element_width] ← temp_m[(64 + i) * element_width +: element_width]"
    },
    {
      "mnemonic": "adc",
      "architecture": "ARMv8-A",
      "full_name": "Add with Carry",
      "summary": "Adds two register values and the Carry flag.",
      "syntax": "ADC <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing (3-source)",
        "binary_pattern": "0 | 0 | 0 | 11010000 | Rm | 000000 | Rn | Rd",
        "hex_opcode": "0x1A000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010000",
            "clean": "11010000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Dest (32-bit)"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Adds Wn and Wm plus the Carry flag (C), placing the 32-bit result in Wd. The C flag is read but not modified by this instruction; use ADCS to update flags. Execution is available in AArch64 only.",
      "example": "ADC w0, w1, w2",
      "pseudocode": "result ← Wn + Wm + C\nWd ← result[0:31]"
    },
    {
      "mnemonic": "adc",
      "architecture": "ARMv8-A",
      "full_name": "Add with Carry (64-bit)",
      "summary": "Adds two 64-bit register values and the Carry flag.",
      "syntax": "ADC <Xd>, <Xn>, <Xm>",
      "encoding": {
        "format": "Data Processing (3-source)",
        "binary_pattern": "1 | 0 | 0 | 11010000 | Rm | 000000 | Rn | Rd",
        "hex_opcode": "0x9A000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010000",
            "clean": "11010000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Dest (64-bit)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Second source / offset 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Add with Carry adds two 64-bit register values and the Carry flag, storing the result in a 64-bit register. The N, Z, C, and V flags are not modified; use ADCS to update flags. This instruction is AArch64-only and executes at any privilege level.",
      "example": "ADC x0, x1, x2",
      "pseudocode": "Xd ← Xn + Xm + C"
    },
    {
      "mnemonic": "adcs",
      "architecture": "ARMv8-A",
      "full_name": "Add with Carry and Set Flags",
      "summary": "Adds two register values and Carry, updating NZCV flags.",
      "syntax": "ADCS <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing (3-source)",
        "binary_pattern": "0 | 0 | 1 | 11010000 | Rm | 000000 | Rn | Rd",
        "hex_opcode": "0x3A000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11010000",
            "clean": "11010000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Adds Wn and Wm plus the Carry flag (C), placing the 32-bit result in Wd and updating the NZCV condition flags. The N, Z, C, and V flags are set based on the result: N if bit 31 is set, Z if the result is zero, C if an unsigned overflow occurs, V if a signed overflow occurs. Execution is available in AArch64 only.",
      "example": "ADCS w0, w1, w2",
      "pseudocode": "result ← Wn + Wm + C\nWd ← result[0:31]\nN ← result[31]\nZ ← (result[0:31] == 0)\nC ← result[32] (unsigned overflow)\nV ← (overflow from signed addition)"
    },
    {
      "mnemonic": "adcs",
      "architecture": "ARMv8-A",
      "full_name": "Add with Carry and Set Flags (64-bit)",
      "summary": "Adds two 64-bit register values and Carry, updating NZCV flags.",
      "syntax": "ADCS <Xd>, <Xn>, <Xm>",
      "encoding": {
        "format": "Data Processing (3-source)",
        "binary_pattern": "1 | 0 | 1 | 11010000 | Rm | 000000 | Rn | Rd",
        "hex_opcode": "0xBA000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11010000",
            "clean": "11010000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Second source / offset 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Add with Carry and Set Flags adds two 64-bit register values and the Carry flag, updating the NZCV condition flags based on the result. The N flag reflects the sign of the result, Z is set if the result is zero, C is set on unsigned carry, and V is set on signed overflow. This instruction is AArch64-only and executes at any privilege level.",
      "example": "ADCS x0, x1, x2",
      "pseudocode": "result ← Xn + Xm + C\nXd ← result\nN ← result[63]\nZ ← (result == 0)\nC ← UnsignedOverflow(Xn, Xm, C)\nV ← SignedOverflow(Xn, Xm, C)"
    },
    {
      "mnemonic": "add",
      "architecture": "ARMv8-A",
      "full_name": "Add (Extended Register)",
      "summary": "Adds a register value and a sign/zero-extended register value.",
      "syntax": "ADD <Wd|Wsp>, <Wn|Wsp>, <Wm> {, <extend> {#<amount>}}",
      "encoding": {
        "format": "Data Processing (Register)",
        "binary_pattern": "0 | 0 | 0 | 01011 | 00 | 1 | Rm | option | imm3 | Rn | Rd",
        "hex_opcode": "0x0B200000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        },
        {
          "name": "extend",
          "desc": "Extension type"
        }
      ],
      "extension": "Base",
      "description": "Adds a sign/zero-extended 32-bit register value to another 32-bit register and stores the result in the destination register. The extension type and optional shift amount are specified via the extend operand. Condition flags (N, Z, C, V) are not affected by this instruction.",
      "example": "ADD Wd, Wn, w2",
      "pseudocode": "Wd ← Wn + ExtendValue(Wm, extend, amount)"
    },
    {
      "mnemonic": "add",
      "architecture": "ARMv8-A",
      "full_name": "Add (Extended Register 64-bit)",
      "summary": "Adds a 64-bit register and an extended register value.",
      "syntax": "ADD <Xd|SP>, <Xn|SP>, <R><m> {, <extend> {#<amount>}}",
      "encoding": {
        "format": "Data Processing (Register)",
        "binary_pattern": "1 | 0 | 0 | 01011 | 00 | 1 | Rm | option | imm3 | Rn | Rd",
        "hex_opcode": "0x8B200000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "Base",
      "description": "Adds a sign/zero-extended 64-bit register value to another 64-bit register and stores the result in the destination register. The extension type and optional shift amount determine how Rm is extended. Condition flags (N, Z, C, V) are not affected by this instruction.",
      "example": "ADD x0, x1, Rm",
      "pseudocode": "Xd ← Xn + ExtendValue(Rm, extend, amount)"
    },
    {
      "mnemonic": "add",
      "architecture": "ARMv8-A",
      "full_name": "Add (Immediate)",
      "summary": "Adds a register value and an immediate value.",
      "syntax": "ADD <Wd|Wsp>, <Wn|Wsp>, #<imm> {, lsl #<shift>}",
      "encoding": {
        "format": "Data Processing (Immediate)",
        "binary_pattern": "0 | 0 | 0 | 100010 | sh | imm12 | Rn | Rd",
        "hex_opcode": "0x11000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100010",
            "clean": "100010"
          },
          {
            "raw": "sh",
            "clean": "sh"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Immediate (12-bit)"
        }
      ],
      "extension": "Base",
      "description": "Adds a 12-bit immediate value (optionally shifted left by 0 or 12 bits) to a 32-bit register and stores the result in the destination register. Condition flags (N, Z, C, V) are not affected by this instruction. SP may be used as source or destination.",
      "example": "ADD Wd, Wn, #16",
      "pseudocode": "Wd ← Wn + (imm << (sh * 12))"
    },
    {
      "mnemonic": "add",
      "architecture": "ARMv8-A",
      "full_name": "Add (Immediate 64-bit)",
      "summary": "Adds a 64-bit register value and an immediate value.",
      "syntax": "ADD <Xd|SP>, <Xn|SP>, #<imm> {, lsl #<shift>}",
      "encoding": {
        "format": "Data Processing (Immediate)",
        "binary_pattern": "1 | 0 | 0 | 100010 | sh | imm12 | Rn | Rd",
        "hex_opcode": "0x91000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100010",
            "clean": "100010"
          },
          {
            "raw": "sh",
            "clean": "sh"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "Base",
      "description": "Adds a 12-bit immediate value (optionally shifted left by 0 or 12 bits) to a 64-bit register and stores the result in the destination register. Condition flags (N, Z, C, V) are not affected by this instruction. SP may be used as source or destination.",
      "example": "ADD x0, x1, #16",
      "pseudocode": "Xd ← Xn + (imm << (sh * 12))"
    },
    {
      "mnemonic": "add",
      "architecture": "ARMv8-A",
      "full_name": "Add (Shifted Register)",
      "summary": "Adds a register value and a shifted register value.",
      "syntax": "ADD <Wd>, <Wn>, <Wm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Data Processing (Register)",
        "binary_pattern": "0 | 0 | 0 | 01011 | shift | 0 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x0B000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Adds a shifted 32-bit register value to another 32-bit register and stores the result in the destination register. The shift type and amount are encoded in the imm6 field. Condition flags (N, Z, C, V) are not affected by this instruction.",
      "example": "ADD w0, w1, w2",
      "pseudocode": "Wd ← Wn + ShiftReg(Wm, shift_type, shift_amount)"
    },
    {
      "mnemonic": "add",
      "architecture": "ARMv8-A",
      "full_name": "Add (Shifted Register 64-bit)",
      "summary": "Adds a 64-bit register value and a shifted register value.",
      "syntax": "ADD <Xd>, <Xn>, <Xm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Data Processing (Register)",
        "binary_pattern": "1 | 0 | 0 | 01011 | shift | 0 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x8B000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Second source / offset 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Adds a shifted 64-bit register value to another 64-bit register and stores the result in the destination register. The shift type and amount are encoded in the imm6 field. Condition flags (N, Z, C, V) are not affected by this instruction.",
      "example": "ADD x0, x1, x2",
      "pseudocode": "Xd ← Xn + ShiftReg(Xm, shift_type, shift_amount)"
    },
    {
      "mnemonic": "adds",
      "architecture": "ARMv8-A",
      "full_name": "Add and Set Flags (Extended Register)",
      "summary": "Adds and updates flags (Extended Register).",
      "syntax": "ADDS <Wd>, <Wn|Wsp>, <Wm> {, <extend> {#<amount>}}",
      "encoding": {
        "format": "Data Processing (Register)",
        "binary_pattern": "0 | 0 | 1 | 01011 | 00 | 1 | Rm | option | imm3 | Rn | Rd",
        "hex_opcode": "0x2B200000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Add and Set Flags adds a 32-bit register value (optionally extended or shifted) to a 32-bit register or stack pointer, updating the NZCV condition flags. The N flag reflects the sign of the result, Z is set if result is zero, C is set on unsigned carry, and V is set on signed overflow. This instruction is AArch64-only and executes at any privilege level.",
      "example": "ADDS w0, Wn, w2",
      "pseudocode": "shifted ← ExtendAndShift(Wm, option, imm3)\nresult ← Wn + shifted\nWd ← result\nN ← result[31]\nZ ← (result == 0)\nC ← UnsignedOverflow(Wn, shifted)\nV ← SignedOverflow(Wn, shifted)"
    },
    {
      "mnemonic": "adds",
      "architecture": "ARMv8-A",
      "full_name": "Add and Set Flags (Extended Register 64-bit)",
      "summary": "Adds and updates flags (Extended Register 64-bit).",
      "syntax": "ADDS <Xd>, <Xn|SP>, <R><m> {, <extend> {#<amount>}}",
      "encoding": {
        "format": "Data Processing (Register)",
        "binary_pattern": "1 | 0 | 1 | 01011 | 00 | 1 | Rm | option | imm3 | Rn | Rd",
        "hex_opcode": "0xAB200000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "Base",
      "description": "Add with extended register operand and set condition flags. Adds the sign-extended or zero-extended value of Rm to Xn, stores the result in Xd, and updates the N, Z, C, and V flags based on the result. AArch64-only instruction executing at any privilege level.",
      "example": "ADDS x0, x1, Rm",
      "pseudocode": "result ← Xn + ExtendValue(Rm, extend, amount)\nXd ← result\nN ← result[63]\nZ ← (result == 0)\nC ← CarryOut(Xn, ExtendValue(Rm, extend, amount))\nV ← OverflowFrom(Xn, ExtendValue(Rm, extend, amount))"
    },
    {
      "mnemonic": "adds",
      "architecture": "ARMv8-A",
      "full_name": "Add and Set Flags (Immediate)",
      "summary": "Adds immediate and updates flags.",
      "syntax": "ADDS <Wd>, <Wn|Wsp>, #<imm> {, lsl #<shift>}",
      "encoding": {
        "format": "Data Processing (Immediate)",
        "binary_pattern": "0 | 0 | 1 | 100010 | sh | imm12 | Rn | Rd",
        "hex_opcode": "0x31000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100010",
            "clean": "100010"
          },
          {
            "raw": "sh",
            "clean": "sh"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Imm"
        }
      ],
      "extension": "Base",
      "description": "Add immediate value to 32-bit register and set condition flags. Adds a 12-bit immediate (optionally left-shifted by 0 or 12 bits) to Wn, stores the result in Wd, and updates the N, Z, C, and V flags based on the result. AArch64-only instruction executing at any privilege level.",
      "example": "ADDS w0, Wn, #16",
      "pseudocode": "imm_val ← imm12 << (sh * 12)\nresult ← Wn + imm_val\nWd ← result\nN ← result[31]\nZ ← (result == 0)\nC ← CarryOut(Wn, imm_val)\nV ← OverflowFrom(Wn, imm_val)"
    },
    {
      "mnemonic": "adds",
      "architecture": "ARMv8-A",
      "full_name": "Add and Set Flags (Immediate 64-bit)",
      "summary": "Adds immediate and updates flags (64-bit).",
      "syntax": "ADDS <Xd>, <Xn|SP>, #<imm> {, lsl #<shift>}",
      "encoding": {
        "format": "Data Processing (Immediate)",
        "binary_pattern": "1 | 0 | 1 | 100010 | sh | imm12 | Rn | Rd",
        "hex_opcode": "0xB1000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100010",
            "clean": "100010"
          },
          {
            "raw": "sh",
            "clean": "sh"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Imm"
        }
      ],
      "extension": "Base",
      "description": "Add immediate value to 64-bit register and set condition flags. Adds a 12-bit immediate (optionally left-shifted by 0 or 12 bits) to Xn, stores the result in Xd, and updates the N, Z, C, and V flags based on the result. AArch64-only instruction executing at any privilege level.",
      "example": "ADDS x0, x1, #16",
      "pseudocode": "imm_val ← imm12 << (sh * 12)\nresult ← Xn + imm_val\nXd ← result\nN ← result[63]\nZ ← (result == 0)\nC ← CarryOut(Xn, imm_val)\nV ← OverflowFrom(Xn, imm_val)"
    },
    {
      "mnemonic": "adds",
      "architecture": "ARMv8-A",
      "full_name": "Add and Set Flags (Shifted Register)",
      "summary": "Adds shifted register and updates flags.",
      "syntax": "ADDS <Wd>, <Wn>, <Wm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Data Processing (Register)",
        "binary_pattern": "0 | 0 | 1 | 01011 | shift | 0 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x2B000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Add shifted 32-bit register to another and set condition flags. Adds the optionally shifted value of Wm to Wn, stores the result in Wd, and updates the N, Z, C, and V flags based on the result. AArch64-only instruction executing at any privilege level.",
      "example": "ADDS w0, w1, w2",
      "pseudocode": "shifted_val ← Wm << amount\nresult ← Wn + shifted_val\nWd ← result\nN ← result[31]\nZ ← (result == 0)\nC ← CarryOut(Wn, shifted_val)\nV ← OverflowFrom(Wn, shifted_val)"
    },
    {
      "mnemonic": "adds",
      "architecture": "ARMv8-A",
      "full_name": "Add and Set Flags (Shifted Register 64-bit)",
      "summary": "Adds shifted register and updates flags (64-bit).",
      "syntax": "ADDS <Xd>, <Xn>, <Xm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Data Processing (Register)",
        "binary_pattern": "1 | 0 | 1 | 01011 | shift | 0 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0xAB000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Second source / offset 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Add shifted 64-bit register to another and set condition flags. Adds the optionally shifted value of Xm to Xn, stores the result in Xd, and updates the N, Z, C, and V flags based on the result. AArch64-only instruction executing at any privilege level.",
      "example": "ADDS x0, x1, x2",
      "pseudocode": "shifted_val ← Xm << amount\nresult ← Xn + shifted_val\nXd ← result\nN ← result[63]\nZ ← (result == 0)\nC ← CarryOut(Xn, shifted_val)\nV ← OverflowFrom(Xn, shifted_val)"
    },
    {
      "mnemonic": "adr",
      "architecture": "ARMv8-A",
      "full_name": "Form PC-relative Address",
      "summary": "Calculates the address of a label (PC +/- 1MB range).",
      "syntax": "ADR <Xd>, <label>",
      "encoding": {
        "format": "PC-rel",
        "binary_pattern": "0 | immlo | 10000 | immhi | Rd",
        "hex_opcode": "0x10000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "immlo",
            "clean": "immlo"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "immhi",
            "clean": "immhi"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Forms a PC-relative address by adding a signed 21-bit offset to the current PC and stores the result in the destination register. The immediate is composed of immhi (19 bits) and immlo (2 bits) and supports label references within ±1 MB. This is an AArch64-only instruction that does not affect condition flags.",
      "example": "ADR x0, label",
      "pseudocode": "Xd ← PC + SignExtend(immhi:immlo, 21)"
    },
    {
      "mnemonic": "adrp",
      "architecture": "ARMv8-A",
      "full_name": "Form PC-relative Address to 4KB Page",
      "summary": "Calculates page address of a label (PC +/- 4GB range).",
      "syntax": "ADRP <Xd>, <label>",
      "encoding": {
        "format": "PC-rel",
        "binary_pattern": "1 | immlo | 10000 | immhi | Rd",
        "hex_opcode": "0x90000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "immlo",
            "clean": "immlo"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "immhi",
            "clean": "immhi"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Forms a PC-relative page address by shifting a signed 21-bit offset left by 12 bits and adding to the current PC (with lower 12 bits zeroed), storing the result in the destination register. Supports label references within ±4 GB and is typically used with subsequent ldr or add instructions for full address formation. This is an AArch64-only instruction that does not affect condition flags.",
      "example": "ADRP x0, label",
      "pseudocode": "Xd ← (PC & ~0xFFF) + (SignExtend(immhi:immlo, 21) << 12)"
    },
    {
      "mnemonic": "and",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise AND (Immediate)",
      "summary": "Bitwise AND with logical immediate.",
      "syntax": "AND <Wd|Wsp>, <Wn>, #<imm>",
      "encoding": {
        "format": "Logical (Immediate)",
        "binary_pattern": "0 | 00 | 100100 | 0 | immr | imms | Rn | Rd",
        "hex_opcode": "0x12000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "100100",
            "clean": "100100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "immr",
            "clean": "immr"
          },
          {
            "raw": "imms",
            "clean": "imms"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Logical Imm"
        }
      ],
      "extension": "Base",
      "description": "Bitwise AND 32-bit register with a logical immediate. Performs a bitwise AND of Wn with a 32-bit logical immediate, stores the result in Wd. Does not modify condition flags. AArch64-only instruction executing at any privilege level.",
      "example": "AND Wd, w1, #16",
      "pseudocode": "imm_val ← DecodeBitMasks(N, immr, imms, 32)\nWd ← Wn AND imm_val"
    },
    {
      "mnemonic": "and",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise AND (Immediate 64-bit)",
      "summary": "Bitwise AND with logical immediate (64-bit).",
      "syntax": "AND <Xd|SP>, <Xn>, #<imm>",
      "encoding": {
        "format": "Logical (Immediate)",
        "binary_pattern": "1 | 00 | 100100 | N | immr | imms | Rn | Rd",
        "hex_opcode": "0x92000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "100100",
            "clean": "100100"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "immr",
            "clean": "immr"
          },
          {
            "raw": "imms",
            "clean": "imms"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Logical Imm"
        }
      ],
      "extension": "Base",
      "description": "Bitwise AND 64-bit register with a logical immediate. Performs a bitwise AND of Xn with a 64-bit logical immediate, stores the result in Xd. Does not modify condition flags. AArch64-only instruction executing at any privilege level.",
      "example": "AND x0, x1, #16",
      "pseudocode": "imm_val ← DecodeBitMasks(N, immr, imms, 64)\nXd ← Xn AND imm_val"
    },
    {
      "mnemonic": "and",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise AND (Shifted Register)",
      "summary": "Bitwise AND with shifted register.",
      "syntax": "AND <Wd>, <Wn>, <Wm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "0 | 00 | 01010 | shift | 0 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x0A000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Bitwise AND two 32-bit registers with optional shift. Performs a bitwise AND of Wn with the optionally shifted value of Wm, stores the result in Wd. Does not modify condition flags. AArch64-only instruction executing at any privilege level.",
      "example": "AND w0, w1, w2",
      "pseudocode": "shifted_val ← Wm << amount\nWd ← Wn AND shifted_val"
    },
    {
      "mnemonic": "and",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise AND (Shifted Register 64-bit)",
      "summary": "Bitwise AND with shifted register (64-bit).",
      "syntax": "AND <Xd>, <Xn>, <Xm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "1 | 00 | 01010 | shift | 0 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x8A000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Second source / offset 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Performs a bitwise AND between Xn and a shifted Xm, storing the result in Xd. The shift amount and type are specified by the shift operand. No condition flags are affected by this instruction.",
      "example": "AND x0, x1, x2",
      "pseudocode": "Xd ← Xn AND (Xm shifted by shift_amount)"
    },
    {
      "mnemonic": "ands",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise AND and Set Flags (Immediate)",
      "summary": "Bitwise AND immediate, updates flags.",
      "syntax": "ANDS <Wd>, <Wn>, #<imm>",
      "encoding": {
        "format": "Logical (Immediate)",
        "binary_pattern": "0 | 11 | 100100 | 0 | immr | imms | Rn | Rd",
        "hex_opcode": "0x72000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "100100",
            "clean": "100100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "immr",
            "clean": "immr"
          },
          {
            "raw": "imms",
            "clean": "imms"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Imm"
        }
      ],
      "extension": "Base",
      "description": "Performs a bitwise AND between Wn and a 32-bit immediate value, storing the result in Wd and updating the condition flags. Sets the Z flag if the result is zero, the N flag based on bit 31 of the result, and clears the C and V flags.",
      "example": "ANDS w0, w1, #16",
      "pseudocode": "result ← Wn AND imm\nWd ← result\nN ← result[31]\nZ ← (result == 0)\nC ← 0\nV ← 0"
    },
    {
      "mnemonic": "ands",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise AND and Set Flags (Immediate 64-bit)",
      "summary": "Bitwise AND immediate, updates flags (64-bit).",
      "syntax": "ANDS <Xd>, <Xn>, #<imm>",
      "encoding": {
        "format": "Logical (Immediate)",
        "binary_pattern": "1 | 11 | 100100 | N | immr | imms | Rn | Rd",
        "hex_opcode": "0xF2000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "100100",
            "clean": "100100"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "immr",
            "clean": "immr"
          },
          {
            "raw": "imms",
            "clean": "imms"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Imm"
        }
      ],
      "extension": "Base",
      "description": "Performs a bitwise AND between Xn and a 64-bit immediate value, storing the result in Xd and updating the condition flags. Sets the Z flag if the result is zero, the N flag based on bit 63 of the result, and clears the C and V flags.",
      "example": "ANDS x0, x1, #16",
      "pseudocode": "result ← Xn AND imm\nXd ← result\nN ← result[63]\nZ ← (result == 0)\nC ← 0\nV ← 0"
    },
    {
      "mnemonic": "ands",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise AND and Set Flags (Shifted Register)",
      "summary": "Bitwise AND shifted register, updates flags.",
      "syntax": "ANDS <Wd>, <Wn>, <Wm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "0 | 11 | 01010 | shift | 0 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x6A000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Performs a bitwise AND between Wn and a shifted Wm, storing the result in Wd and updating the condition flags. Sets the Z flag if the result is zero, the N flag based on bit 31 of the result, and clears the C and V flags.",
      "example": "ANDS w0, w1, w2",
      "pseudocode": "result ← Wn AND (Wm shifted by shift_amount)\nWd ← result\nN ← result[31]\nZ ← (result == 0)\nC ← 0\nV ← 0"
    },
    {
      "mnemonic": "ands",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise AND and Set Flags (Shifted Register 64-bit)",
      "summary": "Bitwise AND shifted register, updates flags (64-bit).",
      "syntax": "ANDS <Xd>, <Xn>, <Xm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "1 | 11 | 01010 | shift | 0 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0xEA000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Second source / offset 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Performs a bitwise AND between Xn and a shifted Xm, storing the result in Xd and updating the condition flags. Sets the Z flag if the result is zero, the N flag based on bit 63 of the result, and clears the C and V flags.",
      "example": "ANDS x0, x1, x2",
      "pseudocode": "result ← Xn AND (Xm shifted by shift_amount)\nXd ← result\nN ← result[63]\nZ ← (result == 0)\nC ← 0\nV ← 0"
    },
    {
      "mnemonic": "asr",
      "architecture": "ARMv8-A",
      "full_name": "Arithmetic Shift Right (Immediate)",
      "summary": "Arithmetic shift right by immediate.",
      "syntax": "ASR <Wd>, <Wn>, #<shift>",
      "encoding": {
        "format": "Data Processing (Immediate)",
        "binary_pattern": "0 | 00 | 100110 | 0 | immr | 011111 | Rn | Rd",
        "hex_opcode": "0x13007C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "100110",
            "clean": "100110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "immr",
            "clean": "immr"
          },
          {
            "raw": "011111",
            "clean": "011111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "shift",
          "desc": "Shift amount"
        }
      ],
      "extension": "Base",
      "description": "Performs an arithmetic right shift of Wn by an immediate amount, storing the result in Wd. The sign bit (bit 31) is replicated into vacated bit positions. No condition flags are affected.",
      "example": "ASR w0, w1, #LSL",
      "pseudocode": "Wd ← Wn >> shift (arithmetic, sign-extended)"
    },
    {
      "mnemonic": "asr",
      "architecture": "ARMv8-A",
      "full_name": "Arithmetic Shift Right (Immediate 64-bit)",
      "summary": "Arithmetic shift right by immediate (64-bit).",
      "syntax": "ASR <Xd>, <Xn>, #<shift>",
      "encoding": {
        "format": "Data Processing (Immediate)",
        "binary_pattern": "1 | 00 | 100110 | 1 | immr | 111111 | Rn | Rd",
        "hex_opcode": "0x9340FC00",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "100110",
            "clean": "100110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "immr",
            "clean": "immr"
          },
          {
            "raw": "111111",
            "clean": "111111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "shift",
          "desc": "Shift amount"
        }
      ],
      "extension": "Base",
      "description": "Performs an arithmetic right shift of Xn by an immediate amount, storing the result in Xd. The sign bit (bit 63) is replicated into vacated bit positions. No condition flags are affected.",
      "example": "ASR x0, x1, #LSL",
      "pseudocode": "Xd ← Xn >> shift (arithmetic, sign-extended)"
    },
    {
      "mnemonic": "asr",
      "architecture": "ARMv8-A",
      "full_name": "Arithmetic Shift Right (Register)",
      "summary": "Arithmetic shift right by register value.",
      "syntax": "ASR <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing (Register)",
        "binary_pattern": "0 | 0 | 0 | 11010110 | Rm | 0010 | 10 | Rn | Rd",
        "hex_opcode": "0x1AC02800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Shift Reg"
        }
      ],
      "extension": "Base",
      "description": "Performs an arithmetic right shift of Wn by the value in Wm (modulo 32), storing the result in Wd. The sign bit (bit 31) is replicated into vacated bit positions. No condition flags are affected.",
      "example": "ASR w0, w1, w2",
      "pseudocode": "Wd ← Wn >> (Wm AND 0x1F) (arithmetic, sign-extended)"
    },
    {
      "mnemonic": "asr",
      "architecture": "ARMv8-A",
      "full_name": "Arithmetic Shift Right (Register 64-bit)",
      "summary": "Arithmetic shift right by register value (64-bit).",
      "syntax": "ASR <Xd>, <Xn>, <Xm>",
      "encoding": {
        "format": "Data Processing (Register)",
        "binary_pattern": "1 | 0 | 0 | 11010110 | Rm | 0010 | 10 | Rn | Rd",
        "hex_opcode": "0x9AC02800",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Shift Reg"
        }
      ],
      "extension": "Base",
      "description": "Arithmetic shift right of Xn by the number of bits specified in the least significant byte of Xm, writing the result to Xd. The sign bit is replicated into vacated bit positions. NZCV flags are not affected by this instruction in AArch64.",
      "example": "ASR x0, x1, x2",
      "pseudocode": "shift_amount ← Xm[7:0]\nif shift_amount >= 64 then\n  if Xn[63] == 1 then Xd ← 0xFFFFFFFFFFFFFFFF else Xd ← 0\nelse\n  Xd ← Xn >> shift_amount (arithmetic)"
    },
    {
      "mnemonic": "b",
      "architecture": "ARMv8-A",
      "full_name": "Branch",
      "summary": "Unconditional branch to label.",
      "syntax": "B <label>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "0 | 00101 | imm26",
        "hex_opcode": "0x14000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00101",
            "clean": "00101"
          },
          {
            "raw": "imm26",
            "clean": "imm26"
          }
        ],
        "bit_positions": "31 | 30:26 | 25:0"
      },
      "operands": [
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Unconditional branch to a PC-relative label in AArch64. The 26-bit signed immediate is shifted left by 2 and added to the current PC. No condition flags are affected. This is an AArch64-only instruction.",
      "example": "B label",
      "pseudocode": "PC ← PC + (SignExtend(imm26, 64) << 2)"
    },
    {
      "mnemonic": "b.cond",
      "architecture": "ARMv8-A",
      "full_name": "Branch Conditional",
      "summary": "Branch if condition is met (e.g., B.EQ, B.NE).",
      "syntax": "B.cond <label>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "01010100 | imm19 | 0 | cond",
        "hex_opcode": "0x54000000",
        "visual_parts": [
          {
            "raw": "01010100",
            "clean": "01010100"
          },
          {
            "raw": "imm19",
            "clean": "imm19"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "cond",
            "clean": "cond"
          }
        ],
        "bit_positions": "31:24 | 23:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "label",
          "desc": "Label"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Base",
      "description": "Conditional branch to a PC-relative label in AArch64, executed only if the specified condition is true. The 19-bit signed immediate is shifted left by 2 and added to the current PC. No condition flags are modified by this instruction. This is an AArch64-only instruction.",
      "example": "B.cond label",
      "pseudocode": "if ConditionHolds(cond) then\n  PC ← PC + (SignExtend(imm19, 64) << 2)"
    },
    {
      "mnemonic": "bfm",
      "architecture": "ARMv8-A",
      "full_name": "Bitfield Move",
      "summary": "Moves a bitfield from source to destination.",
      "syntax": "BFM <Wd>, <Wn>, #<immr>, #<imms>",
      "encoding": {
        "format": "Bitfield",
        "binary_pattern": "0 | 01 | 100110 | 0 | immr | imms | Rn | Rd",
        "hex_opcode": "0x33000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "100110",
            "clean": "100110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "immr",
            "clean": "immr"
          },
          {
            "raw": "imms",
            "clean": "imms"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "immr",
          "desc": "Rotate"
        },
        {
          "name": "imms",
          "desc": "Size"
        }
      ],
      "extension": "Base",
      "description": "Bitfield move that extracts a bitfield from the source register and inserts it into the destination register at a specified position. The bitfield is rotated right by immr bits, then the imms field specifies the field width. No condition flags are affected. This is an AArch64-only instruction.",
      "example": "BFM w0, w1, #immr, #imms",
      "pseudocode": "width ← imms - immr + 1\nif width < 0 then width ← width + 64\nlsb ← imms - width + 1\nsrc_bits ← (Wn >> immr) & ((1 << width) - 1)\ndst_mask ← ((1 << width) - 1) << lsb\nWd ← (Wd & ~dst_mask) | (src_bits << lsb)"
    },
    {
      "mnemonic": "bfm",
      "architecture": "ARMv8-A",
      "full_name": "Bitfield Move (64-bit)",
      "summary": "Moves a bitfield from source to destination (64-bit).",
      "syntax": "BFM <Xd>, <Xn>, #<immr>, #<imms>",
      "encoding": {
        "format": "Bitfield",
        "binary_pattern": "1 | 01 | 100110 | 1 | immr | imms | Rn | Rd",
        "hex_opcode": "0xB3400000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "100110",
            "clean": "100110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "immr",
            "clean": "immr"
          },
          {
            "raw": "imms",
            "clean": "imms"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "immr",
          "desc": "Rotate"
        },
        {
          "name": "imms",
          "desc": "Size"
        }
      ],
      "extension": "Base",
      "description": "Bitfield move that extracts a bitfield from Xn and inserts it into Xd at a rotated position. The bitfield width is determined by imms, and rotation by immr controls where bits are placed. NZCV flags are not affected. This is an AArch64-only instruction.",
      "example": "BFM x0, x1, #immr, #imms",
      "pseudocode": "width ← 64\nbfwidth ← (imms - immr) mod width + 1\nif immr <= imms then\n  wmask ← ((1 << bfwidth) - 1) << immr\n  tmask ← ((1 << bfwidth) - 1)\n  Xd ← (Xd AND NOT wmask) OR ((Xn << immr) AND wmask)\nelse\n  wmask ← ((1 << bfwidth) - 1) >> (width - immr)\n  tmask ← ((1 << bfwidth) - 1) << (width - immr)\n  Xd ← (Xd AND NOT wmask) OR (((Xn >> (imms + 1)) OR (Xn << (width - imms - 1))) AND wmask)"
    },
    {
      "mnemonic": "bic",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Bit Clear (Shifted Register)",
      "summary": "ANDs register with NOT of shifted register (AND NOT).",
      "syntax": "BIC <Wd>, <Wn>, <Wm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "0 | 00 | 01010 | shift | 1 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x0A200000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "32-bit bitwise AND NOT: Xd ← Wn AND NOT (Wm, optionally shifted). The second operand is shifted before the NOT operation is applied. NZCV flags are not affected. Execution in AArch64 or A32 mode.",
      "example": "BIC w0, w1, w2",
      "pseudocode": "operand2 ← DecodeShift(Wm, shift, amount)\nWd ← Wn AND NOT operand2\nif Wd[31] == 1 then N ← 1 else N ← 0\nif Wd == 0 then Z ← 1 else Z ← 0"
    },
    {
      "mnemonic": "bic",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Bit Clear (Shifted Register 64-bit)",
      "summary": "ANDs register with NOT of shifted register (64-bit).",
      "syntax": "BIC <Xd>, <Xn>, <Xm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "1 | 00 | 01010 | shift | 1 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x8A200000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Second source / offset 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "64-bit bitwise AND NOT: Xd ← Xn AND NOT (Xm, optionally shifted). The second operand is shifted before the NOT operation is applied. NZCV flags are not affected. This is an AArch64-only instruction.",
      "example": "BIC x0, x1, x2",
      "pseudocode": "operand2 ← DecodeShift(Xm, shift, amount)\nXd ← Xn AND NOT operand2\nif Xd[63] == 1 then N ← 1 else N ← 0\nif Xd == 0 then Z ← 1 else Z ← 0"
    },
    {
      "mnemonic": "bics",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Bit Clear and Set Flags",
      "summary": "Performs BIC and updates flags.",
      "syntax": "BICS <Wd>, <Wn>, <Wm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "0 | 11 | 01010 | shift | 1 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x6A200000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Bitwise AND with bitwise NOT (BIC) of the second source operand (optionally shifted) with the first source operand, storing the result in the destination and updating the condition flags. Sets N and Z flags according to the result; clears C and V. This is an AArch64-only instruction available in A32 and T32 variants.",
      "example": "BICS w0, w1, w2",
      "pseudocode": "operand2 ← Wm\nif shift != NONE then\n  operand2 ← operand2 shift_op amount\nresult ← Wn & ~operand2\nWd ← result\nN ← result[31]\nZ ← (result == 0)\nC ← 0\nV ← 0"
    },
    {
      "mnemonic": "bics",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Bit Clear and Set Flags (64-bit)",
      "summary": "Performs BIC and updates flags (64-bit).",
      "syntax": "BICS <Xd>, <Xn>, <Xm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "1 | 11 | 01010 | shift | 1 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0xEA200000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Second source / offset 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "64-bit bitwise AND NOT with flag update: Xd ← Xn AND NOT (Xm, optionally shifted), then updates NZCV condition flags based on the result. The C and V flags are cleared. This is an AArch64-only instruction.",
      "example": "BICS x0, x1, x2",
      "pseudocode": "operand2 ← DecodeShift(Xm, shift, amount)\nXd ← Xn AND NOT operand2\nN ← Xd[63]\nZ ← (Xd == 0)\nC ← 0\nV ← 0"
    },
    {
      "mnemonic": "bl",
      "architecture": "ARMv8-A",
      "full_name": "Branch with Link",
      "summary": "Function call. Branches to label and stores return address in LR (X30).",
      "syntax": "BL <label>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "1 | 00101 | imm26",
        "hex_opcode": "0x94000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00101",
            "clean": "00101"
          },
          {
            "raw": "imm26",
            "clean": "imm26"
          }
        ],
        "bit_positions": "31 | 30:26 | 25:0"
      },
      "operands": [
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Branch with link: unconditional branch to a PC-relative label and stores the return address (current PC + 4) in the link register X30 (LR). The 26-bit signed immediate is shifted left by 2 and added to the current PC. No condition flags are affected. This is an AArch64-only instruction.",
      "example": "BL label",
      "pseudocode": "LR ← PC + 4\nPC ← PC + (SignExtend(imm26, 64) << 2)"
    },
    {
      "mnemonic": "blr",
      "architecture": "ARMv8-A",
      "full_name": "Branch with Link to Register",
      "summary": "Indirect function call. Branches to address in Xn and stores return in LR.",
      "syntax": "BLR <Xn>",
      "encoding": {
        "format": "Branch (Reg)",
        "binary_pattern": "1101011 | 0 | 0 | 01 | 11111 | 0000 | 0 | 0 | Rn | 00000",
        "hex_opcode": "0xD63F0000",
        "visual_parts": [
          {
            "raw": "1101011",
            "clean": "1101011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "00000",
            "clean": "00000"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xn",
          "desc": "Target Address"
        }
      ],
      "extension": "Base",
      "description": "Branch with link to register: indirect branch to the address held in Xn and stores the return address (current PC + 4) in the link register X30 (LR). No condition flags are affected. This is an AArch64-only instruction.",
      "example": "BLR x1",
      "pseudocode": "LR ← PC + 4\nPC ← Xn"
    },
    {
      "mnemonic": "br",
      "architecture": "ARMv8-A",
      "full_name": "Branch to Register",
      "summary": "Indirect branch to address in Xn.",
      "syntax": "BR <Xn>",
      "encoding": {
        "format": "Branch (Reg)",
        "binary_pattern": "1101011 | 0 | 0 | 00 | 11111 | 0000 | 0 | 0 | Rn | 00000",
        "hex_opcode": "0xD61F0000",
        "visual_parts": [
          {
            "raw": "1101011",
            "clean": "1101011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "00000",
            "clean": "00000"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xn",
          "desc": "Target Address"
        }
      ],
      "extension": "Base",
      "description": "Branch to register: indirect unconditional branch to the address held in Xn. No condition flags are affected. This is an AArch64-only instruction.",
      "example": "BR x1",
      "pseudocode": "PC ← Xn"
    },
    {
      "mnemonic": "brk",
      "architecture": "ARMv8-A",
      "full_name": "Breakpoint",
      "summary": "Generates a Breakpoint instruction exception.",
      "syntax": "BRK #<imm>",
      "encoding": {
        "format": "Exception",
        "binary_pattern": "11010100 | 001 | imm16 | 000 | 00",
        "hex_opcode": "0xD4200000",
        "visual_parts": [
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "imm16",
            "clean": "imm16"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "00",
            "clean": "00"
          }
        ],
        "bit_positions": "31:24 | 23:21 | 20:5 | 4:2 | 1:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID (16-bit)"
        }
      ],
      "extension": "Base",
      "description": "Generate a breakpoint exception (ESR_ELx.EC = 0x3C). The 16-bit immediate is encoded in the instruction and passed to the exception handler but does not affect architectural state. Execution does not proceed to the next instruction unless the exception handler explicitly resumes. This is an AArch64-only instruction.",
      "example": "BRK #16",
      "pseudocode": "AArch64.SystemSideEffect()\nESR_ELx.EC ← 0x3C\nESR_ELx.ISS ← imm16\nTakeSynchronousException(Breakpoint)"
    },
    {
      "mnemonic": "cbnz",
      "architecture": "ARMv8-A",
      "full_name": "Compare and Branch Not Zero",
      "summary": "Branches if register is not zero.",
      "syntax": "CBNZ <Wt>, <label>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "0 | 011010 | 1 | imm19 | Rt",
        "hex_opcode": "0x35000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011010",
            "clean": "011010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm19",
            "clean": "imm19"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30:25 | 24 | 23:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Reg"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Compare and Branch if Not Zero. Compares the contents of the 32-bit register Wt with zero, and branches to the target address if the result is not equal to zero. This is a non-conditional branch that does not affect the condition flags. AArch64-only instruction.",
      "example": "CBNZ w3, label",
      "pseudocode": "if Wt != 0 then PC ← PC + (imm19 << 2)"
    },
    {
      "mnemonic": "cbnz",
      "architecture": "ARMv8-A",
      "full_name": "Compare and Branch Not Zero (64-bit)",
      "summary": "Branches if 64-bit register is not zero.",
      "syntax": "CBNZ <Xt>, <label>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "1 | 011010 | 1 | imm19 | Rt",
        "hex_opcode": "0xB5000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011010",
            "clean": "011010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm19",
            "clean": "imm19"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30:25 | 24 | 23:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Reg"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Compare and Branch if Not Zero: if Xt is not zero, branch to the label by adding the sign-extended 19-bit immediate (×4) to the PC. No condition flags are affected. This is an AArch64-only instruction.",
      "example": "CBNZ x3, label",
      "pseudocode": "if Xt != 0 then\n  PC ← PC + SignExtend(imm19 << 2, 64)"
    },
    {
      "mnemonic": "cbz",
      "architecture": "ARMv8-A",
      "full_name": "Compare and Branch Zero",
      "summary": "Branches if register is zero.",
      "syntax": "CBZ <Wt>, <label>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "0 | 011010 | 0 | imm19 | Rt",
        "hex_opcode": "0x34000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011010",
            "clean": "011010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm19",
            "clean": "imm19"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30:25 | 24 | 23:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Reg"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Compare and Branch if Zero. Compares the contents of the 32-bit register Wt with zero, and branches to the target address if the result equals zero. This is a non-conditional branch that does not affect the condition flags. AArch64-only instruction.",
      "example": "CBZ w3, label",
      "pseudocode": "if Wt == 0 then PC ← PC + (imm19 << 2)"
    },
    {
      "mnemonic": "cbz",
      "architecture": "ARMv8-A",
      "full_name": "Compare and Branch Zero (64-bit)",
      "summary": "Branches if 64-bit register is zero.",
      "syntax": "CBZ <Xt>, <label>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "1 | 011010 | 0 | imm19 | Rt",
        "hex_opcode": "0xB4000000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011010",
            "clean": "011010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm19",
            "clean": "imm19"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30:25 | 24 | 23:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Reg"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Compare and Branch if Zero: if Xt is zero, branch to the label by adding the sign-extended 19-bit immediate (×4) to the PC. No condition flags are affected. This is an AArch64-only instruction.",
      "example": "CBZ x3, label",
      "pseudocode": "if Xt == 0 then\n  PC ← PC + SignExtend(imm19 << 2, 64)"
    },
    {
      "mnemonic": "ccmn",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Compare Negative (Immediate)",
      "summary": "Compares register with negative immediate if condition is true.",
      "syntax": "CCMN <Wn>, #<imm>, #<nzcv>, <cond>",
      "encoding": {
        "format": "Cond Comp",
        "binary_pattern": "0 | 0 | 1 | 11010010 | imm5 | cond | 1 | 0 | Rn | 0 | nzcv",
        "hex_opcode": "0x3A400800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11010010",
            "clean": "11010010"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "nzcv",
            "clean": "nzcv"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Wn",
          "desc": "Reg"
        },
        {
          "name": "imm",
          "desc": "Imm"
        },
        {
          "name": "nzcv",
          "desc": "Flags"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Base",
      "description": "Conditional Compare Negative (Immediate), 32-bit. If the condition is true, performs an arithmetic compare of Wn + imm5, otherwise loads the NZCV flags with the immediate value nzcv. The comparison sets or clears N, Z, C, V flags accordingly. AArch64-only instruction.",
      "example": "CCMN w1, #16, #nzcv, cond",
      "pseudocode": "if ConditionHolds(cond) then temp ← Wn + imm5; N ← temp[31]; Z ← (temp == 0); C ← UnsignedOverflow(Wn, imm5); V ← SignedOverflow(Wn, imm5) else N ← nzcv[3]; Z ← nzcv[2]; C ← nzcv[1]; V ← nzcv[0]"
    },
    {
      "mnemonic": "ccmn",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Compare Negative (Immediate 64-bit)",
      "summary": "Compares 64-bit register with negative immediate if condition is true.",
      "syntax": "CCMN <Xn>, #<imm>, #<nzcv>, <cond>",
      "encoding": {
        "format": "Cond Comp",
        "binary_pattern": "1 | 0 | 1 | 11010010 | imm5 | cond | 1 | 0 | Rn | 0 | nzcv",
        "hex_opcode": "0xBA400800",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11010010",
            "clean": "11010010"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "nzcv",
            "clean": "nzcv"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Xn",
          "desc": "Reg"
        },
        {
          "name": "imm",
          "desc": "Imm"
        },
        {
          "name": "nzcv",
          "desc": "Flags"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Base",
      "description": "Conditional Compare Negative (Immediate), 64-bit. If the condition is true, performs an arithmetic compare of Xn + imm5, otherwise loads the NZCV flags with the immediate value nzcv. The comparison sets or clears N, Z, C, V flags accordingly. AArch64-only instruction.",
      "example": "CCMN x1, #16, #nzcv, cond",
      "pseudocode": "if ConditionHolds(cond) then temp ← Xn + imm5; N ← temp[63]; Z ← (temp == 0); C ← UnsignedOverflow(Xn, imm5); V ← SignedOverflow(Xn, imm5) else N ← nzcv[3]; Z ← nzcv[2]; C ← nzcv[1]; V ← nzcv[0]"
    },
    {
      "mnemonic": "ccmn",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Compare Negative (Register)",
      "summary": "Compares two registers (negated) if condition is true.",
      "syntax": "CCMN <Wn>, <Wm>, #<nzcv>, <cond>",
      "encoding": {
        "format": "Cond Comp",
        "binary_pattern": "0 | 0 | 1 | 11010010 | Rm | cond | 0 | 0 | Rn | 0 | nzcv",
        "hex_opcode": "0x3A400000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11010010",
            "clean": "11010010"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "nzcv",
            "clean": "nzcv"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Wn",
          "desc": "Reg 1"
        },
        {
          "name": "Wm",
          "desc": "Reg 2"
        },
        {
          "name": "nzcv",
          "desc": "Flags"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Base",
      "description": "Conditional Compare Negative (Register), 32-bit. If the condition is true, performs an arithmetic compare of Wn + Wm, otherwise loads the NZCV flags with the immediate value nzcv. The comparison sets or clears N, Z, C, V flags accordingly. AArch64-only instruction.",
      "example": "CCMN w1, w2, #nzcv, cond",
      "pseudocode": "if ConditionHolds(cond) then temp ← Wn + Wm; N ← temp[31]; Z ← (temp == 0); C ← UnsignedOverflow(Wn, Wm); V ← SignedOverflow(Wn, Wm) else N ← nzcv[3]; Z ← nzcv[2]; C ← nzcv[1]; V ← nzcv[0]"
    },
    {
      "mnemonic": "ccmp",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Compare (Immediate)",
      "summary": "Compares register with immediate if condition is true.",
      "syntax": "CCMP <Wn>, #<imm>, #<nzcv>, <cond>",
      "encoding": {
        "format": "Cond Comp",
        "binary_pattern": "0 | 1 | 1 | 11010010 | imm5 | cond | 1 | 0 | Rn | 0 | nzcv",
        "hex_opcode": "0x7A400800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11010010",
            "clean": "11010010"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "nzcv",
            "clean": "nzcv"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Wn",
          "desc": "Reg"
        },
        {
          "name": "imm",
          "desc": "Imm"
        },
        {
          "name": "nzcv",
          "desc": "Flags"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Base",
      "description": "Conditional Compare (Immediate), 32-bit. If the condition is true, performs an arithmetic compare of Wn - imm5, otherwise loads the NZCV flags with the immediate value nzcv. The comparison sets or clears N, Z, C, V flags accordingly. AArch64-only instruction.",
      "example": "CCMP w1, #16, #nzcv, cond",
      "pseudocode": "if ConditionHolds(cond) then temp ← Wn - imm5; N ← temp[31]; Z ← (temp == 0); C ← NOT(BorrowFrom(Wn, imm5)); V ← SignedOverflow(Wn, -imm5) else N ← nzcv[3]; Z ← nzcv[2]; C ← nzcv[1]; V ← nzcv[0]"
    },
    {
      "mnemonic": "ccmp",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Compare (Register)",
      "summary": "Compares two registers if condition is true.",
      "syntax": "CCMP <Wn>, <Wm>, #<nzcv>, <cond>",
      "encoding": {
        "format": "Cond Comp",
        "binary_pattern": "0 | 1 | 1 | 11010010 | Rm | cond | 0 | 0 | Rn | 0 | nzcv",
        "hex_opcode": "0x7A400000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11010010",
            "clean": "11010010"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "nzcv",
            "clean": "nzcv"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Wn",
          "desc": "Reg 1"
        },
        {
          "name": "Wm",
          "desc": "Reg 2"
        },
        {
          "name": "nzcv",
          "desc": "Flags"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Base",
      "description": "Conditional Compare (Register), 32-bit. If the condition is true, performs an arithmetic compare of Wn - Wm, otherwise loads the NZCV flags with the immediate value nzcv. The comparison sets or clears N, Z, C, V flags accordingly. AArch64-only instruction.",
      "example": "CCMP w1, w2, #nzcv, cond",
      "pseudocode": "if ConditionHolds(cond) then temp ← Wn - Wm; N ← temp[31]; Z ← (temp == 0); C ← NOT(BorrowFrom(Wn, Wm)); V ← SignedOverflow(Wn, -Wm) else N ← nzcv[3]; Z ← nzcv[2]; C ← nzcv[1]; V ← nzcv[0]"
    },
    {
      "mnemonic": "cinc",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Increment",
      "summary": "Increment register if condition is true, else copy. (Alias for CSINC)",
      "syntax": "CINC <Wd>, <Wn>, <cond>",
      "encoding": {
        "format": "Cond Select",
        "binary_pattern": "0 | 0 | 0 | 11010100 | Rm | cond | 0 | 1 | Rn | Rd",
        "hex_opcode": "0x1A800400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Base",
      "description": "Conditional Increment, 32-bit. An alias for CSINC that conditionally increments Wn by 1 and writes the result to Wd if the condition is true, otherwise copies Wn to Wd. This instruction does not affect the condition flags. AArch64-only instruction.",
      "example": "CINC w0, w1, cond",
      "pseudocode": "if ConditionHolds(cond) then Wd ← Wn + 1 else Wd ← Wn"
    },
    {
      "mnemonic": "cinv",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Invert",
      "summary": "Invert register bits if condition is true, else copy. (Alias for CSINV)",
      "syntax": "CINV <Wd>, <Wn>, <cond>",
      "encoding": {
        "format": "Cond Select",
        "binary_pattern": "0 | 1 | 0 | 11010100 | Rm | cond | 0 | 0 | Rn | Rd",
        "hex_opcode": "0x5A800000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Base",
      "description": "Conditionally inverts all bits in the source register and writes the result to the destination, or copies the source unchanged based on the condition code. This is an alias for CSINV (Conditional Select Invert). Condition flags are not affected by this instruction. Executes in AArch64 state only.",
      "example": "CINV w0, w1, cond",
      "pseudocode": "if ConditionHolds(cond) then\n  Wd ← ~Wn\nelse\n  Wd ← Wn"
    },
    {
      "mnemonic": "cls",
      "architecture": "ARMv8-A",
      "full_name": "Count Leading Sign Bits",
      "summary": "Counts number of consecutive sign bits.",
      "syntax": "CLS <Wd>, <Wn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 0 | 11010110 | 00000 | 00010 | 1 | Rn | Rd",
        "hex_opcode": "0x5AC01400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Counts the number of consecutive sign bits starting from bit 31 (for 32-bit operands) and writes the count to the destination register. Sign bits are those that match the most significant bit. Condition flags (N, Z, C, V) are not affected. Executes in AArch64 state only.",
      "example": "CLS w0, w1",
      "pseudocode": "count ← 0\nmsb ← Wn[31]\nfor i = 30 downto 0\n  if Wn[i] == msb then\n    count ← count + 1\n  else\n    break\nWd ← count"
    },
    {
      "mnemonic": "clz",
      "architecture": "ARMv8-A",
      "full_name": "Count Leading Zeros",
      "summary": "Counts number of consecutive zeros.",
      "syntax": "CLZ <Wd>, <Wn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 0 | 11010110 | 00000 | 00010 | 0 | Rn | Rd",
        "hex_opcode": "0x5AC01000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Counts the number of consecutive zero bits starting from the most significant bit (bit 31 for 32-bit operands) and writes the count to the destination register. Condition flags (N, Z, C, V) are not affected. Executes in AArch64 state only.",
      "example": "CLZ w0, w1",
      "pseudocode": "count ← 0\nfor i = 31 downto 0\n  if Wn[i] == 0 then\n    count ← count + 1\n  else\n    break\nWd ← count"
    },
    {
      "mnemonic": "cmn",
      "architecture": "ARMv8-A",
      "full_name": "Compare Negative (Immediate)",
      "summary": "Adds register and immediate, updates flags (discard result). (Alias for ADDS)",
      "syntax": "CMN <Wn>, #<imm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 0 | 1 | 100010 | sh | imm12 | Rn | 11111",
        "hex_opcode": "0x3100001F",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100010",
            "clean": "100010"
          },
          {
            "raw": "sh",
            "clean": "sh"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Imm"
        }
      ],
      "extension": "Base",
      "description": "Adds a 12-bit immediate value to a register and updates the condition flags based on the result; the result itself is discarded. This is an alias for ADDS with destination WZR. Sets N, Z, C, V flags according to the addition result. Executes in AArch64 state only.",
      "example": "CMN w1, #16",
      "pseudocode": "result ← Wn + imm\nN ← result[31]\nZ ← (result == 0)\nC ← CarryOut(Wn + imm)\nV ← OverflowFrom(Wn + imm)"
    },
    {
      "mnemonic": "cmp",
      "architecture": "ARMv8-A",
      "full_name": "Compare (Immediate)",
      "summary": "Subtracts immediate from register, updates flags (discard result). (Alias for SUBS)",
      "syntax": "CMP <Wn>, #<imm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 1 | 100010 | sh | imm12 | Rn | 11111",
        "hex_opcode": "0x7100001F",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100010",
            "clean": "100010"
          },
          {
            "raw": "sh",
            "clean": "sh"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Imm"
        }
      ],
      "extension": "Base",
      "description": "Subtracts a 12-bit immediate value from a register and updates the condition flags based on the result; the result itself is discarded. This is an alias for SUBS with destination WZR. Sets N, Z, C, V flags according to the subtraction result. Executes in AArch64 state only.",
      "example": "CMP w1, #16",
      "pseudocode": "result ← Wn - imm\nN ← result[31]\nZ ← (result == 0)\nC ← NOT(BorrowFrom(Wn - imm))\nV ← OverflowFrom(Wn - imm)"
    },
    {
      "mnemonic": "cneg",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Negate",
      "summary": "Negate register if condition is true, else copy. (Alias for CSNEG)",
      "syntax": "CNEG <Wd>, <Wn>, <cond>",
      "encoding": {
        "format": "Cond Select",
        "binary_pattern": "0 | 1 | 0 | 11010100 | Rm | cond | 0 | 1 | Rn | Rd",
        "hex_opcode": "0x5A800400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Base",
      "description": "Conditionally negates the source register and writes the result to the destination, or copies the source unchanged based on the condition code. This is an alias for CSNEG (Conditional Select Negate). Condition flags are not affected by this instruction. Executes in AArch64 state only.",
      "example": "CNEG w0, w1, cond",
      "pseudocode": "if ConditionHolds(cond) then\n  Wd ← -Wn\nelse\n  Wd ← Wn"
    },
    {
      "mnemonic": "csel",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Select",
      "summary": "Selects between two registers based on condition.",
      "syntax": "CSEL <Wd>, <Wn>, <Wm>, <cond>",
      "encoding": {
        "format": "Cond Select",
        "binary_pattern": "0 | 0 | 0 | 11010100 | Rm | cond | 0 | 0 | Rn | Rd",
        "hex_opcode": "0x1A800000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "True Src"
        },
        {
          "name": "Wm",
          "desc": "False Src"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Base",
      "description": "Selects one of two source registers and writes it to the destination based on the evaluated condition code. If the condition is true, Wn is selected; otherwise Wm is selected. Condition flags (N, Z, C, V) are not affected. Executes in AArch64 state only.",
      "example": "CSEL w0, w1, w2, cond",
      "pseudocode": "if ConditionHolds(cond) then\n  Wd ← Wn\nelse\n  Wd ← Wm"
    },
    {
      "mnemonic": "cset",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Set",
      "summary": "Sets register to 1 if condition true, else 0. (Alias for CSINC)",
      "syntax": "CSET <Wd>, <cond>",
      "encoding": {
        "format": "Cond Select",
        "binary_pattern": "0 | 0 | 0 | 11010100 | 11111 | cond | 0 | 1 | 11111 | Rd",
        "hex_opcode": "0x1A9F07E0",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "Base",
      "description": "Sets the destination register to 1 if the condition code is true, otherwise sets it to 0. This is an alias for CSINC (Conditional Select Increment) with both source registers set to WZR. Condition flags (N, Z, C, V) are not affected. Executes in AArch64 state only.",
      "example": "CSET w0, cond",
      "pseudocode": "if ConditionHolds(cond) then\n  Wd ← 1\nelse\n  Wd ← 0"
    },
    {
      "mnemonic": "csinc",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Select Increment",
      "summary": "Selects Wn if cond true, else (Wm + 1).",
      "syntax": "CSINC <Wd>, <Wn>, <Wm>, <cond>",
      "encoding": {
        "format": "Cond Select",
        "binary_pattern": "0 | 0 | 0 | 11010100 | Rm | cond | 0 | 1 | Rn | Rd",
        "hex_opcode": "0x1A800400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "True Src"
        },
        {
          "name": "Wm",
          "desc": "False Src"
        },
        {
          "name": "cond",
          "desc": "Cond"
        }
      ],
      "extension": "Base",
      "description": "Conditionally selects between two values: if the condition is true, writes Wn to Wd; otherwise writes (Wm + 1) to Wd. The upper 32 bits of Xd are zeroed. No flags are affected by this instruction. Available in AArch64 only.",
      "example": "CSINC w0, w1, w2, cond",
      "pseudocode": "if ConditionHolds(cond) then\n  Wd ← Wn\nelse\n  Wd ← Wm + 1"
    },
    {
      "mnemonic": "csinv",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Select Invert",
      "summary": "Selects Wn if cond true, else NOT Wm.",
      "syntax": "CSINV <Wd>, <Wn>, <Wm>, <cond>",
      "encoding": {
        "format": "Cond Select",
        "binary_pattern": "0 | 1 | 0 | 11010100 | Rm | cond | 0 | 0 | Rn | Rd",
        "hex_opcode": "0x5A800000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "True Src"
        },
        {
          "name": "Wm",
          "desc": "False Src"
        },
        {
          "name": "cond",
          "desc": "Cond"
        }
      ],
      "extension": "Base",
      "description": "Conditionally selects between two values: if the condition is true, writes Wn to Wd; otherwise writes the bitwise inversion of Wm to Wd. The upper 32 bits of Xd are zeroed. No flags are affected by this instruction. Available in AArch64 only.",
      "example": "CSINV w0, w1, w2, cond",
      "pseudocode": "if ConditionHolds(cond) then\n  Wd ← Wn\nelse\n  Wd ← ~Wm"
    },
    {
      "mnemonic": "csneg",
      "architecture": "ARMv8-A",
      "full_name": "Conditional Select Negate",
      "summary": "Selects Wn if cond true, else -Wm.",
      "syntax": "CSNEG <Wd>, <Wn>, <Wm>, <cond>",
      "encoding": {
        "format": "Cond Select",
        "binary_pattern": "0 | 1 | 0 | 11010100 | Rm | cond | 0 | 1 | Rn | Rd",
        "hex_opcode": "0x5A800400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "True Src"
        },
        {
          "name": "Wm",
          "desc": "False Src"
        },
        {
          "name": "cond",
          "desc": "Cond"
        }
      ],
      "extension": "Base",
      "description": "Conditionally selects between two values: if the condition is true, writes Wn to Wd; otherwise writes the arithmetic negation of Wm to Wd. The upper 32 bits of Xd are zeroed. No flags are affected by this instruction. Available in AArch64 only.",
      "example": "CSNEG w0, w1, w2, cond",
      "pseudocode": "if ConditionHolds(cond) then\n  Wd ← Wn\nelse\n  Wd ← -Wm"
    },
    {
      "mnemonic": "dcps1",
      "architecture": "ARMv8-A",
      "full_name": "Debug Change PE State to EL1",
      "summary": "Switch to Exception Level 1 (Debug).",
      "syntax": "DCPS1 {#<imm>}",
      "encoding": {
        "format": "Exception",
        "binary_pattern": "11010100 | 101 | imm16 | 000 | 01",
        "hex_opcode": "0xD4A00001",
        "visual_parts": [
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "imm16",
            "clean": "imm16"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "01",
            "clean": "01"
          }
        ],
        "bit_positions": "31:24 | 23:21 | 20:5 | 4:2 | 1:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "System",
      "description": "Debug instruction that changes the PE to Exception Level 1. This is a privileged instruction typically used in debug state to transition exception levels. The optional immediate provides a 16-bit debug context identifier. Requires debug permissions and is AArch64-only.",
      "example": "DCPS1",
      "pseudocode": "SPSR_EL1 ← PSTATE\nPSTATE.EL ← '01'\nPC ← DLR_EL0"
    },
    {
      "mnemonic": "dcps2",
      "architecture": "ARMv8-A",
      "full_name": "Debug Change PE State to EL2",
      "summary": "Switch to Exception Level 2 (Debug).",
      "syntax": "DCPS2 {#<imm>}",
      "encoding": {
        "format": "Exception",
        "binary_pattern": "11010100 | 101 | imm16 | 000 | 10",
        "hex_opcode": "0xD4A00002",
        "visual_parts": [
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "imm16",
            "clean": "imm16"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "10",
            "clean": "10"
          }
        ],
        "bit_positions": "31:24 | 23:21 | 20:5 | 4:2 | 1:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "System",
      "description": "Debug instruction that changes the PE to Exception Level 2. This is a privileged instruction typically used in debug state to transition exception levels. The optional immediate provides a 16-bit debug context identifier. Requires debug permissions and is AArch64-only.",
      "example": "DCPS2",
      "pseudocode": "SPSR_EL2 ← PSTATE\nPSTATE.EL ← '10'\nPC ← DLR_EL0"
    },
    {
      "mnemonic": "dcps3",
      "architecture": "ARMv8-A",
      "full_name": "Debug Change PE State to EL3",
      "summary": "Switch to Exception Level 3 (Debug).",
      "syntax": "DCPS3 {#<imm>}",
      "encoding": {
        "format": "Exception",
        "binary_pattern": "11010100 | 101 | imm16 | 000 | 11",
        "hex_opcode": "0xD4A00003",
        "visual_parts": [
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "imm16",
            "clean": "imm16"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "11",
            "clean": "11"
          }
        ],
        "bit_positions": "31:24 | 23:21 | 20:5 | 4:2 | 1:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "System",
      "description": "Debug instruction that changes the PE to Exception Level 3. This is a privileged instruction typically used in debug state to transition exception levels. The optional immediate provides a 16-bit debug context identifier. Requires debug permissions and is AArch64-only.",
      "example": "DCPS3",
      "pseudocode": "SPSR_EL3 ← PSTATE\nPSTATE.EL ← '11'\nPC ← DLR_EL0"
    },
    {
      "mnemonic": "dmb",
      "architecture": "ARMv8-A",
      "full_name": "Data Memory Barrier",
      "summary": "Ensures memory access ordering.",
      "syntax": "DMB <option>",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101000000110011 | CRm | 1 | 01 | 11111",
        "hex_opcode": "0xD50330BF",
        "visual_parts": [
          {
            "raw": "11010101000000110011",
            "clean": "11010101000000110011"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7 | 6:5 | 4:0"
      },
      "operands": [
        {
          "name": "option",
          "desc": "Barrier type (SY, ISH, etc)"
        }
      ],
      "extension": "Base",
      "description": "Data Memory Barrier instruction that ensures all memory accesses before this instruction are observed before any memory accesses after it. The option field specifies the scope (SY for full system, ISH for inner shareable, NSH for non-shareable, etc.). No register changes or flags are affected. Available in AArch64, A32, and T32.",
      "example": "DMB option",
      "pseudocode": "Barrier(option)"
    },
    {
      "mnemonic": "drps",
      "architecture": "ARMv8-A",
      "full_name": "Debug Restore PE State",
      "summary": "Restores state from SPSR_ELx and DLR_EL0.",
      "syntax": "DRPS",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101011 | 0101 | 11111 | 000000 | 11111 | 00000",
        "hex_opcode": "0xD6BF03E0",
        "visual_parts": [
          {
            "raw": "1101011",
            "clean": "1101011"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "00000",
            "clean": "00000"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [],
      "extension": "System",
      "description": "Debug Restore PE State instruction that restores the PE state from the debug link register (DLR_EL0) and the saved program state register (SPSR_ELx), effectively returning from debug state. This is a privileged instruction requiring debug permissions and is AArch64-only.",
      "example": "DRPS",
      "pseudocode": "PC ← DLR_EL0\nPSTATE ← SPSR_ELx"
    },
    {
      "mnemonic": "dsb",
      "architecture": "ARMv8-A",
      "full_name": "Data Synchronization Barrier",
      "summary": "Ensures completion of memory accesses.",
      "syntax": "DSB <option>",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101000000110011 | CRm | 1 | 00 | 11111",
        "hex_opcode": "0xD503309F",
        "visual_parts": [
          {
            "raw": "11010101000000110011",
            "clean": "11010101000000110011"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7 | 6:5 | 4:0"
      },
      "operands": [
        {
          "name": "option",
          "desc": "Barrier type"
        }
      ],
      "extension": "Base",
      "description": "Data Synchronization Barrier ensures that all memory accesses prior to the barrier are observed before any subsequent memory accesses. It acts as a full system memory barrier, blocking speculative memory accesses. Condition flags (N, Z, C, V) are unaffected. This is an AArch64 instruction requiring any privilege level; it serializes the instruction stream and all load/store operations.",
      "example": "DSB option",
      "pseudocode": "Barrier(Barrier_All)"
    },
    {
      "mnemonic": "eon",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Exclusive OR NOT",
      "summary": "XORs register with NOT of shifted register (XNOR).",
      "syntax": "EON <Wd>, <Wn>, <Wm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "0 | 10 | 01010 | shift | 1 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x4A200000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Bitwise Exclusive OR NOT performs XNOR operation: destination = source1 XOR (NOT source2_shifted). The second source register can be shifted by immediate or register amount (LSL, LSR, ASR, ROR). The N and Z condition flags are set based on the result; C and V flags are unaffected. This 32-bit operation zero-extends the result in AArch64.",
      "example": "EON w0, w1, w2",
      "pseudocode": "result ← Wn XOR (NOT (Wm << shift_amount))\nWd ← result[31:0]\nN ← result[31]\nZ ← (result == 0)"
    },
    {
      "mnemonic": "eon",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Exclusive OR NOT (64-bit)",
      "summary": "XORs 64-bit register with NOT of shifted register.",
      "syntax": "EON <Xd>, <Xn>, <Xm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "1 | 10 | 01010 | shift | 1 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0xCA200000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Xm",
          "desc": "Second source / offset 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "64-bit exclusive OR NOT: Xd ← Xn XOR NOT (Xm, optionally shifted). The second operand is shifted before the NOT operation is applied. NZCV flags are not affected. This is an AArch64-only instruction.",
      "example": "EON x0, x1, x2",
      "pseudocode": "operand2 ← DecodeShift(Xm, shift, amount)\nXd ← Xn XOR NOT operand2"
    },
    {
      "mnemonic": "eor",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Exclusive OR (Immediate)",
      "summary": "XORs register with immediate.",
      "syntax": "EOR <Wd|Wsp>, <Wn>, #<imm>",
      "encoding": {
        "format": "Logical (Immediate)",
        "binary_pattern": "0 | 10 | 100100 | 0 | immr | imms | Rn | Rd",
        "hex_opcode": "0x52000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "100100",
            "clean": "100100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "immr",
            "clean": "immr"
          },
          {
            "raw": "imms",
            "clean": "imms"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Imm"
        }
      ],
      "extension": "Base",
      "description": "Bitwise Exclusive OR (Immediate) performs a logical XOR between a 32-bit register and a bitmask immediate, writing the result to the destination register. This instruction does not affect the condition flags. It executes in AArch64 state and is available at all privilege levels.",
      "example": "EOR Wd, w1, #16",
      "pseudocode": "Wd ← Wn XOR imm"
    },
    {
      "mnemonic": "eor",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Exclusive OR (Register)",
      "summary": "XORs two registers.",
      "syntax": "EOR <Wd>, <Wn>, <Wm> {, <shift> #<amount>}",
      "encoding": {
        "format": "Logical (Register)",
        "binary_pattern": "0 | 10 | 01010 | shift | 0 | Rm | imm6 | Rn | Rd",
        "hex_opcode": "0x4A000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "shift",
            "clean": "shift"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        },
        {
          "name": "Wm",
          "desc": "Second source / offset 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Bitwise Exclusive OR (Register) performs a logical XOR between two 32-bit registers with optional shift, writing the result to the destination register. This instruction does not affect the condition flags. It executes in AArch64 state and is available at all privilege levels.",
      "example": "EOR w0, w1, w2",
      "pseudocode": "Wd ← Wn XOR (Wm << shift_amount)"
    },
    {
      "mnemonic": "eret",
      "architecture": "ARMv8-A",
      "full_name": "Exception Return",
      "summary": "Returns from an exception.",
      "syntax": "ERET",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101011 | 0100 | 11111 | 0000 | 0 | 0 | 11111 | 00000",
        "hex_opcode": "0xD69F03E0",
        "visual_parts": [
          {
            "raw": "1101011",
            "clean": "1101011"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "00000",
            "clean": "00000"
          }
        ],
        "bit_positions": "31:25 | 24:21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [],
      "extension": "Base",
      "description": "Exception Return returns control from an exception handler to the point of exception. It restores the program counter from ELR_ELx and the CPU state (mode, condition flags) from SPSR_ELx. The behavior depends on the current exception level; it is privileged and available only at EL1 or higher. No condition flags are modified by the instruction itself.",
      "example": "ERET",
      "pseudocode": "PC ← ELR_ELx\nCPSR ← SPSR_ELx\nBranch(PC)"
    },
    {
      "mnemonic": "extr",
      "architecture": "ARMv8-A",
      "full_name": "Extract",
      "summary": "Extracts a register from a pair of registers.",
      "syntax": "EXTR <Wd>, <Wn>, <Wm>, #<lsb>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 00 | 100111 | 0 | 0 | Rm | imms | Rn | Rd",
        "hex_opcode": "0x13800000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "100111",
            "clean": "100111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imms",
            "clean": "imms"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "High"
        },
        {
          "name": "Wm",
          "desc": "Low"
        },
        {
          "name": "lsb",
          "desc": "Least-significant bit position"
        }
      ],
      "extension": "Base",
      "description": "Extract concatenates two 32-bit registers (high Wn concatenated with low Wm) and extracts a contiguous 32-bit slice starting at bit position lsb. The extracted bits are placed in destination Wd. Condition flags (N, Z, C, V) are unaffected. This instruction has no implicit side effects beyond the register write.",
      "example": "EXTR w0, w1, w2, #0",
      "pseudocode": "temp ← (Wn[31:0] << 32) | Wm[31:0]\nWd ← temp[(lsb + 31):lsb]"
    },
    {
      "mnemonic": "extr",
      "architecture": "ARMv8-A",
      "full_name": "Extract (64-bit)",
      "summary": "Extracts a 64-bit register from a pair.",
      "syntax": "EXTR <Xd>, <Xn>, <Xm>, #<lsb>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 00 | 100111 | 1 | 0 | Rm | imms | Rn | Rd",
        "hex_opcode": "0x93C00000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "100111",
            "clean": "100111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "imms",
            "clean": "imms"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "High"
        },
        {
          "name": "Xm",
          "desc": "Low"
        },
        {
          "name": "lsb",
          "desc": "Least-significant bit position"
        }
      ],
      "extension": "Base",
      "description": "Extract concatenates two 64-bit registers (high Xn concatenated with low Xm) and extracts a contiguous 64-bit slice starting at bit position lsb. The extracted bits are placed in destination Xd. Condition flags (N, Z, C, V) are unaffected. This is the 64-bit variant with lsb range 0-63.",
      "example": "EXTR x0, x1, x2, #0",
      "pseudocode": "temp ← (Xn[63:0] << 64) | Xm[63:0]\nXd ← temp[(lsb + 63):lsb]"
    },
    {
      "mnemonic": "hint",
      "architecture": "ARMv8-A",
      "full_name": "Hint",
      "summary": "Provides a hint to the processor (e.g., NOP, YIELD).",
      "syntax": "HINT #<imm>",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101000000110010 | CRm | op2 | 11111",
        "hex_opcode": "0xD503201F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "Hint ID"
        }
      ],
      "extension": "Base",
      "description": "Hint provides a processor hint via an immediate value; the processor may optimize behavior based on the hint type but is not required to act on it. Common hints include NOP (0x0), YIELD (0x1), WFE (0x2), and WFI (0x3). Condition flags (N, Z, C, V) are unaffected. The instruction executes in all exception levels without privilege requirements.",
      "example": "HINT #16",
      "pseudocode": "case imm of\n  0: NOP\n  1: Yield()\n  2: WaitForEvent()\n  3: WaitForInterrupt()\n  otherwise: NOP"
    },
    {
      "mnemonic": "hlt",
      "architecture": "ARMv8-A",
      "full_name": "Halting Debug-mode",
      "summary": "Enters Halting debug mode.",
      "syntax": "HLT #<imm>",
      "encoding": {
        "format": "Exception",
        "binary_pattern": "11010100 | 010 | imm16 | 000 | 00",
        "hex_opcode": "0xD4400000",
        "visual_parts": [
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "imm16",
            "clean": "imm16"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "00",
            "clean": "00"
          }
        ],
        "bit_positions": "31:24 | 23:21 | 20:5 | 4:2 | 1:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "Base",
      "description": "Halting Debug-mode halts the processor and requests entry into halting debug mode with the given exception number. It generates an exception and is typically used only in debug scenarios. No condition flags are modified. This instruction is privileged and requires AArch64 execution; it transitions to debug state and may not return to normal execution.",
      "example": "HLT #16",
      "pseudocode": "BRK(imm16)"
    },
    {
      "mnemonic": "hvc",
      "architecture": "ARMv8-A",
      "full_name": "Hypervisor Call",
      "summary": "Generates a Hypervisor Call exception to EL2.",
      "syntax": "HVC #<imm>",
      "encoding": {
        "format": "Exception",
        "binary_pattern": "11010100 | 000 | imm16 | 000 | 10",
        "hex_opcode": "0xD4000002",
        "visual_parts": [
          {
            "raw": "11010100",
            "clean": "11010100"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "imm16",
            "clean": "imm16"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "10",
            "clean": "10"
          }
        ],
        "bit_positions": "31:24 | 23:21 | 20:5 | 4:2 | 1:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "System",
      "description": "Hypervisor Call generates an exception to the hypervisor (EL2) and passes a 16-bit immediate value to it. The exception is synchronous and the current state is saved so the hypervisor can interpret the request. Condition flags (N, Z, C, V) are unaffected by the instruction itself. This requires AArch64 execution and can be called from EL0, EL1, or EL2.",
      "example": "HVC #16",
      "pseudocode": "exception ← HypervisorCall\nESR_ELx.ISS ← imm16\nBranch to EL2 exception handler"
    },
    {
      "mnemonic": "isb",
      "architecture": "ARMv8-A",
      "full_name": "Instruction Synchronization Barrier",
      "summary": "Flushes the pipeline and prefetches.",
      "syntax": "ISB {<option>}",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101000000110011 | CRm | 1 | 10 | 11111",
        "hex_opcode": "0xD50330DF",
        "visual_parts": [
          {
            "raw": "11010101000000110011",
            "clean": "11010101000000110011"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7 | 6:5 | 4:0"
      },
      "operands": [
        {
          "name": "option",
          "desc": "Option (usually 15)"
        }
      ],
      "extension": "Base",
      "description": "Instruction Synchronization Barrier flushes the instruction pipeline and discards prefetched instructions, ensuring all prior instructions complete before subsequent instructions begin execution. This is a memory ordering operation that does not affect the condition flags. It executes in AArch64 state at EL0 and above.",
      "example": "ISB",
      "pseudocode": "Instruction pipeline ← flushed; Prefetched instructions ← discarded"
    },
    {
      "mnemonic": "ldar",
      "architecture": "ARMv8-A",
      "full_name": "Load-Acquire Register",
      "summary": "Loads a word with Acquire semantics.",
      "syntax": "LDAR <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "10 | 0010001 | 1 | 0 | 11111 | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x88DFFC00",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0010001",
            "clean": "0010001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Load-Acquire Register loads a 32-bit word from memory with Acquire semantics, establishing a one-way barrier that prevents subsequent memory operations from being observed before the load completes. The instruction is AArch64-only, does not modify condition flags, and provides explicit synchronization without atomic read-modify-write. The loaded value is zero-extended to 64 bits in the destination register.",
      "example": "LDAR w3, [x1]",
      "pseudocode": "Wt ← ZeroExtend(Mem32[Xn], 32)\n# Acquire semantics: subsequent memory operations appear after this load"
    },
    {
      "mnemonic": "ldarb",
      "architecture": "ARMv8-A",
      "full_name": "Load-Acquire Register Byte",
      "summary": "Loads a byte with Acquire semantics.",
      "syntax": "LDARB <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "00 | 0010001 | 1 | 0 | 11111 | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x08DFFC00",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0010001",
            "clean": "0010001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Load-Acquire Register Byte loads an 8-bit byte from memory with Acquire semantics, establishing a one-way barrier that prevents subsequent memory operations from being observed before the load completes. The instruction is AArch64-only, does not modify condition flags, and the loaded byte is zero-extended to 32 bits in the destination register.",
      "example": "LDARB w3, [x1]",
      "pseudocode": "Wt ← ZeroExtend(Mem8[Xn], 8)\n# Acquire semantics: subsequent memory operations appear after this load"
    },
    {
      "mnemonic": "ldarh",
      "architecture": "ARMv8-A",
      "full_name": "Load-Acquire Register Halfword",
      "summary": "Loads a halfword with Acquire semantics.",
      "syntax": "LDARH <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "01 | 0010001 | 1 | 0 | 11111 | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x48DFFC00",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0010001",
            "clean": "0010001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Load-Acquire Register Halfword loads a 16-bit halfword from memory with Acquire semantics, establishing a one-way barrier that prevents subsequent memory operations from being observed before the load completes. The instruction is AArch64-only, does not modify condition flags, and the loaded halfword is zero-extended to 32 bits in the destination register.",
      "example": "LDARH w3, [x1]",
      "pseudocode": "Wt ← ZeroExtend(Mem16[Xn], 16)\n# Acquire semantics: subsequent memory operations appear after this load"
    },
    {
      "mnemonic": "ldaxr",
      "architecture": "ARMv8-A",
      "full_name": "Load-Acquire Exclusive Register",
      "summary": "Loads a word with Acquire Exclusive semantics.",
      "syntax": "LDAXR <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "10 | 0010000 | 1 | 0 | 11111 | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x885FFC00",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Load-Acquire Exclusive Register loads a 32-bit word from memory with both Acquire and Exclusive semantics, establishing a one-way memory barrier and reserving the addressed location for exclusive write tracking. The instruction is AArch64-only, does not modify condition flags, and the loaded value is zero-extended to 64 bits. This instruction must be paired with a store exclusive to complete atomic transactions.",
      "example": "LDAXR w3, [x1]",
      "pseudocode": "Wt ← ZeroExtend(Mem32[Xn], 32)\nExclusiveMonitor[Xn] ← LOCKED\n# Acquire semantics: subsequent memory operations appear after this load"
    },
    {
      "mnemonic": "ldaxrb",
      "architecture": "ARMv8-A",
      "full_name": "Load-Acquire Exclusive Register Byte",
      "summary": "Loads a byte with Acquire Exclusive semantics.",
      "syntax": "LDAXRB <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "00 | 0010000 | 1 | 0 | 11111 | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x085FFC00",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Load-Acquire Exclusive Register Byte loads an 8-bit byte from memory with both Acquire and Exclusive semantics, establishing a one-way memory barrier and reserving the addressed location for exclusive write tracking. The instruction is AArch64-only, does not modify condition flags, and the loaded byte is zero-extended to 32 bits. This instruction must be paired with a store exclusive to complete atomic byte transactions.",
      "example": "LDAXRB w3, [x1]",
      "pseudocode": "Wt ← ZeroExtend(Mem8[Xn], 8)\nExclusiveMonitor[Xn] ← LOCKED\n# Acquire semantics: subsequent memory operations appear after this load"
    },
    {
      "mnemonic": "ldaxrh",
      "architecture": "ARMv8-A",
      "full_name": "Load-Acquire Exclusive Register Halfword",
      "summary": "Loads a halfword with Acquire Exclusive semantics.",
      "syntax": "LDAXRH <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store Excl",
        "binary_pattern": "01 | 0010000 | 1 | 0 | 11111 | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x485FFC00",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Load-Acquire Exclusive Register Halfword loads a 16-bit halfword from memory with both Acquire and Exclusive semantics, establishing a one-way memory barrier and reserving the addressed location for exclusive write tracking. The instruction is AArch64-only, does not modify condition flags, and the loaded halfword is zero-extended to 32 bits. This instruction must be paired with a store exclusive to complete atomic halfword transactions.",
      "example": "LDAXRH w3, [x1]",
      "pseudocode": "Wt ← ZeroExtend(Mem16[Xn], 16)\nExclusiveMonitor[Xn] ← LOCKED\n# Acquire semantics: subsequent memory operations appear after this load"
    },
    {
      "mnemonic": "ldnp",
      "architecture": "ARMv8-A",
      "full_name": "Load Pair of Registers (Non-temporal)",
      "summary": "Loads two words, hinting non-temporal data (no caching).",
      "syntax": "LDNP <Wt1>, <Wt2>, [<Xn|SP>, #<imm>]",
      "encoding": {
        "format": "Load/Store Pair",
        "binary_pattern": "00 | 101 | 0 | 000 | 1 | imm7 | Rt2 | Rn | Rt",
        "hex_opcode": "0x28400000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm7",
            "clean": "imm7"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:23 | 22 | 21:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt1",
          "desc": "Target 1"
        },
        {
          "name": "Wt2",
          "desc": "Target 2"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "Base",
      "description": "Load Pair of Registers (Non-temporal) loads two 32-bit words from memory into two registers with a non-temporal hint indicating the data is unlikely to be reused soon, allowing the processor to avoid cache pollution. The instruction does not affect the condition flags. It executes in AArch64 state and is available at all privilege levels.",
      "example": "LDNP w3, w4, [x1, #16]",
      "pseudocode": "address ← Xn + (sign_extend(imm7) << 2); Wt1 ← [address]; Wt2 ← [address + 4]"
    },
    {
      "mnemonic": "ldp",
      "architecture": "ARMv8-A",
      "full_name": "Load Pair of Registers",
      "summary": "Loads two words from memory.",
      "syntax": "LDP <Wt1>, <Wt2>, [<Xn|SP>], #<imm>",
      "encoding": {
        "format": "Load/Store Pair",
        "binary_pattern": "00 | 101 | 0 | 010 | 1 | imm7 | Rt2 | Rn | Rt",
        "hex_opcode": "0x29400000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm7",
            "clean": "imm7"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:23 | 22 | 21:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt1",
          "desc": "Target 1"
        },
        {
          "name": "Wt2",
          "desc": "Target 2"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "Base",
      "description": "Load Pair of Registers loads two 32-bit words from consecutive memory locations into two registers, with optional post-index addressing. The instruction is AArch64-only, does not modify condition flags, and the two loaded values are zero-extended to 64 bits if using Wt1/Wt2 operands. The base register is updated after the load if post-index addressing is specified.",
      "example": "LDP w3, w4, [x1], #16",
      "pseudocode": "offset ← SignExtend(imm7 << 2, 64)\nWt1 ← ZeroExtend(Mem32[Xn], 32)\nWt2 ← ZeroExtend(Mem32[Xn + 4], 32)\nXn ← Xn + offset"
    },
    {
      "mnemonic": "ldp",
      "architecture": "ARMv8-A",
      "full_name": "Load Pair of Registers (64-bit)",
      "summary": "Loads two 64-bit doublewords from memory.",
      "syntax": "LDP <Xt1>, <Xt2>, [<Xn|SP>], #<imm>",
      "encoding": {
        "format": "Load/Store Pair",
        "binary_pattern": "10 | 101 | 0 | 010 | 1 | imm7 | Rt2 | Rn | Rt",
        "hex_opcode": "0xA9400000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm7",
            "clean": "imm7"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:23 | 22 | 21:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt1",
          "desc": "Target 1"
        },
        {
          "name": "Xt2",
          "desc": "Target 2"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "Base",
      "description": "Load Pair of Registers (64-bit) loads two 64-bit doublewords from memory into two 64-bit registers and then post-increments the base register. The instruction does not affect the condition flags. It executes in AArch64 state and is available at all privilege levels.",
      "example": "LDP x3, x4, [x1], #16",
      "pseudocode": "address ← Xn; Xt1 ← [address]; Xt2 ← [address + 8]; Xn ← Xn + (sign_extend(imm7) << 3)"
    },
    {
      "mnemonic": "ldpsw",
      "architecture": "ARMv8-A",
      "full_name": "Load Pair of Registers Signed Word",
      "summary": "Loads two words and sign-extends them to 64-bit.",
      "syntax": "LDPSW <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]",
      "encoding": {
        "format": "Load/Store Pair",
        "binary_pattern": "01 | 101 | 0 | 010 | 1 | imm7 | Rt2 | Rn | Rt",
        "hex_opcode": "0x69400000",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm7",
            "clean": "imm7"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:23 | 22 | 21:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt1",
          "desc": "Target 1"
        },
        {
          "name": "Xt2",
          "desc": "Target 2"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "Base",
      "description": "Loads two consecutive signed 32-bit words from memory and sign-extends each to 64 bits, storing them in Xt1 and Xt2. The memory address is computed from the base register Xn (or SP) plus a scaled 7-bit signed immediate offset (scaled by 4). No condition flags are affected. This is an AArch64-only instruction.",
      "example": "LDPSW x3, x4, [x1, #16]",
      "pseudocode": "offset ← imm << 2;\naddress ← (if Xn == 31 then SP else Xn) + offset;\nXt1 ← SignExtend(Mem[address, 4], 32);\nXt2 ← SignExtend(Mem[address + 4, 4], 32);"
    },
    {
      "mnemonic": "ldr",
      "architecture": "ARMv8-A",
      "full_name": "Load Register (Immediate)",
      "summary": "Loads a word from memory (Immediate offset).",
      "syntax": "LDR <Wt>, [<Xn|SP>, #<pimm>]",
      "encoding": {
        "format": "Load/Store Imm",
        "binary_pattern": "10 | 111 | 0 | 01 | 01 | imm12 | Rn | Rt",
        "hex_opcode": "0xB9400000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "pimm",
          "desc": "Positive immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Load Register (Immediate) loads a 32-bit word from memory at an offset address into a 32-bit register. The instruction does not affect the condition flags. It executes in AArch64 state and is available at all privilege levels.",
      "example": "LDR w3, [x1, #16]",
      "pseudocode": "address ← Xn + (zero_extend(imm12) << 2); Wt ← [address]"
    },
    {
      "mnemonic": "ldr",
      "architecture": "ARMv8-A",
      "full_name": "Load Register (Literal)",
      "summary": "Loads a word from a PC-relative address.",
      "syntax": "LDR <Wt>, <label>",
      "encoding": {
        "format": "Load Literal",
        "binary_pattern": "00 | 011 | 0 | 00 | imm19 | Rt",
        "hex_opcode": "0x18000000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "imm19",
            "clean": "imm19"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Load Register (Literal) loads a 32-bit word from a PC-relative address into a 32-bit register. The instruction does not affect the condition flags. It executes in AArch64 state and is available at all privilege levels.",
      "example": "LDR w3, label",
      "pseudocode": "address ← PC + (sign_extend(imm19) << 2); Wt ← [address]"
    },
    {
      "mnemonic": "ldr",
      "architecture": "ARMv8-A",
      "full_name": "Load Register (Register)",
      "summary": "Loads a word from memory (Register offset).",
      "syntax": "LDR <Wt>, [<Xn|SP>, <R><m> {, <extend> <amount>}]",
      "encoding": {
        "format": "Load/Store Reg",
        "binary_pattern": "10 | 111 | 0 | 00 | 01 | 1 | Rm | option | S | 10 | Rn | Rt",
        "hex_opcode": "0xB8600800",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Rm",
          "desc": "Offset Reg"
        }
      ],
      "extension": "Base",
      "description": "Load Register (Register) loads a 32-bit word from memory using a register offset with optional sign/zero extension or shift into a 32-bit register. The instruction does not affect the condition flags. It executes in AArch64 state and is available at all privilege levels.",
      "example": "LDR w3, [x1, Rm ]",
      "pseudocode": "offset ← extended_value(Rm, extend_type, shift_amount); address ← Xn + offset; Wt ← [address]"
    },
    {
      "mnemonic": "add",
      "architecture": "ARMv8-A",
      "full_name": "Vector Add (Integer)",
      "summary": "Adds corresponding elements in two vectors.",
      "syntax": "ADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 10000 | 1 | Rn | Rd",
        "hex_opcode": "0x0E208400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds corresponding integer elements in two NEON vectors and writes the results to the destination vector. Operates element-wise on 8-bit, 16-bit, 32-bit, or 64-bit elements as determined by the size and Q fields. Condition flags (N, Z, C, V) are not affected; wrapping addition is performed on overflow.",
      "example": "ADD v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector - 1\n  Vd[i] ← Vn[i] + Vm[i]"
    },
    {
      "mnemonic": "sub",
      "architecture": "ARMv8-A",
      "full_name": "Vector Subtract (Integer)",
      "summary": "Subtracts elements of Vm from Vn.",
      "syntax": "SUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 10000 | 1 | Rn | Rd",
        "hex_opcode": "0x2E208400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Subtracts corresponding integer elements of Vm from Vn and writes the results to the destination vector. Operates element-wise on 8-bit, 16-bit, 32-bit, or 64-bit elements as determined by the size and Q fields. Condition flags (N, Z, C, V) are not affected; wrapping subtraction is performed on underflow.",
      "example": "SUB v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector - 1\n  Vd[i] ← Vn[i] - Vm[i]"
    },
    {
      "mnemonic": "mul",
      "architecture": "ARMv8-A",
      "full_name": "Vector Multiply (Integer)",
      "summary": "Multiplies corresponding elements in two vectors.",
      "syntax": "MUL <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 10011 | 1 | Rn | Rd",
        "hex_opcode": "0x0E209C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10011",
            "clean": "10011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies corresponding integer elements in two NEON vectors and writes the results to the destination vector. Operates element-wise on 8-bit, 16-bit, or 32-bit elements; the result is the lower bits of the product (wrapping multiplication). Condition flags (N, Z, C, V) are not affected.",
      "example": "MUL v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector - 1\n  Vd[i] ← (Vn[i] × Vm[i]) mod 2^element_width"
    },
    {
      "mnemonic": "mla",
      "architecture": "ARMv8-A",
      "full_name": "Vector Multiply-Accumulate",
      "summary": "Multiplies elements and adds to destination (Vd = Vd + Vn * Vm).",
      "syntax": "MLA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 10010 | 1 | Rn | Rd",
        "hex_opcode": "0x0E209400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10010",
            "clean": "10010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies corresponding elements of Vn and Vm, then adds the products to the corresponding elements of Vd, storing results back in Vd. Operates on integer elements of size determined by the size field (8, 16, or 32 bits). The Q bit determines operation width (64-bit for Q=0, 128-bit for Q=1). No condition flags are affected. AArch64 NEON extension.",
      "example": "MLA v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to (128 >> (if Q then 0 else 1)) - 1 step esize:\n  Vd[i +: esize] ← Vd[i +: esize] + (Vn[i +: esize] * Vm[i +: esize]);"
    },
    {
      "mnemonic": "mls",
      "architecture": "ARMv8-A",
      "full_name": "Vector Multiply-Subtract",
      "summary": "Multiplies elements and subtracts from destination (Vd = Vd - Vn * Vm).",
      "syntax": "MLS <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 10010 | 1 | Rn | Rd",
        "hex_opcode": "0x2E209400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10010",
            "clean": "10010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies corresponding elements of Vn and Vm, then subtracts the products from the corresponding elements of Vd, storing results back in Vd. Operates on integer elements of size determined by the size field (8, 16, or 32 bits). The Q bit determines operation width (64-bit for Q=0, 128-bit for Q=1). No condition flags are affected. AArch64 NEON extension.",
      "example": "MLS v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to (128 >> (if Q then 0 else 1)) - 1 step esize:\n  Vd[i +: esize] ← Vd[i +: esize] - (Vn[i +: esize] * Vm[i +: esize]);"
    },
    {
      "mnemonic": "pmul",
      "architecture": "ARMv8-A",
      "full_name": "Vector Polynomial Multiply",
      "summary": "Performs polynomial multiplication over {0,1}.",
      "syntax": "PMUL <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 10011 | 1 | Rn | Rd",
        "hex_opcode": "0x2E209C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10011",
            "clean": "10011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs polynomial multiplication over GF(2^m) on corresponding 8-bit elements of Vn and Vm, storing results in Vd. Each element is treated as a polynomial with coefficients in {0,1}, and multiplication is performed modulo an irreducible polynomial. The Q bit determines operation width (64-bit for Q=0, 128-bit for Q=1). No condition flags are affected. AArch64 NEON extension.",
      "example": "PMUL v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to (128 >> (if Q then 0 else 1)) - 1 step 8:\n  Vd[i +: 8] ← PolynomialMultiply(Vn[i +: 8], Vm[i +: 8]);"
    },
    {
      "mnemonic": "and",
      "architecture": "ARMv8-A",
      "full_name": "Vector Bitwise AND",
      "summary": "Bitwise AND of two vectors.",
      "syntax": "AND <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | 00 | 1 | Rm | 00011 | 1 | Rn | Rd",
        "hex_opcode": "0x0E201C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs bitwise AND between corresponding elements of Vn and Vm, storing results in Vd. Operates on the full vector width without regard to element size. The Q bit determines operation width (64-bit for Q=0, 128-bit for Q=1). No condition flags are affected. AArch64 NEON extension.",
      "example": "AND v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to (128 >> (if Q then 0 else 1)) - 1:\n  Vd[i] ← Vn[i] AND Vm[i];"
    },
    {
      "mnemonic": "orr",
      "architecture": "ARMv8-A",
      "full_name": "Vector Bitwise OR",
      "summary": "Bitwise OR of two vectors.",
      "syntax": "ORR <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | 10 | 1 | Rm | 00011 | 1 | Rn | Rd",
        "hex_opcode": "0x0EA01C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs bitwise OR between corresponding elements of Vn and Vm, storing results in Vd. Operates on the full vector width without regard to element size. The Q bit determines operation width (64-bit for Q=0, 128-bit for Q=1). No condition flags are affected. AArch64 NEON extension.",
      "example": "ORR v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to (128 >> (if Q then 0 else 1)) - 1:\n  Vd[i] ← Vn[i] OR Vm[i];"
    },
    {
      "mnemonic": "eor",
      "architecture": "ARMv8-A",
      "full_name": "Vector Bitwise Exclusive OR",
      "summary": "Bitwise XOR of two vectors.",
      "syntax": "EOR <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | 00 | 1 | Rm | 00011 | 1 | Rn | Rd",
        "hex_opcode": "0x2E201C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs bitwise exclusive OR between corresponding elements of Vn and Vm, storing results in Vd. Operates on the full vector width without regard to element size. The Q bit determines operation width (64-bit for Q=0, 128-bit for Q=1). No condition flags are affected. AArch64 NEON extension.",
      "example": "EOR v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to (128 >> (if Q then 0 else 1)) - 1:\n  Vd[i] ← Vn[i] XOR Vm[i];"
    },
    {
      "mnemonic": "bic",
      "architecture": "ARMv8-A",
      "full_name": "Vector Bitwise Bit Clear",
      "summary": "ANDs Vd with NOT of Vm.",
      "syntax": "BIC <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | 01 | 1 | Rm | 00011 | 1 | Rn | Rd",
        "hex_opcode": "0x0E601C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs bitwise AND between Vn and the bitwise NOT of Vm, storing results in Vd. This clears bits in Vn where corresponding bits in Vm are set. Operates on the full vector width without regard to element size. The Q bit determines operation width (64-bit for Q=0, 128-bit for Q=1). No condition flags are affected. AArch64 NEON extension.",
      "example": "BIC v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to (128 >> (if Q then 0 else 1)) - 1:\n  Vd[i] ← Vn[i] AND NOT(Vm[i]);"
    },
    {
      "mnemonic": "orn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Bitwise OR NOT",
      "summary": "ORs Vd with NOT of Vm.",
      "syntax": "ORN <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | 11 | 1 | Rm | 00011 | 1 | Rn | Rd",
        "hex_opcode": "0x0EE01C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a bitwise OR NOT operation on SIMD vector elements: each bit in Vd is set to (Vn | ~Vm). This is a bitwise logical operation that operates independently on each bit across all lanes. No condition flags are affected. Executes in AArch64 state with NEON extension; operates on both 64-bit (Q=0) and 128-bit (Q=1) vector registers.",
      "example": "ORN v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to (datasize / 8) - 1\n  Vd[i*8 +: 8] ← Vn[i*8 +: 8] | ~Vm[i*8 +: 8]"
    },
    {
      "mnemonic": "mov",
      "architecture": "ARMv8-A",
      "full_name": "Vector Move (Register)",
      "summary": "Copies a vector register (Alias for ORR Vd, Vn, Vn).",
      "syntax": "MOV <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Alias",
        "binary_pattern": "0 | Q | 0 | 01110 | 10 | 1 | Rm | 00011 | 1 | Rn | Rd",
        "hex_opcode": "0x0EA01C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Copies a SIMD vector register to another. This is an alias for ORR Vd, Vn, Vn that performs a bitwise OR of Vn with itself, resulting in an identical copy. No condition flags are affected; the instruction operates on all elements simultaneously.",
      "example": "MOV v0.4s.T, v1.4s.T",
      "pseudocode": "Vd ← Vn"
    },
    {
      "mnemonic": "bsl",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Select",
      "summary": "Selects bits from Vn or Vm based on Vd (mask). (Vd = (Vd & Vn) | (~Vd & Vm)).",
      "syntax": "BSL <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | 01 | 1 | Rm | 00011 | 1 | Rn | Rd",
        "hex_opcode": "0x2E601C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Mask/Dest"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a bitwise select operation using Vd as a mask: Vd ← (Vd & Vn) | (~Vd & Vm). Bits are selected from Vn where the corresponding bit in Vd is 1, and from Vm where the corresponding bit in Vd is 0. No condition flags are affected. Executes in AArch64 state with NEON extension on both 64-bit (Q=0) and 128-bit (Q=1) vectors.",
      "example": "BSL v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to (datasize / 8) - 1\n  Vd[i*8 +: 8] ← (Vd[i*8 +: 8] & Vn[i*8 +: 8]) | (~Vd[i*8 +: 8] & Vm[i*8 +: 8])"
    },
    {
      "mnemonic": "bit",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Insert if True",
      "summary": "Inserts bits from Vn into Vd where Vm (mask) is 1.",
      "syntax": "BIT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | 10 | 1 | Rm | 00011 | 1 | Rn | Rd",
        "hex_opcode": "0x2EA01C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Mask"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a bitwise insert-if-true operation: Vd ← (Vd & ~Vm) | (Vn & Vm). Bits from Vn are inserted into Vd where the corresponding bit in Vm is 1; Vd bits are retained where Vm is 0. No condition flags are affected. Executes in AArch64 state with NEON extension on both 64-bit (Q=0) and 128-bit (Q=1) vectors.",
      "example": "BIT v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to (datasize / 8) - 1\n  Vd[i*8 +: 8] ← (Vd[i*8 +: 8] & ~Vm[i*8 +: 8]) | (Vn[i*8 +: 8] & Vm[i*8 +: 8])"
    },
    {
      "mnemonic": "bif",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise Insert if False",
      "summary": "Inserts bits from Vn into Vd where Vm (mask) is 0.",
      "syntax": "BIF <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | 11 | 1 | Rm | 00011 | 1 | Rn | Rd",
        "hex_opcode": "0x2EE01C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Mask"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a bitwise insert-if-false operation: Vd ← (Vd & Vm) | (Vn & ~Vm). Bits from Vn are inserted into Vd where the corresponding bit in Vm is 0; Vd bits are retained where Vm is 1. No condition flags are affected. Executes in AArch64 state with NEON extension on both 64-bit (Q=0) and 128-bit (Q=1) vectors.",
      "example": "BIF v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to (datasize / 8) - 1\n  Vd[i*8 +: 8] ← (Vd[i*8 +: 8] & Vm[i*8 +: 8]) | (Vn[i*8 +: 8] & ~Vm[i*8 +: 8])"
    },
    {
      "mnemonic": "fadd",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Add",
      "summary": "Adds elements of two floating-point vectors.",
      "syntax": "FADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 011100 | sz | 1 | Rm | 11010 | 1 | Rn | Rd",
        "hex_opcode": "0x0E20D400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011100",
            "clean": "011100"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "11010",
            "clean": "11010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds corresponding floating-point elements in Vn and Vm, storing results in Vd. Supports both 32-bit (sz=0) and 64-bit (sz=1) floating-point lanes across 64-bit (Q=0) or 128-bit (Q=1) vectors. Floating-point exception behavior follows IEEE 754 semantics; no integer condition flags are affected. Executes in AArch64 state with NEON extension.",
      "example": "FADD v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "if sz == '0' then\n  for i = 0 to (datasize / 32) - 1\n    Vd[i*32 +: 32] ← FPAdd(Vn[i*32 +: 32], Vm[i*32 +: 32], FPCR)\nelse\n  for i = 0 to (datasize / 64) - 1\n    Vd[i*64 +: 64] ← FPAdd(Vn[i*64 +: 64], Vm[i*64 +: 64], FPCR)"
    },
    {
      "mnemonic": "fsub",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Subtract",
      "summary": "Subtracts elements of floating-point vectors.",
      "syntax": "FSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | 1 | 10 | Rm | 00 | 010 | 1 | Rn | Rd",
        "hex_opcode": "0x0EC01400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:21 | 20:16 | 15:14 | 13:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Subtracts floating-point elements in Vm from corresponding elements in Vn, storing results in Vd. Supports both 32-bit (sz=0) and 64-bit (sz=1) floating-point lanes across 64-bit (Q=0) or 128-bit (Q=1) vectors. Floating-point exception behavior follows IEEE 754 semantics; no integer condition flags are affected. Executes in AArch64 state with NEON extension.",
      "example": "FSUB v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "if sz == '0' then\n  for i = 0 to (datasize / 32) - 1\n    Vd[i*32 +: 32] ← FPSub(Vn[i*32 +: 32], Vm[i*32 +: 32], FPCR)\nelse\n  for i = 0 to (datasize / 64) - 1\n    Vd[i*64 +: 64] ← FPSub(Vn[i*64 +: 64], Vm[i*64 +: 64], FPCR)"
    },
    {
      "mnemonic": "fmul",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Multiply",
      "summary": "Multiplies elements of floating-point vectors.",
      "syntax": "FMUL <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 011100 | sz | 1 | Rm | 11011 | 1 | Rn | Rd",
        "hex_opcode": "0x2E20DC00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011100",
            "clean": "011100"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "11011",
            "clean": "11011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies corresponding floating-point elements in Vn and Vm, storing results in Vd. Supports both 32-bit (sz=0) and 64-bit (sz=1) floating-point lanes across 64-bit (Q=0) or 128-bit (Q=1) vectors. Floating-point exception behavior follows IEEE 754 semantics; no integer condition flags are affected. Executes in AArch64 state with NEON extension.",
      "example": "FMUL v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "if sz == '0' then\n  for i = 0 to (datasize / 32) - 1\n    Vd[i*32 +: 32] ← FPMul(Vn[i*32 +: 32], Vm[i*32 +: 32], FPCR)\nelse\n  for i = 0 to (datasize / 64) - 1\n    Vd[i*64 +: 64] ← FPMul(Vn[i*64 +: 64], Vm[i*64 +: 64], FPCR)"
    },
    {
      "mnemonic": "fdiv",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Divide",
      "summary": "Divides elements of floating-point vectors.",
      "syntax": "FDIV <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 011100 | sz | 1 | Rm | 11111 | 1 | Rn | Rd",
        "hex_opcode": "0x2E20FC00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011100",
            "clean": "011100"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "Dividend"
        },
        {
          "name": "Vm",
          "desc": "Divisor"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Divides corresponding floating-point elements in Vn by elements in Vm, storing results in Vd. Supports both 32-bit (sz=0) and 64-bit (sz=1) floating-point lanes across 64-bit (Q=0) or 128-bit (Q=1) vectors. Floating-point exception behavior follows IEEE 754 semantics including division-by-zero handling; no integer condition flags are affected. Executes in AArch64 state with NEON extension.",
      "example": "FDIV v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "if sz == '0' then\n  for i = 0 to (datasize / 32) - 1\n    Vd[i*32 +: 32] ← FPDiv(Vn[i*32 +: 32], Vm[i*32 +: 32], FPCR)\nelse\n  for i = 0 to (datasize / 64) - 1\n    Vd[i*64 +: 64] ← FPDiv(Vn[i*64 +: 64], Vm[i*64 +: 64], FPCR)"
    },
    {
      "mnemonic": "fmax",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Maximum",
      "summary": "Compares and returns the larger value per element.",
      "syntax": "FMAX <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | 0 | sz | 1 | Rm | 11110 | 1 | Rn | Rd",
        "hex_opcode": "0x0E20F400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Compares corresponding floating-point elements in two NEON vectors and places the larger value in the destination vector for each element. No NEON flag bits are affected; this is a per-element maximum operation available in 32-bit and 64-bit floating-point forms (controlled by sz). Executes on AArch64 with NEON/ASIMD extension; the Q bit selects between 64-bit (Q=0) and 128-bit (Q=1) vector width.",
      "example": "FMAX v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector-1:\n  element_size = 32 if sz==0 else 64\n  Vd[element][element_size-1:0] = max_fp(Vn[element][element_size-1:0], Vm[element][element_size-1:0])"
    },
    {
      "mnemonic": "fmin",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Minimum",
      "summary": "Compares and returns the smaller value per element.",
      "syntax": "FMIN <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | 1 | sz | 1 | Rm | 11110 | 1 | Rn | Rd",
        "hex_opcode": "0x0EA0F400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Compares corresponding floating-point elements in two NEON vectors and places the smaller value in the destination vector for each element. No NEON flag bits are affected; this is a per-element minimum operation available in 32-bit and 64-bit floating-point forms (controlled by sz). Executes on AArch64 with NEON/ASIMD extension; the Q bit selects between 64-bit (Q=0) and 128-bit (Q=1) vector width.",
      "example": "FMIN v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector-1:\n  element_size = 32 if sz==0 else 64\n  Vd[element][element_size-1:0] = min_fp(Vn[element][element_size-1:0], Vm[element][element_size-1:0])"
    },
    {
      "mnemonic": "fmla",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Multiply-Accumulate",
      "summary": "Multiplies and adds to destination (Vd = Vd + Vn * Vm).",
      "syntax": "FMLA <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | 0 | sz | 1 | Rm | 11001 | 1 | Rn | Rd",
        "hex_opcode": "0x0E20CC00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "11001",
            "clean": "11001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies corresponding floating-point elements from two source vectors and accumulates the product into the destination vector: Vd[i] = Vd[i] + Vn[i] × Vm[i] per element. Floating-point exceptions (invalid operation, overflow, underflow, inexact) may be signaled per IEEE 754 semantics; no integer flags are affected. Available in 32-bit and 64-bit floating-point forms (sz controls element width) on AArch64 with NEON/ASIMD extension.",
      "example": "FMLA v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector-1:\n  element_size = 32 if sz==0 else 64\n  product = Vn[element][element_size-1:0] * Vm[element][element_size-1:0]\n  Vd[element][element_size-1:0] = Vd[element][element_size-1:0] + product"
    },
    {
      "mnemonic": "fmls",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Multiply-Subtract",
      "summary": "Multiplies and subtracts from destination (Vd = Vd - Vn * Vm).",
      "syntax": "FMLS <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | 1 | sz | 1 | Rm | 11001 | 1 | Rn | Rd",
        "hex_opcode": "0x0EA0CC00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "11001",
            "clean": "11001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies corresponding floating-point elements from two source vectors and subtracts the product from the destination vector: Vd[i] = Vd[i] - Vn[i] × Vm[i] per element. Floating-point exceptions (invalid operation, overflow, underflow, inexact) may be signaled per IEEE 754 semantics; no integer flags are affected. Available in 32-bit and 64-bit floating-point forms (sz controls element width) on AArch64 with NEON/ASIMD extension.",
      "example": "FMLS v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector-1:\n  element_size = 32 if sz==0 else 64\n  product = Vn[element][element_size-1:0] * Vm[element][element_size-1:0]\n  Vd[element][element_size-1:0] = Vd[element][element_size-1:0] - product"
    },
    {
      "mnemonic": "fsqrt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Square Root",
      "summary": "Calculates square root for each element.",
      "syntax": "FSQRT <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 1 | 011101 | sz | 10000 | 11111 | 10 | Rn | Rd",
        "hex_opcode": "0x2EA1F800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011101",
            "clean": "011101"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Calculates the floating-point square root of each element in the source vector and places the result in the destination vector. Floating-point exceptions (invalid operation, inexact) may be signaled per IEEE 754 semantics; no integer flags are affected. Available in 32-bit and 64-bit floating-point forms (sz controls element width) on AArch64 with NEON/ASIMD extension.",
      "example": "FSQRT v0.4s.T, v1.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector-1:\n  element_size = 32 if sz==0 else 64\n  Vd[element][element_size-1:0] = sqrt_fp(Vn[element][element_size-1:0])"
    },
    {
      "mnemonic": "fabs",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Absolute Value",
      "summary": "Calculates absolute value for each element.",
      "syntax": "FABS <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 0 | 011101 | sz | 10000 | 01111 | 10 | Rn | Rd",
        "hex_opcode": "0x0EA0F800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011101",
            "clean": "011101"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "01111",
            "clean": "01111"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Clears the sign bit of each floating-point element in the source vector, placing the absolute value in the destination vector. This is a bit-level operation that does not signal floating-point exceptions. Available in 32-bit and 64-bit floating-point forms (sz controls element width) on AArch64 with NEON/ASIMD extension.",
      "example": "FABS v0.4s.T, v1.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector-1:\n  element_size = 32 if sz==0 else 64\n  Vd[element][element_size-1:0] = Vn[element][element_size-2:0] || 0"
    },
    {
      "mnemonic": "fneg",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Negate",
      "summary": "Negates each element.",
      "syntax": "FNEG <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 1 | 011101 | sz | 10000 | 01111 | 10 | Rn | Rd",
        "hex_opcode": "0x2EA0F800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011101",
            "clean": "011101"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "01111",
            "clean": "01111"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Inverts the sign bit of each floating-point element in the source vector, placing the negated value in the destination vector. This is a bit-level operation that does not signal floating-point exceptions. Available in 32-bit and 64-bit floating-point forms (sz controls element width) on AArch64 with NEON/ASIMD extension.",
      "example": "FNEG v0.4s.T, v1.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector-1:\n  element_size = 32 if sz==0 else 64\n  sign_bit = NOT(Vn[element][element_size-1])\n  Vd[element][element_size-1:0] = sign_bit || Vn[element][element_size-2:0]"
    },
    {
      "mnemonic": "dup",
      "architecture": "ARMv8-A",
      "full_name": "Duplicate Vector Element (Scalar)",
      "summary": "Duplicates a general-purpose register to all vector elements.",
      "syntax": "DUP <Vd>.<T>, <R><n>",
      "encoding": {
        "format": "SIMD Copy",
        "binary_pattern": "0 | Q | 0 | 01110000 | imm5 | 0 | 0000 | 1 | Rn | Rd",
        "hex_opcode": "0x0E000C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110000",
            "clean": "01110000"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15 | 14:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Vector"
        },
        {
          "name": "Rn",
          "desc": "Src GPR"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Broadcasts the value from a general-purpose register (either X or W form) to every element of the destination NEON vector. The imm5 field encodes the element size: bit 0 distinguishes 8/16-bit, bits 1-2 distinguish 8/16/32/64-bit granularity. No flags are affected. Available on AArch64 with NEON/ASIMD extension; the Q bit selects 64-bit (Q=0) or 128-bit (Q=1) vector width.",
      "example": "DUP v0.4s.T, Rn",
      "pseudocode": "element_size = decode_imm5(imm5)\nfor i = 0 to elements_in_vector-1:\n  Vd[element][element_size-1:0] = Rn[element_size-1:0]"
    },
    {
      "mnemonic": "dup",
      "architecture": "ARMv8-A",
      "full_name": "Duplicate Vector Element (Element)",
      "summary": "Duplicates a vector element to all elements in destination.",
      "syntax": "DUP <Vd>.<T>, <Vn>.<Ts>[<index>]",
      "encoding": {
        "format": "SIMD Copy",
        "binary_pattern": "0 | Q | 0 | 01110000 | imm5 | 0 | 0000 | 1 | Rn | Rd",
        "hex_opcode": "0x0E000400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110000",
            "clean": "01110000"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15 | 14:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "Src Vector"
        },
        {
          "name": "index",
          "desc": "Index"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Duplicates a single element from a vector and replicates it to fill all elements in the destination vector. The element index is encoded in the imm5 field, which also determines the element size based on the position of the most significant set bit. This is a NEON SIMD instruction available in AArch64 only, with Q determining 64-bit (Q=0) or 128-bit (Q=1) operation. No condition flags are affected.",
      "example": "DUP v0.4s.T, v1.4s.Ts[index]",
      "pseudocode": "element_size ← decode_element_size(imm5);\nelement ← Vn.<element_size>[index_from_imm5];\nfor i = 0 to (vector_length / element_size - 1)\n  Vd.<element_size>[i] ← element;"
    },
    {
      "mnemonic": "ins",
      "architecture": "ARMv8-A",
      "full_name": "Insert Vector Element (General)",
      "summary": "Moves data from a GPR to a specific vector element.",
      "syntax": "INS <Vd>.<Ts>[<index>], <Rn>",
      "encoding": {
        "format": "SIMD Copy",
        "binary_pattern": "0 | 1 | 0 | 01110000 | imm5 | 0 | 0011 | 1 | Rn | Rd",
        "hex_opcode": "0x4E001C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110000",
            "clean": "01110000"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15 | 14:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "index",
          "desc": "Index"
        },
        {
          "name": "Rn",
          "desc": "Src GPR"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Moves a single 64-bit value from a general-purpose register to a specified element position within a vector register, leaving other elements unchanged. The destination element index is encoded in the imm5 field, with the element size implicitly 64-bit. This is a NEON SIMD instruction available in AArch64 only. No condition flags are affected.",
      "example": "INS v0.4s.Ts[index], r1",
      "pseudocode": "element_index ← decode_index_from_imm5(imm5);\nVd.D[element_index] ← Rn;"
    },
    {
      "mnemonic": "mov",
      "architecture": "ARMv8-A",
      "full_name": "Move Element to Element",
      "summary": "Moves a vector element to another vector element (Alias for INS).",
      "syntax": "MOV <Vd>.<Ts>[<index1>], <Vn>.<Ts>[<index2>]",
      "encoding": {
        "format": "SIMD Copy",
        "binary_pattern": "0 | 1 | 1 | 01110000 | imm5 | 0 | imm4 | 1 | Rn | Rd",
        "hex_opcode": "0x6E000400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110000",
            "clean": "01110000"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15 | 14:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "index1",
          "desc": "Dst Index"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "index2",
          "desc": "Src Index"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Moves a single vector element from a source vector to a specified element position in a destination vector (this is an alias for INS when source and destination are both vector registers). The element indices are encoded in the imm5 field, which must support dual index encoding. This is a NEON SIMD instruction available in AArch64 only. No condition flags are affected.",
      "example": "MOV v0.4s.Ts[index1], v1.4s.Ts[index2]",
      "pseudocode": "src_index ← decode_src_index_from_imm5(imm5);\ndst_index ← decode_dst_index_from_imm5(imm5);\nelement_size ← decode_element_size(imm5);\nVd.<element_size>[dst_index] ← Vn.<element_size>[src_index];"
    },
    {
      "mnemonic": "abs",
      "architecture": "ARMv8-A",
      "full_name": "Vector Absolute Value",
      "summary": "Calculates absolute value of integer elements.",
      "syntax": "ABS <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 10000 | 01011 | 10 | Rn | Rd",
        "hex_opcode": "0x0E20B800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes the absolute value of each signed integer element in the source vector and stores the result in the destination vector. The operation processes all elements in parallel; Q determines 64-bit (Q=0) or 128-bit (Q=1) operation, and size determines element width (8, 16, 32, or 64 bits). This is a NEON SIMD instruction available in AArch64 only. No condition flags are affected; saturation behavior depends on implementation.",
      "example": "ABS v0.4s.T, v1.4s.T",
      "pseudocode": "element_size ← 8 << size;\nfor i = 0 to (vector_length / element_size - 1)\n  if Vn.<element_size>[i] == minimum_signed_value(element_size)\n    Vd.<element_size>[i] ← minimum_signed_value(element_size);\n  else\n    Vd.<element_size>[i] ← |Vn.<element_size>[i]|;"
    },
    {
      "mnemonic": "neg",
      "architecture": "ARMv8-A",
      "full_name": "Vector Negate",
      "summary": "Negates integer elements.",
      "syntax": "NEG <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 10000 | 01011 | 10 | Rn | Rd",
        "hex_opcode": "0x2E20B800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "01011",
            "clean": "01011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Negates each signed or unsigned integer element in the source vector and stores the result in the destination vector. The operation processes all elements in parallel; Q determines 64-bit (Q=0) or 128-bit (Q=1) operation, and size determines element width (8, 16, 32, or 64 bits). This is a NEON SIMD instruction available in AArch64 only. No condition flags are affected.",
      "example": "NEG v0.4s.T, v1.4s.T",
      "pseudocode": "element_size ← 8 << size;\nfor i = 0 to (vector_length / element_size - 1)\n  Vd.<element_size>[i] ← -Vn.<element_size>[i];"
    },
    {
      "mnemonic": "mvn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Bitwise NOT",
      "summary": "Bitwise NOT of a vector.",
      "syntax": "MVN <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 1 | 01110 | 00 | 10000 | 00101 | 10 | Rn | Rd",
        "hex_opcode": "0x2E205800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "00101",
            "clean": "00101"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a bitwise NOT (complement) on each bit of the source vector and stores the result in the destination vector. The operation processes all elements in parallel with the same bitwise inversion applied across all bits; Q determines 64-bit (Q=0) or 128-bit (Q=1) operation. This is a NEON SIMD instruction available in AArch64 only. No condition flags are affected.",
      "example": "MVN v0.4s.T, v1.4s.T",
      "pseudocode": "for i = 0 to (vector_length - 1)\n  Vd.bit[i] ← NOT Vn.bit[i];"
    },
    {
      "mnemonic": "smax",
      "architecture": "ARMv8-A",
      "full_name": "Vector Signed Maximum",
      "summary": "Returns larger signed integer per element.",
      "syntax": "SMAX <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 0110 | 0 | 1 | Rn | Rd",
        "hex_opcode": "0x0E206400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes the signed maximum of corresponding elements from two source vectors and stores the result in the destination vector. The operation processes all elements in parallel; Q determines 64-bit (Q=0) or 128-bit (Q=1) operation, and size determines element width (8, 16, 32, or 64 bits). This is a NEON SIMD instruction available in AArch64 only. No condition flags are affected.",
      "example": "SMAX v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "element_size ← 8 << size;\nfor i = 0 to (vector_length / element_size - 1)\n  Vd.<element_size>[i] ← max_signed(Vn.<element_size>[i], Vm.<element_size>[i]);"
    },
    {
      "mnemonic": "smin",
      "architecture": "ARMv8-A",
      "full_name": "Vector Signed Minimum",
      "summary": "Returns smaller signed integer per element.",
      "syntax": "SMIN <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 0110 | 1 | 1 | Rn | Rd",
        "hex_opcode": "0x0E206C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes the signed minimum of corresponding elements from two source vectors and stores the result in the destination vector. The operation processes all elements in parallel; Q determines 64-bit (Q=0) or 128-bit (Q=1) operation, and size determines element width (8, 16, 32, or 64 bits). This is a NEON SIMD instruction available in AArch64 only. No condition flags are affected.",
      "example": "SMIN v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "element_size ← 8 << size;\nfor i = 0 to (vector_length / element_size - 1)\n  Vd.<element_size>[i] ← min_signed(Vn.<element_size>[i], Vm.<element_size>[i]);"
    },
    {
      "mnemonic": "umax",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unsigned Maximum",
      "summary": "Returns larger unsigned integer per element.",
      "syntax": "UMAX <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 0110 | 0 | 1 | Rn | Rd",
        "hex_opcode": "0x2E206400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Unsigned Maximum compares corresponding unsigned integer elements in two NEON registers and places the larger value into the destination register, operating element-wise according to the element type T. This instruction operates on all elements within the vector (128-bit if Q=1, 64-bit if Q=0) and does not modify the condition flags. AArch64-only NEON instruction with no privilege restrictions.",
      "example": "UMAX v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector(Q, size) - 1 do\n  Vd[i] ← max_unsigned(Vn[i], Vm[i])\nend for"
    },
    {
      "mnemonic": "umin",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unsigned Minimum",
      "summary": "Returns smaller unsigned integer per element.",
      "syntax": "UMIN <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 0110 | 1 | 1 | Rn | Rd",
        "hex_opcode": "0x2E206C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Unsigned Minimum compares corresponding unsigned integer elements in two NEON registers and places the smaller value into the destination register, operating element-wise according to the element type T. This instruction operates on all elements within the vector (128-bit if Q=1, 64-bit if Q=0) and does not modify the condition flags. AArch64-only NEON instruction with no privilege restrictions.",
      "example": "UMIN v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector(Q, size) - 1 do\n  Vd[i] ← min_unsigned(Vn[i], Vm[i])\nend for"
    },
    {
      "mnemonic": "sqadd",
      "architecture": "ARMv8-A",
      "full_name": "Vector Signed Saturating Add",
      "summary": "Adds signed integers with saturation.",
      "syntax": "SQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 00001 | 1 | Rn | Rd",
        "hex_opcode": "0x0E200C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Signed Saturating Add adds corresponding signed integer elements from two NEON registers with saturation, placing the sum into the destination register. If overflow occurs, the result is clamped to the maximum or minimum value representable in the element type. This instruction operates element-wise on all vector elements and does not modify the condition flags. AArch64-only NEON instruction with no privilege restrictions.",
      "example": "SQADD v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector(Q, size) - 1 do\n  sum ← signed_add(Vn[i], Vm[i])\n  if overflow then\n    Vd[i] ← (Vn[i] < 0) ? INT_MIN(size) : INT_MAX(size)\n  else\n    Vd[i] ← sum\n  end if\nend for"
    },
    {
      "mnemonic": "uqadd",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unsigned Saturating Add",
      "summary": "Adds unsigned integers with saturation.",
      "syntax": "UQADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 00001 | 1 | Rn | Rd",
        "hex_opcode": "0x2E200C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Unsigned Saturating Add adds corresponding unsigned integer elements from two NEON registers with saturation, placing the sum into the destination register. If the sum exceeds the maximum value representable in the element type, the result is saturated to that maximum. This instruction operates element-wise on all vector elements and does not modify the condition flags. AArch64-only NEON instruction with no privilege restrictions.",
      "example": "UQADD v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector(Q, size) - 1 do\n  sum ← Vn[i] + Vm[i]\n  if sum > UINT_MAX(size) then\n    Vd[i] ← UINT_MAX(size)\n  else\n    Vd[i] ← sum\n  end if\nend for"
    },
    {
      "mnemonic": "sqsub",
      "architecture": "ARMv8-A",
      "full_name": "Vector Signed Saturating Subtract",
      "summary": "Subtracts signed integers with saturation.",
      "syntax": "SQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 00101 | 1 | Rn | Rd",
        "hex_opcode": "0x0E202C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00101",
            "clean": "00101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Signed Saturating Subtract subtracts corresponding signed integer elements from two NEON registers with saturation, placing the difference into the destination register. If overflow occurs, the result is clamped to the maximum or minimum value representable in the element type. This instruction operates element-wise on all vector elements and does not modify the condition flags. AArch64-only NEON instruction with no privilege restrictions.",
      "example": "SQSUB v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector(Q, size) - 1 do\n  diff ← signed_subtract(Vn[i], Vm[i])\n  if overflow then\n    Vd[i] ← (Vn[i] < 0) ? INT_MIN(size) : INT_MAX(size)\n  else\n    Vd[i] ← diff\n  end if\nend for"
    },
    {
      "mnemonic": "uqsub",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unsigned Saturating Subtract",
      "summary": "Subtracts unsigned integers with saturation.",
      "syntax": "UQSUB <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 00101 | 1 | Rn | Rd",
        "hex_opcode": "0x2E202C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00101",
            "clean": "00101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Unsigned Saturating Subtract subtracts corresponding unsigned integer elements from two NEON registers with saturation, placing the difference into the destination register. If the subtraction would produce a negative result, the result is saturated to zero. This instruction operates element-wise on all vector elements and does not modify the condition flags. AArch64-only NEON instruction with no privilege restrictions.",
      "example": "UQSUB v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector(Q, size) - 1 do\n  if Vn[i] < Vm[i] then\n    Vd[i] ← 0\n  else\n    Vd[i] ← Vn[i] - Vm[i]\n  end if\nend for"
    },
    {
      "mnemonic": "shl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Shift Left (Immediate)",
      "summary": "Shifts elements left by immediate value.",
      "syntax": "SHL <Vd>.<T>, <Vn>.<T>, #<shift>",
      "encoding": {
        "format": "SIMD Shift Imm",
        "binary_pattern": "0 | Q | 0 | 011110 | immh | immb | 01010 | 1 | Rn | Rd",
        "hex_opcode": "0x0F005400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011110",
            "clean": "011110"
          },
          {
            "raw": "immh",
            "clean": "immh"
          },
          {
            "raw": "immb",
            "clean": "immb"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22:19 | 18:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "shift",
          "desc": "Imm"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Shift Left shifts each element of a NEON register left by an immediate value, filling vacated bit positions with zeros. The immediate shift amount is encoded in the imm field and must be within the range [0, element_width-1]; shifting by the element width or more produces a zero result. This instruction does not modify the condition flags. AArch64-only NEON instruction with no privilege restrictions.",
      "example": "SHL v0.4s.T, v1.4s.T, #LSL",
      "pseudocode": "for i = 0 to elements_in_vector(Q, size) - 1 do\n  if shift_amount < element_width(size) then\n    Vd[i] ← Vn[i] << shift_amount\n  else\n    Vd[i] ← 0\n  end if\nend for"
    },
    {
      "mnemonic": "ushr",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unsigned Shift Right",
      "summary": "Shifts elements right (logical).",
      "syntax": "USHR <Vd>.<T>, <Vn>.<T>, #<shift>",
      "encoding": {
        "format": "SIMD Shift Imm",
        "binary_pattern": "0 | Q | 1 | 011110 | immh | immb | 00 | 0 | 0 | 01 | Rn | Rd",
        "hex_opcode": "0x2F000400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011110",
            "clean": "011110"
          },
          {
            "raw": "immh",
            "clean": "immh"
          },
          {
            "raw": "immb",
            "clean": "immb"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22:19 | 18:16 | 15:14 | 13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "shift",
          "desc": "Imm"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Unsigned Shift Right performs a logical right shift on each element of a NEON register by an immediate value, filling vacated bit positions with zeros. The immediate shift amount is encoded in the imm field and must be within the range [1, element_width]; shifting by the element width or more produces a zero result. This instruction does not modify the condition flags. AArch64-only NEON instruction with no privilege restrictions.",
      "example": "USHR v0.4s.T, v1.4s.T, #LSL",
      "pseudocode": "for i = 0 to elements_in_vector(Q, size) - 1 do\n  if shift_amount <= element_width(size) then\n    Vd[i] ← Vn[i] >> shift_amount\n  else\n    Vd[i] ← 0\n  end if\nend for"
    },
    {
      "mnemonic": "sshr",
      "architecture": "ARMv8-A",
      "full_name": "Vector Signed Shift Right",
      "summary": "Shifts elements right (arithmetic/sign-extending).",
      "syntax": "SSHR <Vd>.<T>, <Vn>.<T>, #<shift>",
      "encoding": {
        "format": "SIMD Shift Imm",
        "binary_pattern": "0 | Q | 0 | 011110 | immh | immb | 00 | 0 | 0 | 01 | Rn | Rd",
        "hex_opcode": "0x0F000400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011110",
            "clean": "011110"
          },
          {
            "raw": "immh",
            "clean": "immh"
          },
          {
            "raw": "immb",
            "clean": "immb"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22:19 | 18:16 | 15:14 | 13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "shift",
          "desc": "Imm"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each signed element in the vector right by an immediate shift count, filling the vacated bits with the sign bit (arithmetic right shift). The shift amount is encoded in the imm field; the element size is determined by the type specifier (.8B, .4H, .2S, .1D, etc.). Condition flags are not affected. This is a NEON instruction available in AArch64 execution state.",
      "example": "SSHR v0.4s.T, v1.4s.T, #LSL",
      "pseudocode": "shift_amount ← imm\nfor i = 0 to elements_in_vector - 1\n  Vd[i] ← SignExtend(Vn[i] >> shift_amount, element_width)"
    },
    {
      "mnemonic": "cmgt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare Greater Than",
      "summary": "Compares elements (Vn > Vm) and sets bits to all 1s or 0s.",
      "syntax": "CMGT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 0011 | 0 | 1 | Rn | Rd",
        "hex_opcode": "0x0E203400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Compares each signed element of Vn with the corresponding element of Vm; if Vn[i] > Vm[i], sets all bits in Vd[i] to 1; otherwise sets them to 0. The comparison is signed. Condition flags are not affected. This is a NEON instruction available in AArch64 execution state.",
      "example": "CMGT v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector - 1\n  if (Vn[i] > Vm[i]) then\n    Vd[i] ← all_ones\n  else\n    Vd[i] ← all_zeros"
    },
    {
      "mnemonic": "cmeq",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare Equal",
      "summary": "Compares elements (Vn == Vm) and sets bits to all 1s or 0s.",
      "syntax": "CMEQ <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 10001 | 1 | Rn | Rd",
        "hex_opcode": "0x2E208C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10001",
            "clean": "10001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Compares each element of Vn with the corresponding element of Vm for equality; if Vn[i] == Vm[i], sets all bits in Vd[i] to 1; otherwise sets them to 0. The comparison is bitwise exact, regardless of signedness. Condition flags are not affected. This is a NEON instruction available in AArch64 execution state.",
      "example": "CMEQ v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector - 1\n  if (Vn[i] == Vm[i]) then\n    Vd[i] ← all_ones\n  else\n    Vd[i] ← all_zeros"
    },
    {
      "mnemonic": "cmge",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare Greater Than or Equal",
      "summary": "Compares elements (Vn >= Vm).",
      "syntax": "CMGE <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 0011 | 1 | 1 | Rn | Rd",
        "hex_opcode": "0x0E203C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Compares each signed element of Vn with the corresponding element of Vm; if Vn[i] >= Vm[i], sets all bits in Vd[i] to 1; otherwise sets them to 0. The comparison is signed. Condition flags are not affected. This is a NEON instruction available in AArch64 execution state.",
      "example": "CMGE v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector - 1\n  if (Vn[i] >= Vm[i]) then\n    Vd[i] ← all_ones\n  else\n    Vd[i] ← all_zeros"
    },
    {
      "mnemonic": "cmtst",
      "architecture": "ARMv8-A",
      "full_name": "Vector Compare Test",
      "summary": "Tests if any bits match ((Vn & Vm) != 0).",
      "syntax": "CMTST <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 10001 | 1 | Rn | Rd",
        "hex_opcode": "0x0E208C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10001",
            "clean": "10001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Tests whether any bits match between Vn and Vm by computing the bitwise AND; if (Vn[i] & Vm[i]) != 0, sets all bits in Vd[i] to 1; otherwise sets them to 0. Condition flags are not affected. This is a NEON instruction available in AArch64 execution state.",
      "example": "CMTST v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector - 1\n  if ((Vn[i] & Vm[i]) != 0) then\n    Vd[i] ← all_ones\n  else\n    Vd[i] ← all_zeros"
    },
    {
      "mnemonic": "addv",
      "architecture": "ARMv8-A",
      "full_name": "Vector Add Across",
      "summary": "Adds all elements of the vector into a scalar result.",
      "syntax": "ADDV <V><d>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Across Lane",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 11000 | 11011 | 10 | Rn | Rd",
        "hex_opcode": "0x0E31B800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "11000",
            "clean": "11000"
          },
          {
            "raw": "11011",
            "clean": "11011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Vn",
          "desc": "Src Vector"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds all elements in the vector and places the scalar result in the destination register. The result element width matches the input element width, and only the corresponding element in Vd is updated (upper bits of the 128-bit register are zeroed for the scalar result). Condition flags are not affected. This is a NEON across-lane instruction available in AArch64 execution state.",
      "example": "ADDV Vd, v1.4s.T",
      "pseudocode": "result ← 0\nfor i = 0 to elements_in_vector - 1\n  result ← result + Vn[i]\nVd[result_element_index] ← result\nVd[upper_bits] ← 0"
    },
    {
      "mnemonic": "smaxv",
      "architecture": "ARMv8-A",
      "full_name": "Vector Signed Maximum Across",
      "summary": "Finds the maximum signed value across the vector.",
      "syntax": "SMAXV <V><d>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Across Lane",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 11000 | 0 | 101010 | Rn | Rd",
        "hex_opcode": "0x0E30A800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "11000",
            "clean": "11000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "101010",
            "clean": "101010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Vn",
          "desc": "Src Vector"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Finds the maximum signed value among all elements in the vector and places the scalar result in the destination register. The result element width matches the input element width, and only the corresponding scalar element in Vd is updated (upper bits are zeroed). Condition flags are not affected. This is a NEON across-lane instruction available in AArch64 execution state.",
      "example": "SMAXV Vd, v1.4s.T",
      "pseudocode": "result ← Vn[0]\nfor i = 1 to elements_in_vector - 1\n  result ← max_signed(result, Vn[i])\nVd[result_element_index] ← result\nVd[upper_bits] ← 0"
    },
    {
      "mnemonic": "uminv",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unsigned Minimum Across",
      "summary": "Finds the minimum unsigned value across the vector.",
      "syntax": "UMINV <V><d>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Across Lane",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 11000 | 1 | 101010 | Rn | Rd",
        "hex_opcode": "0x2E31A800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "11000",
            "clean": "11000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "101010",
            "clean": "101010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Vn",
          "desc": "Src Vector"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Finds the minimum unsigned value among all elements in the vector and places the scalar result in the destination register. The result element width matches the input element width, and only the corresponding scalar element in Vd is updated (upper bits are zeroed). Condition flags are not affected. This is a NEON across-lane instruction available in AArch64 execution state.",
      "example": "UMINV Vd, v1.4s.T",
      "pseudocode": "result ← Vn[0]\nfor i = 1 to elements_in_vector - 1\n  result ← min_unsigned(result, Vn[i])\nVd[result_element_index] ← result\nVd[upper_bits] ← 0"
    },
    {
      "mnemonic": "zip1",
      "architecture": "ARMv8-A",
      "full_name": "Vector Zip 1 (Interleave)",
      "summary": "Interleaves the lower halves of two vectors.",
      "syntax": "ZIP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Permute",
        "binary_pattern": "0 | Q | 001110 | size | 0 | Rm | 0 | 0 | 1110 | Rn | Rd",
        "hex_opcode": "0x0E003800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "001110",
            "clean": "001110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29:24 | 23:22 | 21 | 20:16 | 15 | 14 | 13:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Interleaves the lower halves of two vectors by taking alternate elements from Vn and Vm and writing them to Vd. This is a pure data movement operation with no flag updates. Execution is restricted to AArch64 with NEON support (ARMv8.0+) and does not require elevated privilege.",
      "example": "ZIP1 v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "bits(128) result;\nfor e = 0 to (esize/8)-1\n  result[e*16 +: 8] ← Vn[e*16 +: 8];\n  result[e*16 + 8 +: 8] ← Vm[e*16 +: 8];\nif Q == 0 then\n  Vd ← result[0 +: 64];\nelse\n  Vd ← result;"
    },
    {
      "mnemonic": "zip2",
      "architecture": "ARMv8-A",
      "full_name": "Vector Zip 2 (Interleave)",
      "summary": "Interleaves the upper halves of two vectors.",
      "syntax": "ZIP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Permute",
        "binary_pattern": "0 | Q | 001110 | size | 0 | Rm | 0 | 1 | 1110 | Rn | Rd",
        "hex_opcode": "0x0E007800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "001110",
            "clean": "001110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29:24 | 23:22 | 21 | 20:16 | 15 | 14 | 13:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Interleaves the upper halves of two vectors by taking alternate elements from the upper halves of Vn and Vm. Like ZIP1, this is a permutation-only operation with no flag updates. Execution is restricted to AArch64 with NEON support (ARMv8.0+).",
      "example": "ZIP2 v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "bits(128) result;\nfor e = 0 to (esize/8)-1\n  result[e*16 +: 8] ← Vn[(e+half)*16 +: 8];\n  result[e*16 + 8 +: 8] ← Vm[(e+half)*16 +: 8];\nif Q == 0 then\n  Vd ← result[0 +: 64];\nelse\n  Vd ← result;"
    },
    {
      "mnemonic": "uzp1",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unzip 1",
      "summary": "De-interleaves lower halves (Selects odd elements).",
      "syntax": "UZP1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Permute",
        "binary_pattern": "0 | Q | 001110 | size | 0 | Rm | 0 | 0 | 0110 | Rn | Rd",
        "hex_opcode": "0x0E001800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "001110",
            "clean": "001110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29:24 | 23:22 | 21 | 20:16 | 15 | 14 | 13:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "De-interleaves the lower halves of two vectors by selecting odd-indexed elements (every other element starting from index 1) from the concatenation of Vn and Vm. This is a pure permutation with no flag updates. Execution is restricted to AArch64 with NEON support (ARMv8.0+).",
      "example": "UZP1 v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "bits(128) concatenated = Vn[0 +: 64] concatenate Vm[0 +: 64];\nbits(128) result;\nfor e = 0 to (esize/8)-1\n  result[e*8 +: 8] ← concatenated[(e*2 + 1)*8 +: 8];\nif Q == 0 then\n  Vd ← result[0 +: 64];\nelse\n  Vd ← result;"
    },
    {
      "mnemonic": "uzp2",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unzip 2",
      "summary": "De-interleaves upper halves (Selects even elements).",
      "syntax": "UZP2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Permute",
        "binary_pattern": "0 | Q | 001110 | size | 0 | Rm | 0 | 1 | 0110 | Rn | Rd",
        "hex_opcode": "0x0E005800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "001110",
            "clean": "001110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29:24 | 23:22 | 21 | 20:16 | 15 | 14 | 13:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "De-interleaves the upper halves of two vectors by selecting even-indexed elements (every other element starting from index 0) from the concatenation of Vn and Vm. This is a pure permutation with no flag updates. Execution is restricted to AArch64 with NEON support (ARMv8.0+).",
      "example": "UZP2 v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "bits(128) concatenated = Vn[0 +: 64] concatenate Vm[0 +: 64];\nbits(128) result;\nfor e = 0 to (esize/8)-1\n  result[e*8 +: 8] ← concatenated[(e*2)*8 +: 8];\nif Q == 0 then\n  Vd ← result[0 +: 64];\nelse\n  Vd ← result;"
    },
    {
      "mnemonic": "trn1",
      "architecture": "ARMv8-A",
      "full_name": "Vector Transpose 1",
      "summary": "Transposes elements (Lower).",
      "syntax": "TRN1 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Permute",
        "binary_pattern": "0 | Q | 001110 | size | 0 | Rm | 0 | 0 | 1010 | Rn | Rd",
        "hex_opcode": "0x0E002800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "001110",
            "clean": "001110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29:24 | 23:22 | 21 | 20:16 | 15 | 14 | 13:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Transposes elements by interleaving lower halves of Vn and Vm in a transposition pattern, selecting alternate elements from Vn first. This is a pure permutation with no flag updates. Execution is restricted to AArch64 with NEON support (ARMv8.0+).",
      "example": "TRN1 v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "bits(128) result;\nfor e = 0 to (esize/16)-1\n  result[e*16 +: 8] ← Vn[e*16 +: 8];\n  result[e*16 + 8 +: 8] ← Vm[e*16 +: 8];\nif Q == 0 then\n  Vd ← result[0 +: 64];\nelse\n  Vd ← result;"
    },
    {
      "mnemonic": "trn2",
      "architecture": "ARMv8-A",
      "full_name": "Vector Transpose 2",
      "summary": "Transposes elements (Upper).",
      "syntax": "TRN2 <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Permute",
        "binary_pattern": "0 | Q | 001110 | size | 0 | Rm | 0 | 1 | 1010 | Rn | Rd",
        "hex_opcode": "0x0E006800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "001110",
            "clean": "001110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29:24 | 23:22 | 21 | 20:16 | 15 | 14 | 13:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Transposes elements by interleaving upper halves of Vn and Vm in a transposition pattern, selecting alternate elements from Vn first. This is a pure permutation with no flag updates. Execution is restricted to AArch64 with NEON support (ARMv8.0+).",
      "example": "TRN2 v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "bits(128) result;\nfor e = 0 to (esize/16)-1\n  result[e*16 +: 8] ← Vn[(e + half)*16 +: 8];\n  result[e*16 + 8 +: 8] ← Vm[(e + half)*16 +: 8];\nif Q == 0 then\n  Vd ← result[0 +: 64];\nelse\n  Vd ← result;"
    },
    {
      "mnemonic": "tbl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Table Lookup",
      "summary": "Look up elements in a table of vectors using indices.",
      "syntax": "TBL <Vd>.<T>, { <Vn>.16B, ... }, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Table",
        "binary_pattern": "0 | Q | 001110 | 00 | 0 | Rm | 0 | 00 | 0 | 00 | Rn | Rd",
        "hex_opcode": "0x0E000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "001110",
            "clean": "001110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29:24 | 23:22 | 21 | 20:16 | 15 | 14:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "Table"
        },
        {
          "name": "Vm",
          "desc": "Indices"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Uses byte-index elements in Vm to look up corresponding bytes in a table formed by one or more consecutive SIMD registers starting at Vn, writing the results to Vd. Out-of-range indices return zero; this is a pure permutation with no flag updates. Execution is restricted to AArch64 with NEON support (ARMv8.0+).",
      "example": "TBL v0.4s.T, v2.4s.T",
      "pseudocode": "bits(128) table[(len+1)*128-1:0];\nfor i = 0 to len\n  table[i*128 +: 128] ← V[(Rn + i) mod 32];\nfor e = 0 to elements-1\n  index ← Vm[e*8 +: 8];\n  if index < (len+1)*16 then\n    result[e*8 +: 8] ← table[index*8 +: 8];\n  else\n    result[e*8 +: 8] ← 0;\nVd ← result;"
    },
    {
      "mnemonic": "xtn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Extract Narrow",
      "summary": "Reads elements, narrows them, and writes to lower half of destination.",
      "syntax": "XTN <Vd>.<Tb>, <Vn>.<Ta>",
      "encoding": {
        "format": "SIMD Shift Imm",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 10000 | 10010 | 10 | Rn | Rd",
        "hex_opcode": "0x0E212800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10010",
            "clean": "10010"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Extracts elements from Vn, narrows them by taking the least significant bits according to the narrower type, and writes them to the lower half of Vd. The upper half of Vd is zeroed. This is a type conversion with no flag updates. Execution is restricted to AArch64 with NEON support (ARMv8.0+).",
      "example": "XTN v0.4s.Tb, v1.4s.Ta",
      "pseudocode": "esize_src ← 8 << size;\nesize_dst ← esize_src / 2;\nfor e = 0 to esize_dst-1\n  element ← Vn[e * esize_src +: esize_src];\n  result[e * esize_dst +: esize_dst] ← element[0 +: esize_dst];\nVd[0 +: 64] ← result[0 +: 64];\nVd[64 +: 64] ← 0;"
    },
    {
      "mnemonic": "ld1",
      "architecture": "ARMv8-A",
      "full_name": "Load Multiple Single Elements",
      "summary": "Loads one element structure from memory into 1-4 registers.",
      "syntax": "LD1 { <Vt>.<T>, ... }, [<Xn|SP>]",
      "encoding": {
        "format": "SIMD Load/Store",
        "binary_pattern": "0 | Q | 0011010 | 1 | 0 | 0000 | 0 | 000 | S | size | Rn | Rt",
        "hex_opcode": "0x0D400000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0011010",
            "clean": "0011010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21 | 20:17 | 16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vt",
          "desc": "Dest List"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Loads one element structure from memory into 1-4 NEON vector registers. The Q bit determines vector size (64-bit for Q=0, 128-bit for Q=1). No condition flags are affected. AArch64-only instruction; requires NEON extension support.",
      "example": "LD1 [x1]",
      "pseudocode": "address ← Xn\nfor i = 0 to num_registers - 1 do\n  Vt[i] ← memory[address + offset]\nif postindex then Xn ← Xn + transfer_size"
    },
    {
      "mnemonic": "st1",
      "architecture": "ARMv8-A",
      "full_name": "Store Multiple Single Elements",
      "summary": "Stores one element structure from 1-4 registers to memory.",
      "syntax": "ST1 { <Vt>.<T>, ... }, [<Xn|SP>]",
      "encoding": {
        "format": "SIMD Load/Store",
        "binary_pattern": "0 | Q | 0011010 | 0 | 0 | 0000 | 0 | 000 | S | size | Rn | Rt",
        "hex_opcode": "0x0D000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0011010",
            "clean": "0011010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21 | 20:17 | 16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vt",
          "desc": "Src List"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Stores one element structure from 1-4 NEON vector registers to memory. The Q bit determines vector size (64-bit for Q=0, 128-bit for Q=1). No condition flags are affected. AArch64-only instruction; requires NEON extension support.",
      "example": "ST1 [x1]",
      "pseudocode": "address ← Xn\nfor i = 0 to num_registers - 1 do\n  memory[address + offset] ← Vt[i]\nif postindex then Xn ← Xn + transfer_size"
    },
    {
      "mnemonic": "pacga",
      "architecture": "ARMv8-A",
      "full_name": "Pointer Authentication Code Generic Address",
      "summary": "Computes a pointer authentication code for an address and modifier.",
      "syntax": "PACGA <Xd>, <Xn>, <Xm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 0 | 0 | 11010110 | Rm | 001100 | Rn | Rd",
        "hex_opcode": "0x9AC03000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "001100",
            "clean": "001100"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "Address"
        },
        {
          "name": "Xm",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Computes a pointer authentication code (PAC) for a generic address using the provided address and modifier. The result is placed in Xd with only the PAC bits set; other bits are cleared. No condition flags are affected. AArch64-only; requires PAC extension; may trap if PAC key is not initialized.",
      "example": "PACGA x0, x1, x2",
      "pseudocode": "pac ← ComputePAC(Xn, Xm, PAC_key_generic)\nXd ← SignExtend(pac, 64)"
    },
    {
      "mnemonic": "pacia",
      "architecture": "ARMv8-A",
      "full_name": "Pointer Authentication Code for Instruction Address (Key A)",
      "summary": "Signs an instruction address using Key A.",
      "syntax": "PACIA <Xd>, <Xn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 000 | Rn | Rd",
        "hex_opcode": "0xDAC10000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Computes a pointer authentication code for an instruction address using Key A and the modifier in Xn, storing the signed value in Xd. This is an AArch64-only instruction used for control-flow integrity. No general-purpose condition flags are set; authentication failure (during later verification) generates an exception.",
      "example": "PACIA x0, x1",
      "pseudocode": "Xd ← AddPAC(Xd, Xn, Key_A, InstructionAddressType)"
    },
    {
      "mnemonic": "pacib",
      "architecture": "ARMv8-A",
      "full_name": "Pointer Authentication Code for Instruction Address (Key B)",
      "summary": "Signs an instruction address using Key B.",
      "syntax": "PACIB <Xd>, <Xn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 001 | Rn | Rd",
        "hex_opcode": "0xDAC10400",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Computes a pointer authentication code for an instruction address using Key B and the modifier in Xn, storing the signed value in Xd. This is an AArch64-only instruction used for control-flow integrity. No general-purpose condition flags are set; authentication failure (during later verification) generates an exception.",
      "example": "PACIB x0, x1",
      "pseudocode": "Xd ← AddPAC(Xd, Xn, Key_B, InstructionAddressType)"
    },
    {
      "mnemonic": "pacda",
      "architecture": "ARMv8-A",
      "full_name": "Pointer Authentication Code for Data Address (Key A)",
      "summary": "Signs a data address using Key A.",
      "syntax": "PACDA <Xd>, <Xn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 010 | Rn | Rd",
        "hex_opcode": "0xDAC10800",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Computes a pointer authentication code for a data address using Key A and the modifier in Xn, storing the signed value in Xd. This is an AArch64-only instruction used for data-pointer integrity. No general-purpose condition flags are set; authentication failure (during later verification) generates an exception.",
      "example": "PACDA x0, x1",
      "pseudocode": "Xd ← AddPAC(Xd, Xn, Key_A, DataAddressType)"
    },
    {
      "mnemonic": "pacdb",
      "architecture": "ARMv8-A",
      "full_name": "Pointer Authentication Code for Data Address (Key B)",
      "summary": "Signs a data address using Key B.",
      "syntax": "PACDB <Xd>, <Xn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 011 | Rn | Rd",
        "hex_opcode": "0xDAC10C00",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Computes a pointer authentication code for a data address using Key B and the modifier in Xn, storing the signed value in Xd. This is an AArch64-only instruction used for data-pointer integrity. No general-purpose condition flags are set; authentication failure (during later verification) generates an exception.",
      "example": "PACDB x0, x1",
      "pseudocode": "Xd ← AddPAC(Xd, Xn, Key_B, DataAddressType)"
    },
    {
      "mnemonic": "autia",
      "architecture": "ARMv8-A",
      "full_name": "Authenticate Instruction Address (Key A)",
      "summary": "Authenticates an instruction address signed with Key A.",
      "syntax": "AUTIA <Xd>, <Xn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 100 | Rn | Rd",
        "hex_opcode": "0xDAC11000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Authenticates a 64-bit instruction address in Xd using Key A and a modifier in Xn. The instruction performs cryptographic verification of the pointer authentication code (PAC) embedded in Xd. If authentication fails, the result is corrupted (set to an invalid address). This instruction is AArch64-only and requires ARMv8.3-A or later with PAC extension enabled; it does not affect condition flags.",
      "example": "AUTIA x0, x1",
      "pseudocode": "Xd ← AuthIA(Xd, Xn)"
    },
    {
      "mnemonic": "autib",
      "architecture": "ARMv8-A",
      "full_name": "Authenticate Instruction Address (Key B)",
      "summary": "Authenticates an instruction address signed with Key B.",
      "syntax": "AUTIB <Xd>, <Xn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 101 | Rn | Rd",
        "hex_opcode": "0xDAC11400",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Authenticates a 64-bit instruction address in Xd using Key B and a modifier in Xn. Similar to AUTIA, this instruction cryptographically verifies the pointer authentication code embedded in Xd using the alternate (Key B) authentication key. If authentication fails, the result is corrupted. This instruction is AArch64-only and requires ARMv8.3-A or later with PAC extension enabled; it does not affect condition flags.",
      "example": "AUTIB x0, x1",
      "pseudocode": "Xd ← AuthIB(Xd, Xn)"
    },
    {
      "mnemonic": "autda",
      "architecture": "ARMv8-A",
      "full_name": "Authenticate Data Address (Key A)",
      "summary": "Authenticates a data address signed with Key A.",
      "syntax": "AUTDA <Xd>, <Xn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 110 | Rn | Rd",
        "hex_opcode": "0xDAC11800",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Authenticates a 64-bit data address in Xd using Key A and a modifier in Xn. The instruction performs cryptographic verification of the pointer authentication code (PAC) embedded in Xd for data pointers. If authentication fails, the result is corrupted (set to an invalid address). This instruction is AArch64-only and requires ARMv8.3-A or later with PAC extension enabled; it does not affect condition flags.",
      "example": "AUTDA x0, x1",
      "pseudocode": "Xd ← AuthDA(Xd, Xn)"
    },
    {
      "mnemonic": "autdb",
      "architecture": "ARMv8-A",
      "full_name": "Authenticate Data Address (Key B)",
      "summary": "Authenticates a data address signed with Key B.",
      "syntax": "AUTDB <Xd>, <Xn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00001 | 00 | 0 | 111 | Rn | Rd",
        "hex_opcode": "0xDAC11C00",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00001",
            "clean": "00001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "Modifier"
        }
      ],
      "extension": "PAC (Security)",
      "description": "Authenticates a 64-bit data address in Xd using Key B and a modifier in Xn. Similar to AUTDA, this instruction cryptographically verifies the pointer authentication code embedded in Xd for data pointers using the alternate (Key B) authentication key. If authentication fails, the result is corrupted. This instruction is AArch64-only and requires ARMv8.3-A or later with PAC extension enabled; it does not affect condition flags.",
      "example": "AUTDB x0, x1",
      "pseudocode": "Xd ← AuthDB(Xd, Xn)"
    },
    {
      "mnemonic": "xpaclri",
      "architecture": "ARMv8-A",
      "full_name": "Strip PAC from Instruction Address",
      "summary": "Removes the pointer authentication code from an instruction address.",
      "syntax": "XPACLRI",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101000000110010 | 0000 | 111 | 11111",
        "hex_opcode": "0xD50320FF",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "PAC (Security)",
      "description": "Strips the pointer authentication code from the instruction address held in LR, clearing the PAC bits but retaining the address bits. Used after an indirect branch to remove authentication metadata. No condition flags are affected. AArch64-only; requires PAC extension; no operands.",
      "example": "XPACLRI",
      "pseudocode": "LR ← StripPAC(LR)"
    },
    {
      "mnemonic": "bti",
      "architecture": "ARMv8-A",
      "full_name": "Branch Target Identification",
      "summary": "Mark a valid target for an indirect branch (Control Flow Integrity).",
      "syntax": "BTI {<target>}",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101000000110010 | 0100 | op2 | 11111",
        "hex_opcode": "0xD503241F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "target",
          "desc": "Type (c, j, jc)"
        }
      ],
      "extension": "BTI (Security)",
      "description": "Marks a valid branch target for indirect branches as part of Control Flow Integrity (CFI). Encodes the expected branch target type (c=call, j=jump, jc=both) in the immediate field. Causes a PACM fault if the branch was not of the expected type. No condition flags are affected. AArch64-only; requires BTI extension.",
      "example": "BTI",
      "pseudocode": "if current_branch_type is not compatible with target then\n  raise PACM_exception\nelse\n  NOP"
    },
    {
      "mnemonic": "stg",
      "architecture": "ARMv8-A",
      "full_name": "Store Allocation Tag",
      "summary": "Stores the Allocation Tag to memory.",
      "syntax": "STG <Xt|SP>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "11011001 | 00 | 1 | imm9 | 10 | Xn | Xt",
        "hex_opcode": "0xD9200800",
        "visual_parts": [
          {
            "raw": "11011001",
            "clean": "11011001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xt",
            "clean": "Xt"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Source Tag"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Stores the Allocation Tag from Xt to a single 16-byte memory granule at [Xn + offset]. The offset is scaled by 16 (imm9 is left-shifted by 4). No condition flags are affected. AArch64-only; requires MTE extension; generates an exception if MTE is not enabled or tag check fails.",
      "example": "STG Xt, [x1, #-8]",
      "pseudocode": "address ← Xn + (SignExtend(imm9, 9) << 4)\ntag ← GetAllocationTag(Xt)\nmemory[address] ← memory[address] with tag set to tag"
    },
    {
      "mnemonic": "stz2g",
      "architecture": "ARMv8-A",
      "full_name": "Store Allocation Tag and Zero (Two Granules)",
      "summary": "Stores Tag and zeros memory for two granules.",
      "syntax": "STZ2G <Xt|SP>, [<Xn|SP>, #<simm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "11011001 | 11 | 1 | imm9 | 10 | Xn | Xt",
        "hex_opcode": "0xD9E00800",
        "visual_parts": [
          {
            "raw": "11011001",
            "clean": "11011001"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm9",
            "clean": "imm9"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xt",
            "clean": "Xt"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Source Tag"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "simm",
          "desc": "Signed immediate offset"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Stores the Allocation Tag from Xt to two consecutive 16-byte memory granules and zeros both granules. The offset is scaled by 16. Useful for initializing memory with a specific tag. No condition flags are affected. AArch64-only; requires MTE extension.",
      "example": "STZ2G Xt, [x1, #-8]",
      "pseudocode": "address ← Xn + (SignExtend(imm9, 9) << 4)\ntag ← GetAllocationTag(Xt)\nmemory[address : address + 15] ← 0 with tag set to tag\nmemory[address + 16 : address + 31] ← 0 with tag set to tag"
    },
    {
      "mnemonic": "subps",
      "architecture": "ARMv8-A",
      "full_name": "Subtract Pointers, Setting Flags",
      "summary": "Subtracts pointers (ignoring tags) and sets condition flags.",
      "syntax": "SUBPS <Xd>, <Xn|SP>, <Xm|SP>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 0 | 1 | 11010110 | Xm | 000000 | Xn | Xd",
        "hex_opcode": "0xBAC00000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Xm",
            "clean": "Xm"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Xn",
            "clean": "Xn"
          },
          {
            "raw": "Xd",
            "clean": "Xd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "Addr 1"
        },
        {
          "name": "Xm",
          "desc": "Addr 2"
        }
      ],
      "extension": "MTE (Memory Tagging)",
      "description": "Subtracts the second source pointer from the first, ignoring memory tag bits in both operands, and updates the N, Z, C, and V condition flags based on the 64-bit result. The tagged address bits are excluded from the arithmetic so the comparison reflects only the pointer value. Available when the Memory Tagging Extension (MTE) is implemented.",
      "example": "SUBPS x0, x1, x2",
      "pseudocode": "Xd ← Xn - Xm\n// Flags affected: N, Z, C, V"
    },
    {
      "mnemonic": "cas",
      "architecture": "ARMv8-A",
      "full_name": "Compare and Swap Word",
      "summary": "Atomic Compare and Swap (32-bit).",
      "syntax": "CAS <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 0010001 | 0 | 1 | Rs | 0 | 11111 | Rn | Rt",
        "hex_opcode": "0x88A07C00",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0010001",
            "clean": "0010001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Compare"
        },
        {
          "name": "Wt",
          "desc": "Swap"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic compare and swap of a 32-bit word. Compares the value in Ws with the memory location at address Xn; if equal, stores Wt to that location and loads the old memory value into Ws; otherwise loads the memory value into Ws. This is an AArch64-only instruction requiring LSE extension support. The instruction does not modify condition flags; it provides full sequential consistency without explicit acquire/release semantics.",
      "example": "CAS w6, w3, [x1]",
      "pseudocode": "address ← Xn; old_value ← [address]; if Ws == old_value then [address] ← Wt; Ws ← old_value; else Ws ← old_value;"
    },
    {
      "mnemonic": "cas",
      "architecture": "ARMv8-A",
      "full_name": "Compare and Swap Doubleword",
      "summary": "Atomic Compare and Swap (64-bit).",
      "syntax": "CAS <Xs>, <Xt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "11 | 0010001 | 0 | 1 | Rs | 0 | 11111 | Rn | Rt",
        "hex_opcode": "0xC8A07C00",
        "visual_parts": [
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0010001",
            "clean": "0010001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xs",
          "desc": "Compare"
        },
        {
          "name": "Xt",
          "desc": "Swap"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic compare and swap of a 64-bit doubleword. Compares the value in Xs with the memory location at address Xn; if equal, stores Xt to that location and loads the old memory value into Xs; otherwise loads the memory value into Xs. This is an AArch64-only instruction requiring LSE extension support. The instruction does not modify condition flags; it provides full sequential consistency without explicit acquire/release semantics.",
      "example": "CAS x6, x3, [x1]",
      "pseudocode": "address ← Xn; old_value ← [address]; if Xs == old_value then [address] ← Xt; Xs ← old_value; else Xs ← old_value;"
    },
    {
      "mnemonic": "casa",
      "architecture": "ARMv8-A",
      "full_name": "Compare and Swap Word (Acquire)",
      "summary": "Atomic CAS with Acquire semantics.",
      "syntax": "CASA <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 0010001 | 1 | 1 | Rs | 0 | 11111 | Rn | Rt",
        "hex_opcode": "0x88E07C00",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0010001",
            "clean": "0010001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Compare"
        },
        {
          "name": "Wt",
          "desc": "Swap"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic compare and swap of a 32-bit word with acquire semantics. Compares Ws with memory at address Xn; if equal, stores Wt and loads old value into Ws; otherwise loads the memory value into Ws. This AArch64-only LSE instruction provides an acquire barrier for load operations, preventing subsequent memory operations from being observed before this load completes. Condition flags are not affected.",
      "example": "CASA w6, w3, [x1]",
      "pseudocode": "address ← Xn; AcquireSemantics(); old_value ← [address]; if Ws == old_value then [address] ← Wt; Ws ← old_value; else Ws ← old_value;"
    },
    {
      "mnemonic": "casl",
      "architecture": "ARMv8-A",
      "full_name": "Compare and Swap Word (Release)",
      "summary": "Atomic CAS with Release semantics.",
      "syntax": "CASL <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 0010001 | 0 | 1 | Rs | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x88A0FC00",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0010001",
            "clean": "0010001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Compare"
        },
        {
          "name": "Wt",
          "desc": "Swap"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic compare and swap of a 32-bit word with release semantics. Compares Ws with memory at address Xn; if equal, stores Wt and loads old value into Ws; otherwise loads the memory value into Ws. This AArch64-only LSE instruction provides a release barrier for store operations, ensuring all prior memory operations complete before this store is observed. Condition flags are not affected.",
      "example": "CASL w6, w3, [x1]",
      "pseudocode": "address ← Xn; ReleaseSemantics(); old_value ← [address]; if Ws == old_value then [address] ← Wt; Ws ← old_value; else Ws ← old_value;"
    },
    {
      "mnemonic": "casal",
      "architecture": "ARMv8-A",
      "full_name": "Compare and Swap Word (Acquire-Release)",
      "summary": "Atomic CAS with Acquire and Release semantics.",
      "syntax": "CASAL <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 0010001 | 1 | 1 | Rs | 1 | 11111 | Rn | Rt",
        "hex_opcode": "0x88E0FC00",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0010001",
            "clean": "0010001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Compare"
        },
        {
          "name": "Wt",
          "desc": "Swap"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic compare and swap of a 32-bit word with acquire-release semantics. Compares Ws with memory at address Xn; if equal, stores Wt and loads old value into Ws; otherwise loads the memory value into Ws. This AArch64-only LSE instruction provides both acquire and release barriers, making it a full sequential consistency point for synchronization. Condition flags are not affected.",
      "example": "CASAL w6, w3, [x1]",
      "pseudocode": "address ← Xn; AcquireReleaseSemantics(); old_value ← [address]; if Ws == old_value then [address] ← Wt; Ws ← old_value; else Ws ← old_value;"
    },
    {
      "mnemonic": "casp",
      "architecture": "ARMv8-A",
      "full_name": "Compare and Swap Pair",
      "summary": "Atomic CAS of a pair of registers (128-bit or 64-bit pair).",
      "syntax": "CASP <Ws>, <W(s+1)>, <Wt>, <W(t+1)>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "0 | 1 | 0010000 | 0 | 1 | Rs | 0 | 11111 | Rn | Rt",
        "hex_opcode": "0x48207C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0010000",
            "clean": "0010000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Cmp 1"
        },
        {
          "name": "Wt",
          "desc": "Swap 1"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic compare and swap of a register pair (32-bit pair: 64 bits total, or 64-bit pair: 128 bits total depending on size variant). Compares the pair (Ws, W(s+1)) with memory; if equal, stores (Wt, W(t+1)) and loads old values back; otherwise loads the memory values. This AArch64-only LSE instruction requires even-numbered registers and provides full sequential consistency. Condition flags are not affected. Register numbers must be even and consecutive.",
      "example": "CASP w6, W(s+1), w3, W(t+1), [x1]",
      "pseudocode": "address ← Xn; old_value_pair ← [address]; if (Ws, W(s+1)) == old_value_pair then [address] ← (Wt, W(t+1)); (Ws, W(s+1)) ← old_value_pair; else (Ws, W(s+1)) ← old_value_pair;"
    },
    {
      "mnemonic": "swp",
      "architecture": "ARMv8-A",
      "full_name": "Swap Word",
      "summary": "Atomic swap of a word.",
      "syntax": "SWP <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 1 | 000 | 00 | Rn | Rt",
        "hex_opcode": "0xB8208000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Shift amount 32-bit register"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic swap of a 32-bit word. Atomically exchanges the value in Ws with the memory location at address Xn, storing Ws to memory and loading the old memory value into Wt. This AArch64-only LSE instruction provides full sequential consistency without explicit acquire/release semantics. Condition flags are not affected.",
      "example": "SWP w6, w3, [x1]",
      "pseudocode": "address ← Xn; old_value ← [address]; [address] ← Ws; Wt ← old_value;"
    },
    {
      "mnemonic": "ldadd",
      "architecture": "ARMv8-A",
      "full_name": "Atomic Load-Add Word",
      "summary": "Atomic add to memory, return old value.",
      "syntax": "LDADD <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 0 | 000 | 00 | Rn | Rt",
        "hex_opcode": "0xB8200000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Value"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic load-add of a 32-bit word. Atomically adds Ws to the memory location at address Xn and loads the original memory value into Wt. The sum is stored to memory; the original value (before the addition) is returned. This AArch64-only LSE instruction provides full sequential consistency without explicit acquire/release semantics. Condition flags are not affected.",
      "example": "LDADD w6, w3, [x1]",
      "pseudocode": "address ← Xn; old_value ← [address]; [address] ← old_value + Ws; Wt ← old_value;"
    },
    {
      "mnemonic": "ldclr",
      "architecture": "ARMv8-A",
      "full_name": "Atomic Load-Clear Word",
      "summary": "Atomic bit clear (AND NOT) to memory.",
      "syntax": "LDCLR <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 0 | 001 | 00 | Rn | Rt",
        "hex_opcode": "0xB8201000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Value"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic Load-Clear Word atomically loads a 32-bit value from memory, performs a bitwise AND with the complement of Ws (clearing specified bits), stores the result back, and returns the original loaded value in Wt. This is an AArch64-only instruction requiring LSE extension support. No condition flags are affected; this instruction provides release semantics for memory ordering.",
      "example": "LDCLR w6, w3, [x1]",
      "pseudocode": "address ← Xn\noriginal_value ← [address]\nnew_value ← original_value AND NOT(Ws)\n[address] ← new_value\nWt ← original_value\nMemory ordering: Release semantics applied"
    },
    {
      "mnemonic": "ldeor",
      "architecture": "ARMv8-A",
      "full_name": "Atomic Load-Exclusive OR Word",
      "summary": "Atomic XOR to memory.",
      "syntax": "LDEOR <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 0 | 010 | 00 | Rn | Rt",
        "hex_opcode": "0xB8202000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Value"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic Load-Exclusive OR Word atomically loads a 32-bit value from memory, performs a bitwise XOR with Ws, stores the result back, and returns the original loaded value in Wt. This is an AArch64-only instruction requiring LSE extension support. No condition flags are affected; this instruction provides release semantics for memory ordering.",
      "example": "LDEOR w6, w3, [x1]",
      "pseudocode": "address ← Xn\noriginal_value ← [address]\nnew_value ← original_value XOR Ws\n[address] ← new_value\nWt ← original_value\nMemory ordering: Release semantics applied"
    },
    {
      "mnemonic": "ldset",
      "architecture": "ARMv8-A",
      "full_name": "Atomic Load-Set Word",
      "summary": "Atomic bit set (OR) to memory.",
      "syntax": "LDSET <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 0 | 011 | 00 | Rn | Rt",
        "hex_opcode": "0xB8203000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Value"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic Load-Set Word atomically loads a 32-bit value from memory, performs a bitwise OR with Ws (setting specified bits), stores the result back, and returns the original loaded value in Wt. This is an AArch64-only instruction requiring LSE extension support. No condition flags are affected; this instruction provides release semantics for memory ordering.",
      "example": "LDSET w6, w3, [x1]",
      "pseudocode": "address ← Xn\noriginal_value ← [address]\nnew_value ← original_value OR Ws\n[address] ← new_value\nWt ← original_value\nMemory ordering: Release semantics applied"
    },
    {
      "mnemonic": "ldsmax",
      "architecture": "ARMv8-A",
      "full_name": "Atomic Load-Signed Maximum Word",
      "summary": "Atomic signed max to memory.",
      "syntax": "LDSMAX <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 0 | 100 | 00 | Rn | Rt",
        "hex_opcode": "0xB8204000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Value"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic Load-Signed Maximum Word atomically loads a 32-bit signed value from memory, computes the signed maximum of the loaded value and Ws, stores the result back, and returns the original loaded value in Wt. This is an AArch64-only instruction requiring LSE extension support. No condition flags are affected; this instruction provides release semantics for memory ordering.",
      "example": "LDSMAX w6, w3, [x1]",
      "pseudocode": "address ← Xn\noriginal_value ← [address]\nnew_value ← SignedMax(original_value, Ws)\n[address] ← new_value\nWt ← original_value\nMemory ordering: Release semantics applied"
    },
    {
      "mnemonic": "ldsmin",
      "architecture": "ARMv8-A",
      "full_name": "Atomic Load-Signed Minimum Word",
      "summary": "Atomic signed min to memory.",
      "syntax": "LDSMIN <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 0 | 101 | 00 | Rn | Rt",
        "hex_opcode": "0xB8205000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Value"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic Load-Signed Minimum Word atomically loads a 32-bit signed value from memory, computes the signed minimum of the loaded value and Ws, stores the result back, and returns the original loaded value in Wt. This is an AArch64-only instruction requiring LSE extension support. No condition flags are affected; this instruction provides release semantics for memory ordering.",
      "example": "LDSMIN w6, w3, [x1]",
      "pseudocode": "address ← Xn\noriginal_value ← [address]\nnew_value ← SignedMin(original_value, Ws)\n[address] ← new_value\nWt ← original_value\nMemory ordering: Release semantics applied"
    },
    {
      "mnemonic": "ldumax",
      "architecture": "ARMv8-A",
      "full_name": "Atomic Load-Unsigned Maximum Word",
      "summary": "Atomic unsigned max to memory.",
      "syntax": "LDUMAX <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 0 | 110 | 00 | Rn | Rt",
        "hex_opcode": "0xB8206000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Value"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic Load-Unsigned Maximum Word atomically loads a 32-bit unsigned value from memory, computes the unsigned maximum of the loaded value and Ws, stores the result back, and returns the original loaded value in Wt. This is an AArch64-only instruction requiring LSE extension support. No condition flags are affected; this instruction provides release semantics for memory ordering.",
      "example": "LDUMAX w6, w3, [x1]",
      "pseudocode": "address ← Xn\noriginal_value ← [address]\nnew_value ← UnsignedMax(original_value, Ws)\n[address] ← new_value\nWt ← original_value\nMemory ordering: Release semantics applied"
    },
    {
      "mnemonic": "ldumin",
      "architecture": "ARMv8-A",
      "full_name": "Atomic Load-Unsigned Minimum Word",
      "summary": "Atomic unsigned min to memory.",
      "syntax": "LDUMIN <Ws>, <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "10 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 0 | 111 | 00 | Rn | Rt",
        "hex_opcode": "0xB8207000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Value"
        },
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Atomic Load-Unsigned Minimum Word atomically loads a 32-bit unsigned value from memory, computes the unsigned minimum of the loaded value and Ws, stores the result back, and returns the original loaded value in Wt. This is an AArch64-only instruction requiring LSE extension support. No condition flags are affected; this instruction provides release semantics for memory ordering.",
      "example": "LDUMIN w6, w3, [x1]",
      "pseudocode": "address ← Xn\noriginal_value ← [address]\nnew_value ← UnsignedMin(original_value, Ws)\n[address] ← new_value\nWt ← original_value\nMemory ordering: Release semantics applied"
    },
    {
      "mnemonic": "tstart",
      "architecture": "ARMv8-A",
      "full_name": "Transaction Start",
      "summary": "Starts a memory transaction. Returns 0 if successful.",
      "syntax": "TSTART <Xd>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100100 | 011 | 0011 | 0000 | 011 | Rt",
        "hex_opcode": "0xD5233060",
        "visual_parts": [
          {
            "raw": "1101010100100",
            "clean": "1101010100100"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        }
      ],
      "extension": "TME (Transactional)",
      "description": "Transaction Start initiates a memory transaction and stores a status value in Xd; a return value of 0 indicates successful transaction start, while non-zero indicates transaction failure or nesting restriction. This is an AArch64-only instruction requiring TME (Transactional Memory Extension) support and must execute at EL0 or higher. No condition flags are affected; the instruction may cause transaction abort exceptions.",
      "example": "TSTART x0",
      "pseudocode": "status ← AttemptTransactionStart()\nXd ← status\nif status == 0 then\n  EnterTransactionMode()\nelse\n  Transaction not started, handle abort reason in status value\nendif"
    },
    {
      "mnemonic": "tcommit",
      "architecture": "ARMv8-A",
      "full_name": "Transaction Commit",
      "summary": "Commits the current transaction.",
      "syntax": "TCOMMIT",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101000000110011 | 0000 | 011 | 11111",
        "hex_opcode": "0xD503307F",
        "visual_parts": [
          {
            "raw": "11010101000000110011",
            "clean": "11010101000000110011"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "TME (Transactional)",
      "description": "Commits the current transactional region and exits transactional execution. If the transaction is successful, execution continues at the next instruction with all transactional memory updates committed atomically. If the transaction fails, execution aborts to the TSTART instruction and the failure reason is recorded. No condition flags are affected. AArch64-only; requires TME extension.",
      "example": "TCOMMIT",
      "pseudocode": "if PSTATE.TME == TRUE then\n  Commit the current transaction\n  if transaction fails then\n    ABORT_TRANSACTION\n  else\n    Continue to next instruction\nelse\n  UNDEFINED"
    },
    {
      "mnemonic": "ttest",
      "architecture": "ARMv8-A",
      "full_name": "Transaction Test",
      "summary": "Tests the transaction nesting depth.",
      "syntax": "TTEST <Xd>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100100 | 011 | 0011 | 0001 | 011 | Rt",
        "hex_opcode": "0xD5233160",
        "visual_parts": [
          {
            "raw": "1101010100100",
            "clean": "1101010100100"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        }
      ],
      "extension": "TME (Transactional)",
      "description": "Reads the current transaction nesting depth and state into a 64-bit register. The lower bits contain the nesting depth (0 if not in a transaction), and bits 31:0 contain transaction state information including the failure reason if a prior transaction aborted. No condition flags are affected. AArch64-only; requires TME extension.",
      "example": "TTEST x0",
      "pseudocode": "Xd ← TME_NESTING_DEPTH\nXd[31:0] ← TME_STATE_AND_FAILURE_INFO\nXd[63:32] ← 0"
    },
    {
      "mnemonic": "nop",
      "architecture": "ARMv8-A",
      "full_name": "No Operation",
      "summary": "Does nothing. Used for padding or timing.",
      "syntax": "NOP",
      "encoding": {
        "format": "System Alias",
        "binary_pattern": "11010101000000110010 | 0000 | 000 | 11111",
        "hex_opcode": "0xD503201F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "Base",
      "description": "Performs no operation and does not affect any processor state. NOP is an alias for HINT with immediate 0. No condition flags are affected. Execution state: AArch64-only.",
      "example": "NOP",
      "pseudocode": "# No operation performed\nPC ← PC + 4"
    },
    {
      "mnemonic": "wfe",
      "architecture": "ARMv8-A",
      "full_name": "Wait For Event",
      "summary": "Puts the processor into a low-power state until an event occurs.",
      "syntax": "WFE",
      "encoding": {
        "format": "System Alias",
        "binary_pattern": "11010101000000110010 | 0000 | 010 | 11111",
        "hex_opcode": "0xD503205F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "Base",
      "description": "Puts the processor core into a low-power wait state until a wakeup event occurs (SEV, SEVL, or external interrupt). Execution resumes transparently at the next instruction. No condition flags are affected. Execution state: AArch64-only.",
      "example": "WFE",
      "pseudocode": "# Enter low-power state\nwhile (no_event_pending) do\n  wait_for_event\nPC ← PC + 4"
    },
    {
      "mnemonic": "wfi",
      "architecture": "ARMv8-A",
      "full_name": "Wait For Interrupt",
      "summary": "Puts the processor into a low-power state until an interrupt occurs.",
      "syntax": "WFI",
      "encoding": {
        "format": "System Alias",
        "binary_pattern": "11010101000000110010 | 0000 | 011 | 11111",
        "hex_opcode": "0xD503207F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "Base",
      "description": "Puts the processor core into a low-power wait state until an interrupt occurs. Execution resumes transparently at the next instruction after the interrupt is serviced. No condition flags are affected. Execution state: AArch64-only.",
      "example": "WFI",
      "pseudocode": "# Enter low-power state\nwhile (no_interrupt_pending) do\n  wait_for_interrupt\nPC ← PC + 4"
    },
    {
      "mnemonic": "sev",
      "architecture": "ARMv8-A",
      "full_name": "Send Event",
      "summary": "Sends an event to all processors in the cluster (wakes up WFE).",
      "syntax": "SEV",
      "encoding": {
        "format": "System Alias",
        "binary_pattern": "11010101000000110010 | 0000 | 100 | 11111",
        "hex_opcode": "0xD503209F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "Base",
      "description": "Sends an event signal to all processor cores in the system cluster, waking any cores that are waiting in WFE. No condition flags are affected. Execution state: AArch64-only.",
      "example": "SEV",
      "pseudocode": "# Broadcast event to all cores in cluster\nBROADCAST_EVENT_TO_ALL_CORES\nPC ← PC + 4"
    },
    {
      "mnemonic": "sevl",
      "architecture": "ARMv8-A",
      "full_name": "Send Event Local",
      "summary": "Sends an event locally to the executing processor.",
      "syntax": "SEVL",
      "encoding": {
        "format": "System Alias",
        "binary_pattern": "11010101000000110010 | 0000 | 101 | 11111",
        "hex_opcode": "0xD50320BF",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "Base",
      "description": "Sends an event signal locally to only the executing processor core, setting its local event flag so that the next WFE will not block. No condition flags are affected. Execution state: AArch64-only.",
      "example": "SEVL",
      "pseudocode": "# Set local event flag\nLOCAL_EVENT_FLAG ← 1\nPC ← PC + 4"
    },
    {
      "mnemonic": "yield",
      "architecture": "ARMv8-A",
      "full_name": "Yield",
      "summary": "Hints that the current thread is performing a spin-wait loop.",
      "syntax": "YIELD",
      "encoding": {
        "format": "System Alias",
        "binary_pattern": "11010101000000110010 | 0000 | 001 | 11111",
        "hex_opcode": "0xD503203F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "Base",
      "description": "Provides a hint to the processor that the current thread is executing a spin-wait loop and suggests yielding execution time to other threads. This is a performance hint with no architectural side effects. No condition flags are affected. Execution state: AArch64-only.",
      "example": "YIELD",
      "pseudocode": "# Hint: current thread is spin-waiting\nHINT_YIELD_EXECUTION_TIME\nPC ← PC + 4"
    },
    {
      "mnemonic": "esb",
      "architecture": "ARMv8-A",
      "full_name": "Error Synchronization Barrier",
      "summary": "Synchronizes unrecoverable system errors.",
      "syntax": "ESB",
      "encoding": {
        "format": "System Alias",
        "binary_pattern": "11010101000000110010 | 0010 | 000 | 11111",
        "hex_opcode": "0xD503221F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "RAS (Reliability)",
      "description": "Error Synchronization Barrier synchronizes unrecoverable system errors by ensuring that all error conditions are visible to the PE before proceeding. This is a system-level instruction that provides a point of synchronization for RAS (Reliability, Availability, Serviceability) error handling. No condition flags are affected. AArch64-only; requires EL1 or higher privilege.",
      "example": "ESB",
      "pseudocode": "SynchronizeErrors()"
    },
    {
      "mnemonic": "psb",
      "architecture": "ARMv8-A",
      "full_name": "Profiling Synchronization Barrier",
      "summary": "Synchronizes the statistical profiling unit.",
      "syntax": "PSB CSYNC",
      "encoding": {
        "format": "System Alias",
        "binary_pattern": "11010101000000110010 | 0010 | 001 | 11111",
        "hex_opcode": "0xD503223F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "Profiling",
      "description": "Profiling Synchronization Barrier (PSB CSYNC) ensures that all prior profiling events are synchronized and visible to the statistical profiling unit. This instruction provides a point of synchronization for performance monitoring and trace streams. No condition flags are affected. AArch64-only; available when profiling extensions are implemented.",
      "example": "PSB CSYNC",
      "pseudocode": "ProfileSynchronize()"
    },
    {
      "mnemonic": "dc",
      "architecture": "ARMv8-A",
      "full_name": "Data Cache Operation",
      "summary": "Performs data cache maintenance (Clean, Invalidate, Flush).",
      "syntax": "DC <op>, <Xt>",
      "encoding": {
        "format": "System Alias",
        "binary_pattern": "1101010100 | 0 | 01 | op1 | 0111 | CRm | op2 | Rt",
        "hex_opcode": "0xD5087000",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "op",
          "desc": "Operation (IVAC, ISW, etc)"
        },
        {
          "name": "Xt",
          "desc": "Address/Set/Way"
        }
      ],
      "extension": "System",
      "description": "Data Cache Operation performs maintenance on the data cache, including invalidate, clean, and flush operations on cache lines. The operation type and target address/set/way are specified by the op and Xt operands. This instruction affects the cache hierarchy and may cause memory barriers; no condition flags are modified. AArch64-only; may require EL1 or higher depending on the operation.",
      "example": "DC op, x3",
      "pseudocode": "CacheMaintenance(op, address ← Xt); // Operation type determined by op, affecting DC_VAU, DC_IVAC, DC_ISW, etc."
    },
    {
      "mnemonic": "ic",
      "architecture": "ARMv8-A",
      "full_name": "Instruction Cache Operation",
      "summary": "Performs instruction cache maintenance.",
      "syntax": "IC <op> {, <Xt>}",
      "encoding": {
        "format": "System Alias",
        "binary_pattern": "1101010100 | 0 | 01 | op1 | 0111 | CRm | op2 | Rt",
        "hex_opcode": "0xD5087000",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "op",
          "desc": "Operation (IALLU, IVAU)"
        },
        {
          "name": "Xt",
          "desc": "Address (Optional)"
        }
      ],
      "extension": "System",
      "description": "Instruction Cache Operation performs maintenance on the instruction cache, including invalidation and synchronization of instruction streams. The operation type is specified by op, and Xt provides the target address (optional for some operations). No condition flags are affected. AArch64-only; may require EL1 or higher depending on the operation.",
      "example": "IC op",
      "pseudocode": "ICacheMaintenance(op, address ← Xt); // Operation type determined by op, affecting IC_IALLU, IC_IVAU, IC_IALLUIS"
    },
    {
      "mnemonic": "tlbi",
      "architecture": "ARMv8-A",
      "full_name": "TLB Invalidate",
      "summary": "Invalidates Translation Lookaside Buffer entries.",
      "syntax": "TLBI <op> {, <Xt>}",
      "encoding": {
        "format": "System Alias",
        "binary_pattern": "1101010100 | 0 | 01 | op1 | CRn | CRm | op2 | Rt",
        "hex_opcode": "0xD5088000",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "CRn",
            "clean": "CRn"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "op",
          "desc": "Operation (VMALLE1, VAE1)"
        },
        {
          "name": "Xt",
          "desc": "Address (Optional)"
        }
      ],
      "extension": "System",
      "description": "TLB Invalidate invalidates one or more entries in the Translation Lookaside Buffer to ensure MMU coherency after page table modifications. The operation specifies the scope (single address, all, broadcast, etc.) and Xt provides the target address when applicable. No condition flags are affected. AArch64-only; requires EL1 or higher privilege and typically triggers ISB for completion.",
      "example": "TLBI op",
      "pseudocode": "TLBInvalidate(op, address ← Xt); // Operation type determined by op, affecting VMALLE1, VAE1, VAAE1, VALE1, etc."
    },
    {
      "mnemonic": "at",
      "architecture": "ARMv8-A",
      "full_name": "Address Translate",
      "summary": "Translates a virtual address to a physical address (for debug/software).",
      "syntax": "AT <op>, <Xt>",
      "encoding": {
        "format": "System Alias",
        "binary_pattern": "1101010100 | 0 | 01 | op1 | 0111 | CRm | op2 | Rt",
        "hex_opcode": "0xD5087800",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "op1",
            "clean": "op1"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Virtual Addr"
        }
      ],
      "extension": "System",
      "description": "Address Translate translates a virtual address in Xt to its physical address and system attributes, writing the result to PAR_EL1 for debug and software inspection. The operation specifies the translation regime and access mode (S1E1R, S1E0W, S1E2R, etc.). No condition flags are affected. AArch64-only; requires appropriate EL privilege for the translation regime.",
      "example": "AT op, x3",
      "pseudocode": "paResult ← TranslateAddress(op, virtAddr ← Xt); // Result written to PAR_EL1; op determines EL and access mode"
    },
    {
      "mnemonic": "cbz",
      "architecture": "ARMv8-A",
      "full_name": "Compare and Branch Zero (Thumb)",
      "summary": "Branches to label if register is zero (Thumb-only, does not affect flags).",
      "syntax": "CBZ <Rn>, <label>",
      "encoding": {
        "format": "Thumb Branch",
        "binary_pattern": "1011 | 0 | 0 | i | 1 | imm5 | Rn",
        "hex_opcode": "0xB100",
        "visual_parts": [
          {
            "raw": "1011",
            "clean": "1011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "i",
            "clean": "i"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "15:12 | 11 | 10 | 9 | 8 | 7:3 | 2:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "Register"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Compares the value in Rn with zero and branches to the label if equal. The branch offset is encoded as an unsigned 6-bit immediate (i and imm5 combined, shifted left by 1 to form a 7-bit address offset). This instruction is T32 (Thumb)-only and does not affect condition flags. If the branch is not taken, execution continues sequentially.",
      "example": "CBZ r1, label",
      "pseudocode": "if Rn == 0 then PC ← PC + (i:imm5:0 << 1) else PC ← PC + 2"
    },
    {
      "mnemonic": "cbnz",
      "architecture": "ARMv8-A",
      "full_name": "Compare and Branch Non-Zero (Thumb)",
      "summary": "Branches to label if register is not zero (Thumb-only).",
      "syntax": "CBNZ <Rn>, <label>",
      "encoding": {
        "format": "Thumb Branch",
        "binary_pattern": "1011 | 1 | 0 | i | 1 | imm5 | Rn",
        "hex_opcode": "0xB900",
        "visual_parts": [
          {
            "raw": "1011",
            "clean": "1011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "i",
            "clean": "i"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "15:12 | 11 | 10 | 9 | 8 | 7:3 | 2:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "Register"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Compares the value in Rn with zero and branches to the label if not equal. The branch offset is encoded as an unsigned 6-bit immediate (i and imm5 combined, shifted left by 1 to form a 7-bit address offset). This instruction is T32 (Thumb)-only and does not affect condition flags. If the branch is not taken, execution continues sequentially.",
      "example": "CBNZ r1, label",
      "pseudocode": "if Rn != 0 then PC ← PC + (i:imm5:0 << 1) else PC ← PC + 2"
    },
    {
      "mnemonic": "it",
      "architecture": "ARMv8-A",
      "full_name": "If-Then (Thumb)",
      "summary": "Makes up to 4 following instructions conditional (Thumb-only).",
      "syntax": "IT{x{y{z}}} <cond>",
      "encoding": {
        "format": "Thumb IT",
        "binary_pattern": "10111111 | firstcond | mask",
        "hex_opcode": "0xBF00",
        "visual_parts": [
          {
            "raw": "10111111",
            "clean": "10111111"
          },
          {
            "raw": "firstcond",
            "clean": "firstcond"
          },
          {
            "raw": "mask",
            "clean": "mask"
          }
        ],
        "bit_positions": "15:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "cond",
          "desc": "Condition"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "If-Then creates an IT block in Thumb mode, making up to 4 following instructions conditionally executed based on the condition code and optional xyz masks. The condition code and mask pattern determine which instructions execute. No condition flags are modified by IT itself; subsequent instructions execute based on the condition. T32-only; not available in AArch64 or A32 modes.",
      "example": "IT}} cond",
      "pseudocode": "itState ← (condition, mask); // Sets IT block state; following 1-4 instructions are conditional based on itState"
    },
    {
      "mnemonic": "tbb",
      "architecture": "ARMv8-A",
      "full_name": "Table Branch Byte",
      "summary": "PC-relative branch using a table of bytes (Switch statements).",
      "syntax": "TBB [<Rn>, <Rm>]",
      "encoding": {
        "format": "Thumb Branch",
        "binary_pattern": "111010001101 | Rn | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 000 | 0 | Rm",
        "hex_opcode": "0xE8D0F000",
        "visual_parts": [
          {
            "raw": "111010001101",
            "clean": "111010001101"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:20 | 19:16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "Table Base"
        },
        {
          "name": "Rm",
          "desc": "Index"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Table Branch Byte performs a PC-relative branch using a single-byte lookup table indexed by Rm. The branch offset is calculated as 2 × [Rn + Rm], enabling efficient switch statement implementations. No condition flags are affected. T32-only; updates PC implicitly to the target address.",
      "example": "TBB [r1, r2]",
      "pseudocode": "index ← Rm; offset ← 2 × [Rn + index]; PC ← PC + offset + 4"
    },
    {
      "mnemonic": "tbh",
      "architecture": "ARMv8-A",
      "full_name": "Table Branch Halfword",
      "summary": "PC-relative branch using a table of halfwords.",
      "syntax": "TBH [<Rn>, <Rm>, LSL #1]",
      "encoding": {
        "format": "Thumb Branch",
        "binary_pattern": "111010001101 | Rn | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 000 | 1 | Rm",
        "hex_opcode": "0xE8D0F010",
        "visual_parts": [
          {
            "raw": "111010001101",
            "clean": "111010001101"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:20 | 19:16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "Table Base"
        },
        {
          "name": "Rm",
          "desc": "Index"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Loads a halfword from memory at the address computed as the sum of Rn and twice Rm, then branches to PC + 4 + (2 × halfword value). This instruction is used for efficient switch-statement jumps. No condition flags are affected. T32-only instruction; generates an exception if executed in AArch64 or A32.",
      "example": "TBH [r1, r2, LSL #1]",
      "pseudocode": "address ← Rn + (Rm << 1)\ntable_entry ← ZeroExtend([address], 16)\nPC ← PC + 4 + (table_entry << 1)"
    },
    {
      "mnemonic": "qadd",
      "architecture": "ARMv8-A",
      "full_name": "Saturating Add (A32)",
      "summary": "Adds two values and saturates the result.",
      "syntax": "QADD<c> <Rd>, <Rm>, <Rn>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00010 | 00 | 0 | Rn | Rd | 0 | 0 | 0 | 0 | 0101 | Rm",
        "hex_opcode": "0x01000050",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Sat)",
      "description": "Adds Rm to Rn and saturates the result; the saturated sum is placed in Rd. If overflow occurs (signed arithmetic), the result is saturated to 0x7FFFFFFF (positive overflow) or 0x80000000 (negative overflow). This instruction is A32-only, is conditional (respects condition code suffix), and does not affect condition flags. Requires ARMv5TE or later.",
      "example": "QADD r0, r2, r1",
      "pseudocode": "result ← Rn + Rm; if SignedOverflow(result) then Rd ← Saturate(result) else Rd ← result"
    },
    {
      "mnemonic": "qsub",
      "architecture": "ARMv8-A",
      "full_name": "Saturating Subtract (A32)",
      "summary": "Subtracts two values and saturates the result.",
      "syntax": "QSUB<c> <Rd>, <Rm>, <Rn>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00010 | 01 | 0 | Rn | Rd | 0 | 0 | 0 | 0 | 0101 | Rm",
        "hex_opcode": "0x01200050",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Sat)",
      "description": "Subtracts Rm from Rn and saturates the result; the saturated difference is placed in Rd. If overflow occurs (signed arithmetic), the result is saturated to 0x7FFFFFFF (positive overflow) or 0x80000000 (negative overflow). This instruction is A32-only, is conditional (respects condition code suffix), and does not affect condition flags. Requires ARMv5TE or later.",
      "example": "QSUB r0, r2, r1",
      "pseudocode": "result ← Rn - Rm; if SignedOverflow(result) then Rd ← Saturate(result) else Rd ← result"
    },
    {
      "mnemonic": "qdadd",
      "architecture": "ARMv8-A",
      "full_name": "Saturating Double and Add",
      "summary": "Doubles the second operand, adds to first, and saturates.",
      "syntax": "QDADD<c> <Rd>, <Rm>, <Rn>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00010 | 10 | 0 | Rn | Rd | 0 | 0 | 0 | 0 | 0101 | Rm",
        "hex_opcode": "0x01400050",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Sat)",
      "description": "Saturates the doubling of Rm, then adds the result to Rn with saturation, writing the saturated sum to Rd. The Q flag is set if saturation occurred during either the doubling or addition; other flags are unaffected. A32-only instruction requiring the Saturating Arithmetic extension; must be executed in privileged mode for certain CPSR modifications.",
      "example": "QDADD r0, r2, r1",
      "pseudocode": "doubled ← SignedSat(Rm << 1, 32)\nresult ← SignedSat(Rn + doubled, 32)\nRd ← result\nif (overflow during doubling or addition) then Q ← 1"
    },
    {
      "mnemonic": "qdsub",
      "architecture": "ARMv8-A",
      "full_name": "Saturating Double and Subtract",
      "summary": "Doubles the second operand, subtracts from first, and saturates.",
      "syntax": "QDSUB<c> <Rd>, <Rm>, <Rn>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00010 | 11 | 0 | Rn | Rd | 0 | 0 | 0 | 0 | 0101 | Rm",
        "hex_opcode": "0x01600050",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Sat)",
      "description": "Saturates the doubling of Rm, then subtracts the result from Rn with saturation, writing the saturated difference to Rd. The Q flag is set if saturation occurred during either the doubling or subtraction; other flags are unaffected. A32-only instruction requiring the Saturating Arithmetic extension; must be executed in privileged mode for certain CPSR modifications.",
      "example": "QDSUB r0, r2, r1",
      "pseudocode": "doubled ← SignedSat(Rm << 1, 32)\nresult ← SignedSat(Rn - doubled, 32)\nRd ← result\nif (overflow during doubling or subtraction) then Q ← 1"
    },
    {
      "mnemonic": "pld",
      "architecture": "ARMv8-A",
      "full_name": "Preload Data",
      "summary": "Hints memory system to bring data into cache.",
      "syntax": "PLD [<Rn>, #<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "1111010 | 1 | U | 1 | 01 | Rn | 1 | 1 | 1 | 1 | imm12",
        "hex_opcode": "0xF550F000",
        "visual_parts": [
          {
            "raw": "1111010",
            "clean": "1111010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (System)",
      "description": "Hints to the memory system that data at the address Rn + imm should be preloaded into the cache hierarchy. No registers are modified and no exception is raised if the address is invalid; the instruction is purely advisory. No flags are affected. A32-only instruction; generates no architectural effect but may improve performance.",
      "example": "PLD [r1, #16]",
      "pseudocode": "address ← Rn + imm12\n// Preload hint sent to memory system; no registers modified"
    },
    {
      "mnemonic": "pli",
      "architecture": "ARMv8-A",
      "full_name": "Preload Instruction",
      "summary": "Hints memory system to bring instructions into cache.",
      "syntax": "PLI [<Rn>, #<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "1111010 | 0 | U | 1 | 01 | Rn | 1 | 1 | 1 | 1 | imm12",
        "hex_opcode": "0xF450F000",
        "visual_parts": [
          {
            "raw": "1111010",
            "clean": "1111010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (System)",
      "description": "Hints to the memory system that instruction code at the address Rn + imm should be preloaded into the instruction cache. No registers are modified and no exception is raised if the address is invalid; the instruction is purely advisory. No flags are affected. A32-only instruction; generates no architectural effect but may improve performance by prefetching code.",
      "example": "PLI [r1, #16]",
      "pseudocode": "address ← Rn + imm12\n// Preload hint for instruction cache sent to memory system; no registers modified"
    },
    {
      "mnemonic": "srs",
      "architecture": "ARMv8-A",
      "full_name": "Store Return State",
      "summary": "Stores LR and SPSR to the stack of a specific mode.",
      "syntax": "SRS<c> SP{!}, #<mode>",
      "encoding": {
        "format": "System",
        "binary_pattern": "11111000 | P | U | 1 | W | 0 | 1101 | 00000 | mode",
        "hex_opcode": "0xF8CD0500",
        "visual_parts": [
          {
            "raw": "11111000",
            "clean": "11111000"
          },
          {
            "raw": "P",
            "clean": "P"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "W",
            "clean": "W"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "mode",
            "clean": "mode"
          }
        ]
      },
      "operands": [
        {
          "name": "mode",
          "desc": "Mode"
        }
      ],
      "extension": "A32 (System)",
      "description": "Stores the Link Register (LR) and Saved Program Status Register (SPSR) of the current mode to the stack pointer of a specified processor mode. If write-back is enabled, the SP of the specified mode is updated. Requires privileged execution (not User mode). A32-only system instruction; no condition flags are modified and exception generation may occur if the target mode is invalid.",
      "example": "SRS SP!, #ia",
      "pseudocode": "target_sp ← SPOfMode(mode)\nif (P == 0) then address ← target_sp\nelse address ← target_sp - 8\nif (U == 1) then address ← target_sp + offset else address ← target_sp - offset\n[address] ← LR\n[address + 4] ← SPSR\nif (W == 1) then SPOfMode(mode) ← address + 8 else SPOfMode(mode) ← address"
    },
    {
      "mnemonic": "rfe",
      "architecture": "ARMv8-A",
      "full_name": "Return From Exception",
      "summary": "Loads PC and CPSR from the stack.",
      "syntax": "RFE<c> <Rn>{!}",
      "encoding": {
        "format": "System",
        "binary_pattern": "1111100 | 0 | 0 | 0 | W | 1 | Rn | 00001010000 | 00000",
        "hex_opcode": "0xF8100A00",
        "visual_parts": [
          {
            "raw": "1111100",
            "clean": "1111100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "W",
            "clean": "W"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "00001010000",
            "clean": "00001010000"
          },
          {
            "raw": "00000",
            "clean": "00000"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:5 | 4:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (System)",
      "description": "Restores the Program Counter and CPSR from a pair of words stored on the stack indicated by Rn. If write-back is enabled, Rn is updated to point past the loaded values. This instruction is used to return from exceptions and perform mode changes. Requires privileged execution. A32-only system instruction; the PC is restored and CPSR is updated, potentially changing processor mode and interrupt masks.",
      "example": "RFE r1!",
      "pseudocode": "if (P == 0) then address ← Rn\nelse address ← Rn - 8\nif (U == 1) then\n  new_pc ← [address]\n  new_cpsr ← [address + 4]\n  if (W == 1) then Rn ← Rn + 8\nelse\n  new_pc ← [address]\n  new_cpsr ← [address + 4]\n  if (W == 1) then Rn ← Rn - 8\nPC ← new_pc\nCPSR ← new_cpsr"
    },
    {
      "mnemonic": "cps",
      "architecture": "ARMv8-A",
      "full_name": "Change Processor State",
      "summary": "Changes the processor mode or interrupt masks.",
      "syntax": "CPS<effect> <iflags> {, #<mode>}",
      "encoding": {
        "format": "System",
        "binary_pattern": "111100010000 | 00 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | A | I | F | 0 | mode",
        "hex_opcode": "0xF1020000",
        "visual_parts": [
          {
            "raw": "111100010000",
            "clean": "111100010000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "A",
            "clean": "A"
          },
          {
            "raw": "I",
            "clean": "I"
          },
          {
            "raw": "F",
            "clean": "F"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "mode",
            "clean": "mode"
          }
        ],
        "bit_positions": "31:20 | 19:18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4:0"
      },
      "operands": [
        {
          "name": "effect",
          "desc": "IE/ID"
        },
        {
          "name": "mode",
          "desc": "Mode"
        }
      ],
      "extension": "A32 (System)",
      "description": "Changes the processor mode, interrupt masks (I, F, A flags in CPSR), or both based on the encoded effect (IE=enable or ID=disable) and mode field. Requires privileged execution. A32-only system instruction; modifies CPSR directly and may change interrupt masks and processor mode.",
      "example": "CPSeffect iflags",
      "pseudocode": "if (imod == 0) then // imod encodes IE/ID\n  // No change to interrupt masks\nelse if (imod == 1) then // IE: enable specified interrupts\n  if (m == 1) then CPSR.I ← 0\nelse if (imod == 2) then // ID: disable specified interrupts\n  if (m == 1) then CPSR.I ← 1\nif (m == 1) then // Mode change enabled\n  CPSR.M ← mode"
    },
    {
      "mnemonic": "setend",
      "architecture": "ARMv8-A",
      "full_name": "Set Endianness",
      "summary": "Sets the endianness for data accesses (BE/LE).",
      "syntax": "SETEND <endian>",
      "encoding": {
        "format": "System",
        "binary_pattern": "111100010000 | 00 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | E | 0 | 0 | 0 | 0 | 00000",
        "hex_opcode": "0xF1010000",
        "visual_parts": [
          {
            "raw": "111100010000",
            "clean": "111100010000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "E",
            "clean": "E"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00000",
            "clean": "00000"
          }
        ],
        "bit_positions": "31:20 | 19:18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4:0"
      },
      "operands": [
        {
          "name": "endian",
          "desc": "BE/LE"
        }
      ],
      "extension": "A32 (System)",
      "description": "Sets the endianness mode (big-endian or little-endian) for subsequent data memory accesses in A32 execution state. This instruction modifies the E bit in the CPSR to control whether data is accessed in big-endian (BE) or little-endian (LE) format. No condition flags are affected. This is an A32-only instruction; attempting to execute it in other states may cause unpredictable behavior or generate an exception.",
      "example": "SETEND endian",
      "pseudocode": "if endian == 'BE' then\n  CPSR.E ← 1\nelse if endian == 'LE' then\n  CPSR.E ← 0"
    },
    {
      "mnemonic": "yield",
      "architecture": "ARMv8-A",
      "full_name": "Yield (A32)",
      "summary": "Hints that the task is performing a spin-wait.",
      "syntax": "YIELD",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "cond | 00110 | 0 | 10 | 00 | 00 | 1 | 1 | 1 | 1 | 000000000001",
        "hex_opcode": "0x0320F001",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000000001",
            "clean": "000000000001"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:18 | 17:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [],
      "extension": "A32 (Base)",
      "description": "Provides a hint to the processor that the current task is performing a spin-wait loop and may yield to other tasks. This instruction does not change any register or memory state but allows the processor to optimize power consumption or task scheduling. No condition flags are affected. This is an A32-only hint instruction.",
      "example": "YIELD",
      "pseudocode": "Hint(YIELD)"
    },
    {
      "mnemonic": "wfe",
      "architecture": "ARMv8-A",
      "full_name": "Wait For Event (A32)",
      "summary": "Enters low-power state until an event occurs.",
      "syntax": "WFE",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "cond | 00110 | 0 | 10 | 00 | 00 | 1 | 1 | 1 | 1 | 000000000010",
        "hex_opcode": "0x0320F002",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000000010",
            "clean": "000000000010"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:18 | 17:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [],
      "extension": "A32 (Base)",
      "description": "Suspends execution and transitions the processor to a low-power state until an event occurs (signaled by another processor's SEV instruction or an external event). The processor may exit the wait state before an event actually occurs due to implementation-specific reasons. No condition flags are affected. This is an A32-only hint instruction.",
      "example": "WFE",
      "pseudocode": "Wait for event; if event is signaled or implementation permits exit, resume execution"
    },
    {
      "mnemonic": "wfi",
      "architecture": "ARMv8-A",
      "full_name": "Wait For Interrupt (A32)",
      "summary": "Enters low-power state until an interrupt occurs.",
      "syntax": "WFI",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "cond | 00110 | 0 | 10 | 00 | 00 | 1 | 1 | 1 | 1 | 000000000011",
        "hex_opcode": "0x0320F003",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000000011",
            "clean": "000000000011"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:18 | 17:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [],
      "extension": "A32 (Base)",
      "description": "Suspends execution and transitions the processor to a low-power state until an interrupt is pending. The processor will resume execution when an interrupt is taken or becomes pending, subject to interrupt masking. No condition flags are affected. This is an A32-only hint instruction and typically requires non-user privilege level.",
      "example": "WFI",
      "pseudocode": "Wait for interrupt; if interrupt is signaled and unmasked, resume execution"
    },
    {
      "mnemonic": "sev",
      "architecture": "ARMv8-A",
      "full_name": "Send Event (A32)",
      "summary": "Sends an event to all processors.",
      "syntax": "SEV",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "cond | 00110 | 0 | 10 | 00 | 00 | 1 | 1 | 1 | 1 | 000000000100",
        "hex_opcode": "0x0320F004",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000000100",
            "clean": "000000000100"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:18 | 17:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [],
      "extension": "A32 (Base)",
      "description": "Sends an event signal to all processors in the system, waking any processors that are in the WFE low-power state. This instruction has no effect on register or memory state but coordinates multi-processor synchronization. No condition flags are affected. This is an A32-only instruction.",
      "example": "SEV",
      "pseudocode": "Send event signal to all processors"
    },
    {
      "mnemonic": "sevl",
      "architecture": "ARMv8-A",
      "full_name": "Send Event Local (A32)",
      "summary": "Sends an event locally.",
      "syntax": "SEVL",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "cond | 00110 | 0 | 10 | 00 | 00 | 1 | 1 | 1 | 1 | 000000000101",
        "hex_opcode": "0x0320F005",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000000101",
            "clean": "000000000101"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:18 | 17:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [],
      "extension": "A32 (Base)",
      "description": "Sends an event signal locally to the current processor only, waking it if it is in the WFE low-power state. Unlike SEV, this does not affect other processors. No register or memory state is changed. No condition flags are affected. This is an A32-only instruction.",
      "example": "SEVL",
      "pseudocode": "Send event signal to local processor"
    },
    {
      "mnemonic": "dbg",
      "architecture": "ARMv8-A",
      "full_name": "Debug Hint",
      "summary": "Provides a hint to the debug system.",
      "syntax": "DBG #<option>",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "cond | 00110 | 0 | 10 | 00 | 00 | 1 | 1 | 1 | 1 | 00001111 | option",
        "hex_opcode": "0x0320F0F0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00001111",
            "clean": "00001111"
          },
          {
            "raw": "option",
            "clean": "option"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:18 | 17:16 | 15 | 14 | 13 | 12 | 11:4 | 3:0"
      },
      "operands": [
        {
          "name": "option",
          "desc": "Option"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Provides a hint to the debug system with an option value (0-15). The option field typically encodes a debug-related hint such as setting a breakpoint or specifying breakpoint type, but the exact behavior is debug-system dependent. No register state or condition flags are modified. This is an A32-only instruction.",
      "example": "DBG #option",
      "pseudocode": "Hint(DEBUG, option)"
    },
    {
      "mnemonic": "hlt",
      "architecture": "ARMv8-A",
      "full_name": "Halting Debug (Thumb)",
      "summary": "Enters halting debug state (Thumb encoding).",
      "syntax": "HLT #<imm>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "1011101010 | imm6",
        "hex_opcode": "0xBA80",
        "visual_parts": [
          {
            "raw": "1011101010",
            "clean": "1011101010"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          }
        ],
        "bit_positions": "15:6 | 5:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Enters halting debug state (T32 encoding). The processor suspends and passes control to the debug system with a halting debug exception. The imm value is an optional 6-bit debugger-supplied breakpoint ID. This is a T32-only instruction; it generates a halting debug exception and does not resume normal execution until the debugger releases it.",
      "example": "HLT #16",
      "pseudocode": "GenerateException(HaltingDebugException); breakpoint_id ← imm"
    },
    {
      "mnemonic": "bkpt",
      "architecture": "ARMv8-A",
      "full_name": "Breakpoint (Thumb)",
      "summary": "Software Breakpoint (Thumb encoding).",
      "syntax": "BKPT #<imm>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "10111110 | imm8",
        "hex_opcode": "0xBE00",
        "visual_parts": [
          {
            "raw": "10111110",
            "clean": "10111110"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "15:8 | 7:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Software Breakpoint (Thumb encoding). This T32 instruction raises a Prefetch Abort exception with the encoded immediate value available to the debugger or exception handler. It is used to halt execution for debugging purposes. No condition flags are affected.",
      "example": "BKPT #16",
      "pseudocode": "PrefetchAbort(imm8)"
    },
    {
      "mnemonic": "svc",
      "architecture": "ARMv8-A",
      "full_name": "Supervisor Call (Thumb)",
      "summary": "System Call (Thumb encoding).",
      "syntax": "SVC #<imm>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "1101111 | 1 | imm8",
        "hex_opcode": "0xDF00",
        "visual_parts": [
          {
            "raw": "1101111",
            "clean": "1101111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "15:9 | 8 | 7:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Supervisor Call (Thumb encoding). This T32 instruction raises a Supervisor Call exception (formerly SWI), transitioning to privileged mode to perform a system service. The immediate value identifies the requested service. No condition flags are affected; execution does not return to the next instruction unless the exception handler explicitly restores context.",
      "example": "SVC #16",
      "pseudocode": "SupervisorCallException(imm8)"
    },
    {
      "mnemonic": "udf",
      "architecture": "ARMv8-A",
      "full_name": "Undefined Instruction",
      "summary": "Permanently undefined instruction (generates Undefined Instruction exception).",
      "syntax": "UDF #<imm>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1110 | 01111111 | imm12 | 1111 | imm4",
        "hex_opcode": "0xE7F000F0",
        "visual_parts": [
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "01111111",
            "clean": "01111111"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          }
        ],
        "bit_positions": "31:28 | 27:20 | 19:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Undefined Instruction (A32 encoding). This A32 instruction is permanently undefined and raises an Undefined Instruction exception when executed. The 16-bit immediate (imm12 and imm4 concatenated) is available to the exception handler but does not affect execution otherwise. No condition flags are affected.",
      "example": "UDF #16",
      "pseudocode": "UndefinedInstructionException(imm12 ∘ imm4)"
    },
    {
      "mnemonic": "udf",
      "architecture": "ARMv8-A",
      "full_name": "Undefined Instruction (Thumb)",
      "summary": "Permanently undefined instruction (Thumb).",
      "syntax": "UDF #<imm>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "1101111 | 0 | imm8",
        "hex_opcode": "0xDE00",
        "visual_parts": [
          {
            "raw": "1101111",
            "clean": "1101111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "15:9 | 8 | 7:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Undefined Instruction (Thumb encoding). This T32 instruction is permanently undefined and raises an Undefined Instruction exception when executed. The 8-bit immediate value is available to the exception handler. No condition flags are affected.",
      "example": "UDF #16",
      "pseudocode": "UndefinedInstructionException(imm8)"
    },
    {
      "mnemonic": "msr",
      "architecture": "ARMv8-A",
      "full_name": "Move to Special Register (Banked)",
      "summary": "Writes to a banked register from a general-purpose register.",
      "syntax": "MSR <banked_reg>, <Rn>",
      "encoding": {
        "format": "System",
        "binary_pattern": "cond | 00010 | R | 1 | 0 | M1 | 1111 | 0 | 0 | 1 | M | 0000 | Rn",
        "hex_opcode": "0x0120F200",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "R",
            "clean": "R"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M1",
            "clean": "M1"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "banked_reg",
          "desc": "Banked"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (System)",
      "description": "Writes the value of a general-purpose register to a banked system register. This instruction is available only in privileged modes (not User mode) and performs a mode-aware write to the specified banked register. No condition flags are affected by this instruction.",
      "example": "MSR banked_reg, r1",
      "pseudocode": "BankedReg[sysm] ← Rn"
    },
    {
      "mnemonic": "mrs",
      "architecture": "ARMv8-A",
      "full_name": "Move from Special Register (Banked)",
      "summary": "Reads a banked register into a general-purpose register.",
      "syntax": "MRS <Rd>, <banked_reg>",
      "encoding": {
        "format": "System",
        "binary_pattern": "cond | 00010 | R | 0 | 0 | M1 | Rd | 0 | 0 | 1 | M | 0000 | 0000",
        "hex_opcode": "0x01000200",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "R",
            "clean": "R"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M1",
            "clean": "M1"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0000",
            "clean": "0000"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "banked_reg",
          "desc": "Banked"
        }
      ],
      "extension": "A32 (System)",
      "description": "Reads the value of a banked system register into a general-purpose register. This instruction is available only in privileged modes (not User mode) and performs a mode-aware read from the specified banked register. No condition flags are affected by this instruction.",
      "example": "MRS r0, banked_reg",
      "pseudocode": "Rd ← BankedReg[sysm]"
    },
    {
      "mnemonic": "vcvtb",
      "architecture": "ARMv8-A",
      "full_name": "Vector Convert Half-Precision (Bottom)",
      "summary": "Converts single-precision to half-precision (Bottom half).",
      "syntax": "VCVTB<c>.F16.F32 <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Convert",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 01 | 0 | Vd | 10 | 1 | 0 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB20A40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:17 | 16 | 15:12 | 11:10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Dest (Half)"
        },
        {
          "name": "Sm",
          "desc": "Src (Single)"
        }
      ],
      "extension": "VFP (Half)",
      "description": "Converts a single-precision floating-point value to half-precision and stores it in the bottom half of the destination single-precision register. The top half of the destination is unchanged. The instruction is conditional and sets VFP flags (FPSCR) according to the conversion result.",
      "example": "VCVTB.F16.F32 s0, s2",
      "pseudocode": "Sd[15:0] ← ConvertToHalf(Sm); Sd[31:16] unchanged"
    },
    {
      "mnemonic": "vcvtt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Convert Half-Precision (Top)",
      "summary": "Converts single-precision to half-precision (Top half).",
      "syntax": "VCVTT<c>.F16.F32 <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Convert",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 01 | 0 | Vd | 10 | 1 | 0 | 1 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB20AC0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:17 | 16 | 15:12 | 11:10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Dest (Half)"
        },
        {
          "name": "Sm",
          "desc": "Src (Single)"
        }
      ],
      "extension": "VFP (Half)",
      "description": "Converts a single-precision floating-point value to half-precision and stores it in the top half of the destination single-precision register. The bottom half of the destination is unchanged. The instruction is conditional and sets VFP flags (FPSCR) according to the conversion result.",
      "example": "VCVTT.F16.F32 s0, s2",
      "pseudocode": "Sd[31:16] ← ConvertToHalf(Sm); Sd[15:0] unchanged"
    },
    {
      "mnemonic": "vsel",
      "architecture": "ARMv8-A",
      "full_name": "Vector Select (Double)",
      "summary": "Selects between two double-precision registers based on flags.",
      "syntax": "VSEL<cond>.F64 <Dd>, <Dn>, <Dm>",
      "encoding": {
        "format": "VFP Misc",
        "binary_pattern": "11111110 | 0 | D | cc | Vn | Vd | 1011 | N | 0 | M | Vm",
        "hex_opcode": "0xFE000B00",
        "visual_parts": [
          {
            "raw": "11111110",
            "clean": "11111110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "cc",
            "clean": "cc"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1011",
            "clean": "1011"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ]
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Select (Double). This VFP instruction selects between two 64-bit floating-point operands (Dn and Dm) based on a condition code (cc) applied to the FPSCR condition flags, writing the selected value to Dd. The condition code determines which register's value is copied. No flags are set or cleared by this instruction.",
      "example": "VSELcond.F64 d0, d1, d2",
      "pseudocode": "if ConditionPassed(cc) then\n  Dd ← Dn\nelse\n  Dd ← Dm"
    },
    {
      "mnemonic": "vmaxnm",
      "architecture": "ARMv8-A",
      "full_name": "Vector Maximum Number (Double)",
      "summary": "Returns larger double-precision value, handling NaNs.",
      "syntax": "VMAXNM<c>.F64 <Dd>, <Dn>, <Dm>",
      "encoding": {
        "format": "VFP Misc",
        "binary_pattern": "111111101 | D | 00 | Vn | Vd | 10 | 11 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xFE800B00",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Maximum Number (Double). This VFP instruction compares two 64-bit floating-point values (Dn and Dm) and writes the larger value to Dd, with special handling for NaN: if one operand is NaN, the other is returned (not NaN). FPSCR exception flags may be set according to the IEEE 754 floating-point standard.",
      "example": "VMAXNM.F64 d0, d1, d2",
      "pseudocode": "if IsNaN(Dn) then\n  Dd ← Dm\nelseif IsNaN(Dm) then\n  Dd ← Dn\nelse if Dn ≥ Dm then\n  Dd ← Dn\nelse\n  Dd ← Dm"
    },
    {
      "mnemonic": "vminnm",
      "architecture": "ARMv8-A",
      "full_name": "Vector Minimum Number (Double)",
      "summary": "Returns smaller double-precision value, handling NaNs.",
      "syntax": "VMINNM<c>.F64 <Dd>, <Dn>, <Dm>",
      "encoding": {
        "format": "VFP Misc",
        "binary_pattern": "111111101 | D | 00 | Vn | Vd | 10 | 11 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xFE800B40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Minimum Number (Double). This VFP instruction compares two 64-bit floating-point values (Dn and Dm) and writes the smaller value to Dd, with special handling for NaN: if one operand is NaN, the other is returned (not NaN). FPSCR exception flags may be set according to the IEEE 754 floating-point standard.",
      "example": "VMINNM.F64 d0, d1, d2",
      "pseudocode": "if IsNaN(Dn) then\n  Dd ← Dm\nelseif IsNaN(Dm) then\n  Dd ← Dn\nelse if Dn ≤ Dm then\n  Dd ← Dn\nelse\n  Dd ← Dm"
    },
    {
      "mnemonic": "vrintr",
      "architecture": "ARMv8-A",
      "full_name": "Vector Round Floating-Point (Current)",
      "summary": "Rounds float to integral float using FPSCR rounding mode.",
      "syntax": "VRINTR<c>.F32 <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Unary",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 110 | Vd | 10 | 10 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB60A40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Vector Round Floating-Point (Current). This VFP instruction rounds the 32-bit floating-point value in Sm to an integral floating-point value using the rounding mode specified in the FPSCR and writes the result to Sd. The rounding mode and exception behavior are controlled by FPSCR flags; inexact exceptions may be signaled.",
      "example": "VRINTR.F32 s0, s2",
      "pseudocode": "rounding_mode ← FPSCR.RMode\nSd ← RoundFP(Sm, rounding_mode)"
    },
    {
      "mnemonic": "vrintx",
      "architecture": "ARMv8-A",
      "full_name": "Vector Round Floating-Point (Exact)",
      "summary": "Rounds float to integral float, raising Inexact exception.",
      "syntax": "VRINTX<c>.F32 <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Unary",
        "binary_pattern": "cond | 11101 | D | 11 | 0 | 111 | Vd | 10 | 10 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB70A40",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Rounds each single-precision floating-point element to the nearest integral value, with round-to-nearest-even semantics. The Inexact exception is raised if the result differs from the input. Condition flags are not affected. This is an A32/T32 VFP instruction requiring the VFP extension.",
      "example": "VRINTX.F32 s0, s2",
      "pseudocode": "for i = 0 to 0 do\n  Sd[i] ← RoundToNearest(Sm[i])\n  if Sd[i] != Sm[i] then\n    FPExc_IXC ← 1\n  end if\nend for"
    },
    {
      "mnemonic": "sha512h",
      "architecture": "ARMv8-A",
      "full_name": "SHA512 Hash Part 1 (A32)",
      "summary": "SHA512 hash update part 1.",
      "syntax": "SHA512H.64 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "Crypto 3-Reg",
        "binary_pattern": "11001110011 | Rm | 1 | 0 | 00 | 00 | Rn | Rd",
        "hex_opcode": "0xCE608000",
        "visual_parts": [
          {
            "raw": "11001110011",
            "clean": "11001110011"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:21 | 20:16 | 15 | 14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "State"
        },
        {
          "name": "Qn",
          "desc": "Hash"
        },
        {
          "name": "Qm",
          "desc": "Data"
        }
      ],
      "extension": "Crypto (SHA512)",
      "description": "Performs the first part of the SHA-512 hash computation, processing hash values and round constants. The operation combines Qn (hash) and Qm (data) values and updates Qd (state) with intermediate results. This is an A32 Advanced SIMD instruction requiring the SHA512 Cryptographic Extension. Condition flags are not affected.",
      "example": "SHA512H.64 q0, q1, q2",
      "pseudocode": "Qd ← SHA512_H_Part1(Qd, Qn, Qm)"
    },
    {
      "mnemonic": "sha512h2",
      "architecture": "ARMv8-A",
      "full_name": "SHA512 Hash Part 2 (A32)",
      "summary": "SHA512 hash update part 2.",
      "syntax": "SHA512H2.64 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "Crypto 3-Reg",
        "binary_pattern": "11001110011 | Rm | 1 | 0 | 00 | 01 | Rn | Rd",
        "hex_opcode": "0xCE608400",
        "visual_parts": [
          {
            "raw": "11001110011",
            "clean": "11001110011"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:21 | 20:16 | 15 | 14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "State"
        },
        {
          "name": "Qn",
          "desc": "Hash"
        },
        {
          "name": "Qm",
          "desc": "Data"
        }
      ],
      "extension": "Crypto (SHA512)",
      "description": "Performs the second part of the SHA-512 hash computation, completing the hash update using state (Qd), hash values (Qn), and message data (Qm). This variant differs from SHA512H in the internal transformation applied. This is an A32 Advanced SIMD instruction requiring the SHA512 Cryptographic Extension. Condition flags are not affected.",
      "example": "SHA512H2.64 q0, q1, q2",
      "pseudocode": "Qd ← SHA512_H_Part2(Qd, Qn, Qm)"
    },
    {
      "mnemonic": "sha512su0",
      "architecture": "ARMv8-A",
      "full_name": "SHA512 Schedule Update 0 (A32)",
      "summary": "SHA512 schedule update instruction 0.",
      "syntax": "SHA512SU0.64 <Qd>, <Qm>",
      "encoding": {
        "format": "Crypto 2-Reg",
        "binary_pattern": "11001110110000001000 | 00 | Rn | Rd",
        "hex_opcode": "0xCEC08000",
        "visual_parts": [
          {
            "raw": "11001110110000001000",
            "clean": "11001110110000001000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "Crypto (SHA512)",
      "description": "Performs the first schedule update operation for SHA-512 message scheduling, processing Qm and updating Qd with the first sigma operation. This is a unary operation used during SHA-512 preprocessing of the message schedule. This is an A32 Advanced SIMD instruction requiring the SHA512 Cryptographic Extension. Condition flags are not affected.",
      "example": "SHA512SU0.64 q0, q2",
      "pseudocode": "Qd ← SHA512_SU_0(Qm)"
    },
    {
      "mnemonic": "sha512su1",
      "architecture": "ARMv8-A",
      "full_name": "SHA512 Schedule Update 1 (A32)",
      "summary": "SHA512 schedule update instruction 1.",
      "syntax": "SHA512SU1.64 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "Crypto 3-Reg",
        "binary_pattern": "11001110011 | Rm | 1 | 0 | 00 | 10 | Rn | Rd",
        "hex_opcode": "0xCE608800",
        "visual_parts": [
          {
            "raw": "11001110011",
            "clean": "11001110011"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:21 | 20:16 | 15 | 14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "Crypto (SHA512)",
      "description": "Performs the second schedule update operation for SHA-512 message scheduling, combining Qd and Qn with Qm to compute the next message schedule value. This operation incorporates previous schedule elements and the second sigma transformation. This is an A32 Advanced SIMD instruction requiring the SHA512 Cryptographic Extension. Condition flags are not affected.",
      "example": "SHA512SU1.64 q0, q1, q2",
      "pseudocode": "Qd ← SHA512_SU_1(Qd, Qn, Qm)"
    },
    {
      "mnemonic": "sm3ss1",
      "architecture": "ARMv8-A",
      "full_name": "SM3 Step 1 (A32)",
      "summary": "SM3 cryptographic hash step 1.",
      "syntax": "SM3SS1.32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "Crypto 3-Reg",
        "binary_pattern": "110011100 | 10 | Rm | 0 | Ra | Rn | Rd",
        "hex_opcode": "0xCE400000",
        "visual_parts": [
          {
            "raw": "110011100",
            "clean": "110011100"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:23 | 22:21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "Crypto (SM3)",
      "description": "Performs step 1 of the SM3 cryptographic hash function, combining three 128-bit operands to produce an intermediate result. The operation implements the SM3 compression function's linear transformation. This is an A32 Advanced SIMD instruction requiring the SM3 Cryptographic Extension. Condition flags are not affected.",
      "example": "SM3SS1.32 q0, q1, q2",
      "pseudocode": "Qd ← SM3_StepSS1(Qn, Qm)"
    },
    {
      "mnemonic": "sm3tt1a",
      "architecture": "ARMv8-A",
      "full_name": "SM3 Step 2A (A32)",
      "summary": "SM3 cryptographic hash step 2A.",
      "syntax": "SM3TT1A.32 <Qd>, <Dn>, <Dm>, #<imm>",
      "encoding": {
        "format": "Crypto Imm",
        "binary_pattern": "11001110010 | Rm | 10 | imm2 | 00 | Rn | Rd",
        "hex_opcode": "0xCE408000",
        "visual_parts": [
          {
            "raw": "11001110010",
            "clean": "11001110010"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:21 | 20:16 | 15:14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        },
        {
          "name": "imm",
          "desc": "Rot"
        }
      ],
      "extension": "Crypto (SM3)",
      "description": "Performs step 2A of the SM3 cryptographic hash, updating 32-bit word elements based on the specified rotation immediate. Operates on 64-bit source registers but stores results in a 128-bit destination. This is an A32 Advanced SIMD instruction requiring the SM3 Cryptographic Extension. Condition flags are not affected.",
      "example": "SM3TT1A.32 q0, d1, d2, #16",
      "pseudocode": "rot ← imm * 8\nQd ← SM3_TT1A(Dn, Dm, rot)"
    },
    {
      "mnemonic": "sm3tt1b",
      "architecture": "ARMv8-A",
      "full_name": "SM3 Step 2B (A32)",
      "summary": "SM3 cryptographic hash step 2B.",
      "syntax": "SM3TT1B.32 <Qd>, <Dn>, <Dm>, #<imm>",
      "encoding": {
        "format": "Crypto Imm",
        "binary_pattern": "11001110010 | Rm | 10 | imm2 | 01 | Rn | Rd",
        "hex_opcode": "0xCE408400",
        "visual_parts": [
          {
            "raw": "11001110010",
            "clean": "11001110010"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:21 | 20:16 | 15:14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        },
        {
          "name": "imm",
          "desc": "Rot"
        }
      ],
      "extension": "Crypto (SM3)",
      "description": "Performs step 2B of the SM3 cryptographic hash, updating 32-bit word elements with a different permutation than SM3TT1A, based on the specified rotation immediate. Operates on 64-bit source registers but stores results in a 128-bit destination. This is an A32 Advanced SIMD instruction requiring the SM3 Cryptographic Extension. Condition flags are not affected.",
      "example": "SM3TT1B.32 q0, d1, d2, #16",
      "pseudocode": "rot ← imm * 8\nQd ← SM3_TT1B(Dn, Dm, rot)"
    },
    {
      "mnemonic": "sm3tt2a",
      "architecture": "ARMv8-A",
      "full_name": "SM3 Step 3A (A32)",
      "summary": "SM3 cryptographic hash step 3A.",
      "syntax": "SM3TT2A.32 <Qd>, <Dn>, <Dm>, #<imm>",
      "encoding": {
        "format": "Crypto Imm",
        "binary_pattern": "11001110010 | Rm | 10 | imm2 | 10 | Rn | Rd",
        "hex_opcode": "0xCE408800",
        "visual_parts": [
          {
            "raw": "11001110010",
            "clean": "11001110010"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:21 | 20:16 | 15:14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        },
        {
          "name": "imm",
          "desc": "Rot"
        }
      ],
      "extension": "Crypto (SM3)",
      "description": "SM3 Step 3A performs part of the SM3 cryptographic hash compression function, processing two 32-bit words from the input with a rotation parameter. This instruction operates on 64-bit source registers and writes a 128-bit result, and does not affect any condition flags. The instruction is A32-only and requires the Crypto SM3 extension; it generates an Undefined Instruction exception if executed without the extension enabled.",
      "example": "SM3TT2A.32 q0, d1, d2, #16",
      "pseudocode": "Qd ← SM3_TT2A(Dn, Dm, imm2)"
    },
    {
      "mnemonic": "sm3tt2b",
      "architecture": "ARMv8-A",
      "full_name": "SM3 Step 3B (A32)",
      "summary": "SM3 cryptographic hash step 3B.",
      "syntax": "SM3TT2B.32 <Qd>, <Dn>, <Dm>, #<imm>",
      "encoding": {
        "format": "Crypto Imm",
        "binary_pattern": "11001110010 | Rm | 10 | imm2 | 11 | Rn | Rd",
        "hex_opcode": "0xCE408C00",
        "visual_parts": [
          {
            "raw": "11001110010",
            "clean": "11001110010"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:21 | 20:16 | 15:14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        },
        {
          "name": "imm",
          "desc": "Rot"
        }
      ],
      "extension": "Crypto (SM3)",
      "description": "SM3 Step 3B performs the second variant of SM3 compression function step 3, processing two 32-bit words with a different constant path than SM3TT2A. This instruction operates on 64-bit source registers and writes a 128-bit result, and does not affect condition flags. The instruction is A32-only and requires the Crypto SM3 extension; it generates an Undefined Instruction exception if executed without the extension enabled.",
      "example": "SM3TT2B.32 q0, d1, d2, #16",
      "pseudocode": "Qd ← SM3_TT2B(Dn, Dm, imm2)"
    },
    {
      "mnemonic": "sm3partw1",
      "architecture": "ARMv8-A",
      "full_name": "SM3 Part Word 1 (A32)",
      "summary": "SM3 schedule update part 1.",
      "syntax": "SM3PARTW1.32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "Crypto 3-Reg",
        "binary_pattern": "11001110011 | Rm | 1 | 1 | 00 | 00 | Rn | Rd",
        "hex_opcode": "0xCE60C000",
        "visual_parts": [
          {
            "raw": "11001110011",
            "clean": "11001110011"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:21 | 20:16 | 15 | 14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "Crypto (SM3)",
      "description": "SM3 Part Word 1 performs the first part of SM3 message schedule update, computing intermediate values from the previous message schedule words. This instruction operates on three 128-bit registers and does not affect condition flags. The instruction is A32-only and requires the Crypto SM3 extension; it generates an Undefined Instruction exception if executed without the extension enabled.",
      "example": "SM3PARTW1.32 q0, q1, q2",
      "pseudocode": "Qd ← SM3_PARTW1(Qn, Qm)"
    },
    {
      "mnemonic": "sm3partw2",
      "architecture": "ARMv8-A",
      "full_name": "SM3 Part Word 2 (A32)",
      "summary": "SM3 schedule update part 2.",
      "syntax": "SM3PARTW2.32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "Crypto 3-Reg",
        "binary_pattern": "11001110011 | Rm | 1 | 1 | 00 | 01 | Rn | Rd",
        "hex_opcode": "0xCE60C400",
        "visual_parts": [
          {
            "raw": "11001110011",
            "clean": "11001110011"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:21 | 20:16 | 15 | 14 | 13:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "Crypto (SM3)",
      "description": "SM3 Part Word 2 performs the second part of SM3 message schedule update, completing the computation of new message schedule words from previous values. This instruction operates on three 128-bit registers and does not affect condition flags. The instruction is A32-only and requires the Crypto SM3 extension; it generates an Undefined Instruction exception if executed without the extension enabled.",
      "example": "SM3PARTW2.32 q0, q1, q2",
      "pseudocode": "Qd ← SM3_PARTW2(Qn, Qm)"
    },
    {
      "mnemonic": "sm4e",
      "architecture": "ARMv8-A",
      "full_name": "SM4 Encrypt (A32)",
      "summary": "SM4 encryption step.",
      "syntax": "SM4E.32 <Qd>, <Qm>",
      "encoding": {
        "format": "Crypto 2-Reg",
        "binary_pattern": "11001110110000001000 | 01 | Rn | Rd",
        "hex_opcode": "0xCEC08400",
        "visual_parts": [
          {
            "raw": "11001110110000001000",
            "clean": "11001110110000001000"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Key"
        }
      ],
      "extension": "Crypto (SM4)",
      "description": "SM4 Encrypt performs one round of SM4 block cipher encryption, transforming a 128-bit state register using a 128-bit round key. This instruction does not affect condition flags. The instruction is A32-only and requires the Crypto SM4 extension; it generates an Undefined Instruction exception if executed without the extension enabled.",
      "example": "SM4E.32 q0, q2",
      "pseudocode": "Qd ← SM4_Encrypt(Qd, Qm)"
    },
    {
      "mnemonic": "sm4ekey",
      "architecture": "ARMv8-A",
      "full_name": "SM4 Key (A32)",
      "summary": "SM4 key schedule step.",
      "syntax": "SM4EKEY.32 <Qd>, <Qm>",
      "encoding": {
        "format": "Crypto 2-Reg",
        "binary_pattern": "01000101 | 0 | 0 | 1 | Zm | 11110 | 0 | Zn | Zd",
        "hex_opcode": "0x4520F000",
        "visual_parts": [
          {
            "raw": "01000101",
            "clean": "01000101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Key"
        }
      ],
      "extension": "Crypto (SM4)",
      "description": "SM4 Key performs one round of SM4 key schedule expansion, computing a derived key from the previous key material. This instruction does not affect condition flags. The instruction is A32-only and requires the Crypto SM4 extension; it generates an Undefined Instruction exception if executed without the extension enabled.",
      "example": "SM4EKEY.32 q0, q2",
      "pseudocode": "Qd ← SM4_KeySchedule(Qd, Qm)"
    },
    {
      "mnemonic": "ldaexb",
      "architecture": "ARMv8-A",
      "full_name": "Load Acquire Exclusive Byte (A32)",
      "summary": "Loads a byte, acquires semantics, marks exclusive.",
      "syntax": "LDAEXB<c> <Rt>, [<Rn>]",
      "encoding": {
        "format": "Load Excl",
        "binary_pattern": "cond | 00011 | 10 | 1 | Rn | Rt | 1 | 1 | 1 | 0 | 1001 | 1111",
        "hex_opcode": "0x01D00E9F",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Loads a byte from memory at the address in Rn with Acquire semantics and marks the location as exclusive. The loaded byte is zero-extended and placed in Rt. Acquire semantics ensure that subsequent memory operations are not reordered before this load. No condition flags are affected.",
      "example": "LDAEXB r3, [r1]",
      "pseudocode": "Rt ← ZeroExtend([Rn], 8); ExclusiveLocal ← TRUE; Acquire()"
    },
    {
      "mnemonic": "ldaexh",
      "architecture": "ARMv8-A",
      "full_name": "Load Acquire Exclusive Halfword (A32)",
      "summary": "Loads a halfword, acquires semantics, marks exclusive.",
      "syntax": "LDAEXH<c> <Rt>, [<Rn>]",
      "encoding": {
        "format": "Load Excl",
        "binary_pattern": "cond | 00011 | 11 | 1 | Rn | Rt | 1 | 1 | 1 | 0 | 1001 | 1111",
        "hex_opcode": "0x01F00E9F",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Loads a halfword from memory at the address in Rn with Acquire semantics and marks the location as exclusive. The loaded halfword is zero-extended and placed in Rt. Acquire semantics ensure that subsequent memory operations are not reordered before this load. No condition flags are affected.",
      "example": "LDAEXH r3, [r1]",
      "pseudocode": "Rt ← ZeroExtend([Rn], 16); ExclusiveLocal ← TRUE; Acquire()"
    },
    {
      "mnemonic": "ldaexd",
      "architecture": "ARMv8-A",
      "full_name": "Load Acquire Exclusive Double (A32)",
      "summary": "Loads a doubleword, acquires semantics, marks exclusive.",
      "syntax": "LDAEXD<c> <Rt>, <Rt2>, [<Rn>]",
      "encoding": {
        "format": "Load Excl",
        "binary_pattern": "cond | 00011 | 01 | 1 | Rn | Rt | 1 | 1 | 1 | 0 | 1001 | 1111",
        "hex_opcode": "0x01B00E9F",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Dest 1"
        },
        {
          "name": "Rt2",
          "desc": "Dest 2"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Loads a doubleword (64 bits) from memory at the address in Rn with Acquire semantics and marks the location as exclusive. The lower 32 bits are placed in Rt and the upper 32 bits in Rt2. Acquire semantics ensure that subsequent memory operations are not reordered before this load. No condition flags are affected.",
      "example": "LDAEXD r3, r4, [r1]",
      "pseudocode": "Rt ← [Rn]; Rt2 ← [Rn+4]; ExclusiveLocal ← TRUE; Acquire()"
    },
    {
      "mnemonic": "stlexb",
      "architecture": "ARMv8-A",
      "full_name": "Store Release Exclusive Byte (A32)",
      "summary": "Stores a byte with Release semantics if exclusive.",
      "syntax": "STLEXB<c> <Rd>, <Rt>, [<Rn>]",
      "encoding": {
        "format": "Store Excl",
        "binary_pattern": "cond | 00011 | 10 | 0 | Rn | Rd | 1 | 1 | 1 | 0 | 1001 | Rt",
        "hex_opcode": "0x01C00E90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Status"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Attempts to store a byte to memory at the address in Rn with Release semantics if the location is marked exclusive. The result of the store attempt (0 for success, 1 for failure) is written to Rd. Release semantics ensure that preceding memory operations are not reordered after this store. No condition flags are affected.",
      "example": "STLEXB r0, r3, [r1]",
      "pseudocode": "if ExclusiveLocal then [Rn] ← Rt[7:0]; Rd ← 0; Release(); ExclusiveLocal ← FALSE else Rd ← 1 endif"
    },
    {
      "mnemonic": "stlexh",
      "architecture": "ARMv8-A",
      "full_name": "Store Release Exclusive Halfword (A32)",
      "summary": "Stores a halfword with Release semantics if exclusive.",
      "syntax": "STLEXH<c> <Rd>, <Rt>, [<Rn>]",
      "encoding": {
        "format": "Store Excl",
        "binary_pattern": "cond | 00011 | 11 | 0 | Rn | Rd | 1 | 1 | 1 | 0 | 1001 | Rt",
        "hex_opcode": "0x01E00E90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Status"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Stores a halfword to memory with Release semantics if the exclusive monitor is set for the address. Writes a status value (0=success, 1=failure) to Rd and the value from Rt to the memory location addressed by Rn. This is an exclusive store with memory ordering guarantees. No condition flags are affected. Execution state: A32 only; requires privilege level dependent on the accessed address.",
      "example": "STLEXH r0, r3, [r1]",
      "pseudocode": "if ExclusiveMonitorsPass(address=Rn, size=2) then\n  [Rn] ← Rt[15:0]\n  Rd ← 0\n  ClearExclusiveMonitors()\nelse\n  Rd ← 1"
    },
    {
      "mnemonic": "stlexd",
      "architecture": "ARMv8-A",
      "full_name": "Store Release Exclusive Double (A32)",
      "summary": "Stores a doubleword with Release semantics if exclusive.",
      "syntax": "STLEXD<c> <Rd>, <Rt>, <Rt2>, [<Rn>]",
      "encoding": {
        "format": "Store Excl",
        "binary_pattern": "cond | 00011 | 01 | 0 | Rn | Rd | 1 | 1 | 1 | 0 | 1001 | Rt",
        "hex_opcode": "0x01A00E90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Status"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rt2",
          "desc": "Second transfer register (load/store pair)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Stores a doubleword (64-bit value) to memory with Release semantics if the exclusive monitor is set for the address. The value is loaded from the register pair [Rt, Rt2], and a status is written to Rd (0=success, 1=failure). This is an exclusive store with full Release memory ordering. No condition flags are affected. Execution state: A32 only; Rt must be even-numbered and Rt2=Rt+1.",
      "example": "STLEXD r0, r3, r4, [r1]",
      "pseudocode": "if ExclusiveMonitorsPass(address=Rn, size=8) then\n  [Rn] ← Rt\n  [Rn+4] ← Rt2\n  Rd ← 0\n  ClearExclusiveMonitors()\nelse\n  Rd ← 1"
    },
    {
      "mnemonic": "vcadd",
      "architecture": "ARMv8-A",
      "full_name": "Vector Complex Add (A32)",
      "summary": "Complex integer addition with rotation (NEON).",
      "syntax": "VCADD<c>.I<size> <Qd>, <Qn>, <Qm>, #<rot>",
      "encoding": {
        "format": "NEON Complex",
        "binary_pattern": "1111110 | rot | 1 | D | 0 | S | Vn | Vd | 1 | 0 | 0 | 0 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xFC800840",
        "visual_parts": [
          {
            "raw": "1111110",
            "clean": "1111110"
          },
          {
            "raw": "rot",
            "clean": "rot"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "rot",
          "desc": "Rot"
        }
      ],
      "extension": "NEON (Complex)",
      "description": "Performs complex addition on pairs of elements within 128-bit SIMD registers, treating each pair as a complex number (real, imaginary), with rotation applied before addition. The rotation is either 90° or 270° as specified by rot. Operates on 32-bit or 64-bit element pairs. NEON extension; no condition flags affected.",
      "example": "VCADD.Isize q0, q1, q2, #rot",
      "pseudocode": "rotation_angle ← if rot == 0 then 90 else 270\nfor i = 0 to elements_per_128bit_register/2 - 1 do\n  real_n ← Qn[2*i]\n  imag_n ← Qn[2*i+1]\n  real_m ← Qm[2*i]\n  imag_m ← Qm[2*i+1]\n  rotated_real ← rotate(real_m, imag_m, rotation_angle).real\n  rotated_imag ← rotate(real_m, imag_m, rotation_angle).imag\n  Qd[2*i] ← real_n + rotated_real\n  Qd[2*i+1] ← imag_n + rotated_imag"
    },
    {
      "mnemonic": "vcmla",
      "architecture": "ARMv8-A",
      "full_name": "Vector Complex Multiply Accumulate (A32)",
      "summary": "Complex integer multiply-accumulate with rotation.",
      "syntax": "VCMLA<c>.I<size> <Qd>, <Qn>, <Qm>, #<rot>",
      "encoding": {
        "format": "NEON Complex",
        "binary_pattern": "1111110 | rot | D | 1 | S | Vn | Vd | 1 | 0 | 0 | 0 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xFC200840",
        "visual_parts": [
          {
            "raw": "1111110",
            "clean": "1111110"
          },
          {
            "raw": "rot",
            "clean": "rot"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "rot",
          "desc": "Rot"
        }
      ],
      "extension": "NEON (Complex)",
      "description": "Vector Complex Multiply-Accumulate performs complex multiplication of two vectors with a specified rotation (0°, 90°, 180°, or 270°) and accumulates the result into the destination register, operating on 32-bit or 64-bit integer elements. This instruction does not affect condition flags. The instruction is A32-only and requires the NEON Complex extension; it generates an Undefined Instruction exception if executed without the extension enabled.",
      "example": "VCMLA.Isize q0, q1, q2, #rot",
      "pseudocode": "for i = 0 to (128 / esize) - 1 do\n  real_part = Qn[2*i] * Qm[2*i] - Qn[2*i+1] * Qm[2*i+1]\n  imag_part = Qn[2*i] * Qm[2*i+1] + Qn[2*i+1] * Qm[2*i]\n  (real_part, imag_part) = RotateByRot(real_part, imag_part, rot)\n  Qd[2*i] = Qd[2*i] + real_part\n  Qd[2*i+1] = Qd[2*i+1] + imag_part"
    },
    {
      "mnemonic": "vdot",
      "architecture": "ARMv8-A",
      "full_name": "Vector BFloat16 Dot Product (A32)",
      "summary": "BFloat16 dot product to float32 accumulator.",
      "syntax": "VDOT<c>.BF16 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON BFloat16",
        "binary_pattern": "1111110 | 00 | D | 00 | Vn | Vd | 1 | 1 | 0 | 1 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xFC000D40",
        "visual_parts": [
          {
            "raw": "1111110",
            "clean": "1111110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24:23 | 22 | 21:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (BFloat16)",
      "description": "Vector BFloat16 Dot Product computes the dot product of two vectors of BFloat16 (brain floating-point 16-bit) values and accumulates the result as a 32-bit floating-point value in the destination. This instruction does not affect condition flags. The instruction is A32-only and requires the NEON BFloat16 extension; it generates an Undefined Instruction exception if executed without the extension enabled.",
      "example": "VDOT.BF16 q0, q1, q2",
      "pseudocode": "for i = 0 to 3 do\n  acc = 0.0\n  for j = 0 to 1 do\n    bf16_a = Qn[4*i + 2*j : 4*i + 2*j + 1]\n    bf16_b = Qm[4*i + 2*j : 4*i + 2*j + 1]\n    acc = acc + BF16_to_FP32(bf16_a) * BF16_to_FP32(bf16_b)\n  Qd[i] = Qd[i] + acc"
    },
    {
      "mnemonic": "vbfmmla",
      "architecture": "ARMv8-A",
      "full_name": "Vector BFloat16 Matrix Multiply (A32)",
      "summary": "BFloat16 matrix multiply-accumulate.",
      "syntax": "VBFMMLA<c>.BF16 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON BFloat16",
        "binary_pattern": "11111100 | 0 | 0 | 11 | Vn | Vd | 1100 | N | Q | M | 1 | Vm",
        "hex_opcode": "0xFC000C40",
        "visual_parts": [
          {
            "raw": "11111100",
            "clean": "11111100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ]
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (BFloat16)",
      "description": "Multiplies two 128-bit SIMD registers containing BFloat16 (16-bit brain floating-point) elements in 2×2 matrix format and accumulates the result into the destination register. Each 2×2 matrix multiplication processes four BFloat16 values, producing single-precision results that are accumulated. Condition flags (N, Z, C, V) are unaffected. This instruction requires the NEON BFloat16 extension and executes in A32 (ARM) instruction set only.",
      "example": "VBFMMLA.BF16 q0, q1, q2",
      "pseudocode": "for i = 0 to 3 do\n  // Extract 2x2 BF16 matrix from Qn\n  matrix_a[0] = BF16_to_F32(Qn[i*2*16 + 0:15])\n  matrix_a[1] = BF16_to_F32(Qn[i*2*16 + 16:31])\n  matrix_a[2] = BF16_to_F32(Qn[i*2*16 + 32:47])\n  matrix_a[3] = BF16_to_F32(Qn[i*2*16 + 48:63])\n  // Extract 2x2 BF16 matrix from Qm\n  matrix_b[0] = BF16_to_F32(Qm[i*2*16 + 0:15])\n  matrix_b[1] = BF16_to_F32(Qm[i*2*16 + 16:31])\n  matrix_b[2] = BF16_to_F32(Qm[i*2*16 + 32:47])\n  matrix_b[3] = BF16_to_F32(Qm[i*2*16 + 48:63])\n  // Multiply and accumulate\n  Qd[i*32 + 0:31] = Qd[i*32 + 0:31] + matrix_a[0] * matrix_b[0] + matrix_a[1] * matrix_b[2]\n  Qd[i*32 + 32:63] = Qd[i*32 + 32:63] + matrix_a[2] * matrix_b[0] + matrix_a[3] * matrix_b[2]"
    },
    {
      "mnemonic": "vbfcvt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Convert BFloat16 (A32)",
      "summary": "Converts Float32 to BFloat16.",
      "syntax": "VBFCVT<c>.BF16.F32 <Qd>, <Qm>",
      "encoding": {
        "format": "NEON BFloat16",
        "binary_pattern": "11110011 | 1 | D | 11 | 01 | 10 | Vd | 00110 | Q | M | 0 | Vm",
        "hex_opcode": "0xF3B60640",
        "visual_parts": [
          {
            "raw": "11110011",
            "clean": "11110011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ]
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (BFloat16)",
      "description": "Converts 128-bit SIMD register containing single-precision floating-point elements to BFloat16 (16-bit brain floating-point) format by rounding the mantissa to 7 bits and preserving the sign and exponent. The result is stored as 64 BFloat16 elements in the destination 128-bit register. Condition flags are unaffected. This instruction requires the NEON BFloat16 extension and executes in A32 (ARM) instruction set only.",
      "example": "VBFCVT.BF16.F32 q0, q2",
      "pseudocode": "for i = 0 to 3 do\n  f32_val = Qm[i*32 + 0:31]\n  bf16_val = F32_to_BF16(f32_val)\n  Qd[i*16 + 0:15] = bf16_val"
    },
    {
      "mnemonic": "vusdot",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unsigned-Signed Dot Product (A32)",
      "summary": "Dot product of unsigned (src1) and signed (src2) bytes.",
      "syntax": "VUSDOT<c>.S8 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON DotProd",
        "binary_pattern": "1111110 | 01 | D | 10 | Vn | Vd | 1 | 1 | 0 | 1 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xFCA00D40",
        "visual_parts": [
          {
            "raw": "1111110",
            "clean": "1111110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24:23 | 22 | 21:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "Unsigned"
        },
        {
          "name": "Qm",
          "desc": "Signed"
        }
      ],
      "extension": "NEON (DotProd)",
      "description": "Computes the dot product of unsigned 8-bit integers from Qn and signed 8-bit integers from Qm, accumulating four dot products (one per 32-bit lane) into the corresponding 32-bit signed integer elements of Qd. Each lane multiplies and sums four pairs of unsigned×signed bytes. Condition flags are unaffected. This instruction requires the NEON DotProd extension and executes in A32 (ARM) instruction set only.",
      "example": "VUSDOT.S8 q0, q1, q2",
      "pseudocode": "for i = 0 to 3 do\n  acc = Qd[i*32 + 0:31]\n  for j = 0 to 3 do\n    unsigned_byte = ZeroExtend(Qn[(i*4 + j)*8 + 0:7])\n    signed_byte = SignExtend(Qm[(i*4 + j)*8 + 0:7])\n    acc = acc + (unsigned_byte * signed_byte)\n  Qd[i*32 + 0:31] = acc"
    },
    {
      "mnemonic": "vsmmla",
      "architecture": "ARMv8-A",
      "full_name": "Vector Signed Int8 Matrix Multiply (A32)",
      "summary": "Matrix multiply-accumulate (Signed Int8).",
      "syntax": "VSMMLA<c>.S8 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON MatMul",
        "binary_pattern": "1111110 | 0 | 0 | D | 10 | Vn | Vd | 1 | 1 | 0 | 0 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xFC200C40",
        "visual_parts": [
          {
            "raw": "1111110",
            "clean": "1111110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (MatMul)",
      "description": "Multiplies two 128-bit SIMD registers containing signed 8-bit integer elements in 4×4 matrix format and accumulates the result into the destination register as signed 32-bit integers. Processes four 4×4 matrices, each producing four 32-bit signed results that are added to Qd. Condition flags are unaffected. This instruction requires the NEON MatMul extension and executes in A32 (ARM) instruction set only.",
      "example": "VSMMLA.S8 q0, q1, q2",
      "pseudocode": "for i = 0 to 3 do\n  // Extract 4x4 S8 matrix from Qn\n  for r = 0 to 3 do\n    for c = 0 to 3 do\n      matrix_a[r][c] = SignExtend(Qn[(i*16 + r*4 + c)*8 + 0:7])\n  // Extract 4x4 S8 matrix from Qm\n  for r = 0 to 3 do\n    for c = 0 to 3 do\n      matrix_b[r][c] = SignExtend(Qm[(i*16 + r*4 + c)*8 + 0:7])\n  // Multiply and accumulate\n  for r = 0 to 3 do\n    result = Qd[(i*4 + r)*32 + 0:31]\n    for k = 0 to 3 do\n      result = result + matrix_a[r][k] * matrix_b[k][r]\n    Qd[(i*4 + r)*32 + 0:31] = result"
    },
    {
      "mnemonic": "vusmmla",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unsigned-Signed Matrix Multiply (A32)",
      "summary": "Matrix multiply-accumulate (Unsigned x Signed Int8).",
      "syntax": "VUSMMLA<c>.S8 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON MatMul",
        "binary_pattern": "1111110 | 0 | 1 | D | 10 | Vn | Vd | 1 | 1 | 0 | 0 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xFCA00C40",
        "visual_parts": [
          {
            "raw": "1111110",
            "clean": "1111110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "Unsigned"
        },
        {
          "name": "Qm",
          "desc": "Signed"
        }
      ],
      "extension": "NEON (MatMul)",
      "description": "Multiplies two 128-bit SIMD registers containing unsigned 8-bit integers from Qn and signed 8-bit integers from Qm in 4×4 matrix format and accumulates the result into the destination register as signed 32-bit integers. Processes four 4×4 matrices, each producing four 32-bit signed results. Condition flags are unaffected. This instruction requires the NEON MatMul extension and executes in A32 (ARM) instruction set only.",
      "example": "VUSMMLA.S8 q0, q1, q2",
      "pseudocode": "for i = 0 to 3 do\n  // Extract 4x4 U8 matrix from Qn\n  for r = 0 to 3 do\n    for c = 0 to 3 do\n      matrix_a[r][c] = ZeroExtend(Qn[(i*16 + r*4 + c)*8 + 0:7])\n  // Extract 4x4 S8 matrix from Qm\n  for r = 0 to 3 do\n    for c = 0 to 3 do\n      matrix_b[r][c] = SignExtend(Qm[(i*16 + r*4 + c)*8 + 0:7])\n  // Multiply and accumulate\n  for r = 0 to 3 do\n    result = Qd[(i*4 + r)*32 + 0:31]\n    for k = 0 to 3 do\n      result = result + matrix_a[r][k] * matrix_b[k][r]\n    Qd[(i*4 + r)*32 + 0:31] = result"
    },
    {
      "mnemonic": "vummla",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unsigned Matrix Multiply (A32)",
      "summary": "Matrix multiply-accumulate (Unsigned Int8).",
      "syntax": "VUMMLA<c>.U8 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON MatMul",
        "binary_pattern": "1111110 | 0 | 0 | D | 10 | Vn | Vd | 1 | 1 | 0 | 0 | N | 1 | M | 1 | Vm",
        "hex_opcode": "0xFC200C50",
        "visual_parts": [
          {
            "raw": "1111110",
            "clean": "1111110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (MatMul)",
      "description": "Multiplies two 128-bit SIMD registers containing unsigned 8-bit integer elements in 4×4 matrix format and accumulates the result into the destination register as unsigned 32-bit integers. Processes four 4×4 matrices, each producing four 32-bit unsigned results that are added to Qd. Condition flags are unaffected. This instruction requires the NEON MatMul extension and executes in A32 (ARM) instruction set only.",
      "example": "VUMMLA.U8 q0, q1, q2",
      "pseudocode": "for i = 0 to 3 do\n  // Extract 4x4 U8 matrix from Qn\n  for r = 0 to 3 do\n    for c = 0 to 3 do\n      matrix_a[r][c] = ZeroExtend(Qn[(i*16 + r*4 + c)*8 + 0:7])\n  // Extract 4x4 U8 matrix from Qm\n  for r = 0 to 3 do\n    for c = 0 to 3 do\n      matrix_b[r][c] = ZeroExtend(Qm[(i*16 + r*4 + c)*8 + 0:7])\n  // Multiply and accumulate\n  for r = 0 to 3 do\n    result = Qd[(i*4 + r)*32 + 0:31]\n    for k = 0 to 3 do\n      result = result + matrix_a[r][k] * matrix_b[k][r]\n    Qd[(i*4 + r)*32 + 0:31] = result"
    },
    {
      "mnemonic": "vjcvt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Javascript Convert (A32)",
      "summary": "Converts double to signed 32-bit integer (JS semantics).",
      "syntax": "VJCVT<c>.S32.F64 <Sd>, <Dm>",
      "encoding": {
        "format": "VFP Convert",
        "binary_pattern": "cond | 11101 | D | 11 | 1 | 001 | Vd | 10 | 11 | 1 | 1 | M | 0 | Vm",
        "hex_opcode": "0x0EB90BC0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (JS)",
      "description": "Converts a 64-bit double-precision floating-point value to a signed 32-bit integer using JavaScript semantics (NaN maps to 0, out-of-range values saturate). The result is stored as a single-precision floating-point value in the destination 32-bit register. Condition flags are unaffected. This instruction requires the VFP JavaScript extension and executes in A32 (ARM) instruction set only.",
      "example": "VJCVT.S32.F64 s0, d2",
      "pseudocode": "f64_val = Dm[0:63]\nif IsNaN(f64_val) then\n  s32_val = 0\nelse if f64_val > 2147483647.0 then\n  s32_val = 2147483647\nelse if f64_val < -2147483648.0 then\n  s32_val = -2147483648\nelse\n  s32_val = RoundTowardsZero(f64_val)\nSd[0:31] = F32(s32_val)"
    },
    {
      "mnemonic": "pldw",
      "architecture": "ARMv8-A",
      "full_name": "Preload Data for Write (A32)",
      "summary": "Hints memory system to bring data into cache for writing.",
      "syntax": "PLDW [<Rn>, #<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "1111010 | 1 | U | 0 | 01 | Rn | 1 | 1 | 1 | 1 | imm12",
        "hex_opcode": "0xF510F000",
        "visual_parts": [
          {
            "raw": "1111010",
            "clean": "1111010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Preloads data for write by hinting the memory system to allocate cache line(s) in an exclusive state at the address computed from the base register and 12-bit immediate offset. This is a hint instruction and does not cause exceptions on address translation or access faults. Condition flags and general-purpose registers are unaffected. This instruction executes in A32 (ARM) instruction set only.",
      "example": "PLDW [r1, #16]",
      "pseudocode": "address = Rn + imm12\n// Hint to memory system to preload for exclusive access (write)\nPreloadDataForWrite(address)"
    },
    {
      "mnemonic": "pldw",
      "architecture": "ARMv8-A",
      "full_name": "Preload Data for Write (Thumb)",
      "summary": "Hints memory system to bring data into cache for writing (Thumb).",
      "syntax": "PLDW [<Rn>, #<imm>]",
      "encoding": {
        "format": "Thumb Load/Store",
        "binary_pattern": "111110001 | 0 | 1 | 1 | Rn | 1111 | imm12",
        "hex_opcode": "0xF8B0F000",
        "visual_parts": [
          {
            "raw": "111110001",
            "clean": "111110001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "T32 (Thumb2)",
      "description": "Preload Data for Write provides a hint to the memory system to bring a cache line into the cache hierarchy in preparation for a write operation. The instruction does not modify any registers or condition flags and serves only as a performance optimization hint. It is available in Thumb (T32) instruction set and has no architectural side effects if the hint is ignored.",
      "example": "PLDW [r1, #16]",
      "pseudocode": "// Hint to memory system to preload data for write at address [Rn + imm]\n// No architectural effect on registers or flags\nHint_PreloadForWrite(address: Rn + imm)"
    },
    {
      "mnemonic": "sb",
      "architecture": "ARMv8-A",
      "full_name": "Speculation Barrier (A32)",
      "summary": "Prevents speculative execution across the barrier (v8.0).",
      "syntax": "SB",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "111101010111 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0111 | 0000",
        "hex_opcode": "0xF57FF070",
        "visual_parts": [
          {
            "raw": "111101010111",
            "clean": "111101010111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "0000",
            "clean": "0000"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [],
      "extension": "A32 (v8.0)",
      "description": "Speculation Barrier (v8.0) prevents speculative execution from crossing the barrier in either direction, creating a serialization point for instruction execution. This instruction acts as a full execution barrier that completes all prior instructions before allowing subsequent instructions to execute speculatively. Available in A32 instruction set; does not modify condition flags.",
      "example": "SB",
      "pseudocode": "// Serialize execution; prevent speculative execution across this point\nSpeculationBarrier()\n// All prior instructions complete before any subsequent instruction executes speculatively"
    },
    {
      "mnemonic": "ssbb",
      "architecture": "ARMv8-A",
      "full_name": "Speculative Store Bypass Barrier (A32)",
      "summary": "Prevents speculative loads bypassing earlier stores (v8.0).",
      "syntax": "SSBB",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "111101010111 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0100 | 0000",
        "hex_opcode": "0xF57FF040",
        "visual_parts": [
          {
            "raw": "111101010111",
            "clean": "111101010111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "0000",
            "clean": "0000"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [],
      "extension": "A32 (v8.0)",
      "description": "Speculative Store Bypass Barrier (v8.0) prevents speculative loads from bypassing earlier stores, ensuring that load operations wait for all prior store operations to complete. This is a lighter-weight barrier than SB, specifically targeting store-to-load forwarding speculation. Available in A32 instruction set; does not modify condition flags.",
      "example": "SSBB",
      "pseudocode": "// Prevent speculative load execution past prior stores\nStoreBypassBarrier()\n// All prior stores complete before subsequent loads can execute"
    },
    {
      "mnemonic": "pssbb",
      "architecture": "ARMv8-A",
      "full_name": "Physical Speculative Store Bypass Barrier (A32)",
      "summary": "Prevents speculation on physical resources (v8.0).",
      "syntax": "PSSBB",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "111101010111 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0100 | 0100",
        "hex_opcode": "0xF57FF044",
        "visual_parts": [
          {
            "raw": "111101010111",
            "clean": "111101010111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "0100",
            "clean": "0100"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [],
      "extension": "A32 (v8.0)",
      "description": "Physical Speculative Store Bypass Barrier (v8.0) prevents speculative load bypassing on physical memory operations, operating at a more restrictive level than SSBB by affecting physical resource speculation. This barrier is typically used in security contexts to prevent cross-VM or cross-process speculation. Available in A32 instruction set; does not modify condition flags.",
      "example": "PSSBB",
      "pseudocode": "// Prevent speculative load bypass on physical resources\nPhysicalStoreBypassBarrier()\n// All prior physical stores complete before subsequent loads can execute on physical resources"
    },
    {
      "mnemonic": "tsb",
      "architecture": "ARMv8-A",
      "full_name": "Trace Synchronization Barrier (A32)",
      "summary": "Ensures trace generation is complete (v8.2).",
      "syntax": "TSB CSYNC",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "cond | 00110 | 0 | 10 | 0000 | 1 | 1 | 1 | 1 | 000000010010",
        "hex_opcode": "0x0320F012",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000010010",
            "clean": "000000010010"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [],
      "extension": "A32 (Trace)",
      "description": "Trace Synchronization Barrier with CSYNC operand (v8.2) ensures that trace generation is synchronized and complete before subsequent instructions execute, used to maintain consistency in trace output. This instruction is primarily used in debug and tracing scenarios and does not modify general-purpose registers or condition flags. Available in A32 instruction set.",
      "example": "TSB CSYNC",
      "pseudocode": "// Synchronize trace generation (CSYNC variant)\nTraceBarrier(CSYNC)\n// Trace context switches complete before proceeding"
    },
    {
      "mnemonic": "dfb",
      "architecture": "ARMv8-A",
      "full_name": "Debug Flush Barrier (A32)",
      "summary": "Deprecated alias for DSB.",
      "syntax": "DFB",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "11110101011111111111000001001100",
        "hex_opcode": "0xF57FF04C",
        "visual_parts": [
          {
            "raw": "11110101011111111111000001001100",
            "clean": "11110101011111111111000001001100"
          }
        ]
      },
      "operands": [],
      "extension": "A32 (Legacy)",
      "description": "Debug Flush Barrier (Legacy) is a deprecated alias for DSB that is retained for compatibility; it flushes the debug pipeline and ensures all debug operations complete. This instruction should not be used in new code as it is superseded by explicit DSB instructions. Available in A32 instruction set; does not modify condition flags.",
      "example": "DFB",
      "pseudocode": "// Deprecated: Flush debug pipeline (equivalent to DSB)\nDebugFlushBarrier()\n// All debug operations complete (legacy behavior)"
    },
    {
      "mnemonic": "bxj",
      "architecture": "ARMv8-A",
      "full_name": "Branch and Exchange Jazelle (A32)",
      "summary": "Legacy instruction to enter Jazelle state (Now behaves like BX).",
      "syntax": "BXJ<c> <Rm>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "cond | 00010010 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0010 | Rm",
        "hex_opcode": "0x012FFF20",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010010",
            "clean": "00010010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Legacy)",
      "description": "Legacy instruction that branches to the address in Rm with exchange (Thumb/ARM mode switching based on bit [0] of Rm). In current ARMv8 architecture, BXJ behaves identically to BX due to Jazelle being obsolete. Bit [0] of Rm determines the target state (0=ARM, 1=Thumb). No condition flags are affected. Execution state: A32 only.",
      "example": "BXJ r2",
      "pseudocode": "next_address ← Rm\nif next_address[0] == 1 then\n  CPSR.T ← 1\nelse\n  CPSR.T ← 0\nPC ← next_address AND NOT(0x1)"
    },
    {
      "mnemonic": "vrintm",
      "architecture": "ARMv8-A",
      "full_name": "Vector Round Floating-Point (Minus Infinity)",
      "summary": "Rounds float towards Minus Infinity (Floor).",
      "syntax": "VRINTM<c>.F32 <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Unary",
        "binary_pattern": "111111101 | D | 111 | 0 | 11 | Vd | 10 | 10 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0xFEBB0A40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:19 | 18 | 17:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Rounds a 32-bit floating-point value towards minus infinity (floor) and stores the result in the destination register. This instruction does not modify the condition code flags. It is available in A32 and T32 with the VFP extension, and requires floating-point support.",
      "example": "VRINTM.F32 s0, s2",
      "pseudocode": "Sd ← RoundTowardMinusInfinity(Sm)"
    },
    {
      "mnemonic": "vrintp",
      "architecture": "ARMv8-A",
      "full_name": "Vector Round Floating-Point (Plus Infinity)",
      "summary": "Rounds float towards Plus Infinity (Ceil).",
      "syntax": "VRINTP<c>.F32 <Sd>, <Sm>",
      "encoding": {
        "format": "VFP Unary",
        "binary_pattern": "111111101 | D | 111 | 0 | 10 | Vd | 10 | 10 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0xFEBA0A40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:19 | 18 | 17:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Rounds a 32-bit floating-point value towards plus infinity (ceiling) and stores the result in the destination register. This instruction does not modify the condition code flags. It is available in A32 and T32 with the VFP extension, and requires floating-point support.",
      "example": "VRINTP.F32 s0, s2",
      "pseudocode": "Sd ← RoundTowardPlusInfinity(Sm)"
    },
    {
      "mnemonic": "vrintm",
      "architecture": "ARMv8-A",
      "full_name": "Vector Round Floating-Point Double (Minus Infinity)",
      "summary": "Rounds double towards Minus Infinity (Floor).",
      "syntax": "VRINTM<c>.F64 <Dd>, <Dm>",
      "encoding": {
        "format": "VFP Unary",
        "binary_pattern": "111111101 | D | 111 | 0 | 11 | Vd | 10 | 11 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0xFEBB0B40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:19 | 18 | 17:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Rounds a 64-bit floating-point value towards minus infinity (floor) and stores the result in the destination register. This instruction does not modify the condition code flags. It is available in A32 and T32 with the VFP extension, and requires floating-point support.",
      "example": "VRINTM.F64 d0, d2",
      "pseudocode": "Dd ← RoundTowardMinusInfinity(Dm)"
    },
    {
      "mnemonic": "vrintp",
      "architecture": "ARMv8-A",
      "full_name": "Vector Round Floating-Point Double (Plus Infinity)",
      "summary": "Rounds double towards Plus Infinity (Ceil).",
      "syntax": "VRINTP<c>.F64 <Dd>, <Dm>",
      "encoding": {
        "format": "VFP Unary",
        "binary_pattern": "111111101 | D | 111 | 0 | 10 | Vd | 10 | 11 | 0 | 1 | M | 0 | Vm",
        "hex_opcode": "0xFEBA0B40",
        "visual_parts": [
          {
            "raw": "111111101",
            "clean": "111111101"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:19 | 18 | 17:16 | 15:12 | 11:10 | 9:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "VFP (Float)",
      "description": "Rounds a 64-bit floating-point value towards plus infinity (ceiling) and stores the result in the destination register. This instruction does not modify the condition code flags. It is available in A32 and T32 with the VFP extension, and requires floating-point support.",
      "example": "VRINTP.F64 d0, d2",
      "pseudocode": "Dd ← RoundTowardPlusInfinity(Dm)"
    },
    {
      "mnemonic": "hlt",
      "architecture": "ARMv8-A",
      "full_name": "Halting Debug (A32)",
      "summary": "Enters halting debug state (A32 encoding).",
      "syntax": "HLT #<imm>",
      "encoding": {
        "format": "System",
        "binary_pattern": "cond | 00010 | 00 | 0 | imm12 | 0111 | imm4",
        "hex_opcode": "0x01000070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Halts execution and enters the debugger, with an optional 16-bit immediate value providing debug information. The instruction is unconditional in A32 and causes an exception to the debugger if enabled, otherwise it behaves as an unpredictable instruction. This is an A32-only instruction and is typically privileged.",
      "example": "HLT #16",
      "pseudocode": "DebugState ← Halted; DebugID ← imm16"
    },
    {
      "mnemonic": "msr",
      "architecture": "ARMv8-A",
      "full_name": "Move Immediate to Special Register (A32)",
      "summary": "Writes an immediate to a status register (A32).",
      "syntax": "MSR <spec_reg>, #<imm>",
      "encoding": {
        "format": "System",
        "binary_pattern": "cond | 00110 | R | 10 | mask | 1 | 1 | 1 | 1 | imm12",
        "hex_opcode": "0x0320F000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "R",
            "clean": "R"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "mask",
            "clean": "mask"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [
        {
          "name": "spec_reg",
          "desc": "CPSR/SPSR"
        },
        {
          "name": "imm",
          "desc": "Value"
        }
      ],
      "extension": "A32 (System)",
      "description": "Writes an immediate value to a status register (CPSR or SPSR) with mask control in A32. The immediate is expanded by a rotate amount encoded in the instruction. Only the register fields specified by the mask are updated. This is a privileged instruction if writing to SPSR or certain CPSR fields. Condition flags (N, Z, C, V) may be updated depending on mask. Execution state: A32 only.",
      "example": "MSR nzcv, #16",
      "pseudocode": "imm_value ← rotate_right(imm8, 2 * rotate)\nif spec_reg == CPSR then\n  if mask[0] then CPSR[7:0] ← imm_value[7:0]\n  if mask[1] then CPSR[15:8] ← imm_value[15:8]\n  if mask[2] then CPSR[23:16] ← imm_value[23:16]\n  if mask[3] then CPSR[31:24] ← imm_value[31:24]\nelse if spec_reg == SPSR then\n  if mask[0] then SPSR[7:0] ← imm_value[7:0]\n  if mask[1] then SPSR[15:8] ← imm_value[15:8]\n  if mask[2] then SPSR[23:16] ← imm_value[23:16]\n  if mask[3] then SPSR[31:24] ← imm_value[31:24]"
    },
    {
      "mnemonic": "msr",
      "architecture": "ARMv8-A",
      "full_name": "Move Immediate to Special Register (Thumb)",
      "summary": "Writes an immediate to a status register (Thumb).",
      "syntax": "MSR <spec_reg>, #<imm>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "11110011100 | R | Rn | 10 | 0 | 0 | mask | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0",
        "hex_opcode": "0xF3808000",
        "visual_parts": [
          {
            "raw": "11110011100",
            "clean": "11110011100"
          },
          {
            "raw": "R",
            "clean": "R"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "mask",
            "clean": "mask"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          }
        ],
        "bit_positions": "31:21 | 20 | 19:16 | 15:14 | 13 | 12 | 11:8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0"
      },
      "operands": [
        {
          "name": "spec_reg",
          "desc": "CPSR/SPSR"
        },
        {
          "name": "imm",
          "desc": "Value"
        }
      ],
      "extension": "T32 (System)",
      "description": "Writes an immediate value to a status register (CPSR or SPSR) in T32/Thumb state. The immediate is zero-extended and only the lowest 8 bits are used to update certain CPSR/SPSR fields. This is a privileged instruction. Condition flags may be modified based on the target register and field selection. Execution state: T32 only.",
      "example": "MSR nzcv, #16",
      "pseudocode": "imm_value ← ZeroExtend(imm8, 32)\nif spec_reg == CPSR then\n  CPSR[31:24] ← imm_value[31:24]\nelse if spec_reg == SPSR then\n  SPSR[31:24] ← imm_value[31:24]"
    },
    {
      "mnemonic": "eret",
      "architecture": "ARMv8-A",
      "full_name": "Exception Return (A32)",
      "summary": "Returns from an exception (A32).",
      "syntax": "ERET",
      "encoding": {
        "format": "System",
        "binary_pattern": "cond | 00010110 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0110 | 1 | 1 | 1 | 0",
        "hex_opcode": "0x0160006E",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010110",
            "clean": "00010110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          }
        ],
        "bit_positions": "31:28 | 27:20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3 | 2 | 1 | 0"
      },
      "operands": [],
      "extension": "A32 (System)",
      "description": "Returns from an exception by restoring the PC from ELR_ELx and the PSTATE from SPSR_ELx. This instruction is unconditional and is only available in A32 AArch32 execution state. It requires privilege level sufficient to execute exception-handling code (typically EL1 or higher) and is used at the end of exception handlers.",
      "example": "ERET",
      "pseudocode": "PC ← ELR_ELx; PSTATE ← SPSR_ELx"
    },
    {
      "mnemonic": "subs",
      "architecture": "ARMv8-A",
      "full_name": "Subtract and Return (A32)",
      "summary": "Subs PC, LR, #imm (Exception return mechanism).",
      "syntax": "SUBS PC, LR, #<imm>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 0010 | 010 | 1 | Rn | Rd | imm12",
        "hex_opcode": "0x02500000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Subtracts an immediate from the LR register and stores the result in PC, causing an exception return with automatic CPSR restoration from SPSR. All condition flags (N, Z, C, V) are updated from the subtraction result. This instruction is the preferred exception return mechanism in A32 and must execute in a privileged mode. Execution state: A32 only.",
      "example": "SUBS PC, LR, #16",
      "pseudocode": "result ← LR - imm12\nN ← result[31]\nZ ← (result == 0)\nC ← (LR >= imm12)  \nV ← OverflowFrom(LR - imm12)\nPC ← result\nCPSR ← SPSR"
    },
    {
      "mnemonic": "ldr",
      "architecture": "ARMv8-A",
      "full_name": "Load Register PC-Relative (A32)",
      "summary": "Loads a word from a label.",
      "syntax": "LDR<c> <Rt>, <label>",
      "encoding": {
        "format": "Load Literal",
        "binary_pattern": "cond | 010 | P | U | 0 | W | 1 | 1111 | Rt | imm12",
        "hex_opcode": "0x041F0000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "P",
            "clean": "P"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "W",
            "clean": "W"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Loads a 32-bit word from a memory address computed as the sum of the current PC and a label offset. The offset is encoded as a 12-bit immediate, with the direction (add/subtract) controlled by the U bit. No condition flags are affected. Execution state: A32 only; label must be within ±4KB of the current instruction.",
      "example": "LDR r3, label",
      "pseudocode": "if U == 1 then\n  address ← Align(PC, 4) + imm12\nelse\n  address ← Align(PC, 4) - imm12\nRt ← [address]"
    },
    {
      "mnemonic": "ldr",
      "architecture": "ARMv8-A",
      "full_name": "Load Register PC-Relative (Thumb)",
      "summary": "Loads a word from a label (Thumb).",
      "syntax": "LDR <Rt>, <label>",
      "encoding": {
        "format": "Thumb Load",
        "binary_pattern": "01001 | Rt | imm8",
        "hex_opcode": "0x4800",
        "visual_parts": [
          {
            "raw": "01001",
            "clean": "01001"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "15:11 | 10:8 | 7:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Loads a 32-bit word from memory at a PC-relative address into a register. The effective address is computed by adding the 8-bit immediate (shifted left by 2) to the aligned PC. No condition flags are affected. This is a Thumb 16-bit instruction available in all Thumb-capable processors.",
      "example": "LDR r3, label",
      "pseudocode": "address ← Align(PC, 4) + (imm8 << 2)\nRt ← [address]"
    },
    {
      "mnemonic": "adr",
      "architecture": "ARMv8-A",
      "full_name": "Form PC-relative Address (Thumb)",
      "summary": "Adds an immediate value to the PC (Thumb).",
      "syntax": "ADR <Rd>, <label>",
      "encoding": {
        "format": "Thumb Data Proc",
        "binary_pattern": "1010 | 0 | Rd | imm8",
        "hex_opcode": "0xA000",
        "visual_parts": [
          {
            "raw": "1010",
            "clean": "1010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "15:12 | 11 | 10:8 | 7:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Computes a PC-relative address by adding an 8-bit immediate (shifted left by 2) to the aligned PC and writes the result to a register. No condition flags are affected. This Thumb 16-bit instruction is available in all Thumb-capable processors.",
      "example": "ADR r0, label",
      "pseudocode": "Rd ← Align(PC, 4) + (imm8 << 2)"
    },
    {
      "mnemonic": "rsb",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Subtract (Thumb)",
      "summary": "Reverse Subtract (Thumb 16-bit).",
      "syntax": "RSB <Rd>, <Rn>, #0",
      "encoding": {
        "format": "Thumb Data Proc",
        "binary_pattern": "010000 | 1001 | Rn | Rd",
        "hex_opcode": "0x4240",
        "visual_parts": [
          {
            "raw": "010000",
            "clean": "010000"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "15:10 | 9:6 | 5:3 | 2:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "T32 (Thumb)",
      "description": "Subtracts a register from zero and writes the result to the destination register (two's complement negation). Sets the N, Z, C, and V flags based on the result. This Thumb 16-bit instruction is available in all Thumb-capable processors.",
      "example": "RSB r0, r1, #0",
      "pseudocode": "result ← 0 - Rn\nRd ← result\nN ← (result[31] == 1)\nZ ← (result == 0)\nC ← BorrowFrom(0 - Rn)\nV ← OverflowFrom(0 - Rn)"
    },
    {
      "mnemonic": "hvc",
      "architecture": "ARMv8-A",
      "full_name": "Hypervisor Call (Thumb)",
      "summary": "Calls the Hypervisor (EL2) from Thumb state.",
      "syntax": "HVC #<imm>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "11110111111 | 0 | imm4 | 10 | 0 | 0 | imm12",
        "hex_opcode": "0xF7E08000",
        "visual_parts": [
          {
            "raw": "11110111111",
            "clean": "11110111111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:21 | 20 | 19:16 | 15:14 | 13 | 12 | 11:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "A32 (Virtualization)",
      "description": "Generates a hypervisor call exception, transitioning to EL2 with an optional 16-bit immediate value encoding the hypervisor service request. The instruction is unconditional and available in Thumb state. Execution requires that EL2 is implemented and enabled; the hypervisor takes control and may use the immediate as a service identifier.",
      "example": "HVC #16",
      "pseudocode": "ExceptionSyndromeISS ← imm16; RaiseException(HypercallException)"
    },
    {
      "mnemonic": "smc",
      "architecture": "ARMv8-A",
      "full_name": "Secure Monitor Call (Thumb)",
      "summary": "Calls the Secure Monitor (EL3) from Thumb state.",
      "syntax": "SMC #<imm>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "11110111111 | 1 | imm4 | 10 | 0 | 0 | 000000000000",
        "hex_opcode": "0xF7F08000",
        "visual_parts": [
          {
            "raw": "11110111111",
            "clean": "11110111111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000000000000",
            "clean": "000000000000"
          }
        ],
        "bit_positions": "31:21 | 20 | 19:16 | 15:14 | 13 | 12 | 11:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "A32 (Security)",
      "description": "Generates a secure monitor call exception, transitioning to EL3 with an optional 16-bit immediate value encoding the secure service request. The instruction is unconditional and available in Thumb state. Execution requires that secure state is supported; the secure monitor takes control and may use the immediate as a service identifier.",
      "example": "SMC #16",
      "pseudocode": "ExceptionSyndromeISS ← imm16; RaiseException(SecureMonitorCallException)"
    },
    {
      "mnemonic": "eret",
      "architecture": "ARMv8-A",
      "full_name": "Exception Return (Thumb)",
      "summary": "Returns from an exception (Thumb state).",
      "syntax": "ERET",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "111100111101 | 1110 | 10 | 0 | 0 | 1 | 1 | 1 | 1 | 00000000",
        "hex_opcode": "0xF3DE8F00",
        "visual_parts": [
          {
            "raw": "111100111101",
            "clean": "111100111101"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00000000",
            "clean": "00000000"
          }
        ],
        "bit_positions": "31:20 | 19:16 | 15:14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:0"
      },
      "operands": [],
      "extension": "A32 (System)",
      "description": "Exception Return: Returns from exception handling to the instruction following the exception. Restores the PC from ELR_ELx and PSTATE from SPSR_ELx. Execution state and privilege level are determined by the restored PSTATE. This instruction is only available in privileged modes (EL1 and above in AArch64, or with sufficient privilege in A32/T32).",
      "example": "ERET",
      "pseudocode": "PC ← ELR_ELx\nPSTATE ← SPSR_ELx\nExecutionState ← PSTATE.SS\nPrivilegeLevel ← PSTATE.M"
    },
    {
      "mnemonic": "bfc",
      "architecture": "ARMv8-A",
      "full_name": "Bit Field Clear (Thumb)",
      "summary": "Clears a bitfield in a register.",
      "syntax": "BFC <Rd>, #<lsb>, #<width>",
      "encoding": {
        "format": "Thumb Bitfield",
        "binary_pattern": "11110 | 0 | 11 | 01 | 1 | 0 | 1111 | 0 | imm3 | Rd | imm2 | 0 | msb",
        "hex_opcode": "0xF36F0000",
        "visual_parts": [
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "msb",
            "clean": "msb"
          }
        ],
        "bit_positions": "31:27 | 26 | 25:24 | 23:22 | 21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5 | 4:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "lsb",
          "desc": "Start"
        },
        {
          "name": "width",
          "desc": "Width"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Clears a contiguous bitfield in a register by zeroing bits from lsb to lsb+width-1, leaving other bits unchanged. No condition flags are affected. This is a 32-bit Thumb instruction available in ARMv6T2 and later.",
      "example": "BFC r0, #0, #width",
      "pseudocode": "msb ← lsb + width - 1\nmask ← (1 << (msb + 1)) - (1 << lsb)\nRd ← Rd AND NOT mask"
    },
    {
      "mnemonic": "bfi",
      "architecture": "ARMv8-A",
      "full_name": "Bit Field Insert (Thumb)",
      "summary": "Inserts a bitfield into a register.",
      "syntax": "BFI <Rd>, <Rn>, #<lsb>, #<width>",
      "encoding": {
        "format": "Thumb Bitfield",
        "binary_pattern": "11110 | 0 | 11 | 01 | 1 | 0 | Rn | 0 | imm3 | Rd | imm2 | 0 | msb",
        "hex_opcode": "0xF3600000",
        "visual_parts": [
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "msb",
            "clean": "msb"
          }
        ],
        "bit_positions": "31:27 | 26 | 25:24 | 23:22 | 21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5 | 4:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "lsb",
          "desc": "Start"
        },
        {
          "name": "width",
          "desc": "Width"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Inserts a bitfield from a source register into a destination register, clearing bits from lsb to lsb+width-1 and inserting the corresponding bits from Rn. No condition flags are affected. This is a 32-bit Thumb instruction available in ARMv6T2 and later.",
      "example": "BFI r0, r1, #0, #width",
      "pseudocode": "msb ← lsb + width - 1\nmask ← (1 << (msb + 1)) - (1 << lsb)\nRd ← (Rd AND NOT mask) OR ((Rn << lsb) AND mask)"
    },
    {
      "mnemonic": "sbfx",
      "architecture": "ARMv8-A",
      "full_name": "Signed Bit Field Extract (Thumb)",
      "summary": "Extracts and sign-extends bits.",
      "syntax": "SBFX <Rd>, <Rn>, #<lsb>, #<width>",
      "encoding": {
        "format": "Thumb Bitfield",
        "binary_pattern": "11110 | 0 | 11 | 01 | 0 | 0 | Rn | 0 | imm3 | Rd | imm2 | 0 | widthm1",
        "hex_opcode": "0xF3400000",
        "visual_parts": [
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "widthm1",
            "clean": "widthm1"
          }
        ],
        "bit_positions": "31:27 | 26 | 25:24 | 23:22 | 21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5 | 4:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Signed Bit Field Extract: Extracts a bit field from Rn starting at bit position lsb with width width, sign-extends the result, and writes it to Rd. The condition flags are not affected. This instruction is available in Thumb state (T32) and A32.",
      "example": "SBFX r0, r1, #0, #width",
      "pseudocode": "lsb_val ← ZeroExtend(imm3:imm2, 6)\nwidth_val ← ZeroExtend(width, 5)\nmsb ← lsb_val + width_val - 1\nextracted ← (Rn >> lsb_val)[width_val-1:0]\nif extracted[width_val-1] == 1 then\n  Rd ← SignExtend(extracted, 32)\nelse\n  Rd ← ZeroExtend(extracted, 32)"
    },
    {
      "mnemonic": "ubfx",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Bit Field Extract (Thumb)",
      "summary": "Extracts and zero-extends bits.",
      "syntax": "UBFX <Rd>, <Rn>, #<lsb>, #<width>",
      "encoding": {
        "format": "Thumb Bitfield",
        "binary_pattern": "11110 | 0 | 11 | 11 | 0 | 0 | Rn | 0 | imm3 | Rd | imm2 | 0 | widthm1",
        "hex_opcode": "0xF3C00000",
        "visual_parts": [
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm3",
            "clean": "imm3"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm2",
            "clean": "imm2"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "widthm1",
            "clean": "widthm1"
          }
        ],
        "bit_positions": "31:27 | 26 | 25:24 | 23:22 | 21 | 20 | 19:16 | 15 | 14:12 | 11:8 | 7:6 | 5 | 4:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Unsigned Bit Field Extract: Extracts a bit field from Rn starting at bit position lsb with width width, zero-extends the result, and writes it to Rd. The condition flags are not affected. This instruction is available in Thumb state (T32) and A32.",
      "example": "UBFX r0, r1, #0, #width",
      "pseudocode": "lsb_val ← ZeroExtend(imm3:imm2, 6)\nwidth_val ← ZeroExtend(width, 5)\nextracted ← (Rn >> lsb_val)[width_val-1:0]\nRd ← ZeroExtend(extracted, 32)"
    },
    {
      "mnemonic": "rbit",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bits (Thumb)",
      "summary": "Reverses bits in a 32-bit register.",
      "syntax": "RBIT <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb Misc",
        "binary_pattern": "111110101 | 001 | Rn | 1111 | Rd | 10 | 10 | Rm",
        "hex_opcode": "0xFA90F0A0",
        "visual_parts": [
          {
            "raw": "111110101",
            "clean": "111110101"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Reverse Bits: Reverses all 32 bits in Rm and writes the result to Rd. Each bit position i is moved to position 31-i. The condition flags are not affected. This instruction is available in Thumb state (T32) and A32.",
      "example": "RBIT r0, r2",
      "pseudocode": "for i = 0 to 31\n  Rd[i] ← Rm[31-i]"
    },
    {
      "mnemonic": "rev",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bytes (Thumb)",
      "summary": "Reverses bytes (Endian swap).",
      "syntax": "REV <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb Misc",
        "binary_pattern": "111110101 | 001 | Rn | 1111 | Rd | 10 | 00 | Rm",
        "hex_opcode": "0xFA90F080",
        "visual_parts": [
          {
            "raw": "111110101",
            "clean": "111110101"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Reverses the byte order of a 32-bit word (equivalent to endian conversion). No condition flags are affected. This is a 32-bit Thumb instruction available in ARMv6 and later.",
      "example": "REV r0, r2",
      "pseudocode": "Rd[31:24] ← Rm[7:0]\nRd[23:16] ← Rm[15:8]\nRd[15:8] ← Rm[23:16]\nRd[7:0] ← Rm[31:24]"
    },
    {
      "mnemonic": "rev16",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bytes in Halfwords (Thumb)",
      "summary": "Reverses bytes in each 16-bit halfword.",
      "syntax": "REV16 <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb Misc",
        "binary_pattern": "111110101 | 001 | Rn | 1111 | Rd | 10 | 01 | Rm",
        "hex_opcode": "0xFA90F090",
        "visual_parts": [
          {
            "raw": "111110101",
            "clean": "111110101"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Reverses the byte order within each 16-bit halfword independently (bits [31:24] swap with [23:16] and bits [15:8] swap with [7:0]). No condition flags are affected. This is a 32-bit Thumb instruction available in ARMv6 and later.",
      "example": "REV16 r0, r2",
      "pseudocode": "Rd[31:24] ← Rm[23:16]\nRd[23:16] ← Rm[31:24]\nRd[15:8] ← Rm[7:0]\nRd[7:0] ← Rm[15:8]"
    },
    {
      "mnemonic": "revsh",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Signed Halfword (Thumb)",
      "summary": "Reverses bytes in low halfword and sign-extends.",
      "syntax": "REVSH <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb Misc",
        "binary_pattern": "111110101 | 001 | Rn | 1111 | Rd | 10 | 11 | Rm",
        "hex_opcode": "0xFA90F0B0",
        "visual_parts": [
          {
            "raw": "111110101",
            "clean": "111110101"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Reverse Signed Halfword: Reverses the bytes in the low halfword of Rm, sign-extends the result to 32 bits, and writes it to Rd. The high halfword of Rm is ignored. The condition flags are not affected. This instruction is available in Thumb state (T32) and A32.",
      "example": "REVSH r0, r2",
      "pseudocode": "halfword ← Rm[15:0]\nreversed ← (halfword[7:0] << 8) | halfword[15:8]\nif reversed[15] == 1 then\n  Rd ← SignExtend(reversed, 32)\nelse\n  Rd ← ZeroExtend(reversed, 32)"
    },
    {
      "mnemonic": "clz",
      "architecture": "ARMv8-A",
      "full_name": "Count Leading Zeros (Thumb)",
      "summary": "Counts consecutive zeros.",
      "syntax": "CLZ <Rd>, <Rm>",
      "encoding": {
        "format": "Thumb Misc",
        "binary_pattern": "111110101 | 011 | Rn | 1111 | Rd | 10 | 00 | Rm",
        "hex_opcode": "0xFAB0F080",
        "visual_parts": [
          {
            "raw": "111110101",
            "clean": "111110101"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Count the number of leading zero bits in the 32-bit value in Rm and place the result in Rd. The result ranges from 0 (all bits set) to 32 (all bits clear). No condition flags are affected. This instruction is available in T32 (Thumb) and executes in all privilege levels.",
      "example": "CLZ r0, r2",
      "pseudocode": "Rd ← CountLeadingZeros(Rm[31:0])"
    },
    {
      "mnemonic": "sdiv",
      "architecture": "ARMv8-A",
      "full_name": "Signed Divide (Thumb)",
      "summary": "Signed integer division.",
      "syntax": "SDIV <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Thumb Div",
        "binary_pattern": "111110111 | 001 | Rn | 1111 | Rd | 1111 | Rm",
        "hex_opcode": "0xFB90F0F0",
        "visual_parts": [
          {
            "raw": "111110111",
            "clean": "111110111"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Dividend"
        },
        {
          "name": "Rm",
          "desc": "Divisor"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Perform signed integer division of Rn by Rm and place the quotient in Rd. If Rm is zero, the result is UNPREDICTABLE. If overflow occurs (e.g., INT_MIN / -1), the result is UNPREDICTABLE. No condition flags are affected. This instruction is available in T32 (Thumb) and executes in all privilege levels.",
      "example": "SDIV r0, r1, r2",
      "pseudocode": "if Rm == 0 then UNPREDICTABLE else Rd ← SignedDivide(Rn, Rm)"
    },
    {
      "mnemonic": "udiv",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Divide (Thumb)",
      "summary": "Unsigned integer division.",
      "syntax": "UDIV <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Thumb Div",
        "binary_pattern": "111110111 | 011 | Rn | 1111 | Rd | 1111 | Rm",
        "hex_opcode": "0xFBB0F0F0",
        "visual_parts": [
          {
            "raw": "111110111",
            "clean": "111110111"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Dividend"
        },
        {
          "name": "Rm",
          "desc": "Divisor"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Perform unsigned integer division of Rn by Rm and place the quotient in Rd. If Rm is zero, the result is UNPREDICTABLE. No condition flags are affected. This instruction is available in T32 (Thumb) and executes in all privilege levels.",
      "example": "UDIV r0, r1, r2",
      "pseudocode": "if Rm == 0 then UNPREDICTABLE else Rd ← UnsignedDivide(Rn, Rm)"
    },
    {
      "mnemonic": "mla",
      "architecture": "ARMv8-A",
      "full_name": "Multiply Accumulate (Thumb)",
      "summary": "Rd = Rn + (Rm * Ra).",
      "syntax": "MLA <Rd>, <Rm>, <Ra>, <Rn>",
      "encoding": {
        "format": "Thumb Mul",
        "binary_pattern": "111110110 | 000 | Rn | Ra | Rd | 00 | 00 | Rm",
        "hex_opcode": "0xFB000000",
        "visual_parts": [
          {
            "raw": "111110110",
            "clean": "111110110"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Ra",
          "desc": "Accumulator general-purpose register (multiply-add)"
        },
        {
          "name": "Rn",
          "desc": "Acc"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Multiply Rm by Ra and accumulate the result with Rn, placing the 32-bit result in Rd. Condition flags N, Z, C, and V are not affected. This instruction is available in T32 (Thumb) and executes in all privilege levels.",
      "example": "MLA r0, r2, r5, r1",
      "pseudocode": "Rd ← Rn + (Rm × Ra); result is 32-bit"
    },
    {
      "mnemonic": "mls",
      "architecture": "ARMv8-A",
      "full_name": "Multiply Subtract (Thumb)",
      "summary": "Rd = Rn - (Rm * Ra).",
      "syntax": "MLS <Rd>, <Rm>, <Ra>, <Rn>",
      "encoding": {
        "format": "Thumb Mul",
        "binary_pattern": "111110110 | 000 | Rn | Ra | Rd | 00 | 01 | Rm",
        "hex_opcode": "0xFB000010",
        "visual_parts": [
          {
            "raw": "111110110",
            "clean": "111110110"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Ra",
          "desc": "Accumulator general-purpose register (multiply-add)"
        },
        {
          "name": "Rn",
          "desc": "Acc"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Multiply Rm by Ra and subtract the result from Rn, placing the 32-bit result in Rd. Condition flags N, Z, C, and V are not affected. This instruction is available in T32 (Thumb) and executes in all privilege levels.",
      "example": "MLS r0, r2, r5, r1",
      "pseudocode": "Rd ← Rn - (Rm × Ra); result is 32-bit"
    },
    {
      "mnemonic": "umull",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Multiply Long (Thumb)",
      "summary": "Unsigned Multiply (64-bit result).",
      "syntax": "UMULL <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Thumb Mul",
        "binary_pattern": "111110111 | 010 | Rn | RdLo | RdHi | 0000 | Rm",
        "hex_opcode": "0xFBA00000",
        "visual_parts": [
          {
            "raw": "111110111",
            "clean": "111110111"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Low"
        },
        {
          "name": "RdHi",
          "desc": "High"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Multiply Rn by Rm as unsigned 32-bit values and place the 64-bit result in RdHi:RdLo, where RdHi receives the upper 32 bits and RdLo receives the lower 32 bits. Condition flags N, Z, C, and V are not affected. This instruction is available in T32 (Thumb) and executes in all privilege levels.",
      "example": "UMULL r1, r0, r1, r2",
      "pseudocode": "result ← Rn × Rm; RdHi ← result[63:32]; RdLo ← result[31:0]"
    },
    {
      "mnemonic": "umlal",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Multiply Accumulate Long (Thumb)",
      "summary": "Unsigned Multiply Accumulate (64-bit result).",
      "syntax": "UMLAL <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Thumb Mul",
        "binary_pattern": "111110111 | 110 | Rn | RdLo | RdHi | 0000 | Rm",
        "hex_opcode": "0xFBE00000",
        "visual_parts": [
          {
            "raw": "111110111",
            "clean": "111110111"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Low"
        },
        {
          "name": "RdHi",
          "desc": "High"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Unsigned Multiply Accumulate Long: Multiplies the unsigned 32-bit values in Rn and Rm, accumulates the 64-bit result with the value in RdHi:RdLo, and writes the 64-bit result back to RdHi:RdLo. The condition flags are not affected. This instruction is available in Thumb state (T32) and A32.",
      "example": "UMLAL r1, r0, r1, r2",
      "pseudocode": "product ← ZeroExtend(Rn, 64) × ZeroExtend(Rm, 64)\naccumulator ← (RdHi << 32) | RdLo\nresult ← accumulator + product\nRdLo ← result[31:0]\nRdHi ← result[63:32]"
    },
    {
      "mnemonic": "smull",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Long (Thumb)",
      "summary": "Signed Multiply (64-bit result).",
      "syntax": "SMULL <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Thumb Mul",
        "binary_pattern": "111110111 | 000 | Rn | RdLo | RdHi | 0000 | Rm",
        "hex_opcode": "0xFB800000",
        "visual_parts": [
          {
            "raw": "111110111",
            "clean": "111110111"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Low"
        },
        {
          "name": "RdHi",
          "desc": "High"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Multiply Rn by Rm as signed 32-bit values and place the 64-bit result in RdHi:RdLo, where RdHi receives the upper 32 bits and RdLo receives the lower 32 bits. Condition flags N, Z, C, and V are not affected. This instruction is available in T32 (Thumb) and executes in all privilege levels.",
      "example": "SMULL r1, r0, r1, r2",
      "pseudocode": "result ← SignedMultiply(Rn, Rm); RdHi ← result[63:32]; RdLo ← result[31:0]"
    },
    {
      "mnemonic": "smlal",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate Long (Thumb)",
      "summary": "Signed Multiply Accumulate (64-bit result).",
      "syntax": "SMLAL <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Thumb Mul",
        "binary_pattern": "111110111 | 100 | Rn | RdLo | RdHi | 0000 | Rm",
        "hex_opcode": "0xFBC00000",
        "visual_parts": [
          {
            "raw": "111110111",
            "clean": "111110111"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Low"
        },
        {
          "name": "RdHi",
          "desc": "High"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Signed Multiply Accumulate Long: Multiplies the signed 32-bit values in Rn and Rm, accumulates the 64-bit result with the value in RdHi:RdLo, and writes the 64-bit result back to RdHi:RdLo. The condition flags are not affected. This instruction is available in Thumb state (T32) and A32.",
      "example": "SMLAL r1, r0, r1, r2",
      "pseudocode": "product ← SignExtend(Rn, 64) × SignExtend(Rm, 64)\naccumulator ← (RdHi << 32) | RdLo\nresult ← accumulator + product\nRdLo ← result[31:0]\nRdHi ← result[63:32]"
    },
    {
      "mnemonic": "ldrd",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Dual (Thumb)",
      "summary": "Loads two words from memory (Thumb).",
      "syntax": "LDRD <Rt>, <Rt2>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Thumb Load",
        "binary_pattern": "cond | 000 | 1 | U | 1 | 1 | 0 | Rn | Rt | imm4H | 1 | 10 | 1 | imm4L",
        "hex_opcode": "0x016000D0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm4H",
            "clean": "imm4H"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4L",
            "clean": "imm4L"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Dest 1"
        },
        {
          "name": "Rt2",
          "desc": "Dest 2"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Load two consecutive 32-bit words from memory at address [Rn ± imm] and place them in Rt and Rt2. The immediate offset is scaled by 4 (range ±1020 bytes). No condition flags are affected. This instruction is available in T32 (Thumb) and executes in all privilege levels.",
      "example": "LDRD r3, r4, [r1, #+/-#16]",
      "pseudocode": "address ← Rn + (imm8 << 2); Rt ← [address]; Rt2 ← [address + 4]"
    },
    {
      "mnemonic": "strd",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Dual (Thumb)",
      "summary": "Stores two words to memory (Thumb).",
      "syntax": "STRD <Rt>, <Rt2>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Thumb Store",
        "binary_pattern": "cond | 000 | 1 | U | 1 | 1 | 0 | Rn | Rt | imm4H | 1 | 11 | 1 | imm4L",
        "hex_opcode": "0x016000F0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm4H",
            "clean": "imm4H"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4L",
            "clean": "imm4L"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rt2",
          "desc": "Second transfer register (load/store pair)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Stores two consecutive 32-bit words from registers Rt and Rt2 to memory at the address computed from base register Rn with an optional immediate offset (scaled by 4). The instruction does not modify the condition flags. Execution in Thumb-2 state only.",
      "example": "STRD r3, r4, [r1, #+/-#16]",
      "pseudocode": "address ← Rn + (imm8 << 2)\n[address] ← Rt\n[address + 4] ← Rt2"
    },
    {
      "mnemonic": "strex",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Exclusive (Thumb)",
      "summary": "Stores word if exclusive monitor is open (Thumb).",
      "syntax": "STREX <Rd>, <Rt>, [<Rn>]",
      "encoding": {
        "format": "Thumb Store Excl",
        "binary_pattern": "11101000010 | 0 | Rn | Rt | Rd | imm8",
        "hex_opcode": "0xE8400000",
        "visual_parts": [
          {
            "raw": "11101000010",
            "clean": "11101000010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "31:21 | 20 | 19:16 | 15:12 | 11:8 | 7:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Status"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Attempts to store a 32-bit word from Rt to memory at the address in Rn only if the exclusive monitor is open; writes 0 to Rd if successful, or 1 if the store fails. No condition flags are modified. Execution in Thumb-2 state only; used for atomic operations and compare-and-swap patterns.",
      "example": "STREX r0, r3, [r1]",
      "pseudocode": "address ← Rn\nif ExclusiveMonitor[address] then\n  [address] ← Rt\n  Rd ← 0\n  ClearExclusiveMonitor()\nelse\n  Rd ← 1"
    },
    {
      "mnemonic": "ldrex",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Exclusive (Thumb)",
      "summary": "Loads word and sets exclusive monitor (Thumb).",
      "syntax": "LDREX <Rt>, [<Rn>]",
      "encoding": {
        "format": "Thumb Load Excl",
        "binary_pattern": "11101000010 | 1 | Rn | Rt | 1111 | imm8",
        "hex_opcode": "0xE8500F00",
        "visual_parts": [
          {
            "raw": "11101000010",
            "clean": "11101000010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          }
        ],
        "bit_positions": "31:21 | 20 | 19:16 | 15:12 | 11:8 | 7:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Loads a 32-bit word from memory at the address in Rn into Rt and opens the exclusive monitor for that address. The instruction does not modify the condition flags. Execution in Thumb-2 state only; typically paired with STREX for atomic operations.",
      "example": "LDREX r3, [r1]",
      "pseudocode": "address ← Rn\nRt ← [address]\nSetExclusiveMonitor(address)"
    },
    {
      "mnemonic": "strexb",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Exclusive Byte (Thumb)",
      "summary": "Stores byte exclusively (Thumb).",
      "syntax": "STREXB <Rd>, <Rt>, [<Rn>]",
      "encoding": {
        "format": "Thumb Store Excl",
        "binary_pattern": "11101000110 | 0 | Rn | Rt | 1111 | 01 | 00 | Rd",
        "hex_opcode": "0xE8C00F40",
        "visual_parts": [
          {
            "raw": "11101000110",
            "clean": "11101000110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:21 | 20 | 19:16 | 15:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Status"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Attempts to store the low byte from Rt to memory at the address in Rn only if the exclusive monitor is open; writes 0 to Rd if successful, or 1 if the store fails. No condition flags are modified. Execution in Thumb-2 state only; used for atomic byte-sized operations.",
      "example": "STREXB r0, r3, [r1]",
      "pseudocode": "address ← Rn\nif ExclusiveMonitor[address] then\n  [address] ← Rt[7:0]\n  Rd ← 0\n  ClearExclusiveMonitor()\nelse\n  Rd ← 1"
    },
    {
      "mnemonic": "ldrexb",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Exclusive Byte (Thumb)",
      "summary": "Loads byte exclusively (Thumb).",
      "syntax": "LDREXB <Rt>, [<Rn>]",
      "encoding": {
        "format": "Thumb Load Excl",
        "binary_pattern": "11101000110 | 1 | Rn | Rt | 1111 | 01 | 00 | 1111",
        "hex_opcode": "0xE8D00F4F",
        "visual_parts": [
          {
            "raw": "11101000110",
            "clean": "11101000110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:21 | 20 | 19:16 | 15:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Loads a byte from memory at the address in Rn into the low byte of Rt (zero-extending to 32 bits) and opens the exclusive monitor for that address. The instruction does not modify the condition flags. Execution in Thumb-2 state only; typically paired with STREXB for atomic byte operations.",
      "example": "LDREXB r3, [r1]",
      "pseudocode": "address ← Rn\nRt ← ZeroExtend([address][7:0], 32)\nSetExclusiveMonitor(address)"
    },
    {
      "mnemonic": "strexh",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Exclusive Halfword (Thumb)",
      "summary": "Stores halfword exclusively (Thumb).",
      "syntax": "STREXH <Rd>, <Rt>, [<Rn>]",
      "encoding": {
        "format": "Thumb Store Excl",
        "binary_pattern": "11101000110 | 0 | Rn | Rt | 1111 | 01 | 01 | Rd",
        "hex_opcode": "0xE8C00F50",
        "visual_parts": [
          {
            "raw": "11101000110",
            "clean": "11101000110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:21 | 20 | 19:16 | 15:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Status"
        },
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Attempts to store the low halfword from Rt to memory at the address in Rn only if the exclusive monitor is open; writes 0 to Rd if successful, or 1 if the store fails. No condition flags are modified. Execution in Thumb-2 state only; used for atomic halfword-sized operations.",
      "example": "STREXH r0, r3, [r1]",
      "pseudocode": "address ← Rn\nif ExclusiveMonitor[address] then\n  [address] ← Rt[15:0]\n  Rd ← 0\n  ClearExclusiveMonitor()\nelse\n  Rd ← 1"
    },
    {
      "mnemonic": "ldrexh",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Exclusive Halfword (Thumb)",
      "summary": "Loads halfword exclusively (Thumb).",
      "syntax": "LDREXH <Rt>, [<Rn>]",
      "encoding": {
        "format": "Thumb Load Excl",
        "binary_pattern": "11101000110 | 1 | Rn | Rt | 1111 | 01 | 01 | 1111",
        "hex_opcode": "0xE8D00F5F",
        "visual_parts": [
          {
            "raw": "11101000110",
            "clean": "11101000110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:21 | 20 | 19:16 | 15:12 | 11:8 | 7:6 | 5:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Loads a halfword from memory at the address in Rn into the low halfword of Rt (zero-extending to 32 bits) and opens the exclusive monitor for that address. The instruction does not modify the condition flags. Execution in Thumb-2 state only; typically paired with STREXH for atomic halfword operations.",
      "example": "LDREXH r3, [r1]",
      "pseudocode": "address ← Rn\nRt ← ZeroExtend([address][15:0], 32)\nSetExclusiveMonitor(address)"
    },
    {
      "mnemonic": "clrex",
      "architecture": "ARMv8-A",
      "full_name": "Clear Exclusive (Thumb)",
      "summary": "Clears exclusive monitor (Thumb).",
      "syntax": "CLREX",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "111100111011 | 1 | 1 | 1 | 1 | 10 | 0 | 0 | 1 | 1 | 1 | 1 | 0010 | 1111",
        "hex_opcode": "0xF3BF8F2F",
        "visual_parts": [
          {
            "raw": "111100111011",
            "clean": "111100111011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15:14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [],
      "extension": "A32 (Atomic)",
      "description": "Clear Exclusive: Clears the exclusive monitor, causing any subsequent STREX or STLEX instructions to fail. This instruction is used to release exclusive access to memory and is typically called after completion of a load-exclusive/store-exclusive sequence. The condition flags are not affected.",
      "example": "CLREX",
      "pseudocode": "ExclusiveMonitors.Clear()"
    },
    {
      "mnemonic": "dmb",
      "architecture": "ARMv8-A",
      "full_name": "Data Memory Barrier (Thumb)",
      "summary": "Memory barrier (Thumb).",
      "syntax": "DMB <option>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "111100111011 | 1 | 1 | 1 | 1 | 10 | 0 | 0 | 1 | 1 | 1 | 1 | 0101 | option",
        "hex_opcode": "0xF3BF8F50",
        "visual_parts": [
          {
            "raw": "111100111011",
            "clean": "111100111011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "option",
            "clean": "option"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15:14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "option",
          "desc": "SY/ISH"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Data Memory Barrier enforces completion of all explicit data memory operations before any subsequent memory operations are executed. It ensures memory ordering without requiring instruction completion. In Thumb mode, the option field (bits 3:0) specifies the barrier domain: SY (full system), ISH (inner shareable), OSH (outer shareable), or NSH (non-shareable). No condition flags are affected, and this instruction has no restrictions on execution state or privilege level.",
      "example": "DMB option",
      "pseudocode": "if option == SY then\n  DataMemoryBarrier(FullSystem)\nelse if option == ISH then\n  DataMemoryBarrier(InnerShareable)\nelse if option == OSH then\n  DataMemoryBarrier(OuterShareable)\nelse if option == NSH then\n  DataMemoryBarrier(NonShareable)\nelse\n  DataMemoryBarrier(FullSystem)"
    },
    {
      "mnemonic": "dsb",
      "architecture": "ARMv8-A",
      "full_name": "Data Synchronization Barrier (Thumb)",
      "summary": "Sync barrier (Thumb).",
      "syntax": "DSB <option>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "111100111011 | 1 | 1 | 1 | 1 | 10 | 0 | 0 | 1 | 1 | 1 | 1 | 0100 | option",
        "hex_opcode": "0xF3BF8F40",
        "visual_parts": [
          {
            "raw": "111100111011",
            "clean": "111100111011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "option",
            "clean": "option"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15:14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "option",
          "desc": "SY/ISH"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Data Synchronization Barrier ensures that all explicit data memory operations before the DSB complete before any subsequent memory, prefetch, or branch operations are executed. The option field specifies the barrier domain (SY, ISH, OSH, NSH). No condition flags are affected. This instruction is available in all privilege levels and execution states.",
      "example": "DSB option",
      "pseudocode": "if option == SY then\n  DataSynchronizationBarrier(FullSystem)\nelse if option == ISH then\n  DataSynchronizationBarrier(InnerShareable)\nelse if option == OSH then\n  DataSynchronizationBarrier(OuterShareable)\nelse if option == NSH then\n  DataSynchronizationBarrier(NonShareable)\nelse\n  DataSynchronizationBarrier(FullSystem)"
    },
    {
      "mnemonic": "isb",
      "architecture": "ARMv8-A",
      "full_name": "Instruction Synchronization Barrier (Thumb)",
      "summary": "Instruction barrier (Thumb).",
      "syntax": "ISB <option>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "111100111011 | 1 | 1 | 1 | 1 | 10 | 0 | 0 | 1 | 1 | 1 | 1 | 0110 | option",
        "hex_opcode": "0xF3BF8F60",
        "visual_parts": [
          {
            "raw": "111100111011",
            "clean": "111100111011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "option",
            "clean": "option"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15:14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "option",
          "desc": "SY"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Instruction Synchronization Barrier flushes the processor pipeline and ensures that all instructions that follow are fetched from cache or memory after the ISB completes. The option field is typically SY (full system) and is the only valid value in most implementations. No condition flags are affected. ISB is available in all privilege levels and is essential for self-modifying code.",
      "example": "ISB option",
      "pseudocode": "if option == SY then\n  InstructionSynchronizationBarrier()\nelse\n  InstructionSynchronizationBarrier()"
    },
    {
      "mnemonic": "nop",
      "architecture": "ARMv8-A",
      "full_name": "No Operation (Thumb)",
      "summary": "No op (Thumb 16-bit).",
      "syntax": "NOP",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "10111111 | 0000 | 0000",
        "hex_opcode": "0xBF00",
        "visual_parts": [
          {
            "raw": "10111111",
            "clean": "10111111"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0000",
            "clean": "0000"
          }
        ],
        "bit_positions": "15:8 | 7:4 | 3:0"
      },
      "operands": [],
      "extension": "T32 (Base)",
      "description": "Performs no operation; used for code alignment, timing adjustments, or as a placeholder instruction. No registers are modified and no condition flags are affected. Available in both A32 and Thumb-2 states.",
      "example": "NOP",
      "pseudocode": "// No operation; pipeline advance only"
    },
    {
      "mnemonic": "yield",
      "architecture": "ARMv8-A",
      "full_name": "Yield (Thumb)",
      "summary": "Yield hint (Thumb).",
      "syntax": "YIELD",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "10111111 | 0001 | 0000",
        "hex_opcode": "0xBF10",
        "visual_parts": [
          {
            "raw": "10111111",
            "clean": "10111111"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "0000",
            "clean": "0000"
          }
        ],
        "bit_positions": "15:8 | 7:4 | 3:0"
      },
      "operands": [],
      "extension": "T32 (Base)",
      "description": "Yield is a hint instruction that suggests the processor may improve performance by yielding to other threads or tasks. It does not perform any operation if the yield hint is not implemented. No registers, memory, or condition flags are modified. YIELD is available in all privilege levels and is used for spinlock and busy-wait optimization.",
      "example": "YIELD",
      "pseudocode": "HintYield()"
    },
    {
      "mnemonic": "wfe",
      "architecture": "ARMv8-A",
      "full_name": "Wait For Event (Thumb)",
      "summary": "Wait for event (Thumb).",
      "syntax": "WFE",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "10111111 | 0010 | 0000",
        "hex_opcode": "0xBF20",
        "visual_parts": [
          {
            "raw": "10111111",
            "clean": "10111111"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "0000",
            "clean": "0000"
          }
        ],
        "bit_positions": "15:8 | 7:4 | 3:0"
      },
      "operands": [],
      "extension": "T32 (Base)",
      "description": "Wait For Event causes the processor to enter a low-power state and wait until an event is signaled (by WFE, SEV, or external interrupt). If the event register is already set, WFE clears it and returns immediately. No registers or condition flags are modified. This instruction may require specific privilege levels depending on implementation.",
      "example": "WFE",
      "pseudocode": "if EventRegister == 1 then\n  EventRegister ← 0\nelse\n  WaitForEvent()\n  EventRegister ← 0"
    },
    {
      "mnemonic": "wfi",
      "architecture": "ARMv8-A",
      "full_name": "Wait For Interrupt (Thumb)",
      "summary": "Wait for interrupt (Thumb).",
      "syntax": "WFI",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "10111111 | 0011 | 0000",
        "hex_opcode": "0xBF30",
        "visual_parts": [
          {
            "raw": "10111111",
            "clean": "10111111"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "0000",
            "clean": "0000"
          }
        ],
        "bit_positions": "15:8 | 7:4 | 3:0"
      },
      "operands": [],
      "extension": "T32 (Base)",
      "description": "Wait For Interrupt causes the processor to enter a low-power state and wait until an interrupt is signaled. Execution resumes when an interrupt arrives that is neither masked nor suppressed. No registers or condition flags are modified. WFI is commonly used in idle loops and power management.",
      "example": "WFI",
      "pseudocode": "WaitForInterrupt()"
    },
    {
      "mnemonic": "sev",
      "architecture": "ARMv8-A",
      "full_name": "Send Event (Thumb)",
      "summary": "Send event (Thumb).",
      "syntax": "SEV",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "10111111 | 0100 | 0000",
        "hex_opcode": "0xBF40",
        "visual_parts": [
          {
            "raw": "10111111",
            "clean": "10111111"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "0000",
            "clean": "0000"
          }
        ],
        "bit_positions": "15:8 | 7:4 | 3:0"
      },
      "operands": [],
      "extension": "T32 (Base)",
      "description": "Send Event sets the event register and wakes all processors in the same inner-shareable domain that are waiting on WFE. This is used for synchronization between multiple CPUs or threads. No registers or condition flags are modified. SEV is available in all privilege levels.",
      "example": "SEV",
      "pseudocode": "EventRegister ← 1\nWakeupInnerShareableDomain()"
    },
    {
      "mnemonic": "sevl",
      "architecture": "ARMv8-A",
      "full_name": "Send Event Local (Thumb)",
      "summary": "Send local event (Thumb).",
      "syntax": "SEVL",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "10111111 | 0101 | 0000",
        "hex_opcode": "0xBF50",
        "visual_parts": [
          {
            "raw": "10111111",
            "clean": "10111111"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "0000",
            "clean": "0000"
          }
        ],
        "bit_positions": "15:8 | 7:4 | 3:0"
      },
      "operands": [],
      "extension": "T32 (Base)",
      "description": "Send Event Local sets the local event monitor to signaled state, causing any subsequent WFE instruction in the same PE to wake immediately without waiting. This is a Thumb 16-bit instruction that has no effect on condition flags. It is available in ARMv6K and later, and executes in any privilege level.",
      "example": "SEVL",
      "pseudocode": "EventRegister[PE].LocalEvent ← 1"
    },
    {
      "mnemonic": "mrs",
      "architecture": "ARMv8-A",
      "full_name": "Move Special Register to Register (Thumb)",
      "summary": "Read special register (Thumb).",
      "syntax": "MRS <Rd>, <spec_reg>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "11110011111 | R | 1 | 1 | 1 | 1 | 10 | 0 | 0 | Rd | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0",
        "hex_opcode": "0xF3EF8000",
        "visual_parts": [
          {
            "raw": "11110011111",
            "clean": "11110011111"
          },
          {
            "raw": "R",
            "clean": "R"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          }
        ],
        "bit_positions": "31:21 | 20 | 19 | 18 | 17 | 16 | 15:14 | 13 | 12 | 11:8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "spec_reg",
          "desc": "Reg"
        }
      ],
      "extension": "A32 (System)",
      "description": "Move Special Register to Register reads the value of a system register specified by spec_reg and writes it to the general-purpose register Rd. In T32/Thumb, this is a 32-bit instruction that accesses APSR, IPSR, EPSR, IAPSR, EAPSR, IEPSR, MSPLIM, PSPLIM, or other banked registers depending on the spec_reg encoding. The instruction does not modify the condition flags; it simply transfers the register value.",
      "example": "MRS r0, nzcv",
      "pseudocode": "Rd ← ReadSystemReg(spec_reg)"
    },
    {
      "mnemonic": "msr",
      "architecture": "ARMv8-A",
      "full_name": "Move Register to Special Register (Thumb)",
      "summary": "Write special register (Thumb).",
      "syntax": "MSR <spec_reg>, <Rn>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "cond | 00010 | R | 1 | 0 | mask | 1111 | 0 | 0 | 0 | 0 | 0000 | Rn",
        "hex_opcode": "0x0120F000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "R",
            "clean": "R"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "mask",
            "clean": "mask"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "spec_reg",
          "desc": "Reg"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (System)",
      "description": "Move Register to Special Register writes the value from the general-purpose register Rn to the system register specified by spec_reg. In T32/Thumb, this is a 32-bit instruction used to modify APSR, IPSR, EPSR, or other banked registers. The instruction may update condition flags (N, Z, C, V) if the target is APSR; otherwise, flags remain unaffected based on the register written.",
      "example": "MSR nzcv, r1",
      "pseudocode": "WriteSystemReg(spec_reg, Rn)"
    },
    {
      "mnemonic": "cps",
      "architecture": "ARMv8-A",
      "full_name": "Change Processor State (Thumb)",
      "summary": "Change mode/state (Thumb).",
      "syntax": "CPS<effect> <iflags> {, #<mode>}",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "111100111010 | 1 | 1 | 1 | 1 | 10 | 0 | 0 | 0 | 00 | 1 | A | I | F | mode",
        "hex_opcode": "0xF3AF8100",
        "visual_parts": [
          {
            "raw": "111100111010",
            "clean": "111100111010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "A",
            "clean": "A"
          },
          {
            "raw": "I",
            "clean": "I"
          },
          {
            "raw": "F",
            "clean": "F"
          },
          {
            "raw": "mode",
            "clean": "mode"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15:14 | 13 | 12 | 11 | 10:9 | 8 | 7 | 6 | 5 | 4:0"
      },
      "operands": [
        {
          "name": "effect",
          "desc": "IE/ID"
        },
        {
          "name": "mode",
          "desc": "Mode"
        }
      ],
      "extension": "T32 (System)",
      "description": "Change Processor State changes interrupt masks (I, F, A flags) and optionally changes processor mode in Thumb mode. The effect field (IE/ID) specifies whether to Enable or Disable the specified interrupt flags. This instruction does not affect condition codes and requires appropriate privilege level to change mode.",
      "example": "CPSeffect iflags",
      "pseudocode": "if effect == 'IE' then\n  if 'A' in iflags then CPSR.A ← 0\n  if 'I' in iflags then CPSR.I ← 0\n  if 'F' in iflags then CPSR.F ← 0\nelsif effect == 'ID' then\n  if 'A' in iflags then CPSR.A ← 1\n  if 'I' in iflags then CPSR.I ← 1\n  if 'F' in iflags then CPSR.F ← 1\nif mode_specified then\n  CPSR.M ← mode"
    },
    {
      "mnemonic": "setend",
      "architecture": "ARMv8-A",
      "full_name": "Set Endianness (Thumb)",
      "summary": "Set endianness (Thumb).",
      "syntax": "SETEND <endian>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "1011011001 | 0 | 1 | E | 000",
        "hex_opcode": "0xB650",
        "visual_parts": [
          {
            "raw": "1011011001",
            "clean": "1011011001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "E",
            "clean": "E"
          },
          {
            "raw": "000",
            "clean": "000"
          }
        ],
        "bit_positions": "15:6 | 5 | 4 | 3 | 2:0"
      },
      "operands": [
        {
          "name": "endian",
          "desc": "BE/LE"
        }
      ],
      "extension": "T32 (System)",
      "description": "Set Endianness changes the endianness state in the CPSR: BE sets big-endian, LE sets little-endian. This Thumb instruction does not affect condition codes and requires appropriate privilege level (typically User mode cannot change this). The change takes effect on the next memory access.",
      "example": "SETEND endian",
      "pseudocode": "if endian == 'BE' then\n  CPSR.E ← 1\nelsif endian == 'LE' then\n  CPSR.E ← 0"
    },
    {
      "mnemonic": "dbg",
      "architecture": "ARMv8-A",
      "full_name": "Debug Hint (Thumb)",
      "summary": "Debug hint (Thumb).",
      "syntax": "DBG #<option>",
      "encoding": {
        "format": "Thumb System",
        "binary_pattern": "111100111010 | 1 | 1 | 1 | 1 | 10 | 0 | 0 | 0 | 000 | 1111 | option",
        "hex_opcode": "0xF3AF80F0",
        "visual_parts": [
          {
            "raw": "111100111010",
            "clean": "111100111010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "option",
            "clean": "option"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15:14 | 13 | 12 | 11 | 10:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "option",
          "desc": "Opt"
        }
      ],
      "extension": "T32 (Base)",
      "description": "Debug Hint provides a hint to the debugger about the execution state, encoded in a 4-bit option field. The instruction is a no-op from an architectural perspective and does not modify registers, memory, or condition flags. It is useful for marking debug checkpoints in code.",
      "example": "DBG #option",
      "pseudocode": "// Debug hint - architecturally NOP\n// Debugger may act on option field\nPC ← PC + instruction_length"
    },
    {
      "mnemonic": "pop",
      "architecture": "ARMv8-A",
      "full_name": "Pop (Thumb)",
      "summary": "Pop registers from stack (Thumb 16-bit).",
      "syntax": "POP <registers>",
      "encoding": {
        "format": "Thumb Load Multiple",
        "binary_pattern": "1011 | 1 | 10 | P | register_list",
        "hex_opcode": "0xBC00",
        "visual_parts": [
          {
            "raw": "1011",
            "clean": "1011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "P",
            "clean": "P"
          },
          {
            "raw": "register_list",
            "clean": "register_list"
          }
        ],
        "bit_positions": "15:12 | 11 | 10:9 | 8 | 7:0"
      },
      "operands": [
        {
          "name": "registers",
          "desc": "List"
        }
      ],
      "extension": "T32 (Base)",
      "description": "Pop Registers from Stack loads multiple registers from memory addresses specified by the SP register, incrementing SP after each load. The P bit in the encoding indicates whether the PC is included in the register list. This Thumb 16-bit instruction does not affect condition flags directly but may load into the PC, which can cause a branch.",
      "example": "POP registers",
      "pseudocode": "address ← SP\nfor each register in register_list (in ascending order):\n  register ← [address]\n  address ← address + 4\nSP ← address\nif P == 1 then\n  PC ← [SP - 4]\n  address ← address (SP already updated)"
    },
    {
      "mnemonic": "push",
      "architecture": "ARMv8-A",
      "full_name": "Push (Thumb)",
      "summary": "Push registers to stack (Thumb 16-bit).",
      "syntax": "PUSH <registers>",
      "encoding": {
        "format": "Thumb Store Multiple",
        "binary_pattern": "1011 | 0 | 10 | M | register_list",
        "hex_opcode": "0xB400",
        "visual_parts": [
          {
            "raw": "1011",
            "clean": "1011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "register_list",
            "clean": "register_list"
          }
        ],
        "bit_positions": "15:12 | 11 | 10:9 | 8 | 7:0"
      },
      "operands": [
        {
          "name": "registers",
          "desc": "List"
        }
      ],
      "extension": "T32 (Base)",
      "description": "Push Registers to Stack stores multiple registers to memory addresses specified by the SP register, decrementing SP before each store. The M bit in the encoding indicates whether the LR is included in the register list. This Thumb 16-bit instruction does not affect condition flags.",
      "example": "PUSH registers",
      "pseudocode": "address ← SP\nfor each register in register_list (in descending order):\n  address ← address - 4\n  [address] ← register\nSP ← address\nif M == 1 then\n  address ← address - 4\n  [address] ← LR\n  SP ← address"
    },
    {
      "mnemonic": "ldm",
      "architecture": "ARMv8-A",
      "full_name": "Load Multiple (Thumb)",
      "summary": "Load multiple registers (Thumb 16-bit).",
      "syntax": "LDM <Rn>!, <registers>",
      "encoding": {
        "format": "Thumb Load Multiple",
        "binary_pattern": "1100 | 1 | Rn | register_list",
        "hex_opcode": "0xC800",
        "visual_parts": [
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "register_list",
            "clean": "register_list"
          }
        ],
        "bit_positions": "15:12 | 11 | 10:8 | 7:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "registers",
          "desc": "List"
        }
      ],
      "extension": "T32 (Base)",
      "description": "Load Multiple (Thumb 16-bit) loads multiple registers from memory at addresses formed by Rn, and optionally updates Rn to point to the next memory location. The register list is encoded in an 8-bit field. If Rn is the SP, this can function as a pop operation. Condition flags are not modified by the load itself, but if the PC is in the register list, execution continues at the loaded address.",
      "example": "LDM r1!, registers",
      "pseudocode": "address ← Rn\nfor each register in register_list (in ascending order):\n  register ← [address]\n  address ← address + 4\nRn ← address\nif PC in register_list:\n  PC ← loaded_PC_value"
    },
    {
      "mnemonic": "stm",
      "architecture": "ARMv8-A",
      "full_name": "Store Multiple (Thumb)",
      "summary": "Store multiple registers (Thumb 16-bit).",
      "syntax": "STM <Rn>!, <registers>",
      "encoding": {
        "format": "Thumb Store Multiple",
        "binary_pattern": "1100 | 0 | Rn | register_list",
        "hex_opcode": "0xC000",
        "visual_parts": [
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "register_list",
            "clean": "register_list"
          }
        ],
        "bit_positions": "15:12 | 11 | 10:8 | 7:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "registers",
          "desc": "List"
        }
      ],
      "extension": "T32 (Base)",
      "description": "Store Multiple (Thumb 16-bit) stores multiple registers to memory at addresses formed by Rn, and optionally updates Rn to point to the next memory location. The register list is encoded in an 8-bit field. If Rn is the SP, this can function as a push operation. Condition flags are not modified.",
      "example": "STM r1!, registers",
      "pseudocode": "address ← Rn\nfor each register in register_list (in ascending order):\n  [address] ← register\n  address ← address + 4\nRn ← address"
    },
    {
      "mnemonic": "ptrue",
      "architecture": "ARMv8-A",
      "full_name": "SVE Initialize Predicate to True",
      "summary": "Sets elements of the predicate register to true (all active).",
      "syntax": "PTRUE <Pd>.<T> {, <pattern>}",
      "encoding": {
        "format": "SVE Predicate",
        "binary_pattern": "00100101 | size | 01100 | 0 | 111000 | pattern | 0 | Pd",
        "hex_opcode": "0x2518E000",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "111000",
            "clean": "111000"
          },
          {
            "raw": "pattern",
            "clean": "pattern"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:17 | 16 | 15:10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Destination predicate register (SVE)"
        },
        {
          "name": "pattern",
          "desc": "Pattern (e.g., VL1, VL2)"
        }
      ],
      "extension": "SVE",
      "description": "SVE Initialize Predicate to True sets all active elements of the destination predicate register to 1 (true) based on the specified pattern and element type. The pattern field controls which elements are considered active (e.g., VL1, VL2, all). This SVE instruction does not affect PSTATE condition flags.",
      "example": "PTRUE p0.T",
      "pseudocode": "num_active ← GetPatternLength(pattern, <T>)\nfor i = 0 to (VL / element_bits - 1):\n  if i < num_active then\n    Pd[i] ← 1\n  else\n    Pd[i] ← 0"
    },
    {
      "mnemonic": "pfalse",
      "architecture": "ARMv8-A",
      "full_name": "SVE Initialize Predicate to False",
      "summary": "Clears all elements of the predicate register.",
      "syntax": "PFALSE <Pd>.B",
      "encoding": {
        "format": "SVE Predicate",
        "binary_pattern": "00100101 | 0 | 0 | 011000111001 | 000000 | Pd",
        "hex_opcode": "0x2518E400",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011000111001",
            "clean": "011000111001"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:10 | 9:4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Destination predicate register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE Initialize Predicate to False clears all elements of the destination predicate register to 0 (false). This SVE instruction is equivalent to PTRUE with pattern 'none' and does not affect PSTATE condition flags. The .B suffix is fixed for this instruction.",
      "example": "PFALSE p0.B",
      "pseudocode": "for i = 0 to (VL / 8 - 1):\n  Pd[i] ← 0"
    },
    {
      "mnemonic": "ld1b",
      "architecture": "ARMv8-A",
      "full_name": "SVE Load Contiguous Bytes",
      "summary": "Loads bytes from memory into a vector under predicate control.",
      "syntax": "LD1B { <Zt>.B }, <Pg>/Z, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Load",
        "binary_pattern": "1010010 | 000 | 0 | Rm | 010 | Pg | Rn | Zt",
        "hex_opcode": "0xA4004000",
        "visual_parts": [
          {
            "raw": "1010010",
            "clean": "1010010"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24:22 | 21 | 20:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Dest Vector"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "Base Addr"
        }
      ],
      "extension": "SVE",
      "description": "Loads contiguous bytes from memory into a SVE vector register under predicate control. Each active predicate element (indicated by Pg) loads one byte from the address sequence starting at [Xn|SP], zero-extending to fill the byte element. Inactive elements are zeroed (Z suffix semantics). No flags are affected.",
      "example": "LD1B p0/m/Z, [x1]",
      "pseudocode": "for i = 0 to VL/8-1\n  if Pg[i] == 1 then\n    Zt.B[i] ← [Xn + i]\n  else\n    Zt.B[i] ← 0"
    },
    {
      "mnemonic": "ld1h",
      "architecture": "ARMv8-A",
      "full_name": "SVE Load Contiguous Halfwords",
      "summary": "Loads halfwords from memory into a vector under predicate control.",
      "syntax": "LD1H { <Zt>.H }, <Pg>/Z, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Load",
        "binary_pattern": "1010010 | 010 | 1 | 0 | imm4 | 101 | Pg | Rn | Zt",
        "hex_opcode": "0xA4A0A000",
        "visual_parts": [
          {
            "raw": "1010010",
            "clean": "1010010"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24:22 | 21 | 20 | 19:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Dest Vector"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "Base Addr"
        }
      ],
      "extension": "SVE",
      "description": "Loads contiguous halfwords from memory into a SVE vector register under predicate control. Each active predicate element loads one 16-bit value from the address sequence [Xn|SP + 2*i], zero-extending to fill the halfword element. Inactive elements are zeroed (Z suffix semantics). No flags are affected.",
      "example": "LD1H p0/m/Z, [x1]",
      "pseudocode": "for i = 0 to VL/16-1\n  if Pg[i] == 1 then\n    Zt.H[i] ← [Xn + 2*i]\n  else\n    Zt.H[i] ← 0"
    },
    {
      "mnemonic": "ld1w",
      "architecture": "ARMv8-A",
      "full_name": "SVE Load Contiguous Words",
      "summary": "Loads words from memory into a vector under predicate control.",
      "syntax": "LD1W { <Zt>.S }, <Pg>/Z, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Load",
        "binary_pattern": "1010010 | 101 | 0 | 0 | imm4 | 101 | Pg | Rn | Zt",
        "hex_opcode": "0xA540A000",
        "visual_parts": [
          {
            "raw": "1010010",
            "clean": "1010010"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24:22 | 21 | 20 | 19:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Dest Vector"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "Base Addr"
        }
      ],
      "extension": "SVE",
      "description": "Loads contiguous words from memory into a SVE vector register under predicate control. Each active predicate element loads one 32-bit value from the address sequence [Xn|SP + 4*i], zero-extending to fill the word element. Inactive elements are zeroed (Z suffix semantics). No flags are affected.",
      "example": "LD1W p0/m/Z, [x1]",
      "pseudocode": "for i = 0 to VL/32-1\n  if Pg[i] == 1 then\n    Zt.S[i] ← [Xn + 4*i]\n  else\n    Zt.S[i] ← 0"
    },
    {
      "mnemonic": "ld1d",
      "architecture": "ARMv8-A",
      "full_name": "SVE Load Contiguous Doublewords",
      "summary": "Loads doublewords from memory into a vector under predicate control.",
      "syntax": "LD1D { <Zt>.D }, <Pg>/Z, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Load",
        "binary_pattern": "1100010 | 1 | 1 | 10 | Zm | 1 | 1 | 0 | Pg | Rn | Zt",
        "hex_opcode": "0xC5C0C000",
        "visual_parts": [
          {
            "raw": "1100010",
            "clean": "1100010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22:21 | 20:16 | 15 | 14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Dest Vector"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "Base Addr"
        }
      ],
      "extension": "SVE",
      "description": "Loads contiguous doublewords from memory into a SVE vector register under predicate control. Each active predicate element loads one 64-bit value from the address sequence [Xn|SP + 8*i]. Inactive elements are zeroed (Z suffix semantics). No flags are affected.",
      "example": "LD1D p0/m/Z, [x1]",
      "pseudocode": "for i = 0 to VL/64-1\n  if Pg[i] == 1 then\n    Zt.D[i] ← [Xn + 8*i]\n  else\n    Zt.D[i] ← 0"
    },
    {
      "mnemonic": "st1b",
      "architecture": "ARMv8-A",
      "full_name": "SVE Store Contiguous Bytes",
      "summary": "Stores active bytes from vector to memory.",
      "syntax": "ST1B { <Zt>.B }, <Pg>, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Store",
        "binary_pattern": "1110010 | 00 | size | Rm | 010 | Pg | Rn | Zt",
        "hex_opcode": "0xE4004000",
        "visual_parts": [
          {
            "raw": "1110010",
            "clean": "1110010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24:23 | 22:21 | 20:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Src Vector"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "Base Addr"
        }
      ],
      "extension": "SVE",
      "description": "Stores active bytes from a SVE vector register to memory under predicate control. Only elements where the corresponding predicate bit is set are written; inactive elements do not generate memory operations. No flags are affected.",
      "example": "ST1B p0/m, [x1]",
      "pseudocode": "for i = 0 to VL/8-1\n  if Pg[i] == 1 then\n    [Xn + i] ← Zt.B[i]"
    },
    {
      "mnemonic": "st1h",
      "architecture": "ARMv8-A",
      "full_name": "SVE Store Contiguous Halfwords",
      "summary": "Stores active halfwords from vector to memory.",
      "syntax": "ST1H { <Zt>.H }, <Pg>, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Store",
        "binary_pattern": "1110010 | 0 | 1 | size | 0 | imm4 | 111 | Pg | Rn | Zt",
        "hex_opcode": "0xE480E000",
        "visual_parts": [
          {
            "raw": "1110010",
            "clean": "1110010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22:21 | 20 | 19:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Src Vector"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "Base Addr"
        }
      ],
      "extension": "SVE",
      "description": "Stores active halfwords from a SVE vector register to memory under predicate control. Only elements where the corresponding predicate bit is set are written to addresses [Xn|SP + 2*i]; inactive elements do not generate memory operations. No flags are affected.",
      "example": "ST1H p0/m, [x1]",
      "pseudocode": "for i = 0 to VL/16-1\n  if Pg[i] == 1 then\n    [Xn + 2*i] ← Zt.H[i]"
    },
    {
      "mnemonic": "st1w",
      "architecture": "ARMv8-A",
      "full_name": "SVE Store Contiguous Words",
      "summary": "Stores active words from vector to memory.",
      "syntax": "ST1W { <Zt>.S }, <Pg>, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Store",
        "binary_pattern": "1110010 | 1 | 0 | 10 | Zm | 1 | xs | 0 | Pg | Rn | Zt",
        "hex_opcode": "0xE5408000",
        "visual_parts": [
          {
            "raw": "1110010",
            "clean": "1110010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "xs",
            "clean": "xs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22:21 | 20:16 | 15 | 14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Src Vector"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "Base Addr"
        }
      ],
      "extension": "SVE",
      "description": "Stores active words from a SVE vector register to memory under predicate control. Only elements where the corresponding predicate bit is set are written to addresses [Xn|SP + 4*i]; inactive elements do not generate memory operations. No flags are affected.",
      "example": "ST1W p0/m, [x1]",
      "pseudocode": "for i = 0 to VL/32-1\n  if Pg[i] == 1 then\n    [Xn + 4*i] ← Zt.S[i]"
    },
    {
      "mnemonic": "st1d",
      "architecture": "ARMv8-A",
      "full_name": "SVE Store Contiguous Doublewords",
      "summary": "Stores active doublewords from vector to memory.",
      "syntax": "ST1D { <Zt>.D }, <Pg>, [<Xn|SP>]",
      "encoding": {
        "format": "SVE Store",
        "binary_pattern": "1110010 | 1 | 1 | 00 | Zm | 101 | Pg | Rn | Zt",
        "hex_opcode": "0xE580A000",
        "visual_parts": [
          {
            "raw": "1110010",
            "clean": "1110010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22:21 | 20:16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Src Vector"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Xn",
          "desc": "Base Addr"
        }
      ],
      "extension": "SVE",
      "description": "Stores active doublewords from a SVE vector register to memory under predicate control. Only elements where the corresponding predicate bit is set are written to addresses [Xn|SP + 8*i]; inactive elements do not generate memory operations. No flags are affected.",
      "example": "ST1D p0/m, [x1]",
      "pseudocode": "for i = 0 to VL/64-1\n  if Pg[i] == 1 then\n    [Xn + 8*i] ← Zt.D[i]"
    },
    {
      "mnemonic": "whilelt",
      "architecture": "ARMv8-A",
      "full_name": "SVE While Less Than",
      "summary": "Generates a predicate based on a loop counter (while Xn < Xm).",
      "syntax": "WHILELT <Pd>.<T>, <Xn>, <Xm>",
      "encoding": {
        "format": "SVE Compare Scalar",
        "binary_pattern": "00100101 | size | 1 | Rm | 000 | sf | 0 | 1 | Rn | 0 | Pd",
        "hex_opcode": "0x25200400",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "sf",
            "clean": "sf"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11 | 10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Destination predicate register (SVE)"
        },
        {
          "name": "Xn",
          "desc": "Start"
        },
        {
          "name": "Xm",
          "desc": "Limit"
        }
      ],
      "extension": "SVE",
      "description": "Generates a predicate register by comparing a loop counter with a limit, setting each element to true if counter < limit. Operates on 64-bit signed integers and generates a predicate for elements of type T (8-bit, 16-bit, 32-bit, or 64-bit). No flags are affected. This is an AArch64-only SVE instruction.",
      "example": "WHILELT p0.T, x1, x2",
      "pseudocode": "for i = 0 to VL/esize-1\n  Pd[i] ← (Xn < Xm)"
    },
    {
      "mnemonic": "whilele",
      "architecture": "ARMv8-A",
      "full_name": "SVE While Less Than or Equal",
      "summary": "Generates a predicate based on loop counter (while Xn <= Xm).",
      "syntax": "WHILELE <Pd>.<T>, <Xn>, <Xm>",
      "encoding": {
        "format": "SVE Compare Scalar",
        "binary_pattern": "00100101 | size | 1 | Rm | 000 | sf | 0 | 1 | Rn | 1 | Pd",
        "hex_opcode": "0x25200410",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "sf",
            "clean": "sf"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11 | 10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Destination predicate register (SVE)"
        },
        {
          "name": "Xn",
          "desc": "Start"
        },
        {
          "name": "Xm",
          "desc": "Limit"
        }
      ],
      "extension": "SVE",
      "description": "Generates a predicate register by comparing a loop counter with a limit, setting each element to true if counter ≤ limit. Operates on 64-bit signed integers and generates a predicate for elements of type T. No flags are affected. This is an AArch64-only SVE instruction.",
      "example": "WHILELE p0.T, x1, x2",
      "pseudocode": "for i = 0 to VL/esize-1\n  Pd[i] ← (Xn <= Xm)"
    },
    {
      "mnemonic": "add",
      "architecture": "ARMv8-A",
      "full_name": "SVE Integer Add (Predicated)",
      "summary": "Adds two vectors under predicate control.",
      "syntax": "ADD <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Integer Binary",
        "binary_pattern": "00000100 | size | 000 | 00 | 0 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x04000000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src1"
        },
        {
          "name": "Pg",
          "desc": "Merge Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE Integer Add (Predicated) adds two scalable vector registers Zdn and Zm element-wise under predicate control, storing the result back in Zdn. Elements not selected by the predicate Pg are unchanged (merge behavior). The element type T is determined by the sz encoding (8, 16, 32, or 64 bits). Condition flags are not modified.",
      "example": "ADD z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i in 0 to VL/element_width - 1:\n  if Pg[i] == 1:\n    Zdn[i] ← Zdn[i] + Zm[i]\n  // else: Zdn[i] remains unchanged"
    },
    {
      "mnemonic": "sub",
      "architecture": "ARMv8-A",
      "full_name": "SVE Integer Subtract (Predicated)",
      "summary": "Subtracts vector Zm from Zdn under predicate.",
      "syntax": "SUB <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Integer Binary",
        "binary_pattern": "00000100 | size | 000 | 00 | 1 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x04010000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src1"
        },
        {
          "name": "Pg",
          "desc": "Merge Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE Integer Subtract (Predicated) subtracts the scalable vector register Zm from Zdn element-wise under predicate control, storing the result back in Zdn. Elements not selected by the predicate Pg are unchanged (merge behavior). The element type T is determined by the sz encoding (8, 16, 32, or 64 bits). Condition flags are not modified.",
      "example": "SUB z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i in 0 to VL/element_width - 1:\n  if Pg[i] == 1:\n    Zdn[i] ← Zdn[i] - Zm[i]\n  // else: Zdn[i] remains unchanged"
    },
    {
      "mnemonic": "mul",
      "architecture": "ARMv8-A",
      "full_name": "SVE Integer Multiply (Predicated)",
      "summary": "Multiplies two vectors under predicate.",
      "syntax": "MUL <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Integer Binary",
        "binary_pattern": "00000100 | size | 0100 | 0 | 0 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x04100000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src1"
        },
        {
          "name": "Pg",
          "desc": "Merge Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE Integer Multiply (Predicated) multiplies two scalable vector registers Zdn and Zm element-wise under predicate control, storing the result back in Zdn. Elements not selected by the predicate Pg are unchanged (merge behavior). The element type T is determined by the sz encoding (8, 16, 32, or 64 bits). Condition flags are not modified.",
      "example": "MUL z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i in 0 to VL/element_width - 1:\n  if Pg[i] == 1:\n    Zdn[i] ← Zdn[i] * Zm[i]\n  // else: Zdn[i] remains unchanged"
    },
    {
      "mnemonic": "sel",
      "architecture": "ARMv8-A",
      "full_name": "SVE Select Elements",
      "summary": "Selects elements from Zn or Zm based on predicate.",
      "syntax": "SEL <Zd>.<T>, <Pg>, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Select",
        "binary_pattern": "00000101 | size | 1 | Zm | 11 | Pv | Zn | Zd",
        "hex_opcode": "0x0520C000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Pv",
            "clean": "Pv"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:14 | 13:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Selector"
        },
        {
          "name": "Zn",
          "desc": "True Src"
        },
        {
          "name": "Zm",
          "desc": "False Src"
        }
      ],
      "extension": "SVE",
      "description": "Conditionally selects elements from two source vectors based on a predicate mask, placing results in the destination vector. For each element, if the predicate bit is set, the element from Zn is selected; otherwise, the element from Zm is selected. Operates on elements of type T and no flags are affected. This is an AArch64-only SVE instruction.",
      "example": "SEL z0.s.T, p0/m, z1.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/esize-1\n  if Pg[i] then\n    Zd[i] ← Zn[i]\n  else\n    Zd[i] ← Zm[i]"
    },
    {
      "mnemonic": "index",
      "architecture": "ARMv8-A",
      "full_name": "SVE Create Index Vector",
      "summary": "Generates a vector of indices: V[i] = Start + i * Step.",
      "syntax": "INDEX <Zd>.<T>, <Start>, <Step>",
      "encoding": {
        "format": "SVE Index",
        "binary_pattern": "00000100 | size | 1 | Rm | 010011 | Rn | Zd",
        "hex_opcode": "0x04204C00",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "010011",
            "clean": "010011"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Start",
          "desc": "Scalar/Imm"
        },
        {
          "name": "Step",
          "desc": "Scalar/Imm"
        }
      ],
      "extension": "SVE",
      "description": "Generates an index vector where each element contains a value computed as Start + element_index × Step. The Start and Step operands may be immediate values or scalar registers. Operates on elements of type T and no flags are affected. This is an AArch64-only SVE instruction.",
      "example": "INDEX z0.s.T, Start, Step",
      "pseudocode": "for i = 0 to VL/esize-1\n  Zd[i] ← Start + (i * Step)"
    },
    {
      "mnemonic": "dup",
      "architecture": "ARMv8-A",
      "full_name": "SVE Duplicate Scalar",
      "summary": "Broadcasts a scalar register or immediate to all active vector elements.",
      "syntax": "DUP <Zd>.<T>, <R><n|m>",
      "encoding": {
        "format": "SVE Move",
        "binary_pattern": "00000101 | size | 100000001110 | Rn | Zd",
        "hex_opcode": "0x05203800",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "100000001110",
            "clean": "100000001110"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Rn",
          "desc": "Source GPR"
        }
      ],
      "extension": "SVE",
      "description": "Broadcasts a scalar value from a general-purpose register to all elements of a vector. The destination register Zd is set to replicate the source scalar across all elements of type T without predication. No flags are affected. This is an AArch64-only SVE instruction.",
      "example": "DUP z0.s.T, Rn",
      "pseudocode": "for i = 0 to VL/esize-1\n  Zd[i] ← Rn"
    },
    {
      "mnemonic": "cpy",
      "architecture": "ARMv8-A",
      "full_name": "SVE Copy (Predicated)",
      "summary": "Copies scalar value to active vector elements (Alias for DUP predicated).",
      "syntax": "CPY <Zd>.<T>, <Pg>/M, <R><n>",
      "encoding": {
        "format": "SVE Move",
        "binary_pattern": "00000101 | size | 100000100 | Pg | Vn | Zd",
        "hex_opcode": "0x0528A000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "100000100",
            "clean": "100000100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "SVE",
      "description": "Copies a scalar value from a general-purpose register to active elements of a vector under predicate control. Only elements where the predicate is true are updated; inactive elements remain unchanged. Operates on elements of type T and no flags are affected. This is an AArch64-only SVE instruction.",
      "example": "CPY z0.s.T, p0/m/M, Rn",
      "pseudocode": "for i = 0 to VL/esize-1\n  if Pg[i] then\n    Zd[i] ← Rn"
    },
    {
      "mnemonic": "incb",
      "architecture": "ARMv8-A",
      "full_name": "SVE Increment Scalar by Byte Count",
      "summary": "Increments a general-purpose register by the number of active bytes in the pattern.",
      "syntax": "INCB <Xdn>, <pattern> {, MUL #<imm>}",
      "encoding": {
        "format": "SVE Inc/Dec",
        "binary_pattern": "00000100 | 0 | 0 | 11 | imm4 | 11100 | 0 | pattern | Rdn",
        "hex_opcode": "0x0430E000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "11100",
            "clean": "11100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "pattern",
            "clean": "pattern"
          },
          {
            "raw": "Rdn",
            "clean": "Rdn"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xdn",
          "desc": "Register"
        },
        {
          "name": "pattern",
          "desc": "Predicate Pattern"
        }
      ],
      "extension": "SVE",
      "description": "Increments a 64-bit general-purpose register by the count of active bytes matching the specified pattern, optionally scaled by an immediate multiplier. The pattern defines which byte positions are considered active (e.g., all bytes, even bytes, etc.). No condition flags are affected. This is an AArch64-only SVE instruction.",
      "example": "INCB Xdn, pattern",
      "pseudocode": "Xdn ← Xdn + (CountActiveBytes(pattern) × (1 + imm4))"
    },
    {
      "mnemonic": "incw",
      "architecture": "ARMv8-A",
      "full_name": "SVE Increment Scalar by Word Count",
      "summary": "Increments a register by the number of active words.",
      "syntax": "INCW <Xdn>, <pattern> {, MUL #<imm>}",
      "encoding": {
        "format": "SVE Inc/Dec",
        "binary_pattern": "00000100 | 1 | 0 | 11 | imm4 | 11100 | 0 | pattern | Rdn",
        "hex_opcode": "0x04B0E000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "11100",
            "clean": "11100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "pattern",
            "clean": "pattern"
          },
          {
            "raw": "Rdn",
            "clean": "Rdn"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xdn",
          "desc": "Register"
        },
        {
          "name": "pattern",
          "desc": "Predicate Pattern"
        }
      ],
      "extension": "SVE",
      "description": "Increments a 64-bit general-purpose register by the count of active words matching the specified pattern, optionally scaled by an immediate multiplier. The pattern defines which word positions are considered active. No condition flags are affected. This is an AArch64-only SVE instruction.",
      "example": "INCW Xdn, pattern",
      "pseudocode": "Xdn ← Xdn + (CountActiveWords(pattern) × (1 + imm4))"
    },
    {
      "mnemonic": "incd",
      "architecture": "ARMv8-A",
      "full_name": "SVE Increment Scalar by Doubleword Count",
      "summary": "Increments a register by the number of active doublewords.",
      "syntax": "INCD <Xdn>, <pattern> {, MUL #<imm>}",
      "encoding": {
        "format": "SVE Inc/Dec",
        "binary_pattern": "00000100 | 1 | 1 | 11 | imm4 | 11100 | 0 | pattern | Rdn",
        "hex_opcode": "0x04F0E000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "11100",
            "clean": "11100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "pattern",
            "clean": "pattern"
          },
          {
            "raw": "Rdn",
            "clean": "Rdn"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xdn",
          "desc": "Register"
        },
        {
          "name": "pattern",
          "desc": "Predicate Pattern"
        }
      ],
      "extension": "SVE",
      "description": "Increments a 64-bit scalar register by the count of active doublewords in the SVE vector length, optionally multiplied by an immediate. The increment amount is calculated as VL/8 (number of 64-bit elements) times an optional multiplier (1-16). No condition flags are affected. AArch64-only instruction requiring SVE extension.",
      "example": "INCD Xdn, pattern",
      "pseudocode": "count ← CountActiveDoublewords(pattern)\nmultiplier ← imm4 if imm4 != 0 else 1\nXdn ← Xdn + (count * multiplier)"
    },
    {
      "mnemonic": "decb",
      "architecture": "ARMv8-A",
      "full_name": "SVE Decrement Scalar by Byte Count",
      "summary": "Decrements a register by the number of active bytes.",
      "syntax": "DECB <Xdn>, <pattern> {, MUL #<imm>}",
      "encoding": {
        "format": "SVE Inc/Dec",
        "binary_pattern": "00000100 | 0 | 0 | 11 | imm4 | 11100 | 1 | pattern | Rdn",
        "hex_opcode": "0x0430E400",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "11100",
            "clean": "11100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "pattern",
            "clean": "pattern"
          },
          {
            "raw": "Rdn",
            "clean": "Rdn"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xdn",
          "desc": "Register"
        },
        {
          "name": "pattern",
          "desc": "Predicate Pattern"
        }
      ],
      "extension": "SVE",
      "description": "Decrements a 64-bit scalar register by the count of active bytes in the SVE vector length, optionally multiplied by an immediate. The decrement amount is calculated as VL/1 (number of byte elements) times an optional multiplier (1-16). No condition flags are affected. AArch64-only instruction requiring SVE extension.",
      "example": "DECB Xdn, pattern",
      "pseudocode": "count ← CountActiveBytes(pattern)\nmultiplier ← imm4 if imm4 != 0 else 1\nXdn ← Xdn - (count * multiplier)"
    },
    {
      "mnemonic": "decw",
      "architecture": "ARMv8-A",
      "full_name": "SVE Decrement Scalar by Word Count",
      "summary": "Decrements a register by the number of active words.",
      "syntax": "DECW <Xdn>, <pattern> {, MUL #<imm>}",
      "encoding": {
        "format": "SVE Inc/Dec",
        "binary_pattern": "00000100 | 1 | 0 | 11 | imm4 | 11100 | 1 | pattern | Rdn",
        "hex_opcode": "0x04B0E400",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "11100",
            "clean": "11100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "pattern",
            "clean": "pattern"
          },
          {
            "raw": "Rdn",
            "clean": "Rdn"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xdn",
          "desc": "Register"
        },
        {
          "name": "pattern",
          "desc": "Predicate Pattern"
        }
      ],
      "extension": "SVE",
      "description": "Decrements a 64-bit scalar register by the count of active words in the SVE vector length, optionally multiplied by an immediate. The decrement amount is calculated as VL/4 (number of 32-bit elements) times an optional multiplier (1-16). No condition flags are affected. AArch64-only instruction requiring SVE extension.",
      "example": "DECW Xdn, pattern",
      "pseudocode": "count ← CountActiveWords(pattern)\nmultiplier ← imm4 if imm4 != 0 else 1\nXdn ← Xdn - (count * multiplier)"
    },
    {
      "mnemonic": "decd",
      "architecture": "ARMv8-A",
      "full_name": "SVE Decrement Scalar by Doubleword Count",
      "summary": "Decrements a register by the number of active doublewords.",
      "syntax": "DECD <Xdn>, <pattern> {, MUL #<imm>}",
      "encoding": {
        "format": "SVE Inc/Dec",
        "binary_pattern": "00000100 | 1 | 1 | 11 | imm4 | 11100 | 1 | pattern | Rdn",
        "hex_opcode": "0x04F0E400",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "11100",
            "clean": "11100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "pattern",
            "clean": "pattern"
          },
          {
            "raw": "Rdn",
            "clean": "Rdn"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xdn",
          "desc": "Register"
        },
        {
          "name": "pattern",
          "desc": "Predicate Pattern"
        }
      ],
      "extension": "SVE",
      "description": "Decrements a 64-bit scalar register by the count of active doublewords in the SVE vector length, optionally multiplied by an immediate. The decrement amount is calculated as VL/8 (number of 64-bit elements) times an optional multiplier (1-16). No condition flags are affected. AArch64-only instruction requiring SVE extension.",
      "example": "DECD Xdn, pattern",
      "pseudocode": "count ← CountActiveDoublewords(pattern)\nmultiplier ← imm4 if imm4 != 0 else 1\nXdn ← Xdn - (count * multiplier)"
    },
    {
      "mnemonic": "and",
      "architecture": "ARMv8-A",
      "full_name": "SVE Bitwise AND (Predicated)",
      "summary": "Bitwise AND of two vectors under predicate.",
      "syntax": "AND <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Logic",
        "binary_pattern": "00000100 | size | 011 | 01 | 0 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x041A0000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Performs element-wise bitwise AND between two SVE vector registers under predicate control. Only elements where the corresponding predicate bit is 1 are updated; others are left unchanged. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "AND z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/esize-1 do\n  if Pg[i] then\n    Zdn[i*esize +: esize] ← Zdn[i*esize +: esize] AND Zm[i*esize +: esize]\n  else\n    // element unchanged\nendfor"
    },
    {
      "mnemonic": "orr",
      "architecture": "ARMv8-A",
      "full_name": "SVE Bitwise OR (Predicated)",
      "summary": "Bitwise OR of two vectors under predicate.",
      "syntax": "ORR <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Logic",
        "binary_pattern": "00000100 | size | 011 | 00 | 0 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x04180000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Performs element-wise bitwise OR between two SVE vector registers under predicate control. Only elements where the corresponding predicate bit is 1 are updated; others are left unchanged. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "ORR z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/esize-1 do\n  if Pg[i] then\n    Zdn[i*esize +: esize] ← Zdn[i*esize +: esize] OR Zm[i*esize +: esize]\n  else\n    // element unchanged\nendfor"
    },
    {
      "mnemonic": "eor",
      "architecture": "ARMv8-A",
      "full_name": "SVE Bitwise Exclusive OR (Predicated)",
      "summary": "Bitwise XOR of two vectors under predicate.",
      "syntax": "EOR <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Logic",
        "binary_pattern": "00000100 | size | 011 | 00 | 1 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x04190000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Performs element-wise bitwise exclusive OR (XOR) between two SVE vector registers under predicate control. Only elements where the corresponding predicate bit is 1 are updated; others are left unchanged. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "EOR z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/esize-1 do\n  if Pg[i] then\n    Zdn[i*esize +: esize] ← Zdn[i*esize +: esize] EOR Zm[i*esize +: esize]\n  else\n    // element unchanged\nendfor"
    },
    {
      "mnemonic": "bic",
      "architecture": "ARMv8-A",
      "full_name": "SVE Bitwise Bit Clear (Predicated)",
      "summary": "Bitwise AND NOT of two vectors under predicate.",
      "syntax": "BIC <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Logic",
        "binary_pattern": "00000100 | size | 011 | 01 | 1 | 000 | Pg | Zm | Zdn",
        "hex_opcode": "0x041B0000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Performs element-wise bitwise AND with inverted second operand (AND NOT) between two SVE vector registers under predicate control. Only elements where the corresponding predicate bit is 1 are updated; others are left unchanged. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "BIC z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/esize-1 do\n  if Pg[i] then\n    Zdn[i*esize +: esize] ← Zdn[i*esize +: esize] AND NOT Zm[i*esize +: esize]\n  else\n    // element unchanged\nendfor"
    },
    {
      "mnemonic": "fadd",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Add",
      "summary": "Adds floating-point elements under predicate.",
      "syntax": "FADD <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE FP Binary",
        "binary_pattern": "01100101 | size | 0 | Zm | 000 | 00 | 0 | Zn | Zd",
        "hex_opcode": "0x65000000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Adds corresponding floating-point elements in Zdn and Zm, writing results back to Zdn under the control of predicate Pg in merging mode. The operation is performed element-by-element on 32-bit, 64-bit, or 16-bit (half-precision) floating-point values as indicated by the type specifier. No condition flags are affected; inactive elements are preserved in Zdn. AArch64-only instruction requiring SVE extension.",
      "example": "FADD z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i ← 0 to VL/esize - 1\n  if Pg[i] == 1 then\n    Zdn[i] ← Zdn[i] + Zm[i]\n  else\n    Zdn[i] ← Zdn[i]  // unchanged"
    },
    {
      "mnemonic": "fsub",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Subtract",
      "summary": "Subtracts floating-point elements under predicate.",
      "syntax": "FSUB <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE FP Binary",
        "binary_pattern": "01100101 | size | 00 | 000 | 1 | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x65018000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:20 | 19:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Subtracts corresponding floating-point elements (Zm from Zdn), writing results back to Zdn under the control of predicate Pg in merging mode. The operation is performed element-by-element on 32-bit, 64-bit, or 16-bit (half-precision) floating-point values as indicated by the type specifier. No condition flags are affected; inactive elements are preserved in Zdn. AArch64-only instruction requiring SVE extension.",
      "example": "FSUB z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i ← 0 to VL/esize - 1\n  if Pg[i] == 1 then\n    Zdn[i] ← Zdn[i] - Zm[i]\n  else\n    Zdn[i] ← Zdn[i]  // unchanged"
    },
    {
      "mnemonic": "fmul",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Multiply",
      "summary": "Multiplies floating-point elements under predicate.",
      "syntax": "FMUL <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE FP Binary",
        "binary_pattern": "01100101 | size | 00 | 001 | 0 | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x65028000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:20 | 19:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Multiplies corresponding floating-point elements in Zdn and Zm, writing results back to Zdn under the control of predicate Pg in merging mode. The operation is performed element-by-element on 32-bit, 64-bit, or 16-bit (half-precision) floating-point values as indicated by the type specifier. No condition flags are affected; inactive elements are preserved in Zdn. AArch64-only instruction requiring SVE extension.",
      "example": "FMUL z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i ← 0 to VL/esize - 1\n  if Pg[i] == 1 then\n    Zdn[i] ← Zdn[i] * Zm[i]\n  else\n    Zdn[i] ← Zdn[i]  // unchanged"
    },
    {
      "mnemonic": "fdiv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Divide",
      "summary": "Divides floating-point elements under predicate.",
      "syntax": "FDIV <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE FP Binary",
        "binary_pattern": "01100101 | size | 00 | 110 | 1 | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x650D8000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:20 | 19:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Divides corresponding floating-point elements (Zdn by Zm), writing results back to Zdn under the control of predicate Pg in merging mode. The operation is performed element-by-element on 32-bit, 64-bit, or 16-bit (half-precision) floating-point values as indicated by the type specifier. No condition flags are affected; inactive elements are preserved in Zdn. Division by zero produces a signed infinity or NaN according to IEEE floating-point semantics. AArch64-only instruction requiring SVE extension.",
      "example": "FDIV z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i ← 0 to VL/esize - 1\n  if Pg[i] == 1 then\n    Zdn[i] ← Zdn[i] / Zm[i]\n  else\n    Zdn[i] ← Zdn[i]  // unchanged"
    },
    {
      "mnemonic": "fmax",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Maximum",
      "summary": "Determines maximum value of active float elements.",
      "syntax": "FMAX <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE FP Binary",
        "binary_pattern": "01100101 | size | 00 | 011 | 0 | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x65068000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:20 | 19:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE floating-point maximum operation that computes element-wise maximum of two scalable vectors under predicate control. For each active element in the predicate mask, the larger of the two floating-point values is written to the destination. Inactive elements (where the predicate is false) are left unchanged in the destination register. NZCV flags are not affected by this instruction.",
      "example": "FMAX z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/element_size-1:\n  if Pg[i] then\n    Zdn[i] ← max(Zdn[i], Zm[i])\n  else\n    Zdn[i] ← Zdn[i]"
    },
    {
      "mnemonic": "fmin",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Minimum",
      "summary": "Determines minimum value of active float elements.",
      "syntax": "FMIN <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE FP Binary",
        "binary_pattern": "01100101 | size | 00 | 011 | 1 | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x65078000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:20 | 19:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Combined destination/source scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE floating-point minimum operation that computes element-wise minimum of two scalable vectors under predicate control. For each active element in the predicate mask, the smaller of the two floating-point values is written to the destination. Inactive elements (where the predicate is false) are left unchanged in the destination register. NZCV flags are not affected by this instruction.",
      "example": "FMIN z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/element_size-1:\n  if Pg[i] then\n    Zdn[i] ← min(Zdn[i], Zm[i])\n  else\n    Zdn[i] ← Zdn[i]"
    },
    {
      "mnemonic": "fmla",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Fused Multiply-Add",
      "summary": "Calculates (Zda + Zn * Zm) under predicate.",
      "syntax": "FMLA <Zda>.<T>, <Pg>/M, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE FP Ternary",
        "binary_pattern": "01100101 | size | 1 | Zm | 0 | 0 | 0 | Pg | Zn | Zda",
        "hex_opcode": "0x65200000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zda",
            "clean": "Zda"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15 | 14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zda",
          "desc": "Dest/Addend"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE floating-point fused multiply-add instruction that computes Zda + (Zn × Zm) for each element under predicate control, with a single rounding step at the end. Inactive elements (where the predicate is false) are left unchanged in the destination. This instruction performs true fusedoperation with only one rounding error, unlike separate multiply and add instructions. NZCV flags are not affected.",
      "example": "FMLA z0.s.T, p0/m/M, z1.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/element_size-1:\n  if Pg[i] then\n    Zda[i] ← Zda[i] + (Zn[i] × Zm[i])\n  else\n    Zda[i] ← Zda[i]"
    },
    {
      "mnemonic": "fmls",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Fused Multiply-Subtract",
      "summary": "Calculates (Zda - Zn * Zm) under predicate.",
      "syntax": "FMLS <Zda>.<T>, <Pg>/M, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE FP Ternary",
        "binary_pattern": "01100101 | size | 1 | Zm | 0 | 0 | 1 | Pg | Zn | Zda",
        "hex_opcode": "0x65202000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zda",
            "clean": "Zda"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15 | 14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zda",
          "desc": "Dest/Minuend"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE floating-point fused multiply-subtract instruction that computes Zda - (Zn × Zm) for each element under predicate control, with a single rounding step at the end. Inactive elements (where the predicate is false) are left unchanged in the destination. This instruction performs true fused operation with only one rounding error, unlike separate multiply and subtract instructions. NZCV flags are not affected.",
      "example": "FMLS z0.s.T, p0/m/M, z1.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/element_size-1:\n  if Pg[i] then\n    Zda[i] ← Zda[i] - (Zn[i] × Zm[i])\n  else\n    Zda[i] ← Zda[i]"
    },
    {
      "mnemonic": "uaddv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Unsigned Integer Add Reduction",
      "summary": "Sums all active unsigned elements into a scalar result.",
      "syntax": "UADDV <Vd>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Reduction",
        "binary_pattern": "00000100 | size | 0000 | 0 | 1 | 001 | Pg | Zn | Vd",
        "hex_opcode": "0x04012000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "SVE unsigned integer addition reduction that sums all active elements in the source vector under predicate control and writes the scalar result to the destination. The destination is a general-purpose scalar register sized according to the element type. Elements where the predicate is false are excluded from the sum. NZCV flags are not affected by this reduction.",
      "example": "UADDV v0.4s, p0/m, z1.s.T",
      "pseudocode": "result ← 0\nfor i = 0 to VL/element_size-1:\n  if Pg[i] then\n    result ← result + Zn[i]\nVd ← result"
    },
    {
      "mnemonic": "faddv",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Add Reduction",
      "summary": "Sums all active floating-point elements into a scalar result.",
      "syntax": "FADDV <Vd>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Reduction",
        "binary_pattern": "01100101 | size | 000 | 00 | 0 | 001 | Pg | Zn | Vd",
        "hex_opcode": "0x65002000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest Scalar"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "Vector"
        }
      ],
      "extension": "SVE",
      "description": "SVE floating-point addition reduction that sums all active floating-point elements in the source vector under predicate control and writes the scalar result to the destination. The destination is a floating-point scalar register sized according to the element type. Elements where the predicate is false are excluded from the sum. Reductions are performed with strict left-to-right ordering for reproducibility. NZCV flags are not affected.",
      "example": "FADDV v0.4s, p0/m, z1.s.T",
      "pseudocode": "result ← 0.0\nfor i = 0 to VL/element_size-1:\n  if Pg[i] then\n    result ← result + Zn[i]\nVd ← result"
    },
    {
      "mnemonic": "pnext",
      "architecture": "ARMv8-A",
      "full_name": "SVE Find Next Active Predicate",
      "summary": "Finds the next active predicate bit.",
      "syntax": "PNEXT <Pdn>.<T>, <Pg>, <Pdn>.<T>",
      "encoding": {
        "format": "SVE Predicate",
        "binary_pattern": "00100101 | size | 011001110001 | 0 | Pv | 0 | Pdn",
        "hex_opcode": "0x2519C400",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "011001110001",
            "clean": "011001110001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pv",
            "clean": "Pv"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pdn",
            "clean": "Pdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:10 | 9 | 8:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pdn",
          "desc": "Dest/Src"
        },
        {
          "name": "Pg",
          "desc": "Governing Pred"
        }
      ],
      "extension": "SVE",
      "description": "SVE predicate find-next instruction that scans the source predicate register for the next active bit after the position currently set in the predicate, under control of the governing predicate. The destination predicate is updated to indicate the position of the next active element. Sets the Z flag if no further active element is found. This instruction is useful for iterating through active predicate elements.",
      "example": "PNEXT p0.T, p0/m, p0.T",
      "pseudocode": "next_pos ← -1\nfor i = 0 to VL-1:\n  if Pg[i] ∧ Pdn[i] then\n    for j = i+1 to VL-1:\n      if Pg[j] ∧ Pdn[j] then\n        next_pos ← j\n        break\n    break\nif next_pos ≥ 0 then\n  Pdn ← (1 << next_pos)\n  Z ← 0\nelse\n  Pdn ← 0\n  Z ← 1"
    },
    {
      "mnemonic": "brka",
      "architecture": "ARMv8-A",
      "full_name": "SVE Break After First True",
      "summary": "Sets predicates up to and including the first active element.",
      "syntax": "BRKA <Pd>.B, <Pg>/Z, <Pn>.B",
      "encoding": {
        "format": "SVE Predicate",
        "binary_pattern": "00100101 | 0 | 0 | 01000001 | Pg | 0 | Pn | M | Pd",
        "hex_opcode": "0x25104000",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01000001",
            "clean": "01000001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pn",
            "clean": "Pn"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:14 | 13:10 | 9 | 8:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Destination predicate register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Limit"
        },
        {
          "name": "Pn",
          "desc": "First source predicate register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE break-after instruction that creates a new predicate containing all bits from the first active bit (inclusive) up to and including the first false bit in the input predicate, under control of the governing predicate. The destination predicate contains a contiguous sequence of true bits starting from the first true bit in the source. Sets the Z flag if no active bits are found in the input. This is useful for creating masks that break execution at the first false element.",
      "example": "BRKA p0.B, p0/m/Z, p1.B",
      "pseudocode": "first_true ← -1\nfor i = 0 to VL-1:\n  if Pg[i] ∧ Pn[i] then\n    first_true ← i\n    break\nif first_true ≥ 0 then\n  Pd ← 0\n  for i = first_true to VL-1:\n    if Pg[i] then\n      Pd[i] ← 1\n      if ¬Pn[i] then\n        break\n  Z ← 0\nelse\n  Pd ← 0\n  Z ← 1"
    },
    {
      "mnemonic": "brkb",
      "architecture": "ARMv8-A",
      "full_name": "SVE Break Before First True",
      "summary": "Sets predicates up to (but excluding) the first active element.",
      "syntax": "BRKB <Pd>.B, <Pg>/Z, <Pn>.B",
      "encoding": {
        "format": "SVE Predicate",
        "binary_pattern": "00100101 | 1 | 0 | 01000001 | Pg | 0 | Pn | M | Pd",
        "hex_opcode": "0x25904000",
        "visual_parts": [
          {
            "raw": "00100101",
            "clean": "00100101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01000001",
            "clean": "01000001"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pn",
            "clean": "Pn"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:14 | 13:10 | 9 | 8:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Destination predicate register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Limit"
        },
        {
          "name": "Pn",
          "desc": "First source predicate register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE Break Before First True sets all predicate elements up to (but excluding) the first active element in Pn (as governed by Pg) to 1, and all subsequent elements to 0. The instruction is used to isolate processing before the first true element in a predicate. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "BRKB p0.B, p0/m/Z, p1.B",
      "pseudocode": "integer esize = 8;\ninteger elements = VL / esize;\ninteger g = 0;\nfor e = 0 to elements-1\n  if Pg[e] == '1' and Pn[e] == '1' and g == 0 then\n    g = 1;\n  if g == 0 then\n    Pd[e] = '1';\n  else\n    Pd[e] = '0';"
    },
    {
      "mnemonic": "compact",
      "architecture": "ARMv8-A",
      "full_name": "SVE Compact Vector",
      "summary": "Packs active elements to the bottom of the vector.",
      "syntax": "COMPACT <Zd>.<T>, <Pg>, <Zn>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 100001100 | Pg | Zn | Zd",
        "hex_opcode": "0x05218000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "100001100",
            "clean": "100001100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE Compact Vector permutes the vector Zn such that all elements for which the corresponding predicate bit in Pg is 1 are packed contiguously at the low end of Zd, in order, with remaining elements zeroed. This operation is useful for gathering active elements. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "COMPACT z0.s.T, p0/m, z1.s.T",
      "pseudocode": "integer esize = 8 << UInt(sz);\ninteger elements = VL / esize;\ninteger dst_index = 0;\nfor e = 0 to elements-1\n  if Pg[e] == '1' then\n    Zd[dst_index * esize +: esize] = Zn[e * esize +: esize];\n    dst_index = dst_index + 1;\nfor e = dst_index to elements-1\n  Zd[e * esize +: esize] = 0;"
    },
    {
      "mnemonic": "splice",
      "architecture": "ARMv8-A",
      "full_name": "SVE Splice Vectors",
      "summary": "Splices two vectors based on the last active element of the first.",
      "syntax": "SPLICE <Zdn>.<T>, <Pg>, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 101100100 | Pv | Zm | Zdn",
        "hex_opcode": "0x052C8000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "101100100",
            "clean": "101100100"
          },
          {
            "raw": "Pv",
            "clean": "Pv"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/First"
        },
        {
          "name": "Pg",
          "desc": "Predicate"
        },
        {
          "name": "Zm",
          "desc": "Second"
        }
      ],
      "extension": "SVE",
      "description": "SVE Splice Vectors concatenates Zdn and Zm, then extracts a contiguous segment starting from the element position immediately after the last active element in Zdn (as determined by Pg), storing the result back in Zdn. This is used to splice vector sequences. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "SPLICE z0.s.T, p0/m, z0.s.T, z2.s.T",
      "pseudocode": "integer esize = 8 << UInt(sz);\ninteger elements = VL / esize;\ninteger last_active = -1;\nfor e = 0 to elements-1\n  if Pg[e] == '1' then\n    last_active = e;\ninteger start_pos = last_active + 1;\nfor e = 0 to elements-1\n  if (start_pos + e) < elements then\n    Zdn[e * esize +: esize] = Zdn[(start_pos + e) * esize +: esize];\n  else\n    Zdn[e * esize +: esize] = Zm[(start_pos + e - elements) * esize +: esize];"
    },
    {
      "mnemonic": "tbl",
      "architecture": "ARMv8-A",
      "full_name": "SVE Table Lookup",
      "summary": "Looks up elements in a vector table using indices.",
      "syntax": "TBL <Zd>.<T>, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1 | Zm | 001100 | Zn | Zd",
        "hex_opcode": "0x05203000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "001100",
            "clean": "001100"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Zn",
          "desc": "Table"
        },
        {
          "name": "Zm",
          "desc": "Indices"
        }
      ],
      "extension": "SVE",
      "description": "SVE Table Lookup performs a vector table lookup where Zn acts as a table and Zm contains indices; Zd receives the looked-up elements. Out-of-range indices produce zero. This operation is element-wise and unpredicated. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "TBL z0.s.T, z1.s.T, z2.s.T",
      "pseudocode": "integer esize = 8 << UInt(sz);\ninteger elements = VL / esize;\nfor e = 0 to elements-1\n  integer index = UInt(Zm[e * esize +: esize]);\n  if index < elements then\n    Zd[e * esize +: esize] = Zn[index * esize +: esize];\n  else\n    Zd[e * esize +: esize] = 0;"
    },
    {
      "mnemonic": "trn1",
      "architecture": "ARMv8-A",
      "full_name": "SVE Transpose 1",
      "summary": "Interleaves even elements from two vectors.",
      "syntax": "TRN1 <Zd>.<T>, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1 | Zm | 011 | 10 | 0 | Zn | Zd",
        "hex_opcode": "0x05207000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE Transpose 1 interleaves elements from Zn and Zm, selecting even-indexed elements (0, 2, 4, ...) from the conceptual concatenation of Zn and Zm, placing them into Zd. This is an unpredicated operation commonly used for data rearrangement. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "TRN1 z0.s.T, z1.s.T, z2.s.T",
      "pseudocode": "integer esize = 8 << UInt(sz);\ninteger elements = VL / esize;\nfor e = 0 to elements-1\n  integer src_index = 2 * e;\n  if src_index < elements then\n    Zd[e * esize +: esize] = Zn[src_index * esize +: esize];\n  else\n    Zd[e * esize +: esize] = Zm[(src_index - elements) * esize +: esize];"
    },
    {
      "mnemonic": "trn2",
      "architecture": "ARMv8-A",
      "full_name": "SVE Transpose 2",
      "summary": "Interleaves odd elements from two vectors.",
      "syntax": "TRN2 <Zd>.<T>, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1 | Zm | 011 | 10 | 1 | Zn | Zd",
        "hex_opcode": "0x05207400",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE Transpose 2 interleaves elements from Zn and Zm, selecting odd-indexed elements (1, 3, 5, ...) from the conceptual concatenation of Zn and Zm, placing them into Zd. This is an unpredicated operation commonly used for data rearrangement. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "TRN2 z0.s.T, z1.s.T, z2.s.T",
      "pseudocode": "integer esize = 8 << UInt(sz);\ninteger elements = VL / esize;\nfor e = 0 to elements-1\n  integer src_index = 2 * e + 1;\n  if src_index < elements then\n    Zd[e * esize +: esize] = Zn[src_index * esize +: esize];\n  else\n    Zd[e * esize +: esize] = Zm[(src_index - elements) * esize +: esize];"
    },
    {
      "mnemonic": "uzp1",
      "architecture": "ARMv8-A",
      "full_name": "SVE Unzip 1",
      "summary": "Selects even elements from concatenated vectors.",
      "syntax": "UZP1 <Zd>.<T>, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1 | Zm | 011 | 01 | 0 | Zn | Zd",
        "hex_opcode": "0x05206800",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE Unzip 1 deinterlaces the concatenation of Zn and Zm by selecting even-indexed elements (0, 2, 4, ...) and packing them into Zd. This is the inverse of a zip/transpose operation. This is an unpredicated operation. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "UZP1 z0.s.T, z1.s.T, z2.s.T",
      "pseudocode": "integer esize = 8 << UInt(sz);\ninteger elements = VL / esize;\nfor e = 0 to elements-1\n  integer src_index = 2 * e;\n  if src_index < elements then\n    Zd[e * esize +: esize] = Zn[src_index * esize +: esize];\n  else\n    Zd[e * esize +: esize] = Zm[(src_index - elements) * esize +: esize];"
    },
    {
      "mnemonic": "uzp2",
      "architecture": "ARMv8-A",
      "full_name": "SVE Unzip 2",
      "summary": "Selects odd elements from concatenated vectors.",
      "syntax": "UZP2 <Zd>.<T>, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1 | Zm | 011 | 01 | 1 | Zn | Zd",
        "hex_opcode": "0x05206C00",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "SVE Unzip 2 deinterlaces the concatenation of Zn and Zm by selecting odd-indexed elements (1, 3, 5, ...) and packing them into Zd. This is the inverse of a zip/transpose operation. This is an unpredicated operation. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "UZP2 z0.s.T, z1.s.T, z2.s.T",
      "pseudocode": "integer esize = 8 << UInt(sz);\ninteger elements = VL / esize;\nfor e = 0 to elements-1\n  integer src_index = 2 * e + 1;\n  if src_index < elements then\n    Zd[e * esize +: esize] = Zn[src_index * esize +: esize];\n  else\n    Zd[e * esize +: esize] = Zm[(src_index - elements) * esize +: esize];"
    },
    {
      "mnemonic": "zip1",
      "architecture": "ARMv8-A",
      "full_name": "SVE Zip 1",
      "summary": "Interleaves elements from the lower halves.",
      "syntax": "ZIP1 <Zd>.<T>, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1 | Zm | 011 | 00 | 0 | Zn | Zd",
        "hex_opcode": "0x05206000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Interleaves elements from the lower halves of two SVE vectors, placing odd-indexed elements from Zn and even-indexed elements from Zm into alternating positions in Zd. This is a data-permutation instruction that does not modify condition flags. Execution is restricted to AArch64 with the SVE extension enabled.",
      "example": "ZIP1 z0.s.T, z1.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/esize-1 step 2\n  Zd[i, esize] ← Zn[i/2, esize]\n  Zd[i+1, esize] ← Zm[i/2, esize]"
    },
    {
      "mnemonic": "zip2",
      "architecture": "ARMv8-A",
      "full_name": "SVE Zip 2",
      "summary": "Interleaves elements from the upper halves.",
      "syntax": "ZIP2 <Zd>.<T>, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Permute",
        "binary_pattern": "00000101 | size | 1 | Zm | 011 | 00 | 1 | Zn | Zd",
        "hex_opcode": "0x05206400",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Interleaves elements from the upper halves of two SVE vectors, placing odd-indexed elements from the upper half of Zn and even-indexed elements from the upper half of Zm into alternating positions in Zd. This is a data-permutation instruction that does not modify condition flags. Execution is restricted to AArch64 with the SVE extension enabled.",
      "example": "ZIP2 z0.s.T, z1.s.T, z2.s.T",
      "pseudocode": "half ← VL / (2 * esize)\nfor i = 0 to VL/esize-1 step 2\n  Zd[i, esize] ← Zn[half + i/2, esize]\n  Zd[i+1, esize] ← Zm[half + i/2, esize]"
    },
    {
      "mnemonic": "lsl",
      "architecture": "ARMv8-A",
      "full_name": "SVE Shift Left (Predicated)",
      "summary": "Shifts elements left under predicate.",
      "syntax": "LSL <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Shift",
        "binary_pattern": "00000100 | size | 010 | 0 | 1 | 1 | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x04138000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Performs element-wise logical shift left on SVE vector elements under predicate control, where the shift amount for each element comes from the corresponding element of Zm. Only elements where the corresponding predicate bit is 1 are updated; others are left unchanged. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "LSL z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/esize-1 do\n  if Pg[i] then\n    shift_amount ← Zm[i*esize +: esize] AND (esize*8-1)\n    Zdn[i*esize +: esize] ← Zdn[i*esize +: esize] << shift_amount\n  else\n    // element unchanged\nendfor"
    },
    {
      "mnemonic": "lsr",
      "architecture": "ARMv8-A",
      "full_name": "SVE Logical Shift Right (Predicated)",
      "summary": "Shifts elements right logically under predicate.",
      "syntax": "LSR <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Shift",
        "binary_pattern": "00000100 | size | 010 | 0 | 0 | 1 | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x04118000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Performs element-wise logical shift right on SVE vector elements under predicate control, where the shift amount for each element comes from the corresponding element of Zm. Shifted-in bits are zeros. Only elements where the corresponding predicate bit is 1 are updated; others are left unchanged. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "LSR z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/esize-1 do\n  if Pg[i] then\n    shift_amount ← Zm[i*esize +: esize] AND (esize*8-1)\n    Zdn[i*esize +: esize] ← Zdn[i*esize +: esize] >> shift_amount\n  else\n    // element unchanged\nendfor"
    },
    {
      "mnemonic": "asr",
      "architecture": "ARMv8-A",
      "full_name": "SVE Arithmetic Shift Right (Predicated)",
      "summary": "Shifts elements right arithmetically under predicate.",
      "syntax": "ASR <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Shift",
        "binary_pattern": "00000100 | size | 010 | 0 | 0 | 0 | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x04108000",
        "visual_parts": [
          {
            "raw": "00000100",
            "clean": "00000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:19 | 18 | 17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Performs element-wise arithmetic shift right on SVE vector elements under predicate control, where the shift amount for each element comes from the corresponding element of Zm. The sign bit is replicated into shifted-in positions. Only elements where the corresponding predicate bit is 1 are updated; others are left unchanged. No condition flags are affected. This is an AArch64-only SVE instruction requiring SVE support.",
      "example": "ASR z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/esize-1 do\n  if Pg[i] then\n    shift_amount ← Zm[i*esize +: esize] AND (esize*8-1)\n    Zdn[i*esize +: esize] ← Zdn[i*esize +: esize] >>> shift_amount\n  else\n    // element unchanged\nendfor"
    },
    {
      "mnemonic": "ld1w",
      "architecture": "ARMv8-A",
      "full_name": "SVE Gather Load Words (Vector Index)",
      "summary": "Loads words from non-contiguous addresses (Scatter-Gather).",
      "syntax": "LD1W { <Zt>.S }, <Pg>/Z, [<Xn|SP>, <Zm>.S, SXTW #<shift>]",
      "encoding": {
        "format": "SVE Gather",
        "binary_pattern": "100001010 | xs | 1 | Zm | 0 | 1 | 0 | Pg | Rn | Zt",
        "hex_opcode": "0x85204000",
        "visual_parts": [
          {
            "raw": "100001010",
            "clean": "100001010"
          },
          {
            "raw": "xs",
            "clean": "xs"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:23 | 22 | 21 | 20:16 | 15 | 14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Transfer scalable vector register (SVE load/store)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Zm",
          "desc": "Indices"
        }
      ],
      "extension": "SVE",
      "description": "Performs a scatter-gather load of 32-bit words from non-contiguous memory addresses computed by adding scaled vector indices to a base address. Elements are loaded only where the corresponding predicate bit in Pg is set; inactive elements in Zt are zeroed. Does not modify condition flags. Execution restricted to AArch64 with SVE extension; may generate memory-access exceptions.",
      "example": "LD1W p0/m/Z, [x1, z2.s.S, SXTW #LSL]",
      "pseudocode": "for i = 0 to VL/32-1\n  if Pg[i] == 1\n    addr ← Xn + (Zm[i] << shift)\n    Zt[i, 32] ← [addr, 32]\n  else\n    Zt[i, 32] ← 0"
    },
    {
      "mnemonic": "st1w",
      "architecture": "ARMv8-A",
      "full_name": "SVE Scatter Store Words (Vector Index)",
      "summary": "Stores words to non-contiguous addresses.",
      "syntax": "ST1W { <Zt>.S }, <Pg>, [<Xn|SP>, <Zm>.S, SXTW #<shift>]",
      "encoding": {
        "format": "SVE Scatter",
        "binary_pattern": "1110010 | 1 | 0 | 11 | Zm | 1 | xs | 0 | Pg | Rn | Zt",
        "hex_opcode": "0xE5608000",
        "visual_parts": [
          {
            "raw": "1110010",
            "clean": "1110010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "xs",
            "clean": "xs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Zt",
            "clean": "Zt"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22:21 | 20:16 | 15 | 14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zt",
          "desc": "Transfer scalable vector register (SVE load/store)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Zm",
          "desc": "Indices"
        }
      ],
      "extension": "SVE",
      "description": "Performs a scatter-gather store of 32-bit words from Zt to non-contiguous memory addresses computed by adding scaled vector indices to a base address. Elements are stored only where the corresponding predicate bit in Pg is set. Does not modify condition flags. Execution restricted to AArch64 with SVE extension; may generate memory-access exceptions.",
      "example": "ST1W p0/m, [x1, z2.s.S, SXTW #LSL]",
      "pseudocode": "for i = 0 to VL/32-1\n  if Pg[i] == 1\n    addr ← Xn + (Zm[i] << shift)\n    [addr, 32] ← Zt[i, 32]"
    },
    {
      "mnemonic": "cmpeq",
      "architecture": "ARMv8-A",
      "full_name": "SVE Compare Equal (Integer)",
      "summary": "Sets predicate bits where elements are equal.",
      "syntax": "CMPEQ <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Compare",
        "binary_pattern": "00100100 | size | 0 | Zm | 1 | 0 | 1 | Pg | Zn | 0 | Pd",
        "hex_opcode": "0x2400A000",
        "visual_parts": [
          {
            "raw": "00100100",
            "clean": "00100100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15 | 14 | 13 | 12:10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Dest Pred"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Performs element-wise equality comparison of signed or unsigned integers in Zn and Zm, setting predicate bits in Pd where elements are equal. Inactive lanes (where Pg is 0) are zeroed in Pd. Does not modify condition flags. Execution restricted to AArch64 with SVE extension.",
      "example": "CMPEQ p0.T, p0/m/Z, z1.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/esize-1\n  if Pg[i] == 1\n    Pd[i] ← (Zn[i, esize] == Zm[i, esize]) ? 1 : 0\n  else\n    Pd[i] ← 0"
    },
    {
      "mnemonic": "cmpgt",
      "architecture": "ARMv8-A",
      "full_name": "SVE Compare Greater Than (Signed)",
      "summary": "Sets predicate bits where Zn > Zm.",
      "syntax": "CMPGT <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE Compare",
        "binary_pattern": "00100100 | size | 0 | Zm | 1 | 0 | 0 | Pg | Zn | 1 | Pd",
        "hex_opcode": "0x24008010",
        "visual_parts": [
          {
            "raw": "00100100",
            "clean": "00100100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15 | 14 | 13 | 12:10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Dest Pred"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Performs element-wise signed greater-than comparison of integers in Zn and Zm, setting predicate bits in Pd where Zn > Zm. Inactive lanes (where Pg is 0) are zeroed in Pd. Does not modify condition flags. Execution restricted to AArch64 with SVE extension.",
      "example": "CMPGT p0.T, p0/m/Z, z1.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/esize-1\n  if Pg[i] == 1\n    Pd[i] ← (Zn[i, esize] signed> Zm[i, esize]) ? 1 : 0\n  else\n    Pd[i] ← 0"
    },
    {
      "mnemonic": "fcmeq",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Compare Equal",
      "summary": "Sets predicate bits where float elements are equal.",
      "syntax": "FCMEQ <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE FP Compare",
        "binary_pattern": "01100101 | size | 0 | Zm | 0 | 1 | 1 | Pg | Zn | 0 | Pd",
        "hex_opcode": "0x65006000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15 | 14 | 13 | 12:10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Dest Pred"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Performs element-wise floating-point equality comparison in Zn and Zm, setting predicate bits in Pd where elements are equal. Inactive lanes (where Pg is 0) are zeroed in Pd. NaN comparisons always return false. Does not modify condition flags. Execution restricted to AArch64 with SVE extension.",
      "example": "FCMEQ p0.s, p1/z, z1.s, z2.s",
      "pseudocode": "for i = 0 to VL/esize-1\n  if Pg[i] == 1\n    Pd[i] ← (Zn[i, esize] == Zm[i, esize]) ? 1 : 0\n  else\n    Pd[i] ← 0"
    },
    {
      "mnemonic": "fcmgt",
      "architecture": "ARMv8-A",
      "full_name": "SVE Floating-Point Compare Greater Than",
      "summary": "Sets predicate bits where float Zn > Zm.",
      "syntax": "FCMGT <Pd>.<T>, <Pg>/Z, <Zn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE FP Compare",
        "binary_pattern": "01100101 | size | 0 | Zm | 0 | 1 | 0 | Pg | Zn | 1 | Pd",
        "hex_opcode": "0x65004010",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Pd",
            "clean": "Pd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15 | 14 | 13 | 12:10 | 9:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Pd",
          "desc": "Dest Pred"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE",
      "description": "Performs element-wise floating-point greater-than comparison in Zn and Zm, setting predicate bits in Pd where Zn > Zm. Inactive lanes (where Pg is 0) are zeroed in Pd. NaN comparisons always return false. Does not modify condition flags. Execution restricted to AArch64 with SVE extension.",
      "example": "FCMGT p0.s, p1/z, z1.s, z2.s",
      "pseudocode": "for i = 0 to VL/esize-1\n  if Pg[i] == 1\n    Pd[i] ← (Zn[i, esize] > Zm[i, esize]) ? 1 : 0\n  else\n    Pd[i] ← 0"
    },
    {
      "mnemonic": "fadd",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Add (Half-Precision)",
      "summary": "Adds two half-precision floating-point vectors.",
      "syntax": "FADD <Vd>.8H, <Vn>.8H, <Vm>.8H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 0 | 01110 | 0 | 10 | Rm | 00 | 010 | 1 | Rn | Rd",
        "hex_opcode": "0x0E401400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:21 | 20:16 | 15:14 | 13:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Adds corresponding half-precision (16-bit) floating-point elements from two NEON vector registers and stores the results in the destination register. Eight elements are processed in parallel. The operation follows IEEE 754 half-precision semantics. No condition flags are set. This is an AArch64 instruction requiring the FEAT_FP16 extension for half-precision floating-point support.",
      "example": "FADD v0.4s.8H, v1.4s.8H, v2.4s.8H",
      "pseudocode": "for i = 0 to 7 do\n  Vd[i*16 +: 16] ← FP16_ADD(Vn[i*16 +: 16], Vm[i*16 +: 16])\nendfor"
    },
    {
      "mnemonic": "fsub",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Subtract (Half-Precision)",
      "summary": "Subtracts two half-precision floating-point vectors.",
      "syntax": "FSUB <Vd>.8H, <Vn>.8H, <Vm>.8H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 0 | 01110 | 1 | 10 | Rm | 00 | 010 | 1 | Rn | Rd",
        "hex_opcode": "0x0EC01400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:21 | 20:16 | 15:14 | 13:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Subtracts half-precision floating-point elements in Vm from corresponding elements in Vn, writing results to Vd. Operates on 8 half-precision (16-bit) floating-point values packed in 128-bit vectors. No condition flags are set by this instruction; floating-point exceptions are determined by FPCR settings. Requires FEAT_FP16 extension; AArch64-only.",
      "example": "FSUB v0.4s.8H, v1.4s.8H, v2.4s.8H",
      "pseudocode": "for i = 0 to 7\n  Vd[i*16 +: 16] ← FP16_Sub(Vn[i*16 +: 16], Vm[i*16 +: 16])"
    },
    {
      "mnemonic": "fmul",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Multiply (Half-Precision)",
      "summary": "Multiplies two half-precision floating-point vectors.",
      "syntax": "FMUL <Vd>.8H, <Vn>.8H, <Vm>.8H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 1 | 01110 | 0 | 10 | Rm | 00 | 011 | 1 | Rn | Rd",
        "hex_opcode": "0x2E401C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:21 | 20:16 | 15:14 | 13:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Multiplies half-precision floating-point elements in Vn by corresponding elements in Vm, writing results to Vd. Operates on 8 half-precision (16-bit) floating-point values packed in 128-bit vectors. No condition flags are affected; floating-point exceptions follow FPCR rounding and exception control settings. Requires FEAT_FP16 extension; AArch64-only.",
      "example": "FMUL v0.4s.8H, v1.4s.8H, v2.4s.8H",
      "pseudocode": "for i = 0 to 7\n  Vd[i*16 +: 16] ← FP16_Mul(Vn[i*16 +: 16], Vm[i*16 +: 16])"
    },
    {
      "mnemonic": "fdiv",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Divide (Half-Precision)",
      "summary": "Divides two half-precision floating-point vectors.",
      "syntax": "FDIV <Vd>.8H, <Vn>.8H, <Vm>.8H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 1 | 01110 | 0 | 10 | Rm | 00 | 111 | 1 | Rn | Rd",
        "hex_opcode": "0x2E403C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:21 | 20:16 | 15:14 | 13:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Divides half-precision floating-point elements in Vn by corresponding elements in Vm, writing quotients to Vd. Operates on 8 half-precision (16-bit) floating-point values packed in 128-bit vectors. No condition flags are affected; division by zero and other floating-point exceptions depend on FPCR settings. Requires FEAT_FP16 extension; AArch64-only.",
      "example": "FDIV v0.4s.8H, v1.4s.8H, v2.4s.8H",
      "pseudocode": "for i = 0 to 7\n  Vd[i*16 +: 16] ← FP16_Div(Vn[i*16 +: 16], Vm[i*16 +: 16])"
    },
    {
      "mnemonic": "fmax",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Maximum (Half-Precision)",
      "summary": "Finds max of half-precision vectors.",
      "syntax": "FMAX <Vd>.8H, <Vn>.8H, <Vm>.8H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 0 | 01110 | 0 | 10 | Rm | 00 | 110 | 1 | Rn | Rd",
        "hex_opcode": "0x0E403400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:21 | 20:16 | 15:14 | 13:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Computes the maximum of half-precision floating-point elements in Vn and Vm element-wise, writing results to Vd. Operates on 8 half-precision (16-bit) values in 128-bit vectors, with NaN handling per IEEE 754 semantics (FPCR controls exact behavior). No condition flags are set; floating-point exceptions depend on FPCR. Requires FEAT_FP16 extension; AArch64-only.",
      "example": "FMAX v0.4s.8H, v1.4s.8H, v2.4s.8H",
      "pseudocode": "for i = 0 to 7\n  Vd[i*16 +: 16] ← FP16_Max(Vn[i*16 +: 16], Vm[i*16 +: 16])"
    },
    {
      "mnemonic": "fmin",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Minimum (Half-Precision)",
      "summary": "Finds min of half-precision vectors.",
      "syntax": "FMIN <Vd>.8H, <Vn>.8H, <Vm>.8H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 0 | 01110 | 1 | 10 | Rm | 00 | 110 | 1 | Rn | Rd",
        "hex_opcode": "0x0EC03400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:21 | 20:16 | 15:14 | 13:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Computes the minimum of half-precision floating-point elements in Vn and Vm element-wise, writing results to Vd. Operates on 8 half-precision (16-bit) values in 128-bit vectors, with NaN handling per IEEE 754 semantics (FPCR controls exact behavior). No condition flags are set; floating-point exceptions depend on FPCR. Requires FEAT_FP16 extension; AArch64-only.",
      "example": "FMIN v0.4s.8H, v1.4s.8H, v2.4s.8H",
      "pseudocode": "for i = 0 to 7\n  Vd[i*16 +: 16] ← FP16_Min(Vn[i*16 +: 16], Vm[i*16 +: 16])"
    },
    {
      "mnemonic": "fmla",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Multiply Accumulate (Half-Precision)",
      "summary": "Fused multiply-add on half-precision vectors.",
      "syntax": "FMLA <Vd>.8H, <Vn>.8H, <Vm>.8H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 0 | 01110 | 0 | 10 | Rm | 00 | 001 | 1 | Rn | Rd",
        "hex_opcode": "0x0E400C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:21 | 20:16 | 15:14 | 13:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Fused multiply-add on half-precision (FP16) vectors. Computes Vd = Vd + (Vn × Vm) for each 16-bit element, with intermediate results computed in higher precision and rounded only once to FP16. Requires FEAT_FP16 extension. Condition flags (N, Z, C, V) are not affected; floating-point exceptions may be generated per IEEE 754 semantics.",
      "example": "FMLA v0.4s.8H, v1.4s.8H, v2.4s.8H",
      "pseudocode": "for i = 0 to 7 do\n  element = Vd.H[i] + (Vn.H[i] × Vm.H[i])\n  Vd.H[i] = FPRound(element, FP16)\nendfor"
    },
    {
      "mnemonic": "fmls",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Multiply Subtract (Half-Precision)",
      "summary": "Fused multiply-subtract on half-precision vectors.",
      "syntax": "FMLS <Vd>.8H, <Vn>.8H, <Vm>.8H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 0 | 01110 | 1 | 10 | Rm | 00 | 001 | 1 | Rn | Rd",
        "hex_opcode": "0x0EC00C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:21 | 20:16 | 15:14 | 13:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Fused multiply-subtract: for each half-precision element, computes Vd - (Vn × Vm) and writes to Vd. Operates on 8 half-precision (16-bit) values in 128-bit vectors with a single rounding step. Vd is both source and destination (accumulator). No condition flags are set; exception behavior follows FPCR settings. Requires FEAT_FP16 extension; AArch64-only.",
      "example": "FMLS v0.4s.8H, v1.4s.8H, v2.4s.8H",
      "pseudocode": "for i = 0 to 7\n  Vd[i*16 +: 16] ← FP16_Sub(Vd[i*16 +: 16], FP16_Mul(Vn[i*16 +: 16], Vm[i*16 +: 16]))"
    },
    {
      "mnemonic": "fabs",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Absolute Value (Half-Precision)",
      "summary": "Absolute value of half-precision vector.",
      "syntax": "FABS <Vd>.8H, <Vn>.8H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 0 | 01110 | 1 | 111100 | 01111 | 10 | Rn | Rd",
        "hex_opcode": "0x0EF8F800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "111100",
            "clean": "111100"
          },
          {
            "raw": "01111",
            "clean": "01111"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Computes the absolute value (clear sign bit) of each half-precision floating-point element in Vn, writing results to Vd. Operates on 8 half-precision (16-bit) values in a 128-bit vector; this is a bitwise operation that does not raise floating-point exceptions. No condition flags are affected. Requires FEAT_FP16 extension; AArch64-only.",
      "example": "FABS v0.4s.8H, v1.4s.8H",
      "pseudocode": "for i = 0 to 7\n  Vd[i*16 +: 16] ← Vn[i*16 +: 16] AND 0x7FFF"
    },
    {
      "mnemonic": "fneg",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Negate (Half-Precision)",
      "summary": "Negates half-precision vector.",
      "syntax": "FNEG <Vd>.8H, <Vn>.8H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 1 | 01110 | 1 | 111100 | 01111 | 10 | Rn | Rd",
        "hex_opcode": "0x2EF8F800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "111100",
            "clean": "111100"
          },
          {
            "raw": "01111",
            "clean": "01111"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Negates each half-precision floating-point element in Vn by flipping the sign bit, writing results to Vd. Operates on 8 half-precision (16-bit) values in a 128-bit vector; this is a bitwise operation that does not raise floating-point exceptions. No condition flags are affected. Requires FEAT_FP16 extension; AArch64-only.",
      "example": "FNEG v0.4s.8H, v1.4s.8H",
      "pseudocode": "for i = 0 to 7\n  Vd[i*16 +: 16] ← Vn[i*16 +: 16] XOR 0x8000"
    },
    {
      "mnemonic": "fsqrt",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Square Root (Half-Precision)",
      "summary": "Square root of half-precision vector.",
      "syntax": "FSQRT <Vd>.8H, <Vn>.8H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 1 | 01110 | 1 | 111100 | 11111 | 10 | Rn | Rd",
        "hex_opcode": "0x2EF9F800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "111100",
            "clean": "111100"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Computes the square root of each half-precision (FP16) floating-point element in the source vector and places the results in the destination vector. This is a NEON SIMD operation requiring FEAT_FP16 support. Condition flags are not affected; exceptions may be raised for invalid operands or overflow.",
      "example": "FSQRT v0.4s.8H, v1.4s.8H",
      "pseudocode": "for i = 0 to 7\n  Vd.H[i] ← FP16_SquareRoot(Vn.H[i])\nendfor"
    },
    {
      "mnemonic": "fcvtl",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert Long (Half to Single)",
      "summary": "Converts Half-precision (Bottom) to Single-precision.",
      "syntax": "FCVTL <Vd>.4S, <Vn>.4H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 0 | 011100 | sz | 10000 | 10111 | 10 | Rn | Rd",
        "hex_opcode": "0x0E217800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011100",
            "clean": "011100"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10111",
            "clean": "10111"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Converts the lower 4 half-precision (FP16) floating-point values from the source vector to single-precision (FP32) and writes them to the destination vector. Requires FEAT_FP16. Condition flags are not affected; may raise floating-point exceptions during conversion.",
      "example": "FCVTL v0.4s.4S, v1.4s.4H",
      "pseudocode": "for i = 0 to 3\n  Vd.S[i] ← FP16_to_FP32(Vn.H[i])\nendfor"
    },
    {
      "mnemonic": "fcvtl2",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert Long High (Half to Single)",
      "summary": "Converts Half-precision (Top) to Single-precision.",
      "syntax": "FCVTL2 <Vd>.4S, <Vn>.8H",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 0 | 011100 | sz | 10000 | 10111 | 10 | Rn | Rd",
        "hex_opcode": "0x0E217800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011100",
            "clean": "011100"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10111",
            "clean": "10111"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Converts the upper 4 half-precision (FP16) floating-point values from the source vector to single-precision (FP32) and writes them to the destination vector. Requires FEAT_FP16. Condition flags are not affected; may raise floating-point exceptions during conversion.",
      "example": "FCVTL2 v0.4s.4S, v1.4s.8H",
      "pseudocode": "for i = 0 to 3\n  Vd.S[i] ← FP16_to_FP32(Vn.H[i+4])\nendfor"
    },
    {
      "mnemonic": "fcvtn",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert Narrow (Single to Half)",
      "summary": "Converts Single-precision to Half-precision (Bottom).",
      "syntax": "FCVTN <Vd>.4H, <Vn>.4S",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 0 | 011100 | sz | 10000 | 10110 | 10 | Rn | Rd",
        "hex_opcode": "0x0E216800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011100",
            "clean": "011100"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10110",
            "clean": "10110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Converts the lower 4 single-precision (FP32) floating-point values from the source vector to half-precision (FP16) and writes them to the lower half of the destination vector. Requires FEAT_FP16. Condition flags are not affected; may raise floating-point exceptions during conversion.",
      "example": "FCVTN v0.4s.4H, v1.4s.4S",
      "pseudocode": "for i = 0 to 3\n  Vd.H[i] ← FP32_to_FP16(Vn.S[i])\nendfor"
    },
    {
      "mnemonic": "fcvtn2",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Convert Narrow High (Single to Half)",
      "summary": "Converts Single-precision to Half-precision (Top).",
      "syntax": "FCVTN2 <Vd>.8H, <Vn>.4S",
      "encoding": {
        "format": "NEON FP16",
        "binary_pattern": "0 | Q | 0 | 011100 | sz | 10000 | 10110 | 10 | Rn | Rd",
        "hex_opcode": "0x0E216800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011100",
            "clean": "011100"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10110",
            "clean": "10110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_FP16 (NEON)",
      "description": "Converts 4 single-precision (FP32) floating-point values from the source vector to half-precision (FP16) and writes them to the upper half of the destination vector. Requires FEAT_FP16. Condition flags are not affected; may raise floating-point exceptions during conversion.",
      "example": "FCVTN2 v0.4s.8H, v1.4s.4S",
      "pseudocode": "for i = 0 to 3\n  Vd.H[i+4] ← FP32_to_FP16(Vn.S[i])\nendfor"
    },
    {
      "mnemonic": "sdot",
      "architecture": "ARMv8-A",
      "full_name": "Signed Dot Product (NEON)",
      "summary": "Dot product of signed integers (AArch64 NEON).",
      "syntax": "SDOT <Vd>.4S, <Vn>.16B, <Vm>.16B",
      "encoding": {
        "format": "NEON DotProd",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 0 | Rm | 1 | 0010 | 1 | Rn | Rd",
        "hex_opcode": "0x0E009400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_DotProd",
      "description": "Signed dot product of 16 bytes viewed as 4 groups of 4 signed bytes, accumulating 32-bit signed integer results into Vd. Computes Vd[i] = Vd[i] + (Vn[4i] × Vm[4i]) + (Vn[4i+1] × Vm[4i+1]) + (Vn[4i+2] × Vm[4i+2]) + (Vn[4i+3] × Vm[4i+3]) for each 32-bit lane. Requires FEAT_DotProd. Condition flags are not affected.",
      "example": "SDOT v0.4s.4S, v1.4s.16B, v2.4s.16B",
      "pseudocode": "for i = 0 to 3 do\n  sum ← 0\n  for j = 0 to 3 do\n    sum ← sum + SignExtend(Vn.B[4*i + j], 32) × SignExtend(Vm.B[4*i + j], 32)\n  endfor\n  Vd.S[i] ← Vd.S[i] + sum\nendfor"
    },
    {
      "mnemonic": "udot",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Dot Product (NEON)",
      "summary": "Dot product of unsigned integers (AArch64 NEON).",
      "syntax": "UDOT <Vd>.4S, <Vn>.16B, <Vm>.16B",
      "encoding": {
        "format": "NEON DotProd",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 0 | Rm | 1 | 0010 | 1 | Rn | Rd",
        "hex_opcode": "0x2E009400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "FEAT_DotProd",
      "description": "Unsigned dot product of 16 bytes viewed as 4 groups of 4 unsigned bytes, accumulating 32-bit unsigned integer results into Vd. Computes Vd[i] = Vd[i] + (Vn[4i] × Vm[4i]) + (Vn[4i+1] × Vm[4i+1]) + (Vn[4i+2] × Vm[4i+2]) + (Vn[4i+3] × Vm[4i+3]) for each 32-bit lane. Requires FEAT_DotProd. Condition flags are not affected.",
      "example": "UDOT v0.4s.4S, v1.4s.16B, v2.4s.16B",
      "pseudocode": "for i = 0 to 3 do\n  sum ← 0\n  for j = 0 to 3 do\n    sum ← sum + ZeroExtend(Vn.B[4*i + j], 32) × ZeroExtend(Vm.B[4*i + j], 32)\n  endfor\n  Vd.S[i] ← Vd.S[i] + sum\nendfor"
    },
    {
      "mnemonic": "fcadd",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Complex Add (NEON)",
      "summary": "Complex addition with rotation (NEON).",
      "syntax": "FCADD <Vd>.4S, <Vn>.4S, <Vm>.4S, #<rot>",
      "encoding": {
        "format": "NEON Complex",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 0 | Rm | 111 | rot | 01 | Rn | Rd",
        "hex_opcode": "0x2E00E400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "rot",
            "clean": "rot"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        },
        {
          "name": "rot",
          "desc": "Rot"
        }
      ],
      "extension": "FEAT_FCMA",
      "description": "Performs complex addition of two single-precision (FP32) NEON vectors with a rotation applied to the second operand before addition. The rotation angle is specified by the rot immediate (90° or 270°). Requires FEAT_FCMA. Condition flags are not affected; may raise floating-point exceptions.",
      "example": "FCADD v0.4s.4S, v1.4s.4S, v2.4s.4S, #rot",
      "pseudocode": "if rot == 0 then\n  rotated_angle ← 90°\nelse\n  rotated_angle ← 270°\nendif\nfor i = 0 to 3 step 2\n  real_acc ← Vn.S[i]\n  imag_acc ← Vn.S[i+1]\n  real_op ← Vm.S[i]\n  imag_op ← Vm.S[i+1]\n  (rotated_real, rotated_imag) ← ComplexRotate(real_op, imag_op, rotated_angle)\n  Vd.S[i] ← real_acc + rotated_real\n  Vd.S[i+1] ← imag_acc + rotated_imag\nendfor"
    },
    {
      "mnemonic": "fcmla",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Complex Multiply Accumulate (NEON)",
      "summary": "Complex multiply-accumulate with rotation (NEON).",
      "syntax": "FCMLA <Vd>.4S, <Vn>.4S, <Vm>.4S, #<rot>",
      "encoding": {
        "format": "NEON Complex",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 0 | Rm | 110 | rot | 1 | Rn | Rd",
        "hex_opcode": "0x2E00C400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "rot",
            "clean": "rot"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        },
        {
          "name": "rot",
          "desc": "Rot"
        }
      ],
      "extension": "FEAT_FCMA",
      "description": "Complex fused multiply-accumulate on single-precision (FP32) vectors with rotation applied to the multiplicand. Performs Vd = Vd + (Vn × rotate(Vm, rot)) where rotation is 0°, 90°, 180°, or 270° as specified by immediate. Treats elements as complex pairs (real, imaginary). Requires FEAT_FCMA. Condition flags are not affected; floating-point exceptions per IEEE 754.",
      "example": "FCMLA v0.4s.4S, v1.4s.4S, v2.4s.4S, #rot",
      "pseudocode": "// rot encodes: 0→0°, 1→90°, 2→180°, 3→270°\nfor i = 0 to 1 do\n  rotated ← ComplexRotate(Vm.S[2*i:2*i+1], rot)\n  product ← ComplexMultiply(Vn.S[2*i:2*i+1], rotated)\n  Vd.S[2*i:2*i+1] ← Vd.S[2*i:2*i+1] + product\nendfor"
    },
    {
      "mnemonic": "aese",
      "architecture": "ARMv8-A",
      "full_name": "AES Encrypt (A64)",
      "summary": "AES single round encryption (AArch64 NEON).",
      "syntax": "AESE <Vd>.16B, <Vm>.16B",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01001110 | 00 | 101000010 | 0 | 10 | Rn | Rd",
        "hex_opcode": "0x4E284800",
        "visual_parts": [
          {
            "raw": "01001110",
            "clean": "01001110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101000010",
            "clean": "101000010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "State"
        },
        {
          "name": "Vm",
          "desc": "Key"
        }
      ],
      "extension": "Crypto",
      "description": "AES single round encryption on 128-bit state using 128-bit round key. Applies SubBytes, ShiftRows, MixColumns, and AddRoundKey transformations. Used in AES encryption loops (not the final round). Requires Crypto extension. Condition flags are not affected.",
      "example": "AESE v0.4s.16B, v2.4s.16B",
      "pseudocode": "state ← Vd.B[0:15]\nkey ← Vm.B[0:15]\nstate ← SubBytes(state)\nstate ← ShiftRows(state)\nstate ← MixColumns(state)\nstate ← state ⊕ key\nVd.B[0:15] ← state"
    },
    {
      "mnemonic": "aesd",
      "architecture": "ARMv8-A",
      "full_name": "AES Decrypt (A64)",
      "summary": "AES single round decryption (AArch64 NEON).",
      "syntax": "AESD <Vd>.16B, <Vm>.16B",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01001110 | 00 | 101000010 | 1 | 10 | Rn | Rd",
        "hex_opcode": "0x4E285800",
        "visual_parts": [
          {
            "raw": "01001110",
            "clean": "01001110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101000010",
            "clean": "101000010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "State"
        },
        {
          "name": "Vm",
          "desc": "Key"
        }
      ],
      "extension": "Crypto",
      "description": "AES single round decryption on 128-bit state using 128-bit round key. Applies InvSubBytes, InvShiftRows, InvMixColumns, and AddRoundKey transformations. Used in AES decryption loops (not the final round). Requires Crypto extension. Condition flags are not affected.",
      "example": "AESD v0.4s.16B, v2.4s.16B",
      "pseudocode": "state ← Vd.B[0:15]\nkey ← Vm.B[0:15]\nstate ← InvSubBytes(state)\nstate ← InvShiftRows(state)\nstate ← InvMixColumns(state)\nstate ← state ⊕ key\nVd.B[0:15] ← state"
    },
    {
      "mnemonic": "sha1h",
      "architecture": "ARMv8-A",
      "full_name": "SHA1 Hash Update (A64)",
      "summary": "SHA1 hash update (AArch64 NEON).",
      "syntax": "SHA1H <Sd>, <Sn>",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01011110 | 00 | 10100 | 00000 | 10 | Rn | Rd",
        "hex_opcode": "0x5E280800",
        "visual_parts": [
          {
            "raw": "01011110",
            "clean": "01011110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10100",
            "clean": "10100"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        }
      ],
      "extension": "Crypto",
      "description": "SHA1 hash update: rotates the 32-bit scalar value left by 1 bit and writes result to destination. This is a specialized operation used in SHA1 compression to update the working state. Requires Crypto extension. Condition flags are not affected.",
      "example": "SHA1H s0, s1",
      "pseudocode": "Rd.S ← RotateLeft(Rn.S, 1)"
    },
    {
      "mnemonic": "sha1c",
      "architecture": "ARMv8-A",
      "full_name": "SHA1 Choose (A64)",
      "summary": "SHA1 hash choose (AArch64 NEON).",
      "syntax": "SHA1C <Qd>, <Sn>, <Vm>.4S",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01011110 | 00 | 0 | Rm | 0 | 000 | 00 | Rn | Rd",
        "hex_opcode": "0x5E000000",
        "visual_parts": [
          {
            "raw": "01011110",
            "clean": "01011110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "Crypto",
      "description": "SHA1 choose: computes SHA1 compression function's choose operation across 128-bit state, updating the state register. Takes a 32-bit scalar index and 4 × 32-bit vector of operands, producing updated 128-bit state. Requires Crypto extension. Condition flags are not affected.",
      "example": "SHA1C q0, s1, v2.4s.4S",
      "pseudocode": "// Simplified: SHA1C updates 128-bit state Qd with function output based on Sn and Vm\nfor i = 0 to 3 do\n  Qd.S[i] ← SHA1Choose(Qd.S[i], Sn, Vm.S[i])\nendfor"
    },
    {
      "mnemonic": "sha256h",
      "architecture": "ARMv8-A",
      "full_name": "SHA256 Hash Part 1 (A64)",
      "summary": "SHA256 hash part 1 (AArch64 NEON).",
      "syntax": "SHA256H <Qd>, <Qn>, <Vm>.4S",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01011110 | 00 | 0 | Rm | 010 | 0 | 00 | Rn | Rd",
        "hex_opcode": "0x5E004000",
        "visual_parts": [
          {
            "raw": "01011110",
            "clean": "01011110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "Crypto",
      "description": "SHA256 Hash Part 1 performs the first part of a SHA256 compression function round, operating on 128-bit SIMD registers containing four 32-bit words. The instruction takes hash state values from Qn, a round constant and message schedule word from Vm.4S, and produces updated hash state in Qd. Condition flags are unaffected. This instruction requires AArch64 execution state and the Crypto extension.",
      "example": "SHA256H q0, q1, v2.4s.4S",
      "pseudocode": "hash_state ← SHA256HashPart1(Qn, Vm.4S)\nQd ← hash_state"
    },
    {
      "mnemonic": "sha256h2",
      "architecture": "ARMv8-A",
      "full_name": "SHA256 Hash Part 2 (A64)",
      "summary": "SHA256 hash part 2 (AArch64 NEON).",
      "syntax": "SHA256H2 <Qd>, <Qn>, <Vm>.4S",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01011110 | 00 | 0 | Rm | 010 | 1 | 00 | Rn | Rd",
        "hex_opcode": "0x5E005000",
        "visual_parts": [
          {
            "raw": "01011110",
            "clean": "01011110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "Crypto",
      "description": "SHA256 Hash Part 2 performs the second part of a SHA256 compression function round, operating on 128-bit SIMD registers containing four 32-bit words. The instruction takes hash state values from Qn, a round constant and message schedule word from Vm.4S, and produces updated hash state in Qd. Condition flags are unaffected. This instruction requires AArch64 execution state and the Crypto extension.",
      "example": "SHA256H2 q0, q1, v2.4s.4S",
      "pseudocode": "hash_state ← SHA256HashPart2(Qn, Vm.4S)\nQd ← hash_state"
    },
    {
      "mnemonic": "pmull",
      "architecture": "ARMv8-A",
      "full_name": "Polynomial Multiply Long (A64)",
      "summary": "Polynomial multiply long (NEON).",
      "syntax": "PMULL <Vd>.1Q, <Vn>.1D, <Vm>.1D",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 1110 | 00 | Rn | Rd",
        "hex_opcode": "0x0E20E000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "Crypto (AES)",
      "description": "Polynomial Multiply Long performs polynomial multiplication on the 64-bit elements from Vn and Vm, producing a 128-bit result in Vd. Each 64-bit input is treated as a polynomial with binary coefficients, and the result is a 128-bit polynomial. Condition flags are unaffected. This instruction requires AArch64 execution state and the Crypto extension (AES variant).",
      "example": "PMULL v0.4s.1Q, v1.4s.1D, v2.4s.1D",
      "pseudocode": "product ← PolynomialMultiply(Vn[0], Vm[0])\nVd ← product[127:0]"
    },
    {
      "mnemonic": "umaal",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Multiply Accumulate Accumulate Long",
      "summary": "Calculates (Rn * Rm) + RdLo + RdHi -> 64-bit result.",
      "syntax": "UMAAL<c> <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 0000 | 010 | 0 | RdHi | RdLo | Rm | 1001 | Rn",
        "hex_opcode": "0x00400090",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Dest Lo/Acc"
        },
        {
          "name": "RdHi",
          "desc": "Dest Hi/Acc"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Unsigned Multiply Accumulate Accumulate Long multiplies Rn by Rm, adds both RdLo and RdHi to the product, and writes the 64-bit result back to RdLo:RdHi. All operands are treated as unsigned 32-bit values. Condition flags are not affected; RdLo and RdHi must be different registers. This instruction is available in A32/T32 and requires the DSP extension on some implementations.",
      "example": "UMAAL r1, r0, r1, r2",
      "pseudocode": "temp ← (Rn * Rm) + RdLo + RdHi\nRdLo ← temp[31:0]\nRdHi ← temp[63:32]"
    },
    {
      "mnemonic": "ldrt",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Unprivileged",
      "summary": "Loads a word using User Mode permissions (even if Privileged).",
      "syntax": "LDRT<c> <Rt>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 010 | 0 | U | 0 | 1 | 1 | Rn | Rt | imm12",
        "hex_opcode": "0x04300000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Load Register Unprivileged loads a 32-bit word from memory using unprivileged (User mode) permissions, regardless of the current privilege level, and writes it to Rt. The address is computed from Rn plus an optionally pre-indexed or post-indexed 12-bit signed immediate offset. Condition flags are unaffected. This instruction is available in A32/T32 and is commonly used for accessing user-mode memory from privileged code.",
      "example": "LDRT r3, [r1, #+/-#16]",
      "pseudocode": "address ← Rn + SignExtend(imm12)\nRt ← ZeroExtend([address][31:0])\nif W then Rn ← address"
    },
    {
      "mnemonic": "ldrbt",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Byte Unprivileged",
      "summary": "Loads a byte using User Mode permissions.",
      "syntax": "LDRBT<c> <Rt>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 010 | 0 | U | 1 | 1 | 1 | Rn | Rt | imm12",
        "hex_opcode": "0x04700000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Load Register Byte Unprivileged loads an unsigned byte from memory using unprivileged (User mode) permissions, regardless of the current privilege level, and writes it zero-extended to Rt. The address is computed from Rn plus an optionally pre-indexed or post-indexed 12-bit signed immediate offset. Condition flags are unaffected. This instruction is available in A32/T32 and is commonly used for accessing user-mode memory from privileged code.",
      "example": "LDRBT r3, [r1, #+/-#16]",
      "pseudocode": "address ← Rn + SignExtend(imm12)\nRt ← ZeroExtend([address][7:0])\nif W then Rn ← address"
    },
    {
      "mnemonic": "ldrht",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Halfword Unprivileged",
      "summary": "Loads a halfword using User Mode permissions.",
      "syntax": "LDRHT<c> <Rt>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 000 | 0 | U | 1 | 1 | 1 | Rn | Rt | imm4H | 1 | 01 | 1 | imm4L",
        "hex_opcode": "0x007000B0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm4H",
            "clean": "imm4H"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4L",
            "clean": "imm4L"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Load Register Halfword Unprivileged loads an unsigned halfword (16 bits) from memory using unprivileged (User mode) permissions, regardless of the current privilege level, and writes it zero-extended to Rt. The address is computed from Rn plus a 12-bit signed immediate offset (formed from two 4-bit fields). Condition flags are unaffected. This instruction is available in A32/T32 and is commonly used for accessing user-mode memory from privileged code.",
      "example": "LDRHT r3, [r1, #+/-#16]",
      "pseudocode": "offset ← (imm4_upper << 4) | imm4_lower\naddress ← Rn + SignExtend(offset)\nRt ← ZeroExtend([address][15:0])\nif W then Rn ← address"
    },
    {
      "mnemonic": "ldrsbt",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Signed Byte Unprivileged",
      "summary": "Loads a signed byte using User Mode permissions.",
      "syntax": "LDRSBT<c> <Rt>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 000 | 0 | U | 1 | 1 | 1 | Rn | Rt | imm4H | 1 | 10 | 1 | imm4L",
        "hex_opcode": "0x007000D0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm4H",
            "clean": "imm4H"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4L",
            "clean": "imm4L"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Load Register Signed Byte Unprivileged loads a signed byte from memory using unprivileged (User mode) permissions, regardless of the current privilege level, and writes it sign-extended to Rt. The address is computed from Rn plus a 12-bit signed immediate offset (formed from two 4-bit fields). Condition flags are unaffected. This instruction is available in A32/T32 and is commonly used for accessing user-mode memory from privileged code.",
      "example": "LDRSBT r3, [r1, #+/-#16]",
      "pseudocode": "offset ← (imm4_upper << 4) | imm4_lower\naddress ← Rn + SignExtend(offset)\nRt ← SignExtend([address][7:0])\nif W then Rn ← address"
    },
    {
      "mnemonic": "ldrsht",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Signed Halfword Unprivileged",
      "summary": "Loads a signed halfword using User Mode permissions.",
      "syntax": "LDRSHT<c> <Rt>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 000 | 0 | U | 1 | 1 | 1 | Rn | Rt | imm4H | 1 | 11 | 1 | imm4L",
        "hex_opcode": "0x007000F0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm4H",
            "clean": "imm4H"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4L",
            "clean": "imm4L"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Loads a signed halfword from memory using User Mode access permissions, ignoring the current privilege level. The loaded value is sign-extended to the full register width. No condition flags are affected. This is an A32 instruction that provides unprivileged memory access.",
      "example": "LDRSHT r3, [r1, #+/-#16]",
      "pseudocode": "address ← Rn + (if U then imm else -imm); Rt ← SignExtend(Mem[address, 2], 16);"
    },
    {
      "mnemonic": "strt",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Unprivileged",
      "summary": "Stores a word using User Mode permissions.",
      "syntax": "STRT<c> <Rt>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 010 | 0 | U | 0 | 1 | 0 | Rn | Rt | imm12",
        "hex_opcode": "0x04200000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Stores a 32-bit word to memory using User Mode access permissions, regardless of current privilege level. The T suffix indicates unprivileged (User mode) access is enforced. No condition flags are affected. This is an A32 instruction.",
      "example": "STRT r3, [r1, #+/-#16]",
      "pseudocode": "address ← Rn + (if U then imm12 else -imm12); Mem[address, 4] ← Rt[31:0];"
    },
    {
      "mnemonic": "strbt",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Byte Unprivileged",
      "summary": "Stores a byte using User Mode permissions.",
      "syntax": "STRBT<c> <Rt>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 010 | 0 | U | 1 | 1 | 0 | Rn | Rt | imm12",
        "hex_opcode": "0x04600000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Stores a byte (8 bits) to memory using User Mode access permissions, ignoring the current privilege level. The T suffix indicates unprivileged (User mode) access is enforced. No condition flags are affected. This is an A32 instruction.",
      "example": "STRBT r3, [r1, #+/-#16]",
      "pseudocode": "address ← Rn + (if U then imm12 else -imm12); Mem[address, 1] ← Rt[7:0];"
    },
    {
      "mnemonic": "strht",
      "architecture": "ARMv8-A",
      "full_name": "Store Register Halfword Unprivileged",
      "summary": "Stores a halfword using User Mode permissions.",
      "syntax": "STRHT<c> <Rt>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 000 | 0 | U | 0 | 1 | 0 | Rn | Rt | 0 | 0 | 0 | 0 | 1 | 01 | 1 | Rm",
        "hex_opcode": "0x002000B0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Stores a halfword (16 bits) to memory using User Mode access permissions, ignoring the current privilege level. The T suffix indicates unprivileged (User mode) access is enforced. No condition flags are affected. This is an A32 instruction.",
      "example": "STRHT r3, [r1, #+/-#16]",
      "pseudocode": "address ← Rn + (if U then imm else -imm); Mem[address, 2] ← Rt[15:0];"
    },
    {
      "mnemonic": "rcwsswpp",
      "architecture": "ARMv8-A",
      "full_name": "Read Check Write (Soft)",
      "summary": "Read Check Write with soft failure reporting (Translation Hardening).",
      "syntax": "RCWS <Xt>, <Xt+1>, [<Xn>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "0 | 1 | 011001 | 0 | 0 | 1 | Rt2 | 1 | 010 | 00 | Rn | Rt",
        "hex_opcode": "0x5920A000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011001",
            "clean": "011001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Data/Status"
        },
        {
          "name": "Xn",
          "desc": "Address"
        }
      ],
      "extension": "FEAT_THE (Hardening)",
      "description": "Atomically reads a 128-bit translation table descriptor from memory and checks its validity with soft failure reporting (FEAT_THE). Unlike RCW, failure does not raise an exception but returns status in the registers. The instruction requires 128-bit alignment and is available only in AArch64.",
      "example": "RCWS x3, Xt+1, [x1]",
      "pseudocode": "address ← Xn; data ← Mem[address, 16]; ValidateAndProcess(data); Xt ← data[63:0]; Xt+1 ← data[127:64]; if validation_failed then status ← FAIL else status ← PASS;"
    },
    {
      "mnemonic": "rcwswppa",
      "architecture": "ARMv8-A",
      "full_name": "Read Check Write Swap Pair (Acquire)",
      "summary": "Atomically swaps a 128-bit register pair with a checked descriptor in memory, with Acquire semantics (Translation Hardening).",
      "syntax": "RCWSWPPA <Xt>, <Xt+1>, [<Xn>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "0 | 0 | 011001 | 1 | 0 | 1 | Rt2 | 1 | 010 | 00 | Rn | Rt",
        "hex_opcode": "0x19A0A000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011001",
            "clean": "011001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Data/Status"
        },
        {
          "name": "Xt+1",
          "desc": "Second register of the data pair"
        },
        {
          "name": "Xn",
          "desc": "Address"
        }
      ],
      "extension": "FEAT_THE (Hardening)",
      "description": "Atomically reads a 128-bit translation table descriptor from memory with Acquire memory ordering semantics (FEAT_THE). The instruction performs validation checking with Acquire constraints, preventing subsequent memory operations from being reordered before the load. Available only in AArch64 with 128-bit alignment requirement.",
      "example": "RCWSWPPA x2, x3, [x1]",
      "pseudocode": "address ← Xn; data ← Mem[address, 16]; AcquireSemantics(); ValidateAndProcess(data); Xt ← data[63:0]; Xt+1 ← data[127:64];"
    },
    {
      "mnemonic": "rcwswppal",
      "architecture": "ARMv8-A",
      "full_name": "Read Check Write Swap Pair (Acquire-Release)",
      "summary": "Atomically swaps a 128-bit register pair with a checked descriptor in memory, with Acquire and Release semantics (Translation Hardening).",
      "syntax": "RCWSWPPAL <Xt>, <Xt+1>, [<Xn>]",
      "encoding": {
        "format": "Atomic",
        "binary_pattern": "0 | 0 | 011001 | 1 | 1 | 1 | Rt2 | 1 | 010 | 00 | Rn | Rt",
        "hex_opcode": "0x19E0A000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011001",
            "clean": "011001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rt2",
            "clean": "Rt2"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Data/Status"
        },
        {
          "name": "Xt+1",
          "desc": "Second register of the data pair"
        },
        {
          "name": "Xn",
          "desc": "Address"
        }
      ],
      "extension": "FEAT_THE (Hardening)",
      "description": "Atomically reads a 128-bit translation table descriptor from memory with full Acquire-Release memory ordering semantics (FEAT_THE). The instruction enforces both Acquire (on the read) and Release (implicit for conditional update) constraints, providing full mutual exclusion semantics. Available only in AArch64 with 128-bit alignment requirement.",
      "example": "RCWSWPPAL x2, x3, [x1]",
      "pseudocode": "address ← Xn; data ← Mem[address, 16]; AcquireSemantics(); ValidateAndProcess(data); if validated then Mem[address, 16] ← data; ReleaseSemantics(); Xt ← data[63:0]; Xt+1 ← data[127:64];"
    },
    {
      "mnemonic": "brb",
      "architecture": "ARMv8-A",
      "full_name": "Branch Record Buffer Injection",
      "summary": "Injects an entry into the Branch Record Buffer (Debug).",
      "syntax": "BRB <op>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 0 | 01 | 001 | 0111 | 0010 | op2 | Rt",
        "hex_opcode": "0xD5097200",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "op2",
            "clean": "op2"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "op",
          "desc": "IALL/INJ"
        }
      ],
      "extension": "FEAT_BRBE (Debug)",
      "description": "Injects an entry into the Branch Record Buffer (BRB) for debugging purposes. This is a privileged system instruction that requires EL1 or higher execution level and is only available when FEAT_BRBE is implemented. The instruction does not affect any condition flags.",
      "example": "BRB op",
      "pseudocode": "if PSTATE.EL == EL0 then\n  UNDEFINED\nelse\n  case op of\n    when '0' BRBIall()\n    when '1' BRBInj()"
    },
    {
      "mnemonic": "gcspopm",
      "architecture": "ARMv8-A",
      "full_name": "Guarded Control Stack Pop",
      "summary": "Pops the value from the Guarded Control Stack into LR.",
      "syntax": "GCSPOPM",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 1 | 01 | 011 | 0111 | 0111 | 001 | Rt",
        "hex_opcode": "0xD52B7720",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "FEAT_GCS (Security)",
      "description": "Pops a value from the Guarded Control Stack (GCS) and loads it into the Link Register (LR/X30). This privileged instruction is available when FEAT_GCS is implemented and requires EL1 or higher. The instruction does not affect the condition flags but may generate a GCS exception if the stack underflows.",
      "example": "GCSPOPM",
      "pseudocode": "if FEAT_GCS == '0' then\n  UNDEFINED\nelse if PSTATE.EL == EL0 then\n  UNDEFINED\nelse\n  X[30] ← GCSPop()\n  PC ← X[30]"
    },
    {
      "mnemonic": "gcsss1",
      "architecture": "ARMv8-A",
      "full_name": "Guarded Control Stack Switch Stack 1",
      "summary": "First step to switch the GCS pointer.",
      "syntax": "GCSSS1 <Xt>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 0 | 01 | 011 | 0111 | 0111 | 010 | Rt",
        "hex_opcode": "0xD50B7740",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "New Stack Ptr"
        }
      ],
      "extension": "FEAT_GCS (Security)",
      "description": "First step of a two-instruction sequence to switch the Guarded Control Stack pointer. This privileged instruction validates and begins the GCS pointer switch operation using the value in the source register. It is available when FEAT_GCS is implemented and requires EL1 or higher. The instruction does not affect condition flags.",
      "example": "GCSSS1 x3",
      "pseudocode": "if FEAT_GCS == '0' then\n  UNDEFINED\nelse if PSTATE.EL == EL0 then\n  UNDEFINED\nelse\n  GCSSwitchStack1(X[t])"
    },
    {
      "mnemonic": "gcsss2",
      "architecture": "ARMv8-A",
      "full_name": "Guarded Control Stack Switch Stack 2",
      "summary": "Second step to switch the GCS pointer.",
      "syntax": "GCSSS2 <Xt>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 1 | 01 | 011 | 0111 | 0111 | 011 | Rt",
        "hex_opcode": "0xD52B7760",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "New Stack Ptr"
        }
      ],
      "extension": "FEAT_GCS (Security)",
      "description": "Second step of a two-instruction sequence to switch the Guarded Control Stack pointer, completing the switch initiated by GCSSS1. This privileged instruction commits the new GCS pointer value and is available when FEAT_GCS is implemented and requires EL1 or higher. The instruction does not affect condition flags.",
      "example": "GCSSS2 x3",
      "pseudocode": "if FEAT_GCS == '0' then\n  UNDEFINED\nelse if PSTATE.EL == EL0 then\n  UNDEFINED\nelse\n  GCSSwitchStack2(X[t])"
    },
    {
      "mnemonic": "cpy",
      "architecture": "ARMv8-A",
      "full_name": "Memory Copy (SVE2)",
      "summary": "Copies data from source to destination using SVE vector length.",
      "syntax": "CPY <Zd>.<T>, <Pg>/M, <Zn>.<T>",
      "encoding": {
        "format": "SVE2 Move",
        "binary_pattern": "00000101 | size | 100000100 | Pg | Vn | Zd",
        "hex_opcode": "0x05208000",
        "visual_parts": [
          {
            "raw": "00000101",
            "clean": "00000101"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "100000100",
            "clean": "100000100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd",
          "desc": "Destination scalable vector register (SVE)"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        }
      ],
      "extension": "SVE2",
      "description": "Copies data from a source SVE vector register to a destination SVE vector register under predicate control, operating on elements of the specified type. This SVE2 instruction processes VL/element-size elements in parallel and does not affect condition flags. The predicate register controls which elements are copied; unpredicated elements in the destination are left unchanged.",
      "example": "CPY z0.s.T, p0/m/M, z1.s.T",
      "pseudocode": "for i = 0 to VL/esize-1 do\n  if Pg[i] == '1' then\n    Zd[i*esize +: esize] ← Zn[i*esize +: esize]"
    },
    {
      "mnemonic": "udot",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Dot Product (Multi-vector)",
      "summary": "Multi-vector unsigned dot product (SME2).",
      "syntax": "UDOT { <Zd1>.S-<Zd2>.S }, <Zn>.B, <Zm>.B",
      "encoding": {
        "format": "SME2 DotProd",
        "binary_pattern": "01000100 | size | 0 | Zm | 00000 | 1 | Zn | Zda",
        "hex_opcode": "0x44000400",
        "visual_parts": [
          {
            "raw": "01000100",
            "clean": "01000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zda",
            "clean": "Zda"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd1-Zd2",
          "desc": "Dest Pair"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SME2",
      "description": "Performs multi-vector unsigned dot product between byte elements, accumulating results into 32-bit destination registers. This SME2 instruction operates on a pair of consecutive 32-bit result registers and does not affect condition flags. Each 32-bit result accumulates the dot products of four unsigned byte multiplications.",
      "example": "UDOT z1.s.B, z2.s.B",
      "pseudocode": "for i = 0 to VL/32-1 do\n  acc ← 0\n  for j = 0 to 3 do\n    acc ← acc + (unsigned(Zn[i*4+j]) × unsigned(Zm[i*4+j]))\n  Zd[i*64 +: 32] ← Zd[i*64 +: 32] + acc\n  Zd[i*64+32 +: 32] ← Zd[i*64+32 +: 32] + acc"
    },
    {
      "mnemonic": "sdot",
      "architecture": "ARMv8-A",
      "full_name": "Signed Dot Product (Multi-vector)",
      "summary": "Multi-vector signed dot product (SME2).",
      "syntax": "SDOT { <Zd1>.S-<Zd2>.S }, <Zn>.B, <Zm>.B",
      "encoding": {
        "format": "SME2 DotProd",
        "binary_pattern": "01000100 | size | 0 | Zm | 00000 | 0 | Zn | Zda",
        "hex_opcode": "0x44000000",
        "visual_parts": [
          {
            "raw": "01000100",
            "clean": "01000100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zda",
            "clean": "Zda"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zd1-Zd2",
          "desc": "Dest Pair"
        },
        {
          "name": "Zn",
          "desc": "First source scalable vector register (SVE)"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "SME2",
      "description": "Performs signed dot products on pairs of 8-bit elements from two SVE registers and accumulates results into a pair of 32-bit destination registers. This SME2 instruction operates on multi-vector register pairs and does not modify condition flags. Requires SME2 extension; AArch64 only.",
      "example": "SDOT z1.s.B, z2.s.B",
      "pseudocode": "for i = 0 to (128 / 32) - 1\n  acc ← (Zd1[i] as i32) + (Zd2[i] as i32)\n  for j = 0 to 3\n    acc ← acc + (sign_extend(Zn[i*4 + j], 8) * sign_extend(Zm[i*4 + j], 8))\n  Zd1[i] ← acc\n  Zd2[i] ← acc >> 32"
    },
    {
      "mnemonic": "bfadd",
      "architecture": "ARMv8-A",
      "full_name": "BFloat16 Add",
      "summary": "Adds BFloat16 elements.",
      "syntax": "BFADD <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE BFloat16",
        "binary_pattern": "01100101 | 0 | 0 | 0 | Zm | 000 | 00 | 0 | Zn | Zd",
        "hex_opcode": "0x65000000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Zn",
            "clean": "Zn"
          },
          {
            "raw": "Zd",
            "clean": "Zd"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21 | 20:16 | 15:13 | 12:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "FEAT_SVE_B16B16",
      "description": "Adds BFloat16 (16-bit) elements from two SVE registers under predicate control and stores the result in the destination register. Floating-point exceptions may be generated; condition flags are unaffected. Requires FEAT_SVE_B16B16; AArch64 only.",
      "example": "BFADD z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/16 - 1\n  if Pg[i]\n    Zdn[i] ← FP_Add(Zdn[i], Zm[i], RMode_TONEAREST)\n  else\n    Zdn[i] ← Zdn[i]"
    },
    {
      "mnemonic": "bfsub",
      "architecture": "ARMv8-A",
      "full_name": "BFloat16 Subtract",
      "summary": "Subtracts BFloat16 elements.",
      "syntax": "BFSUB <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE BFloat16",
        "binary_pattern": "01100101 | 0 | 0 | 00 | 000 | 1 | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x65018000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "FEAT_SVE_B16B16",
      "description": "Subtracts BFloat16 (16-bit) elements of one SVE register from another under predicate control and stores the result in the destination register. Floating-point exceptions may be generated; condition flags are unaffected. Requires FEAT_SVE_B16B16; AArch64 only.",
      "example": "BFSUB z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/16 - 1\n  if Pg[i]\n    Zdn[i] ← FP_Sub(Zdn[i], Zm[i], RMode_TONEAREST)\n  else\n    Zdn[i] ← Zdn[i]"
    },
    {
      "mnemonic": "bfmul",
      "architecture": "ARMv8-A",
      "full_name": "BFloat16 Multiply",
      "summary": "Multiplies BFloat16 elements.",
      "syntax": "BFMUL <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE BFloat16",
        "binary_pattern": "01100101 | 0 | 0 | 00 | 001 | 0 | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x65028000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "FEAT_SVE_B16B16",
      "description": "Multiplies BFloat16 (16-bit) elements from two SVE registers under predicate control and stores the result in the destination register. Floating-point exceptions may be generated; condition flags are unaffected. Requires FEAT_SVE_B16B16; AArch64 only.",
      "example": "BFMUL z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/16 - 1\n  if Pg[i]\n    Zdn[i] ← FP_Mul(Zdn[i], Zm[i], RMode_TONEAREST)\n  else\n    Zdn[i] ← Zdn[i]"
    },
    {
      "mnemonic": "bfmax",
      "architecture": "ARMv8-A",
      "full_name": "BFloat16 Maximum",
      "summary": "Calculates maximum of BFloat16 elements.",
      "syntax": "BFMAX <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE BFloat16",
        "binary_pattern": "01100101 | 0 | 0 | 00 | 011 | 0 | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x65068000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "FEAT_SVE_B16B16",
      "description": "Computes the maximum of BFloat16 (16-bit) elements from two SVE registers under predicate control and stores the result in the destination register. Floating-point exceptions may be generated; condition flags are unaffected. Requires FEAT_SVE_B16B16; AArch64 only.",
      "example": "BFMAX z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/16 - 1\n  if Pg[i]\n    Zdn[i] ← FP_Max(Zdn[i], Zm[i])\n  else\n    Zdn[i] ← Zdn[i]"
    },
    {
      "mnemonic": "bfmin",
      "architecture": "ARMv8-A",
      "full_name": "BFloat16 Minimum",
      "summary": "Calculates minimum of BFloat16 elements.",
      "syntax": "BFMIN <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>",
      "encoding": {
        "format": "SVE BFloat16",
        "binary_pattern": "01100101 | 0 | 0 | 00 | 011 | 1 | 100 | Pg | Zm | Zdn",
        "hex_opcode": "0x65078000",
        "visual_parts": [
          {
            "raw": "01100101",
            "clean": "01100101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Pg",
            "clean": "Pg"
          },
          {
            "raw": "Zm",
            "clean": "Zm"
          },
          {
            "raw": "Zdn",
            "clean": "Zdn"
          }
        ],
        "bit_positions": "31:24 | 23 | 22 | 21:20 | 19:17 | 16 | 15:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Zdn",
          "desc": "Dest/Src"
        },
        {
          "name": "Pg",
          "desc": "Mask"
        },
        {
          "name": "Zm",
          "desc": "Second source scalable vector register (SVE)"
        }
      ],
      "extension": "FEAT_SVE_B16B16",
      "description": "Computes the minimum of BFloat16 (16-bit) elements from two SVE registers under predicate control and stores the result in the destination register. Floating-point exceptions may be generated; condition flags are unaffected. Requires FEAT_SVE_B16B16; AArch64 only.",
      "example": "BFMIN z0.s.T, p0/m/M, z0.s.T, z2.s.T",
      "pseudocode": "for i = 0 to VL/16 - 1\n  if Pg[i]\n    Zdn[i] ← FP_Min(Zdn[i], Zm[i])\n  else\n    Zdn[i] ← Zdn[i]"
    },
    {
      "mnemonic": "addp",
      "architecture": "ARMv8-A",
      "full_name": "Scalar Add Pairwise",
      "summary": "Adds two 64-bit values to a 64-bit result (Scalar NEON).",
      "syntax": "ADDP <Dd>, <Vn>.<T>",
      "encoding": {
        "format": "NEON Scalar",
        "binary_pattern": "01011110 | 11110001 | 101110 | Rn | Rd",
        "hex_opcode": "0x5E31B800",
        "visual_parts": [
          {
            "raw": "01011110",
            "clean": "01011110"
          },
          {
            "raw": "11110001",
            "clean": "11110001"
          },
          {
            "raw": "101110",
            "clean": "101110"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ]
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (Scalar)",
      "description": "Adds the two 64-bit elements of a NEON vector register pairwise and stores the scalar 64-bit result in a destination register. Condition flags (N, Z, C, V) are set according to the result. AArch64 only with NEON extension.",
      "example": "ADDP d0, v1.4s.T",
      "pseudocode": "result ← (Vn[0] as i64) + (Vn[1] as i64)\nDd ← result\nN ← result[63]\nZ ← (result == 0)\nC ← Carry_Out(Vn[0], Vn[1])\nV ← Overflow_From_Add(Vn[0], Vn[1])"
    },
    {
      "mnemonic": "fmaxv",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Maximum Reduction (NEON)",
      "summary": "Finds max float in a vector.",
      "syntax": "FMAXV <Sd>, <Vn>.<T>",
      "encoding": {
        "format": "NEON Reduction",
        "binary_pattern": "0 | Q | 0 | 01110 | 0 | 011000 | 01111 | 10 | Rn | Rd",
        "hex_opcode": "0x0E30F800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011000",
            "clean": "011000"
          },
          {
            "raw": "01111",
            "clean": "01111"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (v8.0)",
      "description": "Floating-point maximum reduction across vector elements. Scans all floating-point elements in the source vector and writes the maximum value to the destination scalar register. FPSR is updated with cumulative exception flags from all comparisons; condition flags (N, Z, C, V) are unaffected. AArch64-only instruction requiring NEON support.",
      "example": "FMAXV s0, v1.4s.T",
      "pseudocode": "elements ← VecReduction(Vn, 'max')\nSd ← FPMaxReduction(elements)\nFPSR.IOC ← FPSRAccum from comparisons"
    },
    {
      "mnemonic": "fminv",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Minimum Reduction (NEON)",
      "summary": "Finds min float in a vector.",
      "syntax": "FMINV <Sd>, <Vn>.<T>",
      "encoding": {
        "format": "NEON Reduction",
        "binary_pattern": "0 | Q | 0 | 01110 | 1 | 011000 | 01111 | 10 | Rn | Rd",
        "hex_opcode": "0x0EB0F800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011000",
            "clean": "011000"
          },
          {
            "raw": "01111",
            "clean": "01111"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (v8.0)",
      "description": "Floating-point minimum reduction across vector elements. Scans all floating-point elements in the source vector and writes the minimum value to the destination scalar register. FPSR is updated with cumulative exception flags from all comparisons; condition flags (N, Z, C, V) are unaffected. AArch64-only instruction requiring NEON support.",
      "example": "FMINV s0, v1.4s.T",
      "pseudocode": "elements ← VecReduction(Vn, 'min')\nSd ← FPMinReduction(elements)\nFPSR.IOC ← FPSRAccum from comparisons"
    },
    {
      "mnemonic": "frint32x",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Round to 32-bit Integer (Exact)",
      "summary": "Rounds to 32-bit integer, exact exception.",
      "syntax": "FRINT32X <Sd>, <Sn>",
      "encoding": {
        "format": "Float Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 10100 | 01 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E28C000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10100",
            "clean": "10100"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        }
      ],
      "extension": "FEAT_FRINTTS",
      "description": "Rounds a 32-bit floating-point value to the nearest 32-bit integer value using the current rounding mode, signaling an inexact exception. Condition flags are unaffected. Requires FEAT_FRINTTS; AArch64 only.",
      "example": "FRINT32X s0, s1",
      "pseudocode": "result ← FP_RoundToInt(Sn, RMode_FromFPCR, exact=true)\nif result != Sn\n  FP_InexactException()\nSd ← result"
    },
    {
      "mnemonic": "frint32z",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Round to 32-bit Integer (Zero)",
      "summary": "Rounds to 32-bit integer towards zero.",
      "syntax": "FRINT32Z <Sd>, <Sn>",
      "encoding": {
        "format": "Float Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 10100 | 00 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E284000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10100",
            "clean": "10100"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        }
      ],
      "extension": "FEAT_FRINTTS",
      "description": "Rounds the source single-precision floating-point value to a 32-bit signed integer using round towards zero (truncate) rounding mode, and writes the result as a single-precision floating-point value to the destination. Does not update the NZCV condition flags. Requires FEAT_FRINTTS extension; AArch64 only.",
      "example": "FRINT32Z s0, s1",
      "pseudocode": "Xn_bits ← Sn\nint32_val ← RoundTowardsZero(FPUnpack(Xn_bits), 32)\nSd ← FPPack(int32_val as single-precision floating-point)"
    },
    {
      "mnemonic": "frint64x",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Round to 64-bit Integer (Exact)",
      "summary": "Rounds to 64-bit integer, exact exception.",
      "syntax": "FRINT64X <Sd>, <Sn>",
      "encoding": {
        "format": "Float Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 10100 | 11 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E29C000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10100",
            "clean": "10100"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        }
      ],
      "extension": "FEAT_FRINTTS",
      "description": "Rounds the source single-precision floating-point value to a 64-bit signed integer using the current rounding mode, and writes the result as a single-precision floating-point value to the destination. Signals an inexact exception if the input was not exactly representable as a 64-bit integer. Does not update the NZCV condition flags. Requires FEAT_FRINTTS extension; AArch64 only.",
      "example": "FRINT64X s0, s1",
      "pseudocode": "Xn_bits ← Sn\nint64_val ← RoundUsingCurrentMode(FPUnpack(Xn_bits), 64)\nif int64_val is inexact then signal_inexact_exception()\nSd ← FPPack(int64_val as single-precision floating-point)"
    },
    {
      "mnemonic": "frint64z",
      "architecture": "ARMv8-A",
      "full_name": "Floating-Point Round to 64-bit Integer (Zero)",
      "summary": "Rounds to 64-bit integer towards zero.",
      "syntax": "FRINT64Z <Sd>, <Sn>",
      "encoding": {
        "format": "Float Conversion",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 10100 | 10 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E294000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10100",
            "clean": "10100"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        }
      ],
      "extension": "FEAT_FRINTTS",
      "description": "Rounds the source single-precision floating-point value to a 64-bit signed integer using round towards zero (truncate) rounding mode, and writes the result as a single-precision floating-point value to the destination. Does not update the NZCV condition flags. Requires FEAT_FRINTTS extension; AArch64 only.",
      "example": "FRINT64Z s0, s1",
      "pseudocode": "Xn_bits ← Sn\nint64_val ← RoundTowardsZero(FPUnpack(Xn_bits), 64)\nSd ← FPPack(int64_val as single-precision floating-point)"
    },
    {
      "mnemonic": "chkfeat",
      "architecture": "ARMv8-A",
      "full_name": "Check",
      "summary": "Check feature status (FEAT_CHK).",
      "syntax": "CHK <#imm>",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101000000110010 | 0101 | 000 | 11111",
        "hex_opcode": "0xD503251F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "Feature ID"
        }
      ],
      "extension": "FEAT_CHK",
      "description": "Checks the status of a system feature identified by the immediate operand and raises a CHK exception if the feature is not available or in the expected state. The specific behavior depends on the feature ID encoded in the immediate. Requires FEAT_CHK extension; AArch64 only; may only execute at EL0 and EL1 (subject to CHKFEATURE_EL0 register control).",
      "example": "CHK #imm",
      "pseudocode": "feature_id ← imm\nif not CheckFeature(feature_id) then raise_exception(CHK_EXCEPTION)"
    },
    {
      "mnemonic": "clrex",
      "architecture": "ARMv8-A",
      "full_name": "Clear Exclusive (System)",
      "summary": "Clears the local monitor state (AArch64 variant).",
      "syntax": "CLREX {#<imm>}",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101000000110011 | CRm | 010 | 11111",
        "hex_opcode": "0xD503305F",
        "visual_parts": [
          {
            "raw": "11010101000000110011",
            "clean": "11010101000000110011"
          },
          {
            "raw": "CRm",
            "clean": "CRm"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "Optional"
        }
      ],
      "extension": "Base (Atomic)",
      "description": "Clears the local monitor state associated with the current PE, removing any exclusive accesses held by this processor. Subsequent LDEX/STEX instructions will treat the exclusive monitor as clear. Does not update condition flags. AArch64 only; optional immediate operand is typically 0xF (ignored).",
      "example": "CLREX",
      "pseudocode": "local_monitor_state ← CLEAR"
    },
    {
      "mnemonic": "fadd",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Add (Single)",
      "summary": "Adds two single-precision floating-point registers.",
      "syntax": "FADD <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "Float Data Proc",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 001 | 0 | 10 | Rn | Rd",
        "hex_opcode": "0x1E202800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Dest (32-bit)"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "F.P.",
      "description": "Floating-point addition of two single-precision (32-bit) values. Adds operand Sn and operand Sm and writes the result to Sd. FPSR exception flags are updated; condition flags (N, Z, C, V) are unaffected. AArch64-only instruction; uses IEEE 754 rounding mode from FPCR.",
      "example": "FADD s0, s1, s2",
      "pseudocode": "operand1 ← Sn (32-bit float)\noperand2 ← Sm (32-bit float)\nresult ← FPAdd(operand1, operand2)\nSd ← result\nUpdateFPSR(exception_flags)"
    },
    {
      "mnemonic": "fadd",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Add (Double)",
      "summary": "Adds two double-precision floating-point registers.",
      "syntax": "FADD <Dd>, <Dn>, <Dm>",
      "encoding": {
        "format": "Float Data Proc",
        "binary_pattern": "0 | 0 | 0 | 11110 | 01 | 1 | Rm | 001 | 0 | 10 | Rn | Rd",
        "hex_opcode": "0x1E602800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Dest (64-bit)"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "F.P.",
      "description": "Floating-point addition of two double-precision (64-bit) values. Adds operand Dn and operand Dm and writes the result to Dd. FPSR exception flags are updated; condition flags (N, Z, C, V) are unaffected. AArch64-only instruction; uses IEEE 754 rounding mode from FPCR.",
      "example": "FADD d0, d1, d2",
      "pseudocode": "operand1 ← Dn (64-bit float)\noperand2 ← Dm (64-bit float)\nresult ← FPAdd(operand1, operand2)\nDd ← result\nUpdateFPSR(exception_flags)"
    },
    {
      "mnemonic": "fsub",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Subtract (Single)",
      "summary": "Subtracts two single-precision floating-point registers.",
      "syntax": "FSUB <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "Float Data Proc",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 001 | 1 | 10 | Rn | Rd",
        "hex_opcode": "0x1E203800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "F.P.",
      "description": "Floating-point subtraction of two single-precision (32-bit) values. Subtracts operand Sm from operand Sn and writes the result to Sd. FPSR exception flags are updated; condition flags (N, Z, C, V) are unaffected. AArch64-only instruction; uses IEEE 754 rounding mode from FPCR.",
      "example": "FSUB s0, s1, s2",
      "pseudocode": "operand1 ← Sn (32-bit float)\noperand2 ← Sm (32-bit float)\nresult ← FPSub(operand1, operand2)\nSd ← result\nUpdateFPSR(exception_flags)"
    },
    {
      "mnemonic": "fsub",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Subtract (Double)",
      "summary": "Subtracts two double-precision floating-point registers.",
      "syntax": "FSUB <Dd>, <Dn>, <Dm>",
      "encoding": {
        "format": "Float Data Proc",
        "binary_pattern": "0 | 0 | 0 | 11110 | 01 | 1 | Rm | 001 | 1 | 10 | Rn | Rd",
        "hex_opcode": "0x1E603800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "F.P.",
      "description": "Floating-point subtraction of two double-precision (64-bit) values. Subtracts operand Dm from operand Dn and writes the result to Dd. FPSR exception flags are updated; condition flags (N, Z, C, V) are unaffected. AArch64-only instruction; uses IEEE 754 rounding mode from FPCR.",
      "example": "FSUB d0, d1, d2",
      "pseudocode": "operand1 ← Dn (64-bit float)\noperand2 ← Dm (64-bit float)\nresult ← FPSub(operand1, operand2)\nDd ← result\nUpdateFPSR(exception_flags)"
    },
    {
      "mnemonic": "fmul",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Multiply (Single)",
      "summary": "Multiplies two single-precision floating-point registers.",
      "syntax": "FMUL <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "Float Data Proc",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 0 | 00010 | Rn | Rd",
        "hex_opcode": "0x1E200800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "F.P.",
      "description": "Floating-point multiplication of two single-precision (32-bit) values. Multiplies operand Sn by operand Sm and writes the result to Sd. FPSR exception flags are updated; condition flags (N, Z, C, V) are unaffected. AArch64-only instruction; uses IEEE 754 rounding mode from FPCR.",
      "example": "FMUL s0, s1, s2",
      "pseudocode": "operand1 ← Sn (32-bit float)\noperand2 ← Sm (32-bit float)\nresult ← FPMul(operand1, operand2)\nSd ← result\nUpdateFPSR(exception_flags)"
    },
    {
      "mnemonic": "fmul",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Multiply (Double)",
      "summary": "Multiplies two double-precision floating-point registers.",
      "syntax": "FMUL <Dd>, <Dn>, <Dm>",
      "encoding": {
        "format": "Float Data Proc",
        "binary_pattern": "0 | 0 | 0 | 11110 | 01 | 1 | Rm | 0 | 00010 | Rn | Rd",
        "hex_opcode": "0x1E600800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "F.P.",
      "description": "Floating-point multiplication of two double-precision (64-bit) values. Multiplies operand Dn by operand Dm and writes the result to Dd. FPSR exception flags are updated; condition flags (N, Z, C, V) are unaffected. AArch64-only instruction; uses IEEE 754 rounding mode from FPCR.",
      "example": "FMUL d0, d1, d2",
      "pseudocode": "operand1 ← Dn (64-bit float)\noperand2 ← Dm (64-bit float)\nresult ← FPMul(operand1, operand2)\nDd ← result\nUpdateFPSR(exception_flags)"
    },
    {
      "mnemonic": "fdiv",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Divide (Single)",
      "summary": "Divides two single-precision floating-point registers.",
      "syntax": "FDIV <Sd>, <Sn>, <Sm>",
      "encoding": {
        "format": "Float Data Proc",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 0001 | 10 | Rn | Rd",
        "hex_opcode": "0x1E201800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Sd",
          "desc": "Destination 32-bit floating-point register"
        },
        {
          "name": "Sn",
          "desc": "Dividend"
        },
        {
          "name": "Sm",
          "desc": "Divisor"
        }
      ],
      "extension": "F.P.",
      "description": "Divides the single-precision floating-point value in Sn by the value in Sm and stores the result in Sd. This instruction operates on 32-bit IEEE 754 floating-point values. The NZCV flags are updated based on the result: N is set if the result is negative, Z if zero, C and V are set according to IEEE 754 semantics. This is an AArch64-only instruction requiring the Floating-Point extension.",
      "example": "FDIV s0, s1, s2",
      "pseudocode": "Sd ← Sn ÷ Sm\nN ← Sd[31]\nZ ← (Sd == 0.0)\nC ← (overflow or underflow)\nV ← (invalid operation or overflow)"
    },
    {
      "mnemonic": "fdiv",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Divide (Double)",
      "summary": "Divides two double-precision floating-point registers.",
      "syntax": "FDIV <Dd>, <Dn>, <Dm>",
      "encoding": {
        "format": "Float Data Proc",
        "binary_pattern": "0 | 0 | 0 | 11110 | 01 | 1 | Rm | 0001 | 10 | Rn | Rd",
        "hex_opcode": "0x1E601800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dn",
          "desc": "Dividend"
        },
        {
          "name": "Dm",
          "desc": "Divisor"
        }
      ],
      "extension": "F.P.",
      "description": "Divides the double-precision floating-point value in Dn by the value in Dm and stores the result in Dd. This instruction operates on 64-bit IEEE 754 floating-point values. The NZCV flags are updated based on the result: N is set if the result is negative, Z if zero, C and V are set according to IEEE 754 semantics. This is an AArch64-only instruction requiring the Floating-Point extension.",
      "example": "FDIV d0, d1, d2",
      "pseudocode": "Dd ← Dn ÷ Dm\nN ← Dd[63]\nZ ← (Dd == 0.0)\nC ← (overflow or underflow)\nV ← (invalid operation or overflow)"
    },
    {
      "mnemonic": "fcmp",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Compare (Single)",
      "summary": "Compares two single-precision registers and updates NZCV flags.",
      "syntax": "FCMP <Sn>, <Sm>",
      "encoding": {
        "format": "Float Compare",
        "binary_pattern": "0 | 0 | 0 | 11110 | 00 | 1 | Rm | 00 | 1000 | Rn | 00 | 000",
        "hex_opcode": "0x1E202000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "000",
            "clean": "000"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13:10 | 9:5 | 4:3 | 2:0"
      },
      "operands": [
        {
          "name": "Sn",
          "desc": "First source 32-bit floating-point register"
        },
        {
          "name": "Sm",
          "desc": "Second source 32-bit floating-point register"
        }
      ],
      "extension": "F.P.",
      "description": "Compares two single-precision floating-point registers (Sn and Sm) and updates the NZCV condition flags based on the result. Handles NaN operands by setting both N and V flags; neither operand being NaN results in N, Z, C, V being set according to the comparison outcome. AArch64 only.",
      "example": "FCMP s1, s2",
      "pseudocode": "op1 ← FPUnpack(Sn)\nop2 ← FPUnpack(Sm)\nresult ← FPCompare(op1, op2)\nif isNaN(op1) or isNaN(op2) then\n  N ← 1; Z ← 0; C ← 1; V ← 1\nelse if op1 == op2 then\n  N ← 0; Z ← 1; C ← 1; V ← 0\nelse if op1 < op2 then\n  N ← 1; Z ← 0; C ← 0; V ← 0\nelse\n  N ← 0; Z ← 0; C ← 1; V ← 0"
    },
    {
      "mnemonic": "fcmp",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Compare (Double)",
      "summary": "Compares two double-precision registers and updates NZCV flags.",
      "syntax": "FCMP <Dn>, <Dm>",
      "encoding": {
        "format": "Float Compare",
        "binary_pattern": "0 | 0 | 0 | 11110 | 01 | 1 | Rm | 00 | 1000 | Rn | 00 | 000",
        "hex_opcode": "0x1E602000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "000",
            "clean": "000"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13:10 | 9:5 | 4:3 | 2:0"
      },
      "operands": [
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "F.P.",
      "description": "Compares two double-precision floating-point registers (Dn and Dm) and updates the NZCV condition flags based on the result. Handles NaN operands by setting both N and V flags; neither operand being NaN results in N, Z, C, V being set according to the comparison outcome. AArch64 only.",
      "example": "FCMP d1, d2",
      "pseudocode": "op1 ← FPUnpack(Dn)\nop2 ← FPUnpack(Dm)\nresult ← FPCompare(op1, op2)\nif isNaN(op1) or isNaN(op2) then\n  N ← 1; Z ← 0; C ← 1; V ← 1\nelse if op1 == op2 then\n  N ← 0; Z ← 1; C ← 1; V ← 0\nelse if op1 < op2 then\n  N ← 1; Z ← 0; C ← 0; V ← 0\nelse\n  N ← 0; Z ← 0; C ← 1; V ← 0"
    },
    {
      "mnemonic": "fmov",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Move (Register)",
      "summary": "Copies value between floating-point registers.",
      "syntax": "FMOV <Dd>, <Dn>",
      "encoding": {
        "format": "Float Data Proc",
        "binary_pattern": "0 | 0 | 0 | 11110 | 01 | 10000 | 00 | 10000 | Rn | Rd",
        "hex_opcode": "0x1E604000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:15 | 14:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        }
      ],
      "extension": "F.P.",
      "description": "Copies a 64-bit double-precision floating-point value from Dn to Dd without any conversion or modification. The condition flags NZCV are not affected. This is an AArch64-only instruction requiring the Floating-Point extension.",
      "example": "FMOV d0, d1",
      "pseudocode": "Dd ← Dn"
    },
    {
      "mnemonic": "fmov",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Move (Immediate)",
      "summary": "Moves immediate value into floating-point register.",
      "syntax": "FMOV <Dd>, #<imm>",
      "encoding": {
        "format": "Float Imm",
        "binary_pattern": "0 | 0 | 0 | 11110 | 01 | 1 | imm8 | 100 | 00000 | Rd",
        "hex_opcode": "0x1E601000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm8",
            "clean": "imm8"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Destination 64-bit SIMD/FP register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "F.P.",
      "description": "Moves an 8-bit encoded immediate value into a 64-bit double-precision floating-point register Dd. The immediate is expanded to a full 64-bit floating-point value according to the VFPv3 expanded-immediate encoding scheme. The condition flags NZCV are not affected. This is an AArch64-only instruction requiring the Floating-Point extension.",
      "example": "FMOV d0, #16",
      "pseudocode": "Dd ← ExpandImmediate(imm8)"
    },
    {
      "mnemonic": "scvtf",
      "architecture": "ARMv8-A",
      "full_name": "Signed Integer Convert to Floating-point",
      "summary": "Converts signed integer (scalar) to floating-point.",
      "syntax": "SCVTF <Dd>, <Xn>",
      "encoding": {
        "format": "Float Conversion",
        "binary_pattern": "1 | 0 | 0 | 11110 | 00 | 1 | 00 | 010 | 000000 | Rn | Rd",
        "hex_opcode": "0x9E220000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Dest (Double)"
        },
        {
          "name": "Xn",
          "desc": "Src (Int64)"
        }
      ],
      "extension": "F.P.",
      "description": "Converts a 64-bit signed integer value from Xn to a double-precision floating-point value using the current rounding mode, and writes the result to Dd. Does not update the NZCV condition flags. AArch64 only.",
      "example": "SCVTF d0, x1",
      "pseudocode": "int_val ← X[n]\nfp_result ← ConvertSignedIntegerToFP(int_val, double-precision, current_rounding_mode)\nD[d] ← FPPack(fp_result)"
    },
    {
      "mnemonic": "fcvtzs",
      "architecture": "ARMv8-A",
      "full_name": "Floating-point Convert to Signed Integer (Round towards Zero)",
      "summary": "Converts floating-point to signed integer.",
      "syntax": "FCVTZS <Xd>, <Dn>",
      "encoding": {
        "format": "Float Conversion",
        "binary_pattern": "1 | 0 | 0 | 11110 | 00 | 1 | 11 | 000 | 000000 | Rn | Rd",
        "hex_opcode": "0x9E380000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:19 | 18:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Dest (Int64)"
        },
        {
          "name": "Dn",
          "desc": "Src (Double)"
        }
      ],
      "extension": "F.P.",
      "description": "Converts a 64-bit double-precision floating-point value in Dn to a signed 64-bit integer, rounding towards zero, and stores the result in Xd. If the result overflows the signed 64-bit range, the result is the most negative or most positive 64-bit integer depending on the input sign. The condition flags NZCV are not affected. This is an AArch64-only instruction requiring the Floating-Point extension.",
      "example": "FCVTZS x0, d1",
      "pseudocode": "Xd ← ConvertToSignedInteger(Dn, RoundTowardZero)\nif (overflow) then\n  Xd ← (Dn < 0) ? INT64_MIN : INT64_MAX"
    },
    {
      "mnemonic": "rev",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bytes (32-bit)",
      "summary": "Reverses the byte order in a 32-bit register (Endianness swap).",
      "syntax": "REV <Wd>, <Wn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 1 | 0 | 11010110 | 00000 | 0000 | 10 | Rn | Rd",
        "hex_opcode": "0x5AC00800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Reverses the byte order of a 32-bit value in Wn and stores the result in Wd, performing endianness conversion. The upper 32 bits of the destination register are zeroed. The condition flags NZCV are not affected. This is an AArch64-only instruction available in the Base instruction set.",
      "example": "REV w0, w1",
      "pseudocode": "Wd ← ReverseBytes(Wn)\nXd[63:32] ← 0"
    },
    {
      "mnemonic": "rbit",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bits (64-bit)",
      "summary": "Reverses the bit order in a 64-bit register.",
      "syntax": "RBIT <Xd>, <Xn>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 1 | 0 | 11010110 | 00000 | 000000 | Rn | Rd",
        "hex_opcode": "0xDAC00000",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "00000",
            "clean": "00000"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Destination 64-bit integer register"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Reverses the bit order in a 64-bit register, placing the least significant bit at the most significant position. No condition flags are affected. This is an AArch64 instruction with no privilege requirements.",
      "example": "RBIT x0, x1",
      "pseudocode": "Xd ← BitReverse(Xn)"
    },
    {
      "mnemonic": "sxtb",
      "architecture": "ARMv8-A",
      "full_name": "Sign Extend Byte",
      "summary": "Extracts the lowest 8 bits and sign-extends to 32 bits (Alias for SBFM).",
      "syntax": "SXTB <Wd>, <Wn>",
      "encoding": {
        "format": "Bitfield",
        "binary_pattern": "0 | 00 | 100110 | 0 | 000000 | 000111 | Rn | Rd",
        "hex_opcode": "0x13001C00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "100110",
            "clean": "100110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "000111",
            "clean": "000111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "First source / base 32-bit integer register"
        }
      ],
      "extension": "Base",
      "description": "Extracts the lowest 8 bits of a 32-bit register and sign-extends the result to fill all 32 bits. No condition flags are affected. This is an AArch64 alias for SBFM (Signed Bitfield Move) with bit positions 0 and 7.",
      "example": "SXTB w0, w1",
      "pseudocode": "Wd ← SignExtend(Wn[7:0], 32)"
    },
    {
      "mnemonic": "sxtw",
      "architecture": "ARMv8-A",
      "full_name": "Sign Extend Word",
      "summary": "Sign-extends a 32-bit register to 64 bits (Alias for SBFM).",
      "syntax": "SXTW <Xd>, <Wn>",
      "encoding": {
        "format": "Bitfield",
        "binary_pattern": "1 | 00 | 100110 | 1 | 000000 | 011111 | Rn | Rd",
        "hex_opcode": "0x93407C00",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "100110",
            "clean": "100110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "011111",
            "clean": "011111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30:29 | 28:23 | 22 | 21:16 | 15:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xd",
          "desc": "Dest (64)"
        },
        {
          "name": "Wn",
          "desc": "Source (32)"
        }
      ],
      "extension": "Base",
      "description": "Sign-extends a 32-bit value to fill 64 bits, replicating bit 31 into all upper bits. No condition flags are affected. This is an AArch64 alias for SBFM with bit positions 0 and 31.",
      "example": "SXTW x0, w1",
      "pseudocode": "Xd ← SignExtend(Wn, 64)"
    },
    {
      "mnemonic": "adc",
      "architecture": "ARMv8-A",
      "full_name": "Add with Carry (A32)",
      "summary": "Adds two 32-bit values and the Carry flag.",
      "syntax": "ADC{S}<c> <Rd>, <Rn>, <Rm> {, <shift>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 0000 | 101 | 0 | Rn | Rd | imm5 | stype | 0 | Rm",
        "hex_opcode": "0x00A00000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Adds two 32-bit values from Rn and Rm along with the Carry flag (C) and stores the result in Rd. If the S bit is set, the condition flags are updated: N and Z reflect the result, C is set on unsigned overflow, V is set on signed overflow. The shift operand is optional and applies a shift to Rm before the addition. This is an A32 instruction with conditional execution.",
      "example": "ADC r0, r1, r2",
      "pseudocode": "shifted_Rm ← ApplyShift(Rm, shift)\nresult ← Rn + shifted_Rm + C\nRd ← result\nif S then\n  N ← result[31]\n  Z ← (result == 0)\n  C ← CarryOut(Rn + shifted_Rm + C)\n  V ← OverflowFrom(Rn + shifted_Rm + C)"
    },
    {
      "mnemonic": "add",
      "architecture": "ARMv8-A",
      "full_name": "Add (A32)",
      "summary": "Adds two 32-bit values.",
      "syntax": "ADD{S}<c> <Rd>, <Rn>, <Rm> {, <shift>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 0000 | 100 | 0 | Rn | Rd | imm5 | stype | 0 | Rm",
        "hex_opcode": "0x00800000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Adds two 32-bit operands and stores the result in the destination register. If the S bit is set, the condition flags (N, Z, C, V) are updated based on the result; otherwise they are unaffected. This is an A32 instruction where the condition code (cond) field determines execution based on the current condition flags.",
      "example": "ADD r0, r1, r2",
      "pseudocode": "result ← Rn + (Rm << shift_amount)\nRd ← result[31:0]\nif S then\n  N ← result[31]\n  Z ← (result == 0)\n  C ← CarryOut(Rn, Rm << shift_amount)\n  V ← OverflowFrom(Rn, Rm << shift_amount)"
    },
    {
      "mnemonic": "adr",
      "architecture": "ARMv8-A",
      "full_name": "Form PC-relative Address (A32)",
      "summary": "Adds an immediate value to the PC register.",
      "syntax": "ADR<c> <Rd>, <label>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 0010 | 100 | 0 | 1111 | Rd | imm12",
        "hex_opcode": "0x028F0000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Computes the PC-relative address of a label and stores it in Rd. The address is calculated by adding an 12-bit immediate (rotated by an even number of bits) to PC. The assembler resolves the label to the appropriate immediate offset. The condition flags NZCV are not affected. This is an A32 instruction with conditional execution.",
      "example": "ADR r0, label",
      "pseudocode": "offset ← RotateImmediate(imm12)\nRd ← PC + offset"
    },
    {
      "mnemonic": "and",
      "architecture": "ARMv8-A",
      "full_name": "Bitwise AND (A32)",
      "summary": "Performs a bitwise AND on two 32-bit values.",
      "syntax": "AND{S}<c> <Rd>, <Rn>, <Rm> {, <shift>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 0000 | 000 | 0 | Rn | Rd | imm5 | stype | 0 | Rm",
        "hex_opcode": "0x00000000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Performs a bitwise AND of two 32-bit values and stores the result in Rd. If the S suffix is present, condition flags are updated: N and Z are set based on the result, C is set to the shifter carry-out, and V is unaffected. Executes in A32 (32-bit ARM) instruction set only.",
      "example": "AND r0, r1, r2",
      "pseudocode": "result ← Rn AND (Rm shifted by shift_amount)\nRd ← result\nif S == 1 then\n  N ← result[31]\n  Z ← (result == 0)\n  C ← shifter_carry_out\nelse\n  condition_flags unchanged"
    },
    {
      "mnemonic": "asr",
      "architecture": "ARMv8-A",
      "full_name": "Arithmetic Shift Right (A32)",
      "summary": "Arithmetic right shift (sign-extending).",
      "syntax": "ASR{S}<c> <Rd>, <Rm>, <Rs>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00011 | 01 | 0 | 0000 | Rd | Rs | 0 | 10 | 1 | Rm",
        "hex_opcode": "0x01A00050",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Rs",
          "desc": "Shift Amount"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Performs an arithmetic right shift of Rm by the number of bits specified in Rs (register shift amount), sign-extending the vacated bits from the left. If the S suffix is present, condition flags are updated: N and Z based on the result, C set to the last bit shifted out, and V is unaffected. Executes in A32 only.",
      "example": "ASR r0, r2, r6",
      "pseudocode": "shift_amount ← Rs[7:0]\nif shift_amount == 0 then\n  result ← Rm\n  carry_out ← C\nelse if shift_amount < 32 then\n  result ← Rm >> shift_amount (arithmetic, sign-extended)\n  carry_out ← Rm[shift_amount - 1]\nelse\n  result ← (Rm[31] repeated 32 times)\n  carry_out ← Rm[31]\nRd ← result\nif S == 1 then\n  N ← result[31]\n  Z ← (result == 0)\n  C ← carry_out\nelse\n  condition_flags unchanged"
    },
    {
      "mnemonic": "b",
      "architecture": "ARMv8-A",
      "full_name": "Branch (A32)",
      "summary": "Branch relative (PC +/- 32MB).",
      "syntax": "B<c> <label>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "cond | 101 | 0 | imm24",
        "hex_opcode": "0x0A000000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm24",
            "clean": "imm24"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23:0"
      },
      "operands": [
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Performs a relative branch to a label up to ±32 MB from the current instruction. The branch is taken only if the condition code (specified by <c>) is satisfied; if no condition is specified, it is always taken (AL). The PC is updated to point to the target address. Executes in A32 only.",
      "example": "B label",
      "pseudocode": "if condition_satisfied then\n  PC ← PC + (sign_extend(imm24) << 2) + 8"
    },
    {
      "mnemonic": "bfc",
      "architecture": "ARMv8-A",
      "full_name": "Bit Field Clear",
      "summary": "Clears a bitfield in a register.",
      "syntax": "BFC<c> <Rd>, #<lsb>, #<width>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 0111110 | msb | Rd | lsb | 001 | 1111",
        "hex_opcode": "0x07C0001F",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0111110",
            "clean": "0111110"
          },
          {
            "raw": "msb",
            "clean": "msb"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "lsb",
            "clean": "lsb"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:28 | 27:21 | 20:16 | 15:12 | 11:7 | 6:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "lsb",
          "desc": "Start Bit"
        },
        {
          "name": "width",
          "desc": "Width"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Clears a contiguous bitfield in a 32-bit register, setting bits from lsb to (lsb+width-1) to zero while preserving all other bits. No condition flags are affected. This is an A32 instruction where the condition code (cond) field determines execution; width is computed as (msb-lsb+1).",
      "example": "BFC r0, #0, #width",
      "pseudocode": "width ← msb - lsb + 1\nmask ← ((1 << width) - 1) << lsb\nRd ← Rd AND NOT(mask)"
    },
    {
      "mnemonic": "bfi",
      "architecture": "ARMv8-A",
      "full_name": "Bit Field Insert",
      "summary": "Copies a bitfield into a register.",
      "syntax": "BFI<c> <Rd>, <Rn>, #<lsb>, #<width>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 0111110 | msb | Rd | lsb | 001 | Rn",
        "hex_opcode": "0x07C00010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0111110",
            "clean": "0111110"
          },
          {
            "raw": "msb",
            "clean": "msb"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "lsb",
            "clean": "lsb"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:21 | 20:16 | 15:12 | 11:7 | 6:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "lsb",
          "desc": "Start"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Copies a contiguous bitfield from the source register into the destination register at a specified bit position, preserving all other bits. No condition flags are affected. This is an A32 instruction where the condition code (cond) field determines execution; width is computed as (msb-lsb+1).",
      "example": "BFI r0, r1, #0, #width",
      "pseudocode": "width ← msb - lsb + 1\nmask ← ((1 << width) - 1)\nsource_bits ← (Rn AND mask) << lsb\ndest_mask ← NOT((mask << lsb))\nRd ← (Rd AND dest_mask) OR source_bits"
    },
    {
      "mnemonic": "bic",
      "architecture": "ARMv8-A",
      "full_name": "Bit Clear (A32)",
      "summary": "Performs AND NOT (Rd = Rn & ~Rm).",
      "syntax": "BIC{S}<c> <Rd>, <Rn>, <Rm> {, <shift>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00011 | 10 | 0 | Rn | Rd | imm5 | stype | 0 | Rm",
        "hex_opcode": "0x01C00000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Performs a bitwise AND with the complement (NOT) of Rm, computing Rd = Rn AND ~Rm (bit clear). If the S suffix is present, condition flags are updated: N and Z set based on the result, C set to shifter carry-out, and V is unaffected. Executes in A32 only.",
      "example": "BIC r0, r1, r2",
      "pseudocode": "result ← Rn AND NOT(Rm shifted by shift_amount)\nRd ← result\nif S == 1 then\n  N ← result[31]\n  Z ← (result == 0)\n  C ← shifter_carry_out\nelse\n  condition_flags unchanged"
    },
    {
      "mnemonic": "bkpt",
      "architecture": "ARMv8-A",
      "full_name": "Breakpoint (A32)",
      "summary": "Causes a software breakpoint.",
      "syntax": "BKPT #<imm>",
      "encoding": {
        "format": "System",
        "binary_pattern": "cond | 00010 | 01 | 0 | imm12 | 0111 | imm4",
        "hex_opcode": "0x01200070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Causes a software breakpoint exception (BKPT) to be raised. The immediate operand is encoded in the instruction as a 16-bit value for debugging purposes but does not affect processor state directly. This is an A32 instruction that triggers a breakpoint interrupt; execution cannot proceed past this instruction without debugger intervention.",
      "example": "BKPT #16",
      "pseudocode": "GenerateException(Breakpoint)\nPC ← (unchanged by architecture, debugger determines resumption)"
    },
    {
      "mnemonic": "bl",
      "architecture": "ARMv8-A",
      "full_name": "Branch with Link (A32)",
      "summary": "Calls a subroutine, storing return address in LR (R14).",
      "syntax": "BL<c> <label>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "cond | 101 | 1 | imm24",
        "hex_opcode": "0x0B000000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm24",
            "clean": "imm24"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23:0"
      },
      "operands": [
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Calls a subroutine by performing a relative branch to a label and storing the return address (address of the next instruction after BL) in the link register (LR, R14). The branch offset is ±32 MB from the current instruction. Branch is conditional based on the specified condition code. Executes in A32 only.",
      "example": "BL label",
      "pseudocode": "if condition_satisfied then\n  LR ← PC + 4\n  PC ← PC + (sign_extend(imm24) << 2) + 8"
    },
    {
      "mnemonic": "blx",
      "architecture": "ARMv8-A",
      "full_name": "Branch with Link and Exchange",
      "summary": "Calls subroutine and optionally switches to Thumb state.",
      "syntax": "BLX<c> <Rm>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "cond | 00010010 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0011 | Rm",
        "hex_opcode": "0x012FFF30",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010010",
            "clean": "00010010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rm",
          "desc": "Target Reg"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Branches to a subroutine whose address is in a register and stores the return address (instruction following the BLX) in the link register (LR/R14). The least significant bit of the target register determines whether execution switches to Thumb state (bit[0]=1) or remains in A32 state (bit[0]=0). This is an A32 instruction where the condition code (cond) field determines execution.",
      "example": "BLX r2",
      "pseudocode": "LR ← PC + 4\nPC ← Rm AND NOT(0x1)\nif Rm[0] == 1 then CPSR.T ← 1 else CPSR.T ← 0"
    },
    {
      "mnemonic": "bx",
      "architecture": "ARMv8-A",
      "full_name": "Branch and Exchange",
      "summary": "Branches to address in register, optionally switching ISA.",
      "syntax": "BX<c> <Rm>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "cond | 00010010 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0001 | Rm",
        "hex_opcode": "0x012FFF10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010010",
            "clean": "00010010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rm",
          "desc": "Target Reg"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Branch to address in register Rm, optionally switching between A32/T32 instruction sets based on bit[0] of Rm (0=A32, 1=T32). No flags are affected. Execution state restricted to A32; generates an Undefined Instruction exception if executed in T32.",
      "example": "BX r2",
      "pseudocode": "if ConditionPassed() then\n  new_PC ← Rm & 0xFFFFFFFE\n  if (Rm & 1) == 1 then\n    CPSR.T ← 1\n  else\n    CPSR.T ← 0\n  BranchWritePC(new_PC)"
    },
    {
      "mnemonic": "clrex",
      "architecture": "ARMv8-A",
      "full_name": "Clear Exclusive (A32)",
      "summary": "Clears the local exclusive access monitor.",
      "syntax": "CLREX<c>",
      "encoding": {
        "format": "System",
        "binary_pattern": "111101010111 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0001 | 1111",
        "hex_opcode": "0xF57FF01F",
        "visual_parts": [
          {
            "raw": "111101010111",
            "clean": "111101010111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [],
      "extension": "A32 (Base)",
      "description": "Clears the local exclusive access monitor, cancelling any pending exclusive memory operations (LDREX/STREX sequences). No flags are affected. Restricted to A32 instruction set; in T32 use CLREX or equivalent (T32-encoded form).",
      "example": "CLREX",
      "pseudocode": "if ConditionPassed() then\n  ClearExclusiveMonitor()"
    },
    {
      "mnemonic": "clz",
      "architecture": "ARMv8-A",
      "full_name": "Count Leading Zeros (A32)",
      "summary": "Counts the number of consecutive zeros from MSB.",
      "syntax": "CLZ<c> <Rd>, <Rm>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00010110 | 1 | 1 | 1 | 1 | Rd | 1 | 1 | 1 | 1 | 0001 | Rm",
        "hex_opcode": "0x016F0F10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010110",
            "clean": "00010110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:20 | 19 | 18 | 17 | 16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Counts the number of consecutive zero bits from the most significant bit (MSB) of Rm and stores the count in Rd; if Rm is 0, the result is 32. Condition flags are not affected by this instruction. Executes in A32 only.",
      "example": "CLZ r0, r2",
      "pseudocode": "if Rm == 0 then\n  Rd ← 32\nelse\n  count ← 0\n  for i from 31 down to 0\n    if Rm[i] == 1 then\n      break\n    count ← count + 1\n  Rd ← count\ncondition_flags unchanged"
    },
    {
      "mnemonic": "cmn",
      "architecture": "ARMv8-A",
      "full_name": "Compare Negative (A32)",
      "summary": "Adds two values and updates flags (discarding result). Same as ADDS with no destination.",
      "syntax": "CMN<c> <Rn>, <Rm> {, <shift>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00010 | 11 | 1 | Rn | 0 | 0 | 0 | 0 | imm5 | stype | 0 | Rm",
        "hex_opcode": "0x01700000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15 | 14 | 13 | 12 | 11:7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Computes Rn + (shifted Rm) and updates the N, Z, C, V flags based on the result, but discards the calculated value. Equivalent to an ADDS instruction with no destination register. Restricted to A32 instruction set.",
      "example": "CMN r1, r2",
      "pseudocode": "if ConditionPassed() then\n  (result, carry, overflow) ← AddWithCarry(Rn, shifted_Rm, '0')\n  N ← result[31]\n  Z ← (result == 0)\n  C ← carry\n  V ← overflow"
    },
    {
      "mnemonic": "cmp",
      "architecture": "ARMv8-A",
      "full_name": "Compare (A32)",
      "summary": "Subtracts two values and updates flags (discarding result).",
      "syntax": "CMP<c> <Rn>, <Rm> {, <shift>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00010 | 10 | 1 | Rn | 0 | 0 | 0 | 0 | imm5 | stype | 0 | Rm",
        "hex_opcode": "0x01500000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15 | 14 | 13 | 12 | 11:7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Computes Rn - (shifted Rm) and updates the N, Z, C, V flags based on the result, but discards the calculated value. Equivalent to a SUBS instruction with no destination register. Restricted to A32 instruction set.",
      "example": "CMP r1, r2",
      "pseudocode": "if ConditionPassed() then\n  (result, carry, overflow) ← AddWithCarry(Rn, NOT(shifted_Rm), '1')\n  N ← result[31]\n  Z ← (result == 0)\n  C ← carry\n  V ← overflow"
    },
    {
      "mnemonic": "dmb",
      "architecture": "ARMv8-A",
      "full_name": "Data Memory Barrier (A32)",
      "summary": "Ensures memory access ordering.",
      "syntax": "DMB <option>",
      "encoding": {
        "format": "System",
        "binary_pattern": "111101010111 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0101 | option",
        "hex_opcode": "0xF57FF050",
        "visual_parts": [
          {
            "raw": "111101010111",
            "clean": "111101010111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "option",
            "clean": "option"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "option",
          "desc": "SY, ISH, etc"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Data Memory Barrier: guarantees that all explicit memory operations issued before this instruction complete before any memory operations after it begin. Affects memory ordering and synchronization semantics. No flags are affected. Restricted to A32 instruction set.",
      "example": "DMB option",
      "pseudocode": "if ConditionPassed() then\n  DataMemoryBarrier(option)"
    },
    {
      "mnemonic": "dsb",
      "architecture": "ARMv8-A",
      "full_name": "Data Synchronization Barrier (A32)",
      "summary": "Ensures completion of memory accesses.",
      "syntax": "DSB <option>",
      "encoding": {
        "format": "System",
        "binary_pattern": "111101010111 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0100 | option",
        "hex_opcode": "0xF57FF040",
        "visual_parts": [
          {
            "raw": "111101010111",
            "clean": "111101010111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "option",
            "clean": "option"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "option",
          "desc": "SY, ISH, etc"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Data Synchronization Barrier: ensures all explicit memory operations issued before this instruction complete before the instruction itself completes, serializing memory access. No flags are affected. Restricted to A32 instruction set.",
      "example": "DSB option",
      "pseudocode": "if ConditionPassed() then\n  DataSynchronizationBarrier(option)"
    },
    {
      "mnemonic": "eor",
      "architecture": "ARMv8-A",
      "full_name": "Exclusive OR (A32)",
      "summary": "Performs bitwise XOR.",
      "syntax": "EOR{S}<c> <Rd>, <Rn>, <Rm> {, <shift>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 0000 | 001 | 0 | Rn | Rd | imm5 | stype | 0 | Rm",
        "hex_opcode": "0x00200000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm5",
            "clean": "imm5"
          },
          {
            "raw": "stype",
            "clean": "stype"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Performs a bitwise exclusive OR (XOR) of two 32-bit values and stores the result in Rd. If the S suffix is present, condition flags are updated: N and Z set based on the result, C set to shifter carry-out, and V is unaffected. Executes in A32 only.",
      "example": "EOR r0, r1, r2",
      "pseudocode": "result ← Rn XOR (Rm shifted by shift_amount)\nRd ← result\nif S == 1 then\n  N ← result[31]\n  Z ← (result == 0)\n  C ← shifter_carry_out\nelse\n  condition_flags unchanged"
    },
    {
      "mnemonic": "hvc",
      "architecture": "ARMv8-A",
      "full_name": "Hypervisor Call (A32)",
      "summary": "Calls the Hypervisor (EL2).",
      "syntax": "HVC #<imm>",
      "encoding": {
        "format": "System",
        "binary_pattern": "cond | 00010 | 10 | 0 | imm12 | 0111 | imm4",
        "hex_opcode": "0x01400070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "A32 (System)",
      "description": "Hypervisor Call: traps to Exception Level 2 (EL2 / Hypervisor), passing a 16-bit immediate as the hypervisor call number. Requires HYP mode to be available (ARMv7 with Virtualization Extensions or later). Generates HVC exception; no flags are affected. Restricted to A32 instruction set.",
      "example": "HVC #16",
      "pseudocode": "if ConditionPassed() then\n  if not IsFeatureImplemented(HVP) then\n    raise UndefinedInstruction\n  else\n    CallHypervisor(imm16)"
    },
    {
      "mnemonic": "isb",
      "architecture": "ARMv8-A",
      "full_name": "Instruction Synchronization Barrier (A32)",
      "summary": "Flushes the pipeline.",
      "syntax": "ISB <option>",
      "encoding": {
        "format": "System",
        "binary_pattern": "111101010111 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0110 | option",
        "hex_opcode": "0xF57FF060",
        "visual_parts": [
          {
            "raw": "111101010111",
            "clean": "111101010111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "option",
            "clean": "option"
          }
        ],
        "bit_positions": "31:20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "option",
          "desc": "SY"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Instruction Synchronization Barrier: flushes the instruction pipeline and refetches following instructions, ensuring all previous instructions have completed. No flags are affected. Restricted to A32 instruction set.",
      "example": "ISB option",
      "pseudocode": "if ConditionPassed() then\n  InstructionSynchronizationBarrier(option)"
    },
    {
      "mnemonic": "ldm",
      "architecture": "ARMv8-A",
      "full_name": "Load Multiple (A32)",
      "summary": "Loads multiple registers from memory (Stack pop).",
      "syntax": "LDM<mode><c> <Rn>{!}, <registers>",
      "encoding": {
        "format": "Load Multiple",
        "binary_pattern": "cond | 100 | 0 | 0 | 0 | W | 1 | Rn | register_list",
        "hex_opcode": "0x08100000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "W",
            "clean": "W"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "register_list",
            "clean": "register_list"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "registers",
          "desc": "List"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Loads multiple 32-bit registers from consecutive memory addresses starting at the address in Rn (possibly pre- or post-adjusted based on addressing mode). If W=1, Rn is updated after the load; S controls whether user-mode registers are loaded in privileged modes. Condition flags are not affected. Executes in A32 only.",
      "example": "LDMia r1!, registers",
      "pseudocode": "address ← Rn\nif P == 1 and U == 1 then\n  address ← address + 4\nfor each register in register_list (in ascending order)\n  register ← memory[address]\n  address ← address + 4\nif P == 1 and U == 0 then\n  address ← address - 4\nif W == 1 then\n  Rn ← address\nif S == 1 then\n  CPSR ← SPSR (if loading PC in privileged mode)\ncondition_flags unchanged"
    },
    {
      "mnemonic": "ldr",
      "architecture": "ARMv8-A",
      "full_name": "Load Register (A32 Immediate)",
      "summary": "Loads a word from memory.",
      "syntax": "LDR<c> <Rt>, [<Rn>, #+/-<imm>]{!}",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 010 | 1 | U | 0 | 1 | 1 | Rn | Rt | imm12",
        "hex_opcode": "0x05300000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Loads a 32-bit word from memory at an address computed from a base register and 12-bit immediate offset, storing the result in the destination register. The P and W bits control addressing mode (offset, pre-indexed, or post-indexed). Condition flags are not affected by this instruction. Execution is conditional based on the 4-bit condition code field; available in A32 only.",
      "example": "LDR r3, [r1, #+/-#16]!",
      "pseudocode": "offset ← ZeroExtend(imm12);\nif U == 1 then address ← Rn + offset else address ← Rn - offset;\nif P == 1 then address ← address else address ← Rn;\nRt ← MemRead(address, 4);\nif W == 1 then Rn ← address;"
    },
    {
      "mnemonic": "ldrb",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Byte (A32)",
      "summary": "Loads a byte from memory (Zero extended).",
      "syntax": "LDRB<c> <Rt>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 010 | 1 | U | 1 | 1 | 1 | Rn | Rt | imm12",
        "hex_opcode": "0x05700000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Loads an unsigned byte (8 bits) from memory and zero-extends it to 32 bits, storing the result in the destination register. The P and W bits control addressing mode. Condition flags are not affected. Execution is conditional based on the 4-bit condition code field; available in A32 only.",
      "example": "LDRB r3, [r1, #+/-#16]",
      "pseudocode": "offset ← ZeroExtend(imm12);\nif U == 1 then address ← Rn + offset else address ← Rn - offset;\nif P == 1 then address ← address else address ← Rn;\nRt ← ZeroExtend(MemRead(address, 1));\nif W == 1 then Rn ← address;"
    },
    {
      "mnemonic": "ldrd",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Dual (A32)",
      "summary": "Loads two consecutive words into consecutive registers.",
      "syntax": "LDRD<c> <Rt>, <Rt2>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 000 | 0 | U | 1 | 0 | 0 | Rn | Rt | imm4H | 1 | 10 | 1 | imm4L",
        "hex_opcode": "0x004000D0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm4H",
            "clean": "imm4H"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4L",
            "clean": "imm4L"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Dest 1"
        },
        {
          "name": "Rt2",
          "desc": "Dest 2"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Loads two consecutive 32-bit words from memory into two consecutive registers. The 8-bit immediate (imm4H:imm4L) is shifted left by 2 bits to form a byte offset. The P and W bits control addressing mode (offset, pre-indexed, or post-indexed). Condition flags are not affected. Execution is conditional; available in A32 only.",
      "example": "LDRD r3, r4, [r1, #+/-#16]",
      "pseudocode": "offset ← ZeroExtend(imm4H:imm4L) << 2;\nif U == 1 then address ← Rn + offset else address ← Rn - offset;\nif P == 1 then address ← address else address ← Rn;\nRt ← MemRead(address, 4);\nRt2 ← MemRead(address + 4, 4);\nif W == 1 then Rn ← address + 8;"
    },
    {
      "mnemonic": "ldrex",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Exclusive (A32)",
      "summary": "Loads a word and marks physical address as exclusive.",
      "syntax": "LDREX<c> <Rt>, [<Rn>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 00011 | 00 | 1 | Rn | Rt | 1 | 1 | 1 | 1 | 1001 | 1111",
        "hex_opcode": "0x01900F9F",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "1111",
            "clean": "1111"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Loads a 32-bit word from memory and tags the physical address as exclusively held by the processor, enabling atomic compare-and-swap sequences via STREX. The address must be word-aligned. Condition flags are not affected. This instruction requires word-aligned addresses and is available in A32 only; it is essential for implementing locks and atomic operations.",
      "example": "LDREX r3, [r1]",
      "pseudocode": "address ← Rn;\nif (address MOD 4) != 0 then UNPREDICTABLE;\nRt ← MemRead(address, 4);\nMarkExclusive(address, ProcessorID(), 4);"
    },
    {
      "mnemonic": "ldrh",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Halfword (A32)",
      "summary": "Loads a halfword (Zero extended).",
      "syntax": "LDRH<c> <Rt>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 000 | 1 | U | 1 | 1 | 1 | Rn | Rt | imm4H | 1 | 01 | 1 | imm4L",
        "hex_opcode": "0x017000B0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm4H",
            "clean": "imm4H"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4L",
            "clean": "imm4L"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Loads an unsigned halfword (16 bits) from memory and zero-extends it to 32 bits, storing the result in the destination register. The 8-bit immediate (imm4H:imm4L) is shifted left by 1 bit to form a byte offset. The P and W bits control addressing mode. Condition flags are not affected. Execution is conditional; available in A32 only.",
      "example": "LDRH r3, [r1, #+/-#16]",
      "pseudocode": "offset ← ZeroExtend(imm4H:imm4L) << 1;\nif U == 1 then address ← Rn + offset else address ← Rn - offset;\nif P == 1 then address ← address else address ← Rn;\nRt ← ZeroExtend(MemRead(address, 2));\nif W == 1 then Rn ← address;"
    },
    {
      "mnemonic": "ldrsb",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Signed Byte (A32)",
      "summary": "Loads a byte and sign-extends it.",
      "syntax": "LDRSB<c> <Rt>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 000 | 1 | U | 1 | 1 | 1 | Rn | Rt | imm4H | 1 | 10 | 1 | imm4L",
        "hex_opcode": "0x017000D0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm4H",
            "clean": "imm4H"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4L",
            "clean": "imm4L"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Loads a signed byte (8 bits) from memory and sign-extends it to 32 bits, storing the result in the destination register. The 8-bit immediate (imm4H:imm4L) is shifted left by 0 bits to form the byte offset. The P and W bits control addressing mode. Condition flags are not affected. Execution is conditional; available in A32 only.",
      "example": "LDRSB r3, [r1, #+/-#16]",
      "pseudocode": "offset ← ZeroExtend(imm4H:imm4L);\nif U == 1 then address ← Rn + offset else address ← Rn - offset;\nif P == 1 then address ← address else address ← Rn;\nRt ← SignExtend(MemRead(address, 1));\nif W == 1 then Rn ← address;"
    },
    {
      "mnemonic": "ldrsh",
      "architecture": "ARMv8-A",
      "full_name": "Load Register Signed Halfword (A32)",
      "summary": "Loads a halfword and sign-extends it.",
      "syntax": "LDRSH<c> <Rt>, [<Rn>, #+/-<imm>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 000 | 1 | U | 1 | 1 | 1 | Rn | Rt | imm4H | 1 | 11 | 1 | imm4L",
        "hex_opcode": "0x017000F0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm4H",
            "clean": "imm4H"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "imm4L",
            "clean": "imm4L"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Loads a signed halfword (16 bits) from memory and sign-extends it to 32 bits, storing the result in the destination register. The 8-bit immediate (imm4H:imm4L) is shifted left by 1 bit to form a byte offset. The P and W bits control addressing mode. Condition flags are not affected. Execution is conditional; available in A32 only.",
      "example": "LDRSH r3, [r1, #+/-#16]",
      "pseudocode": "offset ← ZeroExtend(imm4H:imm4L) << 1;\nif U == 1 then address ← Rn + offset else address ← Rn - offset;\nif P == 1 then address ← address else address ← Rn;\nRt ← SignExtend(MemRead(address, 2));\nif W == 1 then Rn ← address;"
    },
    {
      "mnemonic": "lsl",
      "architecture": "ARMv8-A",
      "full_name": "Logical Shift Left (A32)",
      "summary": "Shifts a register left.",
      "syntax": "LSL{S}<c> <Rd>, <Rm>, <Rs>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00011 | 01 | 0 | 0000 | Rd | Rs | 0 | 00 | 1 | Rm",
        "hex_opcode": "0x01A00010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Rs",
          "desc": "Shift amount general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Shifts the value in Rm left by the number of bits specified in the low 8 bits of Rs, storing the result in Rd. If S=1, the condition flags N, Z, C, and V are updated: N and Z reflect the result, C receives the last bit shifted out, and V is unaffected. Execution is conditional based on the 4-bit condition code; available in A32 only.",
      "example": "LSL r0, r2, r6",
      "pseudocode": "shift_amount ← Rs[7:0];\nif shift_amount == 0 then result ← Rm else if shift_amount < 32 then (C_out, result) ← Rm << shift_amount else if shift_amount == 32 then (C_out, result) ← (Rm[31], 0) else (C_out, result) ← (0, 0);\nRd ← result;\nif S == 1 then N ← result[31]; Z ← (result == 0); C ← C_out;"
    },
    {
      "mnemonic": "lsr",
      "architecture": "ARMv8-A",
      "full_name": "Logical Shift Right (A32)",
      "summary": "Shifts a register right.",
      "syntax": "LSR{S}<c> <Rd>, <Rm>, <Rs>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00011 | 01 | 0 | 0000 | Rd | Rs | 0 | 01 | 1 | Rm",
        "hex_opcode": "0x01A00030",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Rs",
          "desc": "Shift amount general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Logical Shift Right shifts the value in Rm right by the number of bits specified in the lower byte of Rs, filling vacated bits with zeros. The C flag is set to the last bit shifted out, and if the S bit is set, the N and Z flags are updated based on the result. This is an A32 instruction available in all privilege levels.",
      "example": "LSR r0, r2, r6",
      "pseudocode": "shift_amount ← Rs[7:0]\nif shift_amount == 0 then\n  Rd ← Rm\n  if S == 1 then C ← C\nelse if shift_amount < 32 then\n  Rd ← Rm >> shift_amount\n  if S == 1 then C ← Rm[shift_amount - 1]\nelse if shift_amount == 32 then\n  Rd ← 0\n  if S == 1 then C ← Rm[31]\nelse\n  Rd ← 0\n  if S == 1 then C ← 0\nif S == 1 then\n  N ← Rd[31]\n  Z ← (Rd == 0)\n  V ← V"
    },
    {
      "mnemonic": "mla",
      "architecture": "ARMv8-A",
      "full_name": "Multiply Accumulate (A32)",
      "summary": "Calculates Rd = (Rn * Rm) + Ra.",
      "syntax": "MLA{S}<c> <Rd>, <Rn>, <Rm>, <Ra>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 0000 | 001 | 0 | Rd | Ra | Rm | 1001 | Rn",
        "hex_opcode": "0x00200090",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Ra",
          "desc": "Addend"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Multiply Accumulate multiplies Rn and Rm, adds the result to Ra, and stores the 32-bit result in Rd. If the S bit is set, the N and Z flags are updated based on the result; the C and V flags are unpredictable. This is an A32 instruction available in all privilege levels.",
      "example": "MLA r0, r1, r2, r5",
      "pseudocode": "product ← Rn * Rm\nRd ← product + Ra\nif S == 1 then\n  N ← Rd[31]\n  Z ← (Rd == 0)\n  C ← unpredictable\n  V ← unpredictable"
    },
    {
      "mnemonic": "mls",
      "architecture": "ARMv8-A",
      "full_name": "Multiply Subtract (A32)",
      "summary": "Calculates Rd = Ra - (Rn * Rm).",
      "syntax": "MLS<c> <Rd>, <Rn>, <Rm>, <Ra>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 0000 | 011 | 0 | Rd | Ra | Rm | 1001 | Rn",
        "hex_opcode": "0x00600090",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Ra",
          "desc": "Minuend"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Multiply Subtract multiplies Rn and Rm, subtracts the product from Ra, and stores the 32-bit result in Rd. The N and Z flags are updated based on the result; the C and V flags are unpredictable. This is an A32 instruction (ARMv6T2 and later) available in all privilege levels.",
      "example": "MLS r0, r1, r2, r5",
      "pseudocode": "product ← Rn * Rm\nRd ← Ra - product\nN ← Rd[31]\nZ ← (Rd == 0)\nC ← unpredictable\nV ← unpredictable"
    },
    {
      "mnemonic": "mov",
      "architecture": "ARMv8-A",
      "full_name": "Move (A32)",
      "summary": "Moves a value into a register.",
      "syntax": "MOV{S}<c> <Rd>, <Operand2>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00111 | 01 | 0 | 0000 | Rd | imm12",
        "hex_opcode": "0x03A00000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00111",
            "clean": "00111"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Move copies the value from Operand2 (a flexible second operand: register, shifted register, or rotated immediate) into Rd. If the S bit is set, the N and Z flags are updated based on the result, and the C flag may be set depending on the operand type. This is an A32 instruction available in all privilege levels.",
      "example": "MOV r0, r2",
      "pseudocode": "Rd ← Operand2\nif S == 1 then\n  N ← Rd[31]\n  Z ← (Rd == 0)\n  if Operand2_has_shift then C ← Operand2_carry_out\n  V ← V"
    },
    {
      "mnemonic": "movt",
      "architecture": "ARMv8-A",
      "full_name": "Move Top (A32)",
      "summary": "Writes a 16-bit immediate to the top half of a register.",
      "syntax": "MOVT<c> <Rd>, #<imm16>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00110 | 1 | 00 | imm4 | Rd | imm12",
        "hex_opcode": "0x03400000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "imm16",
          "desc": "Value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Move Top writes a 16-bit immediate value into bits [31:16] of Rd while leaving bits [15:0] unchanged. No condition flags are affected. This is an A32 instruction (ARMv6T2 and later) available in all privilege levels.",
      "example": "MOVT r0, #16",
      "pseudocode": "imm16 ← imm4 : imm12\nRd[31:16] ← imm16\nRd[15:0] ← Rd[15:0]"
    },
    {
      "mnemonic": "movw",
      "architecture": "ARMv8-A",
      "full_name": "Move Word (A32)",
      "summary": "Writes a 16-bit immediate to the bottom half, zeroing top.",
      "syntax": "MOVW<c> <Rd>, #<imm16>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00110 | 0 | 00 | imm4 | Rd | imm12",
        "hex_opcode": "0x03000000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "imm16",
          "desc": "Value"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Move Word writes a 16-bit immediate value into bits [15:0] of Rd and zeros bits [31:16]. No condition flags are affected. This is an A32 instruction (ARMv6T2 and later) available in all privilege levels.",
      "example": "MOVW r0, #16",
      "pseudocode": "imm16 ← imm4 : imm12\nRd[15:0] ← imm16\nRd[31:16] ← 0"
    },
    {
      "mnemonic": "mrs",
      "architecture": "ARMv8-A",
      "full_name": "Move Status Register to Register",
      "summary": "Reads CPSR or SPSR.",
      "syntax": "MRS<c> <Rd>, <spec_reg>",
      "encoding": {
        "format": "System",
        "binary_pattern": "cond | 00010 | R | 0 | 0 | 1111 | Rd | 0 | 0 | 0 | 0 | 0000 | 0000",
        "hex_opcode": "0x010F0000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "R",
            "clean": "R"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0000",
            "clean": "0000"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "spec_reg",
          "desc": "CPSR/SPSR"
        }
      ],
      "extension": "A32 (System)",
      "description": "Reads the Current Program Status Register (CPSR) or Saved Program Status Register (SPSR) into a general-purpose register. The R bit in the encoding selects between CPSR (R=0) and SPSR (R=1). No condition flags are affected by this instruction. Execution is restricted to privileged modes when reading SPSR; reading CPSR is available in all modes.",
      "example": "MRS r0, nzcv",
      "pseudocode": "if R == 0 then\n  Rd ← CPSR\nelse\n  Rd ← SPSR"
    },
    {
      "mnemonic": "msr",
      "architecture": "ARMv8-A",
      "full_name": "Move Register to Status Register",
      "summary": "Writes to CPSR or SPSR.",
      "syntax": "MSR<c> <spec_reg>_<fields>, <Rn>",
      "encoding": {
        "format": "System",
        "binary_pattern": "cond | 00010 | R | 1 | 0 | mask | 1111 | 0 | 0 | 0 | 0 | 0000 | Rn",
        "hex_opcode": "0x0120F000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00010",
            "clean": "00010"
          },
          {
            "raw": "R",
            "clean": "R"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "mask",
            "clean": "mask"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21 | 20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "spec_reg",
          "desc": "CPSR/SPSR"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (System)",
      "description": "Writes the contents of a general-purpose register to specified fields of the Current Program Status Register (CPSR) or Saved Program Status Register (SPSR). The R bit selects the target register; field specifiers (c, x, s, f) control which bit ranges are updated. Condition flags (N, Z, C, V) may be modified if the f field is selected. Execution in privileged modes is required.",
      "example": "MSR nzcv_fields, r1",
      "pseudocode": "if R == 0 then\n  dest ← CPSR\nelse\n  dest ← SPSR\nif c then dest[7:0] ← Rn[7:0]\nif x then dest[15:8] ← Rn[15:8]\nif s then dest[23:16] ← Rn[23:16]\nif f then dest[31:24] ← Rn[31:24]\nif R == 0 then\n  CPSR ← dest\nelse\n  SPSR ← dest"
    },
    {
      "mnemonic": "mul",
      "architecture": "ARMv8-A",
      "full_name": "Multiply (A32)",
      "summary": "Multiplies two 32-bit values.",
      "syntax": "MUL{S}<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 0000 | 000 | 0 | Rd | 0000 | Rm | 1001 | Rn",
        "hex_opcode": "0x00000090",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Multiply computes the product of Rn and Rm and stores the low 32 bits in Rd; the high 32 bits are discarded. If the S bit is set, the N and Z flags are updated based on the result; the C and V flags are unpredictable. This is an A32 instruction available in all privilege levels.",
      "example": "MUL r0, r1, r2",
      "pseudocode": "product ← Rn * Rm\nRd ← product[31:0]\nif S == 1 then\n  N ← Rd[31]\n  Z ← (Rd == 0)\n  C ← unpredictable\n  V ← unpredictable"
    },
    {
      "mnemonic": "mvn",
      "architecture": "ARMv8-A",
      "full_name": "Move NOT (A32)",
      "summary": "Moves bitwise inverse of value.",
      "syntax": "MVN{S}<c> <Rd>, <Operand2>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00111 | 11 | 0 | 0000 | Rd | imm12",
        "hex_opcode": "0x03E00000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00111",
            "clean": "00111"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Move NOT computes the bitwise inverse of Operand2 and stores the result in Rd. If the S bit is set, the N and Z flags are updated based on the result, and the C flag may be set depending on the operand type. This is an A32 instruction available in all privilege levels.",
      "example": "MVN r0, r2",
      "pseudocode": "Rd ← ~Operand2\nif S == 1 then\n  N ← Rd[31]\n  Z ← (Rd == 0)\n  if Operand2_has_shift then C ← Operand2_carry_out\n  V ← V"
    },
    {
      "mnemonic": "nop",
      "architecture": "ARMv8-A",
      "full_name": "No Operation (A32)",
      "summary": "Does nothing.",
      "syntax": "NOP<c>",
      "encoding": {
        "format": "System",
        "binary_pattern": "cond | 00110 | 0 | 10 | 00 | 00 | 1 | 1 | 1 | 1 | 000000000000",
        "hex_opcode": "0x0320F000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000000000",
            "clean": "000000000000"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:18 | 17:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [],
      "extension": "A32 (Base)",
      "description": "Performs no operation and does not modify any registers or memory. Executes in a single cycle and is typically used for instruction alignment or padding. All condition flags (N, Z, C, V) are unaffected. This is an A32 instruction available in all ARM implementations.",
      "example": "NOP",
      "pseudocode": "// No operation; pipeline advance only"
    },
    {
      "mnemonic": "orr",
      "architecture": "ARMv8-A",
      "full_name": "Logical OR (A32)",
      "summary": "Performs bitwise OR.",
      "syntax": "ORR{S}<c> <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00111 | 00 | 0 | Rn | Rd | imm12",
        "hex_opcode": "0x03800000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00111",
            "clean": "00111"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Performs a bitwise logical OR between Rn and Operand2, storing the result in Rd. When S=1, updates condition flags: N and Z flags set according to result, C flag set to the carry output of the shifter (or unaffected if no shift), V flag unaffected. This is an A32 data-processing instruction available in all ARM implementations.",
      "example": "ORR r0, r1, r2",
      "pseudocode": "result ← Rn | Operand2\nRd ← result\nif S == 1 then\n  N ← result[31]\n  Z ← (result == 0)\n  C ← shifter_carry_out\nendif"
    },
    {
      "mnemonic": "pop",
      "architecture": "ARMv8-A",
      "full_name": "Pop Multiple Registers (A32)",
      "summary": "Loads registers from stack (Alias for LDMIA SP!).",
      "syntax": "POP<c> <registers>",
      "encoding": {
        "format": "Load Multiple",
        "binary_pattern": "cond | 100 | 0 | 1 | 0 | 1 | 1 | 1101 | register_list",
        "hex_opcode": "0x08BD0000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "register_list",
            "clean": "register_list"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:0"
      },
      "operands": [
        {
          "name": "registers",
          "desc": "List"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Loads multiple registers from the stack by incrementing SP after each load; equivalent to LDMIA SP!. Increments SP by 4 bytes for each register loaded. All loaded registers are updated; the program counter (PC) may be loaded if included in the register list, causing a branch. This A32 instruction is an alias and operates identically to the corresponding LDMIA instruction.",
      "example": "POP registers",
      "pseudocode": "address ← SP\nfor each register in register_list (in ascending order)\n  register ← [address]\n  address ← address + 4\nendfor\nSP ← address"
    },
    {
      "mnemonic": "push",
      "architecture": "ARMv8-A",
      "full_name": "Push Multiple Registers (A32)",
      "summary": "Stores registers to stack (Alias for STMDB SP!).",
      "syntax": "PUSH<c> <registers>",
      "encoding": {
        "format": "Store Multiple",
        "binary_pattern": "cond | 100 | 1 | 0 | 0 | 1 | 0 | 1101 | register_list",
        "hex_opcode": "0x092D0000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "register_list",
            "clean": "register_list"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:0"
      },
      "operands": [
        {
          "name": "registers",
          "desc": "List"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Stores multiple registers to the stack by decrementing SP before each store; equivalent to STMDB SP!. Decrements SP by 4 bytes for each register stored, updating SP to point to the first stored value. All listed registers are written to memory. This A32 instruction is an alias and operates identically to the corresponding STMDB instruction.",
      "example": "PUSH registers",
      "pseudocode": "address ← SP - (4 × number_of_registers_in_list)\nfor each register in register_list (in ascending order)\n  [address] ← register\n  address ← address + 4\nendfor\nSP ← SP - (4 × number_of_registers_in_list)"
    },
    {
      "mnemonic": "rbit",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bits (A32)",
      "summary": "Reverses bits in a 32-bit register.",
      "syntax": "RBIT<c> <Rd>, <Rm>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 1 | 11 | 1 | 1 | 1 | 1 | Rd | 1 | 1 | 1 | 1 | 0 | 011 | Rm",
        "hex_opcode": "0x06FF0F30",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18 | 17 | 16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Reverses the bit order in a 32-bit register, writing the reversed value to the destination. Bit 0 becomes bit 31, bit 1 becomes bit 30, and so on. No condition flags are affected. This instruction requires the ARMv6T2 or later extension.",
      "example": "RBIT r0, r2",
      "pseudocode": "Rd ← ReverseBits(Rm)"
    },
    {
      "mnemonic": "rev",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Bytes (A32)",
      "summary": "Reverses bytes (Endian swap).",
      "syntax": "REV<c> <Rd>, <Rm>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 0 | 11 | 1 | 1 | 1 | 1 | Rd | 1 | 1 | 1 | 1 | 0 | 011 | Rm",
        "hex_opcode": "0x06BF0F30",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19 | 18 | 17 | 16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Reverses the byte order of a 32-bit value in Rm and stores the result in Rd, performing a little-endian to big-endian (or vice versa) conversion. No condition flags are affected. This is an A32 instruction available in ARMv6 and later; it is a register-to-register operation with no writeback or memory access.",
      "example": "REV r0, r2",
      "pseudocode": "value ← Rm\nRd ← (value[7:0] << 24) | (value[15:8] << 16) | (value[23:16] << 8) | value[31:24]"
    },
    {
      "mnemonic": "ror",
      "architecture": "ARMv8-A",
      "full_name": "Rotate Right (A32)",
      "summary": "Rotates register right.",
      "syntax": "ROR{S}<c> <Rd>, <Rm>, <Rs>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00011 | 01 | 0 | 0000 | Rd | Rs | 0 | 11 | 1 | Rm",
        "hex_opcode": "0x01A00070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00011",
            "clean": "00011"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Rs",
          "desc": "Shift amount general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Rotates the value in Rm right by the number of bits specified in Rs[7:0], storing the result in Rd. When S=1, updates condition flags: N and Z flags set according to result, C flag set to the last bit rotated out, V flag unaffected. This is an A32 data-processing instruction; the rotate amount is taken modulo 32.",
      "example": "ROR r0, r2, r6",
      "pseudocode": "shift_amount ← Rs[7:0] mod 32\nif shift_amount == 0 then\n  result ← Rm\n  carry_out ← C\nelse\n  result ← (Rm >> shift_amount) | (Rm << (32 - shift_amount))\n  carry_out ← Rm[shift_amount - 1]\nendif\nRd ← result\nif S == 1 then\n  N ← result[31]\n  Z ← (result == 0)\n  C ← carry_out\nendif"
    },
    {
      "mnemonic": "rsb",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Subtract (A32)",
      "summary": "Calculates Rd = Operand2 - Rn.",
      "syntax": "RSB{S}<c> <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 0010 | 011 | 0 | Rn | Rd | imm12",
        "hex_opcode": "0x02600000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Computes the reverse subtraction Rd = Operand2 - Rn and stores the result in Rd. When S=1, updates condition flags: N and Z flags set according to result, C flag set to the borrow (NOT of the borrow-out), V flag set on signed overflow. This is an A32 data-processing instruction available in all ARM implementations.",
      "example": "RSB r0, r1, r2",
      "pseudocode": "result ← Operand2 - Rn\nRd ← result\nif S == 1 then\n  N ← result[31]\n  Z ← (result == 0)\n  C ← NOT(Borrow)\n  V ← (Operand2[31] != Rn[31]) AND (Operand2[31] != result[31])\nendif"
    },
    {
      "mnemonic": "rsc",
      "architecture": "ARMv8-A",
      "full_name": "Reverse Subtract with Carry (A32)",
      "summary": "Calculates Rd = Operand2 - Rn - NOT(Carry).",
      "syntax": "RSC{S}<c> <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 0010 | 111 | 0 | Rn | Rd | imm12",
        "hex_opcode": "0x02E00000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Computes the reverse subtraction with carry: Rd = Operand2 - Rn - NOT(C), and stores the result in Rd. When S=1, updates condition flags: N and Z flags set according to result, C flag set to the borrow (NOT of the borrow-out), V flag set on signed overflow. This is an A32 data-processing instruction useful for multi-word arithmetic.",
      "example": "RSC r0, r1, r2",
      "pseudocode": "result ← Operand2 - Rn - NOT(C)\nRd ← result\nif S == 1 then\n  N ← result[31]\n  Z ← (result == 0)\n  C ← NOT(Borrow)\n  V ← (Operand2[31] != Rn[31]) AND (Operand2[31] != result[31])\nendif"
    },
    {
      "mnemonic": "sbc",
      "architecture": "ARMv8-A",
      "full_name": "Subtract with Carry (A32)",
      "summary": "Calculates Rd = Rn - Operand2 - NOT(Carry).",
      "syntax": "SBC{S}<c> <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 0010 | 110 | 0 | Rn | Rd | imm12",
        "hex_opcode": "0x02C00000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Subtract with Carry subtracts the Operand2 and the inverted Carry flag from Rn, storing the result in Rd. When the S suffix is present, the N, Z, C, and V condition flags are updated based on the result. This instruction is available in A32 (32-bit ARM) and executes conditionally based on the condition code field.",
      "example": "SBC r0, r1, r2",
      "pseudocode": "result ← Rn - Operand2 - NOT(C);\nRd ← result;\nif S then\n  N ← result[31];\n  Z ← (result == 0);\n  C ← NOT(BorrowFrom(Rn - Operand2 - NOT(C)));\n  V ← OverflowFrom(Rn - Operand2 - NOT(C));\nendif;"
    },
    {
      "mnemonic": "sdiv",
      "architecture": "ARMv8-A",
      "full_name": "Signed Divide (A32)",
      "summary": "Signed integer division.",
      "syntax": "SDIV<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01110 | 001 | Rd | 1111 | Rm | 000 | 1 | Rn",
        "hex_opcode": "0x0710F010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Dividend"
        },
        {
          "name": "Rm",
          "desc": "Divisor"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Signed Divide performs signed integer division of Rn (dividend) by Rm (divisor), storing the quotient in Rd. Division by zero does not raise an exception; the result is architecturally unpredictable. No condition flags are modified by this instruction. SDIV is available only in A32 with the Divide extension (ARMv7-R, ARMv7-A with hardware divide).",
      "example": "SDIV r0, r1, r2",
      "pseudocode": "if Rm == 0 then\n  Rd ← UNPREDICTABLE;\nelse\n  Rd ← SignedDivide(Rn, Rm);\nendif;"
    },
    {
      "mnemonic": "stm",
      "architecture": "ARMv8-A",
      "full_name": "Store Multiple (A32)",
      "summary": "Stores multiple registers to memory.",
      "syntax": "STM<mode><c> <Rn>{!}, <registers>",
      "encoding": {
        "format": "Store Multiple",
        "binary_pattern": "cond | 100 | 0 | 0 | 0 | W | 0 | Rn | register_list",
        "hex_opcode": "0x08000000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "W",
            "clean": "W"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "register_list",
            "clean": "register_list"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "registers",
          "desc": "List"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Store Multiple stores the registers specified in the register list to consecutive memory addresses starting from the address in Rn. The addressing mode (IA, DB, DA, ED) is encoded in the P and U bits; when W=1, Rn is updated to point past the last stored word. No condition flags are modified. This instruction is available in A32 and includes optional privilege level adjustments when storing the program counter.",
      "example": "STMia r1!, registers",
      "pseudocode": "address ← Rn;\nif P then address ← address + 4 * NumberOfRegisters(); endif;\nfor i = 0 to 15 do\n  if register_list[i] == 1 then\n    if U then\n      Memory[address] ← Ri;\n      address ← address + 4;\n    else\n      address ← address - 4;\n      Memory[address] ← Ri;\n    endif;\n  endif;\nendfor;\nif W then Rn ← address; endif;"
    },
    {
      "mnemonic": "str",
      "architecture": "ARMv8-A",
      "full_name": "Store Register (A32)",
      "summary": "Stores a word to memory.",
      "syntax": "STR<c> <Rt>, [<Rn>, #+/-<imm>]{!}",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "cond | 010 | 0 | U | 0 | 0 | 0 | Rn | Rt | imm12",
        "hex_opcode": "0x04000000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Store Register stores a 32-bit word from Rt to memory at the address computed from Rn and the offset. The offset is an unsigned 12-bit immediate; when U=0 the offset is subtracted. If P=1 (pre-indexed) and W=1 (write-back), Rn is updated; if P=0 (post-indexed), Rn is always updated. No condition flags are modified. Available in A32.",
      "example": "STR r3, [r1, #+/-#16]!",
      "pseudocode": "offset ← if U then imm12 else -imm12 endif;\nif P then\n  address ← Rn + offset;\nelse\n  address ← Rn;\nendif;\nMemory[address] ← Rt;\nif P == 0 or W then\n  Rn ← Rn + offset;\nendif;"
    },
    {
      "mnemonic": "sub",
      "architecture": "ARMv8-A",
      "full_name": "Subtract (A32)",
      "summary": "Subtracts two values.",
      "syntax": "SUB{S}<c> <Rd>, <Rn>, <Operand2>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 0010 | 010 | 0 | Rn | Rd | imm12",
        "hex_opcode": "0x02400000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Subtract subtracts Operand2 from Rn and stores the result in Rd. When the S suffix is present, the N, Z, C, and V condition flags are updated based on the result. This instruction is available in A32 and executes conditionally based on the condition code field.",
      "example": "SUB r0, r1, r2",
      "pseudocode": "result ← Rn - Operand2;\nRd ← result;\nif S then\n  N ← result[31];\n  Z ← (result == 0);\n  C ← NOT(BorrowFrom(Rn - Operand2));\n  V ← OverflowFrom(Rn - Operand2);\nendif;"
    },
    {
      "mnemonic": "svc",
      "architecture": "ARMv8-A",
      "full_name": "Supervisor Call (A32)",
      "summary": "System call (formerly SWI).",
      "syntax": "SVC<c> #<imm>",
      "encoding": {
        "format": "System",
        "binary_pattern": "cond | 1111 | imm24",
        "hex_opcode": "0x0F000000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "imm24",
            "clean": "imm24"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:0"
      },
      "operands": [
        {
          "name": "imm",
          "desc": "ID"
        }
      ],
      "extension": "A32 (System)",
      "description": "Generates a supervisor call exception, transferring control to the exception handler in supervisor mode. The 24-bit immediate is passed to the exception handler as optional information but does not affect the processor state directly. The instruction saves the return address in LR and updates the PC to the vector address. Condition flags are not modified by the exception itself.",
      "example": "SVC #16",
      "pseudocode": "saved_lr ← PC + 4\nPC ← SupervisorCallVector\nLR_svc ← saved_lr\nCPSR.M ← 0b10011  // Supervisor mode"
    },
    {
      "mnemonic": "swp",
      "architecture": "ARMv8-A",
      "full_name": "Swap (A32)",
      "summary": "Atomic swap word (Legacy).",
      "syntax": "SWP<c> <Rt>, <Rt2>, [<Rn>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "10 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 1 | 000 | 00 | Rn | Rt",
        "hex_opcode": "0xB8208000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Rt",
          "desc": "Transfer general-purpose register (load/store)"
        },
        {
          "name": "Rt2",
          "desc": "Second transfer register (load/store pair)"
        },
        {
          "name": "Rn",
          "desc": "Addr"
        }
      ],
      "extension": "A32 (Atomic)",
      "description": "Atomically loads a word from memory at [Rn], writes Rt2 to that address, and stores the loaded value in Rt. This is a legacy ARMv5 and earlier instruction; ARMv6 and later code should use LDREX/STREX or LDAEX/STLEX for synchronization. No condition flags are affected. Memory ordering is not guaranteed; for ordered access use SWP with appropriate memory barriers.",
      "example": "SWP r3, r4, [r1]",
      "pseudocode": "temp ← [Rn]\n[Rn] ← Rt2\nRt ← temp"
    },
    {
      "mnemonic": "teq",
      "architecture": "ARMv8-A",
      "full_name": "Test Equivalence (A32)",
      "summary": "Bitwise Exclusive OR and update flags (discard result).",
      "syntax": "TEQ<c> <Rn>, <Operand2>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00110 | 01 | 1 | Rn | 0 | 0 | 0 | 0 | imm12",
        "hex_opcode": "0x03300000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Performs a bitwise exclusive OR of Rn and Operand2, updates the condition flags based on the result, and discards the result. The N flag is set if bit 31 of the result is 1; Z is set if the result is 0; C is affected by the shifter (if applicable); V is unchanged. This instruction is useful for testing equality of two values.",
      "example": "TEQ r1, r2",
      "pseudocode": "result ← Rn XOR Operand2\nN ← result[31]\nZ ← (result == 0)\nC ← shifter_carry_out\nV ← V  // Unchanged"
    },
    {
      "mnemonic": "tst",
      "architecture": "ARMv8-A",
      "full_name": "Test (A32)",
      "summary": "Bitwise AND and update flags (discard result).",
      "syntax": "TST<c> <Rn>, <Operand2>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 00110 | 00 | 1 | Rn | 0 | 0 | 0 | 0 | imm12",
        "hex_opcode": "0x03100000",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "00110",
            "clean": "00110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:21 | 20 | 19:16 | 15 | 14 | 13 | 12 | 11:0"
      },
      "operands": [
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Operand2",
          "desc": "Flexible second operand (register or shifted register)"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Performs a bitwise AND of Rn and Operand2, updates the condition flags based on the result, and discards the result. The N flag is set if bit 31 of the result is 1; Z is set if the result is 0; C is affected by the shifter (if applicable); V is unchanged. This instruction is useful for testing which bits are set in a register.",
      "example": "TST r1, r2",
      "pseudocode": "result ← Rn AND Operand2\nN ← result[31]\nZ ← (result == 0)\nC ← shifter_carry_out\nV ← V  // Unchanged"
    },
    {
      "mnemonic": "udiv",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Divide (A32)",
      "summary": "Unsigned integer division.",
      "syntax": "UDIV<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01110 | 011 | Rd | 1111 | Rm | 000 | 1 | Rn",
        "hex_opcode": "0x0730F010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Dividend"
        },
        {
          "name": "Rm",
          "desc": "Divisor"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Unsigned Divide performs unsigned integer division of Rn (dividend) by Rm (divisor), storing the quotient in Rd. Division by zero does not raise an exception; the result is architecturally unpredictable. No condition flags are modified. UDIV is available only in A32 with the Divide extension (ARMv7-R, ARMv7-A with hardware divide).",
      "example": "UDIV r0, r1, r2",
      "pseudocode": "if Rm == 0 then\n  Rd ← UNPREDICTABLE;\nelse\n  Rd ← UnsignedDivide(Rn, Rm);\nendif;"
    },
    {
      "mnemonic": "umlal",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Multiply Accumulate Long (A32)",
      "summary": "Unsigned (Rn * Rm) + 64-bit Accumulator.",
      "syntax": "UMLAL{S}<c> <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 0000 | 101 | 0 | RdHi | RdLo | Rm | 1001 | Rn",
        "hex_opcode": "0x00A00090",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Low"
        },
        {
          "name": "RdHi",
          "desc": "High"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Unsigned multiply of Rn and Rm, then add the 64-bit result to the 64-bit accumulator formed by RdHi:RdLo, storing the result back in RdHi:RdLo. If the S bit is set, the N and Z flags are updated based on the result; C and V are unaffected. This is an A32 instruction and does not execute in AArch64 or T32 states.",
      "example": "UMLAL r1, r0, r1, r2",
      "pseudocode": "accumulator ← (RdHi << 32) | RdLo\nproduct ← (Rn × Rm)\nresult ← accumulator + product\nRdHi ← result[63:32]\nRdLo ← result[31:0]\nif S == 1 then\n  N ← result[63]\n  Z ← (result == 0)\nendif"
    },
    {
      "mnemonic": "umull",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Multiply Long (A32)",
      "summary": "Unsigned (Rn * Rm) -> 64-bit Result.",
      "syntax": "UMULL{S}<c> <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 0000 | 100 | 0 | RdHi | RdLo | Rm | 1001 | Rn",
        "hex_opcode": "0x00800090",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1001",
            "clean": "1001"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:24 | 23:21 | 20 | 19:16 | 15:12 | 11:8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Low"
        },
        {
          "name": "RdHi",
          "desc": "High"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (Base)",
      "description": "Unsigned Multiply Long computes the unsigned product Rn × Rm as a 64-bit result, storing the low 32 bits in RdLo and the high 32 bits in RdHi. When the S suffix is present, the N and Z flags are updated based on the result; C and V are unaffected. This instruction is available in A32 and executes conditionally.",
      "example": "UMULL r1, r0, r1, r2",
      "pseudocode": "result ← Rn[31:0] × Rm[31:0];  // unsigned 64-bit product\nRdLo ← result[31:0];\nRdHi ← result[63:32];\nif S then\n  N ← RdHi[31];\n  Z ← (result == 0);\nendif;"
    },
    {
      "mnemonic": "vsra",
      "architecture": "ARMv8-A",
      "full_name": "Vector Shift Right and Accumulate",
      "summary": "Shifts elements right and adds to the destination accumulator.",
      "syntax": "VSRA<c>.<dt> <Qd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "1111001 | U | 1 | D | imm6 | Vd | 0001 | L | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2800110",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0001",
            "clean": "0001"
          },
          {
            "raw": "L",
            "clean": "L"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each element in the source register right by the immediate shift amount and accumulates (adds) the shifted result into the corresponding element of the destination register. The shift amount is treated as unsigned. No condition flags are modified. This is a NEON instruction available in both A32 and T32 instruction sets.",
      "example": "VSRA.dt q0, q2, #16",
      "pseudocode": "for i = 0 to elements_in_Qd - 1\n  shift_amount ← imm6\n  shifted ← Qm[i] >> shift_amount\n  Qd[i] ← Qd[i] + shifted\nendfor"
    },
    {
      "mnemonic": "vrsra",
      "architecture": "ARMv8-A",
      "full_name": "Vector Rounding Shift Right and Accumulate",
      "summary": "Shifts right with rounding and adds to accumulator.",
      "syntax": "VRSRA<c>.<dt> <Qd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "1111001 | U | 1 | D | imm6 | Vd | 0011 | L | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2800310",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0011",
            "clean": "0011"
          },
          {
            "raw": "L",
            "clean": "L"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each element in the source register right by the immediate shift amount with rounding (adding 1 to bit position before the round point), then accumulates the rounded result into the destination register. The shift amount is unsigned. No condition flags are modified. This is a NEON instruction available in both A32 and T32 instruction sets.",
      "example": "VRSRA.dt q0, q2, #16",
      "pseudocode": "for i = 0 to elements_in_Qd - 1\n  shift_amount ← imm6\n  if shift_amount > 0 then\n    rounded ← (Qm[i] + (1 << (shift_amount - 1))) >> shift_amount\n  else\n    rounded ← Qm[i]\n  endif\n  Qd[i] ← Qd[i] + rounded\nendfor"
    },
    {
      "mnemonic": "vsli",
      "architecture": "ARMv8-A",
      "full_name": "Vector Shift Left and Insert",
      "summary": "Shifts bits left and inserts into destination (merging).",
      "syntax": "VSLI<c>.<size> <Qd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "1111001 | 1 | 1 | D | imm6 | Vd | 0101 | L | 1 | M | 1 | Vm",
        "hex_opcode": "0xF3800550",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "L",
            "clean": "L"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each element in the source register left by the immediate shift amount and inserts the shifted bits into the low bits of the destination element, leaving the high bits of the destination unchanged (merging operation). The shift amount is unsigned. No condition flags are modified. This is a NEON instruction available in both A32 and T32 instruction sets.",
      "example": "VSLI.size q0, q2, #16",
      "pseudocode": "for i = 0 to elements_in_Qd - 1\n  shift_amount ← imm6\n  shifted ← Qm[i] << shift_amount\n  mask ← (1 << shift_amount) - 1\n  Qd[i] ← (Qd[i] & ~mask) | (shifted & mask)\nendfor"
    },
    {
      "mnemonic": "vsri",
      "architecture": "ARMv8-A",
      "full_name": "Vector Shift Right and Insert",
      "summary": "Shifts bits right and inserts into destination.",
      "syntax": "VSRI<c>.<size> <Qd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "1111001 | 1 | 1 | D | imm6 | Vd | 0100 | L | 1 | M | 1 | Vm",
        "hex_opcode": "0xF3800450",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "L",
            "clean": "L"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each element in the source register right by the immediate shift amount and inserts the shifted bits into the high bits of the destination element, leaving the low bits of the destination unchanged (merging operation). The shift amount is unsigned. No condition flags are modified. This is a NEON instruction available in both A32 and T32 instruction sets.",
      "example": "VSRI.size q0, q2, #16",
      "pseudocode": "for i = 0 to elements_in_Qd - 1\n  shift_amount ← imm6\n  shifted ← Qm[i] >> shift_amount\n  mask ← ((1 << (element_size - shift_amount)) - 1) << shift_amount\n  Qd[i] ← (Qd[i] & ~mask) | (shifted & mask)\nendfor"
    },
    {
      "mnemonic": "vrshl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Rounding Shift Left",
      "summary": "Shifts left with rounding based on a register value.",
      "syntax": "VRSHL<c>.<dt> <Qd>, <Qm>, <Qn>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0101 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2000500",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "Shift Reg"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each element in Qm left or right by the amount specified in the corresponding element of Qn with rounding applied when shifting right. Positive shift amounts shift left; negative amounts shift right with rounding. Results are stored in Qd. No condition flags are modified. This is a NEON instruction available in both A32 and T32 instruction sets.",
      "example": "VRSHL.dt q0, q2, q1",
      "pseudocode": "for i = 0 to elements_in_Qd - 1\n  shift_amount ← signed(Qn[i])\n  if shift_amount >= 0 then\n    Qd[i] ← Qm[i] << shift_amount\n  else\n    if shift_amount <= -element_size then\n      Qd[i] ← 0\n    else\n      rounded ← Qm[i] + (1 << (-shift_amount - 1))\n      Qd[i] ← rounded >> (-shift_amount)\n    endif\n  endif\nendfor"
    },
    {
      "mnemonic": "vrshr",
      "architecture": "ARMv8-A",
      "full_name": "Vector Rounding Shift Right",
      "summary": "Shifts right with rounding based on immediate.",
      "syntax": "VRSHR<c>.<dt> <Qd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "1111001 | U | 1 | D | imm6 | Vd | 0010 | L | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2800210",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "L",
            "clean": "L"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each element in the source register right by the immediate shift amount with rounding (the bit at the shift position and all bits to the right are rounded according to ARM rounding rules). Results are stored in the destination register. No condition flags are modified. This is a NEON instruction available in both A32 and T32 instruction sets.",
      "example": "VRSHR.dt q0, q2, #16",
      "pseudocode": "for i = 0 to elements_in_Qd - 1\n  shift_amount ← imm6\n  if shift_amount >= element_size then\n    Qd[i] ← 0\n  else\n    rounding_bit ← (Qm[i] >> (shift_amount - 1)) & 1\n    Qd[i] ← (Qm[i] >> shift_amount) + rounding_bit\n  endif\nendfor"
    },
    {
      "mnemonic": "vrshrn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Rounding Shift Right Narrow",
      "summary": "Shifts right, rounds, and narrows (2N -> N bits).",
      "syntax": "VRSHRN<c>.<dt> <Dd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "111100111 | D | 11 | size | 10 | Vd | 0 | 0100 | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3B20200",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Dest Narrow"
        },
        {
          "name": "Qm",
          "desc": "Src Wide"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each element of the 128-bit source register right by the immediate shift amount with rounding, then narrows the result from 2N bits to N bits (halving the element width), and stores into the 64-bit destination register. The high half of the shift result is kept. No condition flags are modified. This is a NEON instruction available in both A32 and T32 instruction sets.",
      "example": "VRSHRN.dt d0, q2, #16",
      "pseudocode": "for i = 0 to elements_in_Dd - 1\n  shift_amount ← imm6\n  if shift_amount > 2 × element_size then\n    Dd[i] ← 0\n  else\n    value ← Qm[i]\n    rounding_correction ← (1 << (shift_amount - 1))\n    rounded ← (value + rounding_correction) >> shift_amount\n    Dd[i] ← saturate(rounded, element_size / 2)\n  endif\nendfor"
    },
    {
      "mnemonic": "vqshl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Shift Left (Register)",
      "summary": "Shifts left with saturation based on register.",
      "syntax": "VQSHL<c>.<dt> <Qd>, <Qm>, <Qn>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0100 | N | 1 | M | 1 | Vm",
        "hex_opcode": "0xF2000450",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "Shift Reg"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Saturating Shift Left (Register) shifts each element in Qm left by the amount specified by the corresponding element in Qn, saturating the result to the range of the operand data type. The shift amount is interpreted as a signed value; negative amounts perform a right shift. All condition flags (N, Z, C, V) remain unaffected. This is an A32/T32 NEON instruction that operates on 128-bit quad registers.",
      "example": "VQSHL.dt q0, q2, q1",
      "pseudocode": "for i = 0 to elements-1 do\n  shift_amount ← SignExtend(Qn[i])\n  if shift_amount >= 0 then\n    result ← SatQ(Qm[i] << shift_amount, esize)\n  else\n    result ← SatQ(Qm[i] >> (-shift_amount), esize)\n  Qd[i] ← result"
    },
    {
      "mnemonic": "vqshl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Shift Left (Immediate)",
      "summary": "Shifts left with saturation based on immediate.",
      "syntax": "VQSHL<c>.<dt> <Qd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "1111001 | U | 1 | D | imm6 | Vd | 011 | 1 | L | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2800710",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "L",
            "clean": "L"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:16 | 15:12 | 11:9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Saturating Shift Left (Immediate) shifts each element in Qm left by an immediate value, saturating the result to the range of the operand data type. The immediate is a signed value encoded in imm6; positive values shift left, negative values (when sign-extended) would shift right. All condition flags (N, Z, C, V) remain unaffected. This is an A32/T32 NEON instruction.",
      "example": "VQSHL.dt q0, q2, #16",
      "pseudocode": "shift_amount ← SignExtend(imm6, 6)\nfor i = 0 to elements-1 do\n  result ← SatQ(Qm[i] << shift_amount, esize)\n  Qd[i] ← result"
    },
    {
      "mnemonic": "vqshr",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Shift Right (Unsigned)",
      "summary": "Shifts right with saturation (Unsigned).",
      "syntax": "VQSHR<c>.U<size> <Qd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "11110010 | 1 | D | imm6 | Vd | 1101 | L | Q | M | 1 | Vm",
        "hex_opcode": "0xF2800910",
        "visual_parts": [
          {
            "raw": "11110010",
            "clean": "11110010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "L",
            "clean": "L"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ]
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Saturating Shift Right (Unsigned) shifts each unsigned element in Qm right by an immediate value, saturating underflow to zero. The immediate specifies the right shift count. All condition flags (N, Z, C, V) remain unaffected. This is an A32/T32 NEON instruction for unsigned data types.",
      "example": "VQSHR.Usize q0, q2, #16",
      "pseudocode": "shift_amount ← imm6\nfor i = 0 to elements-1 do\n  if shift_amount > 0 then\n    result ← SatQ(Qm[i] >> shift_amount, 0, max_unsigned_value)\n  else\n    result ← Qm[i]\n  Qd[i] ← result"
    },
    {
      "mnemonic": "vqshrn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Shift Right Narrow",
      "summary": "Shifts right, saturates, and narrows.",
      "syntax": "VQSHRN<c>.<dt> <Dd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "1111001 | U | 1 | D | imm6 | Vd | 100 | 1 | 0 | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2800910",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:16 | 15:12 | 11:9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Dest Narrow"
        },
        {
          "name": "Qm",
          "desc": "Src Wide"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Saturating Shift Right Narrow shifts each element in Qm right by an immediate value, saturates to the range of the narrower result type, then packs the narrowed results into the destination Dd. This operation reduces element size by half and narrows the register from 128-bit to 64-bit. All condition flags (N, Z, C, V) remain unaffected. This is an A32/T32 NEON instruction.",
      "example": "VQSHRN.dt d0, q2, #16",
      "pseudocode": "shift_amount ← imm6\nfor i = 0 to narrow_elements-1 do\n  wide_value ← Qm[i]\n  shifted ← wide_value >> shift_amount\n  result ← SatQ(shifted, narrow_esize)\n  Dd[i] ← result"
    },
    {
      "mnemonic": "vqshlu",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Shift Left Unsigned",
      "summary": "Shifts signed elements left, saturating to unsigned result.",
      "syntax": "VQSHLU<c>.<dt> <Qd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "1111001 | 1 | 1 | D | imm6 | Vd | 011 | 0 | L | 1 | M | 1 | Vm",
        "hex_opcode": "0xF3800650",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "imm6",
            "clean": "imm6"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "L",
            "clean": "L"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:16 | 15:12 | 11:9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Saturating Shift Left Unsigned shifts each signed element in Qm left by an immediate value and saturates the result to an unsigned range. Elements that overflow are clamped to the maximum unsigned value of the result type. All condition flags (N, Z, C, V) remain unaffected. This is an A32/T32 NEON instruction.",
      "example": "VQSHLU.dt q0, q2, #16",
      "pseudocode": "shift_amount ← imm6\nfor i = 0 to elements-1 do\n  result ← SatQ(Qm[i] << shift_amount, 0, max_unsigned_value)\n  Qd[i] ← result"
    },
    {
      "mnemonic": "vqrshl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Rounding Shift Left",
      "summary": "Shifts left with saturation and rounding.",
      "syntax": "VQRSHL<c>.<dt> <Qd>, <Qm>, <Qn>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 0 | D | size | Vn | Vd | 0101 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF2000510",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "Shift Reg"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Saturating Rounding Shift Left shifts each element in Qm left by the amount specified in the corresponding element of Qn, with saturation and rounding applied. When the shift amount is negative, a right shift with rounding is performed. All condition flags (N, Z, C, V) remain unaffected. This is an A32/T32 NEON instruction.",
      "example": "VQRSHL.dt q0, q2, q1",
      "pseudocode": "for i = 0 to elements-1 do\n  shift_amount ← SignExtend(Qn[i])\n  if shift_amount >= 0 then\n    result ← SatQ(Qm[i] << shift_amount, esize)\n  else\n    rounding_bit ← Qm[i][(-shift_amount-1)]\n    shifted ← Qm[i] >> (-shift_amount)\n    result ← SatQ(shifted + rounding_bit, esize)\n  Qd[i] ← result"
    },
    {
      "mnemonic": "vqrshrn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Rounding Shift Right Narrow",
      "summary": "Shifts right, saturates, rounds, and narrows.",
      "syntax": "VQRSHRN<c>.<dt> <Dd>, <Qm>, #<imm>",
      "encoding": {
        "format": "NEON Shift",
        "binary_pattern": "111100111 | D | 11 | size | 10 | Vd | 0 | 010 | op | M | 0 | Vm",
        "hex_opcode": "0xF3B20280",
        "visual_parts": [
          {
            "raw": "111100111",
            "clean": "111100111"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "op",
            "clean": "op"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:23 | 22 | 21:20 | 19:18 | 17:16 | 15:12 | 11 | 10:8 | 7:6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Dest Narrow"
        },
        {
          "name": "Qm",
          "desc": "Src Wide"
        },
        {
          "name": "imm",
          "desc": "Signed immediate value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Saturating Rounding Shift Right Narrow shifts each element in Qm right by an immediate value with rounding, saturates to the narrower result type, and packs the narrowed results into Dd. Rounding is applied before truncation and narrowing. This reduces element size by half and narrows the register from 128-bit to 64-bit. All condition flags (N, Z, C, V) remain unaffected. This is an A32/T32 NEON instruction.",
      "example": "VQRSHRN.dt d0, q2, #16",
      "pseudocode": "shift_amount ← imm6\nfor i = 0 to narrow_elements-1 do\n  wide_value ← Qm[i]\n  rounding_bit ← wide_value[shift_amount-1]\n  shifted ← wide_value >> shift_amount\n  rounded ← shifted + rounding_bit\n  result ← SatQ(rounded, narrow_esize)\n  Dd[i] ← result"
    },
    {
      "mnemonic": "vacge",
      "architecture": "ARMv8-A",
      "full_name": "Vector Absolute Compare Greater or Equal",
      "summary": "Compares absolute values (|Vn| >= |Vm|).",
      "syntax": "VACGE<c>.F32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 1 | 0 | D | 0 | sz | Vn | Vd | 1110 | N | 0 | M | 1 | Vm",
        "hex_opcode": "0xF3000E10",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest Mask"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Vector Absolute Compare Greater or Equal compares the absolute values of corresponding floating-point elements in Qn and Qm, setting each element in Qd to all 1s (true) if |Qn[i]| >= |Qm[i]|, or all 0s (false) otherwise. The comparison is per-element on 32-bit floating-point values. All condition flags (N, Z, C, V) remain unaffected. This is an A32/T32 NEON floating-point instruction.",
      "example": "VACGE.F32 q0, q1, q2",
      "pseudocode": "for i = 0 to elements-1 do\n  if FPAbs(Qn[i]) >= FPAbs(Qm[i]) then\n    Qd[i] ← 0xFFFFFFFF\n  else\n    Qd[i] ← 0x00000000"
    },
    {
      "mnemonic": "vacgt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Absolute Compare Greater Than",
      "summary": "Compares absolute values (|Vn| > |Vm|).",
      "syntax": "VACGT<c>.F32 <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 1 | 0 | D | 1 | sz | Vn | Vd | 1110 | N | 1 | M | 1 | Vm",
        "hex_opcode": "0xF3200E50",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21 | 20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest Mask"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a vector absolute comparison of floating-point elements, setting each element of the destination to all 1s if |Vn| > |Vm|, otherwise 0s. This is a NEON floating-point comparison that operates on F32 elements in 128-bit registers. No condition flags are modified; the result is a per-element mask stored in the destination register.",
      "example": "VACGT.F32 q0, q1, q2",
      "pseudocode": "for i = 0 to 3\n  if abs(Qn[i]) > abs(Qm[i]) then\n    Qd[i] ← 0xFFFFFFFF\n  else\n    Qd[i] ← 0x00000000"
    },
    {
      "mnemonic": "vabal",
      "architecture": "ARMv8-A",
      "full_name": "Vector Absolute Difference and Accumulate Long",
      "summary": "Computes absolute difference of narrow elements and adds to wide acc.",
      "syntax": "VABAL<c>.<dt> <Qd>, <Dn>, <Dm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 1 | D | size | Vn | Vd | 0101 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2800500",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0101",
            "clean": "0101"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest Wide"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes the absolute difference of narrow elements from two double-width registers and accumulates (adds) the widened result to a quad-width accumulator register. The operand size is determined by the data type specifier (sz field controls .I8, .I16, or .I32 variants). No condition flags are affected; saturation may occur and set the QC flag if enabled.",
      "example": "VABAL.dt q0, d1, d2",
      "pseudocode": "for i = 0 to (64 / esize - 1)\n  diff ← abs(Dn[i] - Dm[i])\n  Qd[i] ← Qd[i] + diff_widened"
    },
    {
      "mnemonic": "vabdl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Absolute Difference Long",
      "summary": "Computes absolute difference of narrow elements to wide result.",
      "syntax": "VABDL<c>.<dt> <Qd>, <Dn>, <Dm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | U | 1 | D | size | Vn | Vd | 0111 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2800700",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "U",
            "clean": "U"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest Wide"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes the absolute difference of narrow elements from two double-width registers and widens the result to quad-width. The operand size is determined by the data type specifier (sz field controls .I8, .I16, or .I32 variants). No condition flags are affected; the result is written to the destination without saturation.",
      "example": "VABDL.dt q0, d1, d2",
      "pseudocode": "for i = 0 to (64 / esize - 1)\n  diff ← abs(Dn[i] - Dm[i])\n  Qd[i] ← diff_widened"
    },
    {
      "mnemonic": "vraddhn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Rounding Add High Narrow",
      "summary": "Adds wide elements, rounds, and returns high narrow half.",
      "syntax": "VRADDHN<c>.<dt> <Dd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 1 | 1 | D | size | Vn | Vd | 0100 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3800400",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Dest Narrow"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds corresponding wide elements from two quad-width registers, applies rounding (round to nearest, ties to even), and returns the high half of each widened result as narrow elements in a double-width destination. The operand size is determined by the data type specifier (sz field controls .I16, .I32, or .I64 variants). No condition flags are affected.",
      "example": "VRADDHN.dt d0, q1, q2",
      "pseudocode": "for i = 0 to (128 / (esize * 2) - 1)\n  sum ← Qn[i] + Qm[i]\n  rounded ← sum + (1 << (esize - 1))\n  Dd[i] ← (rounded >> esize)[esize - 1:0]"
    },
    {
      "mnemonic": "vsubhn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Subtract High Narrow",
      "summary": "Subtracts wide elements and returns high narrow half.",
      "syntax": "VSUBHN<c>.<dt> <Dd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 1 | D | size | Vn | Vd | 0110 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2800600",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Dest Narrow"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Subtracts wide elements of the second quad-width register from the first, and returns the high half of the result as narrow elements in a double-width destination. The operand size is determined by the data type specifier (sz field controls .I16, .I32, or .I64 variants). No condition flags are affected; no rounding is applied.",
      "example": "VSUBHN.dt d0, q1, q2",
      "pseudocode": "for i = 0 to (128 / (esize * 2) - 1)\n  diff ← Qn[i] - Qm[i]\n  Dd[i] ← (diff >> esize)[esize - 1:0]"
    },
    {
      "mnemonic": "vrsubhn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Rounding Subtract High Narrow",
      "summary": "Subtracts wide elements, rounds, and returns high narrow half.",
      "syntax": "VRSUBHN<c>.<dt> <Dd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 1 | 1 | D | size | Vn | Vd | 0110 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF3800600",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "0110",
            "clean": "0110"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Dd",
          "desc": "Dest Narrow"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Subtracts wide elements of the second quad-width register from the first, applies rounding (round to nearest), and returns the high half of the result as narrow elements in a double-width destination. The operand size is determined by the data type specifier (sz field controls .I16, .I32, or .I64 variants). No condition flags are affected.",
      "example": "VRSUBHN.dt d0, q1, q2",
      "pseudocode": "for i = 0 to (128 / (esize * 2) - 1)\n  diff ← Qn[i] - Qm[i]\n  rounded ← diff + (1 << (esize - 1))\n  Dd[i] ← (rounded >> esize)[esize - 1:0]"
    },
    {
      "mnemonic": "vqdmlal",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Doubling Multiply Accumulate Long",
      "summary": "Multiplies, doubles, saturates, and adds to accumulator (High precision DSP).",
      "syntax": "VQDMLAL<c>.<dt> <Qd>, <Dn>, <Dm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 1 | D | size | Vn | Vd | 10 | 0 | 1 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2800900",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest Wide"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a saturating doubling multiply of corresponding narrow elements, then accumulates (adds) the doubled products to a quad-width destination register. The multiplication is doubled with saturation; the operand size is determined by the data type specifier (sz field controls .S16 or .S32 variants). The QC (saturation) flag may be set if overflow occurs during doubling or accumulation.",
      "example": "VQDMLAL.dt q0, d1, d2",
      "pseudocode": "for i = 0 to (64 / esize - 1)\n  product ← Dn[i] * Dm[i]\n  doubled ← SatMul(product, 2)  ; saturating double\n  Qd[i] ← SatAdd(Qd[i], doubled)"
    },
    {
      "mnemonic": "vqdmlsl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Doubling Multiply Subtract Long",
      "summary": "Multiplies, doubles, saturates, and subtracts from accumulator.",
      "syntax": "VQDMLSL<c>.<dt> <Qd>, <Dn>, <Dm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 1 | D | size | Vn | Vd | 10 | 1 | 1 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2800B00",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest Wide"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a saturating doubling multiply of corresponding narrow elements, then subtracts the doubled products from a quad-width destination register. The multiplication is doubled with saturation; the operand size is determined by the data type specifier (sz field controls .S16 or .S32 variants). The QC (saturation) flag may be set if overflow occurs during doubling or subtraction.",
      "example": "VQDMLSL.dt q0, d1, d2",
      "pseudocode": "for i = 0 to (64 / esize - 1)\n  product ← Dn[i] * Dm[i]\n  doubled ← SatMul(product, 2)  ; saturating double\n  Qd[i] ← SatSub(Qd[i], doubled)"
    },
    {
      "mnemonic": "vqdmulh",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Doubling Multiply High",
      "summary": "Multiplies, doubles, saturates, and keeps high half.",
      "syntax": "VQDMULH<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 0 | D | size | Vn | Vd | 1011 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2000B00",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1011",
            "clean": "1011"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs signed fixed-point saturating doubling multiply on NEON vector elements, returning the high half of the doubled result. Each element in Qn is multiplied by the corresponding element in Qm, the result is doubled, saturated to the data type range, and the high half is written to Qd. The NEON condition flags are not affected; saturation is indicated via the FPSCR QC bit if the result overflows.",
      "example": "VQDMULH.dt q0, q1, q2",
      "pseudocode": "for i = 0 to elements_in_128bit(dt) - 1 do\n  product ← (Qn[i] * Qm[i]) * 2\n  Qd[i] ← SignedSaturate(product, dt)\nFPSCR.QC ← FPSCR.QC OR (product overflowed)"
    },
    {
      "mnemonic": "vqrdmulh",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Rounding Doubling Multiply High",
      "summary": "Fixed-point multiply with rounding and saturation.",
      "syntax": "VQRDMULH<c>.<dt> <Qd>, <Qn>, <Qm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 1 | 0 | D | size | Vn | Vd | 1011 | N | 1 | M | 0 | Vm",
        "hex_opcode": "0xF3000B40",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1011",
            "clean": "1011"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Destination 128-bit SIMD register"
        },
        {
          "name": "Qn",
          "desc": "First source 128-bit SIMD register"
        },
        {
          "name": "Qm",
          "desc": "Second source 128-bit SIMD register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs signed fixed-point saturating rounding doubling multiply on NEON vector elements, returning the high half with rounding. Each element in Qn is multiplied by the corresponding element in Qm, the result is doubled with rounding applied (via addition of 0x80000000 for 32-bit or 0x8000 for 16-bit before right-shift), saturated to the data type range, and the high half is written to Qd. The NEON condition flags are not affected; saturation is indicated via the FPSCR QC bit.",
      "example": "VQRDMULH.dt q0, q1, q2",
      "pseudocode": "for i = 0 to elements_in_128bit(dt) - 1 do\n  product ← (Qn[i] * Qm[i]) * 2\n  if dt == S32 then\n    product ← (product + 0x80000000) >> 32\n  else\n    product ← (product + 0x8000) >> 16\n  Qd[i] ← SignedSaturate(product, dt)\nFPSCR.QC ← FPSCR.QC OR (saturation occurred)"
    },
    {
      "mnemonic": "vqdmull",
      "architecture": "ARMv8-A",
      "full_name": "Vector Saturating Doubling Multiply Long",
      "summary": "Multiplies narrow elements, doubles, and saturates into wide elements.",
      "syntax": "VQDMULL<c>.<dt> <Qd>, <Dn>, <Dm>",
      "encoding": {
        "format": "NEON 3-Reg",
        "binary_pattern": "1111001 | 0 | 1 | D | size | Vn | Vd | 1101 | N | 0 | M | 0 | Vm",
        "hex_opcode": "0xF2800D00",
        "visual_parts": [
          {
            "raw": "1111001",
            "clean": "1111001"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "D",
            "clean": "D"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Vn",
            "clean": "Vn"
          },
          {
            "raw": "Vd",
            "clean": "Vd"
          },
          {
            "raw": "1101",
            "clean": "1101"
          },
          {
            "raw": "N",
            "clean": "N"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "M",
            "clean": "M"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Vm",
            "clean": "Vm"
          }
        ],
        "bit_positions": "31:25 | 24 | 23 | 22 | 21:20 | 19:16 | 15:12 | 11:8 | 7 | 6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "Dest Wide"
        },
        {
          "name": "Dn",
          "desc": "First source 64-bit SIMD/FP register"
        },
        {
          "name": "Dm",
          "desc": "Second source 64-bit SIMD/FP register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs signed fixed-point saturating doubling multiply long on NEON vectors, widening narrow elements to double-width results. Each element in Dn is multiplied by the corresponding element in Dm, the result is doubled, saturated to the wider data type range, and written to the corresponding location in Qd. The NEON condition flags are not affected; saturation is indicated via the FPSCR QC bit.",
      "example": "VQDMULL.dt q0, d1, d2",
      "pseudocode": "for i = 0 to elements_in_64bit(dt) - 1 do\n  product ← (Dn[i] * Dm[i]) * 2\n  Qd[i] ← SignedSaturate(product, widen(dt))\nFPSCR.QC ← FPSCR.QC OR (saturation occurred)"
    },
    {
      "mnemonic": "sxtab",
      "architecture": "ARMv8-A",
      "full_name": "Signed Extend and Add Byte",
      "summary": "Sign-extends a byte from Rm and adds to Rn.",
      "syntax": "SXTAB<c> <Rd>, <Rn>, <Rm> {, <rotation>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 0 | 10 | Rn | Rd | rotate | 0 | 0 | 0111 | Rm",
        "hex_opcode": "0x06A00070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "rotate",
            "clean": "rotate"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Accumulator"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Sign-extends the least significant byte of Rm (optionally rotated), adds it to Rn, and writes the result to Rd. This is an A32 instruction that operates on general-purpose registers and does not affect the condition flags. The rotation parameter is optional (ROR by 0, 8, 16, or 24 bits before sign-extension).",
      "example": "SXTAB r0, r1, r2",
      "pseudocode": "rotated ← ROR(Rm, rotation)\nbyte_value ← rotated[7:0]\nsign_extended ← SignExtend(byte_value, 32)\nRd ← Rn + sign_extended"
    },
    {
      "mnemonic": "sxtab16",
      "architecture": "ARMv8-A",
      "full_name": "Signed Extend and Add Byte 16",
      "summary": "Sign-extends two bytes and adds to two halfwords.",
      "syntax": "SXTAB16<c> <Rd>, <Rn>, <Rm> {, <rotation>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 0 | 00 | Rn | Rd | rotate | 0 | 0 | 0111 | Rm",
        "hex_opcode": "0x06800070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "rotate",
            "clean": "rotate"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Accumulator"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Sign-extends the least significant byte and the most significant byte of the low halfword from Rm (optionally rotated), adds them separately to the two halfwords of Rn, and writes the results to Rd. This is an A32 instruction that operates on general-purpose registers and does not affect the condition flags. Useful for parallel byte-to-halfword sign-extension and accumulation.",
      "example": "SXTAB16 r0, r1, r2",
      "pseudocode": "rotated ← ROR(Rm, rotation)\nbyte0 ← rotated[7:0]\nbyte1 ← rotated[15:8]\nsign_ext0 ← SignExtend(byte0, 16)\nsign_ext1 ← SignExtend(byte1, 16)\nRd[15:0] ← Rn[15:0] + sign_ext0\nRd[31:16] ← Rn[31:16] + sign_ext1"
    },
    {
      "mnemonic": "sxtah",
      "architecture": "ARMv8-A",
      "full_name": "Signed Extend and Add Halfword",
      "summary": "Sign-extends a halfword and adds to Rn.",
      "syntax": "SXTAH<c> <Rd>, <Rn>, <Rm> {, <rotation>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 0 | 11 | Rn | Rd | rotate | 0 | 0 | 0111 | Rm",
        "hex_opcode": "0x06B00070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "rotate",
            "clean": "rotate"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Accumulator"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Sign-extends the least significant halfword of Rm (optionally rotated), adds it to Rn, and writes the result to Rd. This is an A32 instruction that operates on general-purpose registers and does not affect the condition flags. The rotation parameter is optional (ROR by 0, 8, 16, or 24 bits before sign-extension).",
      "example": "SXTAH r0, r1, r2",
      "pseudocode": "rotated ← ROR(Rm, rotation)\nhalfword_value ← rotated[15:0]\nsign_extended ← SignExtend(halfword_value, 32)\nRd ← Rn + sign_extended"
    },
    {
      "mnemonic": "uxtab",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Extend and Add Byte",
      "summary": "Zero-extends a byte and adds to Rn.",
      "syntax": "UXTAB<c> <Rd>, <Rn>, <Rm> {, <rotation>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 1 | 10 | Rn | Rd | rotate | 0 | 0 | 0111 | Rm",
        "hex_opcode": "0x06E00070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "rotate",
            "clean": "rotate"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Accumulator"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Zero-extends the least significant byte of Rm (optionally rotated), adds it to Rn, and writes the result to Rd. This is an A32 instruction that operates on general-purpose registers and does not affect the condition flags. The rotation parameter is optional (ROR by 0, 8, 16, or 24 bits before zero-extension).",
      "example": "UXTAB r0, r1, r2",
      "pseudocode": "rotated ← ROR(Rm, rotation)\nbyte_value ← rotated[7:0]\nzero_extended ← ZeroExtend(byte_value, 32)\nRd ← Rn + zero_extended"
    },
    {
      "mnemonic": "uxtab16",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Extend and Add Byte 16",
      "summary": "Zero-extends two bytes and adds to two halfwords.",
      "syntax": "UXTAB16<c> <Rd>, <Rn>, <Rm> {, <rotation>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 1 | 00 | Rn | Rd | rotate | 0 | 0 | 0111 | Rm",
        "hex_opcode": "0x06C00070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "rotate",
            "clean": "rotate"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Accumulator"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Zero-extends the least significant byte and the most significant byte of the low halfword from Rm (optionally rotated), adds them separately to the two halfwords of Rn, and writes the results to Rd. This is an A32 instruction that operates on general-purpose registers and does not affect the condition flags. Useful for parallel byte-to-halfword zero-extension and accumulation.",
      "example": "UXTAB16 r0, r1, r2",
      "pseudocode": "rotated ← ROR(Rm, rotation)\nbyte0 ← rotated[7:0]\nbyte1 ← rotated[15:8]\nzero_ext0 ← ZeroExtend(byte0, 16)\nzero_ext1 ← ZeroExtend(byte1, 16)\nRd[15:0] ← Rn[15:0] + zero_ext0\nRd[31:16] ← Rn[31:16] + zero_ext1"
    },
    {
      "mnemonic": "uxtah",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Extend and Add Halfword",
      "summary": "Zero-extends a halfword and adds to Rn.",
      "syntax": "UXTAH<c> <Rd>, <Rn>, <Rm> {, <rotation>}",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101 | 1 | 11 | Rn | Rd | rotate | 0 | 0 | 0111 | Rm",
        "hex_opcode": "0x06F00070",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101",
            "clean": "01101"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "rotate",
            "clean": "rotate"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22 | 21:20 | 19:16 | 15:12 | 11:10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "Accumulator"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Zero-extends a halfword (16-bit) from Rm, optionally rotates it by 0, 8, 16, or 24 bits, and adds the result to Rn, storing the sum in Rd. The instruction executes conditionally based on the condition code and does not update the condition flags. This is an A32 DSP extension instruction.",
      "example": "UXTAH r0, r1, r2",
      "pseudocode": "rotated ← ROR(Rm, rotation)\nextended ← ZeroExtend(rotated[15:0], 32)\nRd ← Rn + extended"
    },
    {
      "mnemonic": "smuad",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Add Dual",
      "summary": "Performs two 16x16 multiplies and adds results (Top*Top + Bot*Bot).",
      "syntax": "SMUAD{X}<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 01110 | 000 | Rd | 1111 | Rm | 00 | 0 | 1 | Rn",
        "hex_opcode": "0x0700F010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Multiplies two pairs of signed 16-bit values: (Rn[31:16] × Rm[31:16]) + (Rn[15:0] × Rm[15:0]), storing the 32-bit signed result in Rd. The {X} variant swaps the operands of one multiply. The instruction does not update condition flags. A32 DSP extension only.",
      "example": "SMUAD r0, r1, r2",
      "pseudocode": "if X then\n  prod1 ← SignExtend(Rn[31:16], 32) × SignExtend(Rm[15:0], 32)\n  prod2 ← SignExtend(Rn[15:0], 32) × SignExtend(Rm[31:16], 32)\nelse\n  prod1 ← SignExtend(Rn[31:16], 32) × SignExtend(Rm[31:16], 32)\n  prod2 ← SignExtend(Rn[15:0], 32) × SignExtend(Rm[15:0], 32)\nRd ← prod1 + prod2"
    },
    {
      "mnemonic": "smusd",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Subtract Dual",
      "summary": "Performs two 16x16 multiplies and subtracts results.",
      "syntax": "SMUSD{X}<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 01110 | 000 | Rd | 1111 | Rm | 01 | 0 | 1 | Rn",
        "hex_opcode": "0x0700F050",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1111",
            "clean": "1111"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Multiplies two pairs of signed 16-bit values and subtracts: (Rn[31:16] × Rm[31:16]) - (Rn[15:0] × Rm[15:0]), storing the 32-bit signed result in Rd. The {X} variant swaps the operands of one multiply. The instruction does not update condition flags. A32 DSP extension only.",
      "example": "SMUSD r0, r1, r2",
      "pseudocode": "if X then\n  prod1 ← SignExtend(Rn[31:16], 32) × SignExtend(Rm[15:0], 32)\n  prod2 ← SignExtend(Rn[15:0], 32) × SignExtend(Rm[31:16], 32)\nelse\n  prod1 ← SignExtend(Rn[31:16], 32) × SignExtend(Rm[31:16], 32)\n  prod2 ← SignExtend(Rn[15:0], 32) × SignExtend(Rm[15:0], 32)\nRd ← prod1 - prod2"
    },
    {
      "mnemonic": "smlad",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate Dual",
      "summary": "Dual multiply add + accumulate.",
      "syntax": "SMLAD{X}<c> <Rd>, <Rn>, <Rm>, <Ra>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 01110 | 000 | Rd | Ra | Rm | 00 | 0 | 1 | Rn",
        "hex_opcode": "0x07000010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Ra",
          "desc": "Acc"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Multiplies two pairs of signed 16-bit values and adds the products, then adds the accumulator Ra: (Rn[31:16] × Rm[31:16]) + (Rn[15:0] × Rm[15:0]) + Ra, storing the 32-bit signed result in Rd. The {X} variant swaps operands of one multiply. Does not update condition flags. A32 DSP extension only.",
      "example": "SMLAD r0, r1, r2, r5",
      "pseudocode": "if X then\n  prod1 ← SignExtend(Rn[31:16], 32) × SignExtend(Rm[15:0], 32)\n  prod2 ← SignExtend(Rn[15:0], 32) × SignExtend(Rm[31:16], 32)\nelse\n  prod1 ← SignExtend(Rn[31:16], 32) × SignExtend(Rm[31:16], 32)\n  prod2 ← SignExtend(Rn[15:0], 32) × SignExtend(Rm[15:0], 32)\nRd ← prod1 + prod2 + Ra"
    },
    {
      "mnemonic": "smlsd",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Subtract Dual",
      "summary": "Dual multiply subtract + accumulate.",
      "syntax": "SMLSD{X}<c> <Rd>, <Rn>, <Rm>, <Ra>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 01110 | 000 | Rd | Ra | Rm | 01 | 0 | 1 | Rn",
        "hex_opcode": "0x07000050",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "Ra",
            "clean": "Ra"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        },
        {
          "name": "Ra",
          "desc": "Acc"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Multiplies two pairs of signed 16-bit values, subtracts the products, then adds accumulator Ra: (Rn[31:16] × Rm[31:16]) - (Rn[15:0] × Rm[15:0]) + Ra, storing the 32-bit signed result in Rd. The {X} variant swaps operands of one multiply. Does not update condition flags. A32 DSP extension only.",
      "example": "SMLSD r0, r1, r2, r5",
      "pseudocode": "if X then\n  prod1 ← SignExtend(Rn[31:16], 32) × SignExtend(Rm[15:0], 32)\n  prod2 ← SignExtend(Rn[15:0], 32) × SignExtend(Rm[31:16], 32)\nelse\n  prod1 ← SignExtend(Rn[31:16], 32) × SignExtend(Rm[31:16], 32)\n  prod2 ← SignExtend(Rn[15:0], 32) × SignExtend(Rm[15:0], 32)\nRd ← prod1 - prod2 + Ra"
    },
    {
      "mnemonic": "smlald",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Accumulate Long Dual",
      "summary": "Dual multiply add + 64-bit accumulate.",
      "syntax": "SMLALD{X}<c> <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 01110 | 100 | RdHi | RdLo | Rm | 00 | 0 | 1 | Rn",
        "hex_opcode": "0x07400010",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Dest Lo"
        },
        {
          "name": "RdHi",
          "desc": "Dest Hi"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Multiplies two pairs of signed 16-bit values and adds the products to a 64-bit accumulator: (Rn[31:16] × Rm[31:16]) + (Rn[15:0] × Rm[15:0]) + (RdHi:RdLo), storing the 64-bit signed result in RdHi:RdLo. The {X} variant swaps operands of one multiply. Does not update condition flags. A32 DSP extension only.",
      "example": "SMLALD r1, r0, r1, r2",
      "pseudocode": "if X then\n  prod1 ← SignExtend(Rn[31:16], 64) × SignExtend(Rm[15:0], 64)\n  prod2 ← SignExtend(Rn[15:0], 64) × SignExtend(Rm[31:16], 64)\nelse\n  prod1 ← SignExtend(Rn[31:16], 64) × SignExtend(Rm[31:16], 64)\n  prod2 ← SignExtend(Rn[15:0], 64) × SignExtend(Rm[15:0], 64)\naccum ← (RdHi << 32) | RdLo\nresult ← prod1 + prod2 + accum\nRdHi ← result[63:32]\nRdLo ← result[31:0]"
    },
    {
      "mnemonic": "smlsld",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Subtract Long Dual",
      "summary": "Dual multiply subtract + 64-bit accumulate.",
      "syntax": "SMLSLD{X}<c> <RdLo>, <RdHi>, <Rn>, <Rm>",
      "encoding": {
        "format": "Multiply",
        "binary_pattern": "cond | 01110 | 100 | RdHi | RdLo | Rm | 01 | 0 | 1 | Rn",
        "hex_opcode": "0x07400050",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "RdHi",
            "clean": "RdHi"
          },
          {
            "raw": "RdLo",
            "clean": "RdLo"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11:8 | 7:6 | 5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "RdLo",
          "desc": "Dest Lo"
        },
        {
          "name": "RdHi",
          "desc": "Dest Hi"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Multiplies two pairs of signed 16-bit values, subtracts the products, and adds to a 64-bit accumulator: (Rn[31:16] × Rm[31:16]) - (Rn[15:0] × Rm[15:0]) + (RdHi:RdLo), storing the 64-bit signed result in RdHi:RdLo. The {X} variant swaps operands of one multiply. Does not update condition flags. A32 DSP extension only.",
      "example": "SMLSLD r1, r0, r1, r2",
      "pseudocode": "if X then\n  prod1 ← SignExtend(Rn[31:16], 64) × SignExtend(Rm[15:0], 64)\n  prod2 ← SignExtend(Rn[15:0], 64) × SignExtend(Rm[31:16], 64)\nelse\n  prod1 ← SignExtend(Rn[31:16], 64) × SignExtend(Rm[31:16], 64)\n  prod2 ← SignExtend(Rn[15:0], 64) × SignExtend(Rm[15:0], 64)\naccum ← (RdHi << 32) | RdLo\nresult ← prod1 - prod2 + accum\nRdHi ← result[63:32]\nRdLo ← result[31:0]"
    },
    {
      "mnemonic": "qadd8",
      "architecture": "ARMv8-A",
      "full_name": "Saturating Add 8",
      "summary": "Parallel saturating add of 4 signed bytes.",
      "syntax": "QADD8<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 010 | Rn | Rd | 1 | 1 | 1 | 1 | 1 | 00 | 1 | Rm",
        "hex_opcode": "0x06200F90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs four parallel saturating additions on signed bytes: each byte of Rn is added to the corresponding byte of Rm with signed saturation, and the four 8-bit saturated results are packed into Rd. The GE[3:0] condition flags are updated to indicate which byte operations did not saturate. A32 DSP extension only.",
      "example": "QADD8 r0, r1, r2",
      "pseudocode": "for i = 0 to 3\n  byte_index ← i × 8\n  a ← SignExtend(Rn[byte_index + 7 : byte_index], 9)\n  b ← SignExtend(Rm[byte_index + 7 : byte_index], 9)\n  sum ← a + b\n  if sum > 127 then\n    result_byte ← 127\n    GE[i] ← 0\n  elsif sum < -128 then\n    result_byte ← -128\n    GE[i] ← 0\n  else\n    result_byte ← sum[7:0]\n    GE[i] ← 1\n  Rd[byte_index + 7 : byte_index] ← result_byte"
    },
    {
      "mnemonic": "qadd16",
      "architecture": "ARMv8-A",
      "full_name": "Saturating Add 16",
      "summary": "Parallel saturating add of 2 signed halfwords.",
      "syntax": "QADD16<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 010 | Rn | Rd | 1 | 1 | 1 | 1 | 0 | 00 | 1 | Rm",
        "hex_opcode": "0x06200F10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs parallel saturating addition of two signed 16-bit halfwords in Rn and Rm, storing results in Rd. Each halfword is independently saturated to the signed 16-bit range [-32768, 32767] if overflow occurs. No condition flags are affected. Execution restricted to A32 with DSP extension; requires ARMv6 or later.",
      "example": "QADD16 r0, r1, r2",
      "pseudocode": "Rd[31:16] ← SignedSat(Rn[31:16] + Rm[31:16], 16)\nRd[15:0] ← SignedSat(Rn[15:0] + Rm[15:0], 16)"
    },
    {
      "mnemonic": "qsub8",
      "architecture": "ARMv8-A",
      "full_name": "Saturating Subtract 8",
      "summary": "Parallel saturating subtract of 4 signed bytes.",
      "syntax": "QSUB8<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 010 | Rn | Rd | 1 | 1 | 1 | 1 | 1 | 11 | 1 | Rm",
        "hex_opcode": "0x06200FF0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs parallel saturating subtraction of four signed 8-bit bytes in Rm from Rn, storing results in Rd. Each byte is independently saturated to the signed 8-bit range [-128, 127] if underflow occurs. No condition flags are affected. Execution restricted to A32 with DSP extension; requires ARMv6 or later.",
      "example": "QSUB8 r0, r1, r2",
      "pseudocode": "Rd[31:24] ← SignedSat(Rn[31:24] - Rm[31:24], 8)\nRd[23:16] ← SignedSat(Rn[23:16] - Rm[23:16], 8)\nRd[15:8] ← SignedSat(Rn[15:8] - Rm[15:8], 8)\nRd[7:0] ← SignedSat(Rn[7:0] - Rm[7:0], 8)"
    },
    {
      "mnemonic": "qsub16",
      "architecture": "ARMv8-A",
      "full_name": "Saturating Subtract 16",
      "summary": "Parallel saturating subtract of 2 signed halfwords.",
      "syntax": "QSUB16<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 010 | Rn | Rd | 1 | 1 | 1 | 1 | 0 | 11 | 1 | Rm",
        "hex_opcode": "0x06200F70",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs parallel saturating subtraction of two signed 16-bit halfwords in Rm from Rn, storing results in Rd. Each halfword is independently saturated to the signed 16-bit range [-32768, 32767] if underflow occurs. No condition flags are affected. Execution restricted to A32 with DSP extension; requires ARMv6 or later.",
      "example": "QSUB16 r0, r1, r2",
      "pseudocode": "Rd[31:16] ← SignedSat(Rn[31:16] - Rm[31:16], 16)\nRd[15:0] ← SignedSat(Rn[15:0] - Rm[15:0], 16)"
    },
    {
      "mnemonic": "shadd8",
      "architecture": "ARMv8-A",
      "full_name": "Signed Halving Add 8",
      "summary": "Signed add and halving (average) of 4 bytes.",
      "syntax": "SHADD8<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 011 | Rn | Rd | 1 | 1 | 1 | 1 | 1 | 00 | 1 | Rm",
        "hex_opcode": "0x06300F90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs parallel addition of four signed 8-bit bytes from Rn and Rm, then arithmetically shifts each result right by 1 bit (halving), storing in Rd. No saturation occurs; results are always in the range [-128, 127]. No condition flags are affected. Execution restricted to A32 with DSP extension; requires ARMv6 or later.",
      "example": "SHADD8 r0, r1, r2",
      "pseudocode": "Rd[31:24] ← (SignExtend(Rn[31:24]) + SignExtend(Rm[31:24])) >> 1\nRd[23:16] ← (SignExtend(Rn[23:16]) + SignExtend(Rm[23:16])) >> 1\nRd[15:8] ← (SignExtend(Rn[15:8]) + SignExtend(Rm[15:8])) >> 1\nRd[7:0] ← (SignExtend(Rn[7:0]) + SignExtend(Rm[7:0])) >> 1"
    },
    {
      "mnemonic": "shadd16",
      "architecture": "ARMv8-A",
      "full_name": "Signed Halving Add 16",
      "summary": "Signed add and halving (average) of 2 halfwords.",
      "syntax": "SHADD16<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 011 | Rn | Rd | 1 | 1 | 1 | 1 | 0 | 00 | 1 | Rm",
        "hex_opcode": "0x06300F10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs parallel addition of two signed 16-bit halfwords from Rn and Rm, then arithmetically shifts each result right by 1 bit (halving), storing in Rd. No saturation occurs; results are always in the range [-32768, 32767]. No condition flags are affected. Execution restricted to A32 with DSP extension; requires ARMv6 or later.",
      "example": "SHADD16 r0, r1, r2",
      "pseudocode": "Rd[31:16] ← (SignExtend(Rn[31:16]) + SignExtend(Rm[31:16])) >> 1\nRd[15:0] ← (SignExtend(Rn[15:0]) + SignExtend(Rm[15:0])) >> 1"
    },
    {
      "mnemonic": "shsub8",
      "architecture": "ARMv8-A",
      "full_name": "Signed Halving Subtract 8",
      "summary": "Signed subtract and halving of 4 bytes.",
      "syntax": "SHSUB8<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 011 | Rn | Rd | 1 | 1 | 1 | 1 | 1 | 11 | 1 | Rm",
        "hex_opcode": "0x06300FF0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs parallel subtraction of four signed 8-bit bytes in Rm from Rn, then arithmetically shifts each result right by 1 bit (halving), storing in Rd. No saturation occurs; results are always in the range [-128, 127]. No condition flags are affected. Execution restricted to A32 with DSP extension; requires ARMv6 or later.",
      "example": "SHSUB8 r0, r1, r2",
      "pseudocode": "Rd[31:24] ← (SignExtend(Rn[31:24]) - SignExtend(Rm[31:24])) >> 1\nRd[23:16] ← (SignExtend(Rn[23:16]) - SignExtend(Rm[23:16])) >> 1\nRd[15:8] ← (SignExtend(Rn[15:8]) - SignExtend(Rm[15:8])) >> 1\nRd[7:0] ← (SignExtend(Rn[7:0]) - SignExtend(Rm[7:0])) >> 1"
    },
    {
      "mnemonic": "shsub16",
      "architecture": "ARMv8-A",
      "full_name": "Signed Halving Subtract 16",
      "summary": "Signed subtract and halving of 2 halfwords.",
      "syntax": "SHSUB16<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 011 | Rn | Rd | 1 | 1 | 1 | 1 | 0 | 11 | 1 | Rm",
        "hex_opcode": "0x06300F70",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs parallel subtraction of two signed 16-bit halfwords in Rm from Rn, then arithmetically shifts each result right by 1 bit (halving), storing in Rd. No saturation occurs; results are always in the range [-32768, 32767]. No condition flags are affected. Execution restricted to A32 with DSP extension; requires ARMv6 or later.",
      "example": "SHSUB16 r0, r1, r2",
      "pseudocode": "Rd[31:16] ← (SignExtend(Rn[31:16]) - SignExtend(Rm[31:16])) >> 1\nRd[15:0] ← (SignExtend(Rn[15:0]) - SignExtend(Rm[15:0])) >> 1"
    },
    {
      "mnemonic": "uqadd8",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Saturating Add 8",
      "summary": "Unsigned saturating add of 4 bytes.",
      "syntax": "UQADD8<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 110 | Rn | Rd | 1 | 1 | 1 | 1 | 1 | 00 | 1 | Rm",
        "hex_opcode": "0x06600F90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs parallel saturating addition of four unsigned 8-bit bytes from Rn and Rm, storing results in Rd. Each byte is independently saturated to the unsigned 8-bit range [0, 255] if overflow occurs. No condition flags are affected. Execution restricted to A32 with DSP extension; requires ARMv6 or later.",
      "example": "UQADD8 r0, r1, r2",
      "pseudocode": "Rd[31:24] ← UnsignedSat(Rn[31:24] + Rm[31:24], 8)\nRd[23:16] ← UnsignedSat(Rn[23:16] + Rm[23:16], 8)\nRd[15:8] ← UnsignedSat(Rn[15:8] + Rm[15:8], 8)\nRd[7:0] ← UnsignedSat(Rn[7:0] + Rm[7:0], 8)"
    },
    {
      "mnemonic": "uqadd16",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Saturating Add 16",
      "summary": "Unsigned saturating add of 2 halfwords.",
      "syntax": "UQADD16<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 110 | Rn | Rd | 1 | 1 | 1 | 1 | 0 | 00 | 1 | Rm",
        "hex_opcode": "0x06600F10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs unsigned saturating addition of two 16-bit halfwords in parallel. Each halfword of Rn is added to the corresponding halfword of Rm; if the result exceeds the unsigned 16-bit range (0-65535), it saturates to 65535. No condition flags are affected; saturation status is not recorded.",
      "example": "UQADD16 r0, r1, r2",
      "pseudocode": "half1_rn ← Rn[15:0]; half2_rn ← Rn[31:16]\nhalf1_rm ← Rm[15:0]; half2_rm ← Rm[31:16]\nsum1 ← half1_rn + half1_rm; sum2 ← half2_rn + half2_rm\nRd[15:0] ← (sum1 > 0xFFFF) ? 0xFFFF : sum1\nRd[31:16] ← (sum2 > 0xFFFF) ? 0xFFFF : sum2"
    },
    {
      "mnemonic": "uqsub8",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Saturating Subtract 8",
      "summary": "Unsigned saturating subtract of 4 bytes.",
      "syntax": "UQSUB8<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 110 | Rn | Rd | 1 | 1 | 1 | 1 | 1 | 11 | 1 | Rm",
        "hex_opcode": "0x06600FF0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs unsigned saturating subtraction of four 8-bit bytes in parallel. Each byte of Rm is subtracted from the corresponding byte of Rn; if the result would be negative, it saturates to 0. No condition flags are affected; saturation status is not recorded.",
      "example": "UQSUB8 r0, r1, r2",
      "pseudocode": "for i = 0 to 3 do\n  byte_rn ← Rn[8*i+7:8*i]; byte_rm ← Rm[8*i+7:8*i]\n  diff ← byte_rn - byte_rm\n  Rd[8*i+7:8*i] ← (diff < 0) ? 0 : diff"
    },
    {
      "mnemonic": "uqsub16",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Saturating Subtract 16",
      "summary": "Unsigned saturating subtract of 2 halfwords.",
      "syntax": "UQSUB16<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 110 | Rn | Rd | 1 | 1 | 1 | 1 | 0 | 11 | 1 | Rm",
        "hex_opcode": "0x06600F70",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs unsigned saturating subtraction of two 16-bit halfwords in parallel. Each halfword of Rm is subtracted from the corresponding halfword of Rn; if the result would be negative, it saturates to 0. No condition flags are affected; saturation status is not recorded.",
      "example": "UQSUB16 r0, r1, r2",
      "pseudocode": "half1_rn ← Rn[15:0]; half2_rn ← Rn[31:16]\nhalf1_rm ← Rm[15:0]; half2_rm ← Rm[31:16]\ndiff1 ← half1_rn - half1_rm; diff2 ← half2_rn - half2_rm\nRd[15:0] ← (diff1 < 0) ? 0 : diff1\nRd[31:16] ← (diff2 < 0) ? 0 : diff2"
    },
    {
      "mnemonic": "uhadd8",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Halving Add 8",
      "summary": "Unsigned average of 4 bytes.",
      "syntax": "UHADD8<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 111 | Rn | Rd | 1 | 1 | 1 | 1 | 1 | 00 | 1 | Rm",
        "hex_opcode": "0x06700F90",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs unsigned halving addition of four 8-bit bytes in parallel, effectively computing the average. Each byte of Rn is added to the corresponding byte of Rm and the result is divided by 2 (rounded down). No condition flags are affected.",
      "example": "UHADD8 r0, r1, r2",
      "pseudocode": "for i = 0 to 3 do\n  byte_rn ← Rn[8*i+7:8*i]; byte_rm ← Rm[8*i+7:8*i]\n  sum ← byte_rn + byte_rm\n  Rd[8*i+7:8*i] ← sum >> 1"
    },
    {
      "mnemonic": "uhadd16",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Halving Add 16",
      "summary": "Unsigned average of 2 halfwords.",
      "syntax": "UHADD16<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 111 | Rn | Rd | 1 | 1 | 1 | 1 | 0 | 00 | 1 | Rm",
        "hex_opcode": "0x06700F10",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs unsigned halving addition of two 16-bit halfwords in parallel, computing the average of each pair. Each halfword of Rn is added to the corresponding halfword of Rm and the result is divided by 2 (rounded down). No condition flags are affected.",
      "example": "UHADD16 r0, r1, r2",
      "pseudocode": "half1_rn ← Rn[15:0]; half2_rn ← Rn[31:16]\nhalf1_rm ← Rm[15:0]; half2_rm ← Rm[31:16]\nsum1 ← half1_rn + half1_rm; sum2 ← half2_rn + half2_rm\nRd[15:0] ← sum1 >> 1\nRd[31:16] ← sum2 >> 1"
    },
    {
      "mnemonic": "uhsub8",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Halving Subtract 8",
      "summary": "Unsigned halving subtract of 4 bytes.",
      "syntax": "UHSUB8<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 111 | Rn | Rd | 1 | 1 | 1 | 1 | 1 | 11 | 1 | Rm",
        "hex_opcode": "0x06700FF0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs unsigned halving subtraction of four 8-bit bytes in parallel. Each byte of Rm is subtracted from the corresponding byte of Rn and the result is divided by 2 (rounded down). No condition flags are affected.",
      "example": "UHSUB8 r0, r1, r2",
      "pseudocode": "for i = 0 to 3 do\n  byte_rn ← Rn[8*i+7:8*i]; byte_rm ← Rm[8*i+7:8*i]\n  diff ← byte_rn - byte_rm\n  Rd[8*i+7:8*i] ← diff >> 1"
    },
    {
      "mnemonic": "uhsub16",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Halving Subtract 16",
      "summary": "Unsigned halving subtract of 2 halfwords.",
      "syntax": "UHSUB16<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "SIMD Integer",
        "binary_pattern": "cond | 01100 | 111 | Rn | Rd | 1 | 1 | 1 | 1 | 0 | 11 | 1 | Rm",
        "hex_opcode": "0x06700F70",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01100",
            "clean": "01100"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:23 | 22:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Performs unsigned halving subtraction of two 16-bit halfwords in parallel. Each halfword of Rm is subtracted from the corresponding halfword of Rn and the result is divided by 2 (rounded down). No condition flags are affected.",
      "example": "UHSUB16 r0, r1, r2",
      "pseudocode": "half1_rn ← Rn[15:0]; half2_rn ← Rn[31:16]\nhalf1_rm ← Rm[15:0]; half2_rm ← Rm[31:16]\ndiff1 ← half1_rn - half1_rm; diff2 ← half2_rn - half2_rm\nRd[15:0] ← diff1 >> 1\nRd[31:16] ← diff2 >> 1"
    },
    {
      "mnemonic": "sel",
      "architecture": "ARMv8-A",
      "full_name": "Select Bytes",
      "summary": "Selects bytes from Rn or Rm based on GE flags.",
      "syntax": "SEL<c> <Rd>, <Rn>, <Rm>",
      "encoding": {
        "format": "Data Proc",
        "binary_pattern": "cond | 01101000 | Rn | Rd | 1 | 1 | 1 | 1 | 1011 | Rm",
        "hex_opcode": "0x06800FB0",
        "visual_parts": [
          {
            "raw": "cond",
            "clean": "cond"
          },
          {
            "raw": "01101000",
            "clean": "01101000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1011",
            "clean": "1011"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          }
        ],
        "bit_positions": "31:28 | 27:20 | 19:16 | 15:12 | 11 | 10 | 9 | 8 | 7:4 | 3:0"
      },
      "operands": [
        {
          "name": "Rd",
          "desc": "Destination general-purpose register"
        },
        {
          "name": "Rn",
          "desc": "First source / base general-purpose register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "A32 (DSP)",
      "description": "Selects bytes from Rn or Rm based on the GE (Greater-than-or-Equal) condition flags, placing the selected bytes into Rd. For each byte position i, if GE[i] is set, the byte from Rn[8*i+7:8*i] is selected; otherwise, the byte from Rm[8*i+7:8*i] is selected. Condition flags are not affected by this instruction.",
      "example": "SEL r0, r1, r2",
      "pseudocode": "for i = 0 to 3 do\n  if GE[i] == 1 then\n    Rd[8*i+7:8*i] ← Rn[8*i+7:8*i]\n  else\n    Rd[8*i+7:8*i] ← Rm[8*i+7:8*i]"
    },
    {
      "mnemonic": "prfm",
      "architecture": "ARMv8-A",
      "full_name": "Prefetch Memory (Immediate)",
      "summary": "Signals the memory system to prefetch data into cache.",
      "syntax": "PRFM <prfop>, [<Xn|SP>, #<pimm>]",
      "encoding": {
        "format": "Load/Store Imm",
        "binary_pattern": "11 | 111 | 0 | 01 | 10 | imm12 | Rn | Rt",
        "hex_opcode": "0xF9800000",
        "visual_parts": [
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "imm12",
            "clean": "imm12"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "prfop",
          "desc": "Type (PLDL1KEEP, etc)"
        },
        {
          "name": "Xn",
          "desc": "Base Addr"
        },
        {
          "name": "pimm",
          "desc": "Positive immediate offset"
        }
      ],
      "extension": "Base",
      "description": "Prefetch Memory (Immediate) signals the memory system to prefetch data from an address calculated by adding a scaled 12-bit immediate offset to a base register. This is a hint instruction that does not architecturally affect register state or condition flags. Execution is AArch64-only and no exceptions are generated for invalid addresses.",
      "example": "PRFM prfop, [x1, #16]",
      "pseudocode": "address ← Xn|SP + (imm12 << 3); Prefetch(address, prfop);"
    },
    {
      "mnemonic": "prfm",
      "architecture": "ARMv8-A",
      "full_name": "Prefetch Memory (Literal)",
      "summary": "Prefetches data from a PC-relative address.",
      "syntax": "PRFM <prfop>, <label>",
      "encoding": {
        "format": "Load Literal",
        "binary_pattern": "11 | 011 | 0 | 00 | imm19 | Rt",
        "hex_opcode": "0xD8000000",
        "visual_parts": [
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "imm19",
            "clean": "imm19"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:5 | 4:0"
      },
      "operands": [
        {
          "name": "prfop",
          "desc": "Type"
        },
        {
          "name": "label",
          "desc": "Label"
        }
      ],
      "extension": "Base",
      "description": "Prefetch Memory (Literal) signals the memory system to prefetch data from a PC-relative address. The address is calculated by adding a signed 19-bit offset (scaled by 4) to the PC. This is a hint instruction that does not architecturally affect register state or condition flags. Execution is AArch64-only.",
      "example": "PRFM prfop, label",
      "pseudocode": "address ← PC + (imm19 << 2); Prefetch(address, prfop);"
    },
    {
      "mnemonic": "prfm",
      "architecture": "ARMv8-A",
      "full_name": "Prefetch Memory (Register)",
      "summary": "Prefetches data using a register offset.",
      "syntax": "PRFM <prfop>, [<Xn|SP>, <R><m> {, <extend> <amount>}]",
      "encoding": {
        "format": "Load/Store Reg",
        "binary_pattern": "11 | 111 | 0 | 00 | 10 | 1 | Rm | option | S | 10 | Rn | Rt",
        "hex_opcode": "0xF8A04800",
        "visual_parts": [
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "option",
            "clean": "option"
          },
          {
            "raw": "S",
            "clean": "S"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "prfop",
          "desc": "Type"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        },
        {
          "name": "Rm",
          "desc": "Second source / offset general-purpose register"
        }
      ],
      "extension": "Base",
      "description": "Prefetch Memory (Register) signals the memory system to prefetch data from an address calculated by adding an optionally shifted register offset to a base register. The shift amount and extension type are encoded in the option and S bits. This is a hint instruction that does not affect register state or condition flags. Execution is AArch64-only.",
      "example": "PRFM prfop, [x1, Rm ]",
      "pseudocode": "offset ← ExtendValue(Rm, option, S); address ← Xn|SP + offset; Prefetch(address, prfop);"
    },
    {
      "mnemonic": "ld64b",
      "architecture": "ARMv8-A",
      "full_name": "Single-copy Atomic 64-byte Load",
      "summary": "Loads a 64-byte block of data atomically (Accelerator support).",
      "syntax": "LD64B <Xt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "11 | 111 | 0 | 00 | 0 | 0 | 1 | 11111 | 1 | 101 | 00 | Rn | Rt",
        "hex_opcode": "0xF83FD000",
        "visual_parts": [
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "101",
            "clean": "101"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Dest (First of 8 regs)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Single-copy Atomic 64-byte Load reads a 64-byte block of memory into 8 consecutive X-registers starting at Xt, with all 64 bytes loaded as a single atomic operation. The address must be 64-byte aligned; misalignment raises an Alignment Fault. Condition flags are not affected. Execution is AArch64-only and requires Accelerator support (FEAT_LS64).",
      "example": "LD64B x3, [x1]",
      "pseudocode": "address ← Xn|SP; if address<5:0> != 0 then Fault(Alignment); [Xt, Xt+1, ..., Xt+7] ← [address]; // 64 bytes loaded atomically"
    },
    {
      "mnemonic": "st64b",
      "architecture": "ARMv8-A",
      "full_name": "Single-copy Atomic 64-byte Store",
      "summary": "Stores a 64-byte block of data atomically.",
      "syntax": "ST64B <Xt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "11 | 111 | 0 | 00 | 0 | 0 | 1 | 11111 | 1 | 001 | 00 | Rn | Rt",
        "hex_opcode": "0xF83F9000",
        "visual_parts": [
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Src (First of 8 regs)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Single-copy Atomic 64-byte Store writes a 64-byte block from 8 consecutive X-registers starting at Xt to memory as a single atomic operation. The address must be 64-byte aligned; misalignment raises an Alignment Fault. Condition flags are not affected. Execution is AArch64-only and requires Accelerator support (FEAT_LS64).",
      "example": "ST64B x3, [x1]",
      "pseudocode": "address ← Xn|SP; if address<5:0> != 0 then Fault(Alignment); [address] ← [Xt, Xt+1, ..., Xt+7]; // 64 bytes stored atomically"
    },
    {
      "mnemonic": "st64bv",
      "architecture": "ARMv8-A",
      "full_name": "Single-copy Atomic 64-byte Store with Return",
      "summary": "Stores 64 bytes atomically and returns status (Success/Fail).",
      "syntax": "ST64BV <Ws>, <Xt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "11 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 1 | 011 | 00 | Rn | Rt",
        "hex_opcode": "0xF820B000",
        "visual_parts": [
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Status Dest"
        },
        {
          "name": "Xt",
          "desc": "Data Src"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Single-copy Atomic 64-byte Store with Return writes a 64-byte block from 8 consecutive X-registers starting at Xt to memory and returns a status value in Ws indicating success (0) or failure (non-zero). The store is atomic; on failure, memory is not modified and Ws is written with a non-zero value. Address must be 64-byte aligned. Condition flags are not affected. Execution is AArch64-only (FEAT_LS64).",
      "example": "ST64BV w6, x3, [x1]",
      "pseudocode": "address ← Xn|SP; if address<5:0> != 0 then Fault(Alignment); success ← AtomicStore64B(address, [Xt, Xt+1, ..., Xt+7]); Ws ← if success then 0 else implementation_defined_nonzero;"
    },
    {
      "mnemonic": "st64bv0",
      "architecture": "ARMv8-A",
      "full_name": "Single-copy Atomic 64-byte Store with Return (Zero)",
      "summary": "Stores 64 bytes (eliding the first 8 bytes as zero) and returns status.",
      "syntax": "ST64BV0 <Ws>, <Xt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "11 | 111 | 0 | 00 | 0 | 0 | 1 | Rs | 1 | 010 | 00 | Rn | Rt",
        "hex_opcode": "0xF820A000",
        "visual_parts": [
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rs",
            "clean": "Rs"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Ws",
          "desc": "Status"
        },
        {
          "name": "Xt",
          "desc": "Data"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "LSE (Atomics)",
      "description": "Single-copy Atomic 64-byte Store with Return (Zero) writes a 64-byte block to memory, treating the first 8 bytes as zero, and returns status in Ws. Xt, Xt+2, …, Xt+7 provide bytes 8-63; bytes 0-7 are zeroed. The store is atomic; on failure, Ws is non-zero and memory is unchanged. Address must be 64-byte aligned. Condition flags are not affected. Execution is AArch64-only (FEAT_LS64).",
      "example": "ST64BV0 w6, x3, [x1]",
      "pseudocode": "address ← Xn|SP; if address<5:0> != 0 then Fault(Alignment); data<63:0> ← 0; data<511:64> ← [Xt+1, Xt+2, ..., Xt+7]<447:0>; success ← AtomicStore64B(address, data); Ws ← if success then 0 else implementation_defined_nonzero;"
    },
    {
      "mnemonic": "dgh",
      "architecture": "ARMv8-A",
      "full_name": "Data Gathering Hint",
      "summary": "Hints that multiple memory accesses should be merged.",
      "syntax": "DGH",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "11010101000000110010 | 0000 | 110 | 11111",
        "hex_opcode": "0xD50320DF",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "Base",
      "description": "Data Gathering Hint is a system hint instruction that suggests to the processor that multiple small memory accesses should be merged or optimized. It provides a hint to the memory system and does not cause side effects visible to software. This is an AArch64-only instruction; it is NOP-like and has no effect on condition flags or general registers.",
      "example": "DGH",
      "pseudocode": "// Hints that multiple memory accesses should be merged"
    },
    {
      "mnemonic": "sb",
      "architecture": "ARMv8-A",
      "full_name": "Speculation Barrier",
      "summary": "Prevents speculative execution across the barrier.",
      "syntax": "SB",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "11010101000000110011 | 0000 | 1 | 11 | 11111",
        "hex_opcode": "0xD50330FF",
        "visual_parts": [
          {
            "raw": "11010101000000110011",
            "clean": "11010101000000110011"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7 | 6:5 | 4:0"
      },
      "operands": [],
      "extension": "Base (v8.0+)",
      "description": "Speculation Barrier. Prevents speculative execution from proceeding past this instruction. Acts as a full serializing barrier for speculative load operations; no younger instruction can execute until all older instructions have completed. Does not affect condition flags. AArch64-only; no privilege requirement.",
      "example": "SB",
      "pseudocode": "SpeculationBarrier()"
    },
    {
      "mnemonic": "tsb",
      "architecture": "ARMv8-A",
      "full_name": "Trace Synchronization Barrier",
      "summary": "Ensures trace generation is complete.",
      "syntax": "TSB CSYNC",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "11010101000000110010 | 0010 | 010 | 11111",
        "hex_opcode": "0xD503225F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "Trace",
      "description": "Trace Synchronization Barrier with CSYNC variant. Ensures that all trace generation for instructions prior to this barrier is complete before resuming. Provides a synchronization point for trace capture mechanisms. Does not affect condition flags. AArch64-only; requires trace generation support.",
      "example": "TSB CSYNC",
      "pseudocode": "TraceSynchronizationBarrier()"
    },
    {
      "mnemonic": "csdb",
      "architecture": "ARMv8-A",
      "full_name": "Consumption of Speculative Data Barrier",
      "summary": "Prevents speculative data consumption.",
      "syntax": "CSDB",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "11010101000000110010 | 0010 | 100 | 11111",
        "hex_opcode": "0xD503229F",
        "visual_parts": [
          {
            "raw": "11010101000000110010",
            "clean": "11010101000000110010"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [],
      "extension": "Base",
      "description": "Consumption of Speculative Data Barrier. Prevents speculative consumption of data values (e.g., use of speculatively loaded values in address calculations or control flow). Acts as a lighter-weight barrier than SB, constraining only data-dependent speculation. Does not affect condition flags. AArch64-only.",
      "example": "CSDB",
      "pseudocode": "SpeculativeDataBarrier()"
    },
    {
      "mnemonic": "wfet",
      "architecture": "ARMv8-A",
      "full_name": "Wait For Event with Timeout",
      "summary": "Waits for an event or a timeout (using a counter).",
      "syntax": "WFET <Wn>",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101000000110001 | 0000 | 000 | Rd",
        "hex_opcode": "0xD5031000",
        "visual_parts": [
          {
            "raw": "11010101000000110001",
            "clean": "11010101000000110001"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wn",
          "desc": "Timeout"
        }
      ],
      "extension": "Base (v8.7)",
      "description": "Wait For Event with Timeout. Suspends execution until an event is signaled or the timeout counter expires. The timeout value is provided in Wn as a 32-bit count value. Condition flags are not affected. AArch64-only; available from v8.7 onwards.",
      "example": "WFET w1",
      "pseudocode": "timeout ← Wn\nwhile (timeout > 0 AND event_not_signaled()) {\n  timeout ← timeout - 1\n  enter_low_power_state()\n}\nWn ← timeout"
    },
    {
      "mnemonic": "wfit",
      "architecture": "ARMv8-A",
      "full_name": "Wait For Interrupt with Timeout",
      "summary": "Waits for an interrupt or a timeout.",
      "syntax": "WFIT <Wn>",
      "encoding": {
        "format": "System",
        "binary_pattern": "11010101000000110001 | 0000 | 001 | Rd",
        "hex_opcode": "0xD5031020",
        "visual_parts": [
          {
            "raw": "11010101000000110001",
            "clean": "11010101000000110001"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wn",
          "desc": "Timeout"
        }
      ],
      "extension": "Base (v8.7)",
      "description": "Wait For Interrupt with Timeout. Suspends execution until an interrupt is pending or the timeout counter expires. The timeout value is provided in Wn as a 32-bit count. Condition flags are not affected. AArch64-only; available from v8.7 onwards.",
      "example": "WFIT w1",
      "pseudocode": "timeout ← Wn\nwhile (timeout > 0 AND interrupt_not_pending()) {\n  timeout ← timeout - 1\n  enter_low_power_state()\n}\nWn ← timeout"
    },
    {
      "mnemonic": "bc.cond",
      "architecture": "ARMv8-A",
      "full_name": "Branch Consistent Conditional",
      "summary": "Branch if condition is met, with stronger ordering guarantees.",
      "syntax": "BC.cond <label>",
      "encoding": {
        "format": "Branch",
        "binary_pattern": "01010100 | imm19 | 1 | cond",
        "hex_opcode": "0x54000010",
        "visual_parts": [
          {
            "raw": "01010100",
            "clean": "01010100"
          },
          {
            "raw": "imm19",
            "clean": "imm19"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "cond",
            "clean": "cond"
          }
        ],
        "bit_positions": "31:24 | 23:5 | 4 | 3:0"
      },
      "operands": [
        {
          "name": "label",
          "desc": "Label"
        },
        {
          "name": "cond",
          "desc": "Cond"
        }
      ],
      "extension": "Base (v8.8)",
      "description": "Branch Consistent Conditional. Performs a PC-relative conditional branch with stronger ordering guarantees (Branch Consistent semantics). If the condition is true, branches to the target label with full consistency; branch prediction is constrained to prevent speculation-based reordering. Condition flags are not modified by the branch itself. AArch64-only; available from v8.8 onwards.",
      "example": "BC.cond label",
      "pseudocode": "if (ConditionHolds(cond)) {\n  PC ← PC + SignExtend(imm19 << 2)\n  ConsistencyBarrier()\n}"
    },
    {
      "mnemonic": "ldaprb",
      "architecture": "ARMv8-A",
      "full_name": "Load-Acquire RCpc Register Byte",
      "summary": "Loads a byte with Release Consistency (process consistent) Acquire semantics.",
      "syntax": "LDAPRB <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "00 | 111 | 0 | 00 | 1 | 0 | 1 | 11111 | 1 | 100 | 00 | Rn | Rt",
        "hex_opcode": "0x38BFC000",
        "visual_parts": [
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (RCpc)",
      "description": "Load-Acquire RCpc Register Byte. Loads an unsigned byte from memory with RCpc (Release Consistent process-consistent) Acquire semantics. Provides a one-way barrier: subsequent memory operations cannot be reordered before this load, but prior stores may be reordered after. The zero-extended byte is written to Wt. Condition flags are not affected. AArch64-only.",
      "example": "LDAPRB w3, [x1]",
      "pseudocode": "address ← Xn\ndata ← ZeroExtend([address], 8)\nWt ← data\nAcquireBarrier(RCpc)"
    },
    {
      "mnemonic": "ldaprh",
      "architecture": "ARMv8-A",
      "full_name": "Load-Acquire RCpc Register Halfword",
      "summary": "Loads a halfword with RCpc Acquire semantics.",
      "syntax": "LDAPRH <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "01 | 111 | 0 | 00 | 1 | 0 | 1 | 11111 | 1 | 100 | 00 | Rn | Rt",
        "hex_opcode": "0x78BFC000",
        "visual_parts": [
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (RCpc)",
      "description": "Load-Acquire RCpc Register Halfword. Loads an unsigned halfword from memory with RCpc (Release Consistent process-consistent) Acquire semantics. Provides a one-way barrier: subsequent memory operations cannot be reordered before this load. The zero-extended halfword is written to Wt. Condition flags are not affected. AArch64-only.",
      "example": "LDAPRH w3, [x1]",
      "pseudocode": "address ← Xn\ndata ← ZeroExtend([address], 16)\nWt ← data\nAcquireBarrier(RCpc)"
    },
    {
      "mnemonic": "ldapr",
      "architecture": "ARMv8-A",
      "full_name": "Load-Acquire RCpc Register",
      "summary": "Loads a word with RCpc Acquire semantics.",
      "syntax": "LDAPR <Wt>, [<Xn|SP>]",
      "encoding": {
        "format": "Load/Store",
        "binary_pattern": "10 | 111 | 0 | 00 | 1 | 0 | 1 | 11111 | 1 | 100 | 00 | Rn | Rt",
        "hex_opcode": "0xB8BFC000",
        "visual_parts": [
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:30 | 29:27 | 26 | 25:24 | 23 | 22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wt",
          "desc": "Transfer 32-bit integer register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "Base (RCpc)",
      "description": "Loads a 32-bit word from memory into Wt with RCpc (Acquire) semantics, providing a weaker form of acquire synchronization that does not order prior memory operations against this load. The instruction does not modify the condition flags (N, Z, C, V remain unchanged). This AArch64-only instruction is available in the RCpc extension and requires natural 4-byte alignment of the memory address.",
      "example": "LDAPR w3, [x1]",
      "pseudocode": "Wt ← [Xn]; // Load with RCpc acquire semantics; address alignment: 4 bytes"
    },
    {
      "mnemonic": "pssbb",
      "architecture": "ARMv8-A",
      "full_name": "Physical Speculation Barrier",
      "summary": "Prevents speculation on physical resources.",
      "syntax": "PSSBB",
      "encoding": {
        "format": "System Hint",
        "binary_pattern": "11010101000000110011 | 0100 | 1 | 00 | 11111",
        "hex_opcode": "0xD503349F",
        "visual_parts": [
          {
            "raw": "11010101000000110011",
            "clean": "11010101000000110011"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "11111",
            "clean": "11111"
          }
        ],
        "bit_positions": "31:12 | 11:8 | 7 | 6:5 | 4:0"
      },
      "operands": [],
      "extension": "Base (v8.5)",
      "description": "Issues a Physical Speculation Barrier to prevent speculation through the barrier on physical resources, typically used to mitigate certain transient execution side-channel attacks. This AArch64-only hint instruction does not modify any condition flags and has no visible register side effects; it may be a no-op on some implementations but carries architectural implications for speculation control. Introduced in ARMv8.5-A.",
      "example": "PSSBB",
      "pseudocode": "SpeculationBarrier(); // Physical speculation barrier; execution continues normally"
    },
    {
      "mnemonic": "trcit",
      "architecture": "ARMv8-A",
      "full_name": "Trace Instrumentation",
      "summary": "Generates a trace packet.",
      "syntax": "TRCIT <Xt>",
      "encoding": {
        "format": "System",
        "binary_pattern": "1101010100 | 0 | 01 | 011 | 0111 | 0010 | 111 | Rt",
        "hex_opcode": "0xD50B72E0",
        "visual_parts": [
          {
            "raw": "1101010100",
            "clean": "1101010100"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "011",
            "clean": "011"
          },
          {
            "raw": "0111",
            "clean": "0111"
          },
          {
            "raw": "0010",
            "clean": "0010"
          },
          {
            "raw": "111",
            "clean": "111"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31:22 | 21 | 20:19 | 18:16 | 15:12 | 11:8 | 7:5 | 4:0"
      },
      "operands": [
        {
          "name": "Xt",
          "desc": "Data"
        }
      ],
      "extension": "Trace",
      "description": "Generates a trace instrumentation packet containing the value from Xt, allowing software to inject trace data into the trace stream for debugging and profiling. This AArch64-only instruction is part of the Trace extension and does not modify condition flags; the actual trace output is system-dependent and not architecturally specified. Requires appropriate trace system configuration and permissions.",
      "example": "TRCIT x3",
      "pseudocode": "TracedData ← Xt; // Inject Xt value into trace instrumentation stream"
    },
    {
      "mnemonic": "ld2",
      "architecture": "ARMv8-A",
      "full_name": "Load Multiple 2-Element Structures",
      "summary": "Loads two-element structures from memory into two registers (De-interleave).",
      "syntax": "LD2 { <Vt1>.<T>, <Vt2>.<T> }, [<Xn|SP>]",
      "encoding": {
        "format": "SIMD Load/Store",
        "binary_pattern": "0 | Q | 0011000 | 1 | 000000 | 1000 | size | Rn | Rt",
        "hex_opcode": "0x0C408000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0011000",
            "clean": "0011000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vt1",
          "desc": "Dest 1"
        },
        {
          "name": "Vt2",
          "desc": "Dest 2"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Loads two consecutive 2-element SIMD structures from memory, de-interleaving them into two registers (Vt1 and Vt2). The element type T and Q field determine whether 64-bit (Q=0, per-register) or 128-bit (Q=1) structures are loaded; the base address in Xn is post-incremented by the number of bytes loaded. This AArch64 NEON instruction does not modify condition flags.",
      "example": "LD2 [x1]",
      "pseudocode": "elements_per_struct ← 2; element_size ← GetElementSize(T); struct_bytes ← 2 * elements_per_struct * element_size; mem_addr ← Xn; (Vt1, Vt2) ← DeinterleaveLoad(mem_addr, struct_bytes, Q); Xn ← Xn + struct_bytes;"
    },
    {
      "mnemonic": "st2",
      "architecture": "ARMv8-A",
      "full_name": "Store Multiple 2-Element Structures",
      "summary": "Stores two-element structures from two registers to memory (Interleave).",
      "syntax": "ST2 { <Vt1>.<T>, <Vt2>.<T> }, [<Xn|SP>]",
      "encoding": {
        "format": "SIMD Load/Store",
        "binary_pattern": "0 | Q | 0011000 | 0 | 000000 | 1000 | size | Rn | Rt",
        "hex_opcode": "0x0C008000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0011000",
            "clean": "0011000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vt1",
          "desc": "First transfer SIMD/FP register (load/store)"
        },
        {
          "name": "Vt2",
          "desc": "Second transfer SIMD/FP register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Stores two SIMD registers to memory, interleaving their elements into two consecutive 2-element structures. The element type T and Q field determine the 64-bit (Q=0) or 128-bit (Q=1) store size per register; the base address in Xn is post-incremented by the total bytes stored. This AArch64 NEON instruction does not modify condition flags.",
      "example": "ST2 [x1]",
      "pseudocode": "elements_per_struct ← 2; element_size ← GetElementSize(T); struct_bytes ← 2 * elements_per_struct * element_size; mem_addr ← Xn; InterleavedData ← InterleaveStore(Vt1, Vt2, Q); [mem_addr] ← InterleavedData; Xn ← Xn + struct_bytes;"
    },
    {
      "mnemonic": "ld3",
      "architecture": "ARMv8-A",
      "full_name": "Load Multiple 3-Element Structures",
      "summary": "Loads three-element structures (e.g., RGB) into three registers.",
      "syntax": "LD3 { <Vt1>.<T>, <Vt2>.<T>, <Vt3>.<T> }, [<Xn|SP>]",
      "encoding": {
        "format": "SIMD Load/Store",
        "binary_pattern": "0 | Q | 0011000 | 1 | 000000 | 0100 | size | Rn | Rt",
        "hex_opcode": "0x0C404000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0011000",
            "clean": "0011000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vt1",
          "desc": "R"
        },
        {
          "name": "Vt2",
          "desc": "G"
        },
        {
          "name": "Vt3",
          "desc": "B"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Loads three consecutive 3-element SIMD structures from memory, de-interleaving them into three registers (Vt1, Vt2, Vt3). The element type T and Q field control the 64-bit (Q=0) or 128-bit (Q=1) load size per register; the base address in Xn is post-incremented by the total bytes loaded. This AArch64 NEON instruction does not modify condition flags.",
      "example": "LD3 [x1]",
      "pseudocode": "elements_per_struct ← 3; element_size ← GetElementSize(T); struct_bytes ← 3 * elements_per_struct * element_size; mem_addr ← Xn; (Vt1, Vt2, Vt3) ← DeinterleaveLoad(mem_addr, struct_bytes, Q); Xn ← Xn + struct_bytes;"
    },
    {
      "mnemonic": "st3",
      "architecture": "ARMv8-A",
      "full_name": "Store Multiple 3-Element Structures",
      "summary": "Stores three-element structures from three registers (Interleave RGB).",
      "syntax": "ST3 { <Vt1>.<T>, <Vt2>.<T>, <Vt3>.<T> }, [<Xn|SP>]",
      "encoding": {
        "format": "SIMD Load/Store",
        "binary_pattern": "0 | Q | 0011000 | 0 | 000000 | 0100 | size | Rn | Rt",
        "hex_opcode": "0x0C004000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0011000",
            "clean": "0011000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "0100",
            "clean": "0100"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vt1",
          "desc": "R"
        },
        {
          "name": "Vt2",
          "desc": "G"
        },
        {
          "name": "Vt3",
          "desc": "B"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Stores three SIMD registers to memory, interleaving their elements into three consecutive 3-element structures. The element type T and Q field control the 64-bit (Q=0) or 128-bit (Q=1) store size per register; the base address in Xn is post-incremented by the total bytes stored. This AArch64 NEON instruction does not modify condition flags.",
      "example": "ST3 [x1]",
      "pseudocode": "elements_per_struct ← 3; element_size ← GetElementSize(T); struct_bytes ← 3 * elements_per_struct * element_size; mem_addr ← Xn; InterleavedData ← InterleaveStore(Vt1, Vt2, Vt3, Q); [mem_addr] ← InterleavedData; Xn ← Xn + struct_bytes;"
    },
    {
      "mnemonic": "ld4",
      "architecture": "ARMv8-A",
      "full_name": "Load Multiple 4-Element Structures",
      "summary": "Loads four-element structures (e.g., RGBA) into four registers.",
      "syntax": "LD4 { <Vt1>.<T>, <Vt2>.<T>, <Vt3>.<T>, <Vt4>.<T> }, [<Xn|SP>]",
      "encoding": {
        "format": "SIMD Load/Store",
        "binary_pattern": "0 | Q | 0011000 | 1 | 000000 | 0000 | size | Rn | Rt",
        "hex_opcode": "0x0C400000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0011000",
            "clean": "0011000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vt1",
          "desc": "R"
        },
        {
          "name": "Vt2",
          "desc": "G"
        },
        {
          "name": "Vt3",
          "desc": "B"
        },
        {
          "name": "Vt4",
          "desc": "A"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Loads four consecutive 4-element SIMD structures from memory, de-interleaving them into four registers (Vt1, Vt2, Vt3, Vt4). The element type T and Q field determine the 64-bit (Q=0) or 128-bit (Q=1) load size per register; the base address in Xn is post-incremented by the total bytes loaded. This AArch64 NEON instruction does not modify condition flags.",
      "example": "LD4 [x1]",
      "pseudocode": "elements_per_struct ← 4; element_size ← GetElementSize(T); struct_bytes ← 4 * elements_per_struct * element_size; mem_addr ← Xn; (Vt1, Vt2, Vt3, Vt4) ← DeinterleaveLoad(mem_addr, struct_bytes, Q); Xn ← Xn + struct_bytes;"
    },
    {
      "mnemonic": "st4",
      "architecture": "ARMv8-A",
      "full_name": "Store Multiple 4-Element Structures",
      "summary": "Stores four-element structures from four registers (Interleave RGBA).",
      "syntax": "ST4 { <Vt1>.<T>, <Vt2>.<T>, <Vt3>.<T>, <Vt4>.<T> }, [<Xn|SP>]",
      "encoding": {
        "format": "SIMD Load/Store",
        "binary_pattern": "0 | Q | 0011000 | 0 | 000000 | 0000 | size | Rn | Rt",
        "hex_opcode": "0x0C000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0011000",
            "clean": "0011000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000000",
            "clean": "000000"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vt1",
          "desc": "R"
        },
        {
          "name": "Vt2",
          "desc": "G"
        },
        {
          "name": "Vt3",
          "desc": "B"
        },
        {
          "name": "Vt4",
          "desc": "A"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Stores four consecutive 4-element structures (e.g., RGBA pixels) from four NEON registers to memory with interleaved layout. The four registers (Vt1, Vt2, Vt3, Vt4) contain the elements to store; they are written as a block to the memory address in Xn|SP. The Q bit determines whether 64-bit (Q=0, 2 structures) or 128-bit (Q=1, 4 structures) operations are performed. No condition flags are affected; the instruction is AArch64 NEON-only.",
      "example": "ST4 [x1]",
      "pseudocode": "address ← Xn|SP\nelement_size ← size_from_T\nif Q == 1 then\n  structures ← 4\nelse\n  structures ← 2\nfor i = 0 to structures - 1 do\n  mem[address + (i * element_size * 0)] ← Vt1[i]\n  mem[address + (i * element_size * 1)] ← Vt2[i]\n  mem[address + (i * element_size * 2)] ← Vt3[i]\n  mem[address + (i * element_size * 3)] ← Vt4[i]\nXn|SP ← (post-index mode) ? Xn|SP + (4 * element_size * structures) : Xn|SP"
    },
    {
      "mnemonic": "ld1r",
      "architecture": "ARMv8-A",
      "full_name": "Load Single Element Replicate",
      "summary": "Loads one element and replicates it to all lanes of the vector.",
      "syntax": "LD1R { <Vt>.<T> }, [<Xn|SP>]",
      "encoding": {
        "format": "SIMD Load/Store",
        "binary_pattern": "0 | Q | 0011010 | 1 | 0 | 0000 | 0 | 110 | 0 | size | Rn | Rt",
        "hex_opcode": "0x0D40C000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0011010",
            "clean": "0011010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21 | 20:17 | 16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vt",
          "desc": "Transfer SIMD/FP vector register (load/store)"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Loads a single element from memory and replicates it to all lanes of the destination NEON vector register. The element size is determined by the vector element type <T>. Q bit selects 64-bit (Q=0) or 128-bit (Q=1) vector. No condition flags are affected; the instruction is AArch64 NEON-only with no exception generation.",
      "example": "LD1R [x1]",
      "pseudocode": "address ← Xn|SP\nelement_size ← size_from_T\nelement ← mem[address]\nif Q == 1 then\n  lanes ← 16 / element_size\nelse\n  lanes ← 8 / element_size\nfor i = 0 to lanes - 1 do\n  Vt[i] ← element\nXn|SP ← (post-index mode) ? Xn|SP + element_size : Xn|SP"
    },
    {
      "mnemonic": "ld2r",
      "architecture": "ARMv8-A",
      "full_name": "Load 2-Element Structure Replicate",
      "summary": "Loads 2 elements and replicates them to all lanes.",
      "syntax": "LD2R { <Vt1>.<T>, <Vt2>.<T> }, [<Xn|SP>]",
      "encoding": {
        "format": "SIMD Load/Store",
        "binary_pattern": "0 | Q | 0011010 | 1 | 1 | 0000 | 0 | 110 | 0 | size | Rn | Rt",
        "hex_opcode": "0x0D60C000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0011010",
            "clean": "0011010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0000",
            "clean": "0000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "110",
            "clean": "110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rt",
            "clean": "Rt"
          }
        ],
        "bit_positions": "31 | 30 | 29:23 | 22 | 21 | 20:17 | 16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vt1",
          "desc": "Dest 1"
        },
        {
          "name": "Vt2",
          "desc": "Dest 2"
        },
        {
          "name": "Xn",
          "desc": "First source / base 64-bit integer register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Loads two consecutive elements from memory and replicates each to all corresponding lanes of two destination NEON vector registers. The two elements are interleaved in memory; Q bit selects 64-bit (Q=0, 1 pair) or 128-bit (Q=1, 2 pairs) operation. No condition flags are affected; the instruction is AArch64 NEON-only.",
      "example": "LD2R [x1]",
      "pseudocode": "address ← Xn|SP\nelement_size ← size_from_T\nelement1 ← mem[address + 0 * element_size]\nelement2 ← mem[address + 1 * element_size]\nif Q == 1 then\n  lanes ← 16 / element_size\nelse\n  lanes ← 8 / element_size\nfor i = 0 to lanes - 1 do\n  Vt1[i] ← element1\n  Vt2[i] ← element2\nXn|SP ← (post-index mode) ? Xn|SP + (2 * element_size) : Xn|SP"
    },
    {
      "mnemonic": "movi",
      "architecture": "ARMv8-A",
      "full_name": "Move Immediate (Vector)",
      "summary": "Moves an immediate value into every element of a vector.",
      "syntax": "MOVI <Vd>.<T>, #<imm8> {, lsl #<shift>}",
      "encoding": {
        "format": "SIMD Modified Imm",
        "binary_pattern": "0 | Q | 0 | 0111100000 | a | b | c | cmode | 0 | 1 | d | e | f | g | h | Rd",
        "hex_opcode": "0x0F000400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0111100000",
            "clean": "0111100000"
          },
          {
            "raw": "a",
            "clean": "a"
          },
          {
            "raw": "b",
            "clean": "b"
          },
          {
            "raw": "c",
            "clean": "c"
          },
          {
            "raw": "cmode",
            "clean": "cmode"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "d",
            "clean": "d"
          },
          {
            "raw": "e",
            "clean": "e"
          },
          {
            "raw": "f",
            "clean": "f"
          },
          {
            "raw": "g",
            "clean": "g"
          },
          {
            "raw": "h",
            "clean": "h"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:19 | 18 | 17 | 16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "imm8",
          "desc": "Value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Moves an 8-bit immediate value into every element of a NEON vector, with optional left shift by 0, 8, 16, or 24 bits. The immediate is replicated across all elements of the destination vector (64-bit or 128-bit depending on Q field). No condition flags are affected. This is an AArch64-only NEON instruction requiring SIMD support.",
      "example": "MOVI v0.4s.T, #16",
      "pseudocode": "shift_amount ← cmode<1:0> * 8\nif Q == 0 then\n  Vd[63:0] ← replicate(imm8 << shift_amount, element_size)\nelse\n  Vd[127:0] ← replicate(imm8 << shift_amount, element_size)\nN ← unaffected; Z ← unaffected; C ← unaffected; V ← unaffected"
    },
    {
      "mnemonic": "mvni",
      "architecture": "ARMv8-A",
      "full_name": "Move NOT Immediate (Vector)",
      "summary": "Moves the inverse of an immediate value into every element.",
      "syntax": "MVNI <Vd>.<T>, #<imm8> {, lsl #<shift>}",
      "encoding": {
        "format": "SIMD Modified Imm",
        "binary_pattern": "0 | Q | 1 | 0111100000 | a | b | c | cmode | 0 | 1 | d | e | f | g | h | Rd",
        "hex_opcode": "0x2F000400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0111100000",
            "clean": "0111100000"
          },
          {
            "raw": "a",
            "clean": "a"
          },
          {
            "raw": "b",
            "clean": "b"
          },
          {
            "raw": "c",
            "clean": "c"
          },
          {
            "raw": "cmode",
            "clean": "cmode"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "d",
            "clean": "d"
          },
          {
            "raw": "e",
            "clean": "e"
          },
          {
            "raw": "f",
            "clean": "f"
          },
          {
            "raw": "g",
            "clean": "g"
          },
          {
            "raw": "h",
            "clean": "h"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:19 | 18 | 17 | 16 | 15:12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "imm8",
          "desc": "Value"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Moves the bitwise NOT of an 8-bit immediate value into every element of a NEON vector, with optional left shift by 0, 8, 16, or 24 bits. The inverted immediate is replicated across all elements of the destination vector (64-bit or 128-bit depending on Q field). No condition flags are affected. This is an AArch64-only NEON instruction requiring SIMD support.",
      "example": "MVNI v0.4s.T, #16",
      "pseudocode": "shift_amount ← cmode<1:0> * 8\ninverted_imm ← ~(imm8 << shift_amount)\nif Q == 0 then\n  Vd[63:0] ← replicate(inverted_imm, element_size)\nelse\n  Vd[127:0] ← replicate(inverted_imm, element_size)\nN ← unaffected; Z ← unaffected; C ← unaffected; V ← unaffected"
    },
    {
      "mnemonic": "ext",
      "architecture": "ARMv8-A",
      "full_name": "Extract Vector",
      "summary": "Extracts a vector from a pair of vectors (Sliding window).",
      "syntax": "EXT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>, #<index>",
      "encoding": {
        "format": "SIMD Extract",
        "binary_pattern": "0 | Q | 101110 | 00 | 0 | Rm | 0 | imm4 | 0 | Rn | Rd",
        "hex_opcode": "0x2E000000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "101110",
            "clean": "101110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "imm4",
            "clean": "imm4"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29:24 | 23:22 | 21 | 20:16 | 15 | 14:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "Low Src"
        },
        {
          "name": "Vm",
          "desc": "High Src"
        },
        {
          "name": "index",
          "desc": "Byte Offset"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Extracts a contiguous sequence of bytes from the concatenation of two NEON vectors (treated as a sliding window), producing a result vector. The extraction point is specified by the byte index operand. Q bit determines whether operation is on 64-bit (Q=0) or 128-bit (Q=1) vectors. No condition flags are affected; the instruction is AArch64 NEON-only.",
      "example": "EXT v0.4s.T, v1.4s.T, v2.4s.T, #index",
      "pseudocode": "concatenated ← (Vn || Vm)\nbyte_index ← index\nif Q == 1 then\n  result_bytes ← 16\nelse\n  result_bytes ← 8\nfor i = 0 to result_bytes - 1 do\n  Vd[i] ← concatenated[byte_index + i]\nN ← unaffected; Z ← unaffected; C ← unaffected; V ← unaffected"
    },
    {
      "mnemonic": "saddl",
      "architecture": "ARMv8-A",
      "full_name": "Signed Add Long",
      "summary": "Adds lower/upper halves of signed vectors, producing wider result (Widening).",
      "syntax": "SADDL <Vd>.<Td>, <Vn>.<Ts>, <Vm>.<Ts>",
      "encoding": {
        "format": "SIMD Three Register Diff",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 00 | 0 | 000 | Rn | Rd",
        "hex_opcode": "0x0E200000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest (Wide)"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds corresponding signed integer elements from the lower (or upper, depending on Q) halves of two narrow NEON vectors, producing a vector of wider elements. Q=0 operates on lower halves; Q=1 operates on upper halves. The result is placed in the wider destination vector. No condition flags are affected; the instruction is AArch64 NEON-only with signed saturation not applied (wrapping on overflow).",
      "example": "SADDL v0.4s.Td, v1.4s.Ts, v2.4s.Ts",
      "pseudocode": "if Q == 0 then\n  half ← \"lower\"\nelse\n  half ← \"upper\"\nfor i = 0 to (length(Vd) / element_width(Td)) - 1 do\n  Vn_element ← extract_half(Vn[i], half)\n  Vm_element ← extract_half(Vm[i], half)\n  Vd[i] ← signed_add(Vn_element, Vm_element)\nN ← unaffected; Z ← unaffected; C ← unaffected; V ← unaffected"
    },
    {
      "mnemonic": "uaddl",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Add Long",
      "summary": "Adds lower/upper halves of unsigned vectors, producing wider result.",
      "syntax": "UADDL <Vd>.<Td>, <Vn>.<Ts>, <Vm>.<Ts>",
      "encoding": {
        "format": "SIMD Three Register Diff",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 00 | 0 | 000 | Rn | Rd",
        "hex_opcode": "0x2E200000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest (Wide)"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds corresponding unsigned integer elements from the lower (or upper, depending on Q) halves of two narrow NEON vectors, producing a vector of wider elements. Q=0 operates on lower halves; Q=1 operates on upper halves. The result is placed in the wider destination vector. No condition flags are affected; the instruction is AArch64 NEON-only with no saturation.",
      "example": "UADDL v0.4s.Td, v1.4s.Ts, v2.4s.Ts",
      "pseudocode": "if Q == 0 then\n  half ← \"lower\"\nelse\n  half ← \"upper\"\nfor i = 0 to (length(Vd) / element_width(Td)) - 1 do\n  Vn_element ← extract_half(Vn[i], half)\n  Vm_element ← extract_half(Vm[i], half)\n  Vd[i] ← unsigned_add(Vn_element, Vm_element)\nN ← unaffected; Z ← unaffected; C ← unaffected; V ← unaffected"
    },
    {
      "mnemonic": "saddw",
      "architecture": "ARMv8-A",
      "full_name": "Signed Add Wide",
      "summary": "Adds a wide vector to the lower/upper half of a narrow vector.",
      "syntax": "SADDW <Vd>.<Td>, <Vn>.<Td>, <Vm>.<Ts>",
      "encoding": {
        "format": "SIMD Three Register Diff",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 00 | 0 | 100 | Rn | Rd",
        "hex_opcode": "0x0E201000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "Src Wide"
        },
        {
          "name": "Vm",
          "desc": "Src Narrow"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds each element of a narrow signed vector to the corresponding element of a wide signed vector (which is already the destination width), producing a result stored in the wide destination vector. Q=0 operates on lower half of Vm; Q=1 operates on upper half. No condition flags are affected; the instruction is AArch64 NEON-only with wrapping on overflow.",
      "example": "SADDW v0.4s.Td, v1.4s.Td, v2.4s.Ts",
      "pseudocode": "if Q == 0 then\n  half ← \"lower\"\nelse\n  half ← \"upper\"\nfor i = 0 to (length(Vd) / element_width(Td)) - 1 do\n  Vn_element ← Vn[i]\n  Vm_element ← extract_half(Vm[i], half)\n  Vd[i] ← signed_add(Vn_element, Vm_element)\nN ← unaffected; Z ← unaffected; C ← unaffected; V ← unaffected"
    },
    {
      "mnemonic": "uaddw",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Add Wide",
      "summary": "Adds a wide vector to the lower/upper half of a narrow vector (Unsigned).",
      "syntax": "UADDW <Vd>.<Td>, <Vn>.<Td>, <Vm>.<Ts>",
      "encoding": {
        "format": "SIMD Three Register Diff",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 00 | 0 | 100 | Rn | Rd",
        "hex_opcode": "0x2E201000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "100",
            "clean": "100"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "Src Wide"
        },
        {
          "name": "Vm",
          "desc": "Src Narrow"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds each element of a narrow unsigned vector to the corresponding element of a wide unsigned vector (already at destination width), producing a result stored in the wide destination vector. Q=0 operates on lower half of Vm; Q=1 operates on upper half. No condition flags are affected; the instruction is AArch64 NEON-only with wrapping on overflow.",
      "example": "UADDW v0.4s.Td, v1.4s.Td, v2.4s.Ts",
      "pseudocode": "if Q == 0 then\n  half ← \"lower\"\nelse\n  half ← \"upper\"\nfor i = 0 to (length(Vd) / element_width(Td)) - 1 do\n  Vn_element ← Vn[i]\n  Vm_element ← extract_half(Vm[i], half)\n  Vd[i] ← unsigned_add(Vn_element, Vm_element)\nN ← unaffected; Z ← unaffected; C ← unaffected; V ← unaffected"
    },
    {
      "mnemonic": "ssubl",
      "architecture": "ARMv8-A",
      "full_name": "Signed Subtract Long",
      "summary": "Subtracts signed narrow vectors, producing wider result.",
      "syntax": "SSUBL <Vd>.<Td>, <Vn>.<Ts>, <Vm>.<Ts>",
      "encoding": {
        "format": "SIMD Three Register Diff",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 00 | 1 | 000 | Rn | Rd",
        "hex_opcode": "0x0E202000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest (Wide)"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Subtracts corresponding signed elements of two narrow SIMD vectors and places the results in a wider vector, sign-extending intermediate products. This is an AArch64-only NEON instruction that operates on integer element types (8, 16, or 32 bits) and produces results twice the width. Condition flags are not affected.",
      "example": "SSUBL v0.4s.Td, v1.4s.Ts, v2.4s.Ts",
      "pseudocode": "for i = 0 to (128 >> (size+1)) - 1 do\n  op1 ← SignExtend(Vn[i], element_width)\n  op2 ← SignExtend(Vm[i], element_width)\n  Vd[i] ← op1 - op2\nend for"
    },
    {
      "mnemonic": "usubl",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Subtract Long",
      "summary": "Subtracts unsigned narrow vectors, producing wider result.",
      "syntax": "USUBL <Vd>.<Td>, <Vn>.<Ts>, <Vm>.<Ts>",
      "encoding": {
        "format": "SIMD Three Register Diff",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 00 | 1 | 000 | Rn | Rd",
        "hex_opcode": "0x2E202000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest (Wide)"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Subtracts corresponding unsigned elements of two narrow SIMD vectors and places the results in a wider vector, zero-extending intermediate products. This is an AArch64-only NEON instruction that operates on integer element types (8, 16, or 32 bits) and produces results twice the width. Condition flags are not affected.",
      "example": "USUBL v0.4s.Td, v1.4s.Ts, v2.4s.Ts",
      "pseudocode": "for i = 0 to (128 >> (size+1)) - 1 do\n  op1 ← ZeroExtend(Vn[i], element_width)\n  op2 ← ZeroExtend(Vm[i], element_width)\n  Vd[i] ← op1 - op2\nend for"
    },
    {
      "mnemonic": "pmull",
      "architecture": "ARMv8-A",
      "full_name": "Polynomial Multiply Long",
      "summary": "Performs polynomial multiplication over {0,1} producing wide result (Used for GCM).",
      "syntax": "PMULL <Vd>.<Td>, <Vn>.<Ts>, <Vm>.<Ts>",
      "encoding": {
        "format": "SIMD Three Register Diff",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 1110 | 00 | Rn | Rd",
        "hex_opcode": "0x0E20E000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1110",
            "clean": "1110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest (Wide)"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (Crypto/SIMD)",
      "description": "Performs polynomial multiplication over GF(2) on pairs of narrow SIMD elements, producing wider polynomial results. This AArch64-only NEON instruction is primarily used for AES-GCM cryptographic operations and operates on 64-bit or 128-bit input vectors producing 128-bit or 256-bit results. Condition flags are not affected.",
      "example": "PMULL v0.4s.Td, v1.4s.Ts, v2.4s.Ts",
      "pseudocode": "for i = 0 to (128 >> (size+1)) - 1 do\n  result ← PolynomialMultiply(Vn[i], Vm[i])\n  Vd[i] ← result\nend for"
    },
    {
      "mnemonic": "smull",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply Long",
      "summary": "Multiplies signed narrow vectors, producing wider result.",
      "syntax": "SMULL <Vd>.<Td>, <Vn>.<Ts>, <Vm>.<Ts>",
      "encoding": {
        "format": "SIMD Three Register Diff",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 1100 | 00 | Rn | Rd",
        "hex_opcode": "0x0E20C000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest (Wide)"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies corresponding signed elements of two narrow SIMD vectors and places the results in a wider vector, with sign-extension of operands. This is an AArch64-only NEON instruction that operates on integer element types (8, 16, or 32 bits) and produces results twice the width. Condition flags are not affected.",
      "example": "SMULL v0.4s.Td, v1.4s.Ts, v2.4s.Ts",
      "pseudocode": "for i = 0 to (128 >> (size+1)) - 1 do\n  op1 ← SignExtend(Vn[i], element_width)\n  op2 ← SignExtend(Vm[i], element_width)\n  Vd[i] ← op1 * op2\nend for"
    },
    {
      "mnemonic": "umull",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Multiply Long",
      "summary": "Multiplies unsigned narrow vectors, producing wider result.",
      "syntax": "UMULL <Vd>.<Td>, <Vn>.<Ts>, <Vm>.<Ts>",
      "encoding": {
        "format": "SIMD Three Register Diff",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 1100 | 00 | Rn | Rd",
        "hex_opcode": "0x2E20C000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "1100",
            "clean": "1100"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest (Wide)"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies corresponding unsigned elements of two narrow SIMD vectors and places the results in a wider vector, with zero-extension of operands. This is an AArch64-only NEON instruction that operates on integer element types (8, 16, or 32 bits) and produces results twice the width. Condition flags are not affected.",
      "example": "UMULL v0.4s.Td, v1.4s.Ts, v2.4s.Ts",
      "pseudocode": "for i = 0 to (128 >> (size+1)) - 1 do\n  op1 ← ZeroExtend(Vn[i], element_width)\n  op2 ← ZeroExtend(Vm[i], element_width)\n  Vd[i] ← op1 * op2\nend for"
    },
    {
      "mnemonic": "smlal",
      "architecture": "ARMv8-A",
      "full_name": "Signed Multiply-Accumulate Long",
      "summary": "Multiplies signed narrow vectors and adds to wide destination.",
      "syntax": "SMLAL <Vd>.<Td>, <Vn>.<Ts>, <Vm>.<Ts>",
      "encoding": {
        "format": "SIMD Three Register Diff",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 10 | 0 | 000 | Rn | Rd",
        "hex_opcode": "0x0E208000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies corresponding signed elements of two narrow SIMD vectors and adds the widened products to the existing contents of a wider destination register. This is an AArch64-only NEON instruction that performs sign-extended multiplication followed by accumulation on integer element types (8, 16, or 32 bits). Condition flags are not affected.",
      "example": "SMLAL v0.4s.Td, v1.4s.Ts, v2.4s.Ts",
      "pseudocode": "for i = 0 to (128 >> (size+1)) - 1 do\n  op1 ← SignExtend(Vn[i], element_width)\n  op2 ← SignExtend(Vm[i], element_width)\n  Vd[i] ← Vd[i] + (op1 * op2)\nend for"
    },
    {
      "mnemonic": "umlal",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Multiply-Accumulate Long",
      "summary": "Multiplies unsigned narrow vectors and adds to wide destination.",
      "syntax": "UMLAL <Vd>.<Td>, <Vn>.<Ts>, <Vm>.<Ts>",
      "encoding": {
        "format": "SIMD Three Register Diff",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 1 | Rm | 10 | 0 | 000 | Rn | Rd",
        "hex_opcode": "0x2E208000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:14 | 13 | 12:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Multiplies corresponding unsigned elements of two narrow SIMD vectors and adds the widened products to the existing contents of a wider destination register. This is an AArch64-only NEON instruction that performs zero-extended multiplication followed by accumulation on integer element types (8, 16, or 32 bits). Condition flags are not affected.",
      "example": "UMLAL v0.4s.Td, v1.4s.Ts, v2.4s.Ts",
      "pseudocode": "for i = 0 to (128 >> (size+1)) - 1 do\n  op1 ← ZeroExtend(Vn[i], element_width)\n  op2 ← ZeroExtend(Vm[i], element_width)\n  Vd[i] ← Vd[i] + (op1 * op2)\nend for"
    },
    {
      "mnemonic": "shll",
      "architecture": "ARMv8-A",
      "full_name": "Shift Left Long",
      "summary": "Shifts narrow vector left, extending to wide result.",
      "syntax": "SHLL <Vd>.<Td>, <Vn>.<Ts>, #<shift>",
      "encoding": {
        "format": "SIMD Shift Imm",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 10000 | 10011 | 10 | Rn | Rd",
        "hex_opcode": "0x2E213800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10011",
            "clean": "10011"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest (Wide)"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "shift",
          "desc": "Imm"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts narrow SIMD vector elements left by an immediate amount and zero-extends them to twice the width, placing the results in a wider destination register. This is an AArch64-only NEON instruction that operates on 8, 16, or 32-bit integer elements and produces 16, 32, or 64-bit results respectively. Condition flags are not affected.",
      "example": "SHLL v0.4s.Td, v1.4s.Ts, #LSL",
      "pseudocode": "for i = 0 to (128 >> (size+1)) - 1 do\n  operand ← ZeroExtend(Vn[i], element_width)\n  Vd[i] ← operand << imm\nend for"
    },
    {
      "mnemonic": "shrn",
      "architecture": "ARMv8-A",
      "full_name": "Shift Right Narrow",
      "summary": "Shifts wide vector right, narrowing to destination (Upper/Lower).",
      "syntax": "SHRN <Vd>.<Tb>, <Vn>.<Ta>, #<shift>",
      "encoding": {
        "format": "SIMD Shift Imm",
        "binary_pattern": "0 | Q | 0 | 011110 | immh | immb | 1000 | 0 | 1 | Rn | Rd",
        "hex_opcode": "0x0F008400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011110",
            "clean": "011110"
          },
          {
            "raw": "immh",
            "clean": "immh"
          },
          {
            "raw": "immb",
            "clean": "immb"
          },
          {
            "raw": "1000",
            "clean": "1000"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22:19 | 18:16 | 15:12 | 11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest (Narrow)"
        },
        {
          "name": "Vn",
          "desc": "Src (Wide)"
        },
        {
          "name": "shift",
          "desc": "Imm"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each element of a wide vector right by an immediate amount, narrows the result to half the width, and stores in the destination register. The Q bit selects whether the operation produces the lower (Q=0) or upper (Q=1) half of the result. No flags are modified by this instruction. This is an AArch64 NEON instruction only.",
      "example": "SHRN v0.4s.Tb, v1.4s.Ta, #LSL",
      "pseudocode": "for i = 0 to elements-1 do\n  temp ← Vn[i] >> shift\n  Vd[i] ← temp[element_width_dest-1:0]\nendfor"
    },
    {
      "mnemonic": "sqxtn",
      "architecture": "ARMv8-A",
      "full_name": "Signed Saturating Extract Narrow",
      "summary": "Reads wide elements, saturates, and narrows.",
      "syntax": "SQXTN <Vd>.<Tb>, <Vn>.<Ta>",
      "encoding": {
        "format": "SIMD Shift Imm",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 10000 | 10100 | 10 | Rn | Rd",
        "hex_opcode": "0x0E214800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10100",
            "clean": "10100"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Extracts each signed element from a wide source vector, saturates to the range of the narrower destination type, and stores the result. Sets the FPSR.QC flag if saturation occurs. This is an AArch64 NEON instruction; no general-purpose flags are modified.",
      "example": "SQXTN v0.4s.Tb, v1.4s.Ta",
      "pseudocode": "for i = 0 to elements-1 do\n  temp ← Vn[i]\n  if temp > max_value_dest or temp < min_value_dest then\n    Vd[i] ← Saturate(temp)\n    FPSR.QC ← 1\n  else\n    Vd[i] ← temp\n  endif\nendfor"
    },
    {
      "mnemonic": "uqxtn",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Saturating Extract Narrow",
      "summary": "Reads wide unsigned elements, saturates, and narrows.",
      "syntax": "UQXTN <Vd>.<Tb>, <Vn>.<Ta>",
      "encoding": {
        "format": "SIMD Shift Imm",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 10000 | 10100 | 10 | Rn | Rd",
        "hex_opcode": "0x2E214800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10100",
            "clean": "10100"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Extracts each unsigned element from a wide source vector, saturates to the range of the narrower unsigned destination type, and stores the result. Sets the FPSR.QC flag if saturation occurs. This is an AArch64 NEON instruction; no general-purpose flags are modified.",
      "example": "UQXTN v0.4s.Tb, v1.4s.Ta",
      "pseudocode": "for i = 0 to elements-1 do\n  temp ← Vn[i]\n  if temp > max_value_dest then\n    Vd[i] ← max_value_dest\n    FPSR.QC ← 1\n  else\n    Vd[i] ← temp\n  endif\nendfor"
    },
    {
      "mnemonic": "ssra",
      "architecture": "ARMv8-A",
      "full_name": "Signed Shift Right and Accumulate",
      "summary": "Arithmetic right shift and add to destination.",
      "syntax": "SSRA <Vd>.<T>, <Vn>.<T>, #<shift>",
      "encoding": {
        "format": "SIMD Shift Imm",
        "binary_pattern": "0 | Q | 0 | 011110 | immh | immb | 00 | 0 | 1 | 01 | Rn | Rd",
        "hex_opcode": "0x0F001400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011110",
            "clean": "011110"
          },
          {
            "raw": "immh",
            "clean": "immh"
          },
          {
            "raw": "immb",
            "clean": "immb"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22:19 | 18:16 | 15:14 | 13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "shift",
          "desc": "Imm"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs an arithmetic (sign-extending) right shift on each source element, then accumulates (adds) the shifted result into the corresponding destination element. No condition flags are modified. This is an AArch64 NEON instruction.",
      "example": "SSRA v0.4s.T, v1.4s.T, #LSL",
      "pseudocode": "for i = 0 to elements-1 do\n  shifted ← Vn[i] >> shift  (arithmetic shift)\n  Vd[i] ← Vd[i] + shifted\nendfor"
    },
    {
      "mnemonic": "usra",
      "architecture": "ARMv8-A",
      "full_name": "Unsigned Shift Right and Accumulate",
      "summary": "Logical right shift and add to destination.",
      "syntax": "USRA <Vd>.<T>, <Vn>.<T>, #<shift>",
      "encoding": {
        "format": "SIMD Shift Imm",
        "binary_pattern": "0 | Q | 1 | 011110 | immh | immb | 00 | 0 | 1 | 01 | Rn | Rd",
        "hex_opcode": "0x2F001400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011110",
            "clean": "011110"
          },
          {
            "raw": "immh",
            "clean": "immh"
          },
          {
            "raw": "immb",
            "clean": "immb"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01",
            "clean": "01"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22:19 | 18:16 | 15:14 | 13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Dest/Acc"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "shift",
          "desc": "Imm"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a logical (zero-extending) right shift on each source element, then accumulates (adds) the shifted result into the corresponding destination element. No condition flags are modified. This is an AArch64 NEON instruction.",
      "example": "USRA v0.4s.T, v1.4s.T, #LSL",
      "pseudocode": "for i = 0 to elements-1 do\n  shifted ← Vn[i] >> shift  (logical shift)\n  Vd[i] ← Vd[i] + shifted\nendfor"
    },
    {
      "mnemonic": "sri",
      "architecture": "ARMv8-A",
      "full_name": "Shift Right and Insert",
      "summary": "Shifts source right and inserts into destination.",
      "syntax": "SRI <Vd>.<T>, <Vn>.<T>, #<shift>",
      "encoding": {
        "format": "SIMD Shift Imm",
        "binary_pattern": "0 | Q | 1 | 011110 | immh | immb | 01000 | 1 | Rn | Rd",
        "hex_opcode": "0x2F004400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011110",
            "clean": "011110"
          },
          {
            "raw": "immh",
            "clean": "immh"
          },
          {
            "raw": "immb",
            "clean": "immb"
          },
          {
            "raw": "01000",
            "clean": "01000"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22:19 | 18:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "shift",
          "desc": "Imm"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each source element right by an immediate amount and inserts the result into the corresponding destination element, preserving the upper bits of the destination. No condition flags are modified. This is an AArch64 NEON instruction.",
      "example": "SRI v0.4s.T, v1.4s.T, #LSL",
      "pseudocode": "for i = 0 to elements-1 do\n  shifted ← Vn[i] >> shift\n  Vd[i] ← (Vd[i] & ~mask) | (shifted & mask)\nendfor\nwhere mask selects the lower (element_width - shift) bits"
    },
    {
      "mnemonic": "sli",
      "architecture": "ARMv8-A",
      "full_name": "Shift Left and Insert",
      "summary": "Shifts source left and inserts into destination.",
      "syntax": "SLI <Vd>.<T>, <Vn>.<T>, #<shift>",
      "encoding": {
        "format": "SIMD Shift Imm",
        "binary_pattern": "0 | Q | 1 | 011110 | immh | immb | 01010 | 1 | Rn | Rd",
        "hex_opcode": "0x2F005400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011110",
            "clean": "011110"
          },
          {
            "raw": "immh",
            "clean": "immh"
          },
          {
            "raw": "immb",
            "clean": "immb"
          },
          {
            "raw": "01010",
            "clean": "01010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22:19 | 18:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "shift",
          "desc": "Imm"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Shifts each source element left by an immediate amount and inserts the result into the corresponding destination element, preserving the lower bits of the destination. No condition flags are modified. This is an AArch64 NEON instruction.",
      "example": "SLI v0.4s.T, v1.4s.T, #LSL",
      "pseudocode": "for i = 0 to elements-1 do\n  shifted ← Vn[i] << shift\n  Vd[i] ← (Vd[i] & mask) | (shifted & ~mask)\nendfor\nwhere mask selects the lower shift bits"
    },
    {
      "mnemonic": "clz",
      "architecture": "ARMv8-A",
      "full_name": "Vector Count Leading Zeros",
      "summary": "Counts leading zeros for each element.",
      "syntax": "CLZ <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 1 | 01110 | size | 10000 | 00100 | 10 | Rn | Rd",
        "hex_opcode": "0x2E204800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "00100",
            "clean": "00100"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Counts the number of leading zero bits in each element of the source vector and stores the count in the corresponding destination element. No condition flags are modified. This is an AArch64 NEON instruction.",
      "example": "CLZ v0.4s.T, v1.4s.T",
      "pseudocode": "for i = 0 to elements-1 do\n  Vd[i] ← CountLeadingZeros(Vn[i])\nendfor"
    },
    {
      "mnemonic": "cnt",
      "architecture": "ARMv8-A",
      "full_name": "Vector Population Count",
      "summary": "Counts set bits (population count) per byte.",
      "syntax": "CNT <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 10000 | 00101 | 10 | Rn | Rd",
        "hex_opcode": "0x0E205800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "00101",
            "clean": "00101"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Counts the number of set bits (population count) in each byte element of the source vector and places the result in the corresponding byte of the destination vector. This is a per-byte operation with no flag effects. The instruction is available in AArch64 NEON and operates on both 64-bit (Q=0) and 128-bit (Q=1) vectors.",
      "example": "CNT v0.4s.T, v1.4s.T",
      "pseudocode": "for i = 0 to elements_in_vector - 1:\n  Vd[i] ← PopulationCount(Vn[i])"
    },
    {
      "mnemonic": "not",
      "architecture": "ARMv8-A",
      "full_name": "Vector Bitwise NOT",
      "summary": "Inverts all bits. (Alias for MVN).",
      "syntax": "NOT <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 1 | 01110 | 00 | 10000 | 00101 | 10 | Rn | Rd",
        "hex_opcode": "0x2E205800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "00101",
            "clean": "00101"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Performs a bitwise NOT operation (one's complement) on each bit of the source vector, placing the inverted result in the destination vector. This instruction is an alias for MVN in NEON and operates on all vector element sizes. No condition flags are affected. Available in AArch64 NEON for both 64-bit and 128-bit vectors.",
      "example": "NOT v0.4s.T, v1.4s.T",
      "pseudocode": "for i = 0 to bits_in_vector - 1:\n  Vd[i] ← NOT Vn[i]"
    },
    {
      "mnemonic": "urecpe",
      "architecture": "ARMv8-A",
      "full_name": "Vector Unsigned Reciprocal Estimate",
      "summary": "Estimates reciprocal for unsigned integers.",
      "syntax": "URECPE <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 0 | 011101 | sz | 10000 | 11100 | 10 | Rn | Rd",
        "hex_opcode": "0x0EA1C800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011101",
            "clean": "011101"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "11100",
            "clean": "11100"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes an unsigned reciprocal estimate (1/x approximation) for each 32-bit element in the source vector and stores the result in the destination vector. The result is a 32-bit unsigned integer approximation with reduced precision, suitable as a starting point for Newton-Raphson refinement. No condition flags are affected. Available in AArch64 NEON operating on 32-bit integer elements only.",
      "example": "URECPE v0.4s.T, v1.4s.T",
      "pseudocode": "if size == 0b10 then\n  for i = 0 to elements_in_vector - 1:\n    Vd[i] ← UnsignedReciprocalEstimate(Vn[i])"
    },
    {
      "mnemonic": "frecpe",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Reciprocal Estimate",
      "summary": "Estimates reciprocal (1/x) for floats.",
      "syntax": "FRECPE <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 0 | 01110 | 1 | 111100 | 11101 | 10 | Rn | Rd",
        "hex_opcode": "0x0EF9D800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "111100",
            "clean": "111100"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes a floating-point reciprocal estimate (1/x approximation) for each element in the source vector and stores the result in the destination vector. Operates on 32-bit (sz=0) or 64-bit (sz=1) floating-point elements. The result is reduced-precision and intended for refinement via Newton-Raphson steps. No condition flags are affected. Available in AArch64 NEON.",
      "example": "FRECPE v0.4s.T, v1.4s.T",
      "pseudocode": "if sz == 0 then\n  for i = 0 to elements_in_vector - 1:\n    Vd[i] ← FloatReciprocalEstimate(Vn[i])  // 32-bit float\nelse\n  for i = 0 to elements_in_vector - 1:\n    Vd[i] ← FloatReciprocalEstimate(Vn[i])  // 64-bit float"
    },
    {
      "mnemonic": "frecps",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Reciprocal Step",
      "summary": "Newton-Raphson step for reciprocal refinement.",
      "syntax": "FRECPS <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 011100 | sz | 1 | Rm | 11111 | 1 | Rn | Rd",
        "hex_opcode": "0x0E20FC00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011100",
            "clean": "011100"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes the Newton-Raphson reciprocal refinement step 2.0 - (Vn × Vm) for each floating-point element, storing the result in the destination. Operates on 32-bit (sz=0) or 64-bit (sz=1) floating-point elements. This instruction is typically used iteratively with FRECPE to converge toward an accurate reciprocal. No condition flags are affected. Available in AArch64 NEON.",
      "example": "FRECPS v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "if sz == 0 then\n  for i = 0 to elements_in_vector - 1:\n    Vd[i] ← 2.0 - (Vn[i] * Vm[i])  // 32-bit float\nelse\n  for i = 0 to elements_in_vector - 1:\n    Vd[i] ← 2.0 - (Vn[i] * Vm[i])  // 64-bit float"
    },
    {
      "mnemonic": "frsqrte",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Reciprocal Sqrt Estimate",
      "summary": "Estimates reciprocal square root (1/sqrt(x)).",
      "syntax": "FRSQRTE <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 1 | 01110 | 1 | 111100 | 11101 | 10 | Rn | Rd",
        "hex_opcode": "0x2EF9D800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "111100",
            "clean": "111100"
          },
          {
            "raw": "11101",
            "clean": "11101"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes a floating-point reciprocal square root estimate (1/sqrt(x) approximation) for each element in the source vector and stores the result in the destination vector. Operates on 32-bit (sz=0) or 64-bit (sz=1) floating-point elements. The result is reduced-precision and intended for refinement via Newton-Raphson steps. No condition flags are affected. Available in AArch64 NEON.",
      "example": "FRSQRTE v0.4s.T, v1.4s.T",
      "pseudocode": "if sz == 0 then\n  for i = 0 to elements_in_vector - 1:\n    Vd[i] ← ReciprocalSquareRootEstimate(Vn[i])  // 32-bit float\nelse\n  for i = 0 to elements_in_vector - 1:\n    Vd[i] ← ReciprocalSquareRootEstimate(Vn[i])  // 64-bit float"
    },
    {
      "mnemonic": "frsqrts",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Reciprocal Sqrt Step",
      "summary": "Newton-Raphson step for reciprocal square root refinement.",
      "syntax": "FRSQRTS <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 011101 | sz | 1 | Rm | 11111 | 1 | Rn | Rd",
        "hex_opcode": "0x0EA0FC00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011101",
            "clean": "011101"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes the Newton-Raphson reciprocal square root refinement step (3.0 - Vn × Vm) / 2.0 for each floating-point element, storing the result in the destination. Operates on 32-bit (sz=0) or 64-bit (sz=1) floating-point elements. This instruction is typically used iteratively with FRSQRTE to converge toward an accurate reciprocal square root. No condition flags are affected. Available in AArch64 NEON.",
      "example": "FRSQRTS v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "if sz == 0 then\n  for i = 0 to elements_in_vector - 1:\n    Vd[i] ← (3.0 - (Vn[i] * Vm[i])) / 2.0  // 32-bit float\nelse\n  for i = 0 to elements_in_vector - 1:\n    Vd[i] ← (3.0 - (Vn[i] * Vm[i])) / 2.0  // 64-bit float"
    },
    {
      "mnemonic": "fcvtl",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Convert Long",
      "summary": "Converts narrow floats to wide floats (e.g., Half -> Single).",
      "syntax": "FCVTL <Vd>.<Td>, <Vn>.<Ts>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 0 | 011100 | sz | 10000 | 10111 | 10 | Rn | Rd",
        "hex_opcode": "0x0E217800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011100",
            "clean": "011100"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10111",
            "clean": "10111"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Converts floating-point elements from a narrower format to a wider format (e.g., float16 to float32, or float32 to float64). The lower half (or upper half if Q=1) of the source vector is converted and stored in the destination vector. No condition flags are affected. Available in AArch64 NEON.",
      "example": "FCVTL v0.4s.Td, v1.4s.Ts",
      "pseudocode": "if sz == 0 then\n  for i = 0 to elements_in_vector - 1:\n    Vd[i] ← ConvertFloat16ToFloat32(Vn[i])  // Half to Single\nelse\n  for i = 0 to elements_in_vector - 1:\n    Vd[i] ← ConvertFloat32ToFloat64(Vn[i])  // Single to Double"
    },
    {
      "mnemonic": "fcvtn",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Convert Narrow",
      "summary": "Converts wide floats to narrow floats (e.g., Single -> Half).",
      "syntax": "FCVTN <Vd>.<Td>, <Vn>.<Ts>",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 0 | 011100 | sz | 10000 | 10110 | 10 | Rn | Rd",
        "hex_opcode": "0x0E216800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011100",
            "clean": "011100"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "10000",
            "clean": "10000"
          },
          {
            "raw": "10110",
            "clean": "10110"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21:17 | 16:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Converts a vector of wider floating-point elements to a vector of narrower floating-point elements by rounding toward zero (e.g., float32 to float16). The result is placed in the lower half of the destination register; the upper half is zeroed if Q=0 (64-bit result) or unmodified if Q=1 (128-bit result, lower half updated). Executes in AArch64 with NEON support; condition flags are not affected.",
      "example": "FCVTN v0.4s.Td, v1.4s.Ts",
      "pseudocode": "for i = 0 to elements_in_narrower_type-1 do\n  Vd[i] ← ConvertFloatingPointNarrow(Vn[i])\nif Q == 0 then\n  Vd[upper_half] ← 0"
    },
    {
      "mnemonic": "fcvtzs",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Convert to Signed Integer",
      "summary": "Converts floats to signed integers (Truncate).",
      "syntax": "FCVTZS <Vd>.<T>, <Vn>.<T> {, #<fbits>}",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 0 | 011110 | immh | immb | 11111 | 1 | Rn | Rd",
        "hex_opcode": "0x0F00FC00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "011110",
            "clean": "011110"
          },
          {
            "raw": "immh",
            "clean": "immh"
          },
          {
            "raw": "immb",
            "clean": "immb"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22:19 | 18:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Converts a vector of floating-point elements to a vector of signed integer elements by truncating toward zero, with optional fixed-point scaling (fbits). Executes in AArch64 with NEON support; condition flags are not affected. Overflow wraps to the minimum/maximum signed integer value for the element size.",
      "example": "FCVTZS v0.4s.T, v1.4s.T",
      "pseudocode": "for i = 0 to num_elements-1 do\n  if fbits specified then\n    scaled ← Vn[i] * 2^fbits\n  else\n    scaled ← Vn[i]\n  Vd[i] ← ConvertToSignedInteger(scaled, rounding_mode=toward_zero)"
    },
    {
      "mnemonic": "fcvtzu",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Convert to Unsigned Integer",
      "summary": "Converts floats to unsigned integers (Truncate).",
      "syntax": "FCVTZU <Vd>.<T>, <Vn>.<T> {, #<fbits>}",
      "encoding": {
        "format": "SIMD Two Register",
        "binary_pattern": "0 | Q | 1 | 011110 | immh | immb | 11111 | 1 | Rn | Rd",
        "hex_opcode": "0x2F00FC00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011110",
            "clean": "011110"
          },
          {
            "raw": "immh",
            "clean": "immh"
          },
          {
            "raw": "immb",
            "clean": "immb"
          },
          {
            "raw": "11111",
            "clean": "11111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22:19 | 18:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Converts a vector of floating-point elements to a vector of unsigned integer elements by truncating toward zero, with optional fixed-point scaling (fbits). Executes in AArch64 with NEON support; condition flags are not affected. Overflow wraps to zero or the maximum unsigned integer value for the element size.",
      "example": "FCVTZU v0.4s.T, v1.4s.T",
      "pseudocode": "for i = 0 to num_elements-1 do\n  if fbits specified then\n    scaled ← Vn[i] * 2^fbits\n  else\n    scaled ← Vn[i]\n  Vd[i] ← ConvertToUnsignedInteger(scaled, rounding_mode=toward_zero)"
    },
    {
      "mnemonic": "addp",
      "architecture": "ARMv8-A",
      "full_name": "Vector Add Pairwise",
      "summary": "Adds adjacent pairs of elements.",
      "syntax": "ADDP <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 0 | 01110 | size | 1 | Rm | 10111 | 1 | Rn | Rd",
        "hex_opcode": "0x0E20BC00",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "size",
            "clean": "size"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "10111",
            "clean": "10111"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23:22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds adjacent pairs of elements across the two source vectors element-wise, placing results in the destination. For example, with 32-bit elements, pairs (Vn[1],Vn[0]) and (Vm[1],Vm[0]) sum to (Vd[1],Vd[0]). Executes in AArch64 with NEON support; condition flags are not affected. Overflow wraps modulo 2^(element_width).",
      "example": "ADDP v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to num_pairs-1 do\n  Vd[2*i] ← Vn[2*i] + Vn[2*i+1]\n  Vd[2*i+1] ← Vm[2*i] + Vm[2*i+1]"
    },
    {
      "mnemonic": "faddp",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Add Pairwise",
      "summary": "Adds adjacent pairs of float elements.",
      "syntax": "FADDP <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 011100 | sz | 1 | Rm | 11010 | 1 | Rn | Rd",
        "hex_opcode": "0x2E20D400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "011100",
            "clean": "011100"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "11010",
            "clean": "11010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Adds adjacent pairs of floating-point elements across the two source vectors, placing results in the destination. For example, with 32-bit floats, (Vn[0]+Vn[1]) and (Vm[0]+Vm[1]) are computed and stored. Executes in AArch64 with NEON support; condition flags are not affected. Addition follows IEEE 754 floating-point semantics.",
      "example": "FADDP v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to num_pairs-1 do\n  Vd[2*i] ← Vn[2*i] + Vn[2*i+1]\n  Vd[2*i+1] ← Vm[2*i] + Vm[2*i+1]"
    },
    {
      "mnemonic": "fmaxp",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Max Pairwise",
      "summary": "Max of adjacent float elements.",
      "syntax": "FMAXP <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | 0 | sz | 1 | Rm | 11110 | 1 | Rn | Rd",
        "hex_opcode": "0x2E20F400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes the floating-point maximum of adjacent pairs of elements across the two source vectors, placing results in the destination. For example, with 32-bit floats, max(Vn[0],Vn[1]) and max(Vm[0],Vm[1]) are stored. Executes in AArch64 with NEON support; condition flags are not affected. Comparison follows IEEE 754 semantics (NaN handling rules apply).",
      "example": "FMAXP v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to num_pairs-1 do\n  Vd[2*i] ← FMax(Vn[2*i], Vn[2*i+1])\n  Vd[2*i+1] ← FMax(Vm[2*i], Vm[2*i+1])"
    },
    {
      "mnemonic": "fminp",
      "architecture": "ARMv8-A",
      "full_name": "Vector Floating-Point Min Pairwise",
      "summary": "Min of adjacent float elements.",
      "syntax": "FMINP <Vd>.<T>, <Vn>.<T>, <Vm>.<T>",
      "encoding": {
        "format": "SIMD Three Register",
        "binary_pattern": "0 | Q | 1 | 01110 | 1 | sz | 1 | Rm | 11110 | 1 | Rn | Rd",
        "hex_opcode": "0x2EA0F400",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Q",
            "clean": "Q"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "01110",
            "clean": "01110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "sz",
            "clean": "sz"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "11110",
            "clean": "11110"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:24 | 23 | 22 | 21 | 20:16 | 15:11 | 10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        },
        {
          "name": "Vm",
          "desc": "Second source SIMD/FP vector register"
        }
      ],
      "extension": "NEON (SIMD)",
      "description": "Computes the floating-point minimum of adjacent pairs of elements across the two source vectors, placing results in the destination. For example, with 32-bit floats, min(Vn[0],Vn[1]) and min(Vm[0],Vm[1]) are stored. Executes in AArch64 with NEON support; condition flags are not affected. Comparison follows IEEE 754 semantics (NaN handling rules apply).",
      "example": "FMINP v0.4s.T, v1.4s.T, v2.4s.T",
      "pseudocode": "for i = 0 to num_pairs-1 do\n  Vd[2*i] ← FMin(Vn[2*i], Vn[2*i+1])\n  Vd[2*i+1] ← FMin(Vm[2*i], Vm[2*i+1])"
    },
    {
      "mnemonic": "aese",
      "architecture": "ARMv8-A",
      "full_name": "AES Encrypt",
      "summary": "Performs one round of AES encryption.",
      "syntax": "AESE <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01001110 | 00 | 101000010 | 0 | 10 | Rn | Rd",
        "hex_opcode": "0x4E284800",
        "visual_parts": [
          {
            "raw": "01001110",
            "clean": "01001110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101000010",
            "clean": "101000010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Data"
        },
        {
          "name": "Vn",
          "desc": "Key"
        }
      ],
      "extension": "Crypto",
      "description": "Performs a single round of AES (Advanced Encryption Standard) encryption on the 128-bit value in the source register using the key in Vn, producing the result in Vd. This implements the AES encryption state transformation (SubBytes, ShiftRows, MixColumns, AddRoundKey) for one round. Executes in AArch64 with Crypto extension; condition flags are not affected. This instruction is part of the AES cryptographic instruction set.",
      "example": "AESE v0.4s.T, v1.4s.T",
      "pseudocode": "Vd ← AES_EncryptRound(Vd, Vn)"
    },
    {
      "mnemonic": "aesd",
      "architecture": "ARMv8-A",
      "full_name": "AES Decrypt",
      "summary": "Performs one round of AES decryption.",
      "syntax": "AESD <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01001110 | 00 | 101000010 | 1 | 10 | Rn | Rd",
        "hex_opcode": "0x4E285800",
        "visual_parts": [
          {
            "raw": "01001110",
            "clean": "01001110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101000010",
            "clean": "101000010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Data"
        },
        {
          "name": "Vn",
          "desc": "Key"
        }
      ],
      "extension": "Crypto",
      "description": "Performs one round of AES decryption on a 128-bit vector. The instruction applies the AES InvShiftRows, InvSubBytes, and AddRoundKey transformations to the state in Vn using a round key in Vd, storing the result in Vd. This is an AArch64-only instruction requiring the Crypto extension. No condition flags are affected.",
      "example": "AESD v0.4s.T, v1.4s.T",
      "pseudocode": "Vd ← AES_InvShiftRows(AES_InvSubBytes(Vn ⊕ Vd))"
    },
    {
      "mnemonic": "aesmc",
      "architecture": "ARMv8-A",
      "full_name": "AES Mix Columns",
      "summary": "Performs AES Mix Columns transformation.",
      "syntax": "AESMC <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01001110 | 00 | 101000011 | 0 | 10 | Rn | Rd",
        "hex_opcode": "0x4E286800",
        "visual_parts": [
          {
            "raw": "01001110",
            "clean": "01001110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101000011",
            "clean": "101000011"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "Crypto",
      "description": "Performs the AES Mix Columns transformation on a 128-bit vector. The instruction applies the MixColumns operation to the bytes in Vn and stores the result in Vd. This is an AArch64-only instruction requiring the Crypto extension. No condition flags are affected.",
      "example": "AESMC v0.4s.T, v1.4s.T",
      "pseudocode": "Vd ← AES_MixColumns(Vn)"
    },
    {
      "mnemonic": "aesimc",
      "architecture": "ARMv8-A",
      "full_name": "AES Inverse Mix Columns",
      "summary": "Performs AES Inverse Mix Columns transformation.",
      "syntax": "AESIMC <Vd>.<T>, <Vn>.<T>",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01001110 | 00 | 101000011 | 1 | 10 | Rn | Rd",
        "hex_opcode": "0x4E287800",
        "visual_parts": [
          {
            "raw": "01001110",
            "clean": "01001110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "101000011",
            "clean": "101000011"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Vd",
          "desc": "Destination SIMD/FP vector register"
        },
        {
          "name": "Vn",
          "desc": "First source SIMD/FP vector register"
        }
      ],
      "extension": "Crypto",
      "description": "Performs the AES Inverse Mix Columns transformation on a 128-bit vector. The instruction applies the InvMixColumns operation to the bytes in Vn and stores the result in Vd. This is an AArch64-only instruction requiring the Crypto extension. No condition flags are affected.",
      "example": "AESIMC v0.4s.T, v1.4s.T",
      "pseudocode": "Vd ← AES_InvMixColumns(Vn)"
    },
    {
      "mnemonic": "sha1c",
      "architecture": "ARMv8-A",
      "full_name": "SHA1 Choose",
      "summary": "SHA1 hash update (Choose function).",
      "syntax": "SHA1C <Qd>, <Sn>, <Vm>.<T>",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01011110 | 00 | 0 | Rm | 0 | 000 | 00 | Rn | Rd",
        "hex_opcode": "0x5E000000",
        "visual_parts": [
          {
            "raw": "01011110",
            "clean": "01011110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "000",
            "clean": "000"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "State"
        },
        {
          "name": "Sn",
          "desc": "Hash"
        },
        {
          "name": "Vm",
          "desc": "Data"
        }
      ],
      "extension": "Crypto",
      "description": "Performs one round of SHA-1 hash computation using the Choose function. The instruction updates the SHA-1 state in Qd by processing the 32-bit hash value in Sn and 128-bit data from Vm. This is an AArch64-only instruction requiring the Crypto extension. No condition flags are affected.",
      "example": "SHA1C q0, s1, v2.4s.T",
      "pseudocode": "T ← SHA1_Choose(Sn)\nQd ← SHA1_Update_C(Qd, T, Vm)"
    },
    {
      "mnemonic": "sha1m",
      "architecture": "ARMv8-A",
      "full_name": "SHA1 Majority",
      "summary": "SHA1 hash update (Majority function).",
      "syntax": "SHA1M <Qd>, <Sn>, <Vm>.<T>",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01011110 | 00 | 0 | Rm | 0 | 010 | 00 | Rn | Rd",
        "hex_opcode": "0x5E002000",
        "visual_parts": [
          {
            "raw": "01011110",
            "clean": "01011110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "State"
        },
        {
          "name": "Sn",
          "desc": "Hash"
        },
        {
          "name": "Vm",
          "desc": "Data"
        }
      ],
      "extension": "Crypto",
      "description": "Performs one round of SHA-1 hash computation using the Majority function. The instruction updates the SHA-1 state in Qd by processing the 32-bit hash value in Sn and 128-bit data from Vm. This is an AArch64-only instruction requiring the Crypto extension. No condition flags are affected.",
      "example": "SHA1M q0, s1, v2.4s.T",
      "pseudocode": "T ← SHA1_Majority(Sn)\nQd ← SHA1_Update_M(Qd, T, Vm)"
    },
    {
      "mnemonic": "sha1p",
      "architecture": "ARMv8-A",
      "full_name": "SHA1 Parity",
      "summary": "SHA1 hash update (Parity function).",
      "syntax": "SHA1P <Qd>, <Sn>, <Vm>.<T>",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01011110 | 00 | 0 | Rm | 0 | 001 | 00 | Rn | Rd",
        "hex_opcode": "0x5E001000",
        "visual_parts": [
          {
            "raw": "01011110",
            "clean": "01011110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "001",
            "clean": "001"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15 | 14:12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "State"
        },
        {
          "name": "Sn",
          "desc": "Hash"
        },
        {
          "name": "Vm",
          "desc": "Data"
        }
      ],
      "extension": "Crypto",
      "description": "Performs one round of SHA-1 hash computation using the Parity function. The instruction updates the SHA-1 state in Qd by processing the 32-bit hash value in Sn and 128-bit data from Vm. This is an AArch64-only instruction requiring the Crypto extension. No condition flags are affected.",
      "example": "SHA1P q0, s1, v2.4s.T",
      "pseudocode": "T ← SHA1_Parity(Sn)\nQd ← SHA1_Update_P(Qd, T, Vm)"
    },
    {
      "mnemonic": "sha256h",
      "architecture": "ARMv8-A",
      "full_name": "SHA256 Hash Part 1",
      "summary": "SHA256 hash update (part 1).",
      "syntax": "SHA256H <Qd>, <Qn>, <Vm>.<T>",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01011110 | 00 | 0 | Rm | 010 | 0 | 00 | Rn | Rd",
        "hex_opcode": "0x5E004000",
        "visual_parts": [
          {
            "raw": "01011110",
            "clean": "01011110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "State"
        },
        {
          "name": "Qn",
          "desc": "Hash"
        },
        {
          "name": "Vm",
          "desc": "Data"
        }
      ],
      "extension": "Crypto",
      "description": "Performs the first part of one round of SHA-256 hash computation. The instruction updates the lower 96 bits of the SHA-256 state in Qd using the full state in Qn and 128-bit message schedule data from Vm. This is an AArch64-only instruction requiring the Crypto extension. No condition flags are affected.",
      "example": "SHA256H q0, q1, v2.4s.T",
      "pseudocode": "Qd ← SHA256_H(Qd, Qn, Vm)"
    },
    {
      "mnemonic": "sha256h2",
      "architecture": "ARMv8-A",
      "full_name": "SHA256 Hash Part 2",
      "summary": "SHA256 hash update (part 2).",
      "syntax": "SHA256H2 <Qd>, <Qn>, <Vm>.<T>",
      "encoding": {
        "format": "Crypto",
        "binary_pattern": "01011110 | 00 | 0 | Rm | 010 | 1 | 00 | Rn | Rd",
        "hex_opcode": "0x5E005000",
        "visual_parts": [
          {
            "raw": "01011110",
            "clean": "01011110"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31:24 | 23:22 | 21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Qd",
          "desc": "State"
        },
        {
          "name": "Qn",
          "desc": "Hash"
        },
        {
          "name": "Vm",
          "desc": "Data"
        }
      ],
      "extension": "Crypto",
      "description": "Performs the second part of one round of SHA-256 hash computation. The instruction updates the upper 96 bits of the SHA-256 state in Qd using the partial state in Qn and 128-bit message schedule data from Vm. This is an AArch64-only instruction requiring the Crypto extension. No condition flags are affected.",
      "example": "SHA256H2 q0, q1, v2.4s.T",
      "pseudocode": "Qd ← SHA256_H2(Qd, Qn, Vm)"
    },
    {
      "mnemonic": "crc32b",
      "architecture": "ARMv8-A",
      "full_name": "CRC32 Byte",
      "summary": "Updates CRC32 checksum with a byte.",
      "syntax": "CRC32B <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11010110 | Rm | 010 | 0 | 00 | Rn | Rd",
        "hex_opcode": "0x1AC04000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "Accumulator"
        },
        {
          "name": "Wm",
          "desc": "Data"
        }
      ],
      "extension": "CRC",
      "description": "Updates a 32-bit CRC32 checksum by processing an 8-bit (byte) value from the data register. The instruction computes a new CRC32 polynomial remainder using the ISO 3309 polynomial and stores the result in the destination register. No condition flags are affected; this instruction requires the CRC extension and executes only in AArch64.",
      "example": "CRC32B w0, w1, w2",
      "pseudocode": "Wd ← CRC32Polynomial(Wn, Wm<7:0>)"
    },
    {
      "mnemonic": "crc32w",
      "architecture": "ARMv8-A",
      "full_name": "CRC32 Word",
      "summary": "Updates CRC32 checksum with a word.",
      "syntax": "CRC32W <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11010110 | Rm | 010 | 0 | 10 | Rn | Rd",
        "hex_opcode": "0x1AC04800",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "10",
            "clean": "10"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "Accumulator"
        },
        {
          "name": "Wm",
          "desc": "Data"
        }
      ],
      "extension": "CRC",
      "description": "Updates a 32-bit CRC32 checksum by processing a 32-bit (word) value from the data register. The instruction computes the CRC32 polynomial remainder using the ISO 3309 polynomial and stores the result in the destination register. No condition flags are affected; this instruction requires the CRC extension and executes only in AArch64.",
      "example": "CRC32W w0, w1, w2",
      "pseudocode": "Wd ← CRC32Polynomial(Wn, Wm<31:0>)"
    },
    {
      "mnemonic": "crc32x",
      "architecture": "ARMv8-A",
      "full_name": "CRC32 Doubleword",
      "summary": "Updates CRC32 checksum with a doubleword (64-bit).",
      "syntax": "CRC32X <Wd>, <Wn>, <Xm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "1 | 0 | 0 | 11010110 | Rm | 010 | 0 | 11 | Rn | Rd",
        "hex_opcode": "0x9AC04C00",
        "visual_parts": [
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11",
            "clean": "11"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "Accumulator"
        },
        {
          "name": "Xm",
          "desc": "Data"
        }
      ],
      "extension": "CRC",
      "description": "Updates a 32-bit CRC32 checksum by processing a 64-bit (doubleword) value from the data register. The instruction computes the CRC32 polynomial remainder using the ISO 3309 polynomial and stores the result in the destination 32-bit register. No condition flags are affected; this instruction requires the CRC extension and executes only in AArch64.",
      "example": "CRC32X w0, w1, x2",
      "pseudocode": "Wd ← CRC32Polynomial(Wn, Xm<63:0>)"
    },
    {
      "mnemonic": "crc32cb",
      "architecture": "ARMv8-A",
      "full_name": "CRC32C Byte",
      "summary": "Updates CRC32C (Castagnoli) checksum with a byte.",
      "syntax": "CRC32CB <Wd>, <Wn>, <Wm>",
      "encoding": {
        "format": "Data Processing",
        "binary_pattern": "0 | 0 | 0 | 11010110 | Rm | 010 | 1 | 00 | Rn | Rd",
        "hex_opcode": "0x1AC05000",
        "visual_parts": [
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "0",
            "clean": "0"
          },
          {
            "raw": "11010110",
            "clean": "11010110"
          },
          {
            "raw": "Rm",
            "clean": "Rm"
          },
          {
            "raw": "010",
            "clean": "010"
          },
          {
            "raw": "1",
            "clean": "1"
          },
          {
            "raw": "00",
            "clean": "00"
          },
          {
            "raw": "Rn",
            "clean": "Rn"
          },
          {
            "raw": "Rd",
            "clean": "Rd"
          }
        ],
        "bit_positions": "31 | 30 | 29 | 28:21 | 20:16 | 15:13 | 12 | 11:10 | 9:5 | 4:0"
      },
      "operands": [
        {
          "name": "Wd",
          "desc": "Destination 32-bit integer register"
        },
        {
          "name": "Wn",
          "desc": "Acc"
        },
        {
          "name": "Wm",
          "desc": "Data"
        }
      ],
      "extension": "CRC",
      "description": "Updates a 32-bit CRC32C (Castagnoli) checksum by processing an 8-bit (byte) value from the data register. The instruction computes the CRC32C polynomial remainder (iSCSI polynomial) and stores the result in the destination register. No condition flags are affected; this instruction requires the CRC extension and executes only in AArch64.",
      "example": "CRC32CB w0, w1, w2",
      "pseudocode": "Wd ← CRC32CPolynomial(Wn, Wm<7:0>)"
    }
  ]
}
