{"mnemonic": "inc", "architecture": "x86", "full_name": "Increment", "summary": "Increments the operand by 1.", "syntax": "INC r/m", "encoding": {"format": "Legacy", "hex_opcode": "FF /0", "visual_parts": [], "binary_pattern": "FF | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}], "description": "Increments operand by 1 and stores result in operand. Sets OF, SF, ZF, AF, PF; does not affect CF. Supports 8/16/32/64-bit operand sizes in all modes. Useful for loop counters and pointer arithmetic.", "pseudocode": "result ← dest + 1; dest ← result; OF ← overflow; ZF ← (result == 0); SF ← (result < 0); AF ← (result & 0xF); PF ← parity(result)", "example": "INC rbx"}
{"mnemonic": "dec", "architecture": "x86", "full_name": "Decrement", "summary": "Decrements the operand by 1.", "syntax": "DEC r/m", "encoding": {"format": "Legacy", "hex_opcode": "FF /1", "visual_parts": [], "binary_pattern": "FF | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}], "description": "Decrements operand by 1 and stores result in operand. Sets OF, SF, ZF, AF, PF; does not affect CF. Supports 8/16/32/64-bit operand sizes in all modes. Commonly used in loop control.", "pseudocode": "result ← dest - 1; dest ← result; OF ← overflow; ZF ← (result == 0); SF ← (result < 0); AF ← (result & 0xF); PF ← parity(result)", "example": "DEC rbx"}
{"mnemonic": "mul", "architecture": "x86", "full_name": "Unsigned Multiply", "summary": "Unsigned multiply (AX = AL * src).", "syntax": "MUL r/m", "encoding": {"format": "Legacy", "hex_opcode": "F7 /4", "visual_parts": [], "binary_pattern": "F7 | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}], "description": "Performs unsigned multiplication of accumulator (AL/AX/EAX/RAX) by operand, storing result in AX/DX:AX/EDX:EAX/RDX:RAX respectively. Sets CF and OF if product overflows accumulator width; other flags undefined. High byte/word/dword/qword of result goes into AH/DX/EDX/RDX.", "pseudocode": "if (operand_width == 8) { product ← AL * src; AX ← product; CF ← OF ← (AH != 0); } else if (operand_width == 16) { product ← AX * src; DX:AX ← product; CF ← OF ← (DX != 0); } else if (operand_width == 32) { product ← EAX * src; EDX:EAX ← product; CF ← OF ← (EDX != 0); } else { product ← RAX * src; RDX:RAX ← product; CF ← OF ← (RDX != 0); }", "example": "MUL rbx"}
{"mnemonic": "imul", "architecture": "x86", "full_name": "Signed Multiply", "summary": "Signed multiply.", "syntax": "IMUL r, r/m", "encoding": {"format": "Legacy", "hex_opcode": "0F AF", "visual_parts": [], "binary_pattern": "0F | AF", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Performs signed multiplication of destination register by source operand, storing result in destination. Sets OF and CF if result overflows destination width; SF, ZF, AF, PF undefined. Two-operand form (dest ← dest * src) is commonly used for scalar multiplies; one-operand form multiplies into EDX:EAX.", "pseudocode": "result ← dest * src; dest ← result; if (result overflows dest width) { CF ← 1; OF ← 1; } else { CF ← 0; OF ← 0; }", "example": "IMUL rax, rbx"}
{"mnemonic": "div", "architecture": "x86", "full_name": "Unsigned Divide", "summary": "Unsigned divide (AX / src).", "syntax": "DIV r/m", "encoding": {"format": "Legacy", "hex_opcode": "F7 /6", "visual_parts": [], "binary_pattern": "F7 | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}], "description": "Performs unsigned division of accumulator (AX/DX:AX/EDX:EAX/RDX:RAX) by operand, storing quotient in AL/AX/EAX/RAX and remainder in AH/DX/EDX/RDX respectively. All flags undefined after division. Raises #DE exception if divisor is zero or quotient overflows.", "pseudocode": "if (operand_width == 8) { quotient ← AX / src; remainder ← AX mod src; AL ← quotient; AH ← remainder; } else if (operand_width == 16) { quotient ← DX:AX / src; remainder ← DX:AX mod src; AX ← quotient; DX ← remainder; } else if (operand_width == 32) { quotient ← EDX:EAX / src; remainder ← EDX:EAX mod src; EAX ← quotient; EDX ← remainder; } else { quotient ← RDX:RAX / src; remainder ← RDX:RAX mod src; RAX ← quotient; RDX ← remainder; }", "example": "DIV rbx"}
{"mnemonic": "idiv", "architecture": "x86", "full_name": "Signed Divide", "summary": "Signed divide (AX / src).", "syntax": "IDIV r/m", "encoding": {"format": "Legacy", "hex_opcode": "F7 /7", "visual_parts": [], "binary_pattern": "F7 | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}], "description": "Performs signed division of the implicit accumulator (EDX:EAX for 32-bit or RDX:RAX for 64-bit) by the specified operand; quotient is stored in EAX/RAX and remainder in EDX/RDX. Sets OF, SF, ZF, AF, CF, and PF to undefined values; raises #DE exception if divisor is zero or quotient overflows. Available in 8-bit (AX/AL:AH), 16-bit (DX:AX), 32-bit, and 64-bit variants.", "pseudocode": "if (src == 0) raise #DE;\ntemp_dividend = (src_size == 8) ? AX : ((src_size == 16) ? (DX:AX) : ((src_size == 32) ? (EDX:EAX) : (RDX:RAX)));\nif ((temp_dividend / src) > max_signed || (temp_dividend / src) < min_signed) raise #DE;\nquotient = temp_dividend / src;\nremainder = temp_dividend % src;\nif (src_size == 8) { AL ← quotient; AH ← remainder; }\nelse if (src_size == 16) { AX ← quotient; DX ← remainder; }\nelse if (src_size == 32) { EAX ← quotient; EDX ← remainder; }\nelse { RAX ← quotient; RDX ← remainder; }\nOF ← undefined; SF ← undefined; ZF ← undefined; AF ← undefined; CF ← undefined; PF ← undefined;", "example": "IDIV rbx"}
{"mnemonic": "not", "architecture": "x86", "full_name": "One's Complement Negation", "summary": "Reverses bits of operand.", "syntax": "NOT r/m", "encoding": {"format": "Legacy", "hex_opcode": "F7 /2", "visual_parts": [], "binary_pattern": "F7 | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}], "description": "Performs one's complement (bitwise negation) on the operand, inverting all bits and storing the result back. Does not affect any flags. Available in 8/16/32/64-bit variants.", "pseudocode": "dest ← ~dest;", "example": "NOT rbx"}
{"mnemonic": "neg", "architecture": "x86", "full_name": "Two's Complement Negation", "summary": "Negates value (0 - operand).", "syntax": "NEG r/m", "encoding": {"format": "Legacy", "hex_opcode": "F7 /3", "visual_parts": [], "binary_pattern": "F7 | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}], "description": "Performs two's complement negation (0 - operand), storing the result back in the operand. Sets/clears CF, OF, ZF, SF, AF, PF based on result; CF is set unless operand was zero. Available in 8/16/32/64-bit variants.", "pseudocode": "old_operand ← dest;\nresult ← 0 - dest;\ndest ← result;\nCF ← (old_operand != 0);\nOF ← (old_operand == (1 << (operand_size * 8 - 1)));\nZF ← (result == 0);\nSF ← (result & sign_bit) != 0;\nPF ← popcount(result & 0xFF) % 2 == 0;\nAF ← ((0 - old_operand) & 0x10) != (old_operand & 0x10);", "example": "NEG rbx"}
{"mnemonic": "shl", "architecture": "x86", "full_name": "Shift Logical Left", "summary": "Shifts bits left (same as SAL).", "syntax": "SHL r/m, imm8", "encoding": {"format": "Legacy", "hex_opcode": "C1 /4", "visual_parts": [], "binary_pattern": "C1 | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts the bits of the destination operand left by the count specified in the immediate operand, filling vacated bits with zeros; leftmost bit is shifted into CF. Sets CF and OF based on shift; ZF, SF, PF reflect the result. Available in 8/16/32/64-bit variants; count is typically 1 or specified by imm8.", "pseudocode": "if (count == 0) return;\ntemp ← dest;\nCF ← (dest >> (operand_size * 8 - count)) & 1;\nresult ← dest << count;\nOF ← (result & sign_bit) != (temp & sign_bit);\nZF ← (result == 0);\nSF ← (result & sign_bit) != 0;\nPF ← popcount(result & 0xFF) % 2 == 0;\ndest ← result;", "example": "SHL rbx, 3"}
{"mnemonic": "shr", "architecture": "x86", "full_name": "Shift Logical Right", "summary": "Shifts bits right, filling with zeros.", "syntax": "SHR r/m, imm8", "encoding": {"format": "Legacy", "hex_opcode": "C1 /5", "visual_parts": [], "binary_pattern": "C1 | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts the bits of the destination operand right by the count specified in the immediate operand, filling vacated bits with zeros; rightmost bit is shifted into CF. Sets CF and OF based on shift; ZF, SF, PF reflect the result. Available in 8/16/32/64-bit variants; count is typically 1 or specified by imm8.", "pseudocode": "if (count == 0) return;\ntemp ← dest;\nCF ← (dest >> (count - 1)) & 1;\nresult ← dest >> count;\nOF ← (temp & sign_bit);\nZF ← (result == 0);\nSF ← 0;\nPF ← popcount(result & 0xFF) % 2 == 0;\ndest ← result;", "example": "SHR rbx, 3"}
{"mnemonic": "sar", "architecture": "x86", "full_name": "Shift Arithmetic Right", "summary": "Shifts bits right, preserving sign bit.", "syntax": "SAR r/m, imm8", "encoding": {"format": "Legacy", "hex_opcode": "C1 /7", "visual_parts": [], "binary_pattern": "C1 | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts the bits of the destination operand right by the number of bits specified in the source operand, with the sign bit (MSB) replicated into vacated positions, preserving the sign of the value. The Carry Flag is set to the last bit shifted out. Available in 8/16/32/64-bit variants; OF is undefined when count > 1.", "pseudocode": "shift_count ← src\ntemp ← dest\nfor i ← 0 to shift_count - 1 do\n  CF ← temp[0]\n  temp ← (sign_extend(temp[width-1]) << (width-1)) | (temp >> 1)\ndest ← temp\nif shift_count == 1 then\n  OF ← 0\nelse if shift_count > 1 then\n  OF ← undefined\nZF ← (dest == 0)\nSF ← dest[width-1]\nPF ← parity(dest)", "example": "SAR rbx, 3"}
{"mnemonic": "jmp", "architecture": "x86", "full_name": "Jump", "summary": "Unconditional jump to target.", "syntax": "JMP rel", "encoding": {"format": "Legacy", "hex_opcode": "EB CB", "visual_parts": [], "binary_pattern": "EB | E9", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Performs an unconditional jump by adding the sign-extended relative offset to the instruction pointer (EIP/RIP). Available in 8-bit relative (EB opcode, -128 to +127) and 32-bit relative (E9 opcode) variants. No flags are affected.", "pseudocode": "if operand_size == 8 then\n  RIP ← RIP + sign_extend_8(rel8)\nelse if operand_size == 32 then\n  RIP ← RIP + sign_extend_32(rel32)\n// In 64-bit mode, RIP is the canonical form of EIP", "example": "JMP 0x401000  ; Jump to address\nJMP label     ; Jump to label"}
{"mnemonic": "je", "architecture": "x86", "full_name": "Jump if Equal", "summary": "Jump if ZF=1 (Same as JZ).", "syntax": "JE rel", "encoding": {"format": "Legacy", "hex_opcode": "74", "visual_parts": [], "binary_pattern": "74", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Jumps to the target if the Zero Flag is set (ZF=1), indicating the result of a prior comparison or arithmetic operation was zero. Available in 8-bit relative form (opcode 74). No flags are affected by the jump itself; the jump condition is determined by previously set flags.", "pseudocode": "if ZF == 1 then\n  RIP ← RIP + sign_extend_8(rel8)\nelse\n  RIP ← RIP + 1  // no jump, continue to next instruction", "example": "JE rel"}
{"mnemonic": "jne", "architecture": "x86", "full_name": "Jump if Not Equal", "summary": "Jump if ZF=0 (Same as JNZ).", "syntax": "JNE rel", "encoding": {"format": "Legacy", "hex_opcode": "75", "visual_parts": [], "binary_pattern": "75", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Jumps to the target if the Zero Flag is clear (ZF=0), indicating the result of a prior comparison or arithmetic operation was non-zero. Available in 8-bit relative form (opcode 75). No flags are affected by the jump itself; the jump condition is determined by previously set flags.", "pseudocode": "if ZF == 0 then\n  RIP ← RIP + sign_extend_8(rel8)\nelse\n  RIP ← RIP + 1  // no jump, continue to next instruction", "example": "JNE rel"}
{"mnemonic": "jg", "architecture": "x86", "full_name": "Jump if Greater", "summary": "Jump if ZF=0 and SF=OF (Signed >).", "syntax": "JG rel", "encoding": {"format": "Legacy", "hex_opcode": "7F", "visual_parts": [], "binary_pattern": "7F", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Jumps to the target if the Zero Flag is clear and Sign Flag equals Overflow Flag (ZF=0 AND SF=OF), indicating a signed arithmetic result is greater than zero. Available in 8-bit relative form (opcode 7F). No flags are affected by the jump itself; the jump condition depends on previously set flags.", "pseudocode": "if (ZF == 0) AND (SF == OF) then\n  RIP ← RIP + sign_extend_8(rel8)\nelse\n  RIP ← RIP + 1  // no jump, continue to next instruction", "example": "JG rel"}
{"mnemonic": "jl", "architecture": "x86", "full_name": "Jump if Less", "summary": "Jump if SF!=OF (Signed <).", "syntax": "JL rel", "encoding": {"format": "Legacy", "hex_opcode": "7C", "visual_parts": [], "binary_pattern": "7C", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Jumps to the target if Sign Flag does not equal Overflow Flag (SF≠OF), indicating a signed arithmetic result is less than zero. Available in 8-bit relative form (opcode 7C). No flags are affected by the jump itself; the jump condition depends on previously set flags.", "pseudocode": "if SF != OF then\n  RIP ← RIP + sign_extend_8(rel8)\nelse\n  RIP ← RIP + 1  // no jump, continue to next instruction", "example": "JL rel"}
{"mnemonic": "ja", "architecture": "x86", "full_name": "Jump if Above", "summary": "Jump if CF=0 and ZF=0 (Unsigned >).", "syntax": "JA rel", "encoding": {"format": "Legacy", "hex_opcode": "77", "visual_parts": [], "binary_pattern": "77", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Performs a conditional jump to the target address if the previous comparison or arithmetic operation resulted in an unsigned greater-than condition (CF=0 AND ZF=0). This instruction is commonly used after unsigned comparisons (CMP) to branch based on the above condition. No flags are modified by this instruction; it only reads CF and ZF to determine the jump condition.", "pseudocode": "if (CF == 0 && ZF == 0) { RIP ← RIP + sign_extend(rel); }", "example": "JA rel"}
{"mnemonic": "jb", "architecture": "x86", "full_name": "Jump if Below", "summary": "Jump if CF=1 (Unsigned <).", "syntax": "JB rel", "encoding": {"format": "Legacy", "hex_opcode": "72", "visual_parts": [], "binary_pattern": "72", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Performs a conditional jump to the target address if the carry flag is set (CF=1), indicating an unsigned less-than condition from the previous operation. Commonly used after unsigned CMP or arithmetic operations to branch on the below condition. No flags are modified; the instruction only reads CF.", "pseudocode": "if (CF == 1) { RIP ← RIP + sign_extend(rel); }", "example": "JB rel"}
{"mnemonic": "call", "architecture": "x86", "full_name": "Call Procedure", "summary": "Push EIP/RIP and jump to target.", "syntax": "CALL rel", "encoding": {"format": "Legacy", "hex_opcode": "E8", "visual_parts": [], "binary_pattern": "E8", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Pushes the return address (next instruction pointer) onto the stack and jumps to the target procedure. In 32-bit mode, EIP is pushed; in 64-bit mode, RIP is pushed. This instruction does not modify any arithmetic flags but causes implicit stack manipulation and memory writes. Control flow changes to the called procedure.", "pseudocode": "if (64-bit mode) { RSP ← RSP - 8; [RSP] ← RIP + instruction_length; RIP ← RIP + sign_extend(rel); } else { ESP ← ESP - 4; [ESP] ← EIP + instruction_length; EIP ← EIP + sign_extend(rel); }", "example": "CALL rel"}
{"mnemonic": "ret", "architecture": "x86", "full_name": "Return from Procedure", "summary": "Pop EIP/RIP and resume execution.", "syntax": "RET", "encoding": {"format": "Legacy", "hex_opcode": "C3", "visual_parts": [], "binary_pattern": "C3", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Pops the return address from the stack and resumes execution at that address, effectively returning from a procedure called with CALL. In 32-bit mode, EIP is popped; in 64-bit mode, RIP is popped. No flags are modified. This instruction performs implicit stack manipulation and a memory read.", "pseudocode": "if (64-bit mode) { RIP ← [RSP]; RSP ← RSP + 8; } else { EIP ← [ESP]; ESP ← ESP + 4; }", "example": "RET"}
{"mnemonic": "push", "architecture": "x86", "full_name": "Push Word/Doubleword/Quadword Onto Stack", "summary": "Decrements SP and stores operand on stack.", "syntax": "PUSH r/m", "encoding": {"format": "Legacy", "hex_opcode": "FF /6", "length": "2+", "visual_parts": [], "binary_pattern": "FF | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "src", "desc": "Reg/Mem"}], "extension": "Base", "description": "Decrements the stack pointer (ESP in 32-bit mode, RSP in 64-bit mode) by the operand size and stores the operand value at the new stack pointer. The operand can be a register or memory location. No flags are modified; this instruction performs implicit stack pointer decrement and a memory write.", "pseudocode": "if (64-bit mode) { RSP ← RSP - 8; [RSP] ← src_value; } else { ESP ← ESP - 4; [ESP] ← src_value; }", "example": "PUSH rbx"}
{"mnemonic": "pop", "architecture": "x86", "full_name": "Pop Value from Stack", "summary": "Loads operand from stack and increments SP.", "syntax": "POP r/m", "encoding": {"format": "Legacy", "hex_opcode": "8F /0", "visual_parts": [], "binary_pattern": "8F | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}], "description": "Loads a value from the top of the stack into the destination operand and increments the stack pointer (ESP in 32-bit mode, RSP in 64-bit mode) by the operand size. The destination can be a register or memory location. No flags are modified; this instruction performs implicit stack pointer increment and a memory read.", "pseudocode": "if (64-bit mode) { dest_value ← [RSP]; RSP ← RSP + 8; } else { dest_value ← [ESP]; ESP ← ESP + 4; }", "example": "POP rbx"}
{"mnemonic": "lea", "architecture": "x86", "full_name": "Load Effective Address", "summary": "Computes effective address and stores in register.", "syntax": "LEA r, m", "encoding": {"format": "Legacy", "hex_opcode": "8D", "visual_parts": [], "binary_pattern": "8D", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Computes the effective address of the memory operand and stores it in the destination register without performing a memory access. This instruction is useful for address arithmetic and pointer calculations. No flags are modified by this instruction.", "pseudocode": "dest ← address_of(src)", "example": "LEA rax, [rbp-8]"}
{"mnemonic": "nop", "architecture": "x86", "full_name": "No Operation", "summary": "Does nothing (alias for XCHG EAX, EAX).", "syntax": "NOP", "encoding": {"format": "Legacy", "hex_opcode": "NP 90", "visual_parts": [], "binary_pattern": "90", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Performs no operation and consumes one clock cycle. The one-byte NOP (0x90) is functionally equivalent to XCHG EAX, EAX. Longer NOP sequences (multi-byte) are available on newer processors for code padding without pipeline stalls. No flags are modified.", "pseudocode": "// No operation (pipeline advance only)", "example": "NOP"}
{"mnemonic": "xchg", "architecture": "x86", "full_name": "Exchange Register/Memory with Register", "summary": "Exchanges content of two operands.", "syntax": "XCHG r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "87", "visual_parts": [], "binary_pattern": "87", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "r", "desc": "General-purpose register"}], "description": "Atomically exchanges the contents of two operands (register and register/memory or vice versa). The operation is performed with implicit locking semantics when one operand is memory, ensuring atomic behavior on multiprocessor systems. No flags are affected by this instruction.", "pseudocode": "temp ← dest; dest ← src; src ← temp;", "example": "XCHG rbx, rax"}
{"mnemonic": "cpuid", "architecture": "x86", "full_name": "CPU Identification", "summary": "Returns processor information based on EAX value.", "syntax": "CPUID", "encoding": {"format": "Legacy", "hex_opcode": "0F A2", "visual_parts": [], "binary_pattern": "0F | A2", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [], "description": "Executes CPU identification, returning processor feature information and capabilities into EAX, EBX, ECX, and EDX based on the input value in EAX (and sometimes ECX). This is a privileged instruction in some contexts and causes a serializing event; it clears the pipeline and blocks out-of-order execution until completion. The exact output depends on the EAX input leaf and subleaf (ECX) values.", "pseudocode": "EAX, EBX, ECX, EDX ← cpuid_data[EAX, ECX];", "example": "CPUID"}
{"mnemonic": "rdtsc", "architecture": "x86", "full_name": "Read Time-Stamp Counter", "summary": "Reads the time-stamp counter into EDX:EAX.", "syntax": "RDTSC", "encoding": {"format": "Legacy", "hex_opcode": "0F 31", "visual_parts": [], "binary_pattern": "0F | 31", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [], "description": "Reads the 64-bit time-stamp counter (TSC) and places the result in EDX:EAX, with EDX holding bits 63-32 and EAX holding bits 31-0. No flags are modified. This instruction is a serializing operation in some CPU implementations and may have variable latency; it is commonly used for performance measurement and requires appropriate privilege level or user-space access controls (managed by CR4.TSD).", "pseudocode": "EDX:EAX ← TimeStampCounter;", "example": "RDTSC"}
{"mnemonic": "movsx", "architecture": "x86", "full_name": "Move with Sign-Extension", "summary": "Copies and sign-extends a smaller value to a larger register.", "syntax": "MOVSX r, r/m", "encoding": {"format": "Legacy", "hex_opcode": "0F BE", "visual_parts": [], "binary_pattern": "0F | BE", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Moves a value from a smaller source operand (8, 16, or 32 bits) to a larger destination register, sign-extending the value to fill the destination width. The sign bit of the source is copied to all high-order bits of the destination. No flags are affected by this instruction. Supported size combinations: r16 ← r/m8, r32 ← r/m8, r32 ← r/m16, r64 ← r/m8, r64 ← r/m16, r64 ← r/m32.", "pseudocode": "sign_bit ← src[source_width - 1]; dest ← (source_width < dest_width) ? (sign_extend(src, sign_bit, dest_width)) : src;", "example": "MOVSX rax, rbx"}
{"mnemonic": "movzx", "architecture": "x86", "full_name": "Move with Zero-Extension", "summary": "Copies and zero-extends a smaller value to a larger register.", "syntax": "MOVZX r, r/m", "encoding": {"format": "Legacy", "hex_opcode": "0F B6", "visual_parts": [], "binary_pattern": "0F | B6", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Moves a value from a smaller source operand (8 or 16 bits) to a larger destination register, zero-extending the value to fill the destination width. All high-order bits of the destination beyond the source width are cleared to zero. No flags are affected by this instruction. Supported size combinations: r16 ← r/m8, r32 ← r/m8, r32 ← r/m16, r64 ← r/m8, r64 ← r/m16.", "pseudocode": "dest ← (source_width < dest_width) ? (zero_extend(src, dest_width)) : src;", "example": "MOVZX rax, rbx"}
{"mnemonic": "cwtl", "architecture": "x86", "full_name": "Convert Word to Long", "summary": "Sign-extends AX into EAX (also CWDE).", "syntax": "CWTL", "encoding": {"format": "Legacy", "hex_opcode": "98", "visual_parts": [], "binary_pattern": "98", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Sign-extends the 16-bit value in AX into the 32-bit register EAX; the sign bit of AX (bit 15) is copied to all high-order bits (31-16) of EAX, and EAX's low 16 bits (AX) remain unchanged. This is a zero-operand instruction with no flags modified. In 64-bit mode, CWDE is the canonical mnemonic and has the same behavior.", "pseudocode": "EAX[31:16] ← (AX[15]) ? 0xFFFF : 0x0000;", "example": "CWTL"}
{"mnemonic": "cltd", "architecture": "x86", "full_name": "Convert Long to Double Long", "summary": "Sign-extends EAX into EDX:EAX (also CDQ).", "syntax": "CLTD", "encoding": {"format": "Legacy", "hex_opcode": "99", "visual_parts": [], "binary_pattern": "99", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Sign-extends the 32-bit value in EAX into the 64-bit pair EDX:EAX; the sign bit of EAX (bit 31) is copied to all bits of EDX (bits 63-32), and EAX remains unchanged. This is a zero-operand instruction with no flags modified. In 64-bit mode, CDQ is the canonical mnemonic and has the same behavior. Commonly used before IDIV to prepare the dividend.", "pseudocode": "EDX ← (EAX[31]) ? 0xFFFFFFFF : 0x00000000;", "example": "CLTD"}
{"mnemonic": "cqto", "architecture": "x86", "full_name": "Convert Quadword to Octoword", "summary": "Sign-extends RAX into RDX:RAX (also CQO).", "syntax": "CQTO", "encoding": {"format": "Legacy", "hex_opcode": "REX.W + 99", "visual_parts": [], "binary_pattern": "48 | 99", "bit_positions": "+0 | +1"}, "extension": "Base (64-bit)", "operands": [], "description": "Sign-extends the 64-bit value in RAX into the 128-bit pair RDX:RAX (64-bit mode only); the sign bit of RAX (bit 63) is copied to all bits of RDX, and RAX remains unchanged. This is a zero-operand instruction with no flags modified. CQO is the canonical mnemonic for this operation. Commonly used before IDIV (64-bit) to prepare the dividend.", "pseudocode": "RDX ← (RAX[63]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000;", "example": "CQTO"}
{"mnemonic": "bswap", "architecture": "x86", "full_name": "Byte Swap", "summary": "Reverses the byte order of a register (Endian swap).", "syntax": "BSWAP r32", "encoding": {"format": "Legacy", "hex_opcode": "0F C8+rd", "visual_parts": [], "binary_pattern": "0F | C8+reg", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Reverses the byte order of a 32-bit register, converting between little-endian and big-endian representations. No flags are affected. This instruction requires 386+ and operates on 32-bit operands in protected and 64-bit modes; in 64-bit mode, a REX.W prefix extends it to 64-bit operands.", "pseudocode": "temp ← dest[0:7] || dest[8:15] || dest[16:23] || dest[24:31]\ndest ← dest[24:31] || dest[16:23] || dest[8:15] || temp", "example": "BSWAP eax"}
{"mnemonic": "xadd", "architecture": "x86", "full_name": "Exchange and Add", "summary": "Exchanges dest and src, then loads sum into dest.", "syntax": "XADD r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "0F C1", "visual_parts": [], "binary_pattern": "0F | C1", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "r", "desc": "General-purpose register"}], "description": "Exchanges the values of dest and src, then stores their sum into dest. Sets OF, SF, ZF, AF, CF, PF based on the addition result. Implicitly uses the accumulator (EAX/RAX) for implicit operand size determination. Available in 386+ with size variants 8/16/32/64-bit; used in multi-threaded code for atomic operations.", "pseudocode": "temp ← src\nsrc ← dest\ndest ← dest + temp\nflags ← set based on (dest + temp) result\nZF ← (dest == 0); CF ← carry_out; OF ← overflow; SF ← (dest & sign_bit) != 0; PF ← parity(dest); AF ← (((dest ^ temp) ^ result) & 0x10) != 0", "example": "XADD rbx, rax"}
{"mnemonic": "cmpxchg", "architecture": "x86", "full_name": "Compare and Exchange", "summary": "Compares accumulator with dest; if equal, dest = src; else accumulator = dest.", "syntax": "CMPXCHG r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "0F B1", "visual_parts": [], "binary_pattern": "0F | B1", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "r", "desc": "General-purpose register"}], "description": "Compares an implicit accumulator (AL/AX/EAX/RAX) with dest; if equal, src is written to dest and ZF is set; otherwise dest is written to the accumulator and ZF is cleared. Sets OF, SF, ZF, AF, CF, PF based on the comparison. Available in 386+ with size variants 8/16/32/64-bit; used for atomic compare-and-swap operations in lock-free code.", "pseudocode": "if (size == 8) {\n  if (AL == dest) { dest ← src; ZF ← 1; } else { AL ← dest; ZF ← 0; }\n} else if (size == 16) {\n  if (AX == dest) { dest ← src; ZF ← 1; } else { AX ← dest; ZF ← 0; }\n} else if (size == 32) {\n  if (EAX == dest) { dest ← src; ZF ← 1; } else { EAX ← dest; ZF ← 0; }\n} else { /* size == 64 */\n  if (RAX == dest) { dest ← src; ZF ← 1; } else { RAX ← dest; ZF ← 0; }\n}\nOF, SF, AF, CF, PF ← undefined (or set by comparison result)", "example": "CMPXCHG rbx, rax"}
{"mnemonic": "cmovcc", "architecture": "x86", "full_name": "Conditional Move", "summary": "Moves data if condition code is met (e.g., CMOVE, CMOVNE).", "syntax": "CMOVcc r, r/m", "encoding": {"format": "Legacy", "hex_opcode": "0F 40 /r", "visual_parts": [], "binary_pattern": "0F", "bit_positions": "+0"}, "extension": "CMOV", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Conditionally moves src to dest if the specified condition code (based on EFLAGS) is true; otherwise dest is unchanged. No flags are modified. Available in P6+ processors (CMOV extension) with size variants 16/32/64-bit; eliminates branch mispredictions in conditional data flow.", "pseudocode": "if (condition_code) {\n  dest ← src\n}\n/* EFLAGS unchanged */", "example": "CMOVcc rax, rbx"}
{"mnemonic": "setcc", "architecture": "x86", "full_name": "Set Byte on Condition", "summary": "Sets byte to 1 if condition met, else 0 (e.g., SETE, SETZ).", "syntax": "SETcc r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 90", "visual_parts": [], "binary_pattern": "0F", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the byte at dest to 1 if the specified condition code (based on EFLAGS) is true, otherwise sets it to 0. No other flags are affected. Available in 386+ with 8-bit size only; condition codes include SETE, SETNE, SETL, SETG, SETA, SETB, etc.", "pseudocode": "if (condition_code) {\n  dest[0:7] ← 0xFF\n} else {\n  dest[0:7] ← 0x00\n}\n/* EFLAGS unchanged */", "example": "SETcc bl"}
{"mnemonic": "hlt", "architecture": "x86", "full_name": "Halt", "summary": "Stops instruction execution and places processor in HALT state.", "syntax": "HLT", "encoding": {"format": "Legacy", "hex_opcode": "F4", "visual_parts": [], "binary_pattern": "F4", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Stops instruction execution and places the processor in a HALT state, waiting for an external interrupt or reset. Requires privilege level 0 (kernel mode); attempting HLT in user mode raises a #GP exception. No flags are affected. Used in idle loops and system shutdown sequences.", "pseudocode": "halt_cpu()\n/* Wait for external interrupt or reset */", "example": "HLT"}
{"mnemonic": "int", "architecture": "x86", "full_name": "Interrupt", "summary": "Calls to interrupt procedure.", "syntax": "INT imm8", "encoding": {"format": "Legacy", "hex_opcode": "CD ib", "visual_parts": [], "binary_pattern": "CD", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Invokes an interrupt handler identified by the 8-bit vector. Pushes EFLAGS (or RFLAGS), CS, and EIP (or RIP) onto the stack, then transfers control to the interrupt handler. Privilege level checked; IF flag is cleared upon entry. Available in all modes with different stack/address behaviors in real vs. protected vs. 64-bit mode.", "pseudocode": "if (mode == 64) {\n  RSP ← RSP - 8; [RSP] ← RFLAGS\n  RSP ← RSP - 8; [RSP] ← CS\n  RSP ← RSP - 8; [RSP] ← RIP\n} else {\n  ESP ← ESP - 4; [ESP] ← EFLAGS\n  ESP ← ESP - 4; [ESP] ← CS\n  ESP ← ESP - 4; [ESP] ← EIP\n}\nCS:RIP ← IDT[imm8]\nIF ← 0\nTF ← 0", "example": "INT 3"}
{"mnemonic": "int3", "architecture": "x86", "full_name": "Breakpoint", "summary": "Calls to interrupt vector 3 (Debugger breakpoint).", "syntax": "INT3", "encoding": {"format": "Legacy", "hex_opcode": "CC", "visual_parts": [], "binary_pattern": "CC", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Invokes interrupt vector 3, which typically triggers a debugger breakpoint. Equivalent to INT 3 but encoded as a single byte (0xCC) for efficient inline breakpoint insertion. Pushes EFLAGS, CS, and EIP (or RFLAGS, CS, RIP in 64-bit mode) onto the stack. Available in all modes and privilege levels.", "pseudocode": "if (mode == 64) {\n  RSP ← RSP - 8; [RSP] ← RFLAGS\n  RSP ← RSP - 8; [RSP] ← CS\n  RSP ← RSP - 8; [RSP] ← RIP\n} else {\n  ESP ← ESP - 4; [ESP] ← EFLAGS\n  ESP ← ESP - 4; [ESP] ← CS\n  ESP ← ESP - 4; [ESP] ← EIP\n}\nCS:RIP ← IDT[3]\nIF ← 0\nTF ← 0", "example": "INT3"}
{"mnemonic": "ud2", "architecture": "x86", "full_name": "Undefined Instruction", "summary": "Generates an invalid opcode exception.", "syntax": "UD2", "encoding": {"format": "Legacy", "hex_opcode": "0F 0B", "visual_parts": [], "binary_pattern": "0F | 0B", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [], "description": "Generates an invalid opcode exception (#UD) unconditionally, causing the processor to raise a fault. This instruction has no operands and performs no other operation. It is commonly used for intentional traps, unreachable code markers, and testing exception handling.", "pseudocode": "raise InvalidOpcodeException()", "example": "UD2"}
{"mnemonic": "pause", "architecture": "x86", "full_name": "Spin Loop Hint", "summary": "Improves performance of spin-wait loops (alias for REP NOP).", "syntax": "PAUSE", "encoding": {"format": "Legacy", "hex_opcode": "F3 90", "visual_parts": [], "binary_pattern": "F3 | 90", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [], "description": "Provides a hint to the processor that the code is executing a spin-wait loop, improving power efficiency and reducing contention on shared memory buses without altering program logic. The instruction is semantically equivalent to REP NOP (F3 90 encoding) and executes as a very short delay; no flags are affected.", "pseudocode": "// Improves performance of spin-wait loops (alias for REP NOP)", "example": "PAUSE"}
{"mnemonic": "clc", "architecture": "x86", "full_name": "Clear Carry Flag", "summary": "Sets the CF flag to 0.", "syntax": "CLC", "encoding": {"format": "Legacy", "hex_opcode": "F8", "visual_parts": [], "binary_pattern": "F8", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Unconditionally clears the Carry Flag (CF) to 0. Only the CF flag is modified; all other flags and CPU state remain unchanged. Available in all modes (real, protected, and 64-bit).", "pseudocode": "CF ← 0", "example": "CLC"}
{"mnemonic": "stc", "architecture": "x86", "full_name": "Set Carry Flag", "summary": "Sets the CF flag to 1.", "syntax": "STC", "encoding": {"format": "Legacy", "hex_opcode": "F9", "visual_parts": [], "binary_pattern": "F9", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Unconditionally sets the Carry Flag (CF) to 1. Only the CF flag is modified; all other flags and CPU state remain unchanged. Available in all modes (real, protected, and 64-bit).", "pseudocode": "CF ← 1", "example": "STC"}
{"mnemonic": "cmc", "architecture": "x86", "full_name": "Complement Carry Flag", "summary": "Toggles the CF flag.", "syntax": "CMC", "encoding": {"format": "Legacy", "hex_opcode": "F5", "visual_parts": [], "binary_pattern": "F5", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Complements (toggles) the Carry Flag (CF): if CF=0 it becomes 1, and if CF=1 it becomes 0. Only the CF flag is modified; all other flags remain unchanged. Available in all modes (real, protected, and 64-bit).", "pseudocode": "CF ← NOT CF", "example": "CMC"}
{"mnemonic": "cld", "architecture": "x86", "full_name": "Clear Direction Flag", "summary": "Sets DF to 0 (String operations increment).", "syntax": "CLD", "encoding": {"format": "Legacy", "hex_opcode": "FC", "visual_parts": [], "binary_pattern": "FC", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Clears the Direction Flag (DF) to 0, causing string instructions (MOVS, SCAS, LODS, STOS, CMPS) to auto-increment the index registers (ESI/EDI or RSI/RDI) rather than decrement them. Only DF is modified; all other flags remain unchanged. Available in all modes.", "pseudocode": "DF ← 0", "example": "CLD"}
{"mnemonic": "std", "architecture": "x86", "full_name": "Set Direction Flag", "summary": "Sets DF to 1 (String operations decrement).", "syntax": "STD", "encoding": {"format": "Legacy", "hex_opcode": "FD", "visual_parts": [], "binary_pattern": "FD", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Sets the Direction Flag (DF) to 1, causing string instructions (MOVS, SCAS, LODS, STOS, CMPS) to auto-decrement the index registers (ESI/EDI or RSI/RDI) rather than increment them. Only DF is modified; all other flags remain unchanged. Available in all modes.", "pseudocode": "DF ← 1", "example": "STD"}
{"mnemonic": "cli", "architecture": "x86", "full_name": "Clear Interrupt Flag", "summary": "Disables maskable hardware interrupts.", "syntax": "CLI", "encoding": {"format": "Legacy", "hex_opcode": "FA", "visual_parts": [], "binary_pattern": "FA", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Clears the Interrupt Flag (IF) to 0, disabling maskable hardware interrupts (IRQ0-IRQ15) but not non-maskable interrupts (NMI) or exceptions. This instruction is privileged and requires CPL=0; execution in user mode raises a #GP exception. Available in protected and 64-bit modes.", "pseudocode": "IF ← 0  // Requires CPL = 0 (kernel mode)", "example": "CLI"}
{"mnemonic": "sti", "architecture": "x86", "full_name": "Set Interrupt Flag", "summary": "Enables maskable hardware interrupts.", "syntax": "STI", "encoding": {"format": "Legacy", "hex_opcode": "FB", "visual_parts": [], "binary_pattern": "FB", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Sets the Interrupt Flag (IF) in EFLAGS, enabling maskable hardware interrupts at the next instruction boundary. This is a privileged instruction that requires CPL=0 (kernel mode). The instruction takes effect after the next instruction executes, allowing one more instruction to complete before interrupts are actually serviced.", "pseudocode": "IF (CPL == 0) THEN IF ← 1; ELSE #GP(0); FI;", "example": "STI"}
{"mnemonic": "sahf", "architecture": "x86", "full_name": "Store AH into Flags", "summary": "Loads SF, ZF, AF, PF, and CF from AH.", "syntax": "SAHF", "encoding": {"format": "Legacy", "hex_opcode": "9E", "visual_parts": [], "binary_pattern": "9E", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Loads the lower byte of EFLAGS from the AH register, restoring flags CF, PF, AF, ZF, and SF. The upper bits of EFLAGS (IF, TF, DF, OF, NT, RF, VM, AC, VIF, VIP, ID) are unaffected. This is commonly used to restore previously saved flag state.", "pseudocode": "CF ← AH[0]; PF ← AH[2]; AF ← AH[4]; ZF ← AH[6]; SF ← AH[7];", "example": "SAHF"}
{"mnemonic": "lahf", "architecture": "x86", "full_name": "Load Flags into AH", "summary": "Loads bits 0, 2, 4, 6, and 7 of EFLAGS into AH.", "syntax": "LAHF", "encoding": {"format": "Legacy", "hex_opcode": "9F", "visual_parts": [], "binary_pattern": "9F", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Loads the lower byte of EFLAGS into the AH register, extracting flags CF, PF, AF, ZF, and SF. Bits 1, 3, and 5 are set to 0, bit 7 contains SF, and bits 0, 2, 4, 6 contain CF, PF, AF, ZF respectively. This is commonly used to save flag state for later restoration with SAHF.", "pseudocode": "AH ← 0; AH[0] ← CF; AH[2] ← PF; AH[4] ← AF; AH[6] ← ZF; AH[7] ← SF;", "example": "LAHF"}
{"mnemonic": "loop", "architecture": "x86", "full_name": "Loop", "summary": "Decrements ECX/RCX and jumps if not zero.", "syntax": "LOOP rel", "encoding": {"format": "Legacy", "hex_opcode": "E2", "visual_parts": [], "binary_pattern": "E2", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Decrements the count register (ECX in 32-bit mode, RCX in 64-bit mode) and jumps to the destination if the count is non-zero. Does not set any flags; it only reads the decremented value to determine branch condition. In 64-bit mode, LOOP with a 32-bit operand-size prefix uses ECX (with implicit ZX of RCX).", "pseudocode": "count ← (MODE64 ? RCX : ECX); count ← count - 1; IF (MODE64) RCX ← count; ELSE ECX ← count; IF (count != 0) THEN IP ← IP + sign_extend(rel8); FI;", "example": "LOOP rel"}
{"mnemonic": "loope", "architecture": "x86", "full_name": "Loop if Equal", "summary": "Decrements count; jumps if count!=0 and ZF=1.", "syntax": "LOOPE rel", "encoding": {"format": "Legacy", "hex_opcode": "E1", "visual_parts": [], "binary_pattern": "E1", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Decrements the count register (ECX/RCX) and jumps to destination if count is non-zero AND the Zero Flag is set. Combines loop counting with a zero-flag condition, useful for scanning arrays until an element matches or count exhausted. No flags are modified by this instruction.", "pseudocode": "count ← (MODE64 ? RCX : ECX); count ← count - 1; IF (MODE64) RCX ← count; ELSE ECX ← count; IF ((count != 0) ∧ (ZF == 1)) THEN IP ← IP + sign_extend(rel8); FI;", "example": "LOOPE rel"}
{"mnemonic": "loopne", "architecture": "x86", "full_name": "Loop if Not Equal", "summary": "Decrements count; jumps if count!=0 and ZF=0.", "syntax": "LOOPNE rel", "encoding": {"format": "Legacy", "hex_opcode": "E0", "visual_parts": [], "binary_pattern": "E0", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Decrements the count register (ECX/RCX) and jumps to destination if count is non-zero AND the Zero Flag is clear. Combines loop counting with a non-zero-flag condition, useful for scanning arrays until an element matches or count exhausted. No flags are modified by this instruction.", "pseudocode": "count ← (MODE64 ? RCX : ECX); count ← count - 1; IF (MODE64) RCX ← count; ELSE ECX ← count; IF ((count != 0) ∧ (ZF == 0)) THEN IP ← IP + sign_extend(rel8); FI;", "example": "LOOPNE rel"}
{"mnemonic": "jecxz", "architecture": "x86", "full_name": "Jump if ECX is Zero", "summary": "Jumps if ECX register is 0.", "syntax": "JECXZ rel", "encoding": {"format": "Legacy", "hex_opcode": "E3", "visual_parts": [], "binary_pattern": "E3", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Jumps to the destination if ECX register is zero (or RCX in 64-bit mode when used with REX.W). Unlike LOOP variants, this instruction does not modify any register or flag; it only tests the count value. In 64-bit mode, the non-REX.W form still checks ECX (32-bit).", "pseudocode": "IF (MODE64 ∧ REX.W) THEN IF (RCX == 0) THEN IP ← IP + sign_extend(rel8); FI; ELSE IF (ECX == 0) THEN IP ← IP + sign_extend(rel8); FI; FI;", "example": "JECXZ rel"}
{"mnemonic": "enter", "architecture": "x86", "full_name": "Make Stack Frame", "summary": "Creates a stack frame for procedure parameters.", "syntax": "ENTER imm16, imm8", "encoding": {"format": "Legacy", "hex_opcode": "C8", "visual_parts": [], "binary_pattern": "C8", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "imm16", "desc": "16-bit immediate"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Creates a stack frame for a procedure call by pushing RBP/EBP and allocating local variable space, supporting nested frames via the nesting level (imm8). The size (imm16) specifies bytes to allocate; nesting level controls how many prior frame pointers are copied. No flags are affected. High nesting levels serialize execution due to repeated memory operations.", "pseudocode": "push_size ← (OPSIZE == 16 ? 2 : 8); level ← imm8 & 0x1F; size ← imm16; SP ← SP - push_size; [SP] ← BP; frame_ptr ← SP; IF (level > 0) THEN FOR i ← 1 TO level-1 DO BP ← BP - push_size; SP ← SP - push_size; [SP] ← [BP]; OD; SP ← SP - push_size; [SP] ← frame_ptr; FI; BP ← frame_ptr; SP ← SP - size;", "example": "ENTER 0x100, 3"}
{"mnemonic": "leave", "architecture": "x86", "full_name": "High Level Procedure Exit", "summary": "Releases stack frame (MOV ESP, EBP; POP EBP).", "syntax": "LEAVE", "encoding": {"format": "Legacy", "hex_opcode": "C9", "visual_parts": [], "binary_pattern": "C9", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Releases the current stack frame by copying the base pointer (EBP/RBP) to the stack pointer (ESP/RSP), then pops the saved base pointer from the stack. This is the inverse of ENTER and restores the caller's frame pointer. No flags are affected. Valid in 16/32/64-bit modes; in 64-bit mode it operates on RBP/RSP.", "pseudocode": "if (OperandSize == 64) {\n  RSP ← RBP;\n  RBP ← [RSP];\n  RSP ← RSP + 8;\n} else if (OperandSize == 32) {\n  ESP ← EBP;\n  EBP ← [ESP];\n  ESP ← ESP + 4;\n} else {\n  SP ← BP;\n  BP ← [SP];\n  SP ← SP + 2;\n}", "example": "LEAVE"}
{"mnemonic": "rep movs", "architecture": "x86", "full_name": "Repeat Move String", "summary": "Moves ECX bytes/words from [ESI] to [EDI].", "syntax": "REP MOVS m, m", "encoding": {"format": "Legacy", "hex_opcode": "F3 A4", "visual_parts": [], "binary_pattern": "F3", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "MOVS m", "desc": "Implicit memory for MOVS: ES:[DI] destination, DS:[SI] source"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Copies ECX/RCX bytes or words from the memory location at DS:[ESI/RSI] to ES:[EDI/RDI], decrementing or incrementing the pointers based on the Direction Flag (DF), and decrementing the counter. Repeats until RCX=0 or an interrupt occurs. No flags are modified by the instruction itself, though DF controls direction. The REP prefix causes automatic looping at the microarchitectural level.", "pseudocode": "while (RCX != 0) {\n  if (OperandSize == 8) {\n    [RDI] ← [RSI];\n    if (DF == 0) { RSI ← RSI + 1; RDI ← RDI + 1; } else { RSI ← RSI - 1; RDI ← RDI - 1; }\n  } else if (OperandSize == 16) {\n    [RDI] ← [RSI];\n    if (DF == 0) { RSI ← RSI + 2; RDI ← RDI + 2; } else { RSI ← RSI - 2; RDI ← RDI - 2; }\n  } else {\n    [RDI] ← [RSI];\n    if (DF == 0) { RSI ← RSI + 4; RDI ← RDI + 4; } else { RSI ← RSI - 4; RDI ← RDI - 4; }\n  }\n  RCX ← RCX - 1;\n}", "example": "REP MOVS m, [rbp-8]"}
{"mnemonic": "rep stos", "architecture": "x86", "full_name": "Repeat Store String", "summary": "Fills [EDI] with AL/AX/EAX for ECX repeats.", "syntax": "REP STOS m", "encoding": {"format": "Legacy", "hex_opcode": "F3 AA", "visual_parts": [], "binary_pattern": "F3", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "STOS m", "desc": "Implicit memory destination for STOS (ES:[DI])"}], "description": "Stores the value in AL/AX/EAX/RAX into memory at ES:[RDI] repeatedly, incrementing or decrementing RDI based on the Direction Flag, and decrementing RCX until the counter reaches zero. No flags are modified. The REP prefix enables automatic looping in hardware.", "pseudocode": "while (RCX != 0) {\n  if (OperandSize == 8) {\n    [RDI] ← AL;\n    if (DF == 0) { RDI ← RDI + 1; } else { RDI ← RDI - 1; }\n  } else if (OperandSize == 16) {\n    [RDI] ← AX;\n    if (DF == 0) { RDI ← RDI + 2; } else { RDI ← RDI - 2; }\n  } else if (OperandSize == 32) {\n    [RDI] ← EAX;\n    if (DF == 0) { RDI ← RDI + 4; } else { RDI ← RDI - 4; }\n  } else {\n    [RDI] ← RAX;\n    if (DF == 0) { RDI ← RDI + 8; } else { RDI ← RDI - 8; }\n  }\n  RCX ← RCX - 1;\n}", "example": "REP STOS m"}
{"mnemonic": "repe cmps", "architecture": "x86", "full_name": "Repeat Compare String Equal", "summary": "Compares [ESI] and [EDI] until mismatch or ECX=0.", "syntax": "REPE CMPS m, m", "encoding": {"format": "Legacy", "hex_opcode": "F3 A6", "visual_parts": [], "binary_pattern": "F3", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "CMPS m", "desc": "Implicit memory for CMPS string compare (DS:[SI] vs ES:[DI])"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Compares bytes or words at DS:[RSI] with ES:[RDI], setting flags as if by a SUB instruction, and repeats while the Zero Flag is set (operands equal) and RCX > 0. Stops on mismatch, RCX=0, or interrupt. Flags OF, SF, ZF, AF, CF, PF are set based on the comparison result.", "pseudocode": "while (RCX != 0) {\n  if (OperandSize == 8) {\n    result ← [RSI] - [RDI];\n    if (DF == 0) { RSI ← RSI + 1; RDI ← RDI + 1; } else { RSI ← RSI - 1; RDI ← RDI - 1; }\n  } else if (OperandSize == 16) {\n    result ← [RSI] - [RDI];\n    if (DF == 0) { RSI ← RSI + 2; RDI ← RDI + 2; } else { RSI ← RSI - 2; RDI ← RDI - 2; }\n  } else {\n    result ← [RSI] - [RDI];\n    if (DF == 0) { RSI ← RSI + 4; RDI ← RDI + 4; } else { RSI ← RSI - 4; RDI ← RDI - 4; }\n  }\n  RCX ← RCX - 1;\n  OF ← OverflowFlag(result); SF ← SignBit(result); ZF ← (result == 0); AF ← AuxiliaryFlag(result); CF ← CarryFlag(result); PF ← ParityFlag(result);\n  if (ZF == 0) break;\n}", "example": "REPE CMPS m, [rbp-8]"}
{"mnemonic": "repne scas", "architecture": "x86", "full_name": "Repeat Scan String Not Equal", "summary": "Scans [EDI] for AL/AX/EAX until match or ECX=0.", "syntax": "REPNE SCAS m", "encoding": {"format": "Legacy", "hex_opcode": "F2 AE", "visual_parts": [], "binary_pattern": "F2", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "SCAS m", "desc": "Implicit memory for SCAS (compare accumulator with ES:[DI])"}], "description": "Scans memory at ES:[RDI] for a match with AL/AX/EAX/RAX, setting flags by subtraction, and repeats while the Zero Flag is clear (no match) and RCX > 0. Stops on a match, RCX=0, or interrupt. Flags OF, SF, ZF, AF, CF, PF are set based on the comparison.", "pseudocode": "while (RCX != 0) {\n  if (OperandSize == 8) {\n    result ← AL - [RDI];\n    if (DF == 0) { RDI ← RDI + 1; } else { RDI ← RDI - 1; }\n  } else if (OperandSize == 16) {\n    result ← AX - [RDI];\n    if (DF == 0) { RDI ← RDI + 2; } else { RDI ← RDI - 2; }\n  } else if (OperandSize == 32) {\n    result ← EAX - [RDI];\n    if (DF == 0) { RDI ← RDI + 4; } else { RDI ← RDI - 4; }\n  } else {\n    result ← RAX - [RDI];\n    if (DF == 0) { RDI ← RDI + 8; } else { RDI ← RDI - 8; }\n  }\n  RCX ← RCX - 1;\n  OF ← OverflowFlag(result); SF ← SignBit(result); ZF ← (result == 0); AF ← AuxiliaryFlag(result); CF ← CarryFlag(result); PF ← ParityFlag(result);\n  if (ZF == 1) break;\n}", "example": "REPNE SCAS m"}
{"mnemonic": "rol", "architecture": "x86", "full_name": "Rotate Left", "summary": "Rotates bits left.", "syntax": "ROL r/m, imm8", "encoding": {"format": "Legacy", "hex_opcode": "C1 /0", "visual_parts": [], "binary_pattern": "C1 | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rotates the bits in the destination operand left by the number of bit positions specified in the source (immediate or CL register), with the leftmost bit wrapping to the rightmost position. The Carry Flag is set to the bit shifted out; Overflow Flag is set only if the operation rotates by 1 and the sign bit changed. No other flags are affected for rotations > 1.", "pseudocode": "shift_count ← src & ((OperandSize * 8) - 1);\nif (shift_count == 0) { CF ← undefined; OF ← undefined; }\nelse {\n  for (i = 0; i < shift_count; i++) {\n    CF ← MSB(dest);\n    dest ← (dest << 1) | CF;\n  }\n  if (shift_count == 1) {\n    OF ← MSB_before_rotation XOR MSB_after_rotation;\n  } else {\n    OF ← undefined;\n  }\n}", "example": "ROL rbx, 3"}
{"mnemonic": "ror", "architecture": "x86", "full_name": "Rotate Right", "summary": "Rotates bits right.", "syntax": "ROR r/m, imm8", "encoding": {"format": "Legacy", "hex_opcode": "C1 /1", "visual_parts": [], "binary_pattern": "C1 | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rotates the bits in the destination operand right by the number of bit positions specified in the source, with the rightmost bit wrapping to the leftmost position. The Carry Flag is set to the bit shifted out; Overflow Flag is set only if rotating by 1 and the sign bit changed. No other flags are affected for rotations > 1.", "pseudocode": "shift_count ← src & ((OperandSize * 8) - 1);\nif (shift_count == 0) { CF ← undefined; OF ← undefined; }\nelse {\n  for (i = 0; i < shift_count; i++) {\n    CF ← LSB(dest);\n    dest ← (dest >> 1) | (CF << (OperandSize * 8 - 1));\n  }\n  if (shift_count == 1) {\n    OF ← MSB_before_rotation XOR (MSB_before_rotation >> 1);\n  } else {\n    OF ← undefined;\n  }\n}", "example": "ROR rbx, 3"}
{"mnemonic": "rcl", "architecture": "x86", "full_name": "Rotate Carry Left", "summary": "Rotates bits left through Carry Flag.", "syntax": "RCL r/m, imm8", "encoding": {"format": "Legacy", "hex_opcode": "C1 /2", "visual_parts": [], "binary_pattern": "C1 | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rotates the bits in the destination operand left through the Carry Flag by the number of bit positions specified in the source, treating CF as an additional bit position between the MSB and LSB. The CF is set to the bit shifted out. Overflow Flag is set if rotating by 1 and the MSB changed sign. For shifts > 1, OF is undefined. Other flags unchanged.", "pseudocode": "shift_count ← src & ((OperandSize * 8) - 1);\nif (shift_count == 0) { CF ← undefined; OF ← undefined; }\nelse if (shift_count == 1) {\n  temp_CF ← MSB(dest);\n  dest ← (dest << 1) | CF;\n  CF ← temp_CF;\n  OF ← MSB_before XOR MSB_after;\n}\nelse {\n  for (i = 0; i < shift_count; i++) {\n    temp_CF ← MSB(dest);\n    dest ← (dest << 1) | CF;\n    CF ← temp_CF;\n  }\n  OF ← undefined;\n}", "example": "RCL rbx, 3"}
{"mnemonic": "rcr", "architecture": "x86", "full_name": "Rotate Carry Right", "summary": "Rotates bits right through Carry Flag.", "syntax": "RCR r/m, imm8", "encoding": {"format": "Legacy", "hex_opcode": "C1 /3", "visual_parts": [], "binary_pattern": "C1 | ModRM", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rotates the bits of the destination operand right by the number of positions specified in the count operand, with the carry flag inserted at the high end and the low bit shifted into the carry flag. The rotation is through the carry flag, making it part of the rotating chain. All bits including CF participate in a circular rotate. The OF flag is set/cleared based on the most significant bit change on a single-bit rotate; CF is updated to the last bit shifted out.", "pseudocode": "count ← (src == 0) ? 1 : src & 0x1F;\ntemp_cf ← CF;\nfor i ← 0 to count - 1:\n    new_cf ← dest & 1;\n    dest ← (dest >> 1) | (temp_cf << (width - 1));\n    temp_cf ← new_cf;\nCF ← temp_cf;\nif count == 1:\n    OF ← MSB_before_rotate XOR CF;", "example": "RCR rbx, 3"}
{"mnemonic": "bt", "architecture": "x86", "full_name": "Bit Test", "summary": "Selects a bit and stores it in CF.", "syntax": "BT r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "0F A3", "visual_parts": [], "binary_pattern": "0F | A3", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "r", "desc": "General-purpose register"}], "description": "Tests a bit in the destination operand at the position specified by the source operand and stores the selected bit value in the carry flag. The destination is not modified. The source operand specifies which bit to test (bit position is source value modulo operand size). OF, SF, ZF, AF, PF flags are undefined; only CF is set to the tested bit value.", "pseudocode": "bit_position ← src MOD (width of dest);\nCF ← (dest >> bit_position) & 1;\nOF ← undefined;\nSF ← undefined;\nZF ← undefined;\nAF ← undefined;\nPF ← undefined;", "example": "BT rbx, rax"}
{"mnemonic": "bts", "architecture": "x86", "full_name": "Bit Test and Set", "summary": "Stores bit in CF and sets bit to 1.", "syntax": "BTS r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "0F AB", "visual_parts": [], "binary_pattern": "0F | AB", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "r", "desc": "General-purpose register"}], "description": "Tests a bit in the destination operand at the position specified by the source operand, stores the selected bit value in the carry flag, and then sets that bit to 1. The destination is modified atomically with respect to memory accesses. CF receives the original bit value before it is set. OF, SF, ZF, AF, PF flags are undefined.", "pseudocode": "bit_position ← src MOD (width of dest);\nCF ← (dest >> bit_position) & 1;\ndest ← dest | (1 << bit_position);\nOF ← undefined;\nSF ← undefined;\nZF ← undefined;\nAF ← undefined;\nPF ← undefined;", "example": "BTS rbx, rax"}
{"mnemonic": "btr", "architecture": "x86", "full_name": "Bit Test and Reset", "summary": "Stores bit in CF and clears bit to 0.", "syntax": "BTR r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "0F B3", "visual_parts": [], "binary_pattern": "0F | B3", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "r", "desc": "General-purpose register"}], "description": "Tests a bit in the destination operand at the position specified by the source operand, stores the selected bit value in the carry flag, and then clears that bit to 0. The destination is modified atomically with respect to memory accesses. CF receives the original bit value before it is cleared. OF, SF, ZF, AF, PF flags are undefined.", "pseudocode": "bit_position ← src MOD (width of dest);\nCF ← (dest >> bit_position) & 1;\ndest ← dest & ~(1 << bit_position);\nOF ← undefined;\nSF ← undefined;\nZF ← undefined;\nAF ← undefined;\nPF ← undefined;", "example": "BTR rbx, rax"}
{"mnemonic": "btc", "architecture": "x86", "full_name": "Bit Test and Complement", "summary": "Stores bit in CF and complements the bit.", "syntax": "BTC r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "0F BB", "visual_parts": [], "binary_pattern": "0F | BB", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "r", "desc": "General-purpose register"}], "description": "Tests a bit in the destination operand at the position specified by the source operand, stores the selected bit value in the carry flag, and then complements (inverts) that bit. The destination is modified atomically with respect to memory accesses. CF receives the original bit value before it is complemented. OF, SF, ZF, AF, PF flags are undefined.", "pseudocode": "bit_position ← src MOD (width of dest);\nCF ← (dest >> bit_position) & 1;\ndest ← dest XOR (1 << bit_position);\nOF ← undefined;\nSF ← undefined;\nZF ← undefined;\nAF ← undefined;\nPF ← undefined;", "example": "BTC rbx, rax"}
{"mnemonic": "bsf", "architecture": "x86", "full_name": "Bit Scan Forward", "summary": "Scans for LSB set to 1.", "syntax": "BSF r, r/m", "encoding": {"format": "Legacy", "hex_opcode": "0F BC", "visual_parts": [], "binary_pattern": "0F | BC", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Scans the source operand from the least significant bit (LSB) forward to locate the first set bit, and stores the bit position in the destination register. If no set bit is found, the zero flag is set and the destination register is undefined. This instruction is commonly used to find the index of the lowest set bit in a value.", "pseudocode": "for i ← 0 to (width - 1):\n    if (src >> i) & 1 == 1:\n        dest ← i;\n        ZF ← 0;\n        return;\nZF ← 1;\ndest ← undefined;", "example": "BSF rax, rbx"}
{"mnemonic": "bsr", "architecture": "x86", "full_name": "Bit Scan Reverse", "summary": "Scans for MSB set to 1.", "syntax": "BSR r, r/m", "encoding": {"format": "Legacy", "hex_opcode": "0F BD", "visual_parts": [], "binary_pattern": "0F | BD", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Scans the source operand from the most significant bit (MSB) backward to locate the first set bit, and stores the bit position in the destination register. If no set bit is found, the zero flag is set and the destination register is undefined. This instruction is commonly used to find the index of the highest set bit in a value.", "pseudocode": "for i ← (width - 1) down to 0:\n    if (src >> i) & 1 == 1:\n        dest ← i;\n        ZF ← 0;\n        return;\nZF ← 1;\ndest ← undefined;", "example": "BSR rax, rbx"}
{"mnemonic": "lzcnt", "architecture": "x86", "full_name": "Count Leading Zeros", "summary": "Counts number of leading zeros.", "syntax": "LZCNT r, r/m", "encoding": {"format": "VEX", "hex_opcode": "F3 0F BD", "visual_parts": [], "binary_pattern": "F3 | 0F | BD", "bit_positions": "+0 | +1 | +2"}, "extension": "ABM/BMI", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Counts the number of leading zero bits in the source operand and stores the result in the destination register. This is an ABM (Advanced Bit Manipulation) instruction that sets the zero flag if the source is zero (result is operand width) and clears it otherwise. Unlike BSR, this always produces a result without undefined behavior, making it safer for leading zero counting.", "pseudocode": "count ← 0;\nfor i ← (width - 1) down to 0:\n    if (src >> i) & 1 == 1:\n        break;\n    count ← count + 1;\nif src == 0:\n    dest ← width;\n    ZF ← 1;\nelse:\n    dest ← count;\n    ZF ← 0;", "example": "LZCNT rax, rbx"}
{"mnemonic": "popcnt", "architecture": "x86", "full_name": "Population Count", "summary": "Counts number of bits set to 1.", "syntax": "POPCNT r, r/m", "encoding": {"format": "VEX", "hex_opcode": "F3 0F B8", "visual_parts": [], "binary_pattern": "F3 | 0F | B8", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE4.2", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Counts the number of set bits (1s) in the source operand and stores the result in the destination register. This instruction requires the SSE4.2 extension and is available in 16/32/64-bit variants. No flags are affected by this instruction, making it useful for bit-counting operations in high-performance code.", "pseudocode": "dest ← count_set_bits(src)", "example": "POPCNT rax, rbx"}
{"mnemonic": "xlat", "architecture": "x86", "full_name": "Table Look-up Translation", "summary": "Replaces AL with byte from table at [EBX+AL].", "syntax": "XLAT m8", "encoding": {"format": "Legacy", "hex_opcode": "D7", "visual_parts": [], "binary_pattern": "D7", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "m8", "desc": "8-bit memory operand"}], "description": "Translates the byte in AL using a table in memory located at address EBX + AL (or RBX + AL in 64-bit mode), replacing AL with the byte from the table. The base address is determined by EBX/RBX, and the offset is the current value of AL. No flags are affected. This instruction is useful for character translation and lookup tables.", "pseudocode": "AL ← [EBX + zero_extend(AL)]", "example": "XLAT [rbp-1]"}
{"mnemonic": "pushf", "architecture": "x86", "full_name": "Push Flags", "summary": "Pushes EFLAGS onto stack.", "syntax": "PUSHF", "encoding": {"format": "Legacy", "hex_opcode": "9C", "visual_parts": [], "binary_pattern": "9C", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Pushes the EFLAGS register (or FLAGS register in 16-bit mode) onto the stack, decrementing the stack pointer. In 64-bit mode, PUSHF pushes the lower 32 bits of RFLAGS. All flag states are preserved on the stack. This instruction is commonly used to save the current processor state before modifying flags.", "pseudocode": "ESP ← ESP - 4; [ESP] ← EFLAGS", "example": "PUSHF"}
{"mnemonic": "popf", "architecture": "x86", "full_name": "Pop Flags", "summary": "Pops stack into EFLAGS.", "syntax": "POPF", "encoding": {"format": "Legacy", "hex_opcode": "9D", "visual_parts": [], "binary_pattern": "9D", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Pops a value from the stack into the EFLAGS register (or FLAGS in 16-bit mode), restoring previously saved flag states. This instruction restores OF, SF, ZF, AF, PF, and CF flags from the popped value. POPF also increments the stack pointer. Certain flags may be restricted based on the current privilege level.", "pseudocode": "EFLAGS ← [ESP]; ESP ← ESP + 4", "example": "POPF"}
{"mnemonic": "pusha", "architecture": "x86", "full_name": "Push All General-Purpose Registers", "summary": "Pushes AX, CX, DX, BX, SP, BP, SI, DI (Invalid in 64-bit).", "syntax": "PUSHA", "encoding": {"format": "Legacy", "hex_opcode": "60", "visual_parts": [], "binary_pattern": "60", "bit_positions": "+0"}, "extension": "Base (32-bit only)", "operands": [], "description": "Pushes all eight general-purpose 16-bit or 32-bit registers (AX/EAX, CX/ECX, DX/EDX, BX/EBX, SP/ESP, BP/EBP, SI/ESI, DI/EDI) onto the stack in that order. The SP/ESP value pushed is the value before the first push. This instruction is invalid in 64-bit mode and is primarily a legacy instruction. No flags are affected.", "pseudocode": "temp ← SP; SP ← SP - 16; [SP+0] ← AX; [SP+2] ← CX; [SP+4] ← DX; [SP+6] ← BX; [SP+8] ← temp; [SP+10] ← BP; [SP+12] ← SI; [SP+14] ← DI", "example": "PUSHA"}
{"mnemonic": "popa", "architecture": "x86", "full_name": "Pop All General-Purpose Registers", "summary": "Pops into DI, SI, BP, SP, BX, DX, CX, AX (Invalid in 64-bit).", "syntax": "POPA", "encoding": {"format": "Legacy", "hex_opcode": "61", "visual_parts": [], "binary_pattern": "61", "bit_positions": "+0"}, "extension": "Base (32-bit only)", "operands": [], "description": "Pops eight values from the stack into the general-purpose registers in reverse order of PUSHA (DI, SI, BP, SP, BX, DX, CX, AX), restoring a previously saved register state. The SP/ESP value is automatically popped and discarded. This instruction is invalid in 64-bit mode. No flags are affected.", "pseudocode": "DI ← [SP+0]; SI ← [SP+2]; BP ← [SP+4]; SP ← SP + 6; BX ← [SP+0]; DX ← [SP+2]; CX ← [SP+4]; AX ← [SP+6]; SP ← SP + 8", "example": "POPA"}
{"mnemonic": "bound", "architecture": "x86", "full_name": "Check Array Index Against Bounds", "summary": "Checks if operand is within bounds defined in memory.", "syntax": "BOUND r, m", "encoding": {"format": "Legacy", "hex_opcode": "62", "visual_parts": [], "binary_pattern": "62", "bit_positions": "+0"}, "extension": "Base (32-bit only)", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Checks whether the signed value in the register operand is within the bounds specified by two signed integers in memory (lower bound at m, upper bound at m+size). If the value is outside the bounds, a #BR (BOUND Range Exceeded) exception is generated. This instruction is invalid in 64-bit mode. No flags are affected if no exception occurs.", "pseudocode": "lower ← [mem]; upper ← [mem + operand_size]; if (register < lower || register > upper) { raise BR_exception }", "example": "BOUND rax, [rbp-8]"}
{"mnemonic": "aaa", "architecture": "x86", "full_name": "ASCII Adjust After Addition", "summary": "Adjusts AL after addition for unpacked BCD.", "syntax": "AAA", "encoding": {"format": "Legacy", "hex_opcode": "37", "visual_parts": [], "binary_pattern": "37", "bit_positions": "+0"}, "extension": "Base (Legacy)", "operands": [], "description": "Adjusts AL after addition of two unpacked BCD (Binary Coded Decimal) digits, correcting the result to ensure valid BCD. If the lower nibble of AL is greater than 9 or the AF flag is set, AL is adjusted by adding 6 to the lower nibble and 1 is added to AH. The AF and CF flags are set or cleared accordingly. This instruction is invalid in 64-bit mode and is primarily legacy.", "pseudocode": "if ((AL & 0x0F) > 9 || AF == 1) { AL ← (AL + 6) & 0xFF; AH ← AH + 1; AF ← 1; CF ← 1 } else { AF ← 0; CF ← 0 }; AL ← AL & 0x0F", "example": "AAA"}
{"mnemonic": "aas", "architecture": "x86", "full_name": "ASCII Adjust After Subtraction", "summary": "Adjusts AL after subtraction for unpacked BCD.", "syntax": "AAS", "encoding": {"format": "Legacy", "hex_opcode": "3F", "visual_parts": [], "binary_pattern": "3F", "bit_positions": "+0"}, "extension": "Base (Legacy)", "operands": [], "description": "Adjusts the value in AL after a subtraction operation to make it a valid unpacked BCD digit (0-9 in the lower nibble). If the lower nibble of AL is greater than 9 or the auxiliary carry flag is set, AL is decremented by 6 and AH is decremented by 1; otherwise no adjustment occurs. Sets or clears AF and CF based on whether an adjustment was made; other flags are undefined.", "pseudocode": "if ((AL & 0x0F) > 9) || (AF == 1) {\n  AL ← AL - 6;\n  AH ← AH - 1;\n  AF ← 1;\n  CF ← 1;\n} else {\n  AF ← 0;\n  CF ← 0;\n}\nAL ← AL & 0x0F;", "example": "AAS"}
{"mnemonic": "daa", "architecture": "x86", "full_name": "Decimal Adjust After Addition", "summary": "Adjusts AL after addition for packed BCD.", "syntax": "DAA", "encoding": {"format": "Legacy", "hex_opcode": "27", "visual_parts": [], "binary_pattern": "27", "bit_positions": "+0"}, "extension": "Base (Legacy)", "operands": [], "description": "Adjusts AL after addition of two packed BCD values. If the lower nibble exceeds 9 or AF is set, adds 6 to AL; if the upper nibble then exceeds 9 or CF is set, adds 0x60 to AL. Sets CF and AF as needed; OF is undefined; SF, ZF, PF are computed on the result.", "pseudocode": "old_AL ← AL;\nif ((AL & 0x0F) > 9) || (AF == 1) {\n  AL ← AL + 6;\n  AF ← 1;\n} else {\n  AF ← 0;\n}\nif (old_AL > 0x99) || (CF == 1) {\n  AL ← AL + 0x60;\n  CF ← 1;\n} else {\n  CF ← 0;\n}\nZF ← (AL == 0);\nSF ← (AL[7] == 1);\nPF ← parity(AL);", "example": "DAA"}
{"mnemonic": "das", "architecture": "x86", "full_name": "Decimal Adjust After Subtraction", "summary": "Adjusts AL after subtraction for packed BCD.", "syntax": "DAS", "encoding": {"format": "Legacy", "hex_opcode": "2F", "visual_parts": [], "binary_pattern": "2F", "bit_positions": "+0"}, "extension": "Base (Legacy)", "operands": [], "description": "Adjusts AL after subtraction of two packed BCD values. If the lower nibble exceeds 9 or AF is set, subtracts 6 from AL; if the upper nibble then exceeds 9 or CF is set, subtracts 0x60 from AL. Sets CF and AF as needed; OF is undefined; SF, ZF, PF are computed on the result.", "pseudocode": "old_AL ← AL;\nif ((AL & 0x0F) > 9) || (AF == 1) {\n  AL ← AL - 6;\n  AF ← 1;\n} else {\n  AF ← 0;\n}\nif (old_AL > 0x99) || (CF == 1) {\n  AL ← AL - 0x60;\n  CF ← 1;\n} else {\n  CF ← 0;\n}\nZF ← (AL == 0);\nSF ← (AL[7] == 1);\nPF ← parity(AL);", "example": "DAS"}
{"mnemonic": "aam", "architecture": "x86", "full_name": "ASCII Adjust After Multiply", "summary": "Adjusts AX after multiply for unpacked BCD.", "syntax": "AAM imm8", "encoding": {"format": "Legacy", "hex_opcode": "D4", "visual_parts": [], "binary_pattern": "D4", "bit_positions": "+0"}, "extension": "Base (Legacy)", "operands": [{"name": "dest", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Adjusts AX after a multiply operation on unpacked BCD operands (imm8 specifies the radix, typically 10). Divides AL by the immediate operand, placing the quotient in AH and remainder in AL. Sets SF, ZF, PF based on the result in AL; CF and OF are undefined; AF is undefined.", "pseudocode": "AH ← AL / imm8;\nAL ← AL % imm8;\nZF ← (AL == 0);\nSF ← (AL[7] == 1);\nPF ← parity(AL);", "example": "AAM 3"}
{"mnemonic": "aad", "architecture": "x86", "full_name": "ASCII Adjust Before Division", "summary": "Adjusts AX before division for unpacked BCD.", "syntax": "AAD imm8", "encoding": {"format": "Legacy", "hex_opcode": "D5", "visual_parts": [], "binary_pattern": "D5", "bit_positions": "+0"}, "extension": "Base (Legacy)", "operands": [{"name": "dest", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Adjusts AX before a division operation on unpacked BCD operands (imm8 specifies the radix, typically 10). Multiplies AH by the immediate operand and adds to AL, placing the result in AL with AH cleared to 0. Sets SF, ZF, PF based on the result; CF and OF are undefined; AF is undefined.", "pseudocode": "AL ← (AH * imm8) + AL;\nAH ← 0;\nZF ← (AL == 0);\nSF ← (AL[7] == 1);\nPF ← parity(AL);", "example": "AAD 3"}
{"mnemonic": "cbw", "architecture": "x86", "full_name": "Convert Byte to Word", "summary": "Sign-extends AL into AX.", "syntax": "CBW", "encoding": {"format": "Legacy", "hex_opcode": "98", "visual_parts": [], "binary_pattern": "98", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Sign-extends the byte value in AL to a word in AX by copying bit 7 of AL to all bits 8-15 of AX. No flags are affected. In 64-bit mode, only the lower word of RAX is modified.", "pseudocode": "AX ← sign_extend_byte_to_word(AL);", "example": "CBW"}
{"mnemonic": "cwd", "architecture": "x86", "full_name": "Convert Word to Doubleword", "summary": "Sign-extends AX into DX:AX.", "syntax": "CWD", "encoding": {"format": "Legacy", "hex_opcode": "99", "visual_parts": [], "binary_pattern": "99", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Sign-extends the word value in AX to a doubleword across DX:AX by copying bit 15 of AX to all bits of DX. No flags are affected. In 64-bit mode, this is typically replaced by CDQE or CQO for larger sign extensions.", "pseudocode": "DX ← (AX[15] == 1) ? 0xFFFF : 0x0000;", "example": "CWD"}
{"mnemonic": "wait", "architecture": "x86", "full_name": "Wait", "summary": "Wait for FPU (same as FWAIT).", "syntax": "WAIT", "encoding": {"format": "Legacy", "hex_opcode": "9B", "visual_parts": [], "binary_pattern": "9B", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Waits for pending FPU operations to complete by checking the FPU busy flag; execution stalls until the FPU signals completion. Commonly used to synchronize between x87 floating-point and integer units. No flags are modified.", "pseudocode": "while (FPU_busy_flag == 1) {\n  stall();\n}", "example": "WAIT"}
{"mnemonic": "ldtilecfg", "architecture": "x86", "full_name": "Load Tile Configuration", "summary": "Loads AMX tile configuration from memory.", "syntax": "LDTILECFG m512", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.NP.0F38.W0 49 !(11):000:bbb", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AMX-TILE", "operands": [{"name": "dest", "type": "m512", "desc": "512-bit memory operand"}], "description": "Loads a 512-bit tile configuration structure from memory into the AMX tile configuration state, enabling subsequent AMX tile operations. The memory operand must be 64-byte aligned. This instruction is a serializing operation that flushes pending tile operations and updates the internal tile geometry metadata (rows and columns for each tile). Requires AMX-TILE extension support; raises #UD if AMX is not enabled or memory is misaligned.", "pseudocode": "tilecfg_state ← load_512bits_from_memory(m512); tile_config_valid ← 1;", "example": "LDTILECFG [rbp-64]"}
{"mnemonic": "sttilecfg", "architecture": "x86", "full_name": "Store Tile Configuration", "summary": "Stores AMX tile configuration to memory.", "syntax": "STTILECFG m512", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.66.0F38.W0 49 !(11):000:bbb", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AMX-TILE", "operands": [{"name": "dest", "type": "m512", "desc": "512-bit memory operand"}], "description": "Stores the current AMX tile configuration state to a 512-bit memory location. Writes the internal tile dimensions and configuration metadata that was previously loaded via LDTILECFG. The memory operand must be 64-byte aligned. This is a serializing operation that ensures all pending tile operations complete before the store. Requires AMX-TILE extension support.", "pseudocode": "m512 ← store_512bits_to_memory(tilecfg_state);", "example": "STTILECFG [rbp-64]"}
{"mnemonic": "tileloadd", "architecture": "x86", "full_name": "Load Tile Data", "summary": "Loads data into an AMX tile register.", "syntax": "TILELOADD tmm1, m", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.F2.0F38.W0 4B !(11):rrr:100", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AMX-TILE", "operands": [{"name": "dest", "type": "tmm1", "desc": "AMX tile register"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Loads a rectangular block of 32-bit doubleword elements from memory into an AMX tile register according to the current tile configuration. The memory layout is row-major; the memory address is typically formed from a base register and a stride register. This is a non-faulting instruction that respects the tile row/column dimensions set by LDTILECFG. Requires AMX-TILE extension and valid tile configuration.", "pseudocode": "stride ← (addressing mode determines memory stride); rows ← tilecfg_state.rows[tmm1]; cols ← tilecfg_state.cols[tmm1]; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { tmm1[i, j] ← m[base + i*stride + j*4]; } }", "example": "TILELOADD tmm1, [rbp-8]"}
{"mnemonic": "tilestored", "architecture": "x86", "full_name": "Store Tile Data", "summary": "Stores data from an AMX tile register to memory.", "syntax": "TILESTORED m, tmm1", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.F3.0F38.W0 4B !(11):rrr:100", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AMX-TILE", "operands": [{"name": "dest", "type": "m", "desc": "Memory operand"}, {"name": "src", "type": "tmm1", "desc": "AMX tile register"}], "description": "Stores a rectangular block of 32-bit doubleword elements from an AMX tile register to memory in row-major order, respecting the tile configuration dimensions. The destination memory address is typically formed from a base register and a stride register. This is a non-faulting instruction that outputs only the configured rows and columns. Requires AMX-TILE extension and valid tile configuration.", "pseudocode": "stride ← (addressing mode determines memory stride); rows ← tilecfg_state.rows[tmm_src]; cols ← tilecfg_state.cols[tmm_src]; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { m[base + i*stride + j*4] ← tmm_src[i, j]; } }", "example": "TILESTORED [rbp-8], tmm1"}
{"mnemonic": "tilezero", "architecture": "x86", "full_name": "Zero Tile", "summary": "Clears an AMX tile register.", "syntax": "TILEZERO tmm1", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.F2.0F38.W0 49 11:rrr:000", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AMX-TILE", "operands": [{"name": "dest", "type": "tmm1", "desc": "AMX tile register"}], "description": "Clears all elements of an AMX tile register to zero. The tile retains its configured dimensions; only the data elements are zeroed. This instruction is a common initialization step for accumulator tiles before performing matrix operations. Requires AMX-TILE extension and valid tile configuration. No flags are affected.", "pseudocode": "rows ← tilecfg_state.rows[tmm1]; cols ← tilecfg_state.cols[tmm1]; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { tmm1[i, j] ← 0; } }", "example": "TILEZERO tmm1"}
{"mnemonic": "tdpbssd", "architecture": "x86", "full_name": "Tile Dot Product Byte Signed Signed Doubleword", "summary": "Matrix multiply (Signed Int8 * Signed Int8) accumulating to Int32.", "syntax": "TDPBSSD tmm1, tmm2, tmm3", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.F2.0F38.W0 5E 11:rrr:bbb", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AMX-INT8", "operands": [{"name": "dest", "type": "tmm1", "desc": "AMX tile register"}, {"name": "src1", "type": "tmm2", "desc": "AMX tile register"}, {"name": "src2", "type": "tmm3", "desc": "AMX tile register"}], "description": "Performs a tile matrix multiply-accumulate operation: multiplies signed 8-bit elements from two source tiles and accumulates the 32-bit signed products into a 32-bit destination tile. Computes dest[i,k] += sum(src1[i,j] * src2[j,k]) for all j over the configured row/column ranges. The operation respects the tile configuration for all three operands. Requires AMX-INT8 extension. No EFLAGS are modified.", "pseudocode": "rows_dest ← tilecfg_state.rows[tmm1]; cols_dest ← tilecfg_state.cols[tmm1]; cols_src1 ← tilecfg_state.cols[tmm2]; for (i = 0; i < rows_dest; i++) { for (k = 0; k < cols_dest; k++) { for (j = 0; j < cols_src1; j++) { product ← (int32_t)(int8_t)src1[i,j] * (int32_t)(int8_t)src2[j,k]; tmm1[i,k] ← (int32_t)tmm1[i,k] + product; } } }", "example": "TDPBSSD tmm1, tmm2, tmm3"}
{"mnemonic": "tdpbsud", "architecture": "x86", "full_name": "Tile Dot Product Byte Signed Unsigned Doubleword", "summary": "Matrix multiply (Signed * Unsigned) accumulating to Int32.", "syntax": "TDPBSUD tmm1, tmm2, tmm3", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.F3.0F38.W0 5E 11:rrr:bbb", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AMX-INT8", "operands": [{"name": "dest", "type": "tmm1", "desc": "AMX tile register"}, {"name": "src1", "type": "tmm2", "desc": "AMX tile register"}, {"name": "src2", "type": "tmm3", "desc": "AMX tile register"}], "description": "Performs a tile matrix multiply-accumulate operation: multiplies signed 8-bit elements from the first source by unsigned 8-bit elements from the second source, accumulating 32-bit signed results into the destination tile. Computes dest[i,k] += sum(src1[i,j] * src2[j,k]) for all j, with src1 treated as signed and src2 as unsigned. Respects tile configuration dimensions. Requires AMX-INT8 extension. No EFLAGS are modified.", "pseudocode": "rows_dest ← tilecfg_state.rows[tmm1]; cols_dest ← tilecfg_state.cols[tmm1]; cols_src1 ← tilecfg_state.cols[tmm2]; for (i = 0; i < rows_dest; i++) { for (k = 0; k < cols_dest; k++) { for (j = 0; j < cols_src1; j++) { product ← (int32_t)(int8_t)src1[i,j] * (int32_t)(uint8_t)src2[j,k]; tmm1[i,k] ← (int32_t)tmm1[i,k] + product; } } }", "example": "TDPBSUD tmm1, tmm2, tmm3"}
{"mnemonic": "tdpbf16ps", "architecture": "x86", "full_name": "Tile Dot Product BFloat16 Packed Single", "summary": "Matrix multiply (BFloat16) accumulating to Float32.", "syntax": "TDPBF16PS tmm1, tmm2, tmm3", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.F3.0F38.W0 5C 11:rrr:bbb", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AMX-BF16", "operands": [{"name": "dest", "type": "tmm1", "desc": "AMX tile register"}, {"name": "src1", "type": "tmm2", "desc": "AMX tile register"}, {"name": "src2", "type": "tmm3", "desc": "AMX tile register"}], "description": "Performs a tile matrix multiply-accumulate operation on BFloat16 (16-bit brain float) elements, accumulating 32-bit floating-point results into the destination tile. Computes dest[i,k] += sum(src1[i,j] * src2[j,k]) for all j using BFloat16 multiplication and single-precision floating-point accumulation. Respects tile configuration for row/column dimensions. Requires AMX-BF16 extension. No EFLAGS are modified.", "pseudocode": "rows_dest ← tilecfg_state.rows[tmm1]; cols_dest ← tilecfg_state.cols[tmm1]; cols_src1 ← tilecfg_state.cols[tmm2]; for (i = 0; i < rows_dest; i++) { for (k = 0; k < cols_dest; k++) { for (j = 0; j < cols_src1; j++) { product ← convert_bf16_to_fp32(src1[i,j]) * convert_bf16_to_fp32(src2[j,k]); tmm1[i,k] ← (float32)tmm1[i,k] + product; } } }", "example": "TDPBF16PS tmm1, tmm2, tmm3"}
{"mnemonic": "endbr64", "architecture": "x86", "full_name": "End Branch 64-bit", "summary": "Marker instruction for Indirect Branch Tracking (IBT).", "syntax": "ENDBR64", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 1E FA", "visual_parts": [], "binary_pattern": "F3 | 0F | 1E | FA", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "CET-IBT", "operands": [], "description": "End Branch 64-bit marker for Control Flow Enforcement Technology (CET) Indirect Branch Tracking. This is a NOP-like instruction that marks valid target points for indirect branches in 64-bit mode; it is consumed by hardware when CET-IBT is enabled and causes a control-flow exception (#CP) if an indirect branch lands on a non-ENDBR64/ENDBR32 location. No flags are affected. Requires CET-IBT capability.", "pseudocode": "// Marker instruction for Indirect Branch Tracking (IBT)", "example": "ENDBR64"}
{"mnemonic": "endbr32", "architecture": "x86", "full_name": "End Branch 32-bit", "summary": "Marker instruction for Indirect Branch Tracking (IBT).", "syntax": "ENDBR32", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 1E FB", "visual_parts": [], "binary_pattern": "F3 | 0F | 1E | FB", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "CET-IBT", "operands": [], "description": "End Branch 32-bit marker for Control Flow Enforcement Technology (CET) Indirect Branch Tracking. Similar to ENDBR64, this marks valid indirect branch targets in 32-bit or compat mode; enforces CET-IBT policy when enabled. No flags are affected. Requires CET-IBT capability.", "pseudocode": "// Marker instruction for Indirect Branch Tracking (IBT)", "example": "ENDBR32"}
{"mnemonic": "rdsspq", "architecture": "x86", "full_name": "Read Shadow Stack Pointer (Quadword)", "summary": "Reads the current shadow stack pointer into a register.", "syntax": "RDSSPQ r64", "encoding": {"format": "Legacy", "hex_opcode": "F3 REX.W 0F 1E /1", "visual_parts": [], "binary_pattern": "F3 | 0F | 1E | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "CET-SS", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}], "description": "Read Shadow Stack Pointer into a 64-bit register. Reads the current shadow stack pointer (SSP) maintained by CET-SS hardware and stores it in the destination register. No flags are affected. Requires CET-SS (Control Flow Enforcement Technology-Shadow Stack) capability; 64-bit mode only.", "pseudocode": "dest ← SSP", "example": "RDSSPQ rax"}
{"mnemonic": "incsspq", "architecture": "x86", "full_name": "Increment Shadow Stack Pointer (Quadword)", "summary": "Adjusts the shadow stack pointer.", "syntax": "INCSSPQ r64", "encoding": {"format": "Legacy", "hex_opcode": "F3 REX.W 0F AE /5", "visual_parts": [], "binary_pattern": "F3 | 0F | AE | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "CET-SS", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}], "description": "Increment Shadow Stack Pointer by the value in a 64-bit register. Adjusts the shadow stack pointer (SSP) forward by the count specified in the source register, typically used to skip multiple shadow stack entries or adjust SSP during context switching. No flags are affected. Requires CET-SS capability; 64-bit mode only.", "pseudocode": "SSP ← SSP + src", "example": "INCSSPQ rax"}
{"mnemonic": "rstorssp", "architecture": "x86", "full_name": "Restore Shadow Stack Pointer", "summary": "Restores SSP from memory token.", "syntax": "RSTORSSP m64", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 01 /5", "visual_parts": [], "binary_pattern": "F3 | 0F | 01 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "CET-SS", "operands": [{"name": "dest", "type": "m64", "desc": "64-bit memory operand (quadword)"}], "description": "Restore Shadow Stack Pointer from a 64-bit memory token. Reads a restoration token from memory and updates the shadow stack pointer (SSP); validates the token format and raises #CP if invalid. Used during context restoration or privilege transitions with CET-SS. No flags are affected. Requires CET-SS capability; 64-bit mode only.", "pseudocode": "token ← [src]\n// Validate token format; if invalid raise #CP\nSSP ← token", "example": "RSTORSSP [rbp-8]"}
{"mnemonic": "saveprevssp", "architecture": "x86", "full_name": "Save Previous Shadow Stack Pointer", "summary": "Saves the previous SSP to the shadow stack token.", "syntax": "SAVEPREVSSP", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 01 EA", "visual_parts": [], "binary_pattern": "F3 | 0F | 01 | EA", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "CET-SS", "operands": [], "description": "Save the previous Shadow Stack Pointer to the top of the shadow stack. Writes the previous SSP value (stored in a CET control register) as a token to the current shadow stack location and typically increments SSP. Used to preserve SSP across context switches or privilege transitions. No flags are affected. Requires CET-SS capability; 64-bit mode only.", "pseudocode": "[SSP] ← previous_SSP\nSSP ← SSP + 8", "example": "SAVEPREVSSP"}
{"mnemonic": "clwb", "architecture": "x86", "full_name": "Cache Line Write Back", "summary": "Writes back modified cache line without flushing (Persistent Memory).", "syntax": "CLWB m8", "encoding": {"format": "Legacy", "hex_opcode": "66 0F AE !(11):110:bbb", "visual_parts": [], "binary_pattern": "66 | 0F | AE | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "CLWB", "operands": [{"name": "dest", "type": "m8", "desc": "8-bit memory operand"}], "description": "Cache Line Write Back to memory without invalidation. Writes back a modified cache line to memory (coherent with other agents) but does not invalidate it from the cache hierarchy; optimized for persistent memory workloads. No flags are affected. Serialization and memory ordering depend on surrounding instructions. Requires CLWB capability.", "pseudocode": "// Write back cache line containing [m8] to memory\n// Cache line remains in cache after writeback\nwrite_back_cache_line(address(m8))", "example": "CLWB [rbp-1]"}
{"mnemonic": "clflushopt", "architecture": "x86", "full_name": "Optimized Cache Line Flush", "summary": "Optimized version of CLFLUSH (Higher throughput).", "syntax": "CLFLUSHOPT m8", "encoding": {"format": "Legacy", "hex_opcode": "NFx 66 0F AE /7", "visual_parts": [], "binary_pattern": "66 | 0F | AE | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "CLFLUSHOPT", "operands": [{"name": "dest", "type": "m8", "desc": "8-bit memory operand"}], "description": "Optimized Cache Line Flush with higher throughput than CLFLUSH. Invalidates a cache line from all levels of the cache hierarchy and writes it back to memory if modified. No flags are affected. Provides better pipelining and throughput characteristics than legacy CLFLUSH. Requires CLFLUSHOPT capability.", "pseudocode": "// Invalidate and writeback cache line containing [m8]\ninvalidate_writeback_cache_line(address(m8))", "example": "CLFLUSHOPT [rbp-1]"}
{"mnemonic": "cldemote", "architecture": "x86", "full_name": "Cache Line Demote", "summary": "Hints to move cache line to lower cache level.", "syntax": "CLDEMOTE m8", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 1C /0", "visual_parts": [], "binary_pattern": "0F | 1C | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "CLDEMOTE", "operands": [{"name": "dest", "type": "m8", "desc": "8-bit memory operand"}], "description": "Provides a hint to demote a cache line to a lower cache level (L2 or L3) without invalidating it. The instruction has no architectural effect on cache state and does not modify flags; it is a performance hint that may improve system throughput by reducing cache coherency traffic. Requires CLDEMOTE instruction extension; available in 64-bit mode.", "pseudocode": "// Hint to demote cache line at m8\n// No architectural registers or flags are modified\nDemoteHint([m8])", "example": "CLDEMOTE [rbp-1]"}
{"mnemonic": "movdiri", "architecture": "x86", "full_name": "Move Direct Store Integer", "summary": "Moves 32/64-bit data avoiding cache pollution (Direct IO).", "syntax": "MOVDIRI m, r", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 38 F9 /r", "visual_parts": [], "binary_pattern": "0F | 38 | F9", "bit_positions": "+0 | +1 | +2"}, "extension": "MOVDIRI", "operands": [{"name": "dest", "type": "m", "desc": "Memory operand"}, {"name": "src", "type": "r", "desc": "General-purpose register"}], "description": "Moves 32-bit or 64-bit data from a general-purpose register directly to memory, bypassing the cache hierarchy to avoid cache pollution (Direct I/O store). The instruction writes directly to memory without allocating or updating cache lines. No flags are affected; requires MOVDIRI instruction extension and is intended for low-latency memory-mapped I/O operations.", "pseudocode": "if (src is r32) {\n  [dest] ← src[31:0];\n} else if (src is r64) {\n  [dest] ← src[63:0];\n}\n// No cache line allocated; bypasses cache hierarchy\n// No flags modified", "example": "MOVDIRI [rbp-8], rax"}
{"mnemonic": "movdir64b", "architecture": "x86", "full_name": "Move Direct Store 64-Bytes", "summary": "Atomically moves 64-byte block avoiding cache pollution.", "syntax": "MOVDIR64B m512, m512", "encoding": {"format": "Legacy", "hex_opcode": "66 0F 38 F8", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | F8", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "MOVDIR64B", "operands": [{"name": "dest", "type": "m512", "desc": "512-bit memory operand"}, {"name": "src", "type": "m512", "desc": "512-bit memory operand"}], "description": "Atomically moves a 64-byte block from memory to memory using a Direct I/O store, bypassing the cache hierarchy without allocating cache lines. The operation is atomic with respect to other MOVDIR64B operations and ensures the destination cache line is not allocated. No flags are affected; requires MOVDIR64B extension and 64-byte alignment of both operands.", "pseudocode": "// Atomically copy 64 bytes from src to dest, bypassing cache\nfor (i = 0; i < 64; i++) {\n  [dest + i] ← [src + i];\n}\n// Destination cache line not allocated\n// Operation is atomic and serializing\n// No flags modified", "example": "MOVDIR64B [rbp-64], [rbp-64]"}
{"mnemonic": "xbegin", "architecture": "x86", "full_name": "Transaction Begin", "summary": "Specifies start of Restricted Transactional Memory region.", "syntax": "XBEGIN rel", "encoding": {"format": "Legacy", "hex_opcode": "C7 F8", "visual_parts": [], "binary_pattern": "C7 | F8", "bit_positions": "+0 | +1"}, "extension": "RTM (TSX)", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Specifies the entry point into a Restricted Transactional Memory (RTM) region; execution begins optimistically buffering memory updates. If the transaction aborts, execution branches to the fallback address (rel32); if successful, the transaction commits on XEND. The ZF flag is cleared on successful entry and set on abort; EAX contains a non-zero abort code if a transaction fails.", "pseudocode": "if (RTM_EntryAllowed) {\n  RTM_TransactionActive ← 1;\n  ZF ← 0;\n  // Speculatively execute instructions; buffer memory modifications\n} else {\n  // Transaction abort\n  ZF ← 1;\n  EAX ← abort_code;\n  RIP ← RIP + rel32;  // Branch to fallback address\n}", "example": "XBEGIN rel"}
{"mnemonic": "xend", "architecture": "x86", "full_name": "Transaction End", "summary": "Specifies end of RTM region.", "syntax": "XEND", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 01 D5", "visual_parts": [], "binary_pattern": "0F | 01 | D5", "bit_positions": "+0 | +1 | +2"}, "extension": "RTM (TSX)", "operands": [], "description": "Marks the end of a Restricted Transactional Memory (RTM) region and commits all buffered memory writes if the transaction succeeds. If the transaction has been aborted prior, XEND is a no-op; no flags are modified. Requires RTM extension and must be paired with XBEGIN.", "pseudocode": "if (RTM_TransactionActive) {\n  if (RTMAborted) {\n    // No-op; abort already occurred\n  } else {\n    // Commit buffered writes atomically\n    CommitBufferedWrites();\n    RTM_TransactionActive ← 0;\n  }\n  // No flags modified\n}", "example": "XEND"}
{"mnemonic": "xabort", "architecture": "x86", "full_name": "Transaction Abort", "summary": "Forces an RTM abort.", "syntax": "XABORT imm8", "encoding": {"format": "Legacy", "hex_opcode": "C6 F8", "visual_parts": [], "binary_pattern": "C6 | F8", "bit_positions": "+0 | +1"}, "extension": "RTM (TSX)", "operands": [{"name": "dest", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Forces an explicit abort of the current Restricted Transactional Memory (RTM) transaction, causing execution to branch to the XBEGIN fallback address. The 8-bit immediate value is encoded in the low byte of EAX to indicate the abort reason. No flags are modified by XABORT itself; control flow branches via the RTM abort mechanism.", "pseudocode": "if (RTM_TransactionActive) {\n  // Abort transaction\n  EAX[7:0] ← imm8;\n  RTM_TransactionActive ← 0;\n  RIP ← XBEGINFallbackAddress;  // Branch to XBEGIN offset\n} else {\n  // Outside transaction; XABORT is a no-op\n}", "example": "XABORT 3"}
{"mnemonic": "xtest", "architecture": "x86", "full_name": "Test If In Transaction", "summary": "Sets ZF if processor is in transactional region.", "syntax": "XTEST", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 01 D6", "visual_parts": [], "binary_pattern": "0F | 01 | D6", "bit_positions": "+0 | +1 | +2"}, "extension": "TSX", "operands": [], "description": "Tests whether the processor is currently executing within a Restricted Transactional Memory (RTM) region by setting the Zero Flag (ZF) to 1 if inside a transaction, or clearing it (ZF = 0) if outside. No other flags or registers are modified; useful for conditional logic in fallback code paths.", "pseudocode": "if (RTM_TransactionActive) {\n  ZF ← 1;  // Inside transaction\n} else {\n  ZF ← 0;  // Outside transaction\n}\n// All other flags unchanged", "example": "XTEST"}
{"mnemonic": "umonitor", "architecture": "x86", "full_name": "User Level Monitor", "summary": "Sets up a monitor address for User Wait instructions.", "syntax": "UMONITOR r64", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F AE 11:110:bbb", "visual_parts": [], "binary_pattern": "F3 | 0F | AE | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "WAITPKG", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}], "description": "Sets up a monitor address for User Wait instructions (UMWAIT, TPAUSE) by storing the linear address from the source register in the hardware monitor. The monitor watches for writes to the address range to arm the wait condition. No flags are modified; requires WAITPKG extension and 64-bit mode.", "pseudocode": "// Load monitor address from r64\nMonitorAddress ← src;\nMonitorState ← ARMED;\n// Monitor watches for writes to this address\n// No flags modified", "example": "UMONITOR rax"}
{"mnemonic": "umwait", "architecture": "x86", "full_name": "User Level Monitor Wait", "summary": "Waits for store to monitored address (Low power state).", "syntax": "UMWAIT r32", "encoding": {"format": "Legacy", "hex_opcode": "F2 0F AE /6", "visual_parts": [], "binary_pattern": "F2 | 0F | AE | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "WAITPKG", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Enters a low-power wait state and monitors the address specified in EDX:EAX until a store occurs to that monitored address or a timeout expires. The timeout value in ECX specifies the deadline. This instruction requires WAITPKG support and operates only in protected/64-bit mode at privilege level 0 (CPL=0). No flags are modified by this instruction.", "pseudocode": "if (WAITPKG not supported) raise #UD;\nif (CPL != 0) raise #GP(0);\nmonitor_address ← EDX:EAX;\ntimeout_value ← ECX;\nenter_low_power_state();\nwhile (monitored_address not written && current_time < timeout_value) {\n  // CPU stays in low-power state\n}\nexit_low_power_state();\nEAX ← status_code;", "example": "UMWAIT eax"}
{"mnemonic": "tpause", "architecture": "x86", "full_name": "Timed Pause", "summary": "Pauses execution for a specified time or until trigger.", "syntax": "TPAUSE r32", "encoding": {"format": "Legacy", "hex_opcode": "66 0F AE 11:110:bbb", "visual_parts": [], "binary_pattern": "66 | 0F | AE | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "WAITPKG", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Pauses execution for a specified time interval (in TSC cycles) or until an external interrupt/event occurs, whichever comes first. The pause duration is specified in EDX:EAX and source operand controls pause type. This instruction requires WAITPKG support and operates only in protected/64-bit modes. No flags are modified; EAX contains a status code on completion.", "pseudocode": "if (WAITPKG not supported) raise #UD;\npause_type ← r32 & 0xF;\nduration ← EDX:EAX;\nif (pause_type == 0) {\n  // Absolute TSC deadline\n  while (current_tsc < duration && no_interrupt) pause_cycle();\n} else if (pause_type == 1) {\n  // Relative delay\n  end_time ← current_tsc + duration;\n  while (current_tsc < end_time && no_interrupt) pause_cycle();\n}\nEAX ← status_code;", "example": "TPAUSE eax"}
{"mnemonic": "vaddph", "architecture": "x86", "full_name": "Add Packed FP16 Values", "summary": "Adds half-precision floating-point values.", "syntax": "VADDPH zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.NP.MAP5.W0 58 /r", "visual_parts": [], "binary_pattern": "EVEX | 58", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Adds 32 pairs of half-precision (FP16) floating-point values from zmm2 and zmm3/m512, storing the result in zmm1 with optional write masking via k1. The operation follows IEEE 754 semantics for FP16 arithmetic, supporting rounding modes from MXCSR. Requires AVX-512-FP16 extension. Denormal operands may trigger exceptions per MXCSR exception mask settings.", "pseudocode": "for i ← 0 to 31 do\n  if (k1[i] or no_mask) then\n    zmm1[16*i+15:16*i] ← FP16_ADD(zmm2[16*i+15:16*i], zmm3[16*i+15:16*i]);\n  else if (zeroing_mask)\n    zmm1[16*i+15:16*i] ← 0;\nendfor;\n// MXCSR exception flags updated per result", "example": "VADDPH zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vsubph", "architecture": "x86", "full_name": "Subtract Packed FP16 Values", "summary": "Subtracts half-precision floating-point values.", "syntax": "VSUBPH zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.NP.MAP5.W0 5C /r", "visual_parts": [], "binary_pattern": "EVEX | 5C", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Subtracts 32 pairs of half-precision (FP16) floating-point values (zmm3/m512 from zmm2), storing the result in zmm1 with optional write masking via k1. The operation follows IEEE 754 semantics for FP16 arithmetic with configurable rounding modes from MXCSR. Requires AVX-512-FP16 extension. Exception behavior depends on MXCSR exception mask and denormal handling.", "pseudocode": "for i ← 0 to 31 do\n  if (k1[i] or no_mask) then\n    zmm1[16*i+15:16*i] ← FP16_SUB(zmm2[16*i+15:16*i], zmm3[16*i+15:16*i]);\n  else if (zeroing_mask)\n    zmm1[16*i+15:16*i] ← 0;\nendfor;\n// MXCSR exception flags updated per result", "example": "VSUBPH zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vmulph", "architecture": "x86", "full_name": "Multiply Packed FP16 Values", "summary": "Multiplies half-precision floating-point values.", "syntax": "VMULPH zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.NP.MAP5.W0 59 /r", "visual_parts": [], "binary_pattern": "EVEX | 59", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Multiplies 32 pairs of half-precision (FP16) floating-point values from zmm2 and zmm3/m512, storing the result in zmm1 with optional write masking via k1. Follows IEEE 754 semantics with rounding controlled by MXCSR. Requires AVX-512-FP16 extension. Exception flags in MXCSR are set per IEEE 754 rules (underflow, overflow, precision, invalid operation).", "pseudocode": "for i ← 0 to 31 do\n  if (k1[i] or no_mask) then\n    zmm1[16*i+15:16*i] ← FP16_MUL(zmm2[16*i+15:16*i], zmm3[16*i+15:16*i]);\n  else if (zeroing_mask)\n    zmm1[16*i+15:16*i] ← 0;\nendfor;\n// MXCSR exception flags updated per result", "example": "VMULPH zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vdivph", "architecture": "x86", "full_name": "Divide Packed FP16 Values", "summary": "Divides half-precision floating-point values.", "syntax": "VDIVPH zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.NP.MAP5.W0 5E /r", "visual_parts": [], "binary_pattern": "EVEX | 5E", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Divides 32 half-precision (FP16) floating-point values in zmm2 by corresponding values in zmm3/m512, storing the result in zmm1 with optional write masking via k1. Division follows IEEE 754 semantics with configurable rounding from MXCSR. Requires AVX-512-FP16 extension. Division-by-zero, invalid operations, and underflow/overflow exceptions are reported via MXCSR.", "pseudocode": "for i ← 0 to 31 do\n  if (k1[i] or no_mask) then\n    zmm1[16*i+15:16*i] ← FP16_DIV(zmm2[16*i+15:16*i], zmm3[16*i+15:16*i]);\n  else if (zeroing_mask)\n    zmm1[16*i+15:16*i] ← 0;\nendfor;\n// MXCSR exception flags updated per result (division-by-zero, etc.)", "example": "VDIVPH zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vsqrtph", "architecture": "x86", "full_name": "Square Root Packed FP16 Values", "summary": "Square root of half-precision values.", "syntax": "VSQRTPH zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.NP.MAP5.W0 51 /r", "visual_parts": [], "binary_pattern": "EVEX | 51", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Computes the square root of 32 half-precision (FP16) floating-point values from zmm2/m512, storing the result in zmm1 with optional write masking via k1. Square root follows IEEE 754 semantics with rounding controlled by MXCSR. Requires AVX-512-FP16 extension. Invalid operation (negative non-zero operand) and underflow/precision exceptions are reported via MXCSR.", "pseudocode": "for i ← 0 to 31 do\n  if (k1[i] or no_mask) then\n    zmm1[16*i+15:16*i] ← FP16_SQRT(zmm2[16*i+15:16*i]);\n  else if (zeroing_mask)\n    zmm1[16*i+15:16*i] ← 0;\nendfor;\n// MXCSR exception flags updated per result (invalid operation, underflow, etc.)", "example": "VSQRTPH zmm1, zmm2/m512"}
{"mnemonic": "vminph", "architecture": "x86", "full_name": "Minimum Packed FP16 Values", "summary": "Minimum of half-precision values.", "syntax": "VMINPH zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.NP.MAP5.W0 5D /r", "visual_parts": [], "binary_pattern": "EVEX | 5D", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Computes element-wise minimum of 32 half-precision (FP16) floating-point values from zmm2 and zmm3/m512, storing the result in zmm1 with optional write masking via k1. Comparison follows IEEE 754 minimum semantics: NaN handling returns non-NaN operand when possible; equal values return zmm2. Requires AVX-512-FP16 extension. No exception flags are modified by comparison.", "pseudocode": "for i ← 0 to 31 do\n  if (k1[i] or no_mask) then\n    a ← zmm2[16*i+15:16*i];\n    b ← zmm3[16*i+15:16*i];\n    if (is_nan(a) && not is_nan(b)) zmm1[16*i+15:16*i] ← b;\n    else if (is_nan(b) && not is_nan(a)) zmm1[16*i+15:16*i] ← a;\n    else zmm1[16*i+15:16*i] ← (a < b) ? a : b;\n  else if (zeroing_mask)\n    zmm1[16*i+15:16*i] ← 0;\nendfor;", "example": "VMINPH zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vmaxph", "architecture": "x86", "full_name": "Maximum Packed FP16 Values", "summary": "Maximum of half-precision values.", "syntax": "VMAXPH zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.NP.MAP5.W0 5F /r", "visual_parts": [], "binary_pattern": "EVEX | 5F", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Computes the maximum of packed half-precision (FP16) values from two 512-bit sources, writing results to a 512-bit ZMM register under EVEX mask control. The instruction performs element-wise comparison following IEEE 754 semantics, with special handling for NaN and signed zero. No arithmetic flags are modified; this is a masked operation requiring AVX-512-FP16 support.", "pseudocode": "for i = 0 to 31:\n  if (k1[i] == 1):\n    zmm1[16*i:16*i+15] ← max_fp16(zmm2[16*i:16*i+15], zmm3/m512[16*i:16*i+15])\n  else if (EVEX.z == 1):\n    zmm1[16*i:16*i+15] ← 0\n  // else zmm1[16*i:16*i+15] unchanged", "example": "VMAXPH zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vfmadd132ph", "architecture": "x86", "full_name": "Fused Multiply-Add (132) Packed FP16", "summary": "Computes (Dest * Src2) + Src1 in half-precision.", "syntax": "VFMADD132PH zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.MAP6.W0 98 /r", "visual_parts": [], "binary_pattern": "EVEX | 98", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Fused multiply-add instruction computing (zmm1 × zmm3/m512) + zmm2 in FP16 precision with a single rounding operation, improving accuracy and performance. The operand order (132) indicates zmm1 is the first multiplier, zmm3/m512 is the second, and zmm2 is the addend. Requires AVX-512-FP16; no arithmetic flags are modified; results are written to zmm1 under EVEX mask control.", "pseudocode": "for i = 0 to 31:\n  if (k1[i] == 1):\n    zmm1[16*i:16*i+15] ← fma_fp16(zmm1[16*i:16*i+15], zmm3/m512[16*i:16*i+15], zmm2[16*i:16*i+15])\n  else if (EVEX.z == 1):\n    zmm1[16*i:16*i+15] ← 0\n  // else zmm1[16*i:16*i+15] unchanged", "example": "VFMADD132PH zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vfmadd213ph", "architecture": "x86", "full_name": "Fused Multiply-Add (213) Packed FP16", "summary": "Computes (Src1 * Dest) + Src2 in half-precision.", "syntax": "VFMADD213PH zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.MAP6.W0 A8 /r", "visual_parts": [], "binary_pattern": "EVEX | A8", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Fused multiply-add instruction computing (zmm2 × zmm1) + zmm3/m512 in FP16 precision with a single rounding operation. The operand order (213) indicates zmm2 is the first multiplier, zmm1 is the second, and zmm3/m512 is the addend. Requires AVX-512-FP16; no arithmetic flags are modified; results are written to zmm1 under EVEX mask control.", "pseudocode": "for i = 0 to 31:\n  if (k1[i] == 1):\n    zmm1[16*i:16*i+15] ← fma_fp16(zmm2[16*i:16*i+15], zmm1[16*i:16*i+15], zmm3/m512[16*i:16*i+15])\n  else if (EVEX.z == 1):\n    zmm1[16*i:16*i+15] ← 0\n  // else zmm1[16*i:16*i+15] unchanged", "example": "VFMADD213PH zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vfmadd231ph", "architecture": "x86", "full_name": "Fused Multiply-Add (231) Packed FP16", "summary": "Computes (Src1 * Src2) + Dest in half-precision.", "syntax": "VFMADD231PH zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.MAP6.W0 B8 /r", "visual_parts": [], "binary_pattern": "EVEX | B8", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Fused multiply-add instruction computing (zmm2 × zmm3/m512) + zmm1 in FP16 precision with a single rounding operation. The operand order (231) indicates zmm2 is the first multiplier, zmm3/m512 is the second, and zmm1 is the addend. Requires AVX-512-FP16; no arithmetic flags are modified; results are written to zmm1 under EVEX mask control.", "pseudocode": "for i = 0 to 31:\n  if (k1[i] == 1):\n    zmm1[16*i:16*i+15] ← fma_fp16(zmm2[16*i:16*i+15], zmm3/m512[16*i:16*i+15], zmm1[16*i:16*i+15])\n  else if (EVEX.z == 1):\n    zmm1[16*i:16*i+15] ← 0\n  // else zmm1[16*i:16*i+15] unchanged", "example": "VFMADD231PH zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vcvtne2ps2bf16", "architecture": "x86", "full_name": "Convert Two Packed Single to Packed BFloat16", "summary": "Converts two float vectors to one BFloat16 vector.", "syntax": "VCVTNE2PS2BF16 zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F2.0F38.W0 72 /r", "visual_parts": [], "binary_pattern": "EVEX | 72", "bit_positions": "+0 | +4"}, "extension": "AVX-512-BF16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Converts two packed single-precision (FP32) vectors into one packed bfloat16 vector by interleaving and rounding, producing 32 bfloat16 values in the destination ZMM register. The 'ne2' notation indicates two inputs are consumed to produce one output with truncation-based rounding (not MXCSR-controlled). Requires AVX-512-BF16; results are written under EVEX mask control; no arithmetic flags are modified.", "pseudocode": "for i = 0 to 15:\n  if (k1[2*i] == 1 or k1[2*i+1] == 1):\n    fp32_val1 ← zmm2[32*i:32*i+31]\n    fp32_val2 ← zmm3/m512[32*i:32*i+31]\n    zmm1[16*(2*i):16*(2*i)+15] ← convert_to_bf16_truncate(fp32_val1)\n    zmm1[16*(2*i+1):16*(2*i+1)+15] ← convert_to_bf16_truncate(fp32_val2)\n  else if (EVEX.z == 1):\n    zmm1[16*(2*i):16*(2*i)+31] ← 0\n  // else zmm1 unchanged", "example": "VCVTNE2PS2BF16 zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vdpbf16ps", "architecture": "x86", "full_name": "Dot Product BFloat16 to Packed Single", "summary": "BFloat16 dot product accumulating to Float32.", "syntax": "VDPBF16PS zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F38.W0 52 /r", "visual_parts": [], "binary_pattern": "EVEX | 52", "bit_positions": "+0 | +4"}, "extension": "AVX-512-BF16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Dot product instruction that multiplies pairs of bfloat16 elements from two sources and accumulates the products into FP32 results, with 32-bit precision accumulation improving accuracy for neural network operations. Each 512-bit register holds 8 groups of 4 bfloat16 values (32 elements total) producing 8 FP32 sums. Requires AVX-512-BF16; no arithmetic flags are modified; results are written to zmm1 under EVEX mask control.", "pseudocode": "for i = 0 to 7:\n  if (k1[i] == 1):\n    sum_fp32 ← zmm1[32*i:32*i+31]  // accumulation value\n    for j = 0 to 3:\n      bf16_a ← zmm2[16*(4*i+j):16*(4*i+j)+15]\n      bf16_b ← zmm3/m512[16*(4*i+j):16*(4*i+j)+15]\n      fp32_a ← convert_bf16_to_fp32(bf16_a)\n      fp32_b ← convert_bf16_to_fp32(bf16_b)\n      sum_fp32 ← sum_fp32 + (fp32_a * fp32_b)\n    zmm1[32*i:32*i+31] ← sum_fp32\n  else if (EVEX.z == 1):\n    zmm1[32*i:32*i+31] ← 0\n  // else zmm1[32*i:32*i+31] unchanged", "example": "VDPBF16PS zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vaesenc", "architecture": "x86", "full_name": "Vector AES Encrypt (AVX512)", "summary": "AES Encrypt on 512-bit vector.", "syntax": "VAESENC zmm1, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.WIG DC /r", "visual_parts": [], "binary_pattern": "EVEX | DC", "bit_positions": "+0 | +4"}, "extension": "AVX-512-VAES", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Performs AES single-round encryption on 512-bit data, applying SubBytes, ShiftRows, MixColumns, and AddRoundKey operations to four independent 128-bit AES blocks in parallel. The instruction treats the 512-bit register as four consecutive 128-bit AES state blocks and applies the round key (zmm3/m512) element-wise. Requires AVX-512-VAES; no arithmetic flags are modified; results are written to zmm1.", "pseudocode": "for block = 0 to 3:\n  state_128 ← zmm2[128*block:128*block+127]\n  round_key_128 ← zmm3/m512[128*block:128*block+127]\n  state_128 ← AES_SubBytes(state_128)\n  state_128 ← AES_ShiftRows(state_128)\n  state_128 ← AES_MixColumns(state_128)\n  state_128 ← state_128 XOR round_key_128\n  zmm1[128*block:128*block+127] ← state_128", "example": "VAESENC zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vaesdec", "architecture": "x86", "full_name": "Vector AES Decrypt (AVX512)", "summary": "AES Decrypt on 512-bit vector.", "syntax": "VAESDEC zmm1, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.WIG DE /r", "visual_parts": [], "binary_pattern": "EVEX | DE", "bit_positions": "+0 | +4"}, "extension": "AVX-512-VAES", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Performs AES single-round decryption on 512-bit data, applying InvSubBytes, InvShiftRows, InvMixColumns, and AddRoundKey operations to four independent 128-bit AES blocks in parallel. The instruction treats the 512-bit register as four consecutive 128-bit AES state blocks and applies the round key (zmm3/m512) element-wise. Requires AVX-512-VAES; no arithmetic flags are modified; results are written to zmm1.", "pseudocode": "for block = 0 to 3:\n  state_128 ← zmm2[128*block:128*block+127]\n  round_key_128 ← zmm3/m512[128*block:128*block+127]\n  state_128 ← AES_InvSubBytes(state_128)\n  state_128 ← AES_InvShiftRows(state_128)\n  state_128 ← AES_InvMixColumns(state_128)\n  state_128 ← state_128 XOR round_key_128\n  zmm1[128*block:128*block+127] ← state_128", "example": "VAESDEC zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpclmulqdq", "architecture": "x86", "full_name": "Vector Carry-Less Multiplication (AVX512)", "summary": "Carry-less multiply on 512-bit vector.", "syntax": "VPCLMULQDQ zmm1, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "VEX.128.66.0F3A.WIG 44 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 44", "bit_positions": "+0 | +4"}, "extension": "AVX-512-VPCLMULQDQ", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs carry-less multiplication of 64-bit elements from two 512-bit vectors, producing 128-bit results that are stored in the destination ZMM register. The imm8 field selects which 64-bit quadwords from the source operands participate in the multiplication. No flags are affected; this is a cryptographic primitive used in GCM and other authenticated encryption modes.", "pseudocode": "for i in 0 to 3:\n  qw1 = (imm8[0] == 0) ? zmm2[i*64..i*64+63] : zmm2[i*64+64..i*64+127]\n  qw2 = (imm8[4] == 0) ? zmm3[i*64..i*64+63] : zmm3[i*64+64..i*64+127]\n  zmm1[i*128..i*128+127] ← carryless_multiply(qw1, qw2)", "example": "VPCLMULQDQ zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vsha512msg1", "architecture": "x86", "full_name": "SHA512 Message Schedule 1", "summary": "SHA512 intermediate calculation (AVX512).", "syntax": "VSHA512MSG1 ymm1, xmm2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.256.F2.0F38.W0 CC 11:rrr:bbb", "visual_parts": [], "binary_pattern": "CC", "bit_positions": "+0"}, "extension": "SHA512", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src", "type": "xmm2", "desc": "128-bit XMM SIMD register"}], "description": "Computes SHA-512 message schedule expansion for the first message schedule instruction, operating on a 128-bit XMM source and producing a 256-bit YMM result. This instruction is part of the SHA-512 cryptographic hash computation pipeline and requires AVX-512 or SHA512 extension support. No EFLAGS are modified.", "pseudocode": "W[0..3] ← xmm2[64*i..64*i+63] for i in 0 to 1\nW[4..7] ← expand_sha512_msg_schedule(W[0..3])\nymm1[256 bits] ← W[4..7]", "example": "VSHA512MSG1 ymm1, xmm2"}
{"mnemonic": "vsha512msg2", "architecture": "x86", "full_name": "SHA512 Message Schedule 2", "summary": "SHA512 final calculation (AVX512).", "syntax": "VSHA512MSG2 ymm1, ymm2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.256.F2.0F38.W0 CD 11:rrr:bbb", "visual_parts": [], "binary_pattern": "CD", "bit_positions": "+0"}, "extension": "SHA512", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src", "type": "ymm2", "desc": "256-bit YMM AVX register"}], "description": "Computes the second stage of SHA-512 message schedule expansion, combining two 256-bit YMM inputs to produce a 256-bit result. This instruction is used after VSHA512MSG1 to complete the message schedule preparation for SHA-512 block processing. No EFLAGS are modified.", "pseudocode": "W[0..3] ← ymm1[64*i..64*i+63] for i in 0 to 3\nW[4..7] ← ymm2[64*i..64*i+63] for i in 0 to 3\nresult ← sha512_msg2_schedule(W[0..3], W[4..7])\nymm1[256 bits] ← result", "example": "VSHA512MSG2 ymm1, ymm2"}
{"mnemonic": "vsha512rnds2", "architecture": "x86", "full_name": "SHA512 Rounds 2", "summary": "SHA512 2 rounds calculation (AVX512).", "syntax": "VSHA512RNDS2 ymm1, ymm2, xmm3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.256.F2.0F38.W0 CB 11:rrr:bbb", "visual_parts": [], "binary_pattern": "CB", "bit_positions": "+0"}, "extension": "SHA512", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "xmm3", "desc": "128-bit XMM SIMD register"}], "description": "Executes two rounds of SHA-512 compression function, processing a 256-bit working variable vector (ymm1) using a 256-bit state operand (ymm2) and round constants from a 128-bit XMM register. This instruction performs the core iterative hash compression and does not modify EFLAGS.", "pseudocode": "A_B[0..1] ← ymm1[128*i..128*i+127] for i in 0 to 1\nC_D_E_F_G_H[0..3] ← ymm2[64*i..64*i+63] for i in 0 to 3\nRK[0..1] ← xmm3[64*i..64*i+63] for i in 0 to 1\nfor round in 0 to 1:\n  temp ← sha512_compress_round(A_B, C_D_E_F_G_H, RK[round])\n  A_B, C_D_E_F_G_H ← temp\nymm1[256 bits] ← A_B[0..1]", "example": "VSHA512RNDS2 ymm1, ymm2, xmm3"}
{"mnemonic": "vsm3msg1", "architecture": "x86", "full_name": "SM3 Message Schedule 1", "summary": "SM3 crypto message schedule part 1.", "syntax": "VSM3MSG1 xmm1, xmm2, xmm3", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.NP.0F38.W0 DA /r", "visual_parts": [], "binary_pattern": "DA", "bit_positions": "+0"}, "extension": "SM3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3", "desc": "128-bit XMM SIMD register"}], "description": "Performs the first stage of SM3 (Chinese cryptographic hash standard) message schedule computation on 128-bit inputs, producing a 128-bit expanded message word. This instruction combines three XMM operands using SM3-specific expansion logic and does not modify EFLAGS.", "pseudocode": "W ← xmm2[32*i..32*i+31] for i in 0 to 3\nW_prime ← xmm3[32*i..32*i+31] for i in 0 to 3\nW_new ← sm3_msg1_expand(W, W_prime)\nxmm1[128 bits] ← W_new", "example": "VSM3MSG1 xmm1, xmm2, xmm3"}
{"mnemonic": "vsm3rnds2", "architecture": "x86", "full_name": "SM3 Rounds 2", "summary": "SM3 crypto 2 rounds.", "syntax": "VSM3RNDS2 xmm1, xmm2, imm8", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.66.0F3A.W0 DE /r /ib", "visual_parts": [], "binary_pattern": "DE", "bit_positions": "+0"}, "extension": "SM3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Executes two rounds of SM3 compression function using a 128-bit working variable XMM register and an immediate value specifying round constants and control flow. The instruction applies SM3-specific round transformations and does not modify EFLAGS.", "pseudocode": "A_B_C_D ← xmm1[32*i..32*i+31] for i in 0 to 3\nE_F_G_H ← xmm2[32*i..32*i+31] for i in 0 to 3\nround_sel ← imm8[7..0]\nfor round in 0 to 1:\n  RK ← sm3_round_constant(round_sel + round)\n  temp ← sm3_compress_round(A_B_C_D, E_F_G_H, RK)\n  A_B_C_D, E_F_G_H ← temp\nxmm1[128 bits] ← A_B_C_D", "example": "VSM3RNDS2 xmm1, xmm2, 3"}
{"mnemonic": "vsm4rnds4", "architecture": "x86", "full_name": "SM4 Four Rounds Encryption", "summary": "Performs four rounds of SM4 encryption.", "syntax": "VSM4RNDS4 xmm1, xmm2, xmm3/m128", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.F2.0F38.W0 DA /r", "visual_parts": [], "binary_pattern": "DA", "bit_positions": "+0"}, "extension": "SM4", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m128", "desc": "128-bit XMM SIMD register or 128-bit memory operand"}], "description": "Performs one round of SM4 block cipher encryption on 128-bit data, applying the SM4 S-box substitution and linear transformation using round key material from the source XMM register. This instruction is used iteratively to encrypt 32 rounds of the SM4 algorithm and does not modify EFLAGS.", "pseudocode": "plaintext ← xmm1[32*i..32*i+31] for i in 0 to 3\nRK ← xmm2[32*i..32*i+31] for i in 0 to 3\nfor i in 0 to 3:\n  X ← plaintext[0..3]\n  X ← SM4_F(X, RK[i])\n  plaintext ← rotate_left(X, 1)\nxmm1[128 bits] ← plaintext", "example": "VSM4RNDS4 xmm1, xmm2, xmm3"}
{"mnemonic": "vsm4key4", "architecture": "x86", "full_name": "SM4 Key Generation", "summary": "SM4 key generation.", "syntax": "VSM4KEY4 xmm1, xmm2, xmm3/m128", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.F3.0F38.W0 DA /r", "visual_parts": [], "binary_pattern": "DA", "bit_positions": "+0"}, "extension": "SM4", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m128", "desc": "128-bit XMM SIMD register or 128-bit memory operand"}], "description": "Performs key schedule expansion for SM4 block cipher, deriving round keys from a 128-bit key material input and producing expanded key words in the destination XMM register. This instruction is used during SM4 key setup to generate all required round keys and does not modify EFLAGS.", "pseudocode": "key ← xmm2[32*i..32*i+31] for i in 0 to 3\nexpanded_key ← SM4_KEY_SCHEDULE(key)\nxmm1[128 bits] ← expanded_key[0..3]", "example": "VSM4KEY4 xmm1, xmm2, xmm3"}
{"mnemonic": "loadiwkey", "architecture": "x86", "full_name": "Load Internal Wrapping Key", "summary": "Loads the Key Locker internal wrapping key.", "syntax": "LOADIWKEY xmm1, xmm2", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 DC", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | DC", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "KEYLOCKER", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2", "desc": "128-bit XMM SIMD register"}], "description": "Loads the Key Locker internal wrapping key from xmm2 into the processor's internal state, using xmm1 as a control operand. This instruction requires the KEYLOCKER CPU feature and is a privileged operation. No flags are modified; the instruction serializes execution and may cause a general-protection exception (#GP) if the key material is invalid or the CPL is not 0.", "pseudocode": "IF CPL != 0 THEN #GP(0) FI;\nif CPUID.KEYLOCKER = 0 THEN #UD FI;\nINTERNAL_WRAPPING_KEY ← xmm2[127:0];\nCONTROL ← xmm1[127:0];", "example": "LOADIWKEY xmm1, xmm2"}
{"mnemonic": "encodekey128", "architecture": "x86", "full_name": "Encode 128-bit Key", "summary": "Wraps a 128-bit AES key into a handle.", "syntax": "ENCODEKEY128 r32, r32", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 FA", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | FA", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "KEYLOCKER", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Wraps a 128-bit AES key into an encoded Key Locker handle, where the second r32 operand contains the key and the first r32 receives status/handle information. The ZF flag is set to indicate success (ZF=0) or failure (ZF=1). This instruction requires KEYLOCKER support and uses the internal wrapping key loaded by LOADIWKEY.", "pseudocode": "IF CPUID.KEYLOCKER = 0 THEN #UD FI;\nkey_material ← src[31:0];\nhandle_out ← AES_WRAP_128(key_material, INTERNAL_WRAPPING_KEY);\ndest[31:0] ← handle_out;\nZF ← 0;", "example": "ENCODEKEY128 eax, eax"}
{"mnemonic": "aesenc128kl", "architecture": "x86", "full_name": "AES Encrypt 128-bit Key Locker", "summary": "Encrypts data using Key Locker handle.", "syntax": "AESENC128KL m128, xmm", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 DC !(11):rrr:bbb", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | DD", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "KEYLOCKER", "operands": [{"name": "dest", "type": "m128", "desc": "128-bit memory operand"}, {"name": "src", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}], "description": "Performs AES encryption on 128-bit data in the XMM register using a Key Locker handle stored in memory. The encrypted result is written back to the XMM register, and ZF is set to indicate success or failure of the operation. This instruction requires KEYLOCKER support and performs the operation using the internal wrapping key.", "pseudocode": "IF CPUID.KEYLOCKER = 0 THEN #UD FI;\nhandle ← [dest][127:0];\nplaintext ← src[127:0];\nciphertext ← AES_ENCRYPT_128(plaintext, UNWRAP_KEY_128(handle, INTERNAL_WRAPPING_KEY));\nsrc[127:0] ← ciphertext;\nZF ← 0;", "example": "AESENC128KL [rbp-16], xmm0"}
{"mnemonic": "aesdec128kl", "architecture": "x86", "full_name": "AES Decrypt 128-bit Key Locker", "summary": "Decrypts data using Key Locker handle.", "syntax": "AESDEC128KL m128, xmm", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 DD !(11):rrr:bbb", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | DE", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "KEYLOCKER", "operands": [{"name": "dest", "type": "m128", "desc": "128-bit memory operand"}, {"name": "src", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}], "description": "Performs AES decryption on 128-bit data in the XMM register using a Key Locker handle stored in memory. The decrypted result is written back to the XMM register, and ZF is set to indicate success or failure. This instruction requires KEYLOCKER support and unwraps the key using the internal wrapping key.", "pseudocode": "IF CPUID.KEYLOCKER = 0 THEN #UD FI;\nhandle ← [dest][127:0];\nciphertext ← src[127:0];\nplaintext ← AES_DECRYPT_128(ciphertext, UNWRAP_KEY_128(handle, INTERNAL_WRAPPING_KEY));\nsrc[127:0] ← plaintext;\nZF ← 0;", "example": "AESDEC128KL [rbp-16], xmm0"}
{"mnemonic": "hreset", "architecture": "x86", "full_name": "History Reset", "summary": "Resets processor history (prediction) structures.", "syntax": "HRESET imm8", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 3A F0 C0 ib", "visual_parts": [], "binary_pattern": "F3 | 0F | 3A | F0", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "HRESET", "operands": [{"name": "dest", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Resets selected processor prediction/history structures (BTB, TLB, or other micro-architectural caches) as specified by the 8-bit immediate operand. The instruction may serialize the execution pipeline and is typically used to mitigate side-channel attacks. No EFLAGS are modified; the instruction requires HRESET CPU feature support.", "pseudocode": "IF CPUID.HRESET = 0 THEN #UD FI;\nselect_bits ← imm8[7:0];\nIF select_bits & 0x01 THEN RESET_BTB() FI;\nIF select_bits & 0x02 THEN RESET_TLB() FI;\nIF select_bits & 0x04 THEN RESET_RSB() FI;", "example": "HRESET 3"}
{"mnemonic": "serialize", "architecture": "x86", "full_name": "Serialize Instruction Execution", "summary": "Forces serialization of instruction fetch/execution.", "syntax": "SERIALIZE", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 01 E8", "visual_parts": [], "binary_pattern": "0F | 01 | E8", "bit_positions": "+0 | +1 | +2"}, "extension": "SERIALIZE", "operands": [], "description": "Serializes instruction execution by ensuring all prior instructions have completed and all memory operations are ordered before subsequent instructions execute. This instruction blocks out-of-order execution, flushes the pipeline, and may have significant performance impact. No flags are modified; the instruction requires SERIALIZE CPU feature and may incur substantial latency.", "pseudocode": "IF CPUID.SERIALIZE = 0 THEN #UD FI;\nWAIT_FOR_ALL_PRIOR_INSTRUCTIONS();\nFLUSH_EXECUTION_PIPELINE();\nCLEAR_OUT_OF_ORDER_BUFFERS();", "example": "SERIALIZE"}
{"mnemonic": "rdpid", "architecture": "x86", "full_name": "Read Processor ID", "summary": "Reads the processor ID (TSC_AUX) into register.", "syntax": "RDPID r32", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F C7 /7", "visual_parts": [], "binary_pattern": "F3 | 0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "RDPID", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Reads the processor ID (IA32_TSC_AUX MSR value) into the destination 32-bit register, providing thread/core identification information. This is a fast operation compared to RDMSR and requires the RDPID CPU feature. No flags are modified; the instruction can execute in user mode if IA32_TSC_AUX is readable.", "pseudocode": "IF CPUID.RDPID = 0 THEN #UD FI;\ndest[31:0] ← IA32_TSC_AUX[31:0];\ndest[63:32] ← 0;", "example": "RDPID eax"}
{"mnemonic": "xsaves", "architecture": "x86", "full_name": "Save Supervisor States", "summary": "Saves supervisor state components to memory (Compact).", "syntax": "XSAVES m", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F C7 /5", "visual_parts": [], "binary_pattern": "0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "XSAVES", "operands": [{"name": "dest", "type": "m", "desc": "Memory operand"}], "description": "Saves processor extended state components (both user and supervisor states) to memory in compact form, controlled by the XCR0 and IA32_XSS MSRs and a mask in EDX:EAX. This instruction is a supervisor-mode only operation requiring CPL=0 and XSAVES feature support. No EFLAGS are modified; memory layout is compact and may trigger #GP if state is invalid.", "pseudocode": "IF CPL != 0 THEN #GP(0) FI;\nIF CPUID.XSAVES = 0 THEN #UD FI;\nmask ← (EDX << 32) | EAX;\nsave_regions ← GET_SAVE_REGIONS_MASKED(XCR0, IA32_XSS, mask);\nCOMPACT_SAVE_STATE(dest, save_regions);", "example": "XSAVES [rbp-8]"}
{"mnemonic": "xrstors", "architecture": "x86", "full_name": "Restore Supervisor States", "summary": "Restores supervisor state components from memory (Compact).", "syntax": "XRSTORS m", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F C7 /3", "visual_parts": [], "binary_pattern": "0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "XSAVES", "operands": [{"name": "dest", "type": "m", "desc": "Memory operand"}], "description": "Restores processor extended state components (XMM, YMM, ZMM, and other state) from memory in compact form, using the state bitmap in EDX:EAX to determine which components to restore. This instruction is privileged (ring 0 only) and requires the XSAVES extension. Requires XSAVE feature enabled and XSAVES support; no flags are affected.", "pseudocode": "IF (CR4.OSXSAVE == 0 || CPL != 0) THEN #UD;\nIF (m is not 64-byte aligned) THEN #GP(0);\nstate_bitmap ← EDX:EAX;\nrestore_xsave_state_from_memory(m, state_bitmap, supervisor=true);", "example": "XRSTORS [rbp-8]"}
{"mnemonic": "ptwrite", "architecture": "x86", "full_name": "Write Data to Processor Trace", "summary": "Writes data to the Intel Processor Trace stream.", "syntax": "PTWRITE r32/r64", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F AE /4", "visual_parts": [], "binary_pattern": "F3 | 0F | AE | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "PTWRITE", "operands": [{"name": "dest", "type": "r32/r64", "desc": "General-purpose register or General-purpose register"}], "description": "Writes a 32-bit or 64-bit value from a general-purpose register into the Intel Processor Trace output stream, if PT is enabled and PT.PTW is set. The write is non-blocking and does not modify CPU flags. Requires PTWRITE extension support; operation has no effect if Processor Trace is disabled.", "pseudocode": "IF (CPL > 0 && IA32_RTIT_CTL.CR3Filter == 1) THEN #GP(0);\nIF (PT_enabled && PT.PTW) THEN {\n  trace_output ← operand;\n  generate_ptw_packet(operand);\n}\nELSE {\n  // No effect if PT disabled or PTW not set\n}", "example": "PTWRITE r32/r64"}
{"mnemonic": "uiret", "architecture": "x86", "full_name": "User Interrupt Return", "summary": "Returns from a User Interrupt handler.", "syntax": "UIRET", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 01 EC", "visual_parts": [], "binary_pattern": "F3 | 0F | 01 | EC", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "UINTR", "operands": [], "description": "Returns from a User Interrupt handler to user code, restoring the previously saved user context (RIP, RFLAGS) from the User Interrupt Stack Table (UIST). This is a privileged operation (executed only in the UIRET target code path) and requires UINTR extension support. No flags are affected by the instruction itself; user flags are restored from the saved context.", "pseudocode": "IF (!UINTR_enabled) THEN #UD;\ntemp_rip ← read_from_UIST();\ntemp_rflags ← read_from_UIST();\nRIP ← temp_rip;\nRFLAGS ← temp_rflags;\nRETURN_TO_USER_MODE();", "example": "UIRET"}
{"mnemonic": "senduipi", "architecture": "x86", "full_name": "Send User Inter-Processor Interrupt", "summary": "Sends a User IPI to another processor.", "syntax": "SENDUIPI r64", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F C7 11:110:bbb", "visual_parts": [], "binary_pattern": "F3 | 0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "UINTR", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}], "description": "Sends a User Inter-Processor Interrupt (User IPI) to another processor identified by the UIPI index stored in the source 64-bit register. The source register contains an UPID (User IPI Posting Descriptor) index that identifies the target thread. Requires UINTR extension support; operation may be serializing and updates the target processor's interrupt state.", "pseudocode": "IF (!UINTR_enabled) THEN #UD;\nuipi_index ← src_reg[63:0];\nupid ← retrieve_UPID_from_index(uipi_index);\npost_user_interrupt_to_target(upid);\nSEND_IPI_TO_TARGET_CPU();", "example": "SENDUIPI rax"}
{"mnemonic": "in", "architecture": "x86", "full_name": "Input from Port", "summary": "Reads data from an I/O port into AL/AX/EAX.", "syntax": "IN AL, imm8", "encoding": {"format": "Legacy", "hex_opcode": "E4", "visual_parts": [], "binary_pattern": "E4", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "AL", "desc": "Implicit AL register (8-bit accumulator)"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Reads a byte from an I/O port (specified by the immediate 8-bit operand) and stores the result in AL. If IOPL permits, this instruction can be used in user mode; otherwise it requires ring 0. No flags are affected. The port number is zero-extended to 16 bits for I/O address calculation.", "pseudocode": "IF (CPL > IOPL && !V86_mode) THEN #GP(0);\nAL ← I/O_port[imm8];", "example": "IN AL, 3"}
{"mnemonic": "out", "architecture": "x86", "full_name": "Output to Port", "summary": "Writes data from AL/AX/EAX to an I/O port.", "syntax": "OUT imm8, AL", "encoding": {"format": "Legacy", "hex_opcode": "E6", "visual_parts": [], "binary_pattern": "E6", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "imm8", "desc": "8-bit signed immediate"}, {"name": "src", "type": "AL", "desc": "Implicit AL register (8-bit accumulator)"}], "description": "Writes a byte from AL to an I/O port (specified by the immediate 8-bit operand). If IOPL permits, this instruction can be used in user mode; otherwise it requires ring 0. No flags are affected. The port number is zero-extended to 16 bits for I/O address calculation.", "pseudocode": "IF (CPL > IOPL && !V86_mode) THEN #GP(0);\nI/O_port[imm8] ← AL;", "example": "OUT 3, AL"}
{"mnemonic": "ins", "architecture": "x86", "full_name": "Input String from Port", "summary": "Reads string from I/O port to memory at [EDI].", "syntax": "INSB", "encoding": {"format": "Legacy", "hex_opcode": "6C", "visual_parts": [], "binary_pattern": "6C", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Reads a byte from the I/O port specified in DX and writes it to memory at the address [RDI/EDI/DI] (selected by address-size override). The destination address pointer is incremented or decremented by 1 based on the direction flag (DF). This is a string instruction often used with REP prefix; no flags are affected directly by INS itself.", "pseudocode": "IF (CPL > IOPL && !V86_mode) THEN #GP(0);\ntempByte ← I/O_port[DX];\n[RDI] ← tempByte;\nIF (DF == 0) THEN RDI ← RDI + 1;\nELSE RDI ← RDI - 1;", "example": "INSB"}
{"mnemonic": "outs", "architecture": "x86", "full_name": "Output String to Port", "summary": "Writes string from memory at [ESI] to I/O port.", "syntax": "OUTSB", "encoding": {"format": "Legacy", "hex_opcode": "6E", "visual_parts": [], "binary_pattern": "6E", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Reads a byte from memory at the address [RSI/ESI/SI] (selected by address-size override) and writes it to the I/O port specified in DX. The source address pointer is incremented or decremented by 1 based on the direction flag (DF). This is a string instruction often used with REP prefix; no flags are affected directly by OUTS itself.", "pseudocode": "IF (CPL > IOPL && !V86_mode) THEN #GP(0);\ntempByte ← [RSI];\nI/O_port[DX] ← tempByte;\nIF (DF == 0) THEN RSI ← RSI + 1;\nELSE RSI ← RSI - 1;", "example": "OUTSB"}
{"mnemonic": "lods", "architecture": "x86", "full_name": "Load String", "summary": "Loads byte/word/dword from [ESI] into AL/AX/EAX.", "syntax": "LODSB", "encoding": {"format": "Legacy", "hex_opcode": "AC", "visual_parts": [], "binary_pattern": "AC", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Loads a byte, word, or doubleword from memory at address DS:[ESI] (or RSI in 64-bit mode) into the accumulator (AL, AX, or EAX respectively), then increments or decrements ESI/RSI by the operand size based on the direction flag (DF). No flags are affected by this instruction.", "pseudocode": "if (DF == 0) {\n  ESI ← ESI + operand_size;\n} else {\n  ESI ← ESI - operand_size;\n}\nAL/AX/EAX ← [DS:ESI];", "example": "LODSB"}
{"mnemonic": "stos", "architecture": "x86", "full_name": "Store String", "summary": "Stores AL/AX/EAX to memory at [EDI].", "syntax": "STOSB", "encoding": {"format": "Legacy", "hex_opcode": "AA", "visual_parts": [], "binary_pattern": "AA", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Stores the contents of the accumulator (AL, AX, or EAX) into memory at address ES:[EDI] (or RDI in 64-bit mode), then increments or decrements EDI/RDI by the operand size based on the direction flag (DF). No flags are affected. This instruction is commonly used with REP prefix for bulk memory fills.", "pseudocode": "[ES:EDI] ← AL/AX/EAX;\nif (DF == 0) {\n  EDI ← EDI + operand_size;\n} else {\n  EDI ← EDI - operand_size;\n}", "example": "STOSB"}
{"mnemonic": "scas", "architecture": "x86", "full_name": "Scan String", "summary": "Compares AL/AX/EAX with memory at [EDI].", "syntax": "SCASB", "encoding": {"format": "Legacy", "hex_opcode": "AE", "visual_parts": [], "binary_pattern": "AE", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Compares the accumulator (AL, AX, or EAX) with a byte, word, or doubleword in memory at address ES:[EDI], setting EFLAGS as if by subtraction, then increments or decrements EDI/RDI by the operand size based on DF. ZF, CF, OF, SF, AF, and PF are set according to the comparison result.", "pseudocode": "temp ← AL/AX/EAX - [ES:EDI];\nZF ← (temp == 0);\nCF ← (AL/AX/EAX < [ES:EDI]);\nOF ← overflow_from_subtraction;\nSF ← sign_bit_of(temp);\nAF ← auxiliary_carry_from_subtraction;\nPF ← parity_of(temp);\nif (DF == 0) {\n  EDI ← EDI + operand_size;\n} else {\n  EDI ← EDI - operand_size;\n}", "example": "SCASB"}
{"mnemonic": "cmps", "architecture": "x86", "full_name": "Compare String", "summary": "Compares byte/word at [ESI] with [EDI].", "syntax": "CMPSB", "encoding": {"format": "Legacy", "hex_opcode": "A6", "visual_parts": [], "binary_pattern": "A6", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Compares a byte, word, or doubleword at memory address DS:[ESI] with the value at ES:[EDI], setting EFLAGS as if by subtraction, then increments or decrements both ESI/RSI and EDI/RDI by the operand size based on DF. ZF, CF, OF, SF, AF, and PF reflect the comparison result.", "pseudocode": "temp ← [DS:ESI] - [ES:EDI];\nZF ← (temp == 0);\nCF ← ([DS:ESI] < [ES:EDI]);\nOF ← overflow_from_subtraction;\nSF ← sign_bit_of(temp);\nAF ← auxiliary_carry_from_subtraction;\nPF ← parity_of(temp);\nif (DF == 0) {\n  ESI ← ESI + operand_size;\n  EDI ← EDI + operand_size;\n} else {\n  ESI ← ESI - operand_size;\n  EDI ← EDI - operand_size;\n}", "example": "CMPSB"}
{"mnemonic": "lds", "architecture": "x86", "full_name": "Load Far Pointer using DS", "summary": "Loads pointer into DS and register.", "syntax": "LDS r, m", "encoding": {"format": "Legacy", "hex_opcode": "C5", "visual_parts": [], "binary_pattern": "C5", "bit_positions": "+0"}, "extension": "Base (Legacy)", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Loads a far pointer from memory into a general-purpose register and the DS segment register. The memory operand contains a 32-bit pointer (16-bit offset and 16-bit segment) in 16/32-bit modes. Not available in 64-bit mode. No flags are affected.", "pseudocode": "dest ← [src];\nDS ← [src + operand_size];", "example": "LDS rax, [rbp-8]"}
{"mnemonic": "les", "architecture": "x86", "full_name": "Load Far Pointer using ES", "summary": "Loads pointer into ES and register.", "syntax": "LES r, m", "encoding": {"format": "Legacy", "hex_opcode": "C4", "visual_parts": [], "binary_pattern": "C4", "bit_positions": "+0"}, "extension": "Base (Legacy)", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Loads a far pointer from memory into a general-purpose register and the ES segment register. The memory operand contains a 32-bit pointer (16-bit offset and 16-bit segment) in 16/32-bit modes. Not available in 64-bit mode. No flags are affected.", "pseudocode": "dest ← [src];\nES ← [src + operand_size];", "example": "LES rax, [rbp-8]"}
{"mnemonic": "lfs", "architecture": "x86", "full_name": "Load Far Pointer using FS", "summary": "Loads pointer into FS and register.", "syntax": "LFS r, m", "encoding": {"format": "Legacy", "hex_opcode": "0F B4", "visual_parts": [], "binary_pattern": "0F | B4", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Loads a far pointer from memory into a general-purpose register and the FS segment register. The memory operand contains a 32-bit or 48-bit pointer (16/32-bit offset and 16-bit segment). Available in 32-bit and 64-bit modes. No flags are affected.", "pseudocode": "dest ← [src];\nFS ← [src + operand_size];", "example": "LFS rax, [rbp-8]"}
{"mnemonic": "lgs", "architecture": "x86", "full_name": "Load Far Pointer using GS", "summary": "Loads pointer into GS and register.", "syntax": "LGS r, m", "encoding": {"format": "Legacy", "hex_opcode": "0F B5", "visual_parts": [], "binary_pattern": "0F | B5", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Loads a far pointer from memory into a general-purpose register and the GS segment register. The memory operand contains a 32-bit or 48-bit pointer (16/32-bit offset and 16-bit segment). Available in 32-bit and 64-bit modes. No flags are affected.", "pseudocode": "dest ← [src];\nGS ← [src + operand_size];", "example": "LGS rax, [rbp-8]"}
{"mnemonic": "lss", "architecture": "x86", "full_name": "Load Far Pointer using SS", "summary": "Loads pointer into SS and register.", "syntax": "LSS r, m", "encoding": {"format": "Legacy", "hex_opcode": "0F B2", "visual_parts": [], "binary_pattern": "0F | B2", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Loads a 48-bit or 80-bit far pointer from memory into SS and a general-purpose register, updating the stack segment base address and register value simultaneously. The memory operand contains the offset and segment selector; the segment is loaded into SS and the offset into the destination register. This instruction does not modify any flags and is available in real, protected, and 64-bit modes.", "pseudocode": "if (operand_size == 32) {\n  offset ← [src];\n  SS ← [src + 4];\n  dest ← offset;\n} else if (operand_size == 64) {\n  offset ← [src];\n  SS ← [src + 8];\n  dest ← offset;\n}", "example": "LSS rax, [rbp-8]"}
{"mnemonic": "swapgs", "architecture": "x86", "full_name": "Swap GS Base Register", "summary": "Swaps user/kernel GS base address (System).", "syntax": "SWAPGS", "encoding": {"format": "Legacy", "hex_opcode": "0F 01 F8", "visual_parts": [], "binary_pattern": "0F | 01 | F8", "bit_positions": "+0 | +1 | +2"}, "extension": "Base (64-bit System)", "operands": [], "description": "Atomically exchanges the user-mode and kernel-mode FS base register values by swapping the contents of the MSR_FS_BASE and MSR_KERNEL_FS_BASE model-specific registers. This is a 64-bit only instruction used for efficient user/kernel context switching in system software. No flags are modified, and the operation serializes the instruction pipeline.", "pseudocode": "if (CODESIZE == 64 && CPL == 0) {\n  temp ← MSR_FS_BASE;\n  MSR_FS_BASE ← MSR_KERNEL_FS_BASE;\n  MSR_KERNEL_FS_BASE ← temp;\n}", "example": "SWAPGS"}
{"mnemonic": "rdfsbase", "architecture": "x86", "full_name": "Read FS Base", "summary": "Reads the FS base address into a register.", "syntax": "RDFSBASE r64", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F AE /0", "visual_parts": [], "binary_pattern": "F3 | 0F | AE | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "FSGSBASE", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}], "description": "Reads the current FS segment base address (from MSR_FS_BASE) into a 64-bit general-purpose register. Available only in 64-bit mode and requires the FSGSBASE CPU feature to be enabled. No flags are modified; the instruction executes with serialization semantics to ensure consistency of segment-base state.", "pseudocode": "if (FSGSBASE_enabled) {\n  dest ← MSR_FS_BASE;\n} else {\n  raise(UD_EXCEPTION);\n}", "example": "RDFSBASE rax"}
{"mnemonic": "rdgsbase", "architecture": "x86", "full_name": "Read GS Base", "summary": "Reads the GS base address into a register.", "syntax": "RDGSBASE r64", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F AE /1", "visual_parts": [], "binary_pattern": "F3 | 0F | AE | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "FSGSBASE", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}], "description": "Reads the current GS segment base address (from MSR_GS_BASE) into a 64-bit general-purpose register. Available only in 64-bit mode and requires the FSGSBASE CPU feature to be enabled. No flags are modified; the instruction executes with serialization semantics to ensure consistency of segment-base state.", "pseudocode": "if (FSGSBASE_enabled) {\n  dest ← MSR_GS_BASE;\n} else {\n  raise(UD_EXCEPTION);\n}", "example": "RDGSBASE rax"}
{"mnemonic": "wrfsbase", "architecture": "x86", "full_name": "Write FS Base", "summary": "Writes a register to the FS base address.", "syntax": "WRFSBASE r64", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F AE /2", "visual_parts": [], "binary_pattern": "F3 | 0F | AE | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "FSGSBASE", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}], "description": "Writes the value from a 64-bit general-purpose register into the FS segment base address (MSR_FS_BASE). Available only in 64-bit mode and requires the FSGSBASE CPU feature to be enabled. No flags are modified; the instruction executes with serialization semantics to ensure consistency of segment-base state.", "pseudocode": "if (FSGSBASE_enabled) {\n  MSR_FS_BASE ← dest;\n} else {\n  raise(UD_EXCEPTION);\n}", "example": "WRFSBASE rax"}
{"mnemonic": "wrgsbase", "architecture": "x86", "full_name": "Write GS Base", "summary": "Writes a register to the GS base address.", "syntax": "WRGSBASE r64", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F AE /3", "visual_parts": [], "binary_pattern": "F3 | 0F | AE | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "FSGSBASE", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}], "description": "Writes the value from a 64-bit general-purpose register into the GS segment base address (MSR_GS_BASE). Available only in 64-bit mode and requires the FSGSBASE CPU feature to be enabled. No flags are modified; the instruction executes with serialization semantics to ensure consistency of segment-base state.", "pseudocode": "if (FSGSBASE_enabled) {\n  MSR_GS_BASE ← src;\n} else {\n  raise(UD_EXCEPTION);\n}", "example": "WRGSBASE rax"}
{"mnemonic": "monitor", "architecture": "x86", "full_name": "Monitor", "summary": "Sets up a linear address range to be monitored.", "syntax": "MONITOR", "encoding": {"format": "Legacy", "hex_opcode": "0F 01 C8", "visual_parts": [], "binary_pattern": "0F | 01 | C8", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE3", "operands": [], "description": "Establishes a linear address range starting at [RAX] with a size specified by ECX (in bytes) to be monitored for writes by the CPU. The EAX and ECX registers supply the monitor address and size; EDX supplies optional extensions. No flags are modified. This instruction typically requires CPL ≤ 1 (ring 0/1) and is used with MWAIT for efficient polling.", "pseudocode": "if (CPL <= 1 || (CR4.MONITOR_BIT && CPL == 3)) {\n  MONITOR_ADDR ← RAX;\n  MONITOR_SIZE ← ECX;\n  MONITOR_EXT ← EDX;\n  set_up_address_range_monitoring();\n} else {\n  raise(GP_EXCEPTION);\n}", "example": "MONITOR"}
{"mnemonic": "mwait", "architecture": "x86", "full_name": "Monitor Wait", "summary": "Waits for a write to a monitored address.", "syntax": "MWAIT", "encoding": {"format": "Legacy", "hex_opcode": "0F 01 C9", "visual_parts": [], "binary_pattern": "0F | 01 | C9", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE3", "operands": [], "description": "Suspends CPU execution and waits for a write to an address range that was previously set up by MONITOR, or waits for an interrupt or other wake event. The EAX register specifies the monitor sub-C-state (low byte) and optional extensions (high bytes); EBX may specify additional parameters depending on CPU model. No flags are modified. This instruction serializes the processor and is typically restricted to CPL ≤ 1.", "pseudocode": "if (CPL <= 1 || (CR4.MONITOR_BIT && CPL == 3)) {\n  substate ← EAX[7:0];\n  extensions ← EAX[31:8];\n  enter_monitor_wait(substate, extensions);\n  wait_for_wakeup_or_interrupt();\n} else {\n  raise(GP_EXCEPTION);\n}", "example": "MWAIT"}
{"mnemonic": "getsec", "architecture": "x86", "full_name": "Get Security Extensions", "summary": "Entry point for Safer Mode Extensions (Trusted Execution).", "syntax": "GETSEC", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 37", "visual_parts": [], "binary_pattern": "0F | 37", "bit_positions": "+0 | +1"}, "extension": "SMX", "operands": [], "description": "Entry point for Safer Mode Extensions (SMX), allowing software to invoke security functions in trusted execution mode. The specific function is determined by the EAX register at execution time. This instruction serializes the pipeline, disables interrupts during execution, and requires either SMX mode to be enabled or execution from authenticated code. On success, control returns to the instruction following GETSEC; on failure or security violation, a #UD or system reset may occur.", "pseudocode": "// EAX contains function code (e.g., GETSEC.CAPABILITIES=0, GETSEC.ENTERACCS=2, etc.)\n// Execution is serialized; interrupts disabled during SMX operation\nIF (SMX_mode_enabled OR authenticated_code_execution_mode) THEN\n  Invoke_SMX_function(EAX);\n  // Control returns here on success\nELSE\n  #UD; // Undefined Opcode fault\nEND;", "example": "GETSEC"}
{"mnemonic": "bndmk", "architecture": "x86", "full_name": "Make Bounds", "summary": "Creates bounds data for MPX.", "syntax": "BNDMK b, m", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 1B", "visual_parts": [], "binary_pattern": "F3 | 0F | 1B", "bit_positions": "+0 | +1 | +2"}, "extension": "MPX", "operands": [{"name": "dest", "type": "b", "desc": "MPX bounds register (bnd0-bnd3)"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Creates a bounds pair from a memory address range, storing the lower bound and upper bound in the destination bounds register (bnd0-bnd3). The source memory operand specifies an address; the instruction computes bounds from memory operand addressing. No flags are set. This instruction is part of Memory Protection Extensions (MPX) and is deprecated on modern processors.", "pseudocode": "// Compute bounds from memory operand m\n// The bounds are derived from the addressing operation itself\nlower_bound ← compute_lower_bound(m);\nupper_bound ← compute_upper_bound(m);\n// Store in 128-bit bounds register (2×64-bit values)\nbndN.lower ← lower_bound;\nbndN.upper ← upper_bound;", "example": "BNDMK b, [rbp-8]"}
{"mnemonic": "bndcl", "architecture": "x86", "full_name": "Check Lower Bound", "summary": "Checks if address is within lower bound.", "syntax": "BNDCL b, r/m", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 1A", "visual_parts": [], "binary_pattern": "F3 | 0F | 1A", "bit_positions": "+0 | +1 | +2"}, "extension": "MPX", "operands": [{"name": "dest", "type": "b", "desc": "MPX bounds register (bnd0-bnd3)"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Checks if an address or value is greater than or equal to the lower bound stored in the bounds register; if not, a bounds exception (#BR) is signaled. The source operand (register or memory) contains the address to be checked against bndN.lower. No flags are modified; an out-of-bounds condition triggers exception delivery. This instruction is part of deprecated Memory Protection Extensions (MPX).", "pseudocode": "address ← (src is memory) ? load_from_memory(src) : src;\nIF (address < bndN.lower) THEN\n  #BR; // Bounds Range Exceeded exception\nEND;\n// No flags modified; execution continues on success", "example": "BNDCL b, rbx"}
{"mnemonic": "bndcu", "architecture": "x86", "full_name": "Check Upper Bound", "summary": "Checks if address is within upper bound.", "syntax": "BNDCU b, r/m", "encoding": {"format": "Legacy", "hex_opcode": "F2 0F 1A", "visual_parts": [], "binary_pattern": "F2 | 0F | 1A", "bit_positions": "+0 | +1 | +2"}, "extension": "MPX", "operands": [{"name": "dest", "type": "b", "desc": "MPX bounds register (bnd0-bnd3)"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Checks if an address or value is less than or equal to the upper bound stored in the bounds register; if not, a bounds exception (#BR) is signaled. The source operand (register or memory) contains the address to be checked against bndN.upper. No flags are modified; an out-of-bounds condition triggers exception delivery. This instruction is part of deprecated Memory Protection Extensions (MPX).", "pseudocode": "address ← (src is memory) ? load_from_memory(src) : src;\nIF (address > bndN.upper) THEN\n  #BR; // Bounds Range Exceeded exception\nEND;\n// No flags modified; execution continues on success", "example": "BNDCU b, rbx"}
{"mnemonic": "bndmov", "architecture": "x86", "full_name": "Move Bounds", "summary": "Moves MPX bounds data.", "syntax": "BNDMOV b, b/m", "encoding": {"format": "Legacy", "hex_opcode": "66 0F 1A", "visual_parts": [], "binary_pattern": "66 | 0F | 1A", "bit_positions": "+0 | +1 | +2"}, "extension": "MPX", "operands": [{"name": "dest", "type": "b", "desc": "MPX bounds register (bnd0-bnd3)"}, {"name": "src", "type": "b/m", "desc": "Memory operand"}], "description": "Moves a 128-bit bounds pair from source (bounds register or memory) to destination (bounds register). The bounds pair consists of two 64-bit values (lower and upper bounds). No flags are set or modified. This instruction is part of deprecated Memory Protection Extensions (MPX) and is one of the few instructions that operate directly on bounds data.", "pseudocode": "// Source can be bounds register or 16 bytes of memory\nIF (src is bounds register) THEN\n  bndN.lower ← src.lower;\n  bndN.upper ← src.upper;\nELSE\n  bndN.lower ← [src];\n  bndN.upper ← [src + 8];\nEND;\n// No flags modified", "example": "BNDMOV b, b/m"}
{"mnemonic": "rdpkru", "architecture": "x86", "full_name": "Read Protection Key Rights", "summary": "Reads PKRU register into EAX (User-mode pages).", "syntax": "RDPKRU", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 01 EE", "visual_parts": [], "binary_pattern": "0F | 01 | EE", "bit_positions": "+0 | +1 | +2"}, "extension": "PKU", "operands": [], "description": "Reads the Protection Key Rights User register (PKRU) into EAX; EDX is zeroed. PKRU controls read and write access permissions for pages marked with a protection key (0-15). This instruction is a serializing operation at the architectural level and is only available in 64-bit mode and user mode (CPL=3). No flags are modified by this instruction.", "pseudocode": "// Read PKRU into EAX, zero EDX\nEAX ← PKRU;\nEDX ← 0;\n// No flags modified; instruction is serializing", "example": "RDPKRU"}
{"mnemonic": "wrpkru", "architecture": "x86", "full_name": "Write Protection Key Rights", "summary": "Writes EAX/EDX to PKRU register.", "syntax": "WRPKRU", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 01 EF", "visual_parts": [], "binary_pattern": "0F | 01 | EF", "bit_positions": "+0 | +1 | +2"}, "extension": "PKU", "operands": [], "description": "Writes the value in EAX to the Protection Key Rights User register (PKRU); EDX must be zero. PKRU controls read/write access permissions for pages with protection keys (0-15). This instruction is a serializing operation and is available only in 64-bit mode at user mode (CPL=3). No flags are set; if EDX is nonzero, #GP(0) is raised.", "pseudocode": "// Write EAX to PKRU, EDX must be zero\nIF (EDX ≠ 0) THEN\n  #GP(0); // General Protection Fault\nELSE\n  PKRU ← EAX;\nEND;\n// No flags modified; instruction is serializing", "example": "WRPKRU"}
{"mnemonic": "vpdpbusd", "architecture": "x86", "full_name": "Multiply and Add Unsigned and Signed Bytes", "summary": "Dot product of unsigned/signed bytes, accum to dword.", "syntax": "VPDPBUSD zmm1, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 50 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 50", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VNNI", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Performs a dot product of unsigned 8-bit and signed 8-bit integers across multiple pairs, accumulating the results into 32-bit dwords. Processes 512 bits (64 bytes) with 16 sets of 4-byte dot products (zmm2[31:0] × zmm3[31:0] + zmm1[31:0]), with masking and rounding support via EVEX encoding. ZF, PF, CF, OF, SF, AF are undefined after execution; no integer flags are modified.", "pseudocode": "// VPDPBUSD zmm1{k1}{z}, zmm2, zmm3/m512\n// Signed 8×4 dot products with 32-bit accumulation\nFOR i ← 0 TO 15 DO  // 16 dwords in 512-bit vector\n  prod0 ← (unsigned int8) zmm2[i*32 + 7:0] × (signed int8) zmm3[i*32 + 7:0];\n  prod1 ← (unsigned int8) zmm2[i*32 + 15:8] × (signed int8) zmm3[i*32 + 15:8];\n  prod2 ← (unsigned int8) zmm2[i*32 + 23:16] × (signed int8) zmm3[i*32 + 23:16];\n  prod3 ← (unsigned int8) zmm2[i*32 + 31:24] × (signed int8) zmm3[i*32 + 31:24];\n  sum ← prod0 + prod1 + prod2 + prod3;\n  zmm1[i*32 + 31:0] ← zmm1[i*32 + 31:0] + sum; // Accumulate\nEND;\n// Masking and zeroing applied per EVEX encoding; no flags modified", "example": "VPDPBUSD zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpdpbusds", "architecture": "x86", "full_name": "Multiply and Add Unsigned and Signed Bytes with Saturation", "summary": "Dot product of unsigned/signed bytes, accum to dword (Saturate).", "syntax": "VPDPBUSDS zmm1, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 51 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 51", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VNNI", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Computes dot product of unsigned and signed bytes, accumulating results into 32-bit signed integers with saturation. Processes 16 pairs of (unsigned byte × signed byte) products per 512-bit vector, summing each group of 4 products and saturating the result to the signed 32-bit range. No flags are affected; operates only on vector registers and memory.", "pseudocode": "for i in 0 to 15 {\n  prod0 = ZeroExtend(src1[i*32+0:7]) * SignExtend(src2[i*32+0:7]);\n  prod1 = ZeroExtend(src1[i*32+8:15]) * SignExtend(src2[i*32+8:15]);\n  prod2 = ZeroExtend(src1[i*32+16:23]) * SignExtend(src2[i*32+16:23]);\n  prod3 = ZeroExtend(src1[i*32+24:31]) * SignExtend(src2[i*32+24:31]);\n  sum = prod0 + prod1 + prod2 + prod3;\n  dest[i*32:31] ← SaturateSignedToS32(sum);\n}", "example": "VPDPBUSDS zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpdpwssd", "architecture": "x86", "full_name": "Multiply and Add Signed Words", "summary": "Dot product of signed words, accum to dword.", "syntax": "VPDPWSSD zmm1, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 52 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 52", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VNNI", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Computes dot product of signed 16-bit words, accumulating results into 32-bit signed integers without saturation. Processes 8 pairs of signed word products per 512-bit vector, summing each group of 2 products and storing the result to the destination. No flags are affected; operates only on vector registers and memory.", "pseudocode": "for i in 0 to 7 {\n  prod0 = SignExtend(src1[i*32+0:15]) * SignExtend(src2[i*32+0:15]);\n  prod1 = SignExtend(src1[i*32+16:31]) * SignExtend(src2[i*32+16:31]);\n  sum = prod0 + prod1;\n  dest[i*32:31] ← sum;\n}", "example": "VPDPWSSD zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpdpwssds", "architecture": "x86", "full_name": "Multiply and Add Signed Words with Saturation", "summary": "Dot product of signed words, accum to dword (Saturate).", "syntax": "VPDPWSSDS zmm1, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 53 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 53", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VNNI", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Computes dot product of signed 16-bit words, accumulating results into 32-bit signed integers with saturation. Processes 8 pairs of signed word products per 512-bit vector, summing each group of 2 products and saturating the result to the signed 32-bit range. No flags are affected; operates only on vector registers and memory.", "pseudocode": "for i in 0 to 7 {\n  prod0 = SignExtend(src1[i*32+0:15]) * SignExtend(src2[i*32+0:15]);\n  prod1 = SignExtend(src1[i*32+16:31]) * SignExtend(src2[i*32+16:31]);\n  sum = prod0 + prod1;\n  dest[i*32:31] ← SaturateSignedToS32(sum);\n}", "example": "VPDPWSSDS zmm1, zmm2, zmm3/m512"}
{"mnemonic": "gf2p8affineinvqb", "architecture": "x86", "full_name": "Galois Field Affine Transformation Inverse", "summary": "Computes inverse affine transformation in GF(2^8).", "syntax": "GF2P8AFFINEINVQB xmm1, xmm2/m128, imm8", "encoding": {"format": "VEX", "hex_opcode": "66 0F 3A CF /r ib", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | CF", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "GFNI", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs inverse affine transformation in the Galois Field GF(2^8) on 128-bit packed bytes. Each byte is transformed by computing b × src1 ⊕ imm8 where operations are in GF(2^8), with b from the first operand. The immediate byte controls the constant term of the affine transformation. No flags are affected; operates only on vector registers and memory.", "pseudocode": "for i in 0 to 15 {\n  byte_val = dest[i*8:7];\n  gf_prod = GF2P8_MultiplyInverse(byte_val, src1[i*8:7]);\n  dest[i*8:7] ← gf_prod ⊕ imm8;\n}", "example": "GF2P8AFFINEINVQB xmm1, xmm2/m128, 3"}
{"mnemonic": "prefetchw", "architecture": "x86", "full_name": "Prefetch Data into Caches in Anticipation of a Write", "summary": "Prefetches data with intent to write (RFO).", "syntax": "PREFETCHW m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 0D /1", "visual_parts": [], "binary_pattern": "0F | 0D | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "PREFETCHW", "operands": [{"name": "dest", "type": "m8", "desc": "8-bit memory operand"}], "description": "Prefetches a cache line from memory with intent to write, requesting read-for-ownership (RFO) semantics. Brings the data into the lowest-level private cache (typically L1D) in exclusive or modified state to optimize subsequent write operations. This instruction is a hint and has no architectural effect on registers, flags, or memory contents.", "pseudocode": "// Prefetch memory address for writing (RFO semantics)\nCachePrefetchForWrite([mem_address]);", "example": "PREFETCHW [rbp-1]"}
{"mnemonic": "prefetchwt1", "architecture": "x86", "full_name": "Prefetch Hint T1 with Intent to Write", "summary": "Prefetches data to L2 (T1 hint) with intent to write.", "syntax": "PREFETCHWT1 m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 0D /2", "visual_parts": [], "binary_pattern": "0F | 0D | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "PREFETCHWT1", "operands": [{"name": "dest", "type": "m8", "desc": "8-bit memory operand"}], "description": "Prefetches a cache line from memory with intent to write into the L2 cache (T1 hint). Optimizes for temporal locality by loading data into the mid-level cache hierarchy rather than L1, reducing contention when multiple cores are writing to different addresses. This instruction is a hint and has no architectural effect on registers, flags, or memory contents.", "pseudocode": "// Prefetch memory address to L2 (T1 hint) with write intent\nCachePrefetchToL2ForWrite([mem_address]);", "example": "PREFETCHWT1 [rbp-1]"}
{"mnemonic": "vscatterdps", "architecture": "x86", "full_name": "Scatter Packed Single Precision", "summary": "Stores floats to non-contiguous memory locations.", "syntax": "VSCATTERDPS [base+zmm_idx*scale] {k1}, zmm1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 A2 /vsib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | A2", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "[base+zmm_idx*scale]", "desc": "AVX-512 scatter: base register + scaled ZMM vector index"}, {"name": "src", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}], "description": "Stores 16 packed single-precision floats (32-bit each) to non-contiguous memory locations determined by a base register and 32-bit ZMM index vector with optional scaling. Each element is stored to memory[base + index[i] × scale] where the index is zero-extended from the low 32 bits of each 64-bit ZMM element. The operation is masked via the k1 writemask; no flags are affected.", "pseudocode": "for i in 0 to 15 {\n  if k1[i] {\n    addr = base_reg + ZeroExtend(src2_idx[i*32:31]) * scale;\n    [addr] ← src1[i*32:31];\n  }\n}", "example": "VSCATTERDPS [base+zmm_idx*scale], zmm1"}
{"mnemonic": "vscatterdpd", "architecture": "x86", "full_name": "Scatter Packed Double Precision", "summary": "Stores doubles to non-contiguous memory locations.", "syntax": "VSCATTERDPD [base+zmm_idx*scale] {k1}, zmm1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 A2 /vsib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | A2", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "[base+zmm_idx*scale]", "desc": "AVX-512 scatter: base register + scaled ZMM vector index"}, {"name": "src", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}], "description": "Stores 8 packed double-precision floats (64-bit each) to non-contiguous memory locations determined by a base register and 64-bit ZMM index vector with optional scaling. Each element is stored to memory[base + index[i] × scale] where the index comes from the corresponding 64-bit ZMM element. The operation is masked via the k1 writemask; no flags are affected.", "pseudocode": "for i in 0 to 7 {\n  if k1[i] {\n    addr = base_reg + src2_idx[i*64:63] * scale;\n    [addr] ← src1[i*64:63];\n  }\n}", "example": "VSCATTERDPD [base+zmm_idx*scale], zmm1"}
{"mnemonic": "vscatterqps", "architecture": "x86", "full_name": "Scatter Packed Single Precision (Quadword Indices)", "summary": "Stores floats using 64-bit indices.", "syntax": "VSCATTERQPS [base+zmm_idx*scale] {k1}, zmm1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 A3 /vsib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | A3", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "[base+zmm_idx*scale]", "desc": "AVX-512 scatter: base register + scaled ZMM vector index"}, {"name": "src", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}], "description": "Scatters packed single-precision (32-bit) floating-point values from a ZMM register to memory using 64-bit quadword indices with optional scaling. Each element in the source ZMM is written to a memory location computed as [base + index[i]*scale], with write masking controlled by the opmask register k1. This is a non-temporal scatter operation that does not update CPU flags.", "pseudocode": "for i in 0 to 7:\n  if k1[i] == 1:\n    addr ← base + sign_extend(zmm_idx[i]) * scale\n    [addr] ← src.f32[i]", "example": "VSCATTERQPS [base+zmm_idx*scale], zmm1"}
{"mnemonic": "vscatterqpd", "architecture": "x86", "full_name": "Scatter Packed Double Precision (Quadword Indices)", "summary": "Stores doubles using 64-bit indices.", "syntax": "VSCATTERQPD [base+zmm_idx*scale] {k1}, zmm1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 A3 /vsib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | A3", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "[base+zmm_idx*scale]", "desc": "AVX-512 scatter: base register + scaled ZMM vector index"}, {"name": "src", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}], "description": "Scatters packed double-precision (64-bit) floating-point values from a ZMM register to memory using 64-bit quadword indices with optional scaling. Each element in the source ZMM is written to a memory location computed as [base + index[i]*scale], with write masking controlled by the opmask register k1. This is a non-temporal scatter operation that does not update CPU flags.", "pseudocode": "for i in 0 to 3:\n  if k1[i] == 1:\n    addr ← base + sign_extend(zmm_idx[i]) * scale\n    [addr] ← src.f64[i]", "example": "VSCATTERQPD [base+zmm_idx*scale], zmm1"}
{"mnemonic": "vfpclassps", "architecture": "x86", "full_name": "Floating-Point Class Single", "summary": "Tests for category (NaN, Inf, Denormal) for floats.", "syntax": "VFPCLASSPS k1 {k2}, zmm2/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 66 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 66", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Tests each single-precision float in the source operand against a class mask (imm8) and sets the corresponding bit in the destination opmask register. The mask specifies FP classes: positive/negative zero, denormal, normal, infinity, and quiet/signaling NaN. The operation is merged or zeroed based on the opmask k2; no arithmetic flags are affected.", "pseudocode": "for i in 0 to 15:\n  if k2[i] == 1 or k2_merge_mode == 0:\n    class_bits ← classify_fp32(src[i])\n    k1[i] ← (imm8 & (1 << class_bits)) != 0\n  else:\n    k1[i] ← 0", "example": "VFPCLASSPS k1, zmm2/m512, 3"}
{"mnemonic": "vfpclasspd", "architecture": "x86", "full_name": "Floating-Point Class Double", "summary": "Tests for category (NaN, Inf, Denormal) for doubles.", "syntax": "VFPCLASSPD k1 {k2}, zmm2/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 66 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 67", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Tests each double-precision float in the source operand against a class mask (imm8) and sets the corresponding bit in the destination opmask register. The mask specifies FP classes: positive/negative zero, denormal, normal, infinity, and quiet/signaling NaN. The operation is merged or zeroed based on the opmask k2; no arithmetic flags are affected.", "pseudocode": "for i in 0 to 7:\n  if k2[i] == 1 or k2_merge_mode == 0:\n    class_bits ← classify_fp64(src[i])\n    k1[i] ← (imm8 & (1 << class_bits)) != 0\n  else:\n    k1[i] ← 0", "example": "VFPCLASSPD k1, zmm2/m512, 3"}
{"mnemonic": "vrangeps", "architecture": "x86", "full_name": "Range Restriction Calculation Packed Single", "summary": "Calculates range (min/max/abs) of float values.", "syntax": "VRANGEPS zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 50 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 50", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Computes range restrictions on packed single-precision floats by selecting minimum, maximum, or absolute value operations controlled by an immediate operand. The result is the restricted range of two input operands after applying the imm8-controlled transformation. Results are merged or zeroed to the destination based on the opmask k1; no arithmetic flags are set.", "pseudocode": "for i in 0 to 15:\n  if k1[i] == 1 or k1_merge_mode == 0:\n    val1 ← src1.f32[i]\n    val2 ← src2.f32[i]\n    transformed ← apply_range_transform(val1, val2, imm8[2:0])\n    dest.f32[i] ← transformed\n  else:\n    dest.f32[i] ← 0", "example": "VRANGEPS zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vreduceps", "architecture": "x86", "full_name": "Perform Reduction Transformation Packed Single", "summary": "Performs reduction on floats (e.g. range reduction for trig).", "syntax": "VREDUCEPS zmm1 {k1}, zmm2/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 56 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 56", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs reduction transformations (e.g., range reduction for trigonometric functions) on packed single-precision floats. The imm8 operand selects the reduction mode and rounding behavior. The transformed values are written to the destination with masking controlled by opmask k1; no arithmetic flags are affected.", "pseudocode": "for i in 0 to 15:\n  if k1[i] == 1 or k1_merge_mode == 0:\n    result ← apply_reduction(src.f32[i], imm8[2:0])\n    dest.f32[i] ← result_with_rounding(result, imm8[7:4])\n  else:\n    dest.f32[i] ← 0", "example": "VREDUCEPS zmm1, zmm2/m512, 3"}
{"mnemonic": "vfixupimmps", "architecture": "x86", "full_name": "Fix Up Special Packed Float32 Values", "summary": "Fixes special cases (NaN, Inf) using a table (Float32).", "syntax": "VFIXUPIMMPS zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 54 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 54", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Fixes special floating-point cases (NaN, infinity, denormal) in packed single-precision data using a lookup table indexed by the immediate operand. The first source operand provides the primary value, the second provides a backup value for special cases, and the imm8 configures the fixup behavior. Results are masked by k1; no arithmetic flags are affected.", "pseudocode": "for i in 0 to 15:\n  if k1[i] == 1 or k1_merge_mode == 0:\n    primary ← src1.f32[i]\n    backup ← src2.f32[i]\n    fixup_class ← classify_special_fp32(primary)\n    if is_special(fixup_class):\n      dest.f32[i] ← lookup_fixup_table(backup, fixup_class, imm8)\n    else:\n      dest.f32[i] ← primary\n  else:\n    dest.f32[i] ← 0", "example": "VFIXUPIMMPS zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vrsqrt14ps", "architecture": "x86", "full_name": "Compute Approximate Reciprocal Square Root (14-bit)", "summary": "Approximate 1/sqrt(x) with 2^-14 error.", "syntax": "VRSQRT14PS zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 4E /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 4E", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Computes approximate reciprocal square root (1/√x) with 2^-14 relative error for packed single-precision floats. This fast approximation is suitable for iterative refinement or low-precision applications. Results are merged or zeroed to the destination based on opmask k1; no arithmetic flags are affected.", "pseudocode": "for i in 0 to 15:\n  if k1[i] == 1 or k1_merge_mode == 0:\n    dest.f32[i] ← approx_rsqrt14(src.f32[i])\n  else:\n    dest.f32[i] ← 0", "example": "VRSQRT14PS zmm1, zmm2/m512"}
{"mnemonic": "vrcp14ps", "architecture": "x86", "full_name": "Compute Approximate Reciprocal (14-bit)", "summary": "Approximate 1/x with 2^-14 error.", "syntax": "VRCP14PS zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 4C /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 4C", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Computes a 14-bit reciprocal approximation (1/x) for each single-precision float in the source operand, writing results to the destination with a maximum relative error of 2^-14. The instruction operates on 512-bit vectors (16 × 32-bit floats) in AVX-512, supports writemask control via k1, and sets no CPU flags. Denormalized inputs produce denormalized outputs; NaN, zero, and infinity operands behave according to IEEE 754 semantics.", "pseudocode": "for i = 0 to 15:\n  if k1[i] or no mask:\n    zmm1[32*i+31:32*i] ← approximate_reciprocal_14bit(zmm2/m512[32*i+31:32*i])\n  else if zeroing:\n    zmm1[32*i+31:32*i] ← 0", "example": "VRCP14PS zmm1, zmm2/m512"}
{"mnemonic": "clui", "architecture": "x86", "full_name": "Clear User Interrupt Flag", "summary": "Clears the User Interrupt Flag (UIF).", "syntax": "CLUI", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 01 EE", "visual_parts": [], "binary_pattern": "F3 | 0F | 01 | EE", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "UINTR", "operands": [], "description": "Clears the User Interrupt Flag (UIF) in the UINTR register, preventing delivery of user-level interrupts to the current process. This is a privileged-equivalent instruction that requires the UINTR CPU feature and operates only in user mode; it has no effect on standard CPU flags or other processor state. Execution in a context where UINTR is unavailable causes a #UD exception.", "pseudocode": "UINTR.UIF ← 0", "example": "CLUI"}
{"mnemonic": "stui", "architecture": "x86", "full_name": "Set User Interrupt Flag", "summary": "Sets the User Interrupt Flag (UIF).", "syntax": "STUI", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 01 EF", "visual_parts": [], "binary_pattern": "F3 | 0F | 01 | EF", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "UINTR", "operands": [], "description": "Sets the User Interrupt Flag (UIF) in the UINTR register, enabling delivery of user-level interrupts to the current process. This is a privileged-equivalent instruction that requires the UINTR CPU feature and operates only in user mode; it modifies no standard CPU flags. Execution in a context where UINTR is unavailable causes a #UD exception.", "pseudocode": "UINTR.UIF ← 1", "example": "STUI"}
{"mnemonic": "testui", "architecture": "x86", "full_name": "Test User Interrupt", "summary": "Sets CF if UIF is 1, ZF if User Interrupt Pending.", "syntax": "TESTUI", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 01 ED", "visual_parts": [], "binary_pattern": "F3 | 0F | 01 | ED", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "UINTR", "operands": [], "description": "Tests the User Interrupt Flag (UIF) and User Interrupt Pending (UIP) status, setting CF if UIF is 1 and ZF if a user interrupt is pending. This instruction requires the UINTR CPU feature and operates only in user mode; it does not modify other flags. Execution without UINTR support causes a #UD exception.", "pseudocode": "CF ← UINTR.UIF\nZF ← UINTR.UIP\nOF ← 0\nSF ← 0\nAF ← 0\nPF ← 0", "example": "TESTUI"}
{"mnemonic": "fld", "architecture": "x86", "full_name": "Load Floating Point Value", "summary": "Pushes a floating-point value onto the FPU register stack (ST0).", "syntax": "FLD m32fp/m64fp/m80fp", "encoding": {"format": "Legacy", "hex_opcode": "D9 /0", "length": "2+", "visual_parts": [], "binary_pattern": "D9 | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "src", "desc": "Memory"}], "extension": "x87 FPU", "description": "Loads a floating-point value (32-bit single, 64-bit double, or 80-bit extended precision) from memory, converts if necessary to 80-bit extended precision, and pushes it onto the x87 FPU register stack (ST(0)). Stack pointer (TOP) is decremented by one; overflow to an invalid slot raises #IS (stack fault). No CPU flags are modified; the instruction may set x87 exception flags (PE, UE, OE, IE) in the x87 status word.", "pseudocode": "ST(0) ← load_and_convert(memory)\nTOP ← TOP - 1\nif TOP underflow: raise x87_stack_fault", "example": "FLD m32fp/m64fp/m80fp"}
{"mnemonic": "fst", "architecture": "x86", "full_name": "Store Floating Point Value", "summary": "Copies the value in ST(0) to memory or another register.", "syntax": "FST m32fp/m64fp", "encoding": {"format": "Legacy", "hex_opcode": "D9 /2", "length": "2+", "visual_parts": [], "binary_pattern": "D9 | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "dest", "desc": "Memory"}], "extension": "x87 FPU", "description": "Stores the value in ST(0) to memory as either 32-bit single or 64-bit double precision (converting from 80-bit extended if necessary), without popping the stack. The source remains in ST(0); floating-point exceptions (PE, UE, OE) may be raised in the x87 status word if conversion underflows, overflows, or loses precision. No CPU flags are modified.", "pseudocode": "memory ← convert_to_32or64bit(ST(0))\nif conversion_error: raise x87_exception", "example": "FST m32fp/m64fp"}
{"mnemonic": "fstp", "architecture": "x86", "full_name": "Store Floating Point Value and Pop", "summary": "Copies ST(0) to destination and pops the register stack.", "syntax": "FSTP m32fp/m64fp/m80fp", "encoding": {"format": "Legacy", "hex_opcode": "D9 /3", "length": "2+", "visual_parts": [], "binary_pattern": "D9 | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "dest", "desc": "Memory"}], "extension": "x87 FPU", "description": "Stores the value in ST(0) to memory (as 32-bit single, 64-bit double, or 80-bit extended precision, converting if necessary), then pops the register stack by incrementing TOP. The source register is invalidated after the pop; floating-point exceptions may be raised in the x87 status word during conversion. No CPU flags are modified.", "pseudocode": "memory ← convert_and_store(ST(0))\nTOP ← TOP + 1\nif conversion_error: raise x87_exception", "example": "FSTP m32fp/m64fp/m80fp"}
{"mnemonic": "fild", "architecture": "x86", "full_name": "Load Integer", "summary": "Converts integer in memory to double-extended-precision float and pushes to ST(0).", "syntax": "FILD m16int/m32int/m64int", "encoding": {"format": "Legacy", "hex_opcode": "DF /0", "length": "2+", "visual_parts": [], "binary_pattern": "DF | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "src", "desc": "Integer Memory"}], "extension": "x87 FPU", "description": "Loads a signed integer (16-bit, 32-bit, or 64-bit) from memory, converts it to 80-bit extended precision floating-point, and pushes onto the x87 register stack (ST(0)). Stack pointer is decremented; conversion is exact and raises no precision or rounding exceptions unless stack overflow occurs. No CPU flags are modified.", "pseudocode": "ST(0) ← convert_integer_to_fp80(memory)\nTOP ← TOP - 1\nif TOP underflow: raise x87_stack_fault", "example": "FILD m16int/m32int/m64int"}
{"mnemonic": "fist", "architecture": "x86", "full_name": "Store Integer", "summary": "Converts ST(0) to integer and stores in memory.", "syntax": "FIST m16int/m32int", "encoding": {"format": "Legacy", "hex_opcode": "DF /2", "length": "2+", "visual_parts": [], "binary_pattern": "DF | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "dest", "desc": "Integer Memory"}], "extension": "x87 FPU", "description": "Converts the floating-point value in ST(0) to a signed integer using the current rounding mode and stores the result in the specified 16-bit or 32-bit memory location. The x87 FPU status flags (C0, C1, C2, C3) may be set depending on rounding or overflow conditions. The stack top (ST(0)) remains unchanged after the operation.", "pseudocode": "dest ← convert_to_integer(ST(0), rounding_mode);\nupdate_x87_status_flags();", "example": "FIST m16int/m32int"}
{"mnemonic": "fistp", "architecture": "x86", "full_name": "Store Integer and Pop", "summary": "Converts ST(0) to integer, stores in memory, and pops stack.", "syntax": "FISTP m16int/m32int/m64int", "encoding": {"format": "Legacy", "hex_opcode": "DF /3", "length": "2+", "visual_parts": [], "binary_pattern": "DF | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "dest", "desc": "Integer Memory"}], "extension": "x87 FPU", "description": "Converts the floating-point value in ST(0) to a signed integer using the current rounding mode, stores the result in the specified 16-bit, 32-bit, or 64-bit memory location, and then pops the FPU stack. The x87 status flags may be updated based on rounding or overflow conditions. The stack top pointer is decremented after the operation.", "pseudocode": "dest ← convert_to_integer(ST(0), rounding_mode);\nupdate_x87_status_flags();\nST(0) is popped; stack_top ← stack_top - 1;", "example": "FISTP m16int/m32int/m64int"}
{"mnemonic": "fadd", "architecture": "x86", "full_name": "Add Floating Point", "summary": "Adds src to dest (ST(0) += src).", "syntax": "FADD m32fp/m64fp", "encoding": {"format": "Legacy", "hex_opcode": "D8 /0", "length": "2+", "visual_parts": [], "binary_pattern": "D8 | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "src", "desc": "Memory/Reg"}], "extension": "x87 FPU", "description": "Adds the floating-point operand in memory (m32fp or m64fp) to ST(0) and stores the result in ST(0). The operation follows IEEE 754 semantics with the current rounding mode. The x87 FPU status flags (C0, C1, C2, C3) are updated based on the result; invalid operation, underflow, overflow, or precision exceptions may be raised.", "pseudocode": "src_value ← load_from_memory(src);\nST(0) ← ST(0) + src_value;\nupdate_x87_status_flags();", "example": "FADD m32fp/m64fp"}
{"mnemonic": "fsub", "architecture": "x86", "full_name": "Subtract Floating Point", "summary": "Subtracts src from dest.", "syntax": "FSUB m32fp/m64fp", "encoding": {"format": "Legacy", "hex_opcode": "D8 /4", "length": "2+", "visual_parts": [], "binary_pattern": "D8 | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "src", "desc": "Memory/Reg"}], "extension": "x87 FPU", "description": "Subtracts the floating-point operand in memory (m32fp or m64fp) from ST(0) and stores the result in ST(0). The operation follows IEEE 754 semantics with the current rounding mode. The x87 FPU status flags (C0, C1, C2, C3) are updated; invalid operation, underflow, overflow, or precision exceptions may be raised.", "pseudocode": "src_value ← load_from_memory(src);\nST(0) ← ST(0) - src_value;\nupdate_x87_status_flags();", "example": "FSUB m32fp/m64fp"}
{"mnemonic": "fmul", "architecture": "x86", "full_name": "Multiply Floating Point", "summary": "Multiplies dest by src.", "syntax": "FMUL m32fp/m64fp", "encoding": {"format": "Legacy", "hex_opcode": "D8 /1", "length": "2+", "visual_parts": [], "binary_pattern": "D8 | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "src", "desc": "Memory/Reg"}], "extension": "x87 FPU", "description": "Multiplies ST(0) by the floating-point operand in memory (m32fp or m64fp) and stores the result in ST(0). The operation follows IEEE 754 semantics with the current rounding mode. The x87 FPU status flags (C0, C1, C2, C3) are updated; invalid operation, underflow, overflow, or precision exceptions may be raised.", "pseudocode": "src_value ← load_from_memory(src);\nST(0) ← ST(0) × src_value;\nupdate_x87_status_flags();", "example": "FMUL m32fp/m64fp"}
{"mnemonic": "fdiv", "architecture": "x86", "full_name": "Divide Floating Point", "summary": "Divides dest by src.", "syntax": "FDIV m32fp/m64fp", "encoding": {"format": "Legacy", "hex_opcode": "D8 /6", "length": "2+", "visual_parts": [], "binary_pattern": "D8 | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "src", "desc": "Memory/Reg"}], "extension": "x87 FPU", "description": "Divides ST(0) by the floating-point operand in memory (m32fp or m64fp) and stores the result in ST(0). The operation follows IEEE 754 semantics with the current rounding mode. The x87 FPU status flags (C0, C1, C2, C3) are updated; division-by-zero, invalid operation, underflow, overflow, or precision exceptions may be raised.", "pseudocode": "src_value ← load_from_memory(src);\nST(0) ← ST(0) ÷ src_value;\nupdate_x87_status_flags();", "example": "FDIV m32fp/m64fp"}
{"mnemonic": "fprem", "architecture": "x86", "full_name": "Partial Remainder", "summary": "Computes remainder of ST(0) / ST(1).", "syntax": "FPREM", "encoding": {"format": "Legacy", "hex_opcode": "D9 F8", "visual_parts": [], "binary_pattern": "D9 | F8", "bit_positions": "+0 | +1"}, "extension": "x87 FPU", "operands": [], "description": "Computes the IEEE partial remainder of ST(0) divided by ST(1), storing the result in ST(0). This instruction performs an iterative reduction and may require multiple iterations to complete; the C2 flag indicates whether the result is incomplete (more iterations needed). The x87 status flags (C0, C1, C2, C3) encode the sign and partial quotient information.", "pseudocode": "quotient ← ST(0) ÷ ST(1);\nremainder ← ST(0) - (rounded_quotient × ST(1));\nST(0) ← remainder;\nC0, C1, C2, C3 ← encode_quotient_and_status(quotient, remainder);", "example": "FPREM"}
{"mnemonic": "fabs", "architecture": "x86", "full_name": "Absolute Value", "summary": "Replaces ST(0) with its absolute value.", "syntax": "FABS", "encoding": {"format": "Legacy", "hex_opcode": "D9 E1", "visual_parts": [], "binary_pattern": "D9 | E1", "bit_positions": "+0 | +1"}, "extension": "x87 FPU", "operands": [], "description": "Replaces the value in ST(0) with its absolute value by clearing the sign bit. The operation does not modify the x87 status flags and does not raise exceptions. This is a fast unary operation that operates solely on the register stack.", "pseudocode": "ST(0) ← |ST(0)|;", "example": "FABS"}
{"mnemonic": "fchs", "architecture": "x86", "full_name": "Change Sign", "summary": "Reverses the sign of ST(0).", "syntax": "FCHS", "encoding": {"format": "Legacy", "hex_opcode": "D9 E0", "visual_parts": [], "binary_pattern": "D9 | E0", "bit_positions": "+0 | +1"}, "extension": "x87 FPU", "operands": [], "description": "Reverses the sign bit of the value in ST(0), converting positive to negative and vice versa. This is a single-bit operation on the sign bit of the extended-precision floating-point format. No flags are affected; the instruction operates entirely within the x87 FPU stack.", "pseudocode": "ST(0) ← -ST(0)", "example": "FCHS"}
{"mnemonic": "fsqrt", "architecture": "x86", "full_name": "Square Root", "summary": "Computes square root of ST(0).", "syntax": "FSQRT", "encoding": {"format": "Legacy", "hex_opcode": "D9 FA", "visual_parts": [], "binary_pattern": "D9 | FA", "bit_positions": "+0 | +1"}, "extension": "x87 FPU", "operands": [], "description": "Computes the square root of ST(0) and replaces ST(0) with the result using extended-precision floating-point arithmetic. The x87 FPU C1 flag may be set based on stack conditions; other x87 status flags (C0, C2, C3) are updated according to the result. This is a transcendental operation with typical latency of 70-100 cycles.", "pseudocode": "ST(0) ← sqrt(ST(0))", "example": "FSQRT"}
{"mnemonic": "fsin", "architecture": "x86", "full_name": "Sine", "summary": "Computes sine of ST(0) (in radians).", "syntax": "FSIN", "encoding": {"format": "Legacy", "hex_opcode": "D9 FE", "visual_parts": [], "binary_pattern": "D9 | FE", "bit_positions": "+0 | +1"}, "extension": "x87 FPU", "operands": [], "description": "Computes the sine of ST(0), where the argument is interpreted as an angle in radians. The result replaces ST(0); the x87 FPU status flags are updated. This transcendental instruction has high latency and may trigger a C2 flag if the argument is outside the acceptable range (roughly ±2^63).", "pseudocode": "ST(0) ← sin(ST(0))", "example": "FSIN"}
{"mnemonic": "fcos", "architecture": "x86", "full_name": "Cosine", "summary": "Computes cosine of ST(0) (in radians).", "syntax": "FCOS", "encoding": {"format": "Legacy", "hex_opcode": "D9 FF", "visual_parts": [], "binary_pattern": "D9 | FF", "bit_positions": "+0 | +1"}, "extension": "x87 FPU", "operands": [], "description": "Computes the cosine of ST(0), where the argument is interpreted as an angle in radians. The result replaces ST(0); the x87 FPU status flags are updated. This transcendental instruction may set the C2 flag if the argument exceeds the acceptable range.", "pseudocode": "ST(0) ← cos(ST(0))", "example": "FCOS"}
{"mnemonic": "fsincos", "architecture": "x86", "full_name": "Sine and Cosine", "summary": "Computes sine and cosine of ST(0), pushing both to stack.", "syntax": "FSINCOS", "encoding": {"format": "Legacy", "hex_opcode": "D9 FB", "visual_parts": [], "binary_pattern": "D9 | FB", "bit_positions": "+0 | +1"}, "extension": "x87 FPU", "operands": [], "description": "Computes both sine and cosine of ST(0) in a single operation, pushing the cosine result onto the stack and leaving the sine in ST(0). The stack pointer is incremented after the push, so the sine ends up in ST(0) and cosine in ST(1). The x87 status flags are updated; C2 may be set if the argument is out of range.", "pseudocode": "temp ← ST(0); ST(0) ← sin(temp); push(cos(temp)); TOS ← TOS + 1", "example": "FSINCOS"}
{"mnemonic": "fptan", "architecture": "x86", "full_name": "Partial Tangent", "summary": "Computes tangent of ST(0) and pushes 1.0.", "syntax": "FPTAN", "encoding": {"format": "Legacy", "hex_opcode": "D9 F2", "visual_parts": [], "binary_pattern": "D9 | F2", "bit_positions": "+0 | +1"}, "extension": "x87 FPU", "operands": [], "description": "Computes the tangent of ST(0) and then pushes 1.0 onto the stack, so ST(0) becomes tan(original ST(0)) and the constant 1.0 moves to ST(1). The x87 status flags are updated; C2 may be set if the argument is out of the acceptable range. This is used in conjuction with FPATAN to compute arctangent.", "pseudocode": "temp ← ST(0); ST(0) ← tan(temp); push(1.0); TOS ← TOS + 1", "example": "FPTAN"}
{"mnemonic": "fpatan", "architecture": "x86", "full_name": "Partial Arctangent", "summary": "Computes arctan(ST(1)/ST(0)).", "syntax": "FPATAN", "encoding": {"format": "Legacy", "hex_opcode": "D9 F3", "visual_parts": [], "binary_pattern": "D9 | F3", "bit_positions": "+0 | +1"}, "extension": "x87 FPU", "operands": [], "description": "Computes the two-argument arctangent of ST(1)/ST(0) and replaces both stack entries with the result in ST(0); the stack pointer is decremented. The result is in the range [-π/2, π/2] or [-π, π] depending on the signs of ST(1) and ST(0). The x87 status flags are updated accordingly.", "pseudocode": "ST(0) ← atan2(ST(1), ST(0)); pop(); TOS ← TOS - 1", "example": "FPATAN"}
{"mnemonic": "fyl2x", "architecture": "x86", "full_name": "Y * log2(X)", "summary": "Computes ST(1) * log2(ST(0)).", "syntax": "FYL2X", "encoding": {"format": "Legacy", "hex_opcode": "D9 F1", "visual_parts": [], "binary_pattern": "D9 | F1", "bit_positions": "+0 | +1"}, "extension": "x87 FPU", "operands": [], "description": "Computes ST(1) * log₂(ST(0)) and replaces both stack entries with the result in ST(0); the stack pointer is decremented. ST(0) must be strictly positive; the result is typically used for computing logarithmic and exponential functions. The x87 status flags are updated; C2 may be set for out-of-range arguments.", "pseudocode": "ST(0) ← ST(1) * log2(ST(0)); pop(); TOS ← TOS - 1", "example": "FYL2X"}
{"mnemonic": "fxch", "architecture": "x86", "full_name": "Exchange Register", "summary": "Exchanges contents of ST(0) and ST(i).", "syntax": "FXCH ST(i)", "encoding": {"format": "Legacy", "hex_opcode": "D9 C8+i", "visual_parts": [], "binary_pattern": "D9", "bit_positions": "+0"}, "extension": "x87 FPU", "operands": [{"name": "dest", "type": "ST(i)", "desc": "x87 FPU stack register ST(i)"}], "description": "Exchanges the contents of ST(0) and ST(i), swapping the top of the x87 FPU stack with another stack register. This is a register-only operation with no impact on EFLAGS. The instruction is part of the x87 FPU instruction set and does not cause pipeline serialization.", "pseudocode": "temp ← ST(0);\nST(0) ← ST(i);\nST(i) ← temp;", "example": "FXCH st(1)"}
{"mnemonic": "fcom", "architecture": "x86", "full_name": "Compare Real", "summary": "Compares ST(0) with source.", "syntax": "FCOM m32fp/m64fp", "encoding": {"format": "Legacy", "hex_opcode": "D8 /2", "length": "2+", "visual_parts": [], "binary_pattern": "D8 | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "src", "desc": "Memory/Reg"}], "extension": "x87 FPU", "description": "Compares ST(0) with a single-precision (m32fp) or double-precision (m64fp) floating-point memory operand and sets the FPU condition code flags (C0, C2, C3) in the status word. The comparison result is reflected only in FPU flags, not in CPU EFLAGS. This instruction does not modify the stack.", "pseudocode": "src_value ← [memory];\nif (ST(0) > src_value) { C0←0; C2←0; C3←0; }\nelse if (ST(0) < src_value) { C0←1; C2←0; C3←0; }\nelse if (ST(0) == src_value) { C0←0; C2←0; C3←1; }\nelse { C0←1; C2←1; C3←1; }", "example": "FCOM m32fp/m64fp"}
{"mnemonic": "fcomi", "architecture": "x86", "full_name": "Compare Real and Set EFLAGS", "summary": "Compares ST(0) with ST(i) and sets CPU EFLAGS directly.", "syntax": "FCOMI ST(0), ST(i)", "encoding": {"format": "Legacy", "hex_opcode": "DB F0+i", "visual_parts": [], "binary_pattern": "DB", "bit_positions": "+0"}, "extension": "x87 FPU (P6+)", "operands": [{"name": "dest", "type": "ST(0)", "desc": "x87 FPU top-of-stack register ST(0)"}, {"name": "src", "type": "ST(i)", "desc": "x87 FPU stack register ST(i)"}], "description": "Compares ST(0) with ST(i) and directly sets the CPU EFLAGS (ZF, PF, CF) to reflect the comparison result, enabling use of standard conditional jumps without FSTSW. Available on P6 and later processors. The comparison does not pop the stack and affects CPU flags rather than FPU condition codes.", "pseudocode": "if (ST(0) > ST(i)) { ZF←0; PF←0; CF←0; }\nelse if (ST(0) < ST(i)) { ZF←0; PF←0; CF←1; }\nelse if (ST(0) == ST(i)) { ZF←1; PF←0; CF←0; }\nelse { ZF←1; PF←1; CF←1; }", "example": "FCOMI st(0), st(1)"}
{"mnemonic": "finit", "architecture": "x86", "full_name": "Initialize FPU", "summary": "Resets FPU to default state.", "syntax": "FINIT", "encoding": {"format": "Legacy", "hex_opcode": "9B DB E3", "visual_parts": [], "binary_pattern": "9B | DB | E3", "bit_positions": "+0 | +1 | +2"}, "extension": "x87 FPU", "operands": [], "description": "Initializes the x87 FPU to its default state, clearing the stack, setting control word to 0x037F (round to nearest, all exceptions masked), and clearing all status flags and exception flags. The instruction is preceded by FWAIT (0x9B) to ensure any pending FPU operations complete before reinitializing. This causes full FPU state reset with no impact on integer registers or EFLAGS.", "pseudocode": "FPU_Control_Word ← 0x037F;\nFPU_Status_Word ← 0x0000;\nFPU_Tag_Word ← 0xFFFF;\nfor (i = 0; i < 8; i++) ST(i) ← 0.0;\nFPU_Exception_Flags ← 0;", "example": "FINIT"}
{"mnemonic": "fclex", "architecture": "x86", "full_name": "Clear Exceptions", "summary": "Clears floating-point exception flags.", "syntax": "FCLEX", "encoding": {"format": "Legacy", "hex_opcode": "9B DB E2", "visual_parts": [], "binary_pattern": "9B | DB | E2", "bit_positions": "+0 | +1 | +2"}, "extension": "x87 FPU", "operands": [], "description": "Clears all floating-point exception flags (IE, DE, ZE, OE, UE, PE) in the FPU status word without clearing the condition codes or the stack. The instruction is preceded by FWAIT (0x9B) to synchronize with any pending FPU operations. Does not affect CPU EFLAGS or FPU control/tag words.", "pseudocode": "FPU_Status_Word.IE ← 0;\nFPU_Status_Word.DE ← 0;\nFPU_Status_Word.ZE ← 0;\nFPU_Status_Word.OE ← 0;\nFPU_Status_Word.UE ← 0;\nFPU_Status_Word.PE ← 0;", "example": "FCLEX"}
{"mnemonic": "fstsw", "architecture": "x86", "full_name": "Store Status Word", "summary": "Stores FPU status word to AX or memory.", "syntax": "FSTSW AX", "encoding": {"format": "Legacy", "hex_opcode": "9B DF E0", "length": "3", "visual_parts": [], "binary_pattern": "9B | DF | E0", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "AX/Mem"}], "extension": "x87 FPU", "description": "Stores the FPU status word (16-bit value containing exception flags, condition codes, stack pointer, and busy bit) into AX or memory. When destination is AX, the instruction may be used to examine FPU state from integer code without memory operands. The encoding shown (9B DF E0) uses FWAIT prefix and stores to AX; memory forms use D9 /7.", "pseudocode": "if (destination == AX) {\n  AX ← FPU_Status_Word;\n} else {\n  [memory] ← FPU_Status_Word;\n}", "example": "FSTSW AX"}
{"mnemonic": "fldcw", "architecture": "x86", "full_name": "Load Control Word", "summary": "Loads FPU control word from memory.", "syntax": "FLDCW m2byte", "encoding": {"format": "Legacy", "hex_opcode": "D9 /5", "length": "2+", "visual_parts": [], "binary_pattern": "D9 | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "src", "desc": "Memory"}], "extension": "x87 FPU", "description": "Loads a 16-bit control word from memory into the FPU control word register, affecting rounding mode, exception masks, precision control, and other FPU operating parameters. This instruction does not require FWAIT and takes effect immediately on subsequent FPU instructions. Changes to rounding mode and exception masks apply only to future floating-point operations.", "pseudocode": "FPU_Control_Word ← [memory];", "example": "FLDCW m2byte"}
{"mnemonic": "fstcw", "architecture": "x86", "full_name": "Store Control Word", "summary": "Stores FPU control word to memory.", "syntax": "FSTCW m2byte", "encoding": {"format": "Legacy", "hex_opcode": "9B D9 /7", "length": "3+", "visual_parts": [], "binary_pattern": "9B | D9 | ModRM", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "Memory"}], "extension": "x87 FPU", "description": "Stores the current FPU control word (16-bit value) to memory, preserving rounding mode, exception mask bits, precision control, and infinity control settings. The instruction is preceded by FWAIT (0x9B) to ensure any pending FPU operations complete before the store. Does not affect CPU EFLAGS or FPU stack contents.", "pseudocode": "[memory] ← FPU_Control_Word;", "example": "FSTCW m2byte"}
{"mnemonic": "frstor", "architecture": "x86", "full_name": "Restore FPU State", "summary": "Loads FPU state from memory.", "syntax": "FRSTOR m108byte", "encoding": {"format": "Legacy", "hex_opcode": "DD /4", "length": "2+", "visual_parts": [], "binary_pattern": "DD | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "src", "desc": "Memory"}], "extension": "x87 FPU", "description": "Loads the complete x87 FPU state (108 bytes) from memory, including all eight floating-point registers, control word, status word, tag word, instruction pointer, and data pointer. This instruction does not set any CPU flags and is not serializing. It is available in all CPU modes (real, protected, 64-bit) and requires memory operand addressing.", "pseudocode": "FPU_state ← [m108byte]\n// Restores: FPR0-FPR7, CW, SW, TW, IP, DP, DS, opcode", "example": "FRSTOR m108byte"}
{"mnemonic": "fsave", "architecture": "x86", "full_name": "Save FPU State", "summary": "Stores FPU state to memory and re-initializes FPU.", "syntax": "FSAVE m108byte", "encoding": {"format": "Legacy", "hex_opcode": "9B DD /6", "length": "3+", "visual_parts": [], "binary_pattern": "9B | DD | ModRM", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "Memory"}], "extension": "x87 FPU", "description": "Saves the entire x87 FPU state (108 bytes) to memory and reinitializes the FPU to its default state. The instruction issues an implicit FWAIT (0x9B prefix) to ensure prior floating-point operations complete before saving. No CPU flags are set; the instruction is serializing with respect to x87 operations. Available in all modes.", "pseudocode": "[m108byte] ← FPU_state\n// Saves: FPR0-FPR7, CW, SW, TW, IP, DP, DS, opcode\nFPU_state ← initial_state", "example": "FSAVE m108byte"}
{"mnemonic": "lgdt", "architecture": "x86", "full_name": "Load Global Descriptor Table Register", "summary": "Loads the GDT register (Privileged).", "syntax": "LGDT m16&32", "encoding": {"format": "System", "hex_opcode": "0F 01 /2", "length": "3+", "visual_parts": [], "binary_pattern": "0F | 01 | ModRM", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "src", "desc": "Memory"}], "extension": "System", "description": "Loads the Global Descriptor Table (GDT) register with a limit (16 bits) and base address (32 bits in 32-bit mode, 64 bits in 64-bit mode) from a 6-byte or 10-byte memory operand. This is a privileged instruction (requires CPL=0) and causes a pipeline flush. No flags are affected. In 64-bit mode, the operand is 10 bytes (16-bit limit + 64-bit base).", "pseudocode": "GDTR.limit ← [m16&32 + 0:1]\nGDTR.base ← [m16&32 + 2:5]  // 32-bit or 64-bit depending on mode", "example": "LGDT m16&32"}
{"mnemonic": "lidt", "architecture": "x86", "full_name": "Load Interrupt Descriptor Table Register", "summary": "Loads the IDT register (Privileged).", "syntax": "LIDT m16&32", "encoding": {"format": "System", "hex_opcode": "0F 01 /3", "length": "3+", "visual_parts": [], "binary_pattern": "0F | 01 | ModRM", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "src", "desc": "Memory"}], "extension": "System", "description": "Loads the Interrupt Descriptor Table (IDT) register with a limit (16 bits) and base address (32 bits in 32-bit mode, 64 bits in 64-bit mode) from a 6-byte or 10-byte memory operand. This is a privileged instruction (requires CPL=0) and causes a pipeline flush. No flags are affected. In 64-bit mode, the operand is 10 bytes (16-bit limit + 64-bit base).", "pseudocode": "IDTR.limit ← [m16&32 + 0:1]\nIDTR.base ← [m16&32 + 2:5]  // 32-bit or 64-bit depending on mode", "example": "LIDT m16&32"}
{"mnemonic": "sgdt", "architecture": "x86", "full_name": "Store Global Descriptor Table Register", "summary": "Stores GDT limit and base address to memory.", "syntax": "SGDT m", "encoding": {"format": "System", "hex_opcode": "0F 01 /0", "visual_parts": [], "binary_pattern": "0F | 01 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "System", "operands": [{"name": "dest", "type": "m", "desc": "Memory operand"}], "description": "Stores the current Global Descriptor Table (GDT) register contents (limit and base address) to memory. The format is 2-byte limit followed by 4-byte base in 32-bit mode, or 2-byte limit followed by 8-byte base in 64-bit mode. No flags are affected. This instruction is not privileged and can be executed at any CPL.", "pseudocode": "[m + 0:1] ← GDTR.limit\n[m + 2:5] ← GDTR.base  // 4 or 8 bytes depending on mode", "example": "SGDT [rbp-8]"}
{"mnemonic": "sidt", "architecture": "x86", "full_name": "Store Interrupt Descriptor Table Register", "summary": "Stores IDT limit and base address to memory.", "syntax": "SIDT m", "encoding": {"format": "System", "hex_opcode": "0F 01 /1", "visual_parts": [], "binary_pattern": "0F | 01 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "System", "operands": [{"name": "dest", "type": "m", "desc": "Memory operand"}], "description": "Stores the current Interrupt Descriptor Table (IDT) register contents (limit and base address) to memory. The format is 2-byte limit followed by 4-byte base in 32-bit mode, or 2-byte limit followed by 8-byte base in 64-bit mode. No flags are affected. This instruction is not privileged and can be executed at any CPL.", "pseudocode": "[m + 0:1] ← IDTR.limit\n[m + 2:5] ← IDTR.base  // 4 or 8 bytes depending on mode", "example": "SIDT [rbp-8]"}
{"mnemonic": "lldt", "architecture": "x86", "full_name": "Load Local Descriptor Table Register", "summary": "Loads LDT segment selector (Privileged).", "syntax": "LLDT r/m16", "encoding": {"format": "System", "hex_opcode": "0F 00 /2", "visual_parts": [], "binary_pattern": "0F | 00 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "System", "operands": [{"name": "dest", "type": "r/m16", "desc": "16-bit register or memory"}], "description": "Loads the Local Descriptor Table (LDT) register with a 16-bit segment selector from a register or memory. This is a privileged instruction (requires CPL=0) and causes a pipeline flush. The selector must reference a valid LDT descriptor in the GDT; an invalid selector clears the LDT register. No flags are affected.", "pseudocode": "LDTR ← r/m16\n// Selector is validated; if invalid, LDTR is cleared", "example": "LLDT bx"}
{"mnemonic": "sldt", "architecture": "x86", "full_name": "Store Local Descriptor Table Register", "summary": "Stores LDT segment selector.", "syntax": "SLDT r/m16", "encoding": {"format": "System", "hex_opcode": "0F 00 /0", "visual_parts": [], "binary_pattern": "0F | 00 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "System", "operands": [{"name": "dest", "type": "r/m16", "desc": "16-bit register or memory"}], "description": "Stores the current Local Descriptor Table (LDT) register contents (16-bit segment selector) into a register or memory. If the destination is a 32-bit or 64-bit register, the selector is zero-extended. No flags are affected. This instruction is not privileged and can be executed at any CPL.", "pseudocode": "r/m16 ← LDTR  // For 32/64-bit dest: zero-extended", "example": "SLDT bx"}
{"mnemonic": "ltr", "architecture": "x86", "full_name": "Load Task Register", "summary": "Loads Task Register (Privileged).", "syntax": "LTR r/m16", "encoding": {"format": "System", "hex_opcode": "0F 00 /3", "visual_parts": [], "binary_pattern": "0F | 00 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "System", "operands": [{"name": "dest", "type": "r/m16", "desc": "16-bit register or memory"}], "description": "Loads a 16-bit Task Register selector from a register or memory operand. This privileged instruction (CPL=0 only) loads the TR register with a task gate descriptor selector, initiating task switching if the selector points to a valid TSS descriptor. No flags are affected.", "pseudocode": "TR ← source[15:0]; (task switch occurs if source is valid TSS selector)", "example": "LTR bx"}
{"mnemonic": "str", "architecture": "x86", "full_name": "Store Task Register", "summary": "Stores Task Register.", "syntax": "STR r/m16", "encoding": {"format": "System", "hex_opcode": "0F 00 /1", "visual_parts": [], "binary_pattern": "0F | 00 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "System", "operands": [{"name": "dest", "type": "r/m16", "desc": "16-bit register or memory"}], "description": "Stores the current Task Register selector into a 16-bit register or memory operand. This non-privileged instruction reads the TR register and writes its selector value; it operates in all modes and does not affect any flags.", "pseudocode": "dest ← TR[15:0]", "example": "STR bx"}
{"mnemonic": "mov cr", "architecture": "x86", "full_name": "Move Control Register", "summary": "Moves data to/from Control Registers (CR0, CR3, etc.) (Privileged).", "syntax": "MOV CRn, r", "encoding": {"format": "System", "hex_opcode": "0F 22 /r", "length": "3", "visual_parts": [], "binary_pattern": "0F | 22 | ModRM", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "CRn"}, {"name": "src", "desc": "Reg"}], "extension": "System", "description": "Moves a 32-bit or 64-bit value from a general-purpose register to a control register (CR0, CR2, CR3, CR4, CR8 in 64-bit mode). This privileged instruction (CPL=0 only) performs hardware state modification with potential serialization effects; certain CR writes invalidate TLBs or flush caches. No arithmetic flags are affected.", "pseudocode": "CRn ← r (where n ∈ {0,2,3,4,8}); TLB and cache invalidation may occur", "example": "MOV CRn, rax"}
{"mnemonic": "mov dr", "architecture": "x86", "full_name": "Move Debug Register", "summary": "Moves data to/from Debug Registers (DR0-DR7) (Privileged).", "syntax": "MOV DRn, r", "encoding": {"format": "System", "hex_opcode": "0F 23 /r", "length": "3", "visual_parts": [], "binary_pattern": "0F | 23 | ModRM", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "DRn"}, {"name": "src", "desc": "Reg"}], "extension": "System", "description": "Moves a 32-bit or 64-bit value from a general-purpose register to a debug register (DR0-DR7). This privileged instruction (CPL=0 only) performs hardware debug state modification; writes to DR6 and DR7 may clear breakpoint conditions and alter breakpoint control. No arithmetic flags are affected.", "pseudocode": "DRn ← r (where n ∈ {0,1,2,3,6,7}); breakpoint state may change", "example": "MOV DRn, rax"}
{"mnemonic": "lmsw", "architecture": "x86", "full_name": "Load Machine Status Word", "summary": "Loads Machine Status Word (Legacy CR0 modification).", "syntax": "LMSW r/m16", "encoding": {"format": "System", "hex_opcode": "0F 01 /6", "visual_parts": [], "binary_pattern": "0F | 01 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "System", "operands": [{"name": "dest", "type": "r/m16", "desc": "16-bit register or memory"}], "description": "Loads the lower 4 bits of a 16-bit operand into the lower 4 bits of CR0 (the machine status word: PE, MP, EM, TS). This privileged instruction (CPL=0 only) affects processor mode and FPU handling; it can enable protected mode but cannot disable it or modify higher CR0 bits. No flags are affected.", "pseudocode": "CR0[3:0] ← source[3:0]; (legacy CR0 access, cannot clear PE or modify bits 31:4)", "example": "LMSW bx"}
{"mnemonic": "smsw", "architecture": "x86", "full_name": "Store Machine Status Word", "summary": "Stores Machine Status Word.", "syntax": "SMSW r/m16", "encoding": {"format": "System", "hex_opcode": "0F 01 /4", "visual_parts": [], "binary_pattern": "0F | 01 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "System", "operands": [{"name": "dest", "type": "r/m16", "desc": "16-bit register or memory"}], "description": "Stores the lower 16 bits of CR0 (the machine status word: PE, MP, EM, TS, and reserved bits) into a 16-bit register or memory operand. This non-privileged instruction reads CR0[15:0]; in 64-bit mode, a 32-bit destination is zero-extended to 64 bits. No flags are affected.", "pseudocode": "dest ← CR0[15:0]; (in 64-bit with r64 operand: dest ← CR0[15:0] zero-extended to 64 bits)", "example": "SMSW bx"}
{"mnemonic": "clts", "architecture": "x86", "full_name": "Clear Task-Switched Flag", "summary": "Clears the TS flag in CR0 (Privileged).", "syntax": "CLTS", "encoding": {"format": "System", "hex_opcode": "0F 06", "visual_parts": [], "binary_pattern": "0F | 06", "bit_positions": "+0 | +1"}, "extension": "System", "operands": [], "description": "Clears the Task-Switched flag (TS, bit 3) in CR0. This privileged instruction (CPL=0 only) allows the processor to use the FPU without raising a #NM exception; it is typically executed after an FPU context save. No flags are affected.", "pseudocode": "CR0[3] ← 0", "example": "CLTS"}
{"mnemonic": "invd", "architecture": "x86", "full_name": "Invalidate Internal Caches", "summary": "Flushes internal caches without writing back data (Privileged).", "syntax": "INVD", "encoding": {"format": "System", "hex_opcode": "0F 08", "visual_parts": [], "binary_pattern": "0F | 08", "bit_positions": "+0 | +1"}, "extension": "System", "operands": [], "description": "Invalidates all internal cache lines without writing back modified data to memory. This privileged instruction (CPL=0 only) causes a complete pipeline flush and memory ordering barrier; dirty cache lines are discarded, potentially losing uncommitted writes, making it dangerous for general use. No flags are affected.", "pseudocode": "invalidate_all_cache_lines(); flush_pipeline(); memory_barrier()", "example": "INVD"}
{"mnemonic": "wbinvd", "architecture": "x86", "full_name": "Write Back and Invalidate Cache", "summary": "Writes back modified data and invalidates caches (Privileged).", "syntax": "WBINVD", "encoding": {"format": "System", "hex_opcode": "0F 09", "visual_parts": [], "binary_pattern": "0F | 09", "bit_positions": "+0 | +1"}, "extension": "System", "operands": [], "description": "Writes back all modified cache lines to memory and invalidates all internal caches, ensuring cache coherency across the system. This is a privileged instruction (CPL 0 only) that serializes the pipeline and may take hundreds of cycles. No flags are affected.", "pseudocode": "for each cache line in all caches:\n  if (cache_line.modified) write_to_memory(cache_line);\n  invalidate(cache_line);\nPipeline_Serialization();", "example": "WBINVD"}
{"mnemonic": "invlpg", "architecture": "x86", "full_name": "Invalidate TLB Entry", "summary": "Invalidates a specific TLB entry (Privileged).", "syntax": "INVLPG m", "encoding": {"format": "System", "hex_opcode": "0F 01/7", "visual_parts": [], "binary_pattern": "0F | 01 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "System", "operands": [{"name": "dest", "type": "m", "desc": "Memory operand"}], "description": "Invalidates the TLB entry for the linear address specified by the memory operand, forcing a TLB reload on next access. This is a privileged instruction (CPL 0 only) used after page table modifications. No flags are affected; pipeline serialization may occur depending on implementation.", "pseudocode": "linear_address ← address_of(m);\nTLB[linear_address].valid ← 0;", "example": "INVLPG [rbp-8]"}
{"mnemonic": "rdmsr", "architecture": "x86", "full_name": "Read Model Specific Register", "summary": "Reads MSR specified by ECX into EDX:EAX (Privileged).", "syntax": "RDMSR", "encoding": {"format": "System", "hex_opcode": "0F 32", "visual_parts": [], "binary_pattern": "0F | 32", "bit_positions": "+0 | +1"}, "extension": "System", "operands": [], "description": "Reads a 64-bit Model Specific Register (MSR) whose index is in ECX and stores the result in EDX:EAX (EDX holds bits 63-32, EAX holds bits 31-0). This is a privileged instruction (CPL 0 only) that may cause a general protection fault if ECX selects an invalid or inaccessible MSR. No EFLAGS are modified.", "pseudocode": "msr_index ← ECX;\nmsr_value ← MSR[msr_index];\nEAX ← msr_value[31:0];\nEDX ← msr_value[63:32];", "example": "RDMSR"}
{"mnemonic": "wrmsr", "architecture": "x86", "full_name": "Write Model Specific Register", "summary": "Writes EDX:EAX to MSR specified by ECX (Privileged).", "syntax": "WRMSR", "encoding": {"format": "System", "hex_opcode": "0F 30", "visual_parts": [], "binary_pattern": "0F | 30", "bit_positions": "+0 | +1"}, "extension": "System", "operands": [], "description": "Writes a 64-bit value from EDX:EAX to the Model Specific Register (MSR) whose index is in ECX (EDX holds bits 63-32, EAX holds bits 31-0). This is a privileged instruction (CPL 0 only) that serializes execution and may cause a general protection fault if ECX selects an invalid or write-protected MSR. No EFLAGS are modified.", "pseudocode": "msr_index ← ECX;\nmsr_value ← (EDX << 32) | EAX;\nMSR[msr_index] ← msr_value;\nPipeline_Serialization();", "example": "WRMSR"}
{"mnemonic": "rdpmc", "architecture": "x86", "full_name": "Read Performance-Monitoring Counters", "summary": "Reads performance counter specified by ECX into EDX:EAX.", "syntax": "RDPMC", "encoding": {"format": "System", "hex_opcode": "0F 33", "visual_parts": [], "binary_pattern": "0F | 33", "bit_positions": "+0 | +1"}, "extension": "System", "operands": [], "description": "Reads a 40-bit performance monitoring counter whose index is in ECX and stores the result in EDX:EAX (EDX holds bits 39-32, EAX holds bits 31-0). User-mode execution may be permitted depending on RDPMC flag in CR4; a general protection fault occurs if not allowed. No EFLAGS are modified.", "pseudocode": "counter_index ← ECX;\ncounter_value ← PMC[counter_index];\nEAX ← counter_value[31:0];\nEDX ← counter_value[39:32] & 0xFF;", "example": "RDPMC"}
{"mnemonic": "sysenter", "architecture": "x86", "full_name": "Fast System Call", "summary": "Fast call to level 0 system procedures.", "syntax": "SYSENTER", "encoding": {"format": "System", "hex_opcode": "0F 34", "visual_parts": [], "binary_pattern": "0F | 34", "bit_positions": "+0 | +1"}, "extension": "System", "operands": [], "description": "Fast transition from user mode (CPL 3) to kernel mode (CPL 0) by loading CS, SS, EIP, and ESP from IA32_SYSENTER_* MSRs. This instruction serializes the pipeline, disables interrupts, and clears EFLAGS.IF. It is the fast-path alternative to INT for system calls.", "pseudocode": "if (CPL != 3) raise_exception(INVALID_OPCODE);\nCS ← IA32_SYSENTER_CS & ~3; // load kernel code segment\nSS ← (IA32_SYSENTER_CS + 8) | 0; // load kernel stack segment\nEIP ← IA32_SYSENTER_EIP;\nESP ← IA32_SYSENTER_ESP;\nEFLAGS.IF ← 0;\nPipeline_Serialization();", "example": "SYSENTER"}
{"mnemonic": "sysexit", "architecture": "x86", "full_name": "Fast Return from System Call", "summary": "Fast return to level 3 user code.", "syntax": "SYSEXIT", "encoding": {"format": "System", "hex_opcode": "0F 35", "visual_parts": [], "binary_pattern": "0F | 35", "bit_positions": "+0 | +1"}, "extension": "System", "operands": [], "description": "Fast return from kernel mode (CPL 0) to user mode (CPL 3) by restoring CS, SS, EIP, and ESP from implicit registers or operands. This instruction serializes the pipeline and re-enables interrupts. It complements SYSENTER for rapid system call returns.", "pseudocode": "if (CPL != 0) raise_exception(INVALID_OPCODE);\nCS ← (IA32_SYSENTER_CS + 16) | 3; // load user code segment\nSS ← (IA32_SYSENTER_CS + 24) | 3; // load user stack segment\nEIP ← ECX;\nESP ← EDX;\nEFLAGS.IF ← 1;\nPipeline_Serialization();", "example": "SYSEXIT"}
{"mnemonic": "lar", "architecture": "x86", "full_name": "Load Access Rights Byte", "summary": "Reads access rights from segment descriptor.", "syntax": "LAR r, r/m16", "encoding": {"format": "System", "hex_opcode": "0F 02", "visual_parts": [], "binary_pattern": "0F | 02", "bit_positions": "+0 | +1"}, "extension": "System", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m16", "desc": "16-bit register or memory"}], "description": "Loads the access rights byte from the segment descriptor referenced by the 16-bit selector in r/m16 into the destination general-purpose register (zero-extended to 32 or 64 bits). The ZF flag is cleared if the selector is invalid or references a data segment; ZF is set if successful. No other flags are modified.", "pseudocode": "selector ← r/m16;\nif (selector is invalid || descriptor_type(selector) != code_segment) {\n  ZF ← 0;\n} else {\n  dest ← zero_extend(descriptor_access_rights_byte(selector));\n  ZF ← 1;\n}", "example": "LAR rax, bx"}
{"mnemonic": "lsl", "architecture": "x86", "full_name": "Load Segment Limit", "summary": "Reads segment limit from descriptor.", "syntax": "LSL r, r/m16", "encoding": {"format": "System", "hex_opcode": "0F 03", "visual_parts": [], "binary_pattern": "0F | 03", "bit_positions": "+0 | +1"}, "extension": "System", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m16", "desc": "16-bit register or memory"}], "description": "Loads the segment limit from the descriptor table entry referenced by the source selector into the destination register. The instruction reads the descriptor from the GDT or LDT, extracts the limit field, and writes it to the destination. The ZF flag is cleared if the selector is valid and the descriptor is accessible; ZF is set if the selector is invalid or the descriptor type is unsuitable. This instruction is privileged and operates only in protected mode or 64-bit mode.", "pseudocode": "selector ← src[15:0];\ndescriptor ← load_descriptor(selector);\nif (descriptor is valid AND descriptor.type in {code, data, tss, gate}) {\n  dest ← descriptor.limit;\n  ZF ← 0;\n} else {\n  ZF ← 1;\n}", "example": "LSL rax, bx"}
{"mnemonic": "verr", "architecture": "x86", "full_name": "Verify Segment for Reading", "summary": "Checks if segment can be read; sets ZF.", "syntax": "VERR r/m16", "encoding": {"format": "System", "hex_opcode": "0F 00 /4", "visual_parts": [], "binary_pattern": "0F | 00 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "System", "operands": [{"name": "dest", "type": "r/m16", "desc": "16-bit register or memory"}], "description": "Verifies that the segment referenced by the selector can be read by the current code. The instruction loads the descriptor table entry and checks the segment type and privilege level. ZF is set to 1 if the selector is valid and readable at the current privilege level; ZF is cleared if the selector is invalid, the descriptor type is unsuitable, or privilege checks fail. This instruction is privileged and operates only in protected or 64-bit mode.", "pseudocode": "selector ← src[15:0];\ndescriptor ← load_descriptor(selector);\nif (descriptor is valid AND descriptor.type in {data, code-readable} AND cpl_check_passes) {\n  ZF ← 1;\n} else {\n  ZF ← 0;\n}", "example": "VERR bx"}
{"mnemonic": "verw", "architecture": "x86", "full_name": "Verify Segment for Writing", "summary": "Checks if segment can be written; sets ZF.", "syntax": "VERW r/m16", "encoding": {"format": "System", "hex_opcode": "0F 00 /5", "visual_parts": [], "binary_pattern": "0F | 00 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "System", "operands": [{"name": "dest", "type": "r/m16", "desc": "16-bit register or memory"}], "description": "Verifies that the segment referenced by the selector can be written by the current code. The instruction loads the descriptor table entry and checks the segment type and privilege level. ZF is set to 1 if the selector is valid and writable at the current privilege level; ZF is cleared if the selector is invalid, the descriptor type is unsuitable (e.g., code segment or read-only data), or privilege checks fail. This instruction is privileged and operates only in protected or 64-bit mode.", "pseudocode": "selector ← src[15:0];\ndescriptor ← load_descriptor(selector);\nif (descriptor is valid AND descriptor.type in {data-writable} AND cpl_check_passes) {\n  ZF ← 1;\n} else {\n  ZF ← 0;\n}", "example": "VERW bx"}
{"mnemonic": "arpl", "architecture": "x86", "full_name": "Adjust Requested Privilege Level", "summary": "Adjusts RPL of selector to match current CPL (Legacy).", "syntax": "ARPL r/m16, r16", "encoding": {"format": "System", "hex_opcode": "63", "visual_parts": [], "binary_pattern": "63", "bit_positions": "+0"}, "extension": "System (32-bit)", "operands": [{"name": "dest", "type": "r/m16", "desc": "16-bit register or memory"}, {"name": "src", "type": "r16", "desc": "16-bit general-purpose register"}], "description": "Adjusts the Requested Privilege Level (RPL) field of a selector to match the current Code Privilege Level (CPL) if the selector's current RPL is less privileged than CPL. If the adjustment occurs, ZF is set; otherwise ZF is cleared. This is a legacy instruction used in 32-bit protected mode to enforce privilege level consistency; it is not supported in 64-bit mode. All flags except ZF are unchanged.", "pseudocode": "selector ← dest[15:0];\nrpl ← selector[1:0];\ncpl ← current_cpl;\nif (rpl < cpl) {\n  selector[1:0] ← cpl;\n  dest ← selector;\n  ZF ← 1;\n} else {\n  ZF ← 0;\n}", "example": "ARPL bx, ax"}
{"mnemonic": "rsm", "architecture": "x86", "full_name": "Resume from System Management Mode", "summary": "Exits SMM and returns to previous state (Privileged).", "syntax": "RSM", "encoding": {"format": "System", "hex_opcode": "0F AA", "visual_parts": [], "binary_pattern": "0F | AA", "bit_positions": "+0 | +1"}, "extension": "System (SMM)", "operands": [], "description": "Resumes normal CPU operation from System Management Mode (SMM), restoring processor state from the SMM state save area and resuming execution at the return instruction pointer saved at SMM entry. This instruction is privileged and can only be executed inside SMM. The CPU context (all registers, segment descriptors, and memory-type ranges) is restored atomically, and control flow returns to the interrupted code or handler.", "pseudocode": "restore_cpu_state_from_smm_save_area();\nreturn_eip ← SMM_SAVE_AREA[return_address_offset];\njump(return_eip);", "example": "RSM"}
{"mnemonic": "bswap", "architecture": "x86", "full_name": "Byte Swap", "summary": "Reverses the byte order of a 32/64-bit register.", "syntax": "BSWAP r", "encoding": {"format": "Legacy", "hex_opcode": "0F C8", "visual_parts": [], "binary_pattern": "0F | C8", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}], "description": "Reverses the byte order within a 32-bit or 64-bit general-purpose register. In 32-bit mode, bits [7:0] swap with [31:24] and bits [15:8] swap with [23:16]. In 64-bit mode, all 8 bytes are reversed. No flags are modified. For 16-bit operands, the instruction is undefined on modern processors.", "pseudocode": "if (operand_size == 32) {\n  dest ← {dest[7:0], dest[15:8], dest[23:16], dest[31:24]};\n} else if (operand_size == 64) {\n  dest ← {dest[7:0], dest[15:8], dest[23:16], dest[31:24], dest[39:32], dest[47:40], dest[55:48], dest[63:56]};\n}", "example": "BSWAP rax"}
{"mnemonic": "cmpxchg8b", "architecture": "x86", "full_name": "Compare and Exchange 8 Bytes", "summary": "Atomically compares EDX:EAX with memory; swaps if equal.", "syntax": "CMPXCHG8B m64", "encoding": {"format": "Legacy", "hex_opcode": "0F C7 /1", "visual_parts": [], "binary_pattern": "0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "Base", "operands": [{"name": "dest", "type": "m64", "desc": "64-bit memory operand (quadword)"}], "description": "Atomically compares the 64-bit value in EDX:EAX with the 64-bit memory operand; if equal, the instruction exchanges the value in ECX:EBX with memory and clears ZF, otherwise it loads memory into EDX:EAX and sets ZF. The operation is atomic at the memory bus level on single-processor systems and uses locked semantics on multiprocessor systems. All arithmetic flags (OF, SF, ZF, AF, CF, PF) are updated based on the compare result; other flags are undefined.", "pseudocode": "value_memory ← [dest];\nif (EDX:EAX == value_memory) {\n  [dest] ← ECX:EBX;\n  ZF ← 1;\n} else {\n  EDX:EAX ← value_memory;\n  ZF ← 0;\n}\nOF, SF, AF, CF, PF undefined;", "example": "CMPXCHG8B [rbp-8]"}
{"mnemonic": "addsubps", "architecture": "x86", "full_name": "Packed Single-FP Add/Subtract", "summary": "Adds odd elements, subtracts even elements (Complex Math).", "syntax": "ADDSUBPS xmm1, xmm2/m128", "encoding": {"format": "SSE3", "hex_opcode": "F2 0F D0", "visual_parts": [], "binary_pattern": "F2 | 0F | D0", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs packed single-precision floating-point addition on odd-indexed elements (1, 3) and subtraction on even-indexed elements (0, 2) within 128-bit XMM operands. The first operand is destination and implicitly source; the second operand is source from register or memory. Exceptions are not masked and follow standard SIMD exception handling. No flags are modified; denormalized inputs may generate exceptions depending on MXCSR settings.", "pseudocode": "dest[31:0] ← dest[31:0] - src[31:0];\ndest[63:32] ← dest[63:32] + src[63:32];\ndest[95:64] ← dest[95:64] - src[95:64];\ndest[127:96] ← dest[127:96] + src[127:96];", "example": "ADDSUBPS xmm1, xmm2/m128"}
{"mnemonic": "haddps", "architecture": "x86", "full_name": "Horizontal Add Packed Single-Precision", "summary": "Adds adjacent float elements horizontally.", "syntax": "HADDPS xmm1, xmm2/m128", "encoding": {"format": "SSE3", "hex_opcode": "F2 0F 7C", "visual_parts": [], "binary_pattern": "F2 | 0F | 7C", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Adds adjacent pairs of single-precision floating-point values horizontally within 128-bit XMM registers. The instruction pairs elements from the destination and source operands, computing the sum of adjacent elements and storing results in the destination. No CPU flags are affected by this instruction.", "pseudocode": "dest[0:31] ← dest[0:31] + dest[32:63]\ndest[32:63] ← src[0:31] + src[32:63]\ndest[64:95] ← dest[64:95] + dest[96:127]\ndest[96:127] ← src[64:65] + src[96:127]", "example": "HADDPS xmm1, xmm2/m128"}
{"mnemonic": "movddup", "architecture": "x86", "full_name": "Move One Double-FP and Duplicate", "summary": "Loads 64-bit double and duplicates it to fill 128-bit register.", "syntax": "MOVDDUP xmm1, xmm2/m64", "encoding": {"format": "SSE3", "hex_opcode": "F2 0F 12", "visual_parts": [], "binary_pattern": "F2 | 0F | 12", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Loads a 64-bit double-precision floating-point value from the source operand and duplicates it to fill the entire 128-bit XMM register destination. The lower 64 bits of the source are replicated to both the lower and upper 64 bits of the destination. No CPU flags are affected by this instruction.", "pseudocode": "temp64 ← src[0:63]\ndest[0:63] ← temp64\ndest[64:127] ← temp64", "example": "MOVDDUP xmm1, xmm2/m64"}
{"mnemonic": "lddqu", "architecture": "x86", "full_name": "Load Unaligned Integer 128-bit", "summary": "Loads unaligned data avoiding split-line penalties.", "syntax": "LDDQU xmm1, m128", "encoding": {"format": "SSE3", "hex_opcode": "F2 0F F0", "visual_parts": [], "binary_pattern": "F2 | 0F | F0", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "m128", "desc": "128-bit memory operand"}], "description": "Loads 128 bits of unaligned integer data from memory into an XMM register without causing split-cache-line penalties on processors that support this instruction. This instruction provides better performance than MOVDQU for certain memory alignments. No CPU flags are affected by this instruction.", "pseudocode": "dest[0:127] ← mem[addr:addr+15]", "example": "LDDQU xmm1, [rbp-16]"}
{"mnemonic": "pshufb", "architecture": "x86", "full_name": "Packed Shuffle Bytes", "summary": "Shuffles bytes according to indices in source operand.", "syntax": "PSHUFB xmm1, xmm2/m128", "encoding": {"format": "SSSE3", "hex_opcode": "66 0F 38 00", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 00", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Shuffles bytes within 128-bit operands using a shuffle control mask in the source operand. For each byte in the destination, the corresponding control byte in the source specifies which byte from the destination is placed in that position; if bit 7 of the control byte is set, the result byte is zeroed. No CPU flags are affected by this instruction.", "pseudocode": "for i ← 0 to 15 do\n  if src[i*8+7] == 1 then\n    dest[i*8:i*8+7] ← 0\n  else\n    j ← src[i*8:i*8+3]\n    dest[i*8:i*8+7] ← dest[j*8:j*8+7]\n  end if\nend for", "example": "PSHUFB xmm1, xmm2/m128"}
{"mnemonic": "phaddw", "architecture": "x86", "full_name": "Packed Horizontal Add Word", "summary": "Adds adjacent 16-bit integers horizontally.", "syntax": "PHADDW xmm1, xmm2/m128", "encoding": {"format": "SSSE3", "hex_opcode": "66 0F 38 01", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 01", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Adds adjacent pairs of signed 16-bit integer values horizontally within 128-bit XMM registers. Two pairs are summed from the destination operand and two pairs from the source operand, with results placed in the lower and upper halves of the destination. No CPU flags are affected by this instruction.", "pseudocode": "dest[0:15] ← dest[0:15] + dest[16:31]\ndest[16:31] ← dest[32:47] + dest[48:63]\ndest[32:47] ← src[0:15] + src[16:31]\ndest[48:63] ← src[32:47] + src[48:63]\ndest[64:79] ← dest[64:79] + dest[80:95]\ndest[80:95] ← dest[96:111] + dest[112:127]\ndest[96:111] ← src[64:79] + src[80:95]\ndest[112:127] ← src[96:111] + src[112:127]", "example": "PHADDW xmm1, xmm2/m128"}
{"mnemonic": "palignr", "architecture": "x86", "full_name": "Packed Align Right", "summary": "Concatenates dest and src, extracts 128 bits byte-aligned.", "syntax": "PALIGNR xmm1, xmm2/m128, imm8", "encoding": {"format": "SSSE3", "hex_opcode": "66 0F 3A 0F", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 0F", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Concatenates the 128-bit destination and 128-bit source operands into a 256-bit intermediate value, then extracts a 128-bit aligned region starting at a byte offset specified by an 8-bit immediate value. The result is stored in the destination operand. No CPU flags are affected by this instruction.", "pseudocode": "concat[0:255] ← (src[0:127] << 128) | dest[0:127]\nshift_amount ← imm8 * 8\nif shift_amount >= 128 then\n  result ← 0\nelse\n  result ← concat[shift_amount:shift_amount+127]\nend if\ndest[0:127] ← result", "example": "PALIGNR xmm1, xmm2/m128, 3"}
{"mnemonic": "pmulhrsw", "architecture": "x86", "full_name": "Packed Multiply High with Round and Scale", "summary": "Multiplies signed 16-bit words, rounds, and scales.", "syntax": "PMULHRSW xmm1, xmm2/m128", "encoding": {"format": "SSSE3", "hex_opcode": "66 0F 38 0B", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 0B", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Multiplies signed 16-bit integers from destination and source operands, returning the scaled and rounded high 16 bits of the 32-bit product (result = (product + 0x4000) >> 15). Saturation occurs if the result exceeds the signed 16-bit range. No CPU flags are affected by this instruction.", "pseudocode": "for i ← 0 to 7 do\n  product[i] ← dest[i*16:i*16+15] * src[i*16:i*16+15]\n  intermediate[i] ← product[i] + 0x4000\n  result[i] ← intermediate[i] >> 15\n  if result[i] > 32767 then\n    dest[i*16:i*16+15] ← 32767\n  else if result[i] < -32768 then\n    dest[i*16:i*16+15] ← -32768\n  else\n    dest[i*16:i*16+15] ← result[i]\n  end if\nend for", "example": "PMULHRSW xmm1, xmm2/m128"}
{"mnemonic": "psignb", "architecture": "x86", "full_name": "Packed Sign Byte", "summary": "Negates/Zeroes bytes in dest based on sign of src.", "syntax": "PSIGNB xmm1, xmm2/m128", "encoding": {"format": "SSSE3", "hex_opcode": "66 0F 38 08", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 08", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Negates or zeros bytes in the destination operand based on the sign of corresponding bytes in the source operand. If the source byte is negative, the destination byte is negated; if zero, the destination byte is zeroed; if positive, the destination byte is unchanged. No CPU flags are affected by this instruction.", "pseudocode": "for i ← 0 to 15 do\n  if src[i*8:i*8+7] < 0 then\n    dest[i*8:i*8+7] ← -dest[i*8:i*8+7]\n  else if src[i*8:i*8+7] == 0 then\n    dest[i*8:i*8+7] ← 0\n  else\n    dest[i*8:i*8+7] ← dest[i*8:i*8+7]\n  end if\nend for", "example": "PSIGNB xmm1, xmm2/m128"}
{"mnemonic": "pabsb", "architecture": "x86", "full_name": "Packed Absolute Value Byte", "summary": "Computes absolute value of bytes.", "syntax": "PABSB xmm1, xmm2/m128", "encoding": {"format": "SSSE3", "hex_opcode": "66 0F 38 1C", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 1C", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Computes the absolute value of each signed byte in the source operand and stores the result in the destination XMM register. All 16 bytes are processed in parallel; the value 0x80 (-128) is handled specially and remains 0x80. No flags are affected by this instruction.", "pseudocode": "for i = 0 to 15:\n  byte = src[i]\n  if byte == 0x80:\n    dest[i] ← 0x80\n  else if byte < 0:\n    dest[i] ← -byte\n  else:\n    dest[i] ← byte", "example": "PABSB xmm1, xmm2/m128"}
{"mnemonic": "blendps", "architecture": "x86", "full_name": "Blend Packed Single-Precision", "summary": "Selects floats from two sources based on immediate mask.", "syntax": "BLENDPS xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 0C", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 0C", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Selects single-precision floating-point values from two sources based on bit positions in an 8-bit immediate; bits 0-3 each control selection of one 32-bit element (0 selects dest, 1 selects src). Requires SSE4.1. No flags are affected.", "pseudocode": "for i = 0 to 3:\n  bit_pos = i\n  if (imm8 >> bit_pos) & 1:\n    dest[i*32 : i*32+31] ← src[i*32 : i*32+31]\n  else:\n    dest[i*32 : i*32+31] ← dest[i*32 : i*32+31]", "example": "BLENDPS xmm1, xmm2/m128, 3"}
{"mnemonic": "pblendw", "architecture": "x86", "full_name": "Packed Blend Words", "summary": "Selects words from two sources based on immediate mask.", "syntax": "PBLENDW xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 0E", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 0E", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Selects 16-bit word values from two sources based on bit positions in an 8-bit immediate; bits 0-7 each control selection of one 16-bit word element (0 selects dest, 1 selects src). Requires SSE4.1. No flags are affected.", "pseudocode": "for i = 0 to 7:\n  bit_pos = i\n  if (imm8 >> bit_pos) & 1:\n    dest[i*16 : i*16+15] ← src[i*16 : i*16+15]\n  else:\n    dest[i*16 : i*16+15] ← dest[i*16 : i*16+15]", "example": "PBLENDW xmm1, xmm2/m128, 3"}
{"mnemonic": "adc", "architecture": "x86", "full_name": "Add with Carry", "summary": "Adds operands and the Carry Flag (CF).", "syntax": "ADC r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "11", "length": "2+", "visual_parts": [], "binary_pattern": "11", "bit_positions": "+0"}, "operands": [{"name": "dest", "desc": "Reg/Mem"}, {"name": "src", "desc": "Reg"}], "extension": "Base", "description": "Adds the source operand and the Carry Flag (CF) to the destination operand, storing the result in the destination. Supports 8/16/32/64-bit sizes (64-bit in long mode only). Sets CF on unsigned overflow, SF/ZF/AF/OF/PF based on result; CF is critical for multi-precision arithmetic chains.", "pseudocode": "result ← dest + src + CF\ndest ← result\nCF ← unsigned_overflow(dest_old, src, CF)\nOF ← signed_overflow(dest_old, src, result)\nZF ← (result == 0)\nSF ← (result_sign_bit == 1)\nAF ← ((dest_old & 0xF) + (src & 0xF) + CF) > 0xF\nPF ← popcount(result & 0xFF) is even", "example": "ADC rbx, rax"}
{"mnemonic": "sbb", "architecture": "x86", "full_name": "Subtract with Borrow", "summary": "Subtracts operands and the Carry Flag (CF).", "syntax": "SBB r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "19", "length": "2+", "visual_parts": [], "binary_pattern": "19", "bit_positions": "+0"}, "operands": [{"name": "dest", "desc": "Reg/Mem"}, {"name": "src", "desc": "Reg"}], "extension": "Base", "description": "Subtracts the source operand and the Carry Flag (CF) from the destination operand, storing the result in the destination. Supports 8/16/32/64-bit sizes (64-bit in long mode only). Sets CF on unsigned borrow, SF/ZF/AF/OF/PF based on result; CF enables multi-precision subtraction chains.", "pseudocode": "result ← dest - src - CF\ndest ← result\nCF ← unsigned_borrow(dest_old, src, CF)\nOF ← signed_overflow(dest_old, src, result)\nZF ← (result == 0)\nSF ← (result_sign_bit == 1)\nAF ← ((dest_old & 0xF) - (src & 0xF) - CF) has unsigned borrow\nPF ← popcount(result & 0xFF) is even", "example": "SBB rbx, rax"}
{"mnemonic": "shld", "architecture": "x86", "full_name": "Double Precision Shift Left", "summary": "Shifts dest left, filling with bits from src.", "syntax": "SHLD r/m, r, imm8", "encoding": {"format": "Legacy", "hex_opcode": "0F A4", "length": "4+", "visual_parts": [], "binary_pattern": "0F | A4", "bit_positions": "+0 | +1"}, "operands": [{"name": "dest", "desc": "Reg/Mem"}, {"name": "fill", "desc": "Reg"}, {"name": "count", "desc": "Imm"}], "extension": "Base", "description": "Shifts the destination operand left by a count, filling the vacated bits from the most-significant bits of the source operand. Supports 16/32/64-bit operands; count comes from the immediate or implicitly from CL. Sets CF to the last bit shifted out, OF if count=1, SF/ZF/PF based on the result.", "pseudocode": "if count > operand_width:\n  count ← count mod (operand_width + 1)\nif count == 0:\n  skip\nelse:\n  CF ← bit_shifted_out_from_left\n  dest ← (dest << count) | (src >> (operand_width - count))\n  if count == 1:\n    OF ← (dest_sign_bit_after != CF)\n  else:\n    OF ← undefined\n  ZF ← (dest == 0)\n  SF ← (dest_sign_bit == 1)\n  PF ← popcount(dest & 0xFF) is even", "example": "SHLD rbx, rax, 3"}
{"mnemonic": "shrd", "architecture": "x86", "full_name": "Double Precision Shift Right", "summary": "Shifts dest right, filling with bits from src.", "syntax": "SHRD r/m, r, imm8", "encoding": {"format": "Legacy", "hex_opcode": "0F AC", "length": "4+", "visual_parts": [], "binary_pattern": "0F | AC", "bit_positions": "+0 | +1"}, "operands": [{"name": "dest", "desc": "Reg/Mem"}, {"name": "fill", "desc": "Reg"}, {"name": "count", "desc": "Imm"}], "extension": "Base", "description": "Shifts the destination operand right by a count, filling the vacated bits from the least-significant bits of the source operand. Supports 16/32/64-bit operands; count comes from the immediate or implicitly from CL. Sets CF to the last bit shifted out, OF if count=1, SF/ZF/PF based on the result.", "pseudocode": "if count > operand_width:\n  count ← count mod (operand_width + 1)\nif count == 0:\n  skip\nelse:\n  CF ← bit_shifted_out_from_right\n  dest ← (dest >> count) | (src << (operand_width - count))\n  if count == 1:\n    OF ← (dest_sign_bit_after != bit_was_at_position_width_1)\n  else:\n    OF ← undefined\n  ZF ← (dest == 0)\n  SF ← (dest_sign_bit == 1)\n  PF ← popcount(dest & 0xFF) is even", "example": "SHRD rbx, rax, 3"}
{"mnemonic": "vpermb", "architecture": "x86", "full_name": "Permute Packed Bytes", "summary": "Permutes bytes in ZMM based on index vector.", "syntax": "VPERMB zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 8D /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 8D", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "idx", "desc": "ZMM"}, {"name": "src", "desc": "ZMM/Mem"}], "extension": "AVX-512-VBMI", "description": "Permutes bytes within 64-byte blocks of a ZMM register using a 512-bit index vector; each byte in the index selects a source byte (bits 3-0 select lane, bits 6-4 select byte within 64-byte lane). Requires AVX-512-VBMI. Supports write-masking via {k1}. No flags are affected.", "pseudocode": "for lane = 0 to 7:\n  for byte_in_lane = 0 to 63:\n    idx_byte = zmm2[lane*64 + byte_in_lane]\n    src_lane = idx_byte & 0x7\n    src_byte_offset = idx_byte >> 3\n    if src_byte_offset < 64:\n      selected = zmm3[src_lane*64 + src_byte_offset]\n    else:\n      selected = 0\n    if k1[byte_in_lane] or k1 is not used:\n      zmm1[lane*64 + byte_in_lane] ← selected", "example": "VPERMB zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpermi2b", "architecture": "x86", "full_name": "Permute Two-Source Bytes", "summary": "Shuffles bytes from two ZMM registers into destination.", "syntax": "VPERMI2B zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 75 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 75", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "idx", "desc": "ZMM"}, {"name": "src", "desc": "ZMM/Mem"}], "extension": "AVX-512-VBMI", "description": "Permutes bytes from two ZMM registers (destination and source) using byte indices in the second source, storing results in the destination. The instruction performs a gather-like operation where each byte index selects from either the destination or source register based on the high bit. No flags are modified; the operation is masked by the opmask register k1, with zeroing or merging semantics.", "pseudocode": "for i = 0 to 63:\n  idx = zmm2[8*i:8*i+7]\n  if idx[7] == 0:\n    zmm1[8*i:8*i+7] ← zmm1[8*(idx[6:0]):8*(idx[6:0])+7]\n  else:\n    zmm1[8*i:8*i+7] ← zmm3[8*(idx[6:0]):8*(idx[6:0])+7]\n  zmm1[8*i:8*i+7] ← zmm1[8*i:8*i+7] & k1_mask[i]", "example": "VPERMI2B zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpermt2b", "architecture": "x86", "full_name": "Permute Two-Source Bytes (Overwrite)", "summary": "Shuffles bytes from two sources, overwriting index.", "syntax": "VPERMT2B zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 7D /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 7D", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "idx", "desc": "ZMM"}, {"name": "src", "desc": "ZMM/Mem"}], "extension": "AVX-512-VBMI", "description": "Permutes bytes from two sources using indices in the destination register (which is overwritten), selecting from either the index register or the second source based on the index's high bit. This is the two-operand form where indices reside in what becomes the output. No flags are modified; masking via k1 applies to the result with optional zeroing.", "pseudocode": "for i = 0 to 63:\n  idx = zmm1[8*i:8*i+7]\n  if idx[7] == 0:\n    result[8*i:8*i+7] ← zmm2[8*(idx[6:0]):8*(idx[6:0])+7]\n  else:\n    result[8*i:8*i+7] ← zmm3[8*(idx[6:0]):8*(idx[6:0])+7]\n  zmm1[8*i:8*i+7] ← result[8*i:8*i+7] & k1_mask[i]", "example": "VPERMT2B zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpmultishiftqb", "architecture": "x86", "full_name": "Select Packed Unaligned Bytes from Quadword Sources", "summary": "Selects bytes from each 64-bit element based on shift control.", "syntax": "VPMULTISHIFTQB zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 83 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 83", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "ctrl", "desc": "ZMM"}, {"name": "src", "desc": "ZMM/Mem"}], "extension": "AVX-512-VBMI", "description": "Selects bytes from each 64-bit element by using 4-bit shift control values extracted from the control ZMM register. Each 8-bit control field specifies which of 8 bytes within its 64-bit source element to extract into each output byte. No flags are modified; the operation respects the opmask k1 for selective writing.", "pseudocode": "for i = 0 to 7:  // 8 quadwords (64-bit elements)\n  for j = 0 to 7:  // 8 bytes within each quadword\n    shift_val = zmm2[64*i+4*j+3:64*i+4*j]\n    zmm1[64*i+8*j+7:64*i+8*j] ← zmm3[64*i + 8*shift_val + 7 : 64*i + 8*shift_val]\n    zmm1[64*i+8*j+7:64*i+8*j] ← zmm1[64*i+8*j+7:64*i+8*j] & k1_mask[64*i+8*j:64*i+8*j+7]", "example": "VPMULTISHIFTQB zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpshldd", "architecture": "x86", "full_name": "Packed Shift Left Double Concatenate", "summary": "Funnel shift left of doublewords.", "syntax": "VPSHLDD zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 71 /r /ib", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 71", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src1", "desc": "ZMM"}, {"name": "src2", "desc": "ZMM/Mem"}, {"name": "cnt", "desc": "Imm"}], "extension": "AVX-512-VBMI2", "description": "Performs a funnel left-shift (double concatenate) on 32-bit doublewords: each output doubleword is the logical left-shift result of concatenating src2 into src1, shifted left by the immediate count. Bits shifted out on the left are discarded; bits from src2 fill in on the right. No arithmetic flags are modified; the operation is EVEX-encoded with masking support via k1.", "pseudocode": "for i = 0 to 15:  // 16 doublewords\n  concatenated = (zmm2[32*i+31:32*i] << 32) | zmm3[32*i+31:32*i]\n  shift_amount = cnt & 0x1F\n  zmm1[32*i+31:32*i] ← (concatenated >> (32 - shift_amount)) & 0xFFFFFFFF\n  zmm1[32*i+31:32*i] ← zmm1[32*i+31:32*i] & k1_mask[i]", "example": "VPSHLDD zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpshrdd", "architecture": "x86", "full_name": "Packed Shift Right Double Concatenate", "summary": "Funnel shift right of doublewords.", "syntax": "VPSHRDD zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 73 /r /ib", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 73", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src1", "desc": "ZMM"}, {"name": "src2", "desc": "ZMM/Mem"}, {"name": "cnt", "desc": "Imm"}], "extension": "AVX-512-VBMI2", "description": "Performs a funnel right-shift (double concatenate) on 32-bit doublewords: each output doubleword is the logical right-shift result of concatenating src1 and src2, shifted right by the immediate count. Bits shifted out on the right are discarded; bits from src1 fill in on the left. No arithmetic flags are modified; masking via k1 applies to the result.", "pseudocode": "for i = 0 to 15:  // 16 doublewords\n  concatenated = (zmm2[32*i+31:32*i] << 32) | zmm3[32*i+31:32*i]\n  shift_amount = cnt & 0x1F\n  zmm1[32*i+31:32*i] ← (concatenated >> shift_amount) & 0xFFFFFFFF\n  zmm1[32*i+31:32*i] ← zmm1[32*i+31:32*i] & k1_mask[i]", "example": "VPSHRDD zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpcompressb", "architecture": "x86", "full_name": "Store Sparse Packed Byte Integer Values", "summary": "Compresses active bytes from ZMM to memory.", "syntax": "VPCOMPRESSB m512 {k1}, zmm1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 63 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 63", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "Mem"}, {"name": "src", "desc": "ZMM"}], "extension": "AVX-512-VBMI2", "description": "Stores bytes from ZMM into memory at sparse, mask-selected positions: only bytes where the corresponding opmask bit k1 is set are written to consecutive memory locations. The instruction performs a contiguous write of active bytes while maintaining their relative order. No flags are modified; this is a memory write operation with variable length determined by the popcount of the mask.", "pseudocode": "byte_count = 0\nfor i = 0 to 63:\n  if k1_mask[i] == 1:\n    mem[byte_count] ← zmm1[8*i+7:8*i]\n    byte_count += 1", "example": "VPCOMPRESSB [rbp-64], zmm1"}
{"mnemonic": "vpexpandb", "architecture": "x86", "full_name": "Load Sparse Packed Byte Integer Values", "summary": "Expands bytes from memory into sparse locations in ZMM.", "syntax": "VPEXPANDB zmm1 {k1}, m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 62 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 62", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src", "desc": "Mem"}], "extension": "AVX-512-VBMI2", "description": "Loads bytes from memory into sparse, mask-selected positions in ZMM: bytes at consecutive memory locations are placed into ZMM positions where the opmask k1 is set, with unmasked positions remaining zero or unchanged. This is the inverse of compress. No flags are modified; the operation fills a sparse vector from compact memory data.", "pseudocode": "byte_count = 0\nfor i = 0 to 63:\n  if k1_mask[i] == 1:\n    zmm1[8*i+7:8*i] ← mem[byte_count]\n    byte_count += 1\n  else:\n    zmm1[8*i+7:8*i] ← 0  // or unchanged if merging mode", "example": "VPEXPANDB zmm1, [rbp-64]"}
{"mnemonic": "vpopcntb", "architecture": "x86", "full_name": "Packed Population Count Byte", "summary": "Counts set bits in each byte.", "syntax": "VPOPCNTB zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 54 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 54", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src", "desc": "ZMM/Mem"}], "extension": "AVX-512-BITALG", "description": "Counts the number of set bits (population count) in each byte of the source, writing the count (0-8) into the corresponding byte of the destination. This operates independently on each of 64 bytes in the ZMM register. No arithmetic flags are modified; the instruction is part of AVX-512-BITALG and supports masking via k1.", "pseudocode": "for i = 0 to 63:\n  count = 0\n  byte_val = zmm2[8*i+7:8*i]\n  for bit = 0 to 7:\n    if byte_val[bit] == 1:\n      count += 1\n  zmm1[8*i+7:8*i] ← count & k1_mask[i]", "example": "VPOPCNTB zmm1, zmm2/m512"}
{"mnemonic": "vpshufbitqmb", "architecture": "x86", "full_name": "Shuffle Bits from Quadword Elements to Mask", "summary": "Extracts bits from bytes and packs into a mask register.", "syntax": "VPSHUFBITQMB k1 {k2}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 8F /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 8F", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "k-reg"}, {"name": "src1", "desc": "ZMM"}, {"name": "src2", "desc": "ZMM/Mem"}], "extension": "AVX-512-BITALG", "description": "Extracts bits from quadword elements using a shuffle pattern and packs them into a mask register. The operation uses zmm3/m512 as a bit-select control for each bit position in zmm2, extracting one bit per control byte and combining results into an 8-bit or 16-bit mask. This is a non-SIMD operation that produces only a mask output; no arithmetic flags are modified.", "pseudocode": "for (i = 0; i < 64; i++) {\n  byte_idx = zmm3[8*i : 8*i+7];\n  if (byte_idx < 64) {\n    bit = zmm2[byte_idx];\n  } else {\n    bit = 0;\n  }\n  k1[i] = bit;\n}\nk1 = k1 & k2;", "example": "VPSHUFBITQMB k1, zmm2, zmm3/m512"}
{"mnemonic": "vp2intersectd", "architecture": "x86", "full_name": "Compute Intersection Pair Doublewords", "summary": "Computes intersection of two ZMM registers into mask pair.", "syntax": "VP2INTERSECTD k1+1, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.NDS.512.F2.0F38.W0 68 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | F2 | 0F | 38 | 68", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "kdest", "desc": "k-pair"}, {"name": "src1", "desc": "ZMM"}, {"name": "src2", "desc": "ZMM/Mem"}], "extension": "AVX-512-VP2INTERSECT", "description": "Computes the intersection of two sets of doublewords and produces a pair of mask registers (k1 and k1+1). Each 32-bit element in zmm2 is compared against all elements in zmm3/m512; k1 contains matches at each position, and k1+1 contains match counts or indices. No arithmetic flags are modified; results are written only to the mask pair.", "pseudocode": "match_mask = 0;\nmatch_count = 0;\nfor (i = 0; i < 16; i++) {\n  matches = 0;\n  for (j = 0; j < 16; j++) {\n    if (zmm2[32*i : 32*i+31] == zmm3[32*j : 32*j+31]) {\n      matches = 1;\n      break;\n    }\n  }\n  match_mask = match_mask | (matches << i);\n  if (matches) match_count++;\n}\nk1 = match_mask;\nk2 = match_count;", "example": "VP2INTERSECTD k1+1, zmm2, zmm3/m512"}
{"mnemonic": "vpmadd52luq", "architecture": "x86", "full_name": "Packed Multiply-Add Unsigned 52-bit Integers (Low)", "summary": "Fused multiply-add for 52-bit integers (Low 52 bits).", "syntax": "VPMADD52LUQ zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 B4 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | B4", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src1", "desc": "ZMM"}, {"name": "src2", "desc": "ZMM/Mem"}], "extension": "AVX-512-IFMA", "description": "Performs a fused multiply-add operation on 52-bit unsigned integers, extracting the lower 52 bits of the 104-bit product and accumulating into the destination. For each 64-bit lane: compute (zmm2[63:0] * zmm3[63:0]) + (zmm1[63:0]), extract bits [51:0], and write back to zmm1. Supports masking via k1; no arithmetic flags are modified.", "pseudocode": "for (i = 0; i < 8; i++) {\n  idx = 64*i;\n  product = zmm2[idx+63 : idx] * zmm3[idx+63 : idx];\n  sum = (product + zmm1[idx+63 : idx]);\n  result = sum & 0xFFFFFFFFFFFFF;  // 52 bits\n  zmm1[idx+63 : idx] = result;\n  if (k1[i]) zmm1[idx+63 : idx] = result;\n}", "example": "VPMADD52LUQ zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpmadd52huq", "architecture": "x86", "full_name": "Packed Multiply-Add Unsigned 52-bit Integers (High)", "summary": "Fused multiply-add for 52-bit integers (High 52 bits).", "syntax": "VPMADD52HUQ zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 B5 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | B5", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src1", "desc": "ZMM"}, {"name": "src2", "desc": "ZMM/Mem"}], "extension": "AVX-512-IFMA", "description": "Performs a fused multiply-add operation on 52-bit unsigned integers, extracting the upper 52 bits of the 104-bit product and accumulating into the destination. For each 64-bit lane: compute (zmm2[63:0] * zmm3[63:0]) + (zmm1[63:0]), extract bits [103:52], and write back to zmm1. Supports masking via k1; no arithmetic flags are modified.", "pseudocode": "for (i = 0; i < 8; i++) {\n  idx = 64*i;\n  product = zmm2[idx+63 : idx] * zmm3[idx+63 : idx];\n  sum = (product + zmm1[idx+63 : idx]);\n  result = (sum >> 52) & 0xFFFFFFFFFFFFF;  // upper 52 bits\n  if (k1[i]) zmm1[idx+63 : idx] = result;\n}", "example": "VPMADD52HUQ zmm1, zmm2, zmm3/m512"}
{"mnemonic": "aadd", "architecture": "x86", "full_name": "Atomically Add", "summary": "Atomically adds a value to a remote memory location.", "syntax": "AADD m32, r32", "encoding": {"format": "VEX", "hex_opcode": "NP 0F 38 FC !(11):rrr:bbb", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | FC", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "Mem"}, {"name": "src", "desc": "Reg"}], "extension": "RAO-INT", "description": "Atomically adds a 32-bit register value to a memory location without acquiring a lock and without returning the old value. This is a remote atomic operation that guarantees atomicity at the hardware level via cache coherency; the instruction does not serialize the entire pipeline but may have store ordering implications. No flags are modified; this is a write-only operation to memory.", "pseudocode": "atomic_add([dest], src);\n// Semantically: [dest] ← [dest] + src", "example": "AADD [rbp-4], eax"}
{"mnemonic": "aand", "architecture": "x86", "full_name": "Atomically AND", "summary": "Atomically ANDs a value to a remote memory location.", "syntax": "AAND m32, r32", "encoding": {"format": "VEX", "hex_opcode": "66 0F 38 FC !(11):rrr:bbb", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | FC | ModRM", "bit_positions": "+0 | +1 | +2 | +3 | +4"}, "operands": [{"name": "dest", "desc": "Mem"}, {"name": "src", "desc": "Reg"}], "extension": "RAO-INT", "description": "Atomically ANDs a 32-bit register value with a memory location without acquiring a lock and without returning the old value. This remote atomic operation guarantees atomicity via cache coherency mechanisms; it does not serialize the entire pipeline but provides store-ordering guarantees. No flags are modified.", "pseudocode": "atomic_and([dest], src);\n// Semantically: [dest] ← [dest] & src", "example": "AAND [rbp-4], eax"}
{"mnemonic": "aor", "architecture": "x86", "full_name": "Atomically OR", "summary": "Atomically ORs a value to a remote memory location.", "syntax": "AOR m32, r32", "encoding": {"format": "VEX", "hex_opcode": "F2 0F 38 FC !(11):rrr:bbb", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | FC | ModRM", "bit_positions": "+0 | +1 | +2 | +3 | +4"}, "operands": [{"name": "dest", "desc": "Mem"}, {"name": "src", "desc": "Reg"}], "extension": "RAO-INT", "description": "Atomically ORs a 32-bit register value with a memory location without acquiring a lock and without returning the old value. This remote atomic operation uses cache coherency to guarantee atomicity; it does not serialize the full pipeline but enforces store ordering. No flags are modified.", "pseudocode": "atomic_or([dest], src);\n// Semantically: [dest] ← [dest] | src", "example": "AOR [rbp-4], eax"}
{"mnemonic": "axor", "architecture": "x86", "full_name": "Atomically XOR", "summary": "Atomically XORs a value to a remote memory location.", "syntax": "AXOR m32, r32", "encoding": {"format": "VEX", "hex_opcode": "F3 0F 38 FC !(11):rrr:bbb", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | FC | ModRM", "bit_positions": "+0 | +1 | +2 | +3 | +4"}, "operands": [{"name": "dest", "desc": "Mem"}, {"name": "src", "desc": "Reg"}], "extension": "RAO-INT", "description": "Atomically XORs a 32-bit register value with a memory location without acquiring a lock and without returning the old value. This remote atomic operation guarantees atomicity through cache coherency; it does not serialize the entire pipeline but maintains store-ordering properties. No flags are modified.", "pseudocode": "atomic_xor([dest], src);\n// Semantically: [dest] ← [dest] ^ src", "example": "AXOR [rbp-4], eax"}
{"mnemonic": "cmpccxadd", "architecture": "x86", "full_name": "Compare and Add if Condition is Met", "summary": "Atomically adds if condition is met.", "syntax": "CMPccXADD m32, r32, r32", "encoding": {"format": "EVEX", "hex_opcode": "VEX.128.66.0F38.W0 E0 /r", "length": "6+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | E0", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "Mem"}, {"name": "src1", "desc": "Reg"}, {"name": "src2", "desc": "Reg"}], "extension": "CMPccXADD", "description": "Atomically compares a value in memory with an operand and adds a second operand to memory if the condition is met. This instruction is part of the APX (Advanced Performance eXtensions) and operates under EVEX encoding with implicit condition code selection via the embedded immediate. The instruction performs a compare-and-add loop at the CPU microarchitecture level, setting ZF based on the comparison result and CF/OF/SF based on the add operation if executed.", "pseudocode": "temp ← [dest]; ZF ← (temp == src1); if (condition_met) { [dest] ← [dest] + src2; CF ← carry_from_add; OF ← overflow_from_add; SF ← sign_of_result; } src1 ← temp;", "example": "CMPccXADD [rbp-4], eax, eax"}
{"mnemonic": "erets", "architecture": "x86", "full_name": "Event Return Supervisor", "summary": "Returns from an event handler to supervisor mode (FRED).", "syntax": "ERETS", "encoding": {"format": "Legacy", "hex_opcode": "F2 0F 01 CA", "length": "4", "visual_parts": [], "binary_pattern": "F2 | 0F | 01 | CA", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [], "extension": "FRED", "description": "Returns from a FRED (Flexible Return and Event Delivery) event handler in supervisor mode, restoring the interrupted execution context from the event stack. This instruction is part of the FRED extension and performs implicit stack unwinding and privilege level restoration. No flags are modified; this is a serializing instruction that also flushes the instruction cache.", "pseudocode": "// Returns from an event handler to supervisor mode (FRED)", "example": "ERETS"}
{"mnemonic": "eretu", "architecture": "x86", "full_name": "Event Return User", "summary": "Returns from an event handler to user mode (FRED).", "syntax": "ERETU", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 01 CA", "length": "4", "visual_parts": [], "binary_pattern": "F3 | 0F | 01 | CA", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [], "extension": "FRED", "description": "Returns from a FRED (Flexible Return and Event Delivery) event handler to user mode, restoring the interrupted user-level execution context from the event stack. This instruction is part of the FRED extension and performs implicit stack unwinding with privilege level transition. No flags are modified; this is a serializing instruction that flushes the instruction cache and clears sensitive state.", "pseudocode": "// Returns from an event handler to user mode (FRED)", "example": "ERETU"}
{"mnemonic": "lkgs", "architecture": "x86", "full_name": "Load Kernel GS Base", "summary": "Loads the kernel GS base address (FRED support).", "syntax": "LKGS r16", "encoding": {"format": "Legacy", "hex_opcode": "F2 0F 00 /6", "length": "4+", "visual_parts": [], "binary_pattern": "F2 | 0F | 00 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "src", "desc": "Reg"}], "extension": "LKGS", "description": "Loads a 16-bit selector or handle into the kernel GS base register, supporting FRED event delivery. The instruction reads from the specified register and updates the MSR-backed kernel GS base, used for exception handler context. This is a privileged instruction (CPL = 0) and does not modify any flags.", "pseudocode": "IA32_KERNEL_GS_BASE ← src;", "example": "LKGS ax"}
{"mnemonic": "enqcmd", "architecture": "x86", "full_name": "Enqueue Command", "summary": "Writes a command to a device (DSA/IAA accelerator).", "syntax": "ENQCMD r32, m512", "encoding": {"format": "Legacy", "hex_opcode": "F2 0F 38 F8", "length": "5+", "visual_parts": [], "binary_pattern": "F2 | 0F | 38 | F8", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "Reg"}, {"name": "src", "desc": "Mem"}], "extension": "ENQCMD", "description": "Atomically enqueues a 512-bit command descriptor from memory to a device queue (DSA/IAA accelerator), writing a doorbell or status register via the destination register. The instruction performs an atomic write to the device, and ZF is set to indicate success or failure of the enqueue operation. This is a non-temporal memory operation and does not cache the 512-bit data.", "pseudocode": "// Writes a command to a device (DSA/IAA accelerator)", "example": "ENQCMD eax, [rbp-64]"}
{"mnemonic": "pconfig", "architecture": "x86", "full_name": "Platform Configuration", "summary": "Configures platform features like MKTME (Memory Encryption).", "syntax": "PCONFIG", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 01 C5", "length": "3", "visual_parts": [], "binary_pattern": "0F | 01 | C5", "bit_positions": "+0 | +1 | +2"}, "operands": [], "extension": "PCONFIG", "description": "Performs platform configuration operations such as MKTME (Memory Key Total Memory Encryption) setup, with the operation type specified implicitly via EAX. This is a privileged instruction (CPL = 0) that modifies platform encryption keys and memory encryption metadata. The instruction may serialize the pipeline and has implementation-dependent effects on cache coherency.", "pseudocode": "// Configures platform features like MKTME (Memory Encryption)", "example": "PCONFIG"}
{"mnemonic": "wbnoinvd", "architecture": "x86", "full_name": "Write Back and Do Not Invalidate Cache", "summary": "Writes back modified lines but keeps them valid in cache.", "syntax": "WBNOINVD", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 09", "length": "3", "visual_parts": [], "binary_pattern": "F3 | 0F | 09", "bit_positions": "+0 | +1 | +2"}, "operands": [], "extension": "WBNOINVD", "description": "Writes back all modified cache lines to memory but keeps them valid in the L3 cache, improving performance compared to WBINVD which invalidates. This instruction is non-privileged and does not modify any flags. It provides write-back semantics without the full cache flush, useful for cache coherency operations while maintaining data locality.", "pseudocode": "// Writes back modified lines but keeps them valid in cache", "example": "WBNOINVD"}
{"mnemonic": "aesencwide128kl", "architecture": "x86", "full_name": "AES Encrypt Wide 128-bit Key Locker", "summary": "Encrypts 8 blocks using 128-bit Key Locker handle.", "syntax": "AESENCWIDE128KL m128", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 D8 !(11):000:bbb", "length": "5+", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | D8", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "handle", "desc": "Mem"}], "extension": "KEYLOCKER_WIDE", "description": "Encrypts eight 128-bit blocks in parallel using a 128-bit Key Locker handle, performing wide-block AES encryption for high-throughput scenarios. The handle is loaded from memory and used to derive keys without exposing them, setting ZF to indicate success. This instruction operates on XMM0-XMM7 implicitly as input and output blocks, and clears sensitive key material after use.", "pseudocode": "handle ← [handle_mem]; if (valid_handle) { XMM0-XMM7 ← AES_ENC_WIDE_128(XMM0-XMM7, handle); ZF ← 0; } else { ZF ← 1; }", "example": "AESENCWIDE128KL [rbp-16]"}
{"mnemonic": "aesencwide256kl", "architecture": "x86", "full_name": "AES Encrypt Wide 256-bit Key Locker", "summary": "Encrypts 8 blocks using 256-bit Key Locker handle.", "syntax": "AESENCWIDE256KL m128", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 D8 !(11):010:bbb", "length": "5+", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | D8 | ModRM", "bit_positions": "+0 | +1 | +2 | +3 | +4"}, "operands": [{"name": "handle", "desc": "Mem"}], "extension": "KEYLOCKER_WIDE", "description": "Encrypts 8 consecutive 128-bit blocks using AES in ECB mode with a 256-bit key loaded from a Key Locker handle. This instruction is part of the Key Locker extension and requires the handle at the memory operand to be a valid, initialized 512-bit Key Locker structure. The instruction reads plaintext from XMM0-XMM7, encrypts all blocks in parallel, and writes ciphertext back to XMM0-XMM7; ZF is set to 0 on success or 1 if the handle is invalid or key usage limit exceeded.", "pseudocode": "handle ← [mem128]\nif (handle is invalid or usage_limit_exceeded) {\n  ZF ← 1\n} else {\n  for i = 0 to 7:\n    XMM[i] ← AES_Encrypt_256(XMM[i], key_from_handle)\n  ZF ← 0\n}", "example": "AESENCWIDE256KL [rbp-16]"}
{"mnemonic": "fucom", "architecture": "x86", "full_name": "Unordered Compare Real", "summary": "Compares ST(0) with source (supports NaNs).", "syntax": "FUCOM ST(i)", "encoding": {"format": "Legacy", "hex_opcode": "DD E0+i", "length": "2", "visual_parts": [], "binary_pattern": "DD", "bit_positions": "+0"}, "operands": [{"name": "src", "desc": "Reg"}], "extension": "x87 FPU", "description": "Compares the top of the x87 FPU stack (ST(0)) with an operand (ST(i) by default) and sets condition code bits in the FPU status word. Unlike FCOM, FUCOM treats QNaN operands as comparable rather than signaling. The C3, C2, and C0 bits are set based on the comparison result (unordered, greater than, less than, or equal), and C1 is cleared.", "pseudocode": "if (is_unordered(ST(0), ST(i))) {\n  C3 ← 1; C2 ← 1; C0 ← 1\n} else if (ST(0) > ST(i)) {\n  C3 ← 0; C2 ← 0; C0 ← 0\n} else if (ST(0) < ST(i)) {\n  C3 ← 0; C2 ← 0; C0 ← 1\n} else {\n  C3 ← 1; C2 ← 0; C0 ← 0\n}\nC1 ← 0", "example": "FUCOM st(1)"}
{"mnemonic": "frndint", "architecture": "x86", "full_name": "Round to Integer", "summary": "Rounds ST(0) to integer according to RC field.", "syntax": "FRNDINT", "encoding": {"format": "Legacy", "hex_opcode": "D9 FC", "length": "2", "visual_parts": [], "binary_pattern": "D9 | FC", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Rounds the value in ST(0) to an integer according to the rounding control (RC) field in the FPU control word (bits 10-11). The result remains in ST(0) as a floating-point number with zero fractional part. This instruction does not pop the stack and does not set exception flags.", "pseudocode": "ST(0) ← round_to_integer(ST(0), RC_field)", "example": "FRNDINT"}
{"mnemonic": "fscale", "architecture": "x86", "full_name": "Scale", "summary": "Scales ST(0) by ST(1) (ST(0) * 2^ST(1)).", "syntax": "FSCALE", "encoding": {"format": "Legacy", "hex_opcode": "D9 FD", "length": "2", "visual_parts": [], "binary_pattern": "D9 | FD", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Scales ST(0) by raising 2 to the power of ST(1): ST(0) ← ST(0) × 2^ST(1). ST(1) must be an integer within the range [-2^31, 2^31-1]; if out of range or NaN, an invalid-operation exception is generated. The stack is not popped; ST(0) is replaced with the scaled result.", "pseudocode": "if (ST(1) is not integer or out_of_range) {\n  raise_exception(invalid_operation)\n} else {\n  ST(0) ← ST(0) * (2 ^ trunc(ST(1)))\n}", "example": "FSCALE"}
{"mnemonic": "fxtract", "architecture": "x86", "full_name": "Extract Exponent and Significand", "summary": "Separates exponent and significand of ST(0).", "syntax": "FXTRACT", "encoding": {"format": "Legacy", "hex_opcode": "D9 F4", "length": "2", "visual_parts": [], "binary_pattern": "D9 | F4", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Separates ST(0) into its exponent (as an integer) and significand (as a number in [1, 2) or [0, ∞) for special values). The exponent is pushed onto the stack, and ST(0) is replaced with the significand, so the original value can be recovered as significand × 2^exponent. This operation logically duplicates and replaces ST(0), increasing stack depth.", "pseudocode": "exponent ← extract_exponent(ST(0))\nsignificand ← extract_significand(ST(0))\nFPU_stack_push(exponent)\nST(0) ← significand", "example": "FXTRACT"}
{"mnemonic": "f2xm1", "architecture": "x86", "full_name": "Compute 2^x - 1", "summary": "Computes (2^ST(0)) - 1.", "syntax": "F2XM1", "encoding": {"format": "Legacy", "hex_opcode": "D9 F0", "length": "2", "visual_parts": [], "binary_pattern": "D9 | F0", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Computes 2^ST(0) - 1 and stores the result back in ST(0). ST(0) must be in the range [-1, 1] for accurate results; values outside this range produce undefined behavior or reduced accuracy. This instruction is used as part of logarithm and exponential function approximations in transcendental math libraries.", "pseudocode": "if (ST(0) < -1 or ST(0) > 1) {\n  undefined_behavior()\n} else {\n  ST(0) ← (2 ^ ST(0)) - 1\n}", "example": "F2XM1"}
{"mnemonic": "fyl2xp1", "architecture": "x86", "full_name": "Compute y * log2(x + 1)", "summary": "Computes ST(1) * log2(ST(0) + 1).", "syntax": "FYL2XP1", "encoding": {"format": "Legacy", "hex_opcode": "D9 F9", "length": "2", "visual_parts": [], "binary_pattern": "D9 | F9", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Computes ST(1) × log₂(ST(0) + 1) and stores the result in ST(1), then pops ST(0). ST(0) must be in the range (-1, 1) for full accuracy. This instruction is optimized for computing logarithms of numbers close to 1 and is used in transcendental function implementations to reduce rounding error.", "pseudocode": "if (ST(0) <= -1 or ST(0) >= 1) {\n  undefined_behavior()\n} else {\n  result ← ST(1) * log2(ST(0) + 1)\n  FPU_stack_pop()\n  ST(0) ← result\n}", "example": "FYL2XP1"}
{"mnemonic": "clrssbsy", "architecture": "x86", "full_name": "Clear Shadow Stack Busy Flag", "summary": "Clears the busy flag in the shadow stack token.", "syntax": "CLRSSBSY m64", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F AE !(11):110:bbb", "length": "4+", "visual_parts": [], "binary_pattern": "F3 | 0F | AE | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "token", "desc": "Mem"}], "extension": "CET-SS", "description": "Clears the busy flag (bit 0) of a shadow stack token located at the memory address specified by the operand. This instruction is part of Control-flow Enforcement Technology (CET) Shadow Stack and is used to mark a shadow stack token as no longer busy (e.g., after an exception handler has completed). ZF is set to 0 on success or 1 if the token address is misaligned or the token is invalid.", "pseudocode": "token_addr ← m64\nif (token_addr is misaligned or not_valid_token) {\n  ZF ← 1\n} else {\n  [token_addr] ← [token_addr] & ~(1)  // Clear bit 0\n  ZF ← 0\n}", "example": "CLRSSBSY [rbp-8]"}
{"mnemonic": "tdpfp16ps", "architecture": "x86", "full_name": "Tile Dot Product FP16 Packed Single", "summary": "Matrix multiply (FP16 * FP16) accumulating to Float32.", "syntax": "TDPFP16PS tmm1, tmm2, tmm3", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.F2.0F38.W0 5C 11:rrr:bbb", "length": "6+", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "operands": [{"name": "dest", "desc": "TMM"}, {"name": "src1", "desc": "TMM"}, {"name": "src2", "desc": "TMM"}], "extension": "AMX-FP16", "description": "Performs a tile matrix multiply-accumulate operation where two FP16 matrices (tmm2 and tmm3) are multiplied element-wise and accumulated into tmm1 as FP32 results. This is a specialized AMX instruction that leverages tile registers for high-throughput matrix operations. No standard CPU flags are affected; results that overflow to infinity or underflow to zero follow IEEE 754 semantics.", "pseudocode": "tmm1 ← tmm1 + (tmm2 * tmm3)  // FP16 × FP16 → FP32 accumulation, per tile dimensions", "example": "TDPFP16PS tmm1, tmm2, tmm3"}
{"mnemonic": "movss", "architecture": "x86", "full_name": "Move Scalar Single-Precision", "summary": "Moves a single float (low 32 bits) between XMM/Memory.", "syntax": "MOVSS xmm1, xmm2/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 10", "visual_parts": [], "binary_pattern": "F3 | 0F | 10", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Moves a scalar single-precision (32-bit) floating-point value from the source to the low 32 bits of the destination XMM register. The upper 96 bits of the destination XMM register are preserved. No CPU flags are modified. This instruction operates in 32-bit mode or higher.", "pseudocode": "dest[31:0] ← src[31:0]\n// dest[127:32] unchanged", "example": "MOVSS xmm1, xmm2/m32"}
{"mnemonic": "movsd", "architecture": "x86", "full_name": "Move Scalar Double-Precision", "summary": "Moves a single double (low 64 bits) between XMM/Memory.", "syntax": "MOVSD xmm1, xmm2/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 10", "visual_parts": [], "binary_pattern": "F2 | 0F | 10", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Moves a scalar double-precision (64-bit) floating-point value from the source to the low 64 bits of the destination XMM register. The upper 64 bits of the destination XMM register are preserved. No CPU flags are modified. This instruction operates in 32-bit mode or higher.", "pseudocode": "dest[63:0] ← src[63:0]\n// dest[127:64] unchanged", "example": "MOVSD xmm1, xmm2/m64"}
{"mnemonic": "cvtdq2pd", "architecture": "x86", "full_name": "Convert Packed Doubleword to Packed Double-Precision", "summary": "Converts two 32-bit integers to two 64-bit doubles.", "syntax": "CVTDQ2PD xmm1, xmm2/m64", "encoding": {"format": "SSE2", "hex_opcode": "F3 0F E6", "visual_parts": [], "binary_pattern": "F3 | 0F | E6", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Converts the lower two 32-bit signed doublewords from the source to two 64-bit IEEE 754 double-precision floating-point values in the destination XMM register. The conversion is exact (no rounding error for representable integers). No CPU flags are modified. Operates in 32-bit mode or higher with SSE2 support.", "pseudocode": "dest[63:0] ← CVTF64(src[31:0])   // lower 32-bit int to double\ndest[127:64] ← CVTF64(src[63:32])  // upper 32-bit int to double", "example": "CVTDQ2PD xmm1, xmm2/m64"}
{"mnemonic": "cvtpd2dq", "architecture": "x86", "full_name": "Convert Packed Double-Precision to Packed Doubleword", "summary": "Converts two doubles to two 32-bit integers (Rounded).", "syntax": "CVTPD2DQ xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F E6", "visual_parts": [], "binary_pattern": "F2 | 0F | E6", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Converts two 64-bit double-precision floating-point values from the source to two 32-bit signed doublewords in the destination XMM register, using the rounding mode specified by MXCSR. Overflow results are saturated to 0x80000000 (INT32_MIN) or 0x7FFFFFFF (INT32_MAX); invalid/NaN inputs produce 0x80000000. The upper 64 bits of the destination are zeroed. No CPU flags are modified.", "pseudocode": "rounding_mode ← MXCSR[13:11]\ndest[31:0] ← CVTI32(src[63:0], rounding_mode)   // lower double to 32-bit int\ndest[63:32] ← CVTI32(src[127:64], rounding_mode) // upper double to 32-bit int\ndest[127:64] ← 0", "example": "CVTPD2DQ xmm1, xmm2/m128"}
{"mnemonic": "cvttpd2dq", "architecture": "x86", "full_name": "Convert with Truncation Packed Double to Packed Doubleword", "summary": "Converts two doubles to two 32-bit integers (Truncated).", "syntax": "CVTTPD2DQ xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F E6", "visual_parts": [], "binary_pattern": "66 | 0F | E6", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Converts two 64-bit double-precision floating-point values from the source to two 32-bit signed doublewords in the destination XMM register, always using truncation (rounding towards zero), ignoring MXCSR. Overflow results are saturated to 0x80000000 (INT32_MIN) or 0x7FFFFFFF (INT32_MAX); invalid/NaN inputs produce 0x80000000. The upper 64 bits of the destination are zeroed. No CPU flags are modified.", "pseudocode": "dest[31:0] ← CVTI32_TRUNC(src[63:0])   // lower double to 32-bit int (truncate)\ndest[63:32] ← CVTI32_TRUNC(src[127:64]) // upper double to 32-bit int (truncate)\ndest[127:64] ← 0", "example": "CVTTPD2DQ xmm1, xmm2/m128"}
{"mnemonic": "cvtss2si", "architecture": "x86", "full_name": "Convert Scalar Single to Integer", "summary": "Converts low float to integer (Rounded according to MXCSR).", "syntax": "CVTSS2SI r32, xmm/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 2D", "visual_parts": [], "binary_pattern": "F3 | 0F | 2D", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "xmm/m32", "desc": "128-bit XMM register or 32-bit memory"}], "description": "Converts the low 32-bit single-precision floating-point value from the source to a 32-bit signed integer in the destination general-purpose register, using the rounding mode specified by MXCSR. Overflow and invalid/NaN inputs produce 0x80000000 (INT32_MIN). In 64-bit mode, the destination register is zero-extended to 64 bits. No CPU flags are modified.", "pseudocode": "rounding_mode ← MXCSR[13:11]\ndest[31:0] ← CVTI32(src[31:0], rounding_mode)\n// In 64-bit mode: dest[63:32] ← 0", "example": "CVTSS2SI eax, xmm1"}
{"mnemonic": "cvtsd2si", "architecture": "x86", "full_name": "Convert Scalar Double to Integer", "summary": "Converts low double to integer (Rounded according to MXCSR).", "syntax": "CVTSD2SI r32, xmm/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 2D", "visual_parts": [], "binary_pattern": "F2 | 0F | 2D", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "xmm/m64", "desc": "128-bit XMM register or 64-bit memory"}], "description": "Converts the low 64-bit double-precision floating-point value from the source to a 32-bit signed integer in the destination general-purpose register, using the rounding mode specified by MXCSR. Overflow and invalid/NaN inputs produce 0x80000000 (INT32_MIN). In 64-bit mode, the destination register is zero-extended to 64 bits. No CPU flags are modified.", "pseudocode": "rounding_mode ← MXCSR[13:11]\ndest[31:0] ← CVTI32(src[63:0], rounding_mode)\n// In 64-bit mode: dest[63:32] ← 0", "example": "CVTSD2SI eax, xmm1"}
{"mnemonic": "vcvtph2ps", "architecture": "x86", "full_name": "Convert 16-bit FP to 32-bit FP", "summary": "Converts half-precision floats to single-precision.", "syntax": "VCVTPH2PS xmm1, xmm2/m64", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.66.0F38.W0 13 /r", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 13", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "F16C", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Converts four 16-bit half-precision floating-point values to four 32-bit single-precision floating-point values. The source contains up to four FP16 values packed in the lower 64 bits; the destination receives four FP32 results in a 128-bit XMM register. No flags are modified; this is a data conversion instruction.", "pseudocode": "dest[127:0] ← CONVERT_FP16_TO_FP32(src[63:0]); // upper 64 bits of dest are zeroed", "example": "VCVTPH2PS xmm1, xmm2/m64"}
{"mnemonic": "vcvtps2ph", "architecture": "x86", "full_name": "Convert 32-bit FP to 16-bit FP", "summary": "Converts single-precision floats to half-precision.", "syntax": "VCVTPS2PH xmm1/m64, xmm2, imm8", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.66.0F3A.W0 1D /r ib", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 1D", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "F16C", "operands": [{"name": "dest", "type": "xmm1/m64", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Converts four 32-bit single-precision floating-point values to four 16-bit half-precision floating-point values using a rounding mode specified by imm8[2:0]. Results are packed into the lower 64 bits of the destination (register or memory); the upper 64 bits are cleared if destination is XMM. No flags are modified.", "pseudocode": "rounding_mode ← imm8[2:0]; dest[63:0] ← CONVERT_FP32_TO_FP16(src1[127:0], rounding_mode); dest[127:64] ← 0;", "example": "VCVTPS2PH xmm1/m64, xmm2, 3"}
{"mnemonic": "vtestps", "architecture": "x86", "full_name": "Packed Bit Test Single-Precision", "summary": "Sets ZF/CF based on sign bit comparisons of floats.", "syntax": "VTESTPS xmm1, xmm2/m128", "encoding": {"format": "AVX", "hex_opcode": "VEX.128.66.0F38.W0 0E /r", "visual_parts": [], "binary_pattern": "VEX | 66 | 0F | 38 | 0E", "bit_positions": "+0 | +3 | +4 | +5 | +6"}, "extension": "AVX", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs a bitwise AND of two packed single-precision float vectors and sets ZF based on whether all result bits are zero, and CF based on whether all sign bits are set. No other flags are modified; OF, SF, AF, PF are undefined after execution.", "pseudocode": "temp ← dest[127:0] AND src[127:0]; ZF ← (temp == 0); CF ← ((dest[127] AND src[127]) AND (dest[95] AND src[95]) AND (dest[63] AND src[63]) AND (dest[31] AND src[31]));", "example": "VTESTPS xmm1, xmm2/m128"}
{"mnemonic": "vtestpd", "architecture": "x86", "full_name": "Packed Bit Test Double-Precision", "summary": "Sets ZF/CF based on sign bit comparisons of doubles.", "syntax": "VTESTPD xmm1, xmm2/m128", "encoding": {"format": "AVX", "hex_opcode": "VEX.128.66.0F38.W0 0F /r", "visual_parts": [], "binary_pattern": "VEX | 66 | 0F | 38 | 0F", "bit_positions": "+0 | +3 | +4 | +5 | +6"}, "extension": "AVX", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs a bitwise AND of two packed double-precision float vectors and sets ZF based on whether all result bits are zero, and CF based on whether both sign bits are set. No other flags are modified; OF, SF, AF, PF are undefined after execution.", "pseudocode": "temp ← dest[127:0] AND src[127:0]; ZF ← (temp == 0); CF ← ((dest[127] AND src[127]) AND (dest[63] AND src[63]));", "example": "VTESTPD xmm1, xmm2/m128"}
{"mnemonic": "vperm2f128", "architecture": "x86", "full_name": "Permute Floating-Point 128-bit Blocks", "summary": "Shuffles 128-bit float lanes between YMM registers.", "syntax": "VPERM2F128 ymm1, ymm2, ymm3/m256, imm8", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F3A.W0 06 /r ib", "visual_parts": [], "binary_pattern": "VEX | 66 | 0F | 3A | 06", "bit_positions": "+0 | +3 | +4 | +5 | +6"}, "extension": "AVX", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rearranges two 128-bit blocks from two 256-bit YMM operands into the destination 256-bit YMM register according to an 8-bit immediate selector. Bits [3:0] select which 128-bit half goes to the low 128 bits, bits [7:4] select the high 128 bits; bit 3 can zero-out the selected half. No flags are modified.", "pseudocode": "imm8 ← src3; x ← imm8[3:0]; y ← imm8[7:4]; if (imm8[3]) { dest[127:0] ← 0; } else { dest[127:0] ← (x[2:0]==0) ? src1[127:0] : (x[2:0]==1) ? src1[255:128] : (x[2:0]==2) ? src2[127:0] : src2[255:128]; } if (imm8[7]) { dest[255:128] ← 0; } else { dest[255:128] ← (y[2:0]==0) ? src1[127:0] : (y[2:0]==1) ? src1[255:128] : (y[2:0]==2) ? src2[127:0] : src2[255:128]; }", "example": "VPERM2F128 ymm1, ymm2, ymm3/m256, 3"}
{"mnemonic": "prefetcht1", "architecture": "x86", "full_name": "Prefetch Data to L2 Cache", "summary": "Hints to fetch data to L2 and L3 caches.", "syntax": "PREFETCHT1 m8", "encoding": {"format": "SSE", "hex_opcode": "0F 18 /2", "visual_parts": [], "binary_pattern": "0F | 18 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "m8", "desc": "8-bit memory operand"}], "description": "Non-binding hint to the memory system to fetch the byte at the given address into the L2 and L3 caches. The instruction is a no-op to program semantics; it has no effect on registers, flags, or memory, and serves only as a performance hint to reduce cache misses.", "pseudocode": "// Hints to fetch data to L2 and L3 caches", "example": "PREFETCHT1 [rbp-1]"}
{"mnemonic": "prefetcht2", "architecture": "x86", "full_name": "Prefetch Data to L3 Cache", "summary": "Hints to fetch data to L3 cache only.", "syntax": "PREFETCHT2 m8", "encoding": {"format": "SSE", "hex_opcode": "0F 18 /3", "visual_parts": [], "binary_pattern": "0F | 18 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "m8", "desc": "8-bit memory operand"}], "description": "Non-binding hint to the memory system to fetch the byte at the given address into the L3 cache. The instruction is a no-op to program semantics; it has no effect on registers, flags, or memory, and serves only as a performance hint.", "pseudocode": "// Hints to fetch data to L3 cache only", "example": "PREFETCHT2 [rbp-1]"}
{"mnemonic": "movsxd", "architecture": "x86", "full_name": "Move with Sign-Extension Doubleword", "summary": "Sign-extends 32-bit register to 64-bit.", "syntax": "MOVSXD r64, r/m32", "encoding": {"format": "Base (64-bit)", "hex_opcode": "63", "visual_parts": [], "binary_pattern": "63", "bit_positions": "+0"}, "extension": "Base (64-bit)", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Sign-extends a 32-bit value from a register or memory location to a 64-bit value and stores it in a 64-bit destination register. Only valid in 64-bit mode; the upper 32 bits of the destination are filled with sign-extended copies of bit 31 of the source. No flags are modified.", "pseudocode": "dest[63:0] ← SIGN_EXTEND_32_TO_64(src[31:0]);", "example": "MOVSXD rax, ebx"}
{"mnemonic": "int1", "architecture": "x86", "full_name": "ICE Breakpoint", "summary": "Single byte opcode (0xF1) used for In-Circuit Emulation.", "syntax": "INT1", "encoding": {"format": "Legacy", "hex_opcode": "F1", "visual_parts": [], "binary_pattern": "F1", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Raises a single-byte breakpoint exception (SIMD debugger breakpoint) with opcode 0xF1, used primarily for In-Circuit Emulation (ICE) debugging. This instruction generates an INT 1 exception (vector 1) immediately without privilege level change. The instruction does not set or clear EFLAGS; it is a synchronous trap that suspends execution and invokes the debugger.", "pseudocode": "push_to_stack(EIP + 1);\npush_to_stack(EFLAGS);\njump_to_IDT_entry(1);", "example": "INT1"}
{"mnemonic": "vpcmov", "architecture": "x86", "full_name": "Vector Packed Conditional Move", "summary": "Bitwise conditional move based on selector.", "syntax": "VPCMOV xmm1, xmm2, xmm3, xmm4", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.08.W0 A2 /r ib", "visual_parts": [], "binary_pattern": "08 | A2", "bit_positions": "+0 | +1"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3", "desc": "128-bit XMM SIMD register"}, {"name": "src3", "type": "xmm4", "desc": "128-bit XMM SIMD register"}], "description": "Performs bitwise conditional move on packed 128-bit XMM data using a selector register. For each bit in the selector (xmm4), if the bit is set (1), the corresponding bit from xmm3 is selected; otherwise, the bit from xmm2 is selected. Result is stored in xmm1. No flags are modified.", "pseudocode": "for i in 0 to 127:\n  if (xmm4[i] == 1):\n    xmm1[i] ← xmm3[i]\n  else:\n    xmm1[i] ← xmm2[i]", "example": "VPCMOV xmm1, xmm2, xmm3, xmm4"}
{"mnemonic": "vpcomb", "architecture": "x86", "full_name": "Vector Packed Compare Byte", "summary": "Compares bytes using immediate condition.", "syntax": "VPCOMB xmm1, xmm2, xmm3/m128, imm8", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.08.W0 CC /r ib", "visual_parts": [], "binary_pattern": "08 | CC", "bit_positions": "+0 | +1"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Compares 16 packed bytes in xmm2 and xmm3/m128 using the condition specified in imm8, storing comparison results (all-1s or all-0s per byte) in xmm1. Supports eight comparison predicates (EQ, LT, LE, etc.). No EFLAGS are modified; results are encoded as packed byte masks.", "pseudocode": "for i in 0 to 15:\n  byte_a ← xmm2[i*8 : i*8+7]\n  byte_b ← xmm3[i*8 : i*8+7]\n  result ← evaluate_condition(byte_a, byte_b, imm8)\n  xmm1[i*8 : i*8+7] ← result ? 0xFF : 0x00", "example": "VPCOMB xmm1, xmm2, xmm3/m128, 3"}
{"mnemonic": "blcfill", "architecture": "x86", "full_name": "Fill From Lowest Clear Bit", "summary": "Sets all bits below the lowest clear bit (x & (x+1)).", "syntax": "BLCFILL r32, r/m32", "encoding": {"format": "TBM", "hex_opcode": "XOP.L0.09.W0 01 /1", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "TBM", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Fills all bits from the lowest clear bit position downward; computes (src & (src+1)) and stores the result in dest. This sets all bits below and including the position of the lowest 0-bit in the source. No flags are modified by this TBM instruction.", "pseudocode": "result ← src & (src + 1)\ndest ← result", "example": "BLCFILL eax, ebx"}
{"mnemonic": "vgetexpss", "architecture": "x86", "full_name": "Get Exponent Scalar Single", "summary": "Extracts exponent from low float.", "syntax": "VGETEXPSS xmm1 {k1}, xmm2, xmm3/m32", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.66.0F38.W0 43 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 43", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Extracts the biased exponent from the low 32-bit single-precision floating-point element of xmm3/m32 and stores the result as a float in xmm1. The exponent is converted to a normalized floating-point representation. Supports EVEX masking and rounding modes; other three 32-bit elements in xmm1 are preserved from xmm2.", "pseudocode": "float32 src_val ← xmm3[0:31]\nint32 exponent ← extract_biased_exponent(src_val)\nxmm1[0:31] ← convert_exponent_to_float(exponent)\nxmm1[32:127] ← xmm2[32:127]", "example": "VGETEXPSS xmm1, xmm2, xmm3/m32"}
{"mnemonic": "vgetmantsd", "architecture": "x86", "full_name": "Get Mantissa Scalar Double", "summary": "Extracts mantissa from low double.", "syntax": "VGETMANTSD xmm1 {k1}, xmm2, xmm3/m64, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.66.0F3A.W1 27 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 27", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m64", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Extracts the mantissa (significand) from the low 64-bit double-precision floating-point element of xmm3/m64 using the normalization mode in imm8, storing the result as a double in xmm1. Supports EVEX masking and rounding modes; the high 64 bits of xmm1 are preserved from xmm2.", "pseudocode": "float64 src_val ← xmm3[0:63]\nint8 mode ← imm8\nfloat64 mantissa ← extract_mantissa(src_val, mode)\nxmm1[0:63] ← mantissa\nxmm1[64:127] ← xmm2[64:127]", "example": "VGETMANTSD xmm1, xmm2, xmm3/m64, 3"}
{"mnemonic": "movq", "architecture": "x86", "full_name": "Move Quadword (MMX)", "summary": "Moves 64-bit data between MMX registers/memory.", "syntax": "MOVQ mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F 6F /r", "visual_parts": [], "binary_pattern": "0F | 6F", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Moves a 64-bit quadword from an MMX register or memory location to an MMX register. This instruction clears the upper 64 bits of the 128-bit XMM register if used with XMM operands (SSE variant). No flags are modified.", "pseudocode": "dest ← src", "example": "MOVQ mm, mm/m64"}
{"mnemonic": "paddusb", "architecture": "x86", "full_name": "Packed Add Unsigned Saturate Byte (MMX)", "summary": "Adds 8 unsigned bytes with saturation (MMX).", "syntax": "PADDUSB mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F DC /r1", "visual_parts": [], "binary_pattern": "0F | DC", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Adds 8 pairs of packed unsigned 8-bit integers from the MMX register and memory/register source with saturation. If the sum exceeds 255, the result is saturated to 255. No flags are modified; the 64-bit result is stored in the destination MMX register.", "pseudocode": "for i in 0 to 7:\n  byte_a ← dest[i*8 : i*8+7]\n  byte_b ← src[i*8 : i*8+7]\n  sum ← byte_a + byte_b\n  dest[i*8 : i*8+7] ← min(sum, 255)", "example": "PADDUSB mm, mm/m64"}
{"mnemonic": "paddsb", "architecture": "x86", "full_name": "Packed Add Signed Saturate Byte (MMX)", "summary": "Adds 8 signed bytes with saturation (MMX).", "syntax": "PADDSB mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F EC /r1", "visual_parts": [], "binary_pattern": "0F | EC", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Adds 8 signed byte pairs in parallel with saturation; if the result overflows (exceeds 127) or underflows (below -128), the result saturates to 127 or -128 respectively. This MMX instruction does not modify any EFLAGS; it operates entirely within the 64-bit MMX register or memory operand.", "pseudocode": "for i = 0 to 7:\n  temp ← (signed8)dest[i*8+7:i*8] + (signed8)src[i*8+7:i*8]\n  if temp > 127:\n    dest[i*8+7:i*8] ← 127\n  else if temp < -128:\n    dest[i*8+7:i*8] ← -128\n  else:\n    dest[i*8+7:i*8] ← temp", "example": "PADDSB mm, mm/m64"}
{"mnemonic": "paddusw", "architecture": "x86", "full_name": "Packed Add Unsigned Saturate Word (MMX)", "summary": "Adds 4 unsigned words with saturation (MMX).", "syntax": "PADDUSW mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F DD /r1", "visual_parts": [], "binary_pattern": "0F | DD", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Adds 4 unsigned word pairs in parallel with saturation; overflow is clamped to 65535 (0xFFFF). This MMX instruction does not modify any EFLAGS and operates entirely within the 64-bit MMX register or memory operand.", "pseudocode": "for i = 0 to 3:\n  temp ← (unsigned16)dest[i*16+15:i*16] + (unsigned16)src[i*16+15:i*16]\n  if temp > 65535:\n    dest[i*16+15:i*16] ← 65535\n  else:\n    dest[i*16+15:i*16] ← temp", "example": "PADDUSW mm, mm/m64"}
{"mnemonic": "paddsw", "architecture": "x86", "full_name": "Packed Add Signed Saturate Word (MMX)", "summary": "Adds 4 signed words with saturation (MMX).", "syntax": "PADDSW mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F ED /r1", "visual_parts": [], "binary_pattern": "0F | ED", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Adds 4 signed word pairs in parallel with saturation; overflow saturates to 32767 and underflow to -32768. This MMX instruction does not modify any EFLAGS and operates entirely within the 64-bit MMX register or memory operand.", "pseudocode": "for i = 0 to 3:\n  temp ← (signed16)dest[i*16+15:i*16] + (signed16)src[i*16+15:i*16]\n  if temp > 32767:\n    dest[i*16+15:i*16] ← 32767\n  else if temp < -32768:\n    dest[i*16+15:i*16] ← -32768\n  else:\n    dest[i*16+15:i*16] ← temp", "example": "PADDSW mm, mm/m64"}
{"mnemonic": "psubusb", "architecture": "x86", "full_name": "Packed Subtract Unsigned Saturate Byte (MMX)", "summary": "Subtracts 8 unsigned bytes with saturation (MMX).", "syntax": "PSUBUSB mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F D8 /r1", "visual_parts": [], "binary_pattern": "0F | D8", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Subtracts 8 unsigned byte pairs in parallel with saturation; underflow is clamped to 0. This MMX instruction does not modify any EFLAGS and operates entirely within the 64-bit MMX register or memory operand.", "pseudocode": "for i = 0 to 7:\n  if (unsigned8)dest[i*8+7:i*8] < (unsigned8)src[i*8+7:i*8]:\n    dest[i*8+7:i*8] ← 0\n  else:\n    dest[i*8+7:i*8] ← (unsigned8)dest[i*8+7:i*8] - (unsigned8)src[i*8+7:i*8]", "example": "PSUBUSB mm, mm/m64"}
{"mnemonic": "psubsb", "architecture": "x86", "full_name": "Packed Subtract Signed Saturate Byte (MMX)", "summary": "Subtracts 8 signed bytes with saturation (MMX).", "syntax": "PSUBSB mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F E8 /r1", "visual_parts": [], "binary_pattern": "0F | E8", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Subtracts 8 signed byte pairs in parallel with saturation; underflow saturates to -128 and overflow to 127. This MMX instruction does not modify any EFLAGS and operates entirely within the 64-bit MMX register or memory operand.", "pseudocode": "for i = 0 to 7:\n  temp ← (signed8)dest[i*8+7:i*8] - (signed8)src[i*8+7:i*8]\n  if temp > 127:\n    dest[i*8+7:i*8] ← 127\n  else if temp < -128:\n    dest[i*8+7:i*8] ← -128\n  else:\n    dest[i*8+7:i*8] ← temp", "example": "PSUBSB mm, mm/m64"}
{"mnemonic": "psubusw", "architecture": "x86", "full_name": "Packed Subtract Unsigned Saturate Word (MMX)", "summary": "Subtracts 4 unsigned words with saturation (MMX).", "syntax": "PSUBUSW mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F D9 /r1", "visual_parts": [], "binary_pattern": "0F | D9", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Subtracts 4 unsigned word pairs in parallel with saturation; underflow is clamped to 0. This MMX instruction does not modify any EFLAGS and operates entirely within the 64-bit MMX register or memory operand.", "pseudocode": "for i = 0 to 3:\n  if (unsigned16)dest[i*16+15:i*16] < (unsigned16)src[i*16+15:i*16]:\n    dest[i*16+15:i*16] ← 0\n  else:\n    dest[i*16+15:i*16] ← (unsigned16)dest[i*16+15:i*16] - (unsigned16)src[i*16+15:i*16]", "example": "PSUBUSW mm, mm/m64"}
{"mnemonic": "psubsw", "architecture": "x86", "full_name": "Packed Subtract Signed Saturate Word (MMX)", "summary": "Subtracts 4 signed words with saturation (MMX).", "syntax": "PSUBSW mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F E9 /r1", "visual_parts": [], "binary_pattern": "0F | E9", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Subtracts 4 signed word pairs in parallel with saturation; underflow saturates to -32768 and overflow to 32767. This MMX instruction does not modify any EFLAGS and operates entirely within the 64-bit MMX register or memory operand.", "pseudocode": "for i = 0 to 3:\n  temp ← (signed16)dest[i*16+15:i*16] - (signed16)src[i*16+15:i*16]\n  if temp > 32767:\n    dest[i*16+15:i*16] ← 32767\n  else if temp < -32768:\n    dest[i*16+15:i*16] ← -32768\n  else:\n    dest[i*16+15:i*16] ← temp", "example": "PSUBSW mm, mm/m64"}
{"mnemonic": "pmullw", "architecture": "x86", "full_name": "Packed Multiply Low Word (MMX)", "summary": "Multiplies 4 words and stores low 16 bits (MMX).", "syntax": "PMULLW mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F D5 /r1", "visual_parts": [], "binary_pattern": "0F | D5", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Multiplies 4 word pairs in parallel and stores the low 16 bits of each product; the high 16 bits are discarded. This MMX instruction does not modify any EFLAGS and operates entirely within the 64-bit MMX register or memory operand.", "pseudocode": "for i = 0 to 3:\n  product ← (signed16)dest[i*16+15:i*16] × (signed16)src[i*16+15:i*16]\n  dest[i*16+15:i*16] ← product[15:0]", "example": "PMULLW mm, mm/m64"}
{"mnemonic": "pmulhw", "architecture": "x86", "full_name": "Packed Multiply High Word (MMX)", "summary": "Multiplies 4 signed words and stores high 16 bits (MMX).", "syntax": "PMULHW mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F E5 /r1", "visual_parts": [], "binary_pattern": "0F | E5", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Multiplies four signed 16-bit words in the destination MMX register by four signed 16-bit words in the source operand, and stores the high 16 bits of each 32-bit product in the destination register. This instruction operates on packed 16-bit signed integers and does not affect any flags. It requires MMX support and is commonly used in multimedia and DSP applications.", "pseudocode": "dest[0:15] ← ((INT32(dest[0:15]) * INT32(src[0:15])) >> 16)[0:15];\ndest[16:31] ← ((INT32(dest[16:31]) * INT32(src[16:31])) >> 16)[0:15];\ndest[32:47] ← ((INT32(dest[32:47]) * INT32(src[32:47])) >> 16)[0:15];\ndest[48:63] ← ((INT32(dest[48:63]) * INT32(src[48:63])) >> 16)[0:15];", "example": "PMULHW mm, mm/m64"}
{"mnemonic": "pmaddwd", "architecture": "x86", "full_name": "Packed Multiply Add Word to Doubleword (MMX)", "summary": "Multiplies words and adds adjacent pairs (MMX).", "syntax": "PMADDWD mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F F5 /r1", "visual_parts": [], "binary_pattern": "0F | F5", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Multiplies four pairs of signed 16-bit words, then adds the high and low results of adjacent pairs to produce two signed 32-bit doublewords. The destination MMX register receives the two packed 32-bit sums. This instruction does not affect any flags and is frequently used in audio/video processing and convolution operations.", "pseudocode": "prod[0] ← INT32(dest[0:15]) * INT32(src[0:15]);\nprod[1] ← INT32(dest[16:31]) * INT32(src[16:31]);\nprod[2] ← INT32(dest[32:47]) * INT32(src[32:47]);\nprod[3] ← INT32(dest[48:63]) * INT32(src[48:63]);\ndest[0:31] ← prod[0] + prod[1];\ndest[32:63] ← prod[2] + prod[3];", "example": "PMADDWD mm, mm/m64"}
{"mnemonic": "pand", "architecture": "x86", "full_name": "Packed Logical AND (MMX)", "summary": "Bitwise AND of 64-bit MMX registers.", "syntax": "PAND mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F DB /r1", "visual_parts": [], "binary_pattern": "0F | DB", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Performs a bitwise AND of the 64-bit destination MMX register and a 64-bit source operand, storing the result in the destination. All 64 bits are treated as a single operand; no flag bits are affected. This instruction has no size variants and is available in all processors with MMX support.", "pseudocode": "dest[0:63] ← dest[0:63] & src[0:63];", "example": "PAND mm, mm/m64"}
{"mnemonic": "por", "architecture": "x86", "full_name": "Packed Logical OR (MMX)", "summary": "Bitwise OR of 64-bit MMX registers.", "syntax": "POR mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F EB /r1", "visual_parts": [], "binary_pattern": "0F | EB", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Performs a bitwise OR of the 64-bit destination MMX register and a 64-bit source operand, storing the result in the destination. All 64 bits participate in the operation as a single unit; no flags are affected. This instruction is available on all MMX-capable processors and has no size variants.", "pseudocode": "dest[0:63] ← dest[0:63] | src[0:63];", "example": "POR mm, mm/m64"}
{"mnemonic": "pxor", "architecture": "x86", "full_name": "Packed Logical XOR (MMX)", "summary": "Bitwise XOR of 64-bit MMX registers.", "syntax": "PXOR mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F EF /r1", "visual_parts": [], "binary_pattern": "0F | EF", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Performs a bitwise XOR of the 64-bit destination MMX register and a 64-bit source operand, storing the result in the destination. The operation treats all 64 bits as a single logical unit and does not affect any flags. Notably, PXOR with the same register as both operands can be used to zero a register in one cycle.", "pseudocode": "dest[0:63] ← dest[0:63] ^ src[0:63];", "example": "PXOR mm, mm/m64"}
{"mnemonic": "pandn", "architecture": "x86", "full_name": "Packed Logical AND NOT (MMX)", "summary": "Bitwise AND NOT of 64-bit MMX registers.", "syntax": "PANDN mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F DF /r1", "visual_parts": [], "binary_pattern": "0F | DF", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Performs a bitwise AND NOT operation: the destination is AND'ed with the bitwise complement of the source, storing the result in the destination. Equivalent to (dest & ~src). No flags are modified and the operation processes all 64 bits in a single cycle on MMX-capable processors.", "pseudocode": "dest[0:63] ← dest[0:63] & (~src[0:63]);", "example": "PANDN mm, mm/m64"}
{"mnemonic": "pcmpgtb", "architecture": "x86", "full_name": "Packed Compare Greater Than Byte (MMX)", "summary": "Compares bytes for greater than (MMX).", "syntax": "PCMPGTB mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F 64 /r1", "visual_parts": [], "binary_pattern": "0F | 64", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Compares four signed 8-bit bytes in the destination MMX register with four signed 8-bit bytes in the source operand. Each byte position in the destination is set to 0xFF if the destination byte is greater than the source byte, or 0x00 otherwise. No EFLAGS are affected by this comparison; results are returned as a packed mask in the MMX register.", "pseudocode": "FOR i = 0 TO 7 STEP 8:\n  IF INT8(dest[i:i+7]) > INT8(src[i:i+7]) THEN\n    dest[i:i+7] ← 0xFF;\n  ELSE\n    dest[i:i+7] ← 0x00;\n  ENDIF;\nENDFOR;", "example": "PCMPGTB mm, mm/m64"}
{"mnemonic": "pcmpgtw", "architecture": "x86", "full_name": "Packed Compare Greater Than Word (MMX)", "summary": "Compares words for greater than (MMX).", "syntax": "PCMPGTW mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F 65 /r1", "visual_parts": [], "binary_pattern": "0F | 65", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Compares two signed 16-bit words in the destination MMX register with two signed 16-bit words in the source operand. Each word position in the destination is set to 0xFFFF if the destination word is greater than the source word, or 0x0000 otherwise. No EFLAGS are modified; comparison results are returned as a packed mask directly in the destination MMX register.", "pseudocode": "FOR i = 0 TO 2 STEP 16:\n  IF INT16(dest[i:i+15]) > INT16(src[i:i+15]) THEN\n    dest[i:i+15] ← 0xFFFF;\n  ELSE\n    dest[i:i+15] ← 0x0000;\n  ENDIF;\nENDFOR;", "example": "PCMPGTW mm, mm/m64"}
{"mnemonic": "pcmpgtd", "architecture": "x86", "full_name": "Packed Compare Greater Than Doubleword (MMX)", "summary": "Compares doublewords for greater than (MMX).", "syntax": "PCMPGTD mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F 66 /r1", "visual_parts": [], "binary_pattern": "0F | 66", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Performs a signed greater-than comparison on four packed 32-bit doublewords in the destination MMX register and source operand, setting each corresponding doubleword in the destination to all 1s if the comparison is true, or all 0s if false. No EFLAGS are affected; this is a data-parallel operation that operates entirely within the MMX register file.", "pseudocode": "for i = 0 to 1 {\n  if (signed(dest.dword[i]) > signed(src.dword[i])) {\n    dest.dword[i] ← 0xFFFFFFFF\n  } else {\n    dest.dword[i] ← 0x00000000\n  }\n}", "example": "PCMPGTD mm, mm/m64"}
{"mnemonic": "pcmpeqb", "architecture": "x86", "full_name": "Packed Compare Equal Byte (MMX)", "summary": "Compares bytes for equality (MMX).", "syntax": "PCMPEQB mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F 74 /r1", "visual_parts": [], "binary_pattern": "0F | 74", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Performs an equality comparison on eight packed 8-bit bytes in the destination MMX register and source operand, setting each corresponding byte in the destination to all 1s if equal, or all 0s if not equal. No EFLAGS are affected; the result is a byte-wise mask suitable for conditional data selection.", "pseudocode": "for i = 0 to 7 {\n  if (dest.byte[i] == src.byte[i]) {\n    dest.byte[i] ← 0xFF\n  } else {\n    dest.byte[i] ← 0x00\n  }\n}", "example": "PCMPEQB mm, mm/m64"}
{"mnemonic": "pcmpeqw", "architecture": "x86", "full_name": "Packed Compare Equal Word (MMX)", "summary": "Compares words for equality (MMX).", "syntax": "PCMPEQW mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F 75 /r1", "visual_parts": [], "binary_pattern": "0F | 75", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Performs an equality comparison on four packed 16-bit words in the destination MMX register and source operand, setting each corresponding word in the destination to all 1s if equal, or all 0s if not equal. No EFLAGS are affected; this is used for creating word-level masks in SIMD operations.", "pseudocode": "for i = 0 to 3 {\n  if (dest.word[i] == src.word[i]) {\n    dest.word[i] ← 0xFFFF\n  } else {\n    dest.word[i] ← 0x0000\n  }\n}", "example": "PCMPEQW mm, mm/m64"}
{"mnemonic": "pcmpeqd", "architecture": "x86", "full_name": "Packed Compare Equal Doubleword (MMX)", "summary": "Compares doublewords for equality (MMX).", "syntax": "PCMPEQD mm, mm/m64", "encoding": {"format": "MMX", "hex_opcode": "NP 0F 76 /r1", "visual_parts": [], "binary_pattern": "0F | 76", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Performs an equality comparison on two packed 32-bit doublewords in the destination MMX register and source operand, setting each corresponding doubleword in the destination to all 1s if equal, or all 0s if not equal. No EFLAGS are affected; the result is a doubleword-wise mask suitable for conditional operations.", "pseudocode": "for i = 0 to 1 {\n  if (dest.dword[i] == src.dword[i]) {\n    dest.dword[i] ← 0xFFFFFFFF\n  } else {\n    dest.dword[i] ← 0x00000000\n  }\n}", "example": "PCMPEQD mm, mm/m64"}
{"mnemonic": "psllw", "architecture": "x86", "full_name": "Packed Shift Left Logical Word (MMX)", "summary": "Shifts words left (MMX).", "syntax": "PSLLW mm, imm8", "encoding": {"format": "MMX", "hex_opcode": "NP 0F 71 /6 ib", "visual_parts": [], "binary_pattern": "0F | 71 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs a logical left shift on four packed 16-bit words in the destination MMX register by the count specified in the 8-bit immediate operand, shifting bits out to the left and filling vacated positions with zeros. No EFLAGS are affected; shift counts greater than or equal to 16 result in all zeros for the affected words.", "pseudocode": "count ← src & 0xFF\nfor i = 0 to 3 {\n  if (count >= 16) {\n    dest.word[i] ← 0x0000\n  } else {\n    dest.word[i] ← dest.word[i] << count\n  }\n}", "example": "PSLLW mm, 3"}
{"mnemonic": "pslld", "architecture": "x86", "full_name": "Packed Shift Left Logical Doubleword (MMX)", "summary": "Shifts doublewords left (MMX).", "syntax": "PSLLD mm, imm8", "encoding": {"format": "MMX", "hex_opcode": "66 0F 72 /6 ib", "visual_parts": [], "binary_pattern": "0F | 72 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs a logical left shift on two packed 32-bit doublewords in the destination MMX register by the count specified in the 8-bit immediate operand, shifting bits out to the left and filling vacated positions with zeros. No EFLAGS are affected; shift counts greater than or equal to 32 result in all zeros for the affected doublewords.", "pseudocode": "count ← src & 0xFF\nfor i = 0 to 1 {\n  if (count >= 32) {\n    dest.dword[i] ← 0x00000000\n  } else {\n    dest.dword[i] ← dest.dword[i] << count\n  }\n}", "example": "PSLLD mm, 3"}
{"mnemonic": "psllq", "architecture": "x86", "full_name": "Packed Shift Left Logical Quadword (MMX)", "summary": "Shifts quadword left (MMX).", "syntax": "PSLLQ mm, imm8", "encoding": {"format": "MMX", "hex_opcode": "66 0F 73 /6 ib", "visual_parts": [], "binary_pattern": "0F | 73 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs a logical left shift on one packed 64-bit quadword in the destination MMX register by the count specified in the 8-bit immediate operand, shifting bits out to the left and filling vacated positions with zeros. No EFLAGS are affected; shift counts greater than or equal to 64 result in zero.", "pseudocode": "count ← src & 0xFF\nif (count >= 64) {\n  dest.qword[0] ← 0x0000000000000000\n} else {\n  dest.qword[0] ← dest.qword[0] << count\n}", "example": "PSLLQ mm, 3"}
{"mnemonic": "psrlw", "architecture": "x86", "full_name": "Packed Shift Right Logical Word (MMX)", "summary": "Shifts words right logical (MMX).", "syntax": "PSRLW mm, imm8", "encoding": {"format": "MMX", "hex_opcode": "66 0F 71 /2 ib", "visual_parts": [], "binary_pattern": "0F | 71 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs a logical right shift on four packed 16-bit words in the destination MMX register by the count specified in the 8-bit immediate operand, shifting bits out to the right and filling vacated positions with zeros. No EFLAGS are affected; shift counts greater than or equal to 16 result in all zeros for the affected words.", "pseudocode": "count ← src & 0xFF\nfor i = 0 to 3 {\n  if (count >= 16) {\n    dest.word[i] ← 0x0000\n  } else {\n    dest.word[i] ← dest.word[i] >> count\n  }\n}", "example": "PSRLW mm, 3"}
{"mnemonic": "psrld", "architecture": "x86", "full_name": "Packed Shift Right Logical Doubleword (MMX)", "summary": "Shifts doublewords right logical (MMX).", "syntax": "PSRLD mm, imm8", "encoding": {"format": "MMX", "hex_opcode": "66 0F 72 /2 ib", "visual_parts": [], "binary_pattern": "0F | 72 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts each 32-bit doubleword element in an MMX register right by an immediate count, filling vacated high-order bits with zeros. This is a logical right shift (sign-insensitive) operating on packed doubleword elements. No flags are affected; the shift amount is masked to 5 bits (0-31).", "pseudocode": "count ← src AND 31;\nfor i ← 0 to 1 do\n  dest.dw[i] ← dest.dw[i] >> count;\nend;", "example": "PSRLD mm, 3"}
{"mnemonic": "psrlq", "architecture": "x86", "full_name": "Packed Shift Right Logical Quadword (MMX)", "summary": "Shifts quadword right logical (MMX).", "syntax": "PSRLQ mm, imm8", "encoding": {"format": "MMX", "hex_opcode": "66 0F 73 /2 ib", "visual_parts": [], "binary_pattern": "0F | 73 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts the 64-bit quadword in an MMX register right by an immediate count, filling vacated high-order bits with zeros. This is a logical right shift operating on a single 64-bit element. No flags are affected; the shift amount is masked to 6 bits (0-63).", "pseudocode": "count ← src AND 63;\ndest.qw ← dest.qw >> count;", "example": "PSRLQ mm, 3"}
{"mnemonic": "psraw", "architecture": "x86", "full_name": "Packed Shift Right Arithmetic Word (MMX)", "summary": "Shifts words right arithmetic (MMX).", "syntax": "PSRAW mm, imm8", "encoding": {"format": "MMX", "hex_opcode": "66 0F 71 /4 ib", "visual_parts": [], "binary_pattern": "0F | 71 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts each 16-bit word element in an MMX register right by an immediate count, filling vacated high-order bits with the sign bit (arithmetic shift). This preserves the sign of signed 16-bit integers. No flags are affected; the shift amount is masked to 4 bits (0-15).", "pseudocode": "count ← src AND 15;\nfor i ← 0 to 3 do\n  dest.w[i] ← ARITHMETIC_SHIFT_RIGHT(dest.w[i], count);\nend;", "example": "PSRAW mm, 3"}
{"mnemonic": "psrad", "architecture": "x86", "full_name": "Packed Shift Right Arithmetic Doubleword (MMX)", "summary": "Shifts doublewords right arithmetic (MMX).", "syntax": "PSRAD mm, imm8", "encoding": {"format": "MMX", "hex_opcode": "66 0F 72 /4 ib", "visual_parts": [], "binary_pattern": "0F | 72 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts each 32-bit doubleword element in an MMX register right by an immediate count, filling vacated high-order bits with the sign bit (arithmetic shift). This preserves the sign of signed 32-bit integers. No flags are affected; the shift amount is masked to 5 bits (0-31).", "pseudocode": "count ← src AND 31;\nfor i ← 0 to 1 do\n  dest.dw[i] ← ARITHMETIC_SHIFT_RIGHT(dest.dw[i], count);\nend;", "example": "PSRAD mm, 3"}
{"mnemonic": "mov", "architecture": "x86", "full_name": "Move", "summary": "Copies data from source to destination.", "syntax": "MOV r/m, r", "pseudocode": "dest ← src;", "example": "MOV EAX, 5    ; Load 5 into EAX\nMOV [EBX], EAX ; Store EAX to memory at EBX", "encoding": {"format": "Legacy", "hex_opcode": "89", "length": "2+", "visual_parts": [], "binary_pattern": "89", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "r", "desc": "General-purpose register"}], "description": "Copies data from the source register to the destination register or memory location. Operates on 16-bit, 32-bit, or 64-bit operands (size determined by operand-size prefix and REX.W in 64-bit mode). No flags are affected; memory ordering is not guaranteed with respect to other threads without explicit synchronization."}
{"mnemonic": "add", "architecture": "x86", "full_name": "Add", "summary": "Adds src to dest and stores result in dest.", "syntax": "ADD r/m, r", "pseudocode": "result ← dest + src;\nOF ← overflow_occurred(dest, src, result);\nSF ← (result < 0);\nZF ← (result == 0);\nAF ← carry_from_bit(3);\nPF ← parity(result);\nCF ← carry_out;\ndest ← result;", "example": "ADD EAX, EBX  ; Add EBX to EAX\nADD [EAX], 5  ; Add 5 to the 32-bit integer at address EAX", "encoding": {"format": "Legacy", "hex_opcode": "01", "length": "2+", "visual_parts": [], "binary_pattern": "01", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "r", "desc": "General-purpose register"}], "description": "Adds the source operand to the destination operand and stores the result in the destination; the sum is computed modulo 2^(operand size). Sets OF, SF, ZF, AF, CF, and PF based on the result. Available in 16-bit, 32-bit, and 64-bit forms; operand size is determined by the prefix and REX.W in 64-bit mode."}
{"mnemonic": "sub", "architecture": "x86", "full_name": "Subtract", "summary": "Subtracts src from dest.", "syntax": "SUB r/m, r", "pseudocode": "result ← dest - src;\nOF ← overflow_occurred(dest, src, result);\nSF ← (result < 0);\nZF ← (result == 0);\nAF ← borrow_from_bit(3);\nPF ← parity(result);\nCF ← borrow_out;\ndest ← result;", "example": "SUB EAX, 10   ; Subtract 10 from EAX\nSUB ECX, EDX  ; Subtract EDX from ECX", "encoding": {"format": "Legacy", "hex_opcode": "29", "length": "2+", "visual_parts": [], "binary_pattern": "29", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "r", "desc": "General-purpose register"}], "description": "Subtracts the source operand from the destination operand and stores the result in the destination; the difference is computed modulo 2^(operand size). Sets OF, SF, ZF, AF, CF, and PF based on the result. Available in 16-bit, 32-bit, and 64-bit forms; operand size is determined by the prefix and REX.W in 64-bit mode."}
{"mnemonic": "and", "architecture": "x86", "full_name": "Logical AND", "summary": "Performs bitwise AND.", "syntax": "AND r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "21", "length": "2+", "visual_parts": [], "binary_pattern": "21", "bit_positions": "+0"}, "operands": [{"name": "dest", "desc": "Register/Memory", "type": "r/m"}, {"name": "src", "desc": "Register", "type": "r"}], "extension": "Base", "description": "Performs a bitwise logical AND of the destination and source operands, storing the result in the destination. Sets SF, ZF, and PF based on the result; clears OF and CF; AF is undefined. Available in 16-bit, 32-bit, and 64-bit forms; operand size is determined by the prefix and REX.W in 64-bit mode.", "pseudocode": "result ← dest AND src;\nSF ← (result < 0);\nZF ← (result == 0);\nPF ← parity(result);\nOF ← 0;\nCF ← 0;\nAF ← undefined;\ndest ← result;", "example": "AND EAX, 0xFF ; Keep lowest 8 bits\nAND ECX, EDX  ; Bitwise AND of ECX and EDX"}
{"mnemonic": "or", "architecture": "x86", "full_name": "Logical OR", "summary": "Performs bitwise OR.", "syntax": "OR r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "09", "length": "2+", "visual_parts": [], "binary_pattern": "09", "bit_positions": "+0"}, "operands": [{"name": "dest", "desc": "Register/Memory", "type": "r/m"}, {"name": "src", "desc": "Register", "type": "r"}], "extension": "Base", "description": "Performs a bitwise logical OR between the destination and source operands, storing the result in the destination. Sets ZF, SF, and PF based on the result; clears OF and CF; AF is undefined. Available in 8, 16, 32, and 64-bit variants across all modes.", "pseudocode": "dest ← dest | src; ZF ← (result == 0); SF ← (result < 0); PF ← parity(result); CF ← 0; OF ← 0; AF ← undefined;", "example": "OR EAX, 1     ; Set lowest bit\nOR EAX, EAX   ; Check if EAX is zero (sets ZF)"}
{"mnemonic": "xor", "architecture": "x86", "full_name": "Logical Exclusive OR", "summary": "Performs bitwise XOR.", "syntax": "XOR r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "31", "length": "2+", "visual_parts": [], "binary_pattern": "31", "bit_positions": "+0"}, "operands": [{"name": "dest", "desc": "Register/Memory", "type": "r/m"}, {"name": "src", "desc": "Register", "type": "r"}], "extension": "Base", "description": "Performs a bitwise logical exclusive OR (XOR) between the destination and source operands, storing the result in the destination. Sets ZF, SF, and PF based on the result; clears OF and CF; AF is undefined. Available in 8, 16, 32, and 64-bit variants across all modes.", "pseudocode": "dest ← dest ^ src; ZF ← (result == 0); SF ← (result < 0); PF ← parity(result); CF ← 0; OF ← 0; AF ← undefined;", "example": "XOR EAX, EAX  ; Clear EAX (set to 0)\nXOR EAX, 5    ; Toggle bits 0 and 2"}
{"mnemonic": "cmp", "architecture": "x86", "full_name": "Compare Two Operands", "summary": "Subtracts src from dest and updates flags (dest not modified).", "syntax": "CMP r/m, r", "encoding": {"format": "Legacy", "hex_opcode": "39", "length": "2+", "visual_parts": [], "binary_pattern": "39", "bit_positions": "+0"}, "operands": [{"name": "dest", "desc": "Register/Memory", "type": "r/m"}, {"name": "src", "desc": "Register", "type": "r"}], "extension": "Base", "description": "Subtracts the source operand from the destination operand and updates the EFLAGS register without modifying the destination. Sets or clears CF, PF, AF, ZF, SF, and OF based on the subtraction result. Available in 8, 16, 32, and 64-bit variants across all modes.", "pseudocode": "temp ← dest - src; CF ← (dest < src); ZF ← (temp == 0); SF ← (temp < 0); OF ← overflow(dest, src); PF ← parity(temp); AF ← half_borrow(dest, src);", "example": "CMP EAX, 10   ; Compare EAX with 10\nJE label      ; Jump if Equal"}
{"mnemonic": "test", "architecture": "x86", "full_name": "Logical Compare", "summary": "ANDs operands and updates flags (result discarded).", "syntax": "TEST r/m, r", "pseudocode": "temp ← dest & src; ZF ← (temp == 0); SF ← (temp < 0); PF ← parity(temp); CF ← 0; OF ← 0; AF ← undefined;", "example": "TEST EAX, EAX ; Check if EAX is 0\nTEST AL, 1    ; Check if lowest bit is set", "encoding": {"format": "Legacy", "hex_opcode": "85", "length": "2+", "visual_parts": [], "binary_pattern": "85", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m", "desc": "Register or memory operand"}, {"name": "src", "type": "r", "desc": "General-purpose register"}], "description": "Performs a bitwise logical AND between the destination and source operands, updating EFLAGS without modifying either operand. Sets ZF, SF, and PF based on the AND result; clears OF and CF; AF is undefined. Available in 8, 16, 32, and 64-bit variants across all modes."}
{"mnemonic": "lfence", "architecture": "x86", "full_name": "Load Fence", "summary": "Serializes load operations (Wait for prior loads to complete).", "syntax": "LFENCE", "encoding": {"format": "SSE2", "hex_opcode": "NP 0F AE E8", "visual_parts": [], "binary_pattern": "0F | AE | E8", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [], "description": "Serializes all load instructions that precede it in program order; subsequent loads wait until prior loads complete and their data is globally visible. Provides acquire-like semantics for loads on TSO (Total Store Order) architectures. No flags are affected. SSE2 extension; acts as a no-op on non-TSO systems without explicit serialization requirements.", "pseudocode": "wait_for_all_prior_loads_to_complete();", "example": "LFENCE"}
{"mnemonic": "sfence", "architecture": "x86", "full_name": "Store Fence", "summary": "Serializes store operations (Wait for prior stores to complete).", "syntax": "SFENCE", "encoding": {"format": "SSE", "hex_opcode": "NP 0F AE F8", "visual_parts": [], "binary_pattern": "0F | AE | F8", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [], "description": "Serializes all store instructions that precede it in program order; subsequent stores wait until prior stores complete and are globally visible. Provides release-like semantics for stores. No flags are affected. SSE extension; acts as a no-op on processors where stores are already globally ordered.", "pseudocode": "wait_for_all_prior_stores_to_complete();", "example": "SFENCE"}
{"mnemonic": "mfence", "architecture": "x86", "full_name": "Memory Fence", "summary": "Serializes all load and store operations.", "syntax": "MFENCE", "encoding": {"format": "SSE2", "hex_opcode": "NP 0F AE F0", "visual_parts": [], "binary_pattern": "0F | AE | F0", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [], "description": "Serializes all load and store instructions (both prior and subsequent) with respect to one another; acts as a full memory barrier. Ensures all prior memory operations complete and are globally visible before any subsequent memory operations begin. No flags are affected. SSE2 extension; commonly used for cross-CPU synchronization.", "pseudocode": "wait_for_all_prior_loads_and_stores_to_complete(); wait_for_global_visibility();", "example": "MFENCE"}
{"mnemonic": "clflush", "architecture": "x86", "full_name": "Cache Line Flush", "summary": "Flushes the cache line containing the operand from all caches.", "syntax": "CLFLUSH m8", "encoding": {"format": "SSE2", "hex_opcode": "NP 0F AE /7", "visual_parts": [], "binary_pattern": "0F | AE | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "m8", "desc": "8-bit memory operand"}], "description": "Flushes the cache line containing the specified memory address from all cache levels (L1, L2, L3) without writing dirty data back to memory. Serializes the instruction stream and ensures all prior memory operations complete before execution. No flags are modified. Supported in protected and 64-bit modes; requires SSE2 or equivalent.", "pseudocode": "cache_line ← address_of(memory_address)\nfor each cache_level in (L1, L2, L3):\n  invalidate(cache_line in cache_level)", "example": "CLFLUSH [rbp-1]"}
{"mnemonic": "rdtscp", "architecture": "x86", "full_name": "Read Time-Stamp Counter and Processor ID", "summary": "Reads TSC into EDX:EAX and Processor ID into ECX.", "syntax": "RDTSCP", "encoding": {"format": "Legacy", "hex_opcode": "0F 01 F9", "visual_parts": [], "binary_pattern": "0F | 01 | F9", "bit_positions": "+0 | +1 | +2"}, "extension": "Base", "operands": [], "description": "Reads the 64-bit Time-Stamp Counter (TSC) into EDX:EAX and writes the low byte of the IA32_TSC_AUX MSR into ECX. Acts as a serializing instruction, ensuring all prior instructions have completed before TSC is captured. No arithmetic flags are modified. Requires RDTSCP capability; available in both 32-bit and 64-bit modes.", "pseudocode": "EDX:EAX ← TSC\nECX ← (IA32_TSC_AUX MSR)[0:31]", "example": "RDTSCP"}
{"mnemonic": "xsave", "architecture": "x86", "full_name": "Save Processor Extended States", "summary": "Saves specified state components (AVX, SSE, etc.) to memory.", "syntax": "XSAVE m", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F AE /4", "visual_parts": [], "binary_pattern": "0F | AE | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "XSAVE", "operands": [{"name": "dest", "type": "m", "desc": "Memory operand"}], "description": "Saves processor extended state components (selected by EDX:EAX, typically FPU, SSE, AVX, and AVX-512 state) to a memory region starting at the address specified in the operand. Serializes the instruction stream and performs a context save without modifying any flags. Requires XSAVE capability; privilege level may be restricted depending on state component being saved.", "pseudocode": "state_mask ← EDX:EAX\nfor each enabled_state in state_components:\n  if state_mask & enabled_state:\n    memory_region ← save(enabled_state)", "example": "XSAVE [rbp-8]"}
{"mnemonic": "xrstor", "architecture": "x86", "full_name": "Restore Processor Extended States", "summary": "Restores specified state components from memory.", "syntax": "XRSTOR m", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F AE /5", "visual_parts": [], "binary_pattern": "0F | AE | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "XSAVE", "operands": [{"name": "dest", "type": "m", "desc": "Memory operand"}], "description": "Restores processor extended state components (selected by EDX:EAX) from a memory region at the specified address. Loads FPU, SSE, AVX, and AVX-512 state as indicated by the state mask. Serializes the instruction stream and does not modify arithmetic flags. Requires XRSTOR capability; memory layout must match that produced by XSAVE.", "pseudocode": "state_mask ← EDX:EAX\nfor each enabled_state in state_components:\n  if state_mask & enabled_state:\n    enabled_state ← memory_region[offset]", "example": "XRSTOR [rbp-8]"}
{"mnemonic": "xgetbv", "architecture": "x86", "full_name": "Get Value of Extended Control Register", "summary": "Reads the state of XCR0 (feature mask) into EDX:EAX.", "syntax": "XGETBV", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 01 D0", "visual_parts": [], "binary_pattern": "0F | 01 | D0", "bit_positions": "+0 | +1 | +2"}, "extension": "XSAVE", "operands": [], "description": "Reads the 64-bit value of extended control register XCR0 (feature mask indicating which extended processor states are enabled) into EDX:EAX. Does not modify any arithmetic flags. Requires XSAVE capability and typically requires execution at privilege level 0, though user-mode access may be permitted with UMWAIT or in certain OS configurations.", "pseudocode": "EDX:EAX ← XCR0", "example": "XGETBV"}
{"mnemonic": "xsetbv", "architecture": "x86", "full_name": "Set Value of Extended Control Register", "summary": "Writes EDX:EAX to XCR0 (Enables/disables AVX/SSE states).", "syntax": "XSETBV", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 01 D1", "visual_parts": [], "binary_pattern": "0F | 01 | D1", "bit_positions": "+0 | +1 | +2"}, "extension": "XSAVE", "operands": [], "description": "Writes the 64-bit value from EDX:EAX into extended control register XCR0, enabling or disabling processor extended states (AVX, SSE, AVX-512, etc.). Serializes the instruction stream and forces all prior instructions to complete. No arithmetic flags are modified. Requires privilege level 0 and XSAVE capability.", "pseudocode": "XCR0 ← EDX:EAX", "example": "XSETBV"}
{"mnemonic": "shufps", "architecture": "x86", "full_name": "Shuffle Packed Single-Precision", "summary": "Shuffles 32-bit floats between two XMM registers.", "syntax": "SHUFPS xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE", "hex_opcode": "NP 0F C6 /r ib", "visual_parts": [], "binary_pattern": "0F | C6", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shuffles four 32-bit single-precision floating-point values from the destination XMM register and source XMM/memory operand according to a 2-bit control value in the immediate byte, placing the result in the destination. The immediate selects which of the four source elements populate each destination element. No arithmetic flags are affected. Supported in SSE and later.", "pseudocode": "dest[31:0] ← select_from_2bits(imm8[1:0], dest[31:0], dest[63:32], src[31:0], src[63:32])\ndest[63:32] ← select_from_2bits(imm8[3:2], dest[31:0], dest[63:32], src[31:0], src[63:32])\ndest[95:64] ← select_from_2bits(imm8[5:4], src[127:96], src[95:64], src[31:0], src[63:32])\ndest[127:96] ← select_from_2bits(imm8[7:6], src[127:96], src[95:64], src[31:0], src[63:32])", "example": "SHUFPS xmm1, xmm2/m128, 3"}
{"mnemonic": "shufpd", "architecture": "x86", "full_name": "Shuffle Packed Double-Precision", "summary": "Shuffles 64-bit doubles between two XMM registers.", "syntax": "SHUFPD xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE2", "hex_opcode": "66 0F C6", "visual_parts": [], "binary_pattern": "66 | 0F | C6", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shuffles two 64-bit double-precision floating-point values from the destination XMM register and source XMM/memory operand according to a 2-bit control value in the immediate byte, placing the result in the destination. The low bit selects element 0 of the result (from dest or src), the high bit selects element 1. No arithmetic flags are affected. Requires SSE2 or later.", "pseudocode": "dest[63:0] ← imm8[0] ? src[63:0] : dest[63:0]\ndest[127:64] ← imm8[1] ? src[127:64] : dest[127:64]", "example": "SHUFPD xmm1, xmm2/m128, 3"}
{"mnemonic": "unpcklps", "architecture": "x86", "full_name": "Unpack Low Packed Single-Precision", "summary": "Interleaves low floats from two registers.", "syntax": "UNPCKLPS xmm1, xmm2/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 14 /r", "visual_parts": [], "binary_pattern": "0F | 14", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Interleaves the low 64 bits (two 32-bit floats) from the destination XMM register with the low 64 bits from the source, producing [src[31:0], dest[31:0], src[63:32], dest[63:32]] in the destination. This SIMD instruction has no effect on CPU flags and operates only on the XMM register file. It is part of the SSE extension and works identically across all modern 64-bit modes.", "pseudocode": "xmm1[31:0] ← xmm1[31:0];\nxmm1[63:32] ← src[31:0];\nxmm1[95:64] ← xmm1[63:32];\nxmm1[127:96] ← src[63:32];", "example": "UNPCKLPS xmm1, xmm2/m128"}
{"mnemonic": "unpckhps", "architecture": "x86", "full_name": "Unpack High Packed Single-Precision", "summary": "Interleaves high floats from two registers.", "syntax": "UNPCKHPS xmm1, xmm2/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 15 /r", "visual_parts": [], "binary_pattern": "0F | 15", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Interleaves the high 64 bits (two 32-bit floats) from the destination XMM register with the high 64 bits from the source, producing [src[95:64], dest[95:64], src[127:96], dest[127:96]] in the destination. This SIMD instruction has no effect on CPU flags and operates only on the XMM register file. It is part of the SSE extension and works identically across all modern 64-bit modes.", "pseudocode": "xmm1[31:0] ← xmm1[95:64];\nxmm1[63:32] ← src[95:64];\nxmm1[95:64] ← xmm1[127:96];\nxmm1[127:96] ← src[127:96];", "example": "UNPCKHPS xmm1, xmm2/m128"}
{"mnemonic": "movntps", "architecture": "x86", "full_name": "Move Non-Temporal Packed Single", "summary": "Stores float vectors directly to RAM, bypassing cache.", "syntax": "MOVNTPS m128, xmm", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 2B /r", "visual_parts": [], "binary_pattern": "0F | 2B", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "m128", "desc": "128-bit memory operand"}, {"name": "src", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}], "description": "Writes 128 bits from an XMM register directly to memory without bringing the cache line into the L1 data cache, using a write-combining memory type. This non-temporal store is optimal for streaming data that will not be reused soon. The instruction has no effect on CPU flags and executes as a store-to-memory operation without fence semantics.", "pseudocode": "[m128] ← xmm;", "example": "MOVNTPS [rbp-16], xmm0"}
{"mnemonic": "movntpd", "architecture": "x86", "full_name": "Move Non-Temporal Packed Double", "summary": "Stores double vectors directly to RAM, bypassing cache.", "syntax": "MOVNTPD m128, xmm", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 2B", "visual_parts": [], "binary_pattern": "66 | 0F | 2B", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "m128", "desc": "128-bit memory operand"}, {"name": "src", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}], "description": "Writes 128 bits from an XMM register directly to memory without bringing the cache line into the L1 data cache, using a write-combining memory type, operating on two 64-bit double-precision floats. This non-temporal store is optimal for streaming data that will not be reused soon. The instruction has no effect on CPU flags and executes as a store-to-memory operation without fence semantics.", "pseudocode": "[m128] ← xmm;", "example": "MOVNTPD [rbp-16], xmm0"}
{"mnemonic": "blendpd", "architecture": "x86", "full_name": "Blend Packed Double-Precision", "summary": "Selects doubles from two sources based on immediate mask.", "syntax": "BLENDPD xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 0D", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 0D", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Selects each 64-bit double-precision element from the destination or source register based on the corresponding bit in an 8-bit immediate mask (bit 0 for element 0, bit 1 for element 1). If the bit is 0, the element from xmm1 is retained; if 1, the element from the source is used. No CPU flags are affected by this SIMD operation, which is part of the SSE4.1 extension.", "pseudocode": "imm ← imm8;\nxmm1[63:0] ← (imm[0] == 1) ? src[63:0] : xmm1[63:0];\nxmm1[127:64] ← (imm[1] == 1) ? src[127:64] : xmm1[127:64];", "example": "BLENDPD xmm1, xmm2/m128, 3"}
{"mnemonic": "insertps", "architecture": "x86", "full_name": "Insert Packed Single-Precision", "summary": "Inserts a single float into a specific index of XMM.", "syntax": "INSERTPS xmm1, xmm2/m32, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 21", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 21", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Inserts a single 32-bit float from a source (register or memory) into a specific lane of the destination XMM register as specified by bits [5:4] of the immediate operand, and optionally zeros lanes specified by bits [3:0]. No CPU flags are affected by this SIMD operation, which is part of the SSE4.1 extension.", "pseudocode": "imm ← imm8;\ncount_d ← (imm >> 4) & 0x3;\nzero_mask ← imm & 0xF;\nsrc_dword ← src[31:0];\nxmm1[count_d*32 + 31 : count_d*32] ← src_dword;\nfor i in 0 to 3:\n  if (zero_mask & (1 << i)) then xmm1[i*32 + 31 : i*32] ← 0;", "example": "INSERTPS xmm1, xmm2/m32, 3"}
{"mnemonic": "extractps", "architecture": "x86", "full_name": "Extract Packed Single-Precision", "summary": "Extracts a single float from XMM to an integer register.", "syntax": "EXTRACTPS r32/m32, xmm1, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 17", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 17", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "r32/m32", "desc": "General-purpose register or Memory operand"}, {"name": "src1", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Extracts a single 32-bit float from a source XMM register at a lane specified by bits [1:0] of the immediate operand and writes it to a 32-bit destination (GP register or memory). The extracted value is zero-extended if written to a 32-bit register. No CPU flags are affected by this SIMD operation, which is part of the SSE4.1 extension.", "pseudocode": "imm ← imm8;\nindex ← imm & 0x3;\nsrc_dword ← xmm1[index*32 + 31 : index*32];\ndest[31:0] ← src_dword;", "example": "EXTRACTPS r32/m32, xmm1, 3"}
{"mnemonic": "dpps", "architecture": "x86", "full_name": "Dot Product Packed Single-Precision", "summary": "Computes the dot product of two float vectors.", "syntax": "DPPS xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 40", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 40", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Computes the dot product of the four 32-bit float elements in the destination and source registers, then selectively masks the result and zeros based on an 8-bit immediate. The result (or zero) is replicated into each 32-bit element of the destination according to the mask. No CPU flags are affected by this SIMD operation, which is part of the SSE4.1 extension.", "pseudocode": "imm ← imm8;\nproduct ← 0.0;\nfor i in 0 to 3:\n  if (imm & (1 << (i+4))) then\n    product ← product + (dest[i*32+31:i*32] * src[i*32+31:i*32]);\nfor i in 0 to 3:\n  if (imm & (1 << i)) then\n    dest[i*32+31:i*32] ← product;\n  else\n    dest[i*32+31:i*32] ← 0.0;", "example": "DPPS xmm1, xmm2/m128, 3"}
{"mnemonic": "dppd", "architecture": "x86", "full_name": "Dot Product Packed Double-Precision", "summary": "Computes the dot product of two double vectors.", "syntax": "DPPD xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 41", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 41", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Computes the dot product of two packed double-precision floating-point vectors (2 doubles per 128-bit operand) and stores the result in the destination. The imm8 byte controls which elements participate in the dot product and which output elements are zeroed. No flags are affected; this is a SSE4.1 instruction that operates only in 64-bit and protected modes.", "pseudocode": "select_mask ← imm8[7:4]\nproduct_mask ← imm8[3:0]\ntemp ← 0.0\nfor i in 0..1:\n  if (product_mask[i] == 1):\n    temp ← temp + (xmm1[i*64+63:i*64] * src1[i*64+63:i*64])\nfor i in 0..1:\n  if (select_mask[i] == 1):\n    dest[i*64+63:i*64] ← temp\n  else:\n    dest[i*64+63:i*64] ← 0.0", "example": "DPPD xmm1, xmm2/m128, 3"}
{"mnemonic": "roundps", "architecture": "x86", "full_name": "Round Packed Single-Precision", "summary": "Rounds all packed floats according to immediate mode.", "syntax": "ROUNDPS xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 08", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 08", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rounds each packed single-precision floating-point element in the source operand according to the rounding mode specified in imm8 and stores the result in the destination. The rounding mode imm8[2:0] selects between round-to-nearest, round-down, round-up, or truncate; bit 3 selects whether to suppress inexact exceptions. No CPU flags are modified; this is a SSE4.1 instruction available in 64-bit and protected modes.", "pseudocode": "rounding_mode ← imm8[2:0]\nsuppress_inexact ← imm8[3]\nfor i in 0..3:\n  f32 ← src[i*32+31:i*32]\n  if (rounding_mode == 0):  /* round to nearest */\n    result ← round_nearest(f32)\n  elif (rounding_mode == 1):  /* round down */\n    result ← round_down(f32)\n  elif (rounding_mode == 2):  /* round up */\n    result ← round_up(f32)\n  elif (rounding_mode == 3):  /* truncate */\n    result ← truncate(f32)\n  dest[i*32+31:i*32] ← result", "example": "ROUNDPS xmm1, xmm2/m128, 3"}
{"mnemonic": "roundpd", "architecture": "x86", "full_name": "Round Packed Double-Precision", "summary": "Rounds all packed doubles according to immediate mode.", "syntax": "ROUNDPD xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 09", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 09", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rounds each packed double-precision floating-point element in the source operand according to the rounding mode specified in imm8 and stores the result in the destination. The rounding mode imm8[2:0] selects between round-to-nearest, round-down, round-up, or truncate; bit 3 controls inexact exception suppression. No CPU flags are modified; this is a SSE4.1 instruction available in 64-bit and protected modes.", "pseudocode": "rounding_mode ← imm8[2:0]\nsuppress_inexact ← imm8[3]\nfor i in 0..1:\n  f64 ← src[i*64+63:i*64]\n  if (rounding_mode == 0):  /* round to nearest */\n    result ← round_nearest(f64)\n  elif (rounding_mode == 1):  /* round down */\n    result ← round_down(f64)\n  elif (rounding_mode == 2):  /* round up */\n    result ← round_up(f64)\n  elif (rounding_mode == 3):  /* truncate */\n    result ← truncate(f64)\n  dest[i*64+63:i*64] ← result", "example": "ROUNDPD xmm1, xmm2/m128, 3"}
{"mnemonic": "pcmpeqq", "architecture": "x86", "full_name": "Packed Compare Equal Quadword", "summary": "Checks if 64-bit integer elements are equal.", "syntax": "PCMPEQQ xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 29", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 29", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed 64-bit signed integer elements in the destination and source operands for equality, setting all bits to 1 in the corresponding 64-bit result element if equal, or 0 if not equal. No CPU flags are affected; this is a SSE4.1 instruction available in 64-bit and protected modes.", "pseudocode": "for i in 0..1:\n  if (dest[i*64+63:i*64] == src[i*64+63:i*64]):\n    dest[i*64+63:i*64] ← 0xFFFFFFFFFFFFFFFF\n  else:\n    dest[i*64+63:i*64] ← 0x0000000000000000", "example": "PCMPEQQ xmm1, xmm2/m128"}
{"mnemonic": "pcmpestri", "architecture": "x86", "full_name": "Packed Compare Explicit Length Strings, Return Index", "summary": "Complex string search/compare; returns index in ECX.", "syntax": "PCMPESTRI xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE4.2", "hex_opcode": "66 0F 3A 61", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 61", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs explicit-length packed string comparison between two 128-bit operands using element size and comparison operation encoded in imm8, returning the index of the first match (or mismatch, depending on control bits) in ECX and setting CF and ZF flags. The lengths of the strings are provided implicitly in EAX and EDX; this is a SSE4.2 instruction that can serialize the pipeline and is available in 64-bit and protected modes.", "pseudocode": "pcmp_control ← imm8[2:0]\nstring_type ← imm8[5:4]\npolarity ← imm8[7:6]\nlen1 ← EAX & 0xFFFF\nlen2 ← EDX & 0xFFFF\nintres ← perform_string_compare(dest, src, string_type, pcmp_control, len1, len2)\nECX ← intres\nCF ← (intres < string_length)\nZF ← (intres == string_length)\nSF ← OF ← undefined", "example": "PCMPESTRI xmm1, xmm2/m128, 3"}
{"mnemonic": "pcmpestrm", "architecture": "x86", "full_name": "Packed Compare Explicit Length Strings, Return Mask", "summary": "Complex string search/compare; returns mask in XMM0.", "syntax": "PCMPESTRM xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE4.2", "hex_opcode": "66 0F 3A 60", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 60", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs explicit-length packed string comparison between two 128-bit operands using element size and comparison operation encoded in imm8, returning a 128-bit mask of comparison results in XMM0 and setting CF and ZF flags. The string lengths are provided implicitly in EAX and EDX; this is a SSE4.2 instruction that can serialize the pipeline and is available in 64-bit and protected modes.", "pseudocode": "pcmp_control ← imm8[2:0]\nstring_type ← imm8[5:4]\npolarity ← imm8[7:6]\nlen1 ← EAX & 0xFFFF\nlen2 ← EDX & 0xFFFF\nmask ← perform_string_compare_mask(dest, src, string_type, pcmp_control, len1, len2)\nXMM0 ← mask\nCF ← (any_match_found)\nZF ← (all_matches_found)\nSF ← OF ← undefined", "example": "PCMPESTRM xmm1, xmm2/m128, 3"}
{"mnemonic": "pcmpistri", "architecture": "x86", "full_name": "Packed Compare Implicit Length Strings, Return Index", "summary": "String search (null-terminated); returns index in ECX.", "syntax": "PCMPISTRI xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE4.2", "hex_opcode": "66 0F 3A 63", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 63", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs implicit-length (null-terminated) packed string comparison between two 128-bit operands using element size and comparison operation encoded in imm8, returning the index of the first match in ECX and setting CF and ZF flags. String lengths are determined by scanning for zero terminators; this is a SSE4.2 instruction that can serialize the pipeline and is available in 64-bit and protected modes.", "pseudocode": "pcmp_control ← imm8[2:0]\nstring_type ← imm8[5:4]\npolarity ← imm8[7:6]\nlen1 ← scan_for_null(dest, string_type)\nlen2 ← scan_for_null(src, string_type)\nintres ← perform_string_compare(dest, src, string_type, pcmp_control, len1, len2)\nECX ← intres\nCF ← (intres < max_length)\nZF ← (intres == max_length)\nSF ← OF ← undefined", "example": "PCMPISTRI xmm1, xmm2/m128, 3"}
{"mnemonic": "vfmadd132ss", "architecture": "x86", "full_name": "Fused Multiply-Add Scalar Single (132)", "summary": "Scalar FMA: Dest = (Dest * Src2) + Src1.", "syntax": "VFMADD132SS xmm1, xmm2, xmm3/m32", "encoding": {"format": "FMA3", "hex_opcode": "VEX.LIG.66.0F38.W0 99 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "FMA3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs a scalar fused multiply-add of three operands using VEX encoding: computes (Dest * Src2) + Src1 and stores the result in Dest with only the lower 32-bit scalar single-precision element affected while preserving upper 96 bits. The operand order '132' indicates destination is the first operand, first source is the second register operand, and second source is the third operand. No CPU flags are modified; this is a FMA3 instruction available in 64-bit mode on processors supporting the FMA3 extension.", "pseudocode": "temp_f32 ← (dest[31:0] * src2[31:0]) + src1[31:0]\ndest[31:0] ← temp_f32\n/* dest[127:32] unchanged */", "example": "VFMADD132SS xmm1, xmm2, xmm3/m32"}
{"mnemonic": "vfmadd213ss", "architecture": "x86", "full_name": "Fused Multiply-Add Scalar Single (213)", "summary": "Scalar FMA: Dest = (Src1 * Dest) + Src2.", "syntax": "VFMADD213SS xmm1, xmm2, xmm3/m32", "encoding": {"format": "FMA3", "hex_opcode": "VEX.LIG.66.0F38.W0 A9 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "FMA3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Fused multiply-add scalar single: performs (Src1 * Dest) + Src2, storing the result in Dest with a single rounding step. Only the lowest 32-bit float element is operated on; upper 96 bits of Dest are preserved. No EFLAGS are modified; rounding is controlled by MXCSR.", "pseudocode": "Dest[0..31] ← FMA(Src1[0..31] * Dest[0..31] + Src2[0..31])\nDest[32..127] ← unchanged", "example": "VFMADD213SS xmm1, xmm2, xmm3/m32"}
{"mnemonic": "vfmadd231ss", "architecture": "x86", "full_name": "Fused Multiply-Add Scalar Single (231)", "summary": "Scalar FMA: Dest = (Src1 * Src2) + Dest.", "syntax": "VFMADD231SS xmm1, xmm2, xmm3/m32", "encoding": {"format": "FMA3", "hex_opcode": "VEX.LIG.66.0F38.W0 B9 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "FMA3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Fused multiply-add scalar single: performs (Src1 * Src2) + Dest, storing the result in Dest with a single rounding step. Only the lowest 32-bit float element is operated on; upper 96 bits of Dest are preserved. No EFLAGS are modified; rounding is controlled by MXCSR.", "pseudocode": "Dest[0..31] ← FMA(Src1[0..31] * Src2[0..31] + Dest[0..31])\nDest[32..127] ← unchanged", "example": "VFMADD231SS xmm1, xmm2, xmm3/m32"}
{"mnemonic": "vpermilps", "architecture": "x86", "full_name": "Permute In-Lane Packed Single", "summary": "Shuffles floats within 128-bit lanes (AVX).", "syntax": "VPERMILPS ymm1, ymm2/m256, imm8", "encoding": {"format": "AVX", "hex_opcode": "VEX.256.66.0F3A.W0 04 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2/m256", "desc": "256-bit YMM AVX register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Permutes 32-bit float elements within 128-bit lanes independently using an 8-bit immediate, allowing shuffles within the lower and upper halves of a 256-bit register. No EFLAGS are affected. The immediate encoding selects 2-bit indices per float element.", "pseudocode": "for each 128-bit lane L in 0..1:\n  for each 32-bit element i in 0..3:\n    idx ← (Src1[L*128 + i*2 + 1 : L*128 + i*2]) & 0x3\n    Dest[L*128 + i*32 : L*128 + i*32 + 31] ← Src1[L*128 + idx*32 : L*128 + idx*32 + 31]", "example": "VPERMILPS ymm1, ymm2/m256, 3"}
{"mnemonic": "vpermilpd", "architecture": "x86", "full_name": "Permute In-Lane Packed Double", "summary": "Shuffles doubles within 128-bit lanes (AVX).", "syntax": "VPERMILPD ymm1, ymm2/m256, imm8", "encoding": {"format": "AVX", "hex_opcode": "VEX.256.66.0F3A.W0 05 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2/m256", "desc": "256-bit YMM AVX register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Permutes 64-bit double elements within 128-bit lanes independently using an 8-bit immediate, allowing shuffles within the lower and upper halves of a 256-bit register. No EFLAGS are affected. The immediate encoding selects 1-bit indices per double element.", "pseudocode": "for each 128-bit lane L in 0..1:\n  for each 64-bit element i in 0..1:\n    idx ← (Src1[L*128 + i]) & 0x1\n    Dest[L*128 + i*64 : L*128 + i*64 + 63] ← Src1[L*128 + idx*64 : L*128 + idx*64 + 63]", "example": "VPERMILPD ymm1, ymm2/m256, 3"}
{"mnemonic": "vbroadcastss", "architecture": "x86", "full_name": "Broadcast Scalar Single", "summary": "Loads one float and replicates it to all YMM elements.", "syntax": "VBROADCASTSS ymm1, m32", "encoding": {"format": "AVX", "hex_opcode": "VEX.256.66.0F38.W0 18 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src", "type": "m32", "desc": "32-bit memory operand"}], "description": "Loads a single 32-bit float from memory and replicates it to all eight 32-bit elements in a 256-bit YMM register. No EFLAGS are modified. Requires AVX support.", "pseudocode": "value ← [Src]\nfor i ← 0 to 7:\n  Dest[i*32 : i*32 + 31] ← value", "example": "VBROADCASTSS ymm1, [rbp-4]"}
{"mnemonic": "vpbroadcastd", "architecture": "x86", "full_name": "Broadcast Doubleword", "summary": "Loads one integer and replicates it to all YMM elements.", "syntax": "VPBROADCASTD ymm1, xmm2/m32", "encoding": {"format": "AVX2", "hex_opcode": "VEX.256.66.0F38.W0 58 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Loads a single 32-bit integer from a register or memory and replicates it to all eight 32-bit elements in a 256-bit YMM register. No EFLAGS are modified. Requires AVX2 support.", "pseudocode": "if Src is xmm register:\n  value ← Src[0..31]\nelse (Src is m32):\n  value ← [Src]\nfor i ← 0 to 7:\n  Dest[i*32 : i*32 + 31] ← value", "example": "VPBROADCASTD ymm1, xmm2/m32"}
{"mnemonic": "pclmulqdq", "architecture": "x86", "full_name": "Carry-Less Multiplication", "summary": "Performs carry-less multiplication (Galois Field math for AES-GCM).", "syntax": "PCLMULQDQ xmm1, xmm2/m128, imm8", "encoding": {"format": "PCLMUL", "hex_opcode": "66 0F 3A 44", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 44", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "PCLMULQDQ", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs carry-less multiplication of two 64-bit operands extracted from 128-bit XMM operands, producing a 128-bit result. Used in Galois/Counter Mode (GCM) for AES authentication. No EFLAGS are modified. The immediate selects which 64-bit halves of the operands participate.", "pseudocode": "if Imm[0] == 0:\n  a ← Src1[0..63]\nelse:\n  a ← Src1[64..127]\nif Imm[4] == 0:\n  b ← Src2[0..63]\nelse:\n  b ← Src2[64..127]\nDest ← GF_multiply(a, b)  // Carry-less multiplication in GF(2^64), result fits in 128 bits", "example": "PCLMULQDQ xmm1, xmm2/m128, 3"}
{"mnemonic": "crc32", "architecture": "x86", "full_name": "Accumulate CRC32 Value", "summary": "Accumulates CRC32C value using polynomial 0x11EDC6F41.", "syntax": "CRC32 r32, r/m", "encoding": {"format": "SSE4.2", "hex_opcode": "F2 0F 38 F1", "visual_parts": [], "binary_pattern": "F2 | 0F | 38 | F1", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.2", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Accumulates a CRC32C checksum using the Castagnoli polynomial (0x11EDC6F41) into the destination register. The source operand size (8/16/32/64-bit) determines the operation width; destination is zero-extended to full register width. No EFLAGS are modified. Requires SSE4.2.", "pseudocode": "if Src is 8-bit:\n  Dest[0..31] ← CRC32C(Dest[0..31], [Src])\n  Dest[32..63] ← 0 (if 64-bit destination)\nelse if Src is 16-bit:\n  Dest[0..31] ← CRC32C(Dest[0..31], [Src])\n  Dest[32..63] ← 0 (if 64-bit destination)\nelse if Src is 32-bit:\n  Dest[0..31] ← CRC32C(Dest[0..31], [Src])\n  Dest[32..63] ← 0 (if 64-bit destination)\nelse if Src is 64-bit:\n  Dest ← CRC32C(Dest, [Src])", "example": "CRC32 eax, rbx"}
{"mnemonic": "cvtsq2ss", "architecture": "x86", "full_name": "Convert Signed Quadword Integer to Scalar Single-Precision", "summary": "Converts 64-bit integer to float.", "syntax": "CVTSQ2SS xmm1, r/m64", "encoding": {"format": "SSE", "hex_opcode": "F3 REX.W 0F 2A /r", "visual_parts": [], "binary_pattern": "F3 | 0F | 2A", "bit_positions": "+0 | +1 | +2"}, "extension": "Base (64-bit)", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "r/m64", "desc": "64-bit register or memory"}], "description": "Converts a signed 64-bit integer to a single-precision floating-point value and stores it in the low 32 bits of the destination XMM register; the upper 96 bits are zeroed. The conversion uses the current rounding mode from MXCSR. This instruction is only available in 64-bit mode and sets no flags.", "pseudocode": "dest[31:0] ← ConvertInt64ToSinglePrecision(src);\ndest[127:32] ← 0;", "example": "CVTSQ2SS xmm1, rbx"}
{"mnemonic": "cvtsq2sd", "architecture": "x86", "full_name": "Convert Signed Quadword Integer to Scalar Double-Precision", "summary": "Converts 64-bit integer to double.", "syntax": "CVTSQ2SD xmm1, r/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 REX.W 0F 2A /r", "visual_parts": [], "binary_pattern": "F2 | 0F | 2A", "bit_positions": "+0 | +1 | +2"}, "extension": "Base (64-bit)", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "r/m64", "desc": "64-bit register or memory"}], "description": "Converts a signed 64-bit integer to a double-precision floating-point value and stores it in the low 64 bits of the destination XMM register; the upper 64 bits are zeroed. The conversion uses the current rounding mode from MXCSR. This instruction is only available in 64-bit mode and sets no flags.", "pseudocode": "dest[63:0] ← ConvertInt64ToDoublePrecision(src);\ndest[127:64] ← 0;", "example": "CVTSQ2SD xmm1, rbx"}
{"mnemonic": "cvtss2sq", "architecture": "x86", "full_name": "Convert Scalar Single-Precision to Signed Quadword Integer", "summary": "Converts float to 64-bit integer (Rounded).", "syntax": "CVTSS2SQ r64, xmm/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 REX.W 0F 2D /r", "visual_parts": [], "binary_pattern": "F3 | 0F | 2D", "bit_positions": "+0 | +1 | +2"}, "extension": "Base (64-bit)", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}, {"name": "src", "type": "xmm/m32", "desc": "128-bit XMM register or 32-bit memory"}], "description": "Converts the low 32-bit single-precision floating-point value from the source XMM register or memory to a signed 64-bit integer, using the current rounding mode from MXCSR. The result is stored in the destination 64-bit general-purpose register. This instruction is only available in 64-bit mode and sets no flags.", "pseudocode": "dest ← ConvertSinglePrecisionToInt64(src[31:0]);", "example": "CVTSS2SQ rax, xmm1"}
{"mnemonic": "cvtsd2sq", "architecture": "x86", "full_name": "Convert Scalar Double-Precision to Signed Quadword Integer", "summary": "Converts double to 64-bit integer (Rounded).", "syntax": "CVTSD2SQ r64, xmm/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 REX.W 0F 2D /r", "visual_parts": [], "binary_pattern": "F2 | 0F | 2D", "bit_positions": "+0 | +1 | +2"}, "extension": "Base (64-bit)", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}, {"name": "src", "type": "xmm/m64", "desc": "128-bit XMM register or 64-bit memory"}], "description": "Converts the low 64-bit double-precision floating-point value from the source XMM register or memory to a signed 64-bit integer, using the current rounding mode from MXCSR. The result is stored in the destination 64-bit general-purpose register. This instruction is only available in 64-bit mode and sets no flags.", "pseudocode": "dest ← ConvertDoublePrecisionToInt64(src[63:0]);", "example": "CVTSD2SQ rax, xmm1"}
{"mnemonic": "cvttss2sq", "architecture": "x86", "full_name": "Convert with Truncation Scalar Single-Precision to Signed Quadword Integer", "summary": "Converts float to 64-bit integer (Truncated).", "syntax": "CVTTSS2SQ r64, xmm/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 REX.W 0F 2C /r", "visual_parts": [], "binary_pattern": "F3 | 0F | 2C", "bit_positions": "+0 | +1 | +2"}, "extension": "Base (64-bit)", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}, {"name": "src", "type": "xmm/m32", "desc": "128-bit XMM register or 32-bit memory"}], "description": "Converts the low 32-bit single-precision floating-point value from the source XMM register or memory to a signed 64-bit integer by truncating toward zero (ignoring MXCSR rounding mode). The result is stored in the destination 64-bit general-purpose register. This instruction is only available in 64-bit mode and sets no flags.", "pseudocode": "dest ← TruncateSinglePrecisionToInt64(src[31:0]);", "example": "CVTTSS2SQ rax, xmm1"}
{"mnemonic": "cvttsd2sq", "architecture": "x86", "full_name": "Convert with Truncation Scalar Double-Precision to Signed Quadword Integer", "summary": "Converts double to 64-bit integer (Truncated).", "syntax": "CVTTSD2SQ r64, xmm/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 REX.W 0F 2C /r", "visual_parts": [], "binary_pattern": "F2 | 0F | 2C", "bit_positions": "+0 | +1 | +2"}, "extension": "Base (64-bit)", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}, {"name": "src", "type": "xmm/m64", "desc": "128-bit XMM register or 64-bit memory"}], "description": "Converts the low 64-bit double-precision floating-point value from the source XMM register or memory to a signed 64-bit integer by truncating toward zero (ignoring MXCSR rounding mode). The result is stored in the destination 64-bit general-purpose register. This instruction is only available in 64-bit mode and sets no flags.", "pseudocode": "dest ← TruncateDoublePrecisionToInt64(src[63:0]);", "example": "CVTTSD2SQ rax, xmm1"}
{"mnemonic": "haddpd", "architecture": "x86", "full_name": "Horizontal Add Packed Double-Precision", "summary": "Adds adjacent double-precision elements horizontally.", "syntax": "HADDPD xmm1, xmm2/m128", "encoding": {"format": "SSE3", "hex_opcode": "66 0F 7C", "visual_parts": [], "binary_pattern": "66 | 0F | 7C", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Horizontally adds adjacent pairs of double-precision floating-point elements: the first destination element is the sum of the two low double elements, and the second destination element is the sum of the two high double elements. The source operand may be an XMM register or 128-bit memory. No flags are modified.", "pseudocode": "dest[63:0] ← dest[63:0] + dest[127:64];\ndest[127:64] ← src[63:0] + src[127:64];", "example": "HADDPD xmm1, xmm2/m128"}
{"mnemonic": "hsubps", "architecture": "x86", "full_name": "Horizontal Subtract Packed Single-Precision", "summary": "Subtracts adjacent single-precision elements horizontally.", "syntax": "HSUBPS xmm1, xmm2/m128", "encoding": {"format": "SSE3", "hex_opcode": "F2 0F 7D", "visual_parts": [], "binary_pattern": "F2 | 0F | 7D", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Horizontally subtracts adjacent pairs of single-precision floating-point elements: the first destination element is the difference of the two low single elements, and the second destination element is the difference of the two high single elements. The source operand may be an XMM register or 128-bit memory. No flags are modified.", "pseudocode": "dest[31:0] ← dest[31:0] - dest[63:32];\ndest[63:32] ← dest[95:64] - dest[127:96];\ndest[95:64] ← src[31:0] - src[63:32];\ndest[127:96] ← src[95:64] - src[127:96];", "example": "HSUBPS xmm1, xmm2/m128"}
{"mnemonic": "hsubpd", "architecture": "x86", "full_name": "Horizontal Subtract Packed Double-Precision", "summary": "Subtracts adjacent double-precision elements horizontally.", "syntax": "HSUBPD xmm1, xmm2/m128", "encoding": {"format": "SSE3", "hex_opcode": "66 0F 7D", "visual_parts": [], "binary_pattern": "66 | 0F | 7D", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs horizontal subtraction of adjacent pairs of double-precision floating-point values in the source and destination XMM registers, storing results in the destination. Specifically, it subtracts the upper element from the lower element of each 128-bit lane (result[63:0] = dest[63:0] - dest[127:64]; result[127:64] = src[63:0] - src[127:64]). All floating-point exception flags may be set based on the operation; no integer flags are affected. This is an SSE3 instruction operating exclusively on 128-bit XMM registers.", "pseudocode": "dest[63:0] ← dest[63:0] - dest[127:64];\ndest[127:64] ← src[63:0] - src[127:64];", "example": "HSUBPD xmm1, xmm2/m128"}
{"mnemonic": "addsubpd", "architecture": "x86", "full_name": "Packed Double-FP Add/Subtract", "summary": "Adds odd elements, subtracts even elements (Double).", "syntax": "ADDSUBPD xmm1, xmm2/m128", "encoding": {"format": "SSE3", "hex_opcode": "66 0F D0", "visual_parts": [], "binary_pattern": "66 | 0F | D0", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE3", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs lane-wise alternating addition and subtraction on packed double-precision floating-point values: even-indexed elements (0, 2, ...) are subtracted, odd-indexed elements (1, 3, ...) are added. The operation is (dest[63:0] - src[63:0]) in the low qword and (dest[127:64] + src[127:64]) in the high qword. All floating-point exception flags may be set; no integer flags are affected. This is an SSE3 instruction operating on 128-bit XMM registers.", "pseudocode": "dest[63:0] ← dest[63:0] - src[63:0];\ndest[127:64] ← dest[127:64] + src[127:64];", "example": "ADDSUBPD xmm1, xmm2/m128"}
{"mnemonic": "vpermi2q", "architecture": "x86", "full_name": "Permute Two-Source Quadwords", "summary": "Shuffles quadwords from two ZMM registers into destination.", "syntax": "VPERMI2Q zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 76 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 76", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Performs a two-source permutation of 64-bit quadwords using indices from the destination register (zmm1), which acts as the index/control vector. Each 6-bit index in zmm1 selects a quadword from either zmm2 (index 0-7) or zmm3 (index 8-15), with the selected element placed into the corresponding position in the destination. The instruction supports AVX-512F masking via the k1 opmask register and operates on 512-bit ZMM registers. Memory operands are supported for zmm3/m512.", "pseudocode": "for i = 0 to 7 {\n  idx ← zmm1[i*64+5:i*64];\n  if idx[3] == 0:\n    zmm1[i*64+63:i*64] ← zmm2[idx[2:0]*64+63:idx[2:0]*64];\n  else:\n    zmm1[i*64+63:i*64] ← zmm3[(idx[2:0])*64+63:(idx[2:0])*64];\n}", "example": "VPERMI2Q zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpermt2q", "architecture": "x86", "full_name": "Permute Two-Source Quadwords (Overwrite)", "summary": "Shuffles 2 sources, overwriting the index register (Quadword).", "syntax": "VPERMT2Q zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 7E /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 7F", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Performs a two-source permutation of 64-bit quadwords using indices from the second source register (zmm2), which acts as the control vector. Each 6-bit index in zmm2 selects a quadword from either zmm1 (index 0-7) or zmm3 (index 8-15), and the result is stored in the destination (zmm1), overwriting the original source data. The instruction supports AVX-512F masking via the k1 opmask register and operates on 512-bit ZMM registers. Memory operands are supported for zmm3/m512.", "pseudocode": "temp ← zmm1;\nfor i = 0 to 7 {\n  idx ← zmm2[i*64+5:i*64];\n  if idx[3] == 0:\n    zmm1[i*64+63:i*64] ← temp[idx[2:0]*64+63:idx[2:0]*64];\n  else:\n    zmm1[i*64+63:i*64] ← zmm3[(idx[2:0])*64+63:(idx[2:0])*64];\n}", "example": "VPERMT2Q zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpsllvd", "architecture": "x86", "full_name": "Variable Bit Shift Left Logical Doubleword", "summary": "Shifts doublewords left by individual counts.", "syntax": "VPSLLVD ymm1, ymm2, ymm3/m256", "encoding": {"format": "AVX2", "hex_opcode": "VEX.256.66.0F38.W0 47 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Performs variable left logical bit shift on packed 32-bit doublewords, where each element is shifted by the corresponding count value from the third operand (bits 4:0 of each 32-bit element determine the shift amount, max 31 bits). Bits shifted out are lost; positions vacated are filled with zeros. The instruction operates on 256-bit YMM registers with AVX2 encoding and does not affect any integer flags.", "pseudocode": "for i = 0 to 7 {\n  shift_amt ← ymm3[i*32+4:i*32];\n  if shift_amt > 31:\n    ymm1[i*32+31:i*32] ← 0;\n  else:\n    ymm1[i*32+31:i*32] ← ymm2[i*32+31:i*32] << shift_amt;\n}", "example": "VPSLLVD ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vpsllvq", "architecture": "x86", "full_name": "Variable Bit Shift Left Logical Quadword", "summary": "Shifts quadwords left by individual counts.", "syntax": "VPSLLVQ ymm1, ymm2, ymm3/m256", "encoding": {"format": "AVX2", "hex_opcode": "VEX.256.66.0F38.W1 47 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Performs variable left logical bit shift on packed 64-bit quadwords, where each element is shifted by the corresponding count value from the third operand (bits 5:0 of each 64-bit element determine the shift amount, max 63 bits). Bits shifted out are lost; positions vacated are filled with zeros. The instruction operates on 256-bit YMM registers with AVX2 encoding and does not affect any integer flags.", "pseudocode": "for i = 0 to 3 {\n  shift_amt ← ymm3[i*64+5:i*64];\n  if shift_amt > 63:\n    ymm1[i*64+63:i*64] ← 0;\n  else:\n    ymm1[i*64+63:i*64] ← ymm2[i*64+63:i*64] << shift_amt;\n}", "example": "VPSLLVQ ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vpsravd", "architecture": "x86", "full_name": "Variable Bit Shift Right Arithmetic Doubleword", "summary": "Shifts doublewords right arithmetic by individual counts.", "syntax": "VPSRAVD ymm1, ymm2, ymm3/m256", "encoding": {"format": "AVX2", "hex_opcode": "VEX.256.66.0F38.W0 46 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Performs variable arithmetic right shift on packed 32-bit signed doublewords, where each element is shifted by the corresponding count value from the third operand (bits 4:0 of each 32-bit element determine the shift amount, max 31 bits). The sign bit is replicated into vacated positions. The instruction operates on 256-bit YMM registers with AVX2 encoding and does not affect any integer flags.", "pseudocode": "for i = 0 to 7 {\n  shift_amt ← ymm3[i*32+4:i*32];\n  if shift_amt > 31:\n    if ymm2[i*32+31] == 1:\n      ymm1[i*32+31:i*32] ← -1;\n    else:\n      ymm1[i*32+31:i*32] ← 0;\n  else:\n    ymm1[i*32+31:i*32] ← (signed) ymm2[i*32+31:i*32] >> shift_amt;\n}", "example": "VPSRAVD ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vpsravq", "architecture": "x86", "full_name": "Variable Bit Shift Right Arithmetic Quadword", "summary": "Shifts quadwords right arithmetic by individual counts.", "syntax": "VPSRAVQ zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 46 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 46", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Performs variable arithmetic right shift on packed 64-bit signed quadwords, where each element is shifted by the corresponding count value from the third operand (bits 5:0 of each 64-bit element determine the shift amount, max 63 bits). The sign bit is replicated into vacated positions. The instruction supports AVX-512F masking via the k1 opmask register and operates on 512-bit ZMM registers. Memory operands are supported for zmm3/m512; no integer flags are affected.", "pseudocode": "for i = 0 to 7 {\n  shift_amt ← zmm2[i*64+5:i*64];\n  if shift_amt > 63:\n    if zmm2[i*64+63] == 1:\n      zmm1[i*64+63:i*64] ← -1;\n    else:\n      zmm1[i*64+63:i*64] ← 0;\n  else:\n    zmm1[i*64+63:i*64] ← (signed) zmm2[i*64+63:i*64] >> shift_amt;\n}", "example": "VPSRAVQ zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpsrlvd", "architecture": "x86", "full_name": "Variable Bit Shift Right Logical Doubleword", "summary": "Shifts doublewords right logical by individual counts.", "syntax": "VPSRLVD ymm1, ymm2, ymm3/m256", "encoding": {"format": "AVX2", "hex_opcode": "VEX.256.66.0F38.W0 45 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Performs variable logical right shifts on packed 32-bit doublewords in the first source operand (ymm2) by the amounts specified in the corresponding doubleword elements of the second source operand (ymm3/m256), storing results in the destination (ymm1). Each doubleword is shifted independently; shift amounts > 31 produce zero. No flags are affected; this is an AVX2 instruction available in 256-bit form.", "pseudocode": "for i in 0 to 7:\n  shift_amount = src2[i*32 : i*32+31]\n  if shift_amount > 31:\n    dest[i*32 : i*32+31] = 0\n  else:\n    dest[i*32 : i*32+31] = src1[i*32 : i*32+31] >> shift_amount", "example": "VPSRLVD ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vpsrlvq", "architecture": "x86", "full_name": "Variable Bit Shift Right Logical Quadword", "summary": "Shifts quadwords right logical by individual counts.", "syntax": "VPSRLVQ ymm1, ymm2, ymm3/m256", "encoding": {"format": "AVX2", "hex_opcode": "VEX.256.66.0F38.W1 45 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Performs variable logical right shifts on packed 64-bit quadwords in the first source operand (ymm2) by the amounts specified in the corresponding quadword elements of the second source operand (ymm3/m256), storing results in the destination (ymm1). Each quadword is shifted independently; shift amounts > 63 produce zero. No flags are affected; this is an AVX2 instruction available in 256-bit form.", "pseudocode": "for i in 0 to 3:\n  shift_amount = src2[i*64 : i*64+63]\n  if shift_amount > 63:\n    dest[i*64 : i*64+63] = 0\n  else:\n    dest[i*64 : i*64+63] = src1[i*64 : i*64+63] >> shift_amount", "example": "VPSRLVQ ymm1, ymm2, ymm3/m256"}
{"mnemonic": "pminsb", "architecture": "x86", "full_name": "Minimum of Packed Signed Byte Integers", "summary": "Returns minimum of signed bytes.", "syntax": "PMINSB xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 38", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 38", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed signed byte integers in the destination operand (xmm1) with those in the source operand (xmm2/m128) and stores the minimum of each pair in the destination. Each of the 16 bytes is compared independently as a signed 8-bit value. No flags are affected; this is an SSE4.1 instruction that operates on 128-bit XMM registers.", "pseudocode": "for i in 0 to 15:\n  byte_a = sign_extend(dest[i*8 : i*8+7])\n  byte_b = sign_extend(src[i*8 : i*8+7])\n  dest[i*8 : i*8+7] = (byte_a < byte_b) ? byte_a : byte_b", "example": "PMINSB xmm1, xmm2/m128"}
{"mnemonic": "pmaxsb", "architecture": "x86", "full_name": "Maximum of Packed Signed Byte Integers", "summary": "Returns maximum of signed bytes.", "syntax": "PMAXSB xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 3C", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 3C", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed signed byte integers in the destination operand (xmm1) with those in the source operand (xmm2/m128) and stores the maximum of each pair in the destination. Each of the 16 bytes is compared independently as a signed 8-bit value. No flags are affected; this is an SSE4.1 instruction that operates on 128-bit XMM registers.", "pseudocode": "for i in 0 to 15:\n  byte_a = sign_extend(dest[i*8 : i*8+7])\n  byte_b = sign_extend(src[i*8 : i*8+7])\n  dest[i*8 : i*8+7] = (byte_a > byte_b) ? byte_a : byte_b", "example": "PMAXSB xmm1, xmm2/m128"}
{"mnemonic": "pminuw", "architecture": "x86", "full_name": "Minimum of Packed Unsigned Word Integers", "summary": "Returns minimum of unsigned words.", "syntax": "PMINUW xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 3A", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 3A", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed unsigned word integers in the destination operand (xmm1) with those in the source operand (xmm2/m128) and stores the minimum of each pair in the destination. Each of the 8 words is compared independently as an unsigned 16-bit value. No flags are affected; this is an SSE4.1 instruction that operates on 128-bit XMM registers.", "pseudocode": "for i in 0 to 7:\n  word_a = dest[i*16 : i*16+15]\n  word_b = src[i*16 : i*16+15]\n  dest[i*16 : i*16+15] = (word_a < word_b) ? word_a : word_b", "example": "PMINUW xmm1, xmm2/m128"}
{"mnemonic": "pmaxuw", "architecture": "x86", "full_name": "Maximum of Packed Unsigned Word Integers", "summary": "Returns maximum of unsigned words.", "syntax": "PMAXUW xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 3E", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 3E", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed unsigned word integers in the destination operand (xmm1) with those in the source operand (xmm2/m128) and stores the maximum of each pair in the destination. Each of the 8 words is compared independently as an unsigned 16-bit value. No flags are affected; this is an SSE4.1 instruction that operates on 128-bit XMM registers.", "pseudocode": "for i in 0 to 7:\n  word_a = dest[i*16 : i*16+15]\n  word_b = src[i*16 : i*16+15]\n  dest[i*16 : i*16+15] = (word_a > word_b) ? word_a : word_b", "example": "PMAXUW xmm1, xmm2/m128"}
{"mnemonic": "pminud", "architecture": "x86", "full_name": "Minimum of Packed Unsigned Doubleword Integers", "summary": "Returns minimum of unsigned doublewords.", "syntax": "PMINUD xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 3B", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 3B", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed unsigned doubleword integers in the destination operand (xmm1) with those in the source operand (xmm2/m128) and stores the minimum of each pair in the destination. Each of the 4 doublewords is compared independently as an unsigned 32-bit value. No flags are affected; this is an SSE4.1 instruction that operates on 128-bit XMM registers.", "pseudocode": "for i in 0 to 3:\n  dword_a = dest[i*32 : i*32+31]\n  dword_b = src[i*32 : i*32+31]\n  dest[i*32 : i*32+31] = (dword_a < dword_b) ? dword_a : dword_b", "example": "PMINUD xmm1, xmm2/m128"}
{"mnemonic": "pmaxud", "architecture": "x86", "full_name": "Maximum of Packed Unsigned Doubleword Integers", "summary": "Returns maximum of unsigned doublewords.", "syntax": "PMAXUD xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 3F", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 3F", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed unsigned doubleword integers in the destination operand (xmm1) with those in the source operand (xmm2/m128) and stores the maximum of each pair in the destination. Each of the 4 doublewords is compared independently as an unsigned 32-bit value. No flags are affected; this is an SSE4.1 instruction that operates on 128-bit XMM registers.", "pseudocode": "for i in 0 to 3:\n  dword_a = dest[i*32 : i*32+31]\n  dword_b = src[i*32 : i*32+31]\n  dest[i*32 : i*32+31] = (dword_a > dword_b) ? dword_a : dword_b", "example": "PMAXUD xmm1, xmm2/m128"}
{"mnemonic": "pminsd", "architecture": "x86", "full_name": "Minimum of Packed Signed Doubleword Integers", "summary": "Returns minimum of signed doublewords.", "syntax": "PMINSD xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 39", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 39", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed signed 32-bit integers in xmm1 with xmm2/m128 and writes the minimum of each pair to xmm1. This is a SIMD operation with no effect on the CPU flags. Available in SSE4.1 and later; operates on 128-bit XMM registers containing four 32-bit signed doublewords.", "pseudocode": "xmm1[127:96] ← (xmm1[127:96] < xmm2[127:96]) ? xmm1[127:96] : xmm2[127:96];\nxmm1[95:64] ← (xmm1[95:64] < xmm2[95:64]) ? xmm1[95:64] : xmm2[95:64];\nxmm1[63:32] ← (xmm1[63:32] < xmm2[63:32]) ? xmm1[63:32] : xmm2[63:32];\nxmm1[31:0] ← (xmm1[31:0] < xmm2[31:0]) ? xmm1[31:0] : xmm2[31:0];", "example": "PMINSD xmm1, xmm2/m128"}
{"mnemonic": "pmaxsd", "architecture": "x86", "full_name": "Maximum of Packed Signed Doubleword Integers", "summary": "Returns maximum of signed doublewords.", "syntax": "PMAXSD xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 3D", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 3D", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed signed 32-bit integers in xmm1 with xmm2/m128 and writes the maximum of each pair to xmm1. This is a SIMD operation with no effect on the CPU flags. Available in SSE4.1 and later; operates on 128-bit XMM registers containing four 32-bit signed doublewords.", "pseudocode": "xmm1[127:96] ← (xmm1[127:96] > xmm2[127:96]) ? xmm1[127:96] : xmm2[127:96];\nxmm1[95:64] ← (xmm1[95:64] > xmm2[95:64]) ? xmm1[95:64] : xmm2[95:64];\nxmm1[63:32] ← (xmm1[63:32] > xmm2[63:32]) ? xmm1[63:32] : xmm2[63:32];\nxmm1[31:0] ← (xmm1[31:0] > xmm2[31:0]) ? xmm1[31:0] : xmm2[31:0];", "example": "PMAXSD xmm1, xmm2/m128"}
{"mnemonic": "pinsrd", "architecture": "x86", "full_name": "Packed Insert Doubleword", "summary": "Inserts a doubleword from register to XMM.", "syntax": "PINSRD xmm1, r32/m32, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 22", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 22", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "r32/m32", "desc": "General-purpose register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Inserts a 32-bit doubleword from a general-purpose register or memory into an XMM register at the position specified by an 8-bit immediate index. The remaining XMM lanes are unchanged. Available in SSE4.1 and later; no flags are affected by this instruction.", "pseudocode": "index ← imm8[1:0];\ncase index of\n  0: xmm1[31:0] ← (r32/m32 is register) ? r32 : [r32/m32];\n  1: xmm1[63:32] ← (r32/m32 is register) ? r32 : [r32/m32];\n  2: xmm1[95:64] ← (r32/m32 is register) ? r32 : [r32/m32];\n  3: xmm1[127:96] ← (r32/m32 is register) ? r32 : [r32/m32];\nendcase;", "example": "PINSRD xmm1, r32/m32, 3"}
{"mnemonic": "pinsrq", "architecture": "x86", "full_name": "Packed Insert Quadword", "summary": "Inserts a quadword from register to XMM.", "syntax": "PINSRQ xmm1, r64/m64, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 REX.W 0F 3A 22 /r ib", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 22", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "r64/m64", "desc": "General-purpose register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Inserts a 64-bit quadword from a general-purpose register or memory into an XMM register at the position specified by an 8-bit immediate index. The other 64-bit lane remains unchanged. Available in SSE4.1 and later (64-bit mode only); no flags are affected by this instruction.", "pseudocode": "index ← imm8[0];\ncase index of\n  0: xmm1[63:0] ← (r64/m64 is register) ? r64 : [r64/m64];\n  1: xmm1[127:64] ← (r64/m64 is register) ? r64 : [r64/m64];\nendcase;", "example": "PINSRQ xmm1, r64/m64, 3"}
{"mnemonic": "pextrd", "architecture": "x86", "full_name": "Packed Extract Doubleword", "summary": "Extracts a doubleword from XMM to register.", "syntax": "PEXTRD r32/m32, xmm1, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 16", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 16", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "r32/m32", "desc": "General-purpose register or Memory operand"}, {"name": "src1", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Extracts a 32-bit doubleword from an XMM register at the position specified by an 8-bit immediate and writes it to a general-purpose register or memory. Zero-extends the extracted value when writing to a 32-bit register. Available in SSE4.1 and later; no flags are affected by this instruction.", "pseudocode": "index ← imm8[1:0];\ncase index of\n  0: value ← xmm1[31:0];\n  1: value ← xmm1[63:32];\n  2: value ← xmm1[95:64];\n  3: value ← xmm1[127:96];\nendcase;\nif (r32/m32 is register) then\n  r32 ← value;\nelse\n  [r32/m32] ← value;\nendif;", "example": "PEXTRD r32/m32, xmm1, 3"}
{"mnemonic": "pextrq", "architecture": "x86", "full_name": "Packed Extract Quadword", "summary": "Extracts a quadword from XMM to register.", "syntax": "PEXTRQ r64/m64, xmm1, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 REX.W 0F 3A 16 /r ib", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 16", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "r64/m64", "desc": "General-purpose register or Memory operand"}, {"name": "src1", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Extracts a 64-bit quadword from an XMM register at the position specified by an 8-bit immediate and writes it to a general-purpose register or memory. Available in SSE4.1 and later (64-bit mode only); no flags are affected by this instruction.", "pseudocode": "index ← imm8[0];\ncase index of\n  0: value ← xmm1[63:0];\n  1: value ← xmm1[127:64];\nendcase;\nif (r64/m64 is register) then\n  r64 ← value;\nelse\n  [r64/m64] ← value;\nendif;", "example": "PEXTRQ r64/m64, xmm1, 3"}
{"mnemonic": "movntdqa", "architecture": "x86", "full_name": "Load Double Quadword Non-Temporal Aligned", "summary": "Efficiently loads 128-bits from WC memory (Streaming Load).", "syntax": "MOVNTDQA xmm1, m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 2A", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 2A", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "m128", "desc": "128-bit memory operand"}], "description": "Loads 128 bits from write-combining (WC) memory into an XMM register using a non-temporal hint to minimize cache pollution. This instruction bypasses the normal cache coherency protocol and is optimized for streaming data loads. Available in SSE4.1 and later; no flags are affected. The memory address should be 16-byte aligned for best performance.", "pseudocode": "xmm1 ← [m128];", "example": "MOVNTDQA xmm1, [rbp-16]"}
{"mnemonic": "pcmpgtq", "architecture": "x86", "full_name": "Packed Compare Greater Than Quadword", "summary": "Compares quadwords for greater than (signed).", "syntax": "PCMPGTQ xmm1, xmm2/m128", "encoding": {"format": "SSE4.2", "hex_opcode": "66 0F 38 37", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 37", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed signed 64-bit integers in xmm1 with xmm2/m128 for greater-than, writing a mask (all-1s for true, all-0s for false) of each comparison to xmm1. This is a SIMD comparison with no effect on the CPU flags. Available in SSE4.2 and later; operates on 128-bit XMM registers containing two 64-bit signed quadwords.", "pseudocode": "xmm1[127:64] ← (xmm1[127:64] > xmm2[127:64]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000;\nxmm1[63:0] ← (xmm1[63:0] > xmm2[63:0]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000;", "example": "PCMPGTQ xmm1, xmm2/m128"}
{"mnemonic": "packusdw", "architecture": "x86", "full_name": "Pack with Unsigned Saturation Doubleword to Word", "summary": "Converts signed dwords to unsigned words with saturation.", "syntax": "PACKUSDW xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 2B", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 2B", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Packs four signed doublewords (32-bit) from each 128-bit operand into eight unsigned words (16-bit) with unsigned saturation, storing the result in the destination XMM register. Values outside the range [0, 65535] are saturated to the nearest boundary. No flags are affected.", "pseudocode": "dest[0:15] ← saturate_unsigned(src1[0:31], 0, 65535)\ndest[16:31] ← saturate_unsigned(src1[32:63], 0, 65535)\ndest[32:47] ← saturate_unsigned(src1[64:95], 0, 65535)\ndest[48:63] ← saturate_unsigned(src1[96:127], 0, 65535)\ndest[64:79] ← saturate_unsigned(src2[0:31], 0, 65535)\ndest[80:95] ← saturate_unsigned(src2[32:63], 0, 65535)\ndest[96:111] ← saturate_unsigned(src2[64:95], 0, 65535)\ndest[112:127] ← saturate_unsigned(src2[96:127], 0, 65535)", "example": "PACKUSDW xmm1, xmm2/m128"}
{"mnemonic": "sets", "architecture": "x86", "full_name": "Set Byte on Sign", "summary": "Sets byte to 1 if SF=1 (Negative).", "syntax": "SETS r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 98", "visual_parts": [], "binary_pattern": "0F | 98", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the Sign Flag (SF) is set (indicating a negative result from the previous operation), otherwise sets it to 0. No flags are affected by this instruction. Available in all x86/x64 modes.", "pseudocode": "if (SF == 1) {\n  dest ← 0xFF\n} else {\n  dest ← 0x00\n}", "example": "SETS bl"}
{"mnemonic": "setns", "architecture": "x86", "full_name": "Set Byte on Not Sign", "summary": "Sets byte to 1 if SF=0 (Positive).", "syntax": "SETNS r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 99", "visual_parts": [], "binary_pattern": "0F | 99", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the Sign Flag (SF) is clear (indicating a positive or zero result from the previous operation), otherwise sets it to 0. No flags are affected by this instruction. Available in all x86/x64 modes.", "pseudocode": "if (SF == 0) {\n  dest ← 0xFF\n} else {\n  dest ← 0x00\n}", "example": "SETNS bl"}
{"mnemonic": "setp", "architecture": "x86", "full_name": "Set Byte on Parity", "summary": "Sets byte to 1 if PF=1 (Even Parity).", "syntax": "SETP r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 9A", "visual_parts": [], "binary_pattern": "0F | 9A", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the Parity Flag (PF) is set (indicating an even number of 1-bits in the low byte of the result), otherwise sets it to 0. No flags are affected by this instruction. Available in all x86/x64 modes.", "pseudocode": "if (PF == 1) {\n  dest ← 0xFF\n} else {\n  dest ← 0x00\n}", "example": "SETP bl"}
{"mnemonic": "setnp", "architecture": "x86", "full_name": "Set Byte on Not Parity", "summary": "Sets byte to 1 if PF=0 (Odd Parity).", "syntax": "SETNP r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 9B", "visual_parts": [], "binary_pattern": "0F | 9B", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the Parity Flag (PF) is clear (indicating an odd number of 1-bits in the low byte of the result), otherwise sets it to 0. No flags are affected by this instruction. Available in all x86/x64 modes.", "pseudocode": "if (PF == 0) {\n  dest ← 0xFF\n} else {\n  dest ← 0x00\n}", "example": "SETNP bl"}
{"mnemonic": "setl", "architecture": "x86", "full_name": "Set Byte on Less", "summary": "Sets byte to 1 if SF!=OF.", "syntax": "SETL r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 9C", "visual_parts": [], "binary_pattern": "0F | 9C", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the previous signed comparison or arithmetic result indicates a less-than condition (SF ≠ OF), otherwise sets it to 0. No flags are affected by this instruction. Used after signed compare or arithmetic operations.", "pseudocode": "if (SF != OF) {\n  dest ← 0xFF\n} else {\n  dest ← 0x00\n}", "example": "SETL bl"}
{"mnemonic": "setle", "architecture": "x86", "full_name": "Set Byte on Less or Equal", "summary": "Sets byte to 1 if ZF=1 or SF!=OF.", "syntax": "SETLE r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 9E", "visual_parts": [], "binary_pattern": "0F | 9E", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the previous signed comparison or arithmetic result indicates a less-than-or-equal condition (ZF = 1 or SF ≠ OF), otherwise sets it to 0. No flags are affected by this instruction. Used after signed compare or arithmetic operations.", "pseudocode": "if ((ZF == 1) || (SF != OF)) {\n  dest ← 0xFF\n} else {\n  dest ← 0x00\n}", "example": "SETLE bl"}
{"mnemonic": "setg", "architecture": "x86", "full_name": "Set Byte on Greater", "summary": "Sets byte to 1 if ZF=0 and SF=OF.", "syntax": "SETG r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 9F", "visual_parts": [], "binary_pattern": "0F | 9F", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the previous signed comparison or arithmetic result indicates a greater-than condition (ZF = 0 and SF = OF), otherwise sets it to 0. No flags are affected by this instruction. Used after signed compare or arithmetic operations.", "pseudocode": "if ((ZF == 0) && (SF == OF)) {\n  dest ← 0xFF\n} else {\n  dest ← 0x00\n}", "example": "SETG bl"}
{"mnemonic": "setge", "architecture": "x86", "full_name": "Set Byte on Greater or Equal", "summary": "Sets byte to 1 if SF=OF.", "syntax": "SETGE r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 9D", "visual_parts": [], "binary_pattern": "0F | 9D", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the signed comparison condition is true (SF = OF, indicating greater-than-or-equal for signed integers), or to 0 otherwise. This instruction reads the SF and OF flags from EFLAGS and does not modify any flags. It operates only on 8-bit destinations in all modes.", "pseudocode": "dest ← (SF == OF) ? 1 : 0;", "example": "SETGE bl"}
{"mnemonic": "setb", "architecture": "x86", "full_name": "Set Byte on Below", "summary": "Sets byte to 1 if CF=1.", "syntax": "SETB r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 92", "visual_parts": [], "binary_pattern": "0F | 92", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the carry flag (CF) is set, indicating an unsigned borrow or carry condition, or to 0 otherwise. This instruction reads CF from EFLAGS and does not modify any flags. It operates only on 8-bit destinations in all modes.", "pseudocode": "dest ← CF ? 1 : 0;", "example": "SETB bl"}
{"mnemonic": "setbe", "architecture": "x86", "full_name": "Set Byte on Below or Equal", "summary": "Sets byte to 1 if CF=1 or ZF=1.", "syntax": "SETBE r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 96", "visual_parts": [], "binary_pattern": "0F | 96", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the unsigned comparison condition is true (CF = 1 or ZF = 1, indicating below-or-equal for unsigned integers), or to 0 otherwise. This instruction reads the CF and ZF flags from EFLAGS and does not modify any flags. It operates only on 8-bit destinations in all modes.", "pseudocode": "dest ← (CF || ZF) ? 1 : 0;", "example": "SETBE bl"}
{"mnemonic": "seta", "architecture": "x86", "full_name": "Set Byte on Above", "summary": "Sets byte to 1 if CF=0 and ZF=0.", "syntax": "SETA r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 97", "visual_parts": [], "binary_pattern": "0F | 97", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the unsigned comparison condition is true (CF = 0 and ZF = 0, indicating above for unsigned integers), or to 0 otherwise. This instruction reads the CF and ZF flags from EFLAGS and does not modify any flags. It operates only on 8-bit destinations in all modes.", "pseudocode": "dest ← (!CF && !ZF) ? 1 : 0;", "example": "SETA bl"}
{"mnemonic": "setae", "architecture": "x86", "full_name": "Set Byte on Above or Equal", "summary": "Sets byte to 1 if CF=0.", "syntax": "SETAE r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 93", "visual_parts": [], "binary_pattern": "0F | 93", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the carry flag (CF) is clear, indicating no unsigned borrow (above-or-equal for unsigned integers), or to 0 otherwise. This instruction reads CF from EFLAGS and does not modify any flags. It operates only on 8-bit destinations in all modes.", "pseudocode": "dest ← (!CF) ? 1 : 0;", "example": "SETAE bl"}
{"mnemonic": "kunpckwd", "architecture": "x86", "full_name": "Unpack and Interleave Masks Word to Doubleword", "summary": "Interleaves 16-bit masks into 32-bit mask.", "syntax": "KUNPCKWD k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.0F.W0 4B /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 4B", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Unpacks and interleaves two 16-bit mask registers into a 32-bit mask register, with src2 supplying the high 16 bits and src1 supplying the low 16 bits of the result. This instruction is part of AVX-512BW and operates only on opmask registers (k0-k7); it does not modify any EFLAGS flags. The opmask register k0 cannot be used as a write mask.", "pseudocode": "dest[15:0] ← src1[15:0]; dest[31:16] ← src2[15:0]; dest[63:32] ← 0;", "example": "KUNPCKWD k1, k2, k3"}
{"mnemonic": "kunpckdq", "architecture": "x86", "full_name": "Unpack and Interleave Masks Doubleword to Quadword", "summary": "Interleaves 32-bit masks into 64-bit mask.", "syntax": "KUNPCKDQ k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.0F.W1 4B /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 4B", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Unpacks and interleaves two 32-bit mask registers into a 64-bit mask register, with src2 supplying the high 32 bits and src1 supplying the low 32 bits of the result. This instruction is part of AVX-512BW and operates only on opmask registers (k0-k7); it does not modify any EFLAGS flags. The opmask register k0 cannot be used as a write mask.", "pseudocode": "dest[31:0] ← src1[31:0]; dest[63:32] ← src2[31:0];", "example": "KUNPCKDQ k1, k2, k3"}
{"mnemonic": "vpconflictq", "architecture": "x86", "full_name": "Detect Conflicts Within a Vector of Packed Quadword Values", "summary": "Detects duplicate values in a quadword vector.", "syntax": "VPCONFLICTQ zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 C4 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | C4", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512CD", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Detects conflicts (duplicate values) within a vector of 64-bit quadword values and writes a conflict mask to the destination; each element in the result contains a bitmask indicating which earlier elements in the source vector have the same value. This instruction is part of AVX-512CD, supports embedded masking via k1, and does not modify EFLAGS. Zeroing masking clears masked elements in the destination.", "pseudocode": "for i ← 0 to 7 do { dest[i*64+63:i*64] ← 0; for j ← 0 to i-1 do if src[i*64+63:i*64] == src[j*64+63:j*64] then dest[i*64+j] ← 1; } if k1_mask[i] == 0 and zeroing then dest[i*64+63:i*64] ← 0;", "example": "VPCONFLICTQ zmm1, zmm2/m512"}
{"mnemonic": "vplzcntq", "architecture": "x86", "full_name": "Count Leading Zero Bits Quadword", "summary": "Counts leading zeros for each quadword element.", "syntax": "VPLZCNTQ zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 44 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 44", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512CD", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Counts the number of leading zero bits in each 64-bit quadword element of the source operand and stores the results in the destination register. Operates element-wise on 8 quadwords (512-bit / 64-bit per element). The instruction does not modify CPU flags; it is a pure SIMD data-parallel operation with AVX-512 opmask support for conditional write-masking.", "pseudocode": "for i = 0 to 7:\n  src_qw = src2[64*i : 64*i+63]\n  dest[64*i : 64*i+63] ← count_leading_zeros_64(src_qw)", "example": "VPLZCNTQ zmm1, zmm2/m512"}
{"mnemonic": "vpermw", "architecture": "x86", "full_name": "Permute Word Integers", "summary": "Full permutation of 32 words using indices.", "syntax": "VPERMW zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 8D /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 8D", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Performs a full permutation of 32 word (16-bit) elements across the entire 512-bit register using indices from a second vector operand. The index operand specifies which source element to copy to each destination position. Supports AVX-512 opmask write-masking; does not affect CPU flags.", "pseudocode": "for i = 0 to 31:\n  index = src2[16*i : 16*i+15] & 0x1F\n  dest[16*i : 16*i+15] ← src1[16*index : 16*index+15]", "example": "VPERMW zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpermq", "architecture": "x86", "full_name": "Permute Quadword Integers", "summary": "Shuffles quadwords within 256-bit lanes using immediate.", "syntax": "VPERMQ ymm1, ymm2/m256, imm8", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F3A.W1 00 /r ib", "visual_parts": [], "binary_pattern": "VEX | 66 | 0F | 3A | 00", "bit_positions": "+0 | +3 | +4 | +5 | +6"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2/m256", "desc": "256-bit YMM AVX register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shuffles four 64-bit quadword elements within each 256-bit lane using a 2-bit immediate index for each element. The immediate controls the permutation pattern within the two halves of the 256-bit operand independently. Does not affect CPU flags; operates on 256-bit YMM registers under AVX2.", "pseudocode": "for i = 0 to 3:\n  index = (imm8 >> (2*i)) & 0x3\n  dest[64*i : 64*i+63] ← src[64*index : 64*index+63]", "example": "VPERMQ ymm1, ymm2/m256, 3"}
{"mnemonic": "vprolvq", "architecture": "x86", "full_name": "Rotate Left Quadword Variable", "summary": "Rotates quadwords left by amounts in second vector.", "syntax": "VPROLVQ zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 15 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 15", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Rotates each 64-bit quadword element in the first source left by the number of bits specified in the corresponding element of the second source operand. Operates on 8 quadwords in parallel; supports AVX-512 opmask write-masking. Does not modify CPU flags.", "pseudocode": "for i = 0 to 7:\n  value = src1[64*i : 64*i+63]\n  shift_count = src2[64*i : 64*i+63] & 0x3F\n  dest[64*i : 64*i+63] ← rotate_left_64(value, shift_count)", "example": "VPROLVQ zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vprorvd", "architecture": "x86", "full_name": "Rotate Right Doubleword Variable", "summary": "Rotates doublewords right by amounts in second vector.", "syntax": "VPRORVD zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 14 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 14", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Rotates each 32-bit doubleword element in the first source right by the number of bits specified in the corresponding element of the second source operand. Operates on 16 doublewords in parallel; supports AVX-512 opmask write-masking. Does not modify CPU flags.", "pseudocode": "for i = 0 to 15:\n  value = src1[32*i : 32*i+31]\n  shift_count = src2[32*i : 32*i+31] & 0x1F\n  dest[32*i : 32*i+31] ← rotate_right_32(value, shift_count)", "example": "VPRORVD zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vprorvq", "architecture": "x86", "full_name": "Rotate Right Quadword Variable", "summary": "Rotates quadwords right by amounts in second vector.", "syntax": "VPRORVQ zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 14 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 14", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Rotates each 64-bit quadword element in the first source right by the number of bits specified in the corresponding element of the second source operand. Operates on 8 quadwords in parallel; supports AVX-512 opmask write-masking. Does not modify CPU flags.", "pseudocode": "for i = 0 to 7:\n  value = src1[64*i : 64*i+63]\n  shift_count = src2[64*i : 64*i+63] & 0x3F\n  dest[64*i : 64*i+63] ← rotate_right_64(value, shift_count)", "example": "VPRORVQ zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpmovb2m", "architecture": "x86", "full_name": "Move Byte Mask to Mask Register", "summary": "Moves byte integer mask from ZMM to k-register.", "syntax": "VPMOVB2M k1, zmm1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F38.W0 29 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}], "description": "Extracts the most significant bit (MSB) from each byte element in a 512-bit ZMM register and compacts them into a 64-bit opmask register. The resulting mask register has one bit per original byte, forming a 64-bit result. Does not modify CPU flags; operates in 64-bit mode only with AVX-512BW.", "pseudocode": "mask_result = 0\nfor i = 0 to 63:\n  if (src[8*i+7] != 0):\n    mask_result |= (1 << i)\ndest ← mask_result", "example": "VPMOVB2M k1, zmm1"}
{"mnemonic": "vpmovw2m", "architecture": "x86", "full_name": "Move Word Mask to Mask Register", "summary": "Moves word integer mask from ZMM to k-register.", "syntax": "VPMOVW2M k1, zmm1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F38.W1 29 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}], "description": "Extracts the most significant bit (MSB) from each word (16-bit) element in a 512-bit ZMM register and compacts them into a 32-bit opmask register. The resulting mask register has one bit per original word, forming a 32-bit result. Does not modify CPU flags; operates in 64-bit mode only with AVX-512BW.", "pseudocode": "mask_result = 0\nfor i = 0 to 31:\n  if (src[16*i+15] != 0):\n    mask_result |= (1 << i)\ndest ← mask_result", "example": "VPMOVW2M k1, zmm1"}
{"mnemonic": "vpmovd2m", "architecture": "x86", "full_name": "Move Doubleword Mask to Mask Register", "summary": "Moves doubleword integer mask from ZMM to k-register.", "syntax": "VPMOVD2M k1, zmm1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F38.W0 39 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}], "description": "Extracts the sign bit (MSB) from each 32-bit doubleword element in a 512-bit ZMM register and compacts these bits into an 8-bit mask register (k1). This instruction performs a vectorized comparison-to-mask operation, setting each bit in the destination k-register based on the corresponding doubleword's sign bit. No flags are affected by this instruction.", "pseudocode": "for i in 0 to 15:\n  k1[i] ← zmm1[i*32 + 31]\nk1[16:63] ← 0", "example": "VPMOVD2M k1, zmm1"}
{"mnemonic": "vpmovq2m", "architecture": "x86", "full_name": "Move Quadword Mask to Mask Register", "summary": "Moves quadword integer mask from ZMM to k-register.", "syntax": "VPMOVQ2M k1, zmm1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F38.W1 39 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}], "description": "Extracts the sign bit (MSB) from each 64-bit quadword element in a 512-bit ZMM register and compacts these bits into an 8-bit mask register (k1). This instruction performs a vectorized comparison-to-mask operation on 64-bit elements, setting each bit in the destination k-register based on the corresponding quadword's sign bit. No flags are affected by this instruction.", "pseudocode": "for i in 0 to 7:\n  k1[i] ← zmm1[i*64 + 63]\nk1[8:63] ← 0", "example": "VPMOVQ2M k1, zmm1"}
{"mnemonic": "vpmovm2b", "architecture": "x86", "full_name": "Move Mask Register to Byte Mask", "summary": "Expands k-register bits to byte elements in ZMM.", "syntax": "VPMOVM2B zmm1, k1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F38.W0 28 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Expands each bit from an 8-bit mask register into a full byte (0x00 or 0xFF) in a 512-bit ZMM register, producing 64 byte elements. Each set bit in the source k-register generates a byte of all 1s (0xFF) in the destination; each clear bit generates a byte of all 0s (0x00). No flags are affected; this is a mask-expansion operation with no conditional behavior.", "pseudocode": "for i in 0 to 63:\n  zmm1[i*8:i*8+7] ← (k1[i] ? 0xFF : 0x00)", "example": "VPMOVM2B zmm1, k1"}
{"mnemonic": "vpmovm2w", "architecture": "x86", "full_name": "Move Mask Register to Word Mask", "summary": "Expands k-register bits to word elements in ZMM.", "syntax": "VPMOVM2W zmm1, k1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F38.W1 28 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Expands each bit from an 8-bit mask register into a full word (0x0000 or 0xFFFF) in a 512-bit ZMM register, producing 32 word elements. Each set bit in the source k-register generates a word of all 1s (0xFFFF) in the destination; each clear bit generates a word of all 0s (0x0000). No flags are affected; this is a mask-expansion operation with no conditional behavior.", "pseudocode": "for i in 0 to 31:\n  zmm1[i*16:i*16+15] ← (k1[i] ? 0xFFFF : 0x0000)", "example": "VPMOVM2W zmm1, k1"}
{"mnemonic": "vpmovm2d", "architecture": "x86", "full_name": "Move Mask Register to Doubleword Mask", "summary": "Expands k-register bits to doubleword elements in ZMM.", "syntax": "VPMOVM2D zmm1, k1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F38.W0 38 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Expands each bit from an 8-bit mask register into a full doubleword (0x00000000 or 0xFFFFFFFF) in a 512-bit ZMM register, producing 16 doubleword elements. Each set bit in the source k-register generates a doubleword of all 1s (0xFFFFFFFF) in the destination; each clear bit generates a doubleword of all 0s (0x00000000). No flags are affected; this is a mask-expansion operation with no conditional behavior.", "pseudocode": "for i in 0 to 15:\n  zmm1[i*32:i*32+31] ← (k1[i] ? 0xFFFFFFFF : 0x00000000)", "example": "VPMOVM2D zmm1, k1"}
{"mnemonic": "vpmovm2q", "architecture": "x86", "full_name": "Move Mask Register to Quadword Mask", "summary": "Expands k-register bits to quadword elements in ZMM.", "syntax": "VPMOVM2Q zmm1, k1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F38.W1 38 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Expands each bit from an 8-bit mask register into a full quadword (0x0000000000000000 or 0xFFFFFFFFFFFFFFFF) in a 512-bit ZMM register, producing 8 quadword elements. Each set bit in the source k-register generates a quadword of all 1s (0xFFFFFFFFFFFFFFFF) in the destination; each clear bit generates a quadword of all 0s (0x0000000000000000). No flags are affected; this is a mask-expansion operation with no conditional behavior.", "pseudocode": "for i in 0 to 7:\n  zmm1[i*64:i*64+63] ← (k1[i] ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000)", "example": "VPMOVM2Q zmm1, k1"}
{"mnemonic": "kshiftrb", "architecture": "x86", "full_name": "Shift Right Mask Byte", "summary": "Logically shifts 8-bit mask right.", "syntax": "KSHIFTRB k1, k2, imm8", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F3A.W0 30 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 30", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Logically shifts the 8-bit contents of the source k-register right by the count specified in an 8-bit immediate, storing the result in the destination k-register. Vacated bit positions are filled with zeros; bits shifted out are discarded. No flags are affected by this mask shift operation.", "pseudocode": "shift_count ← imm8 & 0x07\nk1 ← k2 >> shift_count\nk1[8:63] ← 0", "example": "KSHIFTRB k1, k2, 3"}
{"mnemonic": "kshiftrw", "architecture": "x86", "full_name": "Shift Right Mask Word", "summary": "Logically shifts 16-bit mask right.", "syntax": "KSHIFTRW k1, k2, imm8", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F3A.W1 30 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 32", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Logically shifts the 16-bit contents of the source k-register right by the count specified in an 8-bit immediate, storing the result in the destination k-register. Vacated bit positions are filled with zeros; bits shifted out are discarded. No flags are affected by this mask shift operation.", "pseudocode": "shift_count ← imm8 & 0x0F\nk1 ← k2 >> shift_count\nk1[16:63] ← 0", "example": "KSHIFTRW k1, k2, 3"}
{"mnemonic": "kshiftrd", "architecture": "x86", "full_name": "Shift Right Mask Doubleword", "summary": "Logically shifts 32-bit mask right.", "syntax": "KSHIFTRD k1, k2, imm8", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F3A.W0 31 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 34", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Logically shifts the 32-bit content of the source mask register right by the amount specified in the immediate operand, storing the result in the destination mask register. Bits shifted out are discarded; vacant bit positions are filled with zeros. No flags are affected; this is an AVX-512BW instruction that operates only on opmask registers (k0-k7).", "pseudocode": "dest ← (src1 >> imm8) & 0xFFFFFFFF;", "example": "KSHIFTRD k1, k2, 3"}
{"mnemonic": "kshiftrq", "architecture": "x86", "full_name": "Shift Right Mask Quadword", "summary": "Logically shifts 64-bit mask right.", "syntax": "KSHIFTRQ k1, k2, imm8", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F3A.W1 31 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 36", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Logically shifts the 64-bit content of the source mask register right by the amount specified in the immediate operand, storing the result in the destination mask register. Bits shifted out are discarded; vacant bit positions are filled with zeros. No flags are affected; this is an AVX-512BW instruction that operates only on opmask registers (k0-k7).", "pseudocode": "dest ← (src1 >> imm8) & 0xFFFFFFFFFFFFFFFF;", "example": "KSHIFTRQ k1, k2, 3"}
{"mnemonic": "kshiftlb", "architecture": "x86", "full_name": "Shift Left Mask Byte", "summary": "Logically shifts 8-bit mask left.", "syntax": "KSHIFTLB k1, k2, imm8", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F3A.W0 32 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 31", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Logically shifts the 8-bit content of the source mask register left by the amount specified in the immediate operand, storing the result in the destination mask register. Bits shifted out are discarded; vacant bit positions are filled with zeros. No flags are affected; this is an AVX-512DQ instruction that operates only on opmask registers (k0-k7).", "pseudocode": "dest ← (src1 << imm8) & 0xFF;", "example": "KSHIFTLB k1, k2, 3"}
{"mnemonic": "kshiftlw", "architecture": "x86", "full_name": "Shift Left Mask Word", "summary": "Logically shifts 16-bit mask left.", "syntax": "KSHIFTLW k1, k2, imm8", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F3A.W1 32 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 33", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Logically shifts the 16-bit content of the source mask register left by the amount specified in the immediate operand, storing the result in the destination mask register. Bits shifted out are discarded; vacant bit positions are filled with zeros. No flags are affected; this is an AVX-512F instruction that operates only on opmask registers (k0-k7).", "pseudocode": "dest ← (src1 << imm8) & 0xFFFF;", "example": "KSHIFTLW k1, k2, 3"}
{"mnemonic": "kshiftld", "architecture": "x86", "full_name": "Shift Left Mask Doubleword", "summary": "Logically shifts 32-bit mask left.", "syntax": "KSHIFTLD k1, k2, imm8", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F3A.W0 33 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 35", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Logically shifts the 32-bit content of the source mask register left by the amount specified in the immediate operand, storing the result in the destination mask register. Bits shifted out are discarded; vacant bit positions are filled with zeros. No flags are affected; this is an AVX-512BW instruction that operates only on opmask registers (k0-k7).", "pseudocode": "dest ← (src1 << imm8) & 0xFFFFFFFF;", "example": "KSHIFTLD k1, k2, 3"}
{"mnemonic": "kshiftlq", "architecture": "x86", "full_name": "Shift Left Mask Quadword", "summary": "Logically shifts 64-bit mask left.", "syntax": "KSHIFTLQ k1, k2, imm8", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F3A.W1 33 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 37", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Logically shifts the 64-bit content of the source mask register left by the amount specified in the immediate operand, storing the result in the destination mask register. Bits shifted out are discarded; vacant bit positions are filled with zeros. No flags are affected; this is an AVX-512BW instruction that operates only on opmask registers (k0-k7).", "pseudocode": "dest ← (src1 << imm8) & 0xFFFFFFFFFFFFFFFF;", "example": "KSHIFTLQ k1, k2, 3"}
{"mnemonic": "knotb", "architecture": "x86", "full_name": "NOT Mask Byte", "summary": "Bitwise NOT of 8-bit mask.", "syntax": "KNOTB k1, k2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F.W0 44 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 44", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise NOT of the 8-bit content of the source mask register, storing the result in the destination mask register. Only the lower 8 bits are affected; other bits are zeroed. No flags are affected; this is an AVX-512DQ instruction that operates only on opmask registers (k0-k7).", "pseudocode": "dest ← (~src) & 0xFF;", "example": "KNOTB k1, k2"}
{"mnemonic": "knotd", "architecture": "x86", "full_name": "NOT Mask Doubleword", "summary": "Bitwise NOT of 32-bit mask.", "syntax": "KNOTD k1, k2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F.W1 44 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 44", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise NOT of the 32-bit content of the source mask register, storing the result in the destination mask register. Only the lower 32 bits are affected; other bits are zeroed. No flags are affected; this is an AVX-512BW instruction that operates only on opmask registers (k0-k7).", "pseudocode": "dest ← (~src) & 0xFFFFFFFF;", "example": "KNOTD k1, k2"}
{"mnemonic": "korb", "architecture": "x86", "full_name": "OR Mask Byte", "summary": "Bitwise OR of 8-bit masks.", "syntax": "KORB k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.66.0F.W0 45 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 45", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise OR of two 8-bit AVX-512 opmask registers and stores the result in the destination opmask. This instruction operates on the mask registers (k0-k7) and does not affect EFLAGS. It is part of the AVX-512DQ extension and executes with minimal latency on modern AVX-512 capable processors.", "pseudocode": "k1 ← k2 | k3;", "example": "KORB k1, k2, k3"}
{"mnemonic": "kord", "architecture": "x86", "full_name": "OR Mask Doubleword", "summary": "Bitwise OR of 32-bit masks.", "syntax": "KORD k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.66.0F.W1 45 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 45", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise OR of two 32-bit AVX-512 opmask registers and stores the result in the destination opmask. This instruction operates on mask registers (k0-k7) treating them as 32-bit values and does not affect EFLAGS. It is part of the AVX-512BW extension and executes with minimal latency.", "pseudocode": "k1 ← k2 | k3;", "example": "KORD k1, k2, k3"}
{"mnemonic": "kxorq", "architecture": "x86", "full_name": "XOR Mask Quadword", "summary": "Bitwise XOR of 64-bit masks.", "syntax": "KXORQ k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.0F.W1 47 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 47", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise XOR of two 64-bit AVX-512 opmask registers and stores the result in the destination opmask. This instruction operates on mask registers (k0-k7) treating them as 64-bit values and does not affect EFLAGS. It is part of the AVX-512BW extension and executes with minimal latency.", "pseudocode": "k1 ← k2 ^ k3;", "example": "KXORQ k1, k2, k3"}
{"mnemonic": "kxord", "architecture": "x86", "full_name": "XOR Mask Doubleword", "summary": "Bitwise XOR of 32-bit masks.", "syntax": "KXORD k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.66.0F.W1 47 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 47", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise XOR of two 32-bit AVX-512 opmask registers and stores the result in the destination opmask. This instruction operates on mask registers (k0-k7) treating them as 32-bit values and does not affect EFLAGS. It is part of the AVX-512BW extension and executes with minimal latency.", "pseudocode": "k1 ← k2 ^ k3;", "example": "KXORD k1, k2, k3"}
{"mnemonic": "kxorb", "architecture": "x86", "full_name": "XOR Mask Byte", "summary": "Bitwise XOR of 8-bit masks.", "syntax": "KXORB k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.66.0F.W0 47 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 47", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise XOR of two 8-bit AVX-512 opmask registers and stores the result in the destination opmask. This instruction operates on mask registers (k0-k7) and does not affect EFLAGS. It is part of the AVX-512DQ extension and executes with minimal latency.", "pseudocode": "k1 ← k2 ^ k3;", "example": "KXORB k1, k2, k3"}
{"mnemonic": "kortestb", "architecture": "x86", "full_name": "OR Masks and Set Flags Byte", "summary": "ORs 8-bit masks and sets EFLAGS (ZF/CF).", "syntax": "KORTESTB k1, k2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F.W0 98 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 98", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "ORs two 8-bit AVX-512 opmask registers and sets EFLAGS based on the result without storing the OR result. Sets ZF if the OR result is all zeros, and CF if the first source opmask is all zeros. Part of the AVX-512DQ extension, this instruction is useful for testing mask conditions.", "pseudocode": "temp ← k1 | k2; ZF ← (temp == 0); CF ← (k1 == 0);", "example": "KORTESTB k1, k2"}
{"mnemonic": "kortestq", "architecture": "x86", "full_name": "OR Masks and Set Flags Quadword", "summary": "ORs 64-bit masks and sets EFLAGS (ZF/CF).", "syntax": "KORTESTQ k1, k2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.0F.W1 98 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 98", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "ORs two 64-bit AVX-512 opmask registers and sets EFLAGS based on the result without storing the OR result. Sets ZF if the OR result is all zeros, and CF if the first source opmask is all zeros. Part of the AVX-512BW extension, this instruction is useful for testing mask conditions.", "pseudocode": "temp ← k1 | k2; ZF ← (temp == 0); CF ← (k1 == 0);", "example": "KORTESTQ k1, k2"}
{"mnemonic": "ktestb", "architecture": "x86", "full_name": "Test Masks Byte", "summary": "ANDs 8-bit masks and sets EFLAGS (ZF/CF).", "syntax": "KTESTB k1, k2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F.W0 99 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 99", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "ANDs two 8-bit AVX-512 opmask registers and sets EFLAGS based on the result without storing the AND result. Sets ZF if the AND result is all zeros, and CF if the first source opmask is all zeros. Part of the AVX-512DQ extension, this instruction is useful for testing mask bit intersections.", "pseudocode": "temp ← k1 & k2; ZF ← (temp == 0); CF ← (k1 == 0);", "example": "KTESTB k1, k2"}
{"mnemonic": "ktestw", "architecture": "x86", "full_name": "Test Masks Word", "summary": "ANDs 16-bit masks and sets EFLAGS (ZF/CF).", "syntax": "KTESTW k1, k2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.0F.W0 99 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 99", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise AND of two 16-bit AVX-512 opmask registers and updates EFLAGS based on the result without storing the AND product. Sets ZF if the result is zero, clears ZF otherwise; sets CF if all bits of the first operand are zero, clears CF otherwise. This instruction executes in 64-bit mode only and is part of AVX-512F.", "pseudocode": "temp ← k1 AND k2\nZF ← (temp == 0)\nCF ← (k1 == 0)\nOF ← 0\nSF ← 0\nAF ← undefined\nPF ← undefined", "example": "KTESTW k1, k2"}
{"mnemonic": "ktestd", "architecture": "x86", "full_name": "Test Masks Doubleword", "summary": "ANDs 32-bit masks and sets EFLAGS (ZF/CF).", "syntax": "KTESTD k1, k2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.66.0F.W1 99 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 99", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise AND of two 32-bit AVX-512 opmask registers and updates EFLAGS based on the result without storing the AND product. Sets ZF if the result is zero, clears ZF otherwise; sets CF if all bits of the first operand are zero, clears CF otherwise. This instruction executes in 64-bit mode only and requires AVX-512BW.", "pseudocode": "temp ← k1 AND k2\nZF ← (temp == 0)\nCF ← (k1 == 0)\nOF ← 0\nSF ← 0\nAF ← undefined\nPF ← undefined", "example": "KTESTD k1, k2"}
{"mnemonic": "ktestq", "architecture": "x86", "full_name": "Test Masks Quadword", "summary": "ANDs 64-bit masks and sets EFLAGS (ZF/CF).", "syntax": "KTESTQ k1, k2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.0F.W1 99 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 99", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise AND of two 64-bit AVX-512 opmask registers and updates EFLAGS based on the result without storing the AND product. Sets ZF if the result is zero, clears ZF otherwise; sets CF if all bits of the first operand are zero, clears CF otherwise. This instruction executes in 64-bit mode only and requires AVX-512BW.", "pseudocode": "temp ← k1 AND k2\nZF ← (temp == 0)\nCF ← (k1 == 0)\nOF ← 0\nSF ← 0\nAF ← undefined\nPF ← undefined", "example": "KTESTQ k1, k2"}
{"mnemonic": "vcvtudq2pd", "architecture": "x86", "full_name": "Convert Packed Unsigned Doubleword to Double", "summary": "Converts unsigned 32-bit integers to 64-bit doubles.", "syntax": "VCVTUDQ2PD zmm1 {k1}, ymm2/m256", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F.W0 7A /r", "visual_parts": [], "binary_pattern": "EVEX | F3 | 0F | 7A", "bit_positions": "+0 | +4 | +5 | +6"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "ymm2/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Converts four unsigned 32-bit doublewords (from a 256-bit YMM or memory operand) to four 64-bit double-precision floating-point values, storing the result in a 512-bit ZMM register with optional opmask write control. The conversion uses the current rounding mode from MXCSR. Executes in 64-bit mode only and requires AVX-512F; precision may be lost for large unsigned integers that exceed 2^53.", "pseudocode": "for i ← 0 to 3\n  if k1[i] or no mask:\n    zmm1[64*i:64*i+63] ← convert_udq_to_pd(ymm2_or_mem[32*i:32*i+31])\n  else if zeroing:\n    zmm1[64*i:64*i+63] ← 0", "example": "VCVTUDQ2PD zmm1, ymm2/m256"}
{"mnemonic": "vcvtpd2udq", "architecture": "x86", "full_name": "Convert Packed Double to Unsigned Doubleword", "summary": "Converts 64-bit doubles to unsigned 32-bit integers.", "syntax": "VCVTPD2UDQ ymm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.0F.W1 79 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 79", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Converts eight 64-bit double-precision floating-point values (from a 512-bit ZMM or memory operand) to eight unsigned 32-bit doublewords, storing the result in a 256-bit YMM register with optional opmask write control. The conversion uses the current rounding mode from MXCSR; out-of-range values saturate to the maximum unsigned 32-bit integer (2^32-1). Executes in 64-bit mode only and requires AVX-512F.", "pseudocode": "for i ← 0 to 7\n  if k1[i] or no mask:\n    ymm1[32*i:32*i+31] ← convert_pd_to_udq_saturate(zmm2_or_mem[64*i:64*i+63])\n  else if zeroing:\n    ymm1[32*i:32*i+31] ← 0", "example": "VCVTPD2UDQ ymm1, zmm2/m512"}
{"mnemonic": "vcvtps2udq", "architecture": "x86", "full_name": "Convert Packed Single to Unsigned Doubleword", "summary": "Converts 32-bit floats to unsigned 32-bit integers.", "syntax": "VCVTPS2UDQ zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.0F.W0 79 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 79", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Converts sixteen 32-bit single-precision floating-point values (from a 512-bit ZMM or memory operand) to sixteen unsigned 32-bit doublewords, storing the result in a 512-bit ZMM register with optional opmask write control. The conversion uses the current rounding mode from MXCSR; out-of-range values saturate to the maximum unsigned 32-bit integer (2^32-1). Executes in 64-bit mode only and requires AVX-512F.", "pseudocode": "for i ← 0 to 15\n  if k1[i] or no mask:\n    zmm1[32*i:32*i+31] ← convert_ps_to_udq_saturate(zmm2_or_mem[32*i:32*i+31])\n  else if zeroing:\n    zmm1[32*i:32*i+31] ← 0", "example": "VCVTPS2UDQ zmm1, zmm2/m512"}
{"mnemonic": "vcvtuqq2ps", "architecture": "x86", "full_name": "Convert Packed Unsigned Quadword to Single", "summary": "Converts unsigned 64-bit integers to 32-bit floats.", "syntax": "VCVTUQQ2PS ymm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F2.0F.W1 7A /r", "visual_parts": [], "binary_pattern": "EVEX | F2 | 0F | 7A", "bit_positions": "+0 | +4 | +5 | +6"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Converts eight unsigned 64-bit quadwords (from a 512-bit ZMM or memory operand) to eight 32-bit single-precision floating-point values, storing the result in a 256-bit YMM register with optional opmask write control. The conversion uses the current rounding mode from MXCSR. Executes in 64-bit mode only and requires AVX-512F; precision may be lost for large unsigned integers that exceed 2^24.", "pseudocode": "for i ← 0 to 7\n  if k1[i] or no mask:\n    ymm1[32*i:32*i+31] ← convert_uq_to_ps(zmm2_or_mem[64*i:64*i+63])\n  else if zeroing:\n    ymm1[32*i:32*i+31] ← 0", "example": "VCVTUQQ2PS ymm1, zmm2/m512"}
{"mnemonic": "vcvtuqq2pd", "architecture": "x86", "full_name": "Convert Packed Unsigned Quadword to Double", "summary": "Converts unsigned 64-bit integers to 64-bit doubles.", "syntax": "VCVTUQQ2PD zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F.W1 7A /r", "visual_parts": [], "binary_pattern": "EVEX | F3 | 0F | 7A", "bit_positions": "+0 | +4 | +5 | +6"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Converts eight unsigned 64-bit quadwords (from a 512-bit ZMM or memory operand) to eight 64-bit double-precision floating-point values, storing the result in a 512-bit ZMM register with optional opmask write control. The conversion uses the current rounding mode from MXCSR. Executes in 64-bit mode only and requires AVX-512F; full precision is maintained since IEEE 754 double can exactly represent all 64-bit unsigned integers.", "pseudocode": "for i ← 0 to 7\n  if k1[i] or no mask:\n    zmm1[64*i:64*i+63] ← convert_uq_to_pd(zmm2_or_mem[64*i:64*i+63])\n  else if zeroing:\n    zmm1[64*i:64*i+63] ← 0", "example": "VCVTUQQ2PD zmm1, zmm2/m512"}
{"mnemonic": "vcvtps2uqq", "architecture": "x86", "full_name": "Convert Packed Single to Unsigned Quadword", "summary": "Converts 32-bit floats to unsigned 64-bit integers.", "syntax": "VCVTPS2UQ zmm1 {k1}, ymm2/m256", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F.W0 79 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 79", "bit_positions": "+0 | +4 | +5 | +6"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "ymm2/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Converts packed 32-bit single-precision floating-point values to unsigned 64-bit integers. The instruction reads 256 bits (4 × 32-bit floats from ymm2/m256) and produces 512 bits (4 × 64-bit unsigned integers in zmm1). EVEX encoding enables masking via k1 and rounding mode control; results are undefined if any value overflows the unsigned 64-bit range, and invalid floating-point exceptions are raised on NaN inputs. The instruction operates in 64-bit, protected, and real modes with AVX-512F support.", "pseudocode": "zmm1[63:0] ← (src[31:0] is valid && src[31:0] ≤ 2^64-1) ? convert_float_to_uint64(src[31:0]) : undefined; zmm1[127:64] ← convert_float_to_uint64(src[63:32]); zmm1[191:128] ← convert_float_to_uint64(src[95:64]); zmm1[255:192] ← convert_float_to_uint64(src[127:96]);", "example": "VCVTPS2UQ zmm1, ymm2/m256"}
{"mnemonic": "vcvtpd2uqq", "architecture": "x86", "full_name": "Convert Packed Double to Unsigned Quadword", "summary": "Converts 64-bit doubles to unsigned 64-bit integers.", "syntax": "VCVTPD2UQ zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F.W1 79 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 79", "bit_positions": "+0 | +4 | +5 | +6"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Converts packed 64-bit double-precision floating-point values to unsigned 64-bit integers. The instruction reads 512 bits (4 × 64-bit doubles from zmm2/m512) and produces 512 bits (4 × 64-bit unsigned integers in zmm1). EVEX masking via k1 and rounding control are supported; overflow conditions and NaN inputs trigger invalid floating-point exceptions. Operates in 64-bit, protected, and real modes with AVX-512F support.", "pseudocode": "zmm1[63:0] ← convert_double_to_uint64(src[63:0]); zmm1[127:64] ← convert_double_to_uint64(src[127:64]); zmm1[191:128] ← convert_double_to_uint64(src[191:128]); zmm1[255:192] ← convert_double_to_uint64(src[255:192]);", "example": "VCVTPD2UQ zmm1, zmm2/m512"}
{"mnemonic": "vfmaddcph", "architecture": "x86", "full_name": "Complex Multiply-Add FP16", "summary": "Complex multiply-add for half-precision.", "syntax": "VFMADDCPH zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.MAP6.W0 56 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Performs complex multiply-add on packed half-precision (FP16) complex numbers. Each ZMM register holds 16 FP16 values (8 complex pairs); the instruction computes (src1 × src2) + dest for each complex pair and stores the result in dest. EVEX masking (k1) and embedded rounding are supported. Intermediate calculations use extended precision to minimize rounding errors. Requires AVX-512-FP16 support.", "pseudocode": "for i = 0 to 7 do: real_i ← src1[32*i+15:32*i] * src2[32*i+15:32*i] - src1[32*i+31:32*i+16] * src2[32*i+31:32*i+16]; imag_i ← src1[32*i+15:32*i] * src2[32*i+31:32*i+16] + src1[32*i+31:32*i+16] * src2[32*i+15:32*i]; dest[32*i+15:32*i] ← real_i + dest[32*i+15:32*i]; dest[32*i+31:32*i+16] ← imag_i + dest[32*i+31:32*i+16];", "example": "VFMADDCPH zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vfcmaddcph", "architecture": "x86", "full_name": "Complex Conjugate Multiply-Add FP16", "summary": "Complex conjugate multiply-add for half-precision.", "syntax": "VFCMADDCPH zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F2.MAP6.W0 56 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Performs complex conjugate multiply-add on packed half-precision (FP16) complex numbers. Each ZMM holds 16 FP16 values (8 complex pairs); the instruction computes (src1 × conj(src2)) + dest for each pair, where conj() negates the imaginary component. EVEX masking (k1) and embedded rounding control are supported. Intermediate precision extension minimizes rounding artifacts. Requires AVX-512-FP16 support.", "pseudocode": "for i = 0 to 7 do: real_i ← src1[32*i+15:32*i] * src2[32*i+15:32*i] + src1[32*i+31:32*i+16] * src2[32*i+31:32*i+16]; imag_i ← src1[32*i+31:32*i+16] * src2[32*i+15:32*i] - src1[32*i+15:32*i] * src2[32*i+31:32*i+16]; dest[32*i+15:32*i] ← real_i + dest[32*i+15:32*i]; dest[32*i+31:32*i+16] ← imag_i + dest[32*i+31:32*i+16];", "example": "VFCMADDCPH zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vfmaddcsh", "architecture": "x86", "full_name": "Complex Multiply-Add Scalar FP16", "summary": "Complex multiply-add for scalar half-precision.", "syntax": "VFMADDCSH xmm1 {k1}, xmm2, xmm3/m32", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.F3.MAP6.W0 57 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs scalar complex multiply-add on half-precision (FP16) complex numbers. The lower 32 bits of xmm1 and xmm2 represent a single complex number (two FP16 values: real and imaginary); the instruction computes (src1 × src2) + dest for that pair and updates only the lower 32 bits of xmm1. EVEX masking (k1) and embedded rounding are supported. Requires AVX-512-FP16 support.", "pseudocode": "real ← src1[15:0] * src2[15:0] - src1[31:16] * src2[31:16]; imag ← src1[15:0] * src2[31:16] + src1[31:16] * src2[15:0]; xmm1[15:0] ← real + dest[15:0]; xmm1[31:16] ← imag + dest[31:16]; xmm1[127:32] ← dest[127:32];", "example": "VFMADDCSH xmm1, xmm2, xmm3/m32"}
{"mnemonic": "vcmpps", "architecture": "x86", "full_name": "Compare Packed Single-Precision (AVX)", "summary": "Compares packed floats (AVX version with immediate).", "syntax": "VCMPPS ymm1, ymm2, ymm3/m256, imm8", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.0F.WIG C2 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Compares packed 32-bit single-precision floats and stores the boolean result (all-ones or all-zeros per element) in the destination YMM register. The comparison operator is encoded in the imm8 field (0=EQ, 1=LT, 2=LE, 4=NEQ, 5=NLT, 6=NLE, etc.). Quiet NaNs produce false results; signaling NaNs trigger invalid floating-point exceptions (unless masked). VEX encoding supports 256-bit operations; three-operand form allows non-destructive destination. Operates in 64-bit, protected, and real modes with AVX support.", "pseudocode": "for i = 0 to 7 do: cmp_result ← compare_float(src1[32*i+31:32*i], src2[32*i+31:32*i], imm8); dest[32*i+31:32*i] ← cmp_result ? 0xFFFFFFFF : 0x00000000;", "example": "VCMPPS ymm1, ymm2, ymm3/m256, 3"}
{"mnemonic": "vcmppd", "architecture": "x86", "full_name": "Compare Packed Double-Precision (AVX)", "summary": "Compares packed doubles (AVX version with immediate).", "syntax": "VCMPPD ymm1, ymm2, ymm3/m256, imm8", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F.WIG C2 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Compares packed 64-bit double-precision floats and stores the boolean result (all-ones or all-zeros per element) in the destination YMM register. The comparison predicate is encoded in imm8 (0=EQ, 1=LT, 2=LE, 4=NEQ, 5=NLT, 6=NLE, etc.). Quiet NaNs return false; signaling NaNs trigger invalid floating-point exceptions (unless masked). VEX encoding supports 256-bit operations; three-operand form enables non-destructive destination. Operates in 64-bit, protected, and real modes with AVX support.", "pseudocode": "for i = 0 to 3 do: cmp_result ← compare_double(src1[64*i+63:64*i], src2[64*i+63:64*i], imm8); dest[64*i+63:64*i] ← cmp_result ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000;", "example": "VCMPPD ymm1, ymm2, ymm3/m256, 3"}
{"mnemonic": "vpcmpb", "architecture": "x86", "full_name": "Compare Packed Byte Integers", "summary": "Compares bytes and stores result in k-register mask.", "syntax": "VPCMPB k1 {k2}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 3F /r ib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Compares packed 8-bit signed integers and stores the boolean result in an AVX-512 opmask register (k1). The comparison operator is encoded in imm8 (0=EQ, 1=LT, 2=LE, 4=NEQ, 5=NLT, 6=NLE, etc.). EVEX encoding enables masking via k2 (merge-with-zero or keep-unchanged per bit). The destination k1 register holds 64 single-bit results corresponding to 64 bytes. Operates in 64-bit mode with AVX-512BW support.", "pseudocode": "for i = 0 to 63 do: if k2[i] == 1 or k2 is unused then: cmp_result ← compare_signed_byte(src1[8*i+7:8*i], src2[8*i+7:8*i], imm8); k1[i] ← cmp_result ? 1 : 0; else: k1[i] ← 0;", "example": "VPCMPB k1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpcmpw", "architecture": "x86", "full_name": "Compare Packed Word Integers", "summary": "Compares words and stores result in k-register mask.", "syntax": "VPCMPW k1 {k2}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 3F /r ib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Compares packed signed 16-bit integers in zmm2 against zmm3/m512 using the comparison predicate specified in imm8, storing the boolean results in the opmask k1 (optionally merged with k2). The instruction operates on 32 word elements in 512-bit vectors and does not modify EFLAGS; the predicate selector in imm8 determines the comparison type (equal, less, less-equal, unordered, etc.). Available only in 64-bit mode with AVX-512BW extension.", "pseudocode": "for i in 0..31:\n  elem1 ← zmm2[16*i : 16*i+15] as signed 16-bit\n  elem2 ← zmm3/m512[16*i : 16*i+15] as signed 16-bit\n  k1[i] ← (mask_merge) ? k2[i] : 0\n  if pred(elem1, elem2, imm8) then k1[i] ← 1", "example": "VPCMPW k1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpcmpd", "architecture": "x86", "full_name": "Compare Packed Doubleword Integers", "summary": "Compares doublewords and stores result in k-register mask.", "syntax": "VPCMPD k1 {k2}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 1F /r ib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Compares packed signed 32-bit integers in zmm2 against zmm3/m512 using the comparison predicate in imm8, storing boolean results in opmask k1 (optionally merged with k2). Operates on 16 doubleword elements in 512-bit vectors without affecting EFLAGS; the imm8 predicate determines comparison semantics (EQ, LT, LE, NEQ, NLT, NLE, etc.). Available in 64-bit mode with AVX-512F extension.", "pseudocode": "for i in 0..15:\n  elem1 ← zmm2[32*i : 32*i+31] as signed 32-bit\n  elem2 ← zmm3/m512[32*i : 32*i+31] as signed 32-bit\n  k1[i] ← (mask_merge) ? k2[i] : 0\n  if pred(elem1, elem2, imm8) then k1[i] ← 1", "example": "VPCMPD k1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpcmpq", "architecture": "x86", "full_name": "Compare Packed Quadword Integers", "summary": "Compares quadwords and stores result in k-register mask.", "syntax": "VPCMPQ k1 {k2}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 1F /r ib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Compares packed signed 64-bit integers in zmm2 against zmm3/m512 using the comparison predicate in imm8, storing boolean results in opmask k1 (optionally merged with k2). Operates on 8 quadword elements in 512-bit vectors without modifying EFLAGS; the imm8 predicate encodes the comparison condition (equal, less-than, less-than-or-equal, etc.). Available in 64-bit mode with AVX-512F extension.", "pseudocode": "for i in 0..7:\n  elem1 ← zmm2[64*i : 64*i+63] as signed 64-bit\n  elem2 ← zmm3/m512[64*i : 64*i+63] as signed 64-bit\n  k1[i] ← (mask_merge) ? k2[i] : 0\n  if pred(elem1, elem2, imm8) then k1[i] ← 1", "example": "VPCMPQ k1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpcmpub", "architecture": "x86", "full_name": "Compare Packed Unsigned Byte Integers", "summary": "Compares unsigned bytes and stores result in k-register.", "syntax": "VPCMPUB k1 {k2}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 3E /r ib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Compares packed unsigned 8-bit integers in zmm2 against zmm3/m512 using the comparison predicate in imm8, storing boolean results in opmask k1 (optionally merged with k2). Operates on 64 byte elements in 512-bit vectors; comparison is performed as unsigned and imm8 specifies the predicate (equal, less, less-equal, etc.). Available in 64-bit mode with AVX-512BW extension; EFLAGS are not modified.", "pseudocode": "for i in 0..63:\n  elem1 ← zmm2[8*i : 8*i+7] as unsigned 8-bit\n  elem2 ← zmm3/m512[8*i : 8*i+7] as unsigned 8-bit\n  k1[i] ← (mask_merge) ? k2[i] : 0\n  if pred(elem1, elem2, imm8) then k1[i] ← 1", "example": "VPCMPUB k1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpcmpuw", "architecture": "x86", "full_name": "Compare Packed Unsigned Word Integers", "summary": "Compares unsigned words and stores result in k-register.", "syntax": "VPCMPUW k1 {k2}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 3E /r ib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Compares packed unsigned 16-bit integers in zmm2 against zmm3/m512 using the comparison predicate in imm8, storing boolean results in opmask k1 (optionally merged with k2). Operates on 32 word elements in 512-bit vectors; comparison is performed as unsigned and imm8 encodes the predicate type (equal, less, less-equal, not-equal, etc.). Available in 64-bit mode with AVX-512BW extension; EFLAGS remain unaffected.", "pseudocode": "for i in 0..31:\n  elem1 ← zmm2[16*i : 16*i+15] as unsigned 16-bit\n  elem2 ← zmm3/m512[16*i : 16*i+15] as unsigned 16-bit\n  k1[i] ← (mask_merge) ? k2[i] : 0\n  if pred(elem1, elem2, imm8) then k1[i] ← 1", "example": "VPCMPUW k1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpcmpud", "architecture": "x86", "full_name": "Compare Packed Unsigned Doubleword Integers", "summary": "Compares unsigned doublewords and stores result in k-register.", "syntax": "VPCMPUD k1 {k2}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 1E /r ib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Compares packed unsigned 32-bit integers in zmm2 against zmm3/m512 using the comparison predicate in imm8, storing boolean results in opmask k1 (optionally merged with k2). Operates on 16 doubleword elements in 512-bit vectors; all comparisons are unsigned and imm8 specifies the predicate (equal, less, less-equal, not-equal, etc.). Available in 64-bit mode with AVX-512F extension; EFLAGS are not modified.", "pseudocode": "for i in 0..15:\n  elem1 ← zmm2[32*i : 32*i+31] as unsigned 32-bit\n  elem2 ← zmm3/m512[32*i : 32*i+31] as unsigned 32-bit\n  k1[i] ← (mask_merge) ? k2[i] : 0\n  if pred(elem1, elem2, imm8) then k1[i] ← 1", "example": "VPCMPUD k1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpcmpuq", "architecture": "x86", "full_name": "Compare Packed Unsigned Quadword Integers", "summary": "Compares unsigned quadwords and stores result in k-register.", "syntax": "VPCMPUQ k1 {k2}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 1E /r ib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Compares packed unsigned 64-bit integers in zmm2 against zmm3/m512 using the comparison predicate in imm8, storing boolean results in opmask k1 (optionally merged with k2). Operates on 8 quadword elements in 512-bit vectors; all comparisons are unsigned and imm8 encodes the predicate (equal, less-than, less-equal, not-equal, etc.). Available in 64-bit mode with AVX-512F extension; EFLAGS remain unchanged.", "pseudocode": "for i in 0..7:\n  elem1 ← zmm2[64*i : 64*i+63] as unsigned 64-bit\n  elem2 ← zmm3/m512[64*i : 64*i+63] as unsigned 64-bit\n  k1[i] ← (mask_merge) ? k2[i] : 0\n  if pred(elem1, elem2, imm8) then k1[i] ← 1", "example": "VPCMPUQ k1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vptestmb", "architecture": "x86", "full_name": "Packed Test Mask Byte", "summary": "Tests byte integers and sets k-register mask.", "syntax": "VPTESTMB k1 {k2}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 26 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Tests packed 8-bit integers by performing a bitwise AND of zmm2 and zmm3/m512, setting each bit in opmask k1 if the result is nonzero (optionally merged with k2). Operates on 64 byte elements in 512-bit vectors and does not modify EFLAGS; this is a destructive AND-test operation that sets mask bits based on non-zero results. Available in 64-bit mode with AVX-512BW extension.", "pseudocode": "for i in 0..63:\n  elem1 ← zmm2[8*i : 8*i+7]\n  elem2 ← zmm3/m512[8*i : 8*i+7]\n  k1[i] ← (mask_merge) ? k2[i] : 0\n  if (elem1 & elem2) != 0 then k1[i] ← 1", "example": "VPTESTMB k1, zmm2, zmm3/m512"}
{"mnemonic": "vptestmw", "architecture": "x86", "full_name": "Packed Test Mask Word", "summary": "Tests word integers and sets k-register mask.", "syntax": "VPTESTMW k1 {k2}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 26 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Tests packed word integers by performing a bitwise AND between two 512-bit ZMM sources and sets the result bits in the destination k-register mask. Each bit in the k-register corresponds to whether the AND result for that word element is nonzero. No arithmetic flags (OF, SF, ZF, AF, CF, PF) are modified; only the k-register mask is updated. This is an AVX-512BW instruction that operates on 16-bit elements.", "pseudocode": "for i = 0 to 31:\n  element_result = zmm2[i*16+15:i*16] & zmm3[i*16+15:i*16]\n  k1[i] = (element_result != 0) ? 1 : 0", "example": "VPTESTMW k1, zmm2, zmm3/m512"}
{"mnemonic": "vptestmd", "architecture": "x86", "full_name": "Packed Test Mask Doubleword", "summary": "Tests doubleword integers and sets k-register mask.", "syntax": "VPTESTMD k1 {k2}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 27 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Tests packed doubleword integers by performing a bitwise AND between two 512-bit ZMM sources and sets the result bits in the destination k-register mask. Each bit in the k-register corresponds to whether the AND result for that doubleword element is nonzero. No arithmetic flags (OF, SF, ZF, AF, CF, PF) are modified; only the k-register mask is updated. This is an AVX-512F instruction that operates on 32-bit elements.", "pseudocode": "for i = 0 to 15:\n  element_result = zmm2[i*32+31:i*32] & zmm3[i*32+31:i*32]\n  k1[i] = (element_result != 0) ? 1 : 0", "example": "VPTESTMD k1, zmm2, zmm3/m512"}
{"mnemonic": "vptestmq", "architecture": "x86", "full_name": "Packed Test Mask Quadword", "summary": "Tests quadword integers and sets k-register mask.", "syntax": "VPTESTMQ k1 {k2}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 27 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Tests packed quadword integers by performing a bitwise AND between two 512-bit ZMM sources and sets the result bits in the destination k-register mask. Each bit in the k-register corresponds to whether the AND result for that quadword element is nonzero. No arithmetic flags (OF, SF, ZF, AF, CF, PF) are modified; only the k-register mask is updated. This is an AVX-512F instruction that operates on 64-bit elements.", "pseudocode": "for i = 0 to 7:\n  element_result = zmm2[i*64+63:i*64] & zmm3[i*64+63:i*64]\n  k1[i] = (element_result != 0) ? 1 : 0", "example": "VPTESTMQ k1, zmm2, zmm3/m512"}
{"mnemonic": "monitorx", "architecture": "x86", "full_name": "Monitor Extended", "summary": "Sets up a monitor address (AMD extension).", "syntax": "MONITORX", "encoding": {"format": "AMD", "hex_opcode": "0F 01 FA", "visual_parts": [], "binary_pattern": "0F | 01 | FA", "bit_positions": "+0 | +1 | +2"}, "extension": "AMD", "operands": [], "description": "Sets up a monitor address and optional extensions for memory monitoring (AMD-specific extension). The instruction uses the address in EAX (or RAX in 64-bit mode) as the monitor target, with optional parameters in ECX (monitor extensions/timeout) and EDX (optional threshold). This instruction primes the CPU's monitoring hardware for use with MWAITX and does not modify any arithmetic flags. MONITORX is a privileged instruction available on AMD Zen and later processors.", "pseudocode": "monitor_address ← EAX\nmonitor_extensions ← ECX\nmonitor_threshold ← EDX", "example": "MONITORX"}
{"mnemonic": "mwaitx", "architecture": "x86", "full_name": "Monitor Wait Extended", "summary": "Waits for a write to monitored address (AMD extension).", "syntax": "MWAITX", "encoding": {"format": "AMD", "hex_opcode": "0F 01 FB", "visual_parts": [], "binary_pattern": "0F | 01 | FB", "bit_positions": "+0 | +1 | +2"}, "extension": "AMD", "operands": [], "description": "Waits for a write to the address set by MONITORX, with optional timeout support (AMD-specific extension). The instruction operates with implicit operands: EAX contains the monitor address, ECX contains extensions/flags, and EDX contains a timeout value in clock cycles (if ECX[1] is set for timeout mode). The instruction is interruptible and will exit on an interrupt, cache line write to the monitored address, or timeout expiration. No arithmetic flags are modified; this is a privileged instruction available on AMD Zen and later processors.", "pseudocode": "while (memory[monitor_address] has not been written) {\n  if (ECX[1] == 1 && timeout_expired(EDX)) break\n  if (interrupt_pending()) break\n  wait()\n}", "example": "MWAITX"}
{"mnemonic": "subss", "architecture": "x86", "full_name": "Subtract Scalar Single-Precision", "summary": "Subtracts the low single-precision floating-point value.", "syntax": "SUBSS xmm1, xmm2/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 5C", "visual_parts": [], "binary_pattern": "F3 | 0F | 5C", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Subtracts the low 32-bit single-precision floating-point value in the source from the destination XMM register, following IEEE 754 semantics. The high 96 bits of the destination XMM register are left unchanged. The result may raise floating-point exceptions (invalid operation, overflow, underflow, inexact) but does not modify the general-purpose arithmetic flags (OF, SF, ZF, AF, CF, PF). This is an SSE instruction available in 32-bit and 64-bit modes.", "pseudocode": "xmm1[31:0] ← xmm1[31:0] - src[31:0] (IEEE 754 single-precision)\nxmm1[127:32] ← unchanged\nFP_exceptions may be raised", "example": "SUBSS xmm1, xmm2/m32"}
{"mnemonic": "subsd", "architecture": "x86", "full_name": "Subtract Scalar Double-Precision", "summary": "Subtracts the low double-precision floating-point value.", "syntax": "SUBSD xmm1, xmm2/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 5C", "visual_parts": [], "binary_pattern": "F2 | 0F | 5C", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Subtracts the low 64-bit double-precision floating-point value in the source from the destination XMM register, following IEEE 754 semantics. The high 64 bits of the destination XMM register are left unchanged. The result may raise floating-point exceptions (invalid operation, overflow, underflow, inexact) but does not modify the general-purpose arithmetic flags (OF, SF, ZF, AF, CF, PF). This is an SSE2 instruction available in 32-bit and 64-bit modes.", "pseudocode": "xmm1[63:0] ← xmm1[63:0] - src[63:0] (IEEE 754 double-precision)\nxmm1[127:64] ← unchanged\nFP_exceptions may be raised", "example": "SUBSD xmm1, xmm2/m64"}
{"mnemonic": "mulss", "architecture": "x86", "full_name": "Multiply Scalar Single-Precision", "summary": "Multiplies the low single-precision floating-point value.", "syntax": "MULSS xmm1, xmm2/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 59", "visual_parts": [], "binary_pattern": "F3 | 0F | 59", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Multiplies the low 32-bit single-precision floating-point value in the source by the destination XMM register, following IEEE 754 semantics. The high 96 bits of the destination XMM register are left unchanged. The result may raise floating-point exceptions (invalid operation, overflow, underflow, inexact) but does not modify the general-purpose arithmetic flags (OF, SF, ZF, AF, CF, PF). This is an SSE instruction available in 32-bit and 64-bit modes.", "pseudocode": "xmm1[31:0] ← xmm1[31:0] * src[31:0] (IEEE 754 single-precision)\nxmm1[127:32] ← unchanged\nFP_exceptions may be raised", "example": "MULSS xmm1, xmm2/m32"}
{"mnemonic": "mulsd", "architecture": "x86", "full_name": "Multiply Scalar Double-Precision", "summary": "Multiplies the low double-precision floating-point value.", "syntax": "MULSD xmm1, xmm2/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 59", "visual_parts": [], "binary_pattern": "F2 | 0F | 59", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Multiplies the low 64-bit double-precision floating-point value in xmm1 by the low 64-bit value from xmm2/m64, storing the result in xmm1; the high 64-bit value in xmm1 is preserved. This operation follows IEEE 754 semantics for floating-point multiplication and does not modify EFLAGS.", "pseudocode": "xmm1[0:63] ← FP64_multiply(xmm1[0:63], xmm2/m64[0:63])\nxmm1[64:127] ← unchanged", "example": "MULSD xmm1, xmm2/m64"}
{"mnemonic": "divss", "architecture": "x86", "full_name": "Divide Scalar Single-Precision", "summary": "Divides the low single-precision floating-point value.", "syntax": "DIVSS xmm1, xmm2/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 5E", "visual_parts": [], "binary_pattern": "F3 | 0F | 5E", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Divides the low 32-bit single-precision floating-point value in xmm1 by the low 32-bit value from xmm2/m32, storing the result in xmm1; the upper 96 bits of xmm1 are preserved. This operation follows IEEE 754 semantics and does not modify EFLAGS; division by zero produces infinity or NaN per IEEE rules.", "pseudocode": "xmm1[0:31] ← FP32_divide(xmm1[0:31], xmm2/m32[0:31])\nxmm1[32:127] ← unchanged", "example": "DIVSS xmm1, xmm2/m32"}
{"mnemonic": "divsd", "architecture": "x86", "full_name": "Divide Scalar Double-Precision", "summary": "Divides the low double-precision floating-point value.", "syntax": "DIVSD xmm1, xmm2/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 5E", "visual_parts": [], "binary_pattern": "F2 | 0F | 5E", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Divides the low 64-bit double-precision floating-point value in xmm1 by the low 64-bit value from xmm2/m64, storing the result in xmm1; the high 64-bit value in xmm1 is preserved. This operation follows IEEE 754 semantics and does not modify EFLAGS; division by zero produces infinity or NaN per IEEE rules.", "pseudocode": "xmm1[0:63] ← FP64_divide(xmm1[0:63], xmm2/m64[0:63])\nxmm1[64:127] ← unchanged", "example": "DIVSD xmm1, xmm2/m64"}
{"mnemonic": "sqrtss", "architecture": "x86", "full_name": "Square Root Scalar Single-Precision", "summary": "Computes square root of the low float.", "syntax": "SQRTSS xmm1, xmm2/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 51", "visual_parts": [], "binary_pattern": "F3 | 0F | 51", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Computes the square root of the low 32-bit single-precision floating-point value in xmm2/m32 and stores the result in the low 32 bits of xmm1; the upper 96 bits of xmm1 are set to zero. This operation follows IEEE 754 semantics and does not modify EFLAGS; negative operands produce NaN.", "pseudocode": "xmm1[0:31] ← FP32_sqrt(xmm2/m32[0:31])\nxmm1[32:127] ← 0", "example": "SQRTSS xmm1, xmm2/m32"}
{"mnemonic": "sqrtsd", "architecture": "x86", "full_name": "Square Root Scalar Double-Precision", "summary": "Computes square root of the low double.", "syntax": "SQRTSD xmm1, xmm2/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 51", "visual_parts": [], "binary_pattern": "F2 | 0F | 51", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Computes the square root of the low 64-bit double-precision floating-point value in xmm2/m64 and stores the result in the low 64 bits of xmm1; the high 64 bits of xmm1 are set to zero. This operation follows IEEE 754 semantics and does not modify EFLAGS; negative operands produce NaN.", "pseudocode": "xmm1[0:63] ← FP64_sqrt(xmm2/m64[0:63])\nxmm1[64:127] ← 0", "example": "SQRTSD xmm1, xmm2/m64"}
{"mnemonic": "minss", "architecture": "x86", "full_name": "Minimum Scalar Single-Precision", "summary": "Returns the minimum of two low single-precision values.", "syntax": "MINSS xmm1, xmm2/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 5D", "visual_parts": [], "binary_pattern": "F3 | 0F | 5D", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Returns the minimum of the low 32-bit single-precision floating-point values from xmm1 and xmm2/m32, storing the result in xmm1; the upper 96 bits of xmm1 are preserved. Comparison follows IEEE 754 rules where NaN comparisons return NaN and negative zero is less than positive zero; EFLAGS are not modified.", "pseudocode": "xmm1[0:31] ← FP32_min(xmm1[0:31], xmm2/m32[0:31])\nxmm1[32:127] ← unchanged", "example": "MINSS xmm1, xmm2/m32"}
{"mnemonic": "minsd", "architecture": "x86", "full_name": "Minimum Scalar Double-Precision", "summary": "Returns the minimum of two low double-precision values.", "syntax": "MINSD xmm1, xmm2/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 5D", "visual_parts": [], "binary_pattern": "F2 | 0F | 5D", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Returns the minimum of the low 64-bit double-precision floating-point values from xmm1 and xmm2/m64, storing the result in xmm1; the high 64 bits of xmm1 are preserved. Comparison follows IEEE 754 rules where NaN comparisons return NaN and negative zero is less than positive zero; EFLAGS are not modified.", "pseudocode": "xmm1[0:63] ← FP64_min(xmm1[0:63], xmm2/m64[0:63])\nxmm1[64:127] ← unchanged", "example": "MINSD xmm1, xmm2/m64"}
{"mnemonic": "maxss", "architecture": "x86", "full_name": "Maximum Scalar Single-Precision", "summary": "Returns the maximum of two low single-precision values.", "syntax": "MAXSS xmm1, xmm2/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 5F", "visual_parts": [], "binary_pattern": "F3 | 0F | 5F", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Returns the maximum of the low 32-bit single-precision floating-point values from xmm1 and xmm2/m32, storing the result in xmm1; the upper 96 bits of xmm1 are preserved. Comparison follows IEEE 754 rules where NaN comparisons return NaN and positive zero is greater than negative zero; EFLAGS are not modified.", "pseudocode": "xmm1[0:31] ← FP32_max(xmm1[0:31], xmm2/m32[0:31])\nxmm1[32:127] ← unchanged", "example": "MAXSS xmm1, xmm2/m32"}
{"mnemonic": "maxsd", "architecture": "x86", "full_name": "Maximum Scalar Double-Precision", "summary": "Returns the maximum of two low double-precision values.", "syntax": "MAXSD xmm1, xmm2/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 5F", "visual_parts": [], "binary_pattern": "F2 | 0F | 5F", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares the low 64-bit double-precision floating-point values in the destination and source operands, returns the maximum value, and stores it in the low 64 bits of the destination XMM register while leaving the high 64 bits unchanged. No CPU flags are affected. This instruction operates only on the scalar (low) element; the upper 64 bits of xmm1 are preserved.", "pseudocode": "xmm1[0:63] ← max(xmm1[0:63], src[0:63]); xmm1[64:127] ← xmm1[64:127];", "example": "MAXSD xmm1, xmm2/m64"}
{"mnemonic": "cmpss", "architecture": "x86", "full_name": "Compare Scalar Single-Precision", "summary": "Compares low single-precision values and returns mask.", "syntax": "CMPSS xmm1, xmm2/m32, imm8", "encoding": {"format": "SSE", "hex_opcode": "F3 0F C2", "visual_parts": [], "binary_pattern": "F3 | 0F | C2", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs a scalar single-precision floating-point comparison between the low 32-bit elements of xmm1 and xmm2/m32 according to the condition specified by the immediate byte, storing a mask (all 1s or all 0s) in the low 32 bits of xmm1 while the upper 96 bits are preserved. No CPU flags are modified. The comparison predicate is encoded in imm8[2:0].", "pseudocode": "condition ← imm8[2:0]; result ← compare(xmm1[0:31], src[0:31], condition); xmm1[0:31] ← result ? 0xFFFFFFFF : 0; xmm1[32:127] ← xmm1[32:127];", "example": "CMPSS xmm1, xmm2/m32, 3"}
{"mnemonic": "cmpsd", "architecture": "x86", "full_name": "Compare Scalar Double-Precision", "summary": "Compares low double-precision values and returns mask.", "syntax": "CMPSD xmm1, xmm2/m64, imm8", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F C2", "visual_parts": [], "binary_pattern": "F2 | 0F | C2", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs a scalar double-precision floating-point comparison between the low 64-bit elements of xmm1 and xmm2/m64 according to the condition specified by the immediate byte, storing a mask (all 1s or all 0s) in the low 64 bits of xmm1 while the upper 64 bits are preserved. No CPU flags are modified. The comparison predicate is encoded in imm8[2:0].", "pseudocode": "condition ← imm8[2:0]; result ← compare(xmm1[0:63], src[0:63], condition); xmm1[0:63] ← result ? 0xFFFFFFFFFFFFFFFF : 0; xmm1[64:127] ← xmm1[64:127];", "example": "CMPSD xmm1, xmm2/m64, 3"}
{"mnemonic": "rcpss", "architecture": "x86", "full_name": "Reciprocal Scalar Single-Precision", "summary": "Computes approximate reciprocal (1/x) of low float.", "syntax": "RCPSS xmm1, xmm2/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 53", "visual_parts": [], "binary_pattern": "F3 | 0F | 53", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Computes an approximate reciprocal (1/x) of the low 32-bit single-precision floating-point value in the source operand and stores the result in the low 32 bits of the destination XMM register, while preserving the upper 96 bits of xmm1. No CPU flags are affected. The result has a maximum relative error of approximately 1.5×2^-12.", "pseudocode": "xmm1[0:31] ← 1.0 / src[0:31]; xmm1[32:127] ← xmm1[32:127];", "example": "RCPSS xmm1, xmm2/m32"}
{"mnemonic": "rsqrtss", "architecture": "x86", "full_name": "Reciprocal Square Root Scalar Single-Precision", "summary": "Computes approximate reciprocal sqrt (1/sqrt(x)) of low float.", "syntax": "RSQRTSS xmm1, xmm2/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 52", "visual_parts": [], "binary_pattern": "F3 | 0F | 52", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Computes an approximate reciprocal square root (1/√x) of the low 32-bit single-precision floating-point value in the source operand and stores the result in the low 32 bits of the destination XMM register, while preserving the upper 96 bits of xmm1. No CPU flags are affected. The result has a maximum relative error of approximately 1.5×2^-12.", "pseudocode": "xmm1[0:31] ← 1.0 / sqrt(src[0:31]); xmm1[32:127] ← xmm1[32:127];", "example": "RSQRTSS xmm1, xmm2/m32"}
{"mnemonic": "roundss", "architecture": "x86", "full_name": "Round Scalar Single-Precision", "summary": "Rounds low float according to immediate mode.", "syntax": "ROUNDSS xmm1, xmm2/m32, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 0A", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 0A", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rounds the low 32-bit single-precision floating-point value in xmm2/m32 according to the rounding mode specified in imm8 and stores the rounded result in the low 32 bits of xmm1, while preserving the upper 96 bits of xmm1. No CPU flags are affected. Rounding mode is selected via imm8[1:0]; bit 2 can suppress inexact exceptions.", "pseudocode": "mode ← imm8[1:0]; precision_exception_suppress ← imm8[2]; xmm1[0:31] ← round(src[0:31], mode, precision_exception_suppress); xmm1[32:127] ← xmm1[32:127];", "example": "ROUNDSS xmm1, xmm2/m32, 3"}
{"mnemonic": "roundsd", "architecture": "x86", "full_name": "Round Scalar Double-Precision", "summary": "Rounds low double according to immediate mode.", "syntax": "ROUNDSD xmm1, xmm2/m64, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 0B", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 0B", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rounds the low 64-bit double-precision floating-point value in xmm2/m64 according to the rounding mode specified in imm8 and stores the rounded result in the low 64 bits of xmm1, while preserving the upper 64 bits of xmm1. No CPU flags are affected. Rounding mode is selected via imm8[1:0]; bit 2 can suppress inexact exceptions.", "pseudocode": "mode ← imm8[1:0]; precision_exception_suppress ← imm8[2]; xmm1[0:63] ← round(src[0:63], mode, precision_exception_suppress); xmm1[64:127] ← xmm1[64:127];", "example": "ROUNDSD xmm1, xmm2/m64, 3"}
{"mnemonic": "cvttps2pi", "architecture": "x86", "full_name": "Convert with Truncation Packed Single to Packed Integer (MMX)", "summary": "Converts packed floats to packed MMX integers (Truncate).", "syntax": "CVTTPS2PI mm, xmm/m64", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 2C /r", "visual_parts": [], "binary_pattern": "0F | 2C", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "xmm/m64", "desc": "128-bit XMM register or 64-bit memory"}], "description": "Converts the two low single-precision floating-point values (32 bits each) from an XMM register or 64-bit memory location to two packed 32-bit signed integers via truncation, storing the result in an MMX register. The upper two single-precision values in the XMM operand are ignored. No CPU flags are affected; the instruction operates on the MMX register state.", "pseudocode": "mm[0:31] ← truncate_to_int32(src[0:31]); mm[32:63] ← truncate_to_int32(src[32:63]);", "example": "CVTTPS2PI mm, xmm1"}
{"mnemonic": "cvtps2pd", "architecture": "x86", "full_name": "Convert Packed Single to Packed Double", "summary": "Converts lower two floats to doubles.", "syntax": "CVTPS2PD xmm1, xmm2/m64", "encoding": {"format": "SSE2", "hex_opcode": "NP 0F 5A /r", "visual_parts": [], "binary_pattern": "0F | 5A", "bit_positions": "+0 | +1"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Converts the lower two packed single-precision floats (32-bit) to two packed double-precision floats (64-bit), storing the result in the destination XMM register. The conversion rounds according to the MXCSR rounding mode; #IA (invalid operation) and #D (denormal) exceptions may be signaled. No flags are affected.", "pseudocode": "dest[0:63] ← convert_sp_to_dp(src[0:31]);\ndest[64:127] ← convert_sp_to_dp(src[32:63]);", "example": "CVTPS2PD xmm1, xmm2/m64"}
{"mnemonic": "cvtpd2ps", "architecture": "x86", "full_name": "Convert Packed Double to Packed Single", "summary": "Converts two doubles to two floats.", "syntax": "CVTPD2PS xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 5A", "visual_parts": [], "binary_pattern": "66 | 0F | 5A", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Converts two packed double-precision floats (64-bit each) to two packed single-precision floats (32-bit each), storing the result in the lower 64 bits of the destination XMM register and zeroing the upper 64 bits. The conversion rounds according to the MXCSR rounding mode; #IA and #O (overflow) exceptions may be signaled. No flags are affected.", "pseudocode": "dest[0:31] ← convert_dp_to_sp(src[0:63]);\ndest[32:63] ← convert_dp_to_sp(src[64:127]);\ndest[64:127] ← 0;", "example": "CVTPD2PS xmm1, xmm2/m128"}
{"mnemonic": "jo", "architecture": "x86", "full_name": "Jump if Overflow", "summary": "Jump near if overflow flag is 1.", "syntax": "JO rel", "encoding": {"format": "Legacy", "hex_opcode": "70", "visual_parts": [], "binary_pattern": "70", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Performs a near jump to the target address if the overflow flag (OF) is set (1). The jump is relative to the instruction pointer; this is a conditional branch with no effect on CPU flags. Available in all modes (real, protected, 64-bit).", "pseudocode": "if (OF == 1) {\n  RIP ← RIP + sign_extend(rel8_or_rel32);\n}", "example": "JO rel"}
{"mnemonic": "jno", "architecture": "x86", "full_name": "Jump if Not Overflow", "summary": "Jump near if overflow flag is 0.", "syntax": "JNO rel", "encoding": {"format": "Legacy", "hex_opcode": "71", "visual_parts": [], "binary_pattern": "71", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Performs a near jump to the target address if the overflow flag (OF) is clear (0). The jump is relative to the instruction pointer; this is a conditional branch with no effect on CPU flags. Available in all modes (real, protected, 64-bit).", "pseudocode": "if (OF == 0) {\n  RIP ← RIP + sign_extend(rel8_or_rel32);\n}", "example": "JNO rel"}
{"mnemonic": "js", "architecture": "x86", "full_name": "Jump if Sign", "summary": "Jump near if sign flag is 1 (Negative).", "syntax": "JS rel", "encoding": {"format": "Legacy", "hex_opcode": "78", "visual_parts": [], "binary_pattern": "78", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Performs a near jump to the target address if the sign flag (SF) is set (1), indicating a negative result from a prior arithmetic operation. The jump is relative to the instruction pointer; this is a conditional branch with no effect on CPU flags. Available in all modes (real, protected, 64-bit).", "pseudocode": "if (SF == 1) {\n  RIP ← RIP + sign_extend(rel8_or_rel32);\n}", "example": "JS rel"}
{"mnemonic": "jns", "architecture": "x86", "full_name": "Jump if Not Sign", "summary": "Jump near if sign flag is 0 (Positive).", "syntax": "JNS rel", "encoding": {"format": "Legacy", "hex_opcode": "79", "visual_parts": [], "binary_pattern": "79", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Performs a near jump to the target address if the sign flag (SF) is clear (0), indicating a non-negative result from a prior arithmetic operation. The jump is relative to the instruction pointer; this is a conditional branch with no effect on CPU flags. Available in all modes (real, protected, 64-bit).", "pseudocode": "if (SF == 0) {\n  RIP ← RIP + sign_extend(rel8_or_rel32);\n}", "example": "JNS rel"}
{"mnemonic": "jp", "architecture": "x86", "full_name": "Jump if Parity", "summary": "Jump near if parity flag is 1 (Even parity).", "syntax": "JP rel", "encoding": {"format": "Legacy", "hex_opcode": "7A", "visual_parts": [], "binary_pattern": "7A", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Performs a near jump to the target address if the parity flag (PF) is set (1), indicating even parity in the low-order byte of a prior operation result. The jump is relative to the instruction pointer; this is a conditional branch with no effect on CPU flags. Available in all modes (real, protected, 64-bit).", "pseudocode": "if (PF == 1) {\n  RIP ← RIP + sign_extend(rel8_or_rel32);\n}", "example": "JP rel"}
{"mnemonic": "jnp", "architecture": "x86", "full_name": "Jump if Not Parity", "summary": "Jump near if parity flag is 0 (Odd parity).", "syntax": "JNP rel", "encoding": {"format": "Legacy", "hex_opcode": "7B", "visual_parts": [], "binary_pattern": "7B", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "rel", "desc": "Relative branch offset"}], "description": "Performs a near jump to the target address if the parity flag (PF) is clear (0), indicating odd parity in the low-order byte of a prior operation result. The jump is relative to the instruction pointer; this is a conditional branch with no effect on CPU flags. Available in all modes (real, protected, 64-bit).", "pseudocode": "if (PF == 0) {\n  RIP ← RIP + sign_extend(rel8_or_rel32);\n}", "example": "JNP rel"}
{"mnemonic": "seto", "architecture": "x86", "full_name": "Set Byte on Overflow", "summary": "Sets byte to 1 if OF=1.", "syntax": "SETO r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 90", "visual_parts": [], "binary_pattern": "0F | 90", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the Overflow Flag (OF) is set, otherwise sets it to 0. This instruction does not modify any flags. Available in 32-bit and 64-bit modes; commonly used after arithmetic operations to test for signed overflow.", "pseudocode": "dest ← (OF == 1) ? 1 : 0;", "example": "SETO bl"}
{"mnemonic": "setno", "architecture": "x86", "full_name": "Set Byte on Not Overflow", "summary": "Sets byte to 1 if OF=0.", "syntax": "SETNO r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 91", "visual_parts": [], "binary_pattern": "0F | 91", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the Overflow Flag (OF) is clear, otherwise sets it to 0. This instruction does not modify any flags. Available in 32-bit and 64-bit modes; used to test when no signed overflow has occurred.", "pseudocode": "dest ← (OF == 0) ? 1 : 0;", "example": "SETNO bl"}
{"mnemonic": "setz", "architecture": "x86", "full_name": "Set Byte on Zero", "summary": "Sets byte to 1 if ZF=1.", "syntax": "SETZ r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 94", "visual_parts": [], "binary_pattern": "0F | 94", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the Zero Flag (ZF) is set, otherwise sets it to 0. This instruction does not modify any flags. Available in 32-bit and 64-bit modes; commonly used after comparisons or arithmetic to test if the result was zero.", "pseudocode": "dest ← (ZF == 1) ? 1 : 0;", "example": "SETZ bl"}
{"mnemonic": "setnz", "architecture": "x86", "full_name": "Set Byte on Not Zero", "summary": "Sets byte to 1 if ZF=0.", "syntax": "SETNZ r/m8", "encoding": {"format": "Legacy", "hex_opcode": "0F 95", "visual_parts": [], "binary_pattern": "0F | 95", "bit_positions": "+0 | +1"}, "extension": "Base", "operands": [{"name": "dest", "type": "r/m8", "desc": "8-bit register or memory"}], "description": "Sets the destination byte to 1 if the Zero Flag (ZF) is clear, otherwise sets it to 0. This instruction does not modify any flags. Available in 32-bit and 64-bit modes; commonly used after comparisons or arithmetic to test if the result was non-zero.", "pseudocode": "dest ← (ZF == 0) ? 1 : 0;", "example": "SETNZ bl"}
{"mnemonic": "cmovg", "architecture": "x86", "full_name": "Conditional Move Greater", "summary": "Move if ZF=0 and SF=OF.", "syntax": "CMOVG r, r/m", "encoding": {"format": "Legacy", "hex_opcode": "0F 4F", "visual_parts": [], "binary_pattern": "0F | 4F", "bit_positions": "+0 | +1"}, "extension": "CMOV", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Conditionally moves the source operand to the destination register if the signed greater-than condition is true (ZF=0 and SF=OF). No flags are modified by this instruction. The operand size can be 16, 32, or 64 bits (determined by REX.W and operand-size prefix). Requires the CMOV extension; available in 32-bit and 64-bit modes.", "pseudocode": "if (ZF == 0 && SF == OF) dest ← src;", "example": "CMOVG rax, rbx"}
{"mnemonic": "cmovge", "architecture": "x86", "full_name": "Conditional Move Greater or Equal", "summary": "Move if SF=OF.", "syntax": "CMOVGE r, r/m", "encoding": {"format": "Legacy", "hex_opcode": "0F 4D", "visual_parts": [], "binary_pattern": "0F | 4D", "bit_positions": "+0 | +1"}, "extension": "CMOV", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Conditionally moves the source operand to the destination register if the signed greater-than-or-equal condition is true (SF=OF). No flags are modified by this instruction. The operand size can be 16, 32, or 64 bits (determined by REX.W and operand-size prefix). Requires the CMOV extension; available in 32-bit and 64-bit modes.", "pseudocode": "if (SF == OF) dest ← src;", "example": "CMOVGE rax, rbx"}
{"mnemonic": "cmovl", "architecture": "x86", "full_name": "Conditional Move Less", "summary": "Move if SF!=OF.", "syntax": "CMOVL r, r/m", "encoding": {"format": "Legacy", "hex_opcode": "0F 4C", "visual_parts": [], "binary_pattern": "0F | 4C", "bit_positions": "+0 | +1"}, "extension": "CMOV", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Conditionally moves the source operand to the destination register if the signed less-than condition is true (SF≠OF). No flags are modified by this instruction. The operand size can be 16, 32, or 64 bits (determined by REX.W and operand-size prefix). Requires the CMOV extension; available in 32-bit and 64-bit modes.", "pseudocode": "if (SF != OF) dest ← src;", "example": "CMOVL rax, rbx"}
{"mnemonic": "cmovle", "architecture": "x86", "full_name": "Conditional Move Less or Equal", "summary": "Move if ZF=1 or SF!=OF.", "syntax": "CMOVLE r, r/m", "encoding": {"format": "Legacy", "hex_opcode": "0F 4E", "visual_parts": [], "binary_pattern": "0F | 4E", "bit_positions": "+0 | +1"}, "extension": "CMOV", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Conditionally moves the source operand to the destination register if the signed less-than-or-equal condition is true (ZF=1 or SF≠OF). No flags are modified by this instruction. The operand size can be 16, 32, or 64 bits (determined by REX.W and operand-size prefix). Requires the CMOV extension; available in 32-bit and 64-bit modes.", "pseudocode": "if (ZF == 1 || SF != OF) dest ← src;", "example": "CMOVLE rax, rbx"}
{"mnemonic": "cmovz", "architecture": "x86", "full_name": "Conditional Move Zero", "summary": "Move if ZF=1.", "syntax": "CMOVZ r, r/m", "encoding": {"format": "Legacy", "hex_opcode": "0F 44", "visual_parts": [], "binary_pattern": "0F | 44", "bit_positions": "+0 | +1"}, "extension": "CMOV", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Conditionally moves the source operand to the destination register if the Zero Flag (ZF) is set to 1, otherwise the destination register remains unchanged. This instruction operates on 16/32/64-bit operands and does not modify any CPU flags. It is available in protected mode and 64-bit mode on processors supporting the CMOV extension.", "pseudocode": "if (ZF == 1) { dest ← src; }", "example": "CMOVZ rax, rbx"}
{"mnemonic": "cmovnz", "architecture": "x86", "full_name": "Conditional Move Not Zero", "summary": "Move if ZF=0.", "syntax": "CMOVNZ r, r/m", "encoding": {"format": "Legacy", "hex_opcode": "0F 45", "visual_parts": [], "binary_pattern": "0F | 45", "bit_positions": "+0 | +1"}, "extension": "CMOV", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "r/m", "desc": "Register or memory operand"}], "description": "Conditionally moves the source operand to the destination register if the Zero Flag (ZF) is cleared to 0 (i.e., result was non-zero), otherwise the destination register remains unchanged. This instruction operates on 16/32/64-bit operands and does not modify any CPU flags. It is available in protected mode and 64-bit mode on processors supporting the CMOV extension.", "pseudocode": "if (ZF == 0) { dest ← src; }", "example": "CMOVNZ rax, rbx"}
{"mnemonic": "paddusw", "architecture": "x86", "full_name": "Packed Add Unsigned Saturation Word", "summary": "Adds 16-bit words with unsigned saturation.", "syntax": "PADDUSW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F DD", "visual_parts": [], "binary_pattern": "66 | 0F | DD", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Adds eight pairs of 16-bit unsigned integers in parallel from the destination and source operands, with unsigned saturation applied to each pair independently. The result is stored in the destination XMM register; overflow is clamped to 0xFFFF and does not set CPU flags. Available in SSE2 and later extensions.", "pseudocode": "for (i = 0; i < 8; i++) { result[i] = UNSIGNED_SAT_16(dest[i] + src[i]); } dest ← result;", "example": "PADDUSW xmm1, xmm2/m128"}
{"mnemonic": "paddsw", "architecture": "x86", "full_name": "Packed Add Signed Saturation Word", "summary": "Adds 16-bit words with signed saturation.", "syntax": "PADDSW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F ED", "visual_parts": [], "binary_pattern": "66 | 0F | ED", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Adds eight pairs of 16-bit signed integers in parallel from the destination and source operands, with signed saturation applied to each pair independently. The result is stored in the destination XMM register; overflow is clamped to 0x7FFF and underflow to 0x8000, and no CPU flags are modified. Available in SSE2 and later extensions.", "pseudocode": "for (i = 0; i < 8; i++) { result[i] = SIGNED_SAT_16(dest[i] + src[i]); } dest ← result;", "example": "PADDSW xmm1, xmm2/m128"}
{"mnemonic": "psubusw", "architecture": "x86", "full_name": "Packed Subtract Unsigned Saturation Word", "summary": "Subtracts 16-bit words with unsigned saturation.", "syntax": "PSUBUSW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F D9", "visual_parts": [], "binary_pattern": "66 | 0F | D9", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Subtracts eight pairs of 16-bit unsigned integers in parallel; the source is subtracted from the destination with unsigned saturation applied to each pair independently. The result is stored in the destination XMM register; underflow is clamped to 0x0000 and does not set CPU flags. Available in SSE2 and later extensions.", "pseudocode": "for (i = 0; i < 8; i++) { result[i] = UNSIGNED_SAT_16(dest[i] - src[i]); } dest ← result;", "example": "PSUBUSW xmm1, xmm2/m128"}
{"mnemonic": "psubsw", "architecture": "x86", "full_name": "Packed Subtract Signed Saturation Word", "summary": "Subtracts 16-bit words with signed saturation.", "syntax": "PSUBSW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F E9", "visual_parts": [], "binary_pattern": "66 | 0F | E9", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Subtracts eight pairs of 16-bit signed integers in parallel; the source is subtracted from the destination with signed saturation applied to each pair independently. The result is stored in the destination XMM register; overflow is clamped to 0x7FFF and underflow to 0x8000, and no CPU flags are modified. Available in SSE2 and later extensions.", "pseudocode": "for (i = 0; i < 8; i++) { result[i] = SIGNED_SAT_16(dest[i] - src[i]); } dest ← result;", "example": "PSUBSW xmm1, xmm2/m128"}
{"mnemonic": "pmullw", "architecture": "x86", "full_name": "Packed Multiply Low Word", "summary": "Multiplies 16-bit words and stores low 16-bit result.", "syntax": "PMULLW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F D5", "visual_parts": [], "binary_pattern": "66 | 0F | D5", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Multiplies eight pairs of 16-bit signed integers from the destination and source operands in parallel; the low 16 bits of each 32-bit product are stored in the destination XMM register while the high 16 bits are discarded. No CPU flags are modified, and this instruction does not generate saturation. Available in SSE2 and later extensions.", "pseudocode": "for (i = 0; i < 8; i++) { product = (int32_t)dest[i] * (int32_t)src[i]; result[i] = (int16_t)(product & 0xFFFF); } dest ← result;", "example": "PMULLW xmm1, xmm2/m128"}
{"mnemonic": "pmaddwd", "architecture": "x86", "full_name": "Packed Multiply and Add Word to Doubleword", "summary": "Multiplies words, adds adjacent pairs to doublewords.", "syntax": "PMADDWD xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F F5", "visual_parts": [], "binary_pattern": "66 | 0F | F5", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Multiplies four pairs of 16-bit signed integers from the destination and source operands in parallel; adjacent pairs of 32-bit products are then summed with signed saturation, and the four 32-bit saturated results are stored in the destination XMM register. No CPU flags are modified. Available in SSE2 and later extensions.", "pseudocode": "for (i = 0; i < 4; i++) { prod0 = (int32_t)dest[2*i] * (int32_t)src[2*i]; prod1 = (int32_t)dest[2*i+1] * (int32_t)src[2*i+1]; result[i] = SIGNED_SAT_32(prod0 + prod1); } dest ← result;", "example": "PMADDWD xmm1, xmm2/m128"}
{"mnemonic": "pcmpgtb", "architecture": "x86", "full_name": "Packed Compare Greater Than Byte", "summary": "Compares bytes for greater than (signed).", "syntax": "PCMPGTB xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 64", "visual_parts": [], "binary_pattern": "66 | 0F | 64", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed signed bytes in xmm1 against xmm2/m128, setting each byte in xmm1 to 0xFF if the comparison is true or 0x00 if false. This is a SIMD integer comparison with no CPU flags affected; the result mask is stored directly in the destination XMM register.", "pseudocode": "for i = 0 to 15:\n  if xmm1[byte_i] > xmm2/m128[byte_i] (signed):\n    xmm1[byte_i] ← 0xFF\n  else:\n    xmm1[byte_i] ← 0x00", "example": "PCMPGTB xmm1, xmm2/m128"}
{"mnemonic": "pcmpgtw", "architecture": "x86", "full_name": "Packed Compare Greater Than Word", "summary": "Compares words for greater than (signed).", "syntax": "PCMPGTW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 65", "visual_parts": [], "binary_pattern": "66 | 0F | 65", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed signed words in xmm1 against xmm2/m128, setting each word in xmm1 to 0xFFFF if the comparison is true or 0x0000 if false. This is a SIMD integer comparison with no CPU flags affected; the result mask is stored directly in the destination XMM register.", "pseudocode": "for i = 0 to 7:\n  if xmm1[word_i] > xmm2/m128[word_i] (signed):\n    xmm1[word_i] ← 0xFFFF\n  else:\n    xmm1[word_i] ← 0x0000", "example": "PCMPGTW xmm1, xmm2/m128"}
{"mnemonic": "pcmpgtd", "architecture": "x86", "full_name": "Packed Compare Greater Than Doubleword", "summary": "Compares doublewords for greater than (signed).", "syntax": "PCMPGTD xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 66", "visual_parts": [], "binary_pattern": "66 | 0F | 66", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Compares packed signed doublewords in xmm1 against xmm2/m128, setting each doubleword in xmm1 to 0xFFFFFFFF if the comparison is true or 0x00000000 if false. This is a SIMD integer comparison with no CPU flags affected; the result mask is stored directly in the destination XMM register.", "pseudocode": "for i = 0 to 3:\n  if xmm1[dword_i] > xmm2/m128[dword_i] (signed):\n    xmm1[dword_i] ← 0xFFFFFFFF\n  else:\n    xmm1[dword_i] ← 0x00000000", "example": "PCMPGTD xmm1, xmm2/m128"}
{"mnemonic": "pinsrw", "architecture": "x86", "full_name": "Packed Insert Word", "summary": "Inserts a word from integer register into XMM.", "syntax": "PINSRW xmm1, r32/m16, imm8", "encoding": {"format": "SSE", "hex_opcode": "66 0F C4", "visual_parts": [], "binary_pattern": "66 | 0F | C4", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "r32/m16", "desc": "General-purpose register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Inserts a 16-bit word from a general-purpose register or memory into an XMM register at the position specified by an 8-bit index. The low 16 bits of the source are extracted; other bits in the destination XMM register remain unchanged. No CPU flags are affected.", "pseudocode": "index ← imm8 & 0x7\nword_value ← (r32/m16) & 0xFFFF\nxmm1[word_index * 16 : word_index * 16 + 15] ← word_value", "example": "PINSRW xmm1, r32/m16, 3"}
{"mnemonic": "pextrw", "architecture": "x86", "full_name": "Packed Extract Word", "summary": "Extracts a word from XMM to integer register.", "syntax": "PEXTRW r32, xmm1, imm8", "encoding": {"format": "SSE", "hex_opcode": "66 0F C5", "visual_parts": [], "binary_pattern": "66 | 0F | C5", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src1", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Extracts a 16-bit word from an XMM register at the position specified by an 8-bit index and zero-extends it into a 32-bit general-purpose register. The upper 16 bits of the destination register are zeroed. No CPU flags are affected.", "pseudocode": "index ← imm8 & 0x7\nword_value ← xmm1[word_index * 16 : word_index * 16 + 15]\nr32 ← zero_extend(word_value, 32)", "example": "PEXTRW eax, xmm1, 3"}
{"mnemonic": "pshuflw", "architecture": "x86", "full_name": "Packed Shuffle Low Words", "summary": "Shuffles the low 4 words of XMM.", "syntax": "PSHUFLW xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 70", "visual_parts": [], "binary_pattern": "F2 | 0F | 70", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shuffles the low 4 words of an XMM register using an 8-bit immediate that specifies the source indices for each destination word; the high 4 words are unchanged. This is a data permutation with no CPU flags affected.", "pseudocode": "order ← imm8\nfor i = 0 to 3:\n  src_index ← (order >> (i * 2)) & 0x3\n  xmm1[word_i] ← (xmm2/m128)[word_src_index]\nfor i = 4 to 7:\n  xmm1[word_i] ← (xmm2/m128)[word_i]", "example": "PSHUFLW xmm1, xmm2/m128, 3"}
{"mnemonic": "pshufhw", "architecture": "x86", "full_name": "Packed Shuffle High Words", "summary": "Shuffles the high 4 words of XMM.", "syntax": "PSHUFHW xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE2", "hex_opcode": "F3 0F 70", "visual_parts": [], "binary_pattern": "F3 | 0F | 70", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shuffles the high 4 words of an XMM register using an 8-bit immediate that specifies the source indices for each destination word; the low 4 words are unchanged. This is a data permutation with no CPU flags affected.", "pseudocode": "order ← imm8\nfor i = 0 to 3:\n  xmm1[word_i] ← (xmm2/m128)[word_i]\nfor i = 4 to 7:\n  src_index ← (order >> ((i - 4) * 2)) & 0x3\n  xmm1[word_i] ← (xmm2/m128)[word_(4 + src_index)]", "example": "PSHUFHW xmm1, xmm2/m128, 3"}
{"mnemonic": "movntq", "architecture": "x86", "full_name": "Move Non-Temporal Quadword", "summary": "Stores 64-bit MMX data bypassing cache.", "syntax": "MOVNTQ m64, mm", "encoding": {"format": "SSE", "hex_opcode": "NP 0F E7 /r", "visual_parts": [], "binary_pattern": "0F | E7", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "m64", "desc": "64-bit memory operand (quadword)"}, {"name": "src", "type": "mm", "desc": "64-bit MMX register"}], "description": "Stores a 64-bit quadword from an MMX register directly to memory, bypassing the L1 and L2 caches (non-temporal hint). This instruction provides a memory-ordering serialization point and can improve performance for streaming writes that do not benefit from caching. No CPU flags are affected.", "pseudocode": "[m64] ← mm (non-temporal write)", "example": "MOVNTQ [rbp-8], mm"}
{"mnemonic": "movnti", "architecture": "x86", "full_name": "Move Non-Temporal Integer", "summary": "Stores integer register to memory bypassing cache.", "syntax": "MOVNTI m32, r32", "encoding": {"format": "SSE2", "hex_opcode": "NP 0F C3 /r", "visual_parts": [], "binary_pattern": "0F | C3", "bit_positions": "+0 | +1"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "m32", "desc": "32-bit memory operand"}, {"name": "src", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Stores a 32-bit or 64-bit general-purpose register to memory while bypassing the L1 and L2 caches, using a non-temporal hint to the memory subsystem. This instruction is useful for streaming writes that are unlikely to be reused soon. No flags are affected; the instruction may serialize the store buffer but does not guarantee memory ordering with respect to other instructions.", "pseudocode": "[dest] ← src", "example": "MOVNTI [rbp-4], eax"}
{"mnemonic": "cmpxchg16b", "architecture": "x86", "full_name": "Compare and Exchange 16 Bytes", "summary": "Atomically compares 128-bit memory with RDX:RAX.", "syntax": "CMPXCHG16B m128", "encoding": {"format": "Base (64-bit)", "hex_opcode": "REX.W + 0F C7 /1", "visual_parts": [], "binary_pattern": "0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "Base (64-bit)", "operands": [{"name": "dest", "type": "m128", "desc": "128-bit memory operand"}], "description": "Atomically compares a 128-bit memory operand with the implicit 128-bit value in RDX:RAX; if they match, writes RCX:RBX to memory and sets ZF to 1; otherwise, loads the memory value into RDX:RAX and clears ZF. This instruction requires 16-byte alignment and is only available in 64-bit mode; it serializes the memory bus and guarantees atomic execution.", "pseudocode": "if ([dest] == (RDX:RAX)) {\n  [dest] ← (RCX:RBX);\n  ZF ← 1;\n} else {\n  (RDX:RAX) ← [dest];\n  ZF ← 0;\n}", "example": "CMPXCHG16B [rbp-16]"}
{"mnemonic": "movbe", "architecture": "x86", "full_name": "Move Big-Endian", "summary": "Moves data swapping bytes (Big Endian load/store).", "syntax": "MOVBE r, m", "encoding": {"format": "Legacy", "hex_opcode": "0F 38 F0", "visual_parts": [], "binary_pattern": "0F | 38 | F0", "bit_positions": "+0 | +1 | +2"}, "extension": "MOVBE", "operands": [{"name": "dest", "type": "r", "desc": "General-purpose register"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Loads data from memory or register and reverses the byte order (big-endian conversion) while storing to the destination register or memory. Supports 16-bit, 32-bit, and 64-bit operands; no flags are affected. Available on processors with the MOVBE extension; useful for endianness conversion in multi-byte data transfers.", "pseudocode": "if (dest is register) {\n  dest ← byte_reverse(src);\n} else {\n  [dest] ← byte_reverse(src);\n}", "example": "MOVBE rax, [rbp-8]"}
{"mnemonic": "blendvpd", "architecture": "x86", "full_name": "Variable Blend Packed Double", "summary": "Blends doubles based on variable mask in XMM0.", "syntax": "BLENDVPD xmm1, xmm2/m128, <XMM0>", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 15", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 15", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "<XMM0>", "desc": "Implicit XMM0 register (blend control mask)"}], "description": "Blends two packed double-precision floating-point values in XMM registers or memory based on per-lane sign bits of an implicit mask in XMM0; for each 64-bit lane, if the sign bit is 1, the value from the second source is selected, otherwise from the first source. Part of SSE4.1; no flags are affected. The result is stored in the first source operand (xmm1).", "pseudocode": "for i = 0 to 1 {\n  if (XMM0.qword[i] < 0) {\n    xmm1.double[i] ← src1.double[i];\n  } else {\n    xmm1.double[i] ← xmm1.double[i];\n  }\n}", "example": "BLENDVPD xmm1, xmm2/m128, <XMM0>"}
{"mnemonic": "blendvps", "architecture": "x86", "full_name": "Variable Blend Packed Single", "summary": "Blends floats based on variable mask in XMM0.", "syntax": "BLENDVPS xmm1, xmm2/m128, <XMM0>", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 14", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 14", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "<XMM0>", "desc": "Implicit XMM0 register (blend control mask)"}], "description": "Blends two packed single-precision floating-point values in XMM registers or memory based on per-lane sign bits of an implicit mask in XMM0; for each 32-bit lane, if the sign bit is 1, the value from the second source is selected, otherwise from the first source. Part of SSE4.1; no flags are affected. The result is stored in the first source operand (xmm1).", "pseudocode": "for i = 0 to 3 {\n  if (XMM0.dword[i] < 0) {\n    xmm1.float[i] ← src1.float[i];\n  } else {\n    xmm1.float[i] ← xmm1.float[i];\n  }\n}", "example": "BLENDVPS xmm1, xmm2/m128, <XMM0>"}
{"mnemonic": "pblendvb", "architecture": "x86", "full_name": "Variable Blend Packed Bytes", "summary": "Blends bytes based on variable mask in XMM0.", "syntax": "PBLENDVB xmm1, xmm2/m128, <XMM0>", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 10", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 10", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "<XMM0>", "desc": "Implicit XMM0 register (blend control mask)"}], "description": "Blends two packed byte values in XMM registers or memory based on per-byte sign bits of an implicit mask in XMM0; for each byte, if the sign bit is 1, the value from the second source is selected, otherwise from the first source. Part of SSE4.1; no flags are affected. The result is stored in the first source operand (xmm1).", "pseudocode": "for i = 0 to 15 {\n  if (XMM0.byte[i] < 0) {\n    xmm1.byte[i] ← src1.byte[i];\n  } else {\n    xmm1.byte[i] ← xmm1.byte[i];\n  }\n}", "example": "PBLENDVB xmm1, xmm2/m128, <XMM0>"}
{"mnemonic": "vmrun", "architecture": "x86", "full_name": "Run Virtual Machine", "summary": "Switch to guest VM (AMD SVM).", "syntax": "VMRUN", "encoding": {"format": "SVM", "hex_opcode": "0F 01 D8", "visual_parts": [], "binary_pattern": "0F | 01 | D8", "bit_positions": "+0 | +1 | +2"}, "extension": "SVM", "operands": [], "description": "Switches execution from host to guest virtual machine context by loading guest state from the VMCB (Virtual Machine Control Block) addressed by RAX; serializes the processor and triggers a full context switch including segment registers, control registers, and TLB state. Available only in 64-bit mode with AMD SVM (Secure Virtual Machine) enabled and appropriate privilege level; no flags are affected from the host perspective as execution transfers to guest.", "pseudocode": "VMCB_addr ← RAX;\nload_guest_state(VMCB_addr);\nexecute_guest();", "example": "VMRUN"}
{"mnemonic": "vmload", "architecture": "x86", "full_name": "Load State from VMCB", "summary": "Loads processor state from VMCB (AMD SVM).", "syntax": "VMLOAD", "encoding": {"format": "SVM", "hex_opcode": "0F 01 DA", "visual_parts": [], "binary_pattern": "0F | 01 | DA", "bit_positions": "+0 | +1 | +2"}, "extension": "SVM", "operands": [], "description": "Loads processor state (segments, control registers, debug registers, and other hidden state) from the VMCB (Virtual Machine Control Block) referenced by RAX without switching to guest mode execution. Part of AMD SVM; requires 64-bit mode and appropriate privilege level; no flags are affected. This instruction is typically used in host or nested virtualization contexts to synchronize host state.", "pseudocode": "VMCB_addr ← RAX;\nload_state_from_VMCB(VMCB_addr);", "example": "VMLOAD"}
{"mnemonic": "vmsave", "architecture": "x86", "full_name": "Save State to VMCB", "summary": "Saves processor state to VMCB (AMD SVM).", "syntax": "VMSAVE", "encoding": {"format": "SVM", "hex_opcode": "0F 01 DB", "visual_parts": [], "binary_pattern": "0F | 01 | DB", "bit_positions": "+0 | +1 | +2"}, "extension": "SVM", "operands": [], "description": "Saves the current processor state to the VMCB (Virtual Machine Control Block) at the address specified in RAX. This is a privileged SVM instruction that serializes the processor and must execute at privilege level 0. The instruction writes guest state registers and internal processor state to memory; it does not modify flags.", "pseudocode": "[RAX + offset] ← processor_state; // VMCB state save", "example": "VMSAVE"}
{"mnemonic": "clgi", "architecture": "x86", "full_name": "Clear Global Interrupt Flag", "summary": "Disables global interrupts (AMD SVM).", "syntax": "CLGI", "encoding": {"format": "SVM", "hex_opcode": "0F 01 DD", "visual_parts": [], "binary_pattern": "0F | 01 | DD", "bit_positions": "+0 | +1 | +2"}, "extension": "SVM", "operands": [], "description": "Clears the Global Interrupt Flag (GIF) in the VMCB, which disables interrupts and exceptions at the SVM guest level. This is a privileged instruction that requires CPL=0 and SVM capability. It does not modify EFLAGS but affects the processor's ability to accept external interrupts.", "pseudocode": "GIF ← 0; // Global interrupt flag disabled", "example": "CLGI"}
{"mnemonic": "stgi", "architecture": "x86", "full_name": "Set Global Interrupt Flag", "summary": "Enables global interrupts (AMD SVM).", "syntax": "STGI", "encoding": {"format": "SVM", "hex_opcode": "0F 01 DC", "visual_parts": [], "binary_pattern": "0F | 01 | DC", "bit_positions": "+0 | +1 | +2"}, "extension": "SVM", "operands": [], "description": "Sets the Global Interrupt Flag (GIF) in the VMCB, enabling interrupts and exceptions at the SVM guest level. This is a privileged instruction requiring CPL=0 and SVM capability. After execution, the processor will accept maskable interrupts; no EFLAGS are modified.", "pseudocode": "GIF ← 1; // Global interrupt flag enabled", "example": "STGI"}
{"mnemonic": "invlpga", "architecture": "x86", "full_name": "Invalidate TLB Entry in ASID", "summary": "Invalidates TLB entry for specific ASID (AMD SVM).", "syntax": "INVLPGA", "encoding": {"format": "SVM", "hex_opcode": "0F 01 DF", "visual_parts": [], "binary_pattern": "0F | 01 | DF", "bit_positions": "+0 | +1 | +2"}, "extension": "SVM", "operands": [], "description": "Invalidates TLB entries for a linear address using the ASID (Address Space Identifier) specified in ECX, applicable only within the current VMCB context. This is a privileged SVM instruction that selectively flushes TLB entries without serializing the entire pipeline. The linear address is implicitly taken from RAX.", "pseudocode": "TLB_entry ← invalidate(RAX, ECX); // Invalidate TLB with ASID", "example": "INVLPGA"}
{"mnemonic": "pfadd", "architecture": "x86", "full_name": "Packed Floating-Point Add", "summary": "Adds two packed floats (3DNow!).", "syntax": "PFADD mm, mm/m64", "encoding": {"format": "3DNow!", "hex_opcode": "0F 0F /r 9E", "visual_parts": [], "binary_pattern": "0F | 0F | ModRM | 9E", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "3DNow!", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Adds two packed single-precision floating-point values (two 32-bit floats per 64-bit operand) using 3DNow! arithmetic. The result is written to the destination MMX register with round-to-nearest mode. This instruction does not modify EFLAGS; floating-point exceptions may be masked or pending.", "pseudocode": "dest[31:0] ← float_add(dest[31:0], src[31:0]); dest[63:32] ← float_add(dest[63:32], src[63:32]);", "example": "PFADD mm, mm/m64"}
{"mnemonic": "pfsub", "architecture": "x86", "full_name": "Packed Floating-Point Subtract", "summary": "Subtracts packed floats (3DNow!).", "syntax": "PFSUB mm, mm/m64", "encoding": {"format": "3DNow!", "hex_opcode": "0F 0F /r 9A", "visual_parts": [], "binary_pattern": "0F | 0F | ModRM | 9A", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "3DNow!", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Subtracts two packed single-precision floating-point values (two 32-bit floats per 64-bit operand) using 3DNow! arithmetic. The result is written to the destination MMX register. This instruction does not modify EFLAGS; floating-point exceptions may be masked or pending.", "pseudocode": "dest[31:0] ← float_sub(dest[31:0], src[31:0]); dest[63:32] ← float_sub(dest[63:32], src[63:32]);", "example": "PFSUB mm, mm/m64"}
{"mnemonic": "pfmul", "architecture": "x86", "full_name": "Packed Floating-Point Multiply", "summary": "Multiplies packed floats (3DNow!).", "syntax": "PFMUL mm, mm/m64", "encoding": {"format": "3DNow!", "hex_opcode": "0F 0F /r B4", "visual_parts": [], "binary_pattern": "0F | 0F | ModRM | B4", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "3DNow!", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Multiplies two packed single-precision floating-point values (two 32-bit floats per 64-bit operand) using 3DNow! arithmetic. The result is written to the destination MMX register. This instruction does not modify EFLAGS; floating-point exceptions may be masked or pending.", "pseudocode": "dest[31:0] ← float_mul(dest[31:0], src[31:0]); dest[63:32] ← float_mul(dest[63:32], src[63:32]);", "example": "PFMUL mm, mm/m64"}
{"mnemonic": "pfrcp", "architecture": "x86", "full_name": "Packed Floating-Point Reciprocal", "summary": "Approximates reciprocal (3DNow!).", "syntax": "PFRCP mm, mm/m64", "encoding": {"format": "3DNow!", "hex_opcode": "0F 0F /r 96", "visual_parts": [], "binary_pattern": "0F | 0F | ModRM | 96", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "3DNow!", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Computes a fast approximation of the reciprocal (1/x) for each packed single-precision floating-point value using 3DNow!. The result is written to the destination MMX register with reduced precision (typically 14-15 bits of accuracy). This instruction does not modify EFLAGS; it may generate floating-point exceptions.", "pseudocode": "dest[31:0] ← float_reciprocal_approx(src[31:0]); dest[63:32] ← float_reciprocal_approx(src[63:32]);", "example": "PFRCP mm, mm/m64"}
{"mnemonic": "pfrsqrt", "architecture": "x86", "full_name": "Packed Floating-Point Reciprocal Square Root", "summary": "Approximates reciprocal sqrt (3DNow!).", "syntax": "PFRSQRT mm, mm/m64", "encoding": {"format": "3DNow!", "hex_opcode": "0F 0F /r 97", "visual_parts": [], "binary_pattern": "0F | 0F | ModRM | 97", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "3DNow!", "operands": [{"name": "dest", "type": "mm", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm/m64", "desc": "64-bit MMX register or Memory operand"}], "description": "Computes a fast approximation of the reciprocal square root (1/√x) for two packed single-precision floating-point values in parallel. This is a 3DNow! extension instruction that performs low-precision approximation suitable for iterative refinement; the approximation has limited accuracy (typically ~11-12 bits). No EFLAGS are modified.", "pseudocode": "dest[0:31] ← approx_rsqrt(src[0:31]);\ndest[32:63] ← approx_rsqrt(src[32:63]);", "example": "PFRSQRT mm, mm/m64"}
{"mnemonic": "vaddsh", "architecture": "x86", "full_name": "Add Scalar Half-Precision", "summary": "Adds low FP16 value.", "syntax": "VADDSH xmm1 {k1}, xmm2, xmm3/m16", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.F3.MAP5.W0 58 /r", "visual_parts": [], "binary_pattern": "EVEX | 58", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m16", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Adds the low-order half-precision (FP16) element from two XMM registers and stores the scalar result in the low 16 bits of the destination, with upper 112 bits cleared or preserved based on write-mask. Uses EVEX encoding with optional masking and suppression of exceptions. Rounding mode is determined by MXCSR[15:13].", "pseudocode": "if (k1[0] || !masking_enabled) {\n  dest[0:15] ← src1[0:15] +FP16 src2[0:15];\n} else {\n  dest[0:15] ← preserve_or_zero(dest[0:15]);\n}\ndest[16:127] ← 0;", "example": "VADDSH xmm1, xmm2, xmm3/m16"}
{"mnemonic": "vsubsh", "architecture": "x86", "full_name": "Subtract Scalar Half-Precision", "summary": "Subtracts low FP16 value.", "syntax": "VSUBSH xmm1 {k1}, xmm2, xmm3/m16", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.F3.MAP5.W0 5C /r", "visual_parts": [], "binary_pattern": "EVEX | 5C", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m16", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Subtracts the low-order half-precision (FP16) element of the second operand from the first and stores the scalar result in the low 16 bits of the destination, with upper 112 bits cleared or preserved based on write-mask. Uses EVEX encoding with optional masking and exception suppression. Rounding controlled by MXCSR[15:13].", "pseudocode": "if (k1[0] || !masking_enabled) {\n  dest[0:15] ← src1[0:15] -FP16 src2[0:15];\n} else {\n  dest[0:15] ← preserve_or_zero(dest[0:15]);\n}\ndest[16:127] ← 0;", "example": "VSUBSH xmm1, xmm2, xmm3/m16"}
{"mnemonic": "vmulsh", "architecture": "x86", "full_name": "Multiply Scalar Half-Precision", "summary": "Multiplies low FP16 value.", "syntax": "VMULSH xmm1 {k1}, xmm2, xmm3/m16", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.F3.MAP5.W0 59 /r", "visual_parts": [], "binary_pattern": "EVEX | 59", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m16", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Multiplies the low-order half-precision (FP16) element from two operands and stores the scalar result in the low 16 bits of the destination, with upper 112 bits cleared or preserved based on write-mask. Uses EVEX encoding with optional masking and exception control. Rounding mode determined by MXCSR[15:13].", "pseudocode": "if (k1[0] || !masking_enabled) {\n  dest[0:15] ← src1[0:15] ×FP16 src2[0:15];\n} else {\n  dest[0:15] ← preserve_or_zero(dest[0:15]);\n}\ndest[16:127] ← 0;", "example": "VMULSH xmm1, xmm2, xmm3/m16"}
{"mnemonic": "vdivsh", "architecture": "x86", "full_name": "Divide Scalar Half-Precision", "summary": "Divides low FP16 value.", "syntax": "VDIVSH xmm1 {k1}, xmm2, xmm3/m16", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.F3.MAP5.W0 5E /r", "visual_parts": [], "binary_pattern": "EVEX | 5E", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m16", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Divides the low-order half-precision (FP16) element of the first operand by the second and stores the scalar result in the low 16 bits of the destination, with upper 112 bits cleared or preserved based on write-mask. Uses EVEX encoding with optional masking and exception suppression. Rounding controlled by MXCSR[15:13]; may generate precision/underflow/overflow exceptions.", "pseudocode": "if (k1[0] || !masking_enabled) {\n  dest[0:15] ← src1[0:15] ÷FP16 src2[0:15];\n} else {\n  dest[0:15] ← preserve_or_zero(dest[0:15]);\n}\ndest[16:127] ← 0;", "example": "VDIVSH xmm1, xmm2, xmm3/m16"}
{"mnemonic": "vsqrtsh", "architecture": "x86", "full_name": "Square Root Scalar Half-Precision", "summary": "Square root of low FP16 value.", "syntax": "VSQRTSH xmm1 {k1}, xmm2/m16", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.F3.MAP5.W0 51 /r", "visual_parts": [], "binary_pattern": "EVEX | 51", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m16", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Computes the square root of the low-order half-precision (FP16) element and stores the scalar result in the low 16 bits of the destination, with upper 112 bits cleared or preserved based on write-mask. Uses EVEX encoding with optional masking and exception suppression. Rounding mode determined by MXCSR[15:13].", "pseudocode": "if (k1[0] || !masking_enabled) {\n  dest[0:15] ← sqrt_FP16(src[0:15]);\n} else {\n  dest[0:15] ← preserve_or_zero(dest[0:15]);\n}\ndest[16:127] ← 0;", "example": "VSQRTSH xmm1, xmm2/m16"}
{"mnemonic": "vfmadd132sh", "architecture": "x86", "full_name": "Fused Multiply-Add Scalar Half-Precision (132)", "summary": "Scalar FMA (Dest * Src2 + Src1) for FP16.", "syntax": "VFMADD132SH xmm1 {k1}, xmm2, xmm3/m16", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.66.MAP6.W0 99 /r", "visual_parts": [], "binary_pattern": "EVEX | 99", "bit_positions": "+0 | +4"}, "extension": "AVX-512-FP16", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m16", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs fused multiply-add on scalar half-precision (FP16) values: multiplies the destination by src2, adds src1, and stores result in destination. The '132' form computes (dest × src2) + src1. Uses EVEX encoding with optional masking and exception suppression. Single rounding applied to the final result per MXCSR[15:13].", "pseudocode": "if (k1[0] || !masking_enabled) {\n  dest[0:15] ← (dest[0:15] ×FP16 src2[0:15]) +FP16 src1[0:15];\n} else {\n  dest[0:15] ← preserve_or_zero(dest[0:15]);\n}\ndest[16:127] ← 0;", "example": "VFMADD132SH xmm1, xmm2, xmm3/m16"}
{"mnemonic": "vpmullq", "architecture": "x86", "full_name": "Packed Multiply Low Quadword", "summary": "Multiplies 64-bit integers and keeps low 64-bit result.", "syntax": "VPMULLQ zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 40 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 40", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Multiplies eight packed 64-bit signed integers and stores the low 64-bit results of each multiplication in eight 64-bit elements of the destination ZMM register. Uses EVEX encoding with optional per-element masking via write-mask register. No overflow flags are set; overflow is silently truncated to 64 bits.", "pseudocode": "for (i = 0; i < 8; i++) {\n  if (k1[i] || !masking_enabled) {\n    dest[64*i:64*i+63] ← (src1[64*i:64*i+63] ×64-bit src2[64*i:64*i+63]) & 0xFFFFFFFFFFFFFFFF;\n  } else {\n    dest[64*i:64*i+63] ← preserve_or_zero(dest[64*i:64*i+63]);\n  }\n}", "example": "VPMULLQ zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpabsd", "architecture": "x86", "full_name": "Packed Absolute Value Doubleword", "summary": "Computes absolute value of 32-bit integers.", "syntax": "VPABSD zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 1E /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 1E", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Computes the absolute value of packed 32-bit signed integers in the source operand and stores the results in the destination register. Each 32-bit element is independently processed; if the input is 0x80000000 (minimum signed 32-bit), the result remains 0x80000000 due to two's complement representation. Operates on 512-bit data with EVEX prefix, supporting write-masking via k1.", "pseudocode": "for i = 0 to 15 {\n  src_val = src[32*i+31:32*i]\n  if (src_val == 0x80000000) {\n    dest[32*i+31:32*i] = 0x80000000\n  } else if (src_val & 0x80000000 == 1) {\n    dest[32*i+31:32*i] = -src_val\n  } else {\n    dest[32*i+31:32*i] = src_val\n  }\n}", "example": "VPABSD zmm1, zmm2/m512"}
{"mnemonic": "valignq", "architecture": "x86", "full_name": "Align Quadword Vectors", "summary": "Extracts 512-bits from two concatenated ZMMs shifted by count.", "syntax": "VALIGNQ zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 03 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 03", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Extracts 512 bits from two concatenated 512-bit quadword vectors, with the extraction window shifted by an immediate count (in quadword units). The operation concatenates src1 and src2, then shifts right by count*64 bits. The lowest 512 bits of the result are stored in dest. Operates under EVEX with write-masking support.", "pseudocode": "shift_bits = (imm8 & 0x7) * 64\nconcatenated = (src2 << 512) | src1\nshifted = concatenated >> shift_bits\ndest = shifted[511:0]", "example": "VALIGNQ zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vdbpsadbw", "architecture": "x86", "full_name": "Double Block Packed Sum-Absolute-Differences", "summary": "Computes SAD on 16-bit blocks.", "syntax": "VDBPSADBW zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 42 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 42", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Computes double-block packed sum-of-absolute-differences on 16-bit blocks between src1 and src2, producing 16-bit results. The operation partitions each 128-bit lane into blocks of 16 bits, computes SAD across specified block boundaries controlled by imm8, and accumulates results into 16-bit fields. Requires AVX-512BW; operates on 512-bit vectors with EVEX masking.", "pseudocode": "for lane = 0 to 3 {\n  for block = 0 to 3 {\n    result = 0\n    block_offset = (imm8 >> (block*2)) & 0x3\n    for j = 0 to 1 {\n      idx1 = lane*128 + block*32 + j*16\n      idx2 = lane*128 + block_offset*32 + j*16\n      result += abs(src1[idx1+15:idx1] - src2[idx2+15:idx2])\n    }\n    dest[lane*128 + block*16 + 15 : lane*128 + block*16] = result[15:0]\n  }\n}", "example": "VDBPSADBW zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vrangess", "architecture": "x86", "full_name": "Range Restriction Calculation Scalar Single", "summary": "Calculates range (min/max/abs) of low float.", "syntax": "VRANGESS xmm1 {k1}, xmm2, xmm3/m32, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.66.0F3A.W0 51 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 51", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m32", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Restricts the range of the low single-precision float in xmm2 and the corresponding float from xmm3/m32 according to the range specification in imm8, storing the result in xmm1. The imm8 encodes operations such as minimum, maximum, and absolute value selection. Upper three floats of xmm1 are copied from xmm2 unchanged. Operates in 32-bit scalar mode with EVEX write-masking via k1; requires AVX-512DQ.", "pseudocode": "range_op = imm8[3:0]\nop1_float = xmm2[31:0]\nop2_float = xmm3/m32[31:0]\nxmm1[31:0] = perform_range_restriction(op1_float, op2_float, range_op)\nxmm1[127:32] = xmm2[127:32]", "example": "VRANGESS xmm1, xmm2, xmm3/m32, 3"}
{"mnemonic": "vfixupimmss", "architecture": "x86", "full_name": "Fix Up Special Scalar Float32 Value", "summary": "Fixes special cases (NaN, Inf) in low float using table.", "syntax": "VFIXUPIMMSS xmm1 {k1}, xmm2, xmm3/m32, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.66.0F3A.W0 55 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 55", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m32", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Fixes up special floating-point values (NaN, infinity, denormal, sign) in the low single-precision float using a table lookup controlled by imm8. The lookup uses xmm2[31:0] as one input and xmm3/m32[31:0] as reference, producing a corrected value in xmm1[31:0]. Upper three floats in xmm1 are copied from xmm2. Operates under EVEX with write-masking; AVX-512F compliant.", "pseudocode": "op1 = xmm2[31:0]\nop2 = xmm3/m32[31:0]\nlookup_index = (sign_of(op1)<<4) | (class_of(op1)<<1) | (class_of(op2))\nfixed_value = fixup_table[lookup_index][imm8[7:0]]\nxmm1[31:0] = fixed_value\nxmm1[127:32] = xmm2[127:32]", "example": "VFIXUPIMMSS xmm1, xmm2, xmm3/m32, 3"}
{"mnemonic": "vreducess", "architecture": "x86", "full_name": "Perform Reduction Transformation Scalar Single", "summary": "Performs reduction on low float.", "syntax": "VREDUCESS xmm1 {k1}, xmm2, xmm3/m32, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.66.0F3A.W0 57 /r /ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 57", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512DQ", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3/m32", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs a reduction transformation (rounding, exponent manipulation) on the low single-precision float from xmm2 and xmm3/m32 according to the control specified in imm8, storing the scalar result in xmm1[31:0]. Upper three floats in xmm1 are copied from xmm2. Reduction includes operations like round-to-integral, exponent bias removal, or truncation. Requires AVX-512DQ with EVEX masking.", "pseudocode": "reduction_op = (imm8[3:0])\nsignaling_bit = imm8[4]\nop1_float = xmm2[31:0]\nop2_float = xmm3/m32[31:0]\nxmm1[31:0] = perform_reduction(op1_float, op2_float, reduction_op, signaling_bit)\nxmm1[127:32] = xmm2[127:32]", "example": "VREDUCESS xmm1, xmm2, xmm3/m32, 3"}
{"mnemonic": "kandq", "architecture": "x86", "full_name": "Bitwise Logical AND Masks Quadword", "summary": "Bitwise AND of 64-bit mask registers.", "syntax": "KANDQ k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.0F.W1 41 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 41", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise logical AND on two 64-bit mask registers (k2 and k3) and stores the result in the destination mask register (k1). All 64 bits of the mask registers are operated on. This is a low-latency operation with no flag modifications. Requires AVX-512BW for 64-bit mask register support.", "pseudocode": "k1 = k2 & k3", "example": "KANDQ k1, k2, k3"}
{"mnemonic": "korq", "architecture": "x86", "full_name": "Bitwise Logical OR Masks Quadword", "summary": "Bitwise OR of 64-bit mask registers.", "syntax": "KORQ k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.0F.W1 45 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 45", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise logical OR on two 64-bit mask registers (k2 and k3) and stores the result in the destination mask register (k1). All 64 bits of the mask registers participate in the operation. This is a low-latency mask manipulation instruction with no EFLAGS modification. Requires AVX-512BW for 64-bit mask operations.", "pseudocode": "k1 = k2 | k3", "example": "KORQ k1, k2, k3"}
{"mnemonic": "knotq", "architecture": "x86", "full_name": "Bitwise Logical NOT Masks Quadword", "summary": "Bitwise NOT of 64-bit mask register.", "syntax": "KNOTQ k1, k2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.0F.W1 44 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 44", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise logical NOT operation on a 64-bit AVX-512 opmask register, inverting all bits. The instruction operates only on opmask registers (k0-k7) and does not affect general EFLAGS. This is an AVX-512BW extension instruction with no flag side effects.", "pseudocode": "dest ← ~src", "example": "KNOTQ k1, k2"}
{"mnemonic": "aesimc", "architecture": "x86", "full_name": "AES Inverse Mix Columns", "summary": "Performs AES InvMixColumns transformation (decryption helper).", "syntax": "AESIMC xmm1, xmm2/m128", "encoding": {"format": "AES-NI", "hex_opcode": "66 0F 38 DB", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | DB", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "AES-NI", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs the AES InvMixColumns transformation on a 128-bit XMM register, applying the inverse MixColumns step used in AES block cipher decryption. This is a cryptographic acceleration instruction from the AES-NI extension that operates on 128-bit values and produces no flag modifications.", "pseudocode": "dest ← InvMixColumns(src)", "example": "AESIMC xmm1, xmm2/m128"}
{"mnemonic": "maskmovq", "architecture": "x86", "full_name": "Store Selected Bytes of Quadword", "summary": "Non-temporal store of selected MMX bytes.", "syntax": "MASKMOVQ mm1, mm2", "encoding": {"format": "MMX", "hex_opcode": "NP 0F F7 /r", "visual_parts": [], "binary_pattern": "0F | F7", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [{"name": "dest", "type": "mm1", "desc": "64-bit MMX register"}, {"name": "src", "type": "mm2", "desc": "64-bit MMX register"}], "description": "Conditionally stores selected bytes from a 64-bit MMX register to memory based on byte-granularity mask bits from another MMX register, using the implicit address in EDI (32-bit) or RDI (64-bit). The instruction writes non-temporally where supported and does not affect EFLAGS; it requires real or protected mode for address generation.", "pseudocode": "for (i = 0; i < 8; i++) {\n  if (src[i*8 + 7] == 1) {\n    [EDI/RDI + i] ← dest[i*8 : i*8+7]\n  }\n}", "example": "MASKMOVQ mm1, mm2"}
{"mnemonic": "pmulld", "architecture": "x86", "full_name": "Packed Multiply Low Doubleword", "summary": "Multiplies 32-bit integers, stores low 32-bit result.", "syntax": "PMULLD xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 40", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 40", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Multiplies four pairs of 32-bit signed integers in parallel, storing the low 32 bits of each product in the destination XMM register. This SSE4.1 instruction operates on 128-bit vectors and does not modify EFLAGS; overflow is silently discarded.", "pseudocode": "for (i = 0; i < 4; i++) {\n  dest[i*32 : i*32+31] ← (src1[i*32 : i*32+31] * src2[i*32 : i*32+31]) & 0xFFFFFFFF\n}", "example": "PMULLD xmm1, xmm2/m128"}
{"mnemonic": "pmovsxbw", "architecture": "x86", "full_name": "Packed Move with Sign Extend Byte to Word", "summary": "Sign extends 8-bit integers to 16-bit.", "syntax": "PMOVSXBW xmm1, xmm2/m64", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 20", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 20", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Sign-extends four 8-bit signed integers from the lower 32 bits of the source to four 16-bit signed integers in the destination XMM register. This SSE4.1 instruction performs element-wise sign extension with no flag side effects; the upper 64 bits of the source are ignored.", "pseudocode": "for (i = 0; i < 4; i++) {\n  dest[i*16 : i*16+15] ← sign_extend_8to16(src[i*8 : i*8+7])\n}\ndest[64:127] ← 0", "example": "PMOVSXBW xmm1, xmm2/m64"}
{"mnemonic": "pmovzxbw", "architecture": "x86", "full_name": "Packed Move with Zero Extend Byte to Word", "summary": "Zero extends 8-bit integers to 16-bit.", "syntax": "PMOVZXBW xmm1, xmm2/m64", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 30", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 30", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Zero-extends four 8-bit unsigned integers from the lower 32 bits of the source to four 16-bit unsigned integers in the destination XMM register. This SSE4.1 instruction performs element-wise zero extension with no flag modifications; the upper 64 bits of the source are ignored.", "pseudocode": "for (i = 0; i < 4; i++) {\n  dest[i*16 : i*16+15] ← zero_extend_8to16(src[i*8 : i*8+7])\n}\ndest[64:127] ← 0", "example": "PMOVZXBW xmm1, xmm2/m64"}
{"mnemonic": "pinsrb", "architecture": "x86", "full_name": "Packed Insert Byte", "summary": "Inserts a byte from integer register into XMM.", "syntax": "PINSRB xmm1, r32/m8, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 20", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 20", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "r32/m8", "desc": "General-purpose register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Inserts an 8-bit integer value from a general-purpose register or memory into a byte position within the destination XMM register, as specified by an immediate index. This SSE4.1 instruction does not affect EFLAGS; the immediate selects one of 16 byte lanes (0-15) in the 128-bit register.", "pseudocode": "index ← src2 & 0xF\ndest[index*8 : index*8+7] ← src1[0:7]", "example": "PINSRB xmm1, r32/m8, 3"}
{"mnemonic": "pextrb", "architecture": "x86", "full_name": "Packed Extract Byte", "summary": "Extracts a byte from XMM to integer register.", "syntax": "PEXTRB r32/m8, xmm1, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 14", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 14", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "r32/m8", "desc": "General-purpose register or Memory operand"}, {"name": "src1", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Extracts an 8-bit byte from a specified position within the source XMM register and stores it into a general-purpose register or memory location. This SSE4.1 instruction does not modify EFLAGS; the immediate selects one of 16 byte lanes (0-15), and destination registers are zero-extended to 32 bits when writing to r32.", "pseudocode": "index ← src2 & 0xF\ndest ← src1[index*8 : index*8+7]", "example": "PEXTRB r32/m8, xmm1, 3"}
{"mnemonic": "ptest", "architecture": "x86", "full_name": "Packed Logical Comparison", "summary": "Bitwise compare of 128-bit value (AND) setting flags.", "syntax": "PTEST xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 17", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 17", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4.1", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs a bitwise AND of the 128-bit source operand with the 128-bit destination operand and sets EFLAGS based on the result, without modifying the destination. Sets ZF if the AND result is all zeros, sets CF if the AND of the source with the bitwise NOT of the destination is all zeros. Does not update OF, SF, AF, or PF. Available only in SSE4.1 and later; operates on 128-bit XMM registers.", "pseudocode": "temp ← dest[127:0] AND src[127:0];\nZF ← (temp == 0);\nCF ← ((src[127:0] AND (NOT dest[127:0])) == 0);\nOF ← 0; SF ← 0; AF ← 0; PF ← 0;", "example": "PTEST xmm1, xmm2/m128"}
{"mnemonic": "aesenc", "architecture": "x86", "full_name": "AES Encrypt", "summary": "Performs one round of AES encryption flow.", "syntax": "AESENC xmm1, xmm2/m128", "encoding": {"format": "AES-NI", "hex_opcode": "66 0F 38 DC", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | DC", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "AES-NI", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs a single round of AES encryption on the 128-bit state in the destination XMM register using the round key in the source operand. The operation includes SubBytes, ShiftRows, MixColumns, and AddRoundKey transformations. Does not modify EFLAGS. Requires the AES-NI instruction set extension; operates on 128-bit XMM registers or memory.", "pseudocode": "dest[127:0] ← AES_EncryptionRound(dest[127:0], src[127:0]);\nOF ← 0; CF ← 0; ZF ← 0; SF ← 0; AF ← 0; PF ← 0;", "example": "AESENC xmm1, xmm2/m128"}
{"mnemonic": "aesenclast", "architecture": "x86", "full_name": "AES Encrypt Last Round", "summary": "Performs the last round of AES encryption.", "syntax": "AESENCLAST xmm1, xmm2/m128", "encoding": {"format": "AES-NI", "hex_opcode": "66 0F 38 DD", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | DD", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "AES-NI", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs the final round of AES encryption on the 128-bit state in the destination XMM register using the round key in the source operand. The final round excludes the MixColumns transformation compared to aesenc. Does not modify EFLAGS. Requires the AES-NI instruction set extension; operates on 128-bit XMM registers or memory.", "pseudocode": "dest[127:0] ← AES_EncryptionLastRound(dest[127:0], src[127:0]);\nOF ← 0; CF ← 0; ZF ← 0; SF ← 0; AF ← 0; PF ← 0;", "example": "AESENCLAST xmm1, xmm2/m128"}
{"mnemonic": "aesdec", "architecture": "x86", "full_name": "AES Decrypt", "summary": "Performs one round of AES decryption flow.", "syntax": "AESDEC xmm1, xmm2/m128", "encoding": {"format": "AES-NI", "hex_opcode": "66 0F 38 DE", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | DE", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "AES-NI", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs a single round of AES decryption on the 128-bit state in the destination XMM register using the round key in the source operand. The operation includes InvSubBytes, InvShiftRows, InvMixColumns, and AddRoundKey transformations. Does not modify EFLAGS. Requires the AES-NI instruction set extension; operates on 128-bit XMM registers or memory.", "pseudocode": "dest[127:0] ← AES_DecryptionRound(dest[127:0], src[127:0]);\nOF ← 0; CF ← 0; ZF ← 0; SF ← 0; AF ← 0; PF ← 0;", "example": "AESDEC xmm1, xmm2/m128"}
{"mnemonic": "aeskeygenassist", "architecture": "x86", "full_name": "AES Key Generation Assist", "summary": "Generates round key for AES encryption.", "syntax": "AESKEYGENASSIST xmm1, xmm2/m128, imm8", "encoding": {"format": "AES-NI", "hex_opcode": "66 0F 3A DF", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | DF", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "AES-NI", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Generates a round key for AES encryption by performing key schedule computation on the 128-bit source operand and an immediate byte, storing the result in the destination XMM register. Used to facilitate AES key expansion during encryption key setup. Does not modify EFLAGS. Requires the AES-NI instruction set extension; operates on 128-bit XMM registers or memory with an 8-bit immediate.", "pseudocode": "dest[127:0] ← AES_KeyGenAssist(src[127:0], imm8);\nOF ← 0; CF ← 0; ZF ← 0; SF ← 0; AF ← 0; PF ← 0;", "example": "AESKEYGENASSIST xmm1, xmm2/m128, 3"}
{"mnemonic": "vaddps", "architecture": "x86", "full_name": "Add Packed Single-Precision (AVX)", "summary": "Adds packed floats (256-bit YMM support).", "syntax": "VADDPS ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.0F.WIG 58 /r", "visual_parts": [], "binary_pattern": "VEX | C5 | ModRM | 58", "bit_positions": "+0 | +3 | +4 | +5"}, "extension": "AVX", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Adds four packed single-precision floating-point values from the source operand to the corresponding values in the first source operand and stores the result in the destination YMM register. Floating-point exceptions and rounding mode are controlled by MXCSR. Does not modify EFLAGS. Requires AVX and is available in 64-bit mode; operates on 256-bit YMM registers or memory with three-operand form.", "pseudocode": "dest[255:0] ← src1[255:0] + src2[255:0];\nfor i ← 0 to 7 do\n  dest[32*i+31:32*i] ← FP32_Add(src1[32*i+31:32*i], src2[32*i+31:32*i]);\nendfor;", "example": "VADDPS ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vmulps", "architecture": "x86", "full_name": "Multiply Packed Single-Precision (AVX)", "summary": "Multiplies packed floats (256-bit).", "syntax": "VMULPS ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.0F.WIG 59 /r", "visual_parts": [], "binary_pattern": "VEX | C5 | ModRM | 59", "bit_positions": "+0 | +3 | +4 | +5"}, "extension": "AVX", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Multiplies four packed single-precision floating-point values from the source operand by the corresponding values in the first source operand and stores the result in the destination YMM register. Floating-point exceptions and rounding mode are controlled by MXCSR. Does not modify EFLAGS. Requires AVX and is available in 64-bit mode; operates on 256-bit YMM registers or memory with three-operand form.", "pseudocode": "dest[255:0] ← src1[255:0] * src2[255:0];\nfor i ← 0 to 7 do\n  dest[32*i+31:32*i] ← FP32_Multiply(src1[32*i+31:32*i], src2[32*i+31:32*i]);\nendfor;", "example": "VMULPS ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vfmadd231ps", "architecture": "x86", "full_name": "Fused Multiply-Add (132)", "summary": "Computes (Dest * Src2) + Src1.", "syntax": "VFMADD231PS ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.0 B8 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "FMA3", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Performs a fused multiply-add operation: multiplies the destination operand by the third operand and adds the result to the second operand, storing the result in the destination YMM register. The 231 variant computes (dest * src2) + src1 in a single operation with one rounding step, improving precision over separate multiply and add. Does not modify EFLAGS. Requires FMA3 and is available in 64-bit mode; operates on 256-bit YMM registers or memory.", "pseudocode": "dest[255:0] ← FMA(dest[255:0], src2[255:0], src1[255:0]);\nfor i ← 0 to 7 do\n  dest[32*i+31:32*i] ← FP32_FMA(dest[32*i+31:32*i], src2[32*i+31:32*i], src1[32*i+31:32*i]);\nendfor;", "example": "VFMADD231PS ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vinsertf128", "architecture": "x86", "full_name": "Insert Float 128-bit", "summary": "Inserts 128-bits into a YMM register.", "syntax": "VINSERTF128 ymm1, ymm2, xmm3/m128, imm8", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F3A.W0 18 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "xmm3/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Inserts a 128-bit float vector into a 256-bit YMM register at either the lower or upper 128-bit lane, with the remaining lane copied from the first source operand. This is a non-destructive three-operand instruction where the immediate byte (bits 0-7) selects the destination lane (0=lower, 1=upper). No flags are affected; this is purely a data movement and lane selection operation.", "pseudocode": "imm_index ← imm8[0];\nif (imm_index == 0) {\n  ymm1[0:127] ← xmm3/m128[0:127];\n  ymm1[128:255] ← ymm2[128:255];\n} else {\n  ymm1[0:127] ← ymm2[0:127];\n  ymm1[128:255] ← xmm3/m128[0:127];\n}", "example": "VINSERTF128 ymm1, ymm2, xmm3/m128, 3"}
{"mnemonic": "vextractf128", "architecture": "x86", "full_name": "Extract Float 128-bit", "summary": "Extracts 128-bits from YMM register.", "syntax": "VEXTRACTF128 xmm1/m128, ymm2, imm8", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F3A.W0 19 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX", "operands": [{"name": "dest", "type": "xmm1/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Extracts a 128-bit float vector from a 256-bit YMM register based on an immediate selector and stores it to an XMM register or 128-bit memory location. The immediate byte (bit 0) selects which 128-bit lane to extract (0=lower, 1=upper). No flags are affected; this is a data extraction and movement operation only.", "pseudocode": "imm_index ← imm8[0];\nif (imm_index == 0) {\n  xmm1/m128[0:127] ← ymm2[0:127];\n} else {\n  xmm1/m128[0:127] ← ymm2[128:255];\n}", "example": "VEXTRACTF128 xmm1/m128, ymm2, 3"}
{"mnemonic": "vzeroupper", "architecture": "x86", "full_name": "Zero Upper Bits of YMM Registers", "summary": "Clears bits 128-255 of all YMM registers (Avoids AVX-SSE transition penalty).", "syntax": "VZEROUPPER", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.0F.WIG 77", "visual_parts": [], "binary_pattern": "VEX | C5 | F8 | 77", "bit_positions": "+0 | +3 | +4 | +5"}, "extension": "AVX", "operands": [], "description": "Clears bits 128-255 of all 16 YMM registers (YMM0-YMM15 in 64-bit mode, YMM0-YMM7 in 32-bit mode), leaving bits 0-127 unchanged. This eliminates the AVX-to-SSE transition penalty by ensuring the upper 128-bit portions are zero before executing SSE instructions. No flags are affected. This instruction must be executed in protected or 64-bit mode.", "pseudocode": "for i from 0 to (is_64bit_mode ? 15 : 7) {\n  YMM[i][128:255] ← 0;\n}", "example": "VZEROUPPER"}
{"mnemonic": "vzeroall", "architecture": "x86", "full_name": "Zero All YMM Registers", "summary": "Clears all YMM registers.", "syntax": "VZEROALL", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.0F.WIG 77", "visual_parts": [], "binary_pattern": "VEX | C5 | FC | 77", "bit_positions": "+0 | +3 | +4 | +5"}, "extension": "AVX", "operands": [], "description": "Clears all bits of all 16 YMM registers (YMM0-YMM15 in 64-bit mode, YMM0-YMM7 in 32-bit mode) to zero. This is a faster alternative to clearing individual YMM registers via multiple VXORPS or similar instructions. No flags are affected. Execution is restricted to protected or 64-bit mode.", "pseudocode": "for i from 0 to (is_64bit_mode ? 15 : 7) {\n  YMM[i][0:255] ← 0;\n}", "example": "VZEROALL"}
{"mnemonic": "emms", "architecture": "x86", "full_name": "Empty MMX Technology State", "summary": "Clears the FPU tag word to allow FP instructions after MMX.", "syntax": "EMMS", "encoding": {"format": "MMX", "hex_opcode": "NP 0F 77", "visual_parts": [], "binary_pattern": "0F | 77", "bit_positions": "+0 | +1"}, "extension": "MMX", "operands": [], "description": "Sets all tag bits in the x87 FPU tag word to 1 (all entries marked empty), allowing the x87 FPU to be used immediately after MMX instructions without a transition penalty. This instruction clears the MMX state and must be executed before mixing MMX and x87 floating-point operations. No general-purpose flags are affected, but internal x87 state is modified.", "pseudocode": "FPU_TAG_WORD[0:15] ← 0xFFFF;", "example": "EMMS"}
{"mnemonic": "movd", "architecture": "x86", "full_name": "Move Doubleword", "summary": "Moves 32 bits between GPR and XMM/MMX register.", "syntax": "MOVD mm/xmm, r32/m32", "encoding": {"format": "SSE", "hex_opcode": "66 0F 6E /r", "visual_parts": [], "binary_pattern": "0F | 6E", "bit_positions": "+0 | +1"}, "extension": "MMX/SSE2", "operands": [{"name": "dest", "type": "mm/xmm", "desc": "64-bit MMX register or 128-bit XMM SIMD register"}, {"name": "src", "type": "r32/m32", "desc": "General-purpose register or Memory operand"}], "description": "Moves a 32-bit value from a general-purpose register or memory location into the lower 32 bits of an MMX or XMM register, zero-extending or copying the upper bits depending on context. When destination is MMX, the upper 32 bits become undefined; when destination is XMM, the upper 96 bits are zeroed (for SSE2 and later). No flags are affected. Supported in MMX and SSE2 extensions.", "pseudocode": "if (dest_is_xmm) {\n  xmm[0:31] ← r32/m32[0:31];\n  xmm[32:127] ← 0;\n} else {\n  mm[0:31] ← r32/m32[0:31];\n}", "example": "MOVD mm/xmm, r32/m32"}
{"mnemonic": "movq", "architecture": "x86", "full_name": "Move Quadword", "summary": "Moves 64 bits between XMM registers or memory.", "syntax": "MOVQ xmm, xmm/m64", "encoding": {"format": "SSE2", "hex_opcode": "F3 0F 7E", "visual_parts": [], "binary_pattern": "F3 | 0F | 7E", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m64", "desc": "128-bit XMM register or 64-bit memory"}], "description": "Moves a 64-bit quadword between XMM registers or from/to 64-bit memory. When the source is memory, only the lower 64 bits of the destination XMM register are updated and the upper 64 bits are zeroed. When both operands are XMM registers, all 128 bits of the destination are affected (lower 64 from source, upper 64 zeroed). No flags are affected. This instruction is part of SSE2 and later.", "pseudocode": "xmm_dest[0:63] ← xmm/m64[0:63];\nxmm_dest[64:127] ← 0;", "example": "MOVQ xmm0, xmm1"}
{"mnemonic": "movaps", "architecture": "x86", "full_name": "Move Aligned Packed Single-Precision", "summary": "Moves 128-bit packed float data (Must be 16-byte aligned).", "syntax": "MOVAPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 28 /r", "visual_parts": [], "binary_pattern": "0F | 28", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Moves 128 bits of packed single-precision floating-point data between XMM registers or between an XMM register and 16-byte aligned memory. The memory operand must be 16-byte aligned; unaligned memory access results in a general-protection exception (#GP). This is a cache-efficient operation for aligned data. No flags are affected. Supported in SSE and later extensions.", "pseudocode": "xmm_dest[0:127] ← xmm/m128[0:127];", "example": "MOVAPS xmm0, xmm1"}
{"mnemonic": "movups", "architecture": "x86", "full_name": "Move Unaligned Packed Single-Precision", "summary": "Moves 128-bit packed float data (Unaligned).", "syntax": "MOVUPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 10 /r", "visual_parts": [], "binary_pattern": "0F | 10", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Moves 128 bits of unaligned packed single-precision floating-point data from source to destination XMM register. No alignment requirement on memory operand. Does not affect any flags; operates only on XMM state.", "pseudocode": "dest[127:0] ← src[127:0]", "example": "MOVUPS xmm0, xmm1"}
{"mnemonic": "movapd", "architecture": "x86", "full_name": "Move Aligned Packed Double-Precision", "summary": "Moves 128-bit packed double data (Must be 16-byte aligned).", "syntax": "MOVAPD xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 28", "visual_parts": [], "binary_pattern": "66 | 0F | 28", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Moves 128 bits of aligned packed double-precision floating-point data from source to destination XMM register. Memory operand must be 16-byte aligned; unaligned access generates #GP(0). Does not affect any flags; operates only on XMM state.", "pseudocode": "dest[127:0] ← src[127:0]", "example": "MOVAPD xmm0, xmm1"}
{"mnemonic": "movupd", "architecture": "x86", "full_name": "Move Unaligned Packed Double-Precision", "summary": "Moves 128-bit packed double data (Unaligned).", "syntax": "MOVUPD xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 10", "visual_parts": [], "binary_pattern": "66 | 0F | 10", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Moves 128 bits of unaligned packed double-precision floating-point data from source to destination XMM register. No alignment requirement on memory operand. Does not affect any flags; operates only on XMM state.", "pseudocode": "dest[127:0] ← src[127:0]", "example": "MOVUPD xmm0, xmm1"}
{"mnemonic": "movdqa", "architecture": "x86", "full_name": "Move Aligned Packed Integer", "summary": "Moves 128-bit integer data (Aligned).", "syntax": "MOVDQA xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 6F", "visual_parts": [], "binary_pattern": "66 | 0F | 6F", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Moves 128 bits of aligned packed integer data from source to destination XMM register. Memory operand must be 16-byte aligned; unaligned access generates #GP(0). Does not affect any flags; operates only on XMM state.", "pseudocode": "dest[127:0] ← src[127:0]", "example": "MOVDQA xmm0, xmm1"}
{"mnemonic": "movdqu", "architecture": "x86", "full_name": "Move Unaligned Packed Integer", "summary": "Moves 128-bit integer data (Unaligned).", "syntax": "MOVDQU xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "F3 0F 6F", "visual_parts": [], "binary_pattern": "F3 | 0F | 6F", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Moves 128 bits of unaligned packed integer data from source to destination XMM register. No alignment requirement on memory operand. Does not affect any flags; operates only on XMM state.", "pseudocode": "dest[127:0] ← src[127:0]", "example": "MOVDQU xmm0, xmm1"}
{"mnemonic": "addps", "architecture": "x86", "full_name": "Add Packed Single-Precision", "summary": "Adds four 32-bit floats.", "syntax": "ADDPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 58 /r", "visual_parts": [], "binary_pattern": "0F | 58", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Adds four 32-bit single-precision floating-point values element-wise from source to destination XMM register, storing results in destination. Each element addition produces IEEE 754 floating-point result; does not affect integer flags. Available in 128-bit (XMM) form.", "pseudocode": "dest[31:0] ← dest[31:0] + src[31:0]\ndest[63:32] ← dest[63:32] + src[63:32]\ndest[95:64] ← dest[95:64] + src[95:64]\ndest[127:96] ← dest[127:96] + src[127:96]", "example": "ADDPS xmm0, xmm1"}
{"mnemonic": "addpd", "architecture": "x86", "full_name": "Add Packed Double-Precision", "summary": "Adds two 64-bit doubles.", "syntax": "ADDPD xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 58", "visual_parts": [], "binary_pattern": "66 | 0F | 58", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Adds two 64-bit double-precision floating-point values element-wise from source to destination XMM register, storing results in destination. Each element addition produces IEEE 754 floating-point result; does not affect integer flags. Available in 128-bit (XMM) form.", "pseudocode": "dest[63:0] ← dest[63:0] + src[63:0]\ndest[127:64] ← dest[127:64] + src[127:64]", "example": "ADDPD xmm0, xmm1"}
{"mnemonic": "addss", "architecture": "x86", "full_name": "Add Scalar Single-Precision", "summary": "Adds the low 32-bit float.", "syntax": "ADDSS xmm, xmm/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 58", "visual_parts": [], "binary_pattern": "F3 | 0F | 58", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m32", "desc": "128-bit XMM register or 32-bit memory"}], "description": "Adds the low 32-bit single-precision floating-point values from source to destination XMM register; upper three 32-bit elements of destination are unchanged. Scalar operation on lowest element; does not affect integer flags. Result follows IEEE 754 floating-point semantics.", "pseudocode": "dest[31:0] ← dest[31:0] + src[31:0]\ndest[127:32] ← dest[127:32]", "example": "ADDSS xmm0, xmm1"}
{"mnemonic": "addsd", "architecture": "x86", "full_name": "Add Scalar Double-Precision", "summary": "Adds the low 64-bit double.", "syntax": "ADDSD xmm, xmm/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 58", "visual_parts": [], "binary_pattern": "F2 | 0F | 58", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m64", "desc": "128-bit XMM register or 64-bit memory"}], "description": "Adds the low 64-bit double-precision floating-point value in the source operand to the low 64-bit double-precision value in the destination XMM register, storing the result in the destination. The high 64 bits of the destination remain unchanged. This instruction operates on scalar (single) values and respects IEEE 754 rounding modes controlled by MXCSR.", "pseudocode": "dest[63:0] ← dest[63:0] + src[63:0];\ndest[127:64] ← unchanged;", "example": "ADDSD xmm0, xmm1"}
{"mnemonic": "subps", "architecture": "x86", "full_name": "Subtract Packed Single-Precision", "summary": "Subtracts four 32-bit floats.", "syntax": "SUBPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 5C /r", "visual_parts": [], "binary_pattern": "0F | 5C", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Subtracts four 32-bit single-precision floating-point values in the source operand from the four 32-bit single-precision values in the destination XMM register, storing all four results in the destination. Operates on packed values in parallel and respects IEEE 754 rounding modes controlled by MXCSR.", "pseudocode": "dest[31:0] ← dest[31:0] - src[31:0];\ndest[63:32] ← dest[63:32] - src[63:32];\ndest[95:64] ← dest[95:64] - src[95:64];\ndest[127:96] ← dest[127:96] - src[127:96];", "example": "SUBPS xmm0, xmm1"}
{"mnemonic": "subpd", "architecture": "x86", "full_name": "Subtract Packed Double-Precision", "summary": "Subtracts two 64-bit doubles.", "syntax": "SUBPD xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 5C", "visual_parts": [], "binary_pattern": "66 | 0F | 5C", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Subtracts two 64-bit double-precision floating-point values in the source operand from the two 64-bit double-precision values in the destination XMM register, storing both results in the destination. Operates on packed values in parallel and respects IEEE 754 rounding modes controlled by MXCSR.", "pseudocode": "dest[63:0] ← dest[63:0] - src[63:0];\ndest[127:64] ← dest[127:64] - src[127:64];", "example": "SUBPD xmm0, xmm1"}
{"mnemonic": "mulps", "architecture": "x86", "full_name": "Multiply Packed Single-Precision", "summary": "Multiplies four 32-bit floats.", "syntax": "MULPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 59 /r", "visual_parts": [], "binary_pattern": "0F | 59", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Multiplies four 32-bit single-precision floating-point values in the source operand by the four 32-bit single-precision values in the destination XMM register, storing all four products in the destination. Operates on packed values in parallel and respects IEEE 754 rounding modes controlled by MXCSR.", "pseudocode": "dest[31:0] ← dest[31:0] * src[31:0];\ndest[63:32] ← dest[63:32] * src[63:32];\ndest[95:64] ← dest[95:64] * src[95:64];\ndest[127:96] ← dest[127:96] * src[127:96];", "example": "MULPS xmm0, xmm1"}
{"mnemonic": "mulpd", "architecture": "x86", "full_name": "Multiply Packed Double-Precision", "summary": "Multiplies two 64-bit doubles.", "syntax": "MULPD xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 59", "visual_parts": [], "binary_pattern": "66 | 0F | 59", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Multiplies two 64-bit double-precision floating-point values in the source operand by the two 64-bit double-precision values in the destination XMM register, storing both products in the destination. Operates on packed values in parallel and respects IEEE 754 rounding modes controlled by MXCSR.", "pseudocode": "dest[63:0] ← dest[63:0] * src[63:0];\ndest[127:64] ← dest[127:64] * src[127:64];", "example": "MULPD xmm0, xmm1"}
{"mnemonic": "divps", "architecture": "x86", "full_name": "Divide Packed Single-Precision", "summary": "Divides four 32-bit floats.", "syntax": "DIVPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 5E /r", "visual_parts": [], "binary_pattern": "0F | 5E", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Divides four 32-bit single-precision floating-point values in the destination XMM register by the four 32-bit single-precision values in the source operand, storing all four quotients in the destination. Operates on packed values in parallel and respects IEEE 754 rounding modes controlled by MXCSR; division by zero produces infinity or NaN according to IEEE 754 rules.", "pseudocode": "dest[31:0] ← dest[31:0] / src[31:0];\ndest[63:32] ← dest[63:32] / src[63:32];\ndest[95:64] ← dest[95:64] / src[95:64];\ndest[127:96] ← dest[127:96] / src[127:96];", "example": "DIVPS xmm0, xmm1"}
{"mnemonic": "divpd", "architecture": "x86", "full_name": "Divide Packed Double-Precision", "summary": "Divides two 64-bit doubles.", "syntax": "DIVPD xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 5E", "visual_parts": [], "binary_pattern": "66 | 0F | 5E", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Divides two 64-bit double-precision floating-point values in the destination XMM register by the two 64-bit double-precision values in the source operand, storing both quotients in the destination. Operates on packed values in parallel and respects IEEE 754 rounding modes controlled by MXCSR; division by zero produces infinity or NaN according to IEEE 754 rules.", "pseudocode": "dest[63:0] ← dest[63:0] / src[63:0];\ndest[127:64] ← dest[127:64] / src[127:64];", "example": "DIVPD xmm0, xmm1"}
{"mnemonic": "sqrtps", "architecture": "x86", "full_name": "Square Root Packed Single-Precision", "summary": "Computes square root of four 32-bit floats.", "syntax": "SQRTPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 51 /r", "visual_parts": [], "binary_pattern": "0F | 51", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Computes the square root of four 32-bit single-precision floating-point values in the source operand and stores all four results in the destination XMM register. Operates on packed values in parallel and respects IEEE 754 rounding modes controlled by MXCSR; negative values produce NaN according to IEEE 754 rules.", "pseudocode": "dest[31:0] ← sqrt(src[31:0]);\ndest[63:32] ← sqrt(src[63:32]);\ndest[95:64] ← sqrt(src[95:64]);\ndest[127:96] ← sqrt(src[127:96]);", "example": "SQRTPS xmm0, xmm1"}
{"mnemonic": "sqrtpd", "architecture": "x86", "full_name": "Square Root Packed Double-Precision", "summary": "Computes square root of two 64-bit doubles.", "syntax": "SQRTPD xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 51", "visual_parts": [], "binary_pattern": "66 | 0F | 51", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Computes the square root of two packed 64-bit double-precision floating-point values and stores the results in the destination XMM register. This instruction operates at the FPU execution unit and sets MXCSR exception flags according to IEEE 754 rounding mode and precision; no general-purpose flags are affected. Requires SSE2 support.", "pseudocode": "dest[0:63] ← sqrt(src[0:63])\ndest[64:127] ← sqrt(src[64:127])\nMXCSR exception flags ← updated based on IEEE 754 result", "example": "SQRTPD xmm0, xmm1"}
{"mnemonic": "rcpps", "architecture": "x86", "full_name": "Reciprocal Packed Single-Precision", "summary": "Approximate reciprocal (1/x) of four 32-bit floats.", "syntax": "RCPPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 53 /r", "visual_parts": [], "binary_pattern": "0F | 53", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Computes the approximate reciprocal (1/x) of four packed 32-bit single-precision floating-point values with a relative error of at most 1.5×2⁻¹² and stores results in the destination XMM register. This is a fast approximation instruction suitable for iterative refinement; no general-purpose flags are affected. Requires SSE support.", "pseudocode": "dest[0:31] ← approx_reciprocal(src[0:31])\ndest[32:63] ← approx_reciprocal(src[32:63])\ndest[64:95] ← approx_reciprocal(src[64:95])\ndest[96:127] ← approx_reciprocal(src[96:127])", "example": "RCPPS xmm0, xmm1"}
{"mnemonic": "rsqrtps", "architecture": "x86", "full_name": "Reciprocal Square Root Packed Single-Precision", "summary": "Approximate reciprocal sqrt (1/sqrt(x)) of four 32-bit floats.", "syntax": "RSQRTPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 52 /r", "visual_parts": [], "binary_pattern": "0F | 52", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Computes the approximate reciprocal square root (1/√x) of four packed 32-bit single-precision floating-point values with a relative error of at most 1.5×2⁻¹² and stores results in the destination XMM register. This is a fast approximation instruction useful for physics simulations and graphics; no general-purpose flags are affected. Requires SSE support.", "pseudocode": "dest[0:31] ← approx_reciprocal_sqrt(src[0:31])\ndest[32:63] ← approx_reciprocal_sqrt(src[32:63])\ndest[64:95] ← approx_reciprocal_sqrt(src[64:95])\ndest[96:127] ← approx_reciprocal_sqrt(src[96:127])", "example": "RSQRTPS xmm0, xmm1"}
{"mnemonic": "maxps", "architecture": "x86", "full_name": "Maximum Packed Single-Precision", "summary": "Returns maximum of packed floats.", "syntax": "MAXPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 5F /r", "visual_parts": [], "binary_pattern": "0F | 5F", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Compares four packed 32-bit single-precision floating-point values element-wise and stores the maximum of each pair in the destination XMM register. Special values (NaN, signed zeros) follow IEEE 754 comparison semantics; no general-purpose flags are affected. Requires SSE support.", "pseudocode": "dest[0:31] ← max(dest[0:31], src[0:31])\ndest[32:63] ← max(dest[32:63], src[32:63])\ndest[64:95] ← max(dest[64:95], src[64:95])\ndest[96:127] ← max(dest[96:127], src[96:127])", "example": "MAXPS xmm0, xmm1"}
{"mnemonic": "minps", "architecture": "x86", "full_name": "Minimum Packed Single-Precision", "summary": "Returns minimum of packed floats.", "syntax": "MINPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 5D /r", "visual_parts": [], "binary_pattern": "0F | 5D", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Compares four packed 32-bit single-precision floating-point values element-wise and stores the minimum of each pair in the destination XMM register. Special values (NaN, signed zeros) follow IEEE 754 comparison semantics; no general-purpose flags are affected. Requires SSE support.", "pseudocode": "dest[0:31] ← min(dest[0:31], src[0:31])\ndest[32:63] ← min(dest[32:63], src[32:63])\ndest[64:95] ← min(dest[64:95], src[64:95])\ndest[96:127] ← min(dest[96:127], src[96:127])", "example": "MINPS xmm0, xmm1"}
{"mnemonic": "andps", "architecture": "x86", "full_name": "Bitwise Logical AND Packed Single-Precision", "summary": "Bitwise AND of 128 bits.", "syntax": "ANDPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 54 /r", "visual_parts": [], "binary_pattern": "0F | 54", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs a bitwise logical AND of all 128 bits in the destination and source XMM registers and stores the result in the destination. This is a pure logical operation treating the packed single-precision floats as integer bit patterns; no general-purpose flags are affected. Requires SSE support.", "pseudocode": "dest[0:127] ← dest[0:127] AND src[0:127]", "example": "ANDPS xmm0, xmm1"}
{"mnemonic": "andpd", "architecture": "x86", "full_name": "Bitwise Logical AND Packed Double-Precision", "summary": "Bitwise AND of 128 bits.", "syntax": "ANDPD xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 54", "visual_parts": [], "binary_pattern": "66 | 0F | 54", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs a bitwise logical AND of all 128 bits in the destination and source XMM registers and stores the result in the destination. This is a pure logical operation treating the packed double-precision floats as integer bit patterns; no general-purpose flags are affected. Requires SSE2 support.", "pseudocode": "dest[0:127] ← dest[0:127] AND src[0:127]", "example": "ANDPD xmm0, xmm1"}
{"mnemonic": "orps", "architecture": "x86", "full_name": "Bitwise Logical OR Packed Single-Precision", "summary": "Bitwise OR of 128 bits.", "syntax": "ORPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 56 /r", "visual_parts": [], "binary_pattern": "0F | 56", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs a bitwise logical OR of all 128 bits in the destination and source XMM registers and stores the result in the destination. This is a pure logical operation treating the packed single-precision floats as integer bit patterns; no general-purpose flags are affected. Requires SSE support.", "pseudocode": "dest[0:127] ← dest[0:127] OR src[0:127]", "example": "ORPS xmm0, xmm1"}
{"mnemonic": "xorps", "architecture": "x86", "full_name": "Bitwise Logical XOR Packed Single-Precision", "summary": "Bitwise XOR of 128 bits (Used to clear registers).", "syntax": "XORPS xmm, xmm/m128", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 57 /r", "visual_parts": [], "binary_pattern": "0F | 57", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs a bitwise XOR of two 128-bit packed single-precision floating-point values, storing the result in the destination XMM register. No flags are affected by this operation. This instruction is commonly used to zero XMM registers efficiently (xorps xmm0, xmm0) as a dependency-breaking micro-optimization.", "pseudocode": "dest ← dest XOR src", "example": "XORPS xmm0, xmm1"}
{"mnemonic": "paddb", "architecture": "x86", "full_name": "Packed Add Bytes", "summary": "Adds 16 bytes (Wraparound).", "syntax": "PADDB xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F FC", "visual_parts": [], "binary_pattern": "66 | 0F | FC", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs 16 independent 8-bit unsigned or signed integer additions in parallel on packed byte data, wrapping on overflow without affecting flags. Results are stored in the destination XMM register with no saturation; overflow is silent and wraps modulo 256.", "pseudocode": "for i = 0 to 15:\n  dest[i*8 + 7 : i*8] ← (dest[i*8 + 7 : i*8] + src[i*8 + 7 : i*8]) AND 0xFF", "example": "PADDB xmm0, xmm1"}
{"mnemonic": "paddw", "architecture": "x86", "full_name": "Packed Add Words", "summary": "Adds 8 words (Wraparound).", "syntax": "PADDW xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F FD", "visual_parts": [], "binary_pattern": "66 | 0F | FD", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs 8 independent 16-bit unsigned or signed integer additions in parallel on packed word data, wrapping on overflow without affecting flags. Results are stored in the destination XMM register with no saturation; overflow wraps modulo 65536.", "pseudocode": "for i = 0 to 7:\n  dest[i*16 + 15 : i*16] ← (dest[i*16 + 15 : i*16] + src[i*16 + 15 : i*16]) AND 0xFFFF", "example": "PADDW xmm0, xmm1"}
{"mnemonic": "paddd", "architecture": "x86", "full_name": "Packed Add Doublewords", "summary": "Adds 4 doublewords (Wraparound).", "syntax": "PADDD xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F FE", "visual_parts": [], "binary_pattern": "66 | 0F | FE", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs 4 independent 32-bit unsigned or signed integer additions in parallel on packed doubleword data, wrapping on overflow without affecting flags. Results are stored in the destination XMM register with no saturation; overflow wraps modulo 2^32.", "pseudocode": "for i = 0 to 3:\n  dest[i*32 + 31 : i*32] ← (dest[i*32 + 31 : i*32] + src[i*32 + 31 : i*32]) AND 0xFFFFFFFF", "example": "PADDD xmm0, xmm1"}
{"mnemonic": "paddq", "architecture": "x86", "full_name": "Packed Add Quadwords", "summary": "Adds 2 quadwords (Wraparound).", "syntax": "PADDQ xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F D4", "visual_parts": [], "binary_pattern": "66 | 0F | D4", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs 2 independent 64-bit unsigned or signed integer additions in parallel on packed quadword data, wrapping on overflow without affecting flags. Results are stored in the destination XMM register with no saturation; overflow wraps modulo 2^64.", "pseudocode": "for i = 0 to 1:\n  dest[i*64 + 63 : i*64] ← (dest[i*64 + 63 : i*64] + src[i*64 + 63 : i*64]) AND 0xFFFFFFFFFFFFFFFF", "example": "PADDQ xmm0, xmm1"}
{"mnemonic": "paddsb", "architecture": "x86", "full_name": "Packed Add Bytes Signed Saturate", "summary": "Adds 16 signed bytes with saturation.", "syntax": "PADDSB xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F EC", "visual_parts": [], "binary_pattern": "66 | 0F | EC", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs 16 independent 8-bit signed integer additions in parallel with signed saturation on packed byte data. If the result overflows or underflows the signed 8-bit range [-128, 127], the value is clamped to the nearest boundary; no flags are affected.", "pseudocode": "for i = 0 to 15:\n  temp ← (int32)(int8)dest[i*8 + 7 : i*8] + (int32)(int8)src[i*8 + 7 : i*8]\n  if temp > 127: dest[i*8 + 7 : i*8] ← 127\n  else if temp < -128: dest[i*8 + 7 : i*8] ← -128\n  else: dest[i*8 + 7 : i*8] ← temp AND 0xFF", "example": "PADDSB xmm0, xmm1"}
{"mnemonic": "paddusb", "architecture": "x86", "full_name": "Packed Add Bytes Unsigned Saturate", "summary": "Adds 16 unsigned bytes with saturation.", "syntax": "PADDUSB xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F DC", "visual_parts": [], "binary_pattern": "66 | 0F | DC", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs 16 independent 8-bit unsigned integer additions in parallel with unsigned saturation on packed byte data. If the result exceeds 255, the value is clamped to 255; no flags are affected.", "pseudocode": "for i = 0 to 15:\n  temp ← (uint16)dest[i*8 + 7 : i*8] + (uint16)src[i*8 + 7 : i*8]\n  if temp > 255: dest[i*8 + 7 : i*8] ← 255\n  else: dest[i*8 + 7 : i*8] ← temp AND 0xFF", "example": "PADDUSB xmm0, xmm1"}
{"mnemonic": "psubb", "architecture": "x86", "full_name": "Packed Subtract Bytes", "summary": "Subtracts 16 bytes.", "syntax": "PSUBB xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F F8", "visual_parts": [], "binary_pattern": "66 | 0F | F8", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs 16 independent 8-bit unsigned or signed integer subtractions in parallel on packed byte data, wrapping on underflow without affecting flags. Results are stored in the destination XMM register with no saturation; underflow wraps modulo 256.", "pseudocode": "for i = 0 to 15:\n  dest[i*8 + 7 : i*8] ← (dest[i*8 + 7 : i*8] - src[i*8 + 7 : i*8]) AND 0xFF", "example": "PSUBB xmm0, xmm1"}
{"mnemonic": "psubw", "architecture": "x86", "full_name": "Packed Subtract Words", "summary": "Subtracts 8 words.", "syntax": "PSUBW xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F F9", "visual_parts": [], "binary_pattern": "66 | 0F | F9", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Subtracts packed 16-bit words element-wise: each of the 8 words in the destination XMM register is decremented by the corresponding word in the source XMM register or 128-bit memory operand, with wrapping on underflow. No flags are affected; the operation is performed modulo 2^16 for each element.", "pseudocode": "for i = 0 to 7 do\n  dest.word[i] ← (dest.word[i] - src.word[i]) mod 2^16\nend for", "example": "PSUBW xmm0, xmm1"}
{"mnemonic": "psubd", "architecture": "x86", "full_name": "Packed Subtract Doublewords", "summary": "Subtracts 4 doublewords.", "syntax": "PSUBD xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F FA", "visual_parts": [], "binary_pattern": "66 | 0F | FA", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Subtracts packed 32-bit doublewords element-wise: each of the 4 doublewords in the destination XMM register is decremented by the corresponding doubleword in the source XMM register or 128-bit memory operand, with wrapping on underflow. No flags are affected; the operation is performed modulo 2^32 for each element.", "pseudocode": "for i = 0 to 3 do\n  dest.dword[i] ← (dest.dword[i] - src.dword[i]) mod 2^32\nend for", "example": "PSUBD xmm0, xmm1"}
{"mnemonic": "pand", "architecture": "x86", "full_name": "Packed Logical AND", "summary": "Bitwise AND of 128-bit integers.", "syntax": "PAND xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F DB", "visual_parts": [], "binary_pattern": "66 | 0F | DB", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs a bitwise logical AND operation on the entire 128-bit content of the destination XMM register with the source XMM register or 128-bit memory operand, storing the result back in the destination. No flags are affected; the operation is a pure bitwise AND with no carry or borrow semantics.", "pseudocode": "dest ← dest AND src", "example": "PAND xmm0, xmm1"}
{"mnemonic": "por", "architecture": "x86", "full_name": "Packed Logical OR", "summary": "Bitwise OR of 128-bit integers.", "syntax": "POR xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F EB", "visual_parts": [], "binary_pattern": "66 | 0F | EB", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs a bitwise logical OR operation on the entire 128-bit content of the destination XMM register with the source XMM register or 128-bit memory operand, storing the result back in the destination. No flags are affected; the operation is a pure bitwise OR with no carry or borrow semantics.", "pseudocode": "dest ← dest OR src", "example": "POR xmm0, xmm1"}
{"mnemonic": "pxor", "architecture": "x86", "full_name": "Packed Logical Exclusive OR", "summary": "Bitwise XOR of 128-bit integers.", "syntax": "PXOR xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F EF", "visual_parts": [], "binary_pattern": "66 | 0F | EF", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs a bitwise logical exclusive OR operation on the entire 128-bit content of the destination XMM register with the source XMM register or 128-bit memory operand, storing the result back in the destination. No flags are affected; the operation is a pure bitwise XOR with no carry or borrow semantics.", "pseudocode": "dest ← dest XOR src", "example": "PXOR xmm0, xmm1"}
{"mnemonic": "psllw", "architecture": "x86", "full_name": "Packed Shift Left Logical Word", "summary": "Shifts words left.", "syntax": "PSLLW xmm, imm8", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 71 /6", "visual_parts": [], "binary_pattern": "66 | 0F | 71 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts each of the 8 packed 16-bit words in the destination XMM register left logically by the number of bits specified in the 8-bit immediate operand, with zero fill on the right. Shift amounts greater than or equal to 16 zero out the corresponding word. No flags are affected.", "pseudocode": "count ← imm8 AND 0xFF\nfor i = 0 to 7 do\n  if count >= 16 then\n    dest.word[i] ← 0\n  else\n    dest.word[i] ← (dest.word[i] << count) AND 0xFFFF\n  end if\nend for", "example": "PSLLW xmm0, 3"}
{"mnemonic": "pslld", "architecture": "x86", "full_name": "Packed Shift Left Logical Doubleword", "summary": "Shifts doublewords left.", "syntax": "PSLLD xmm, imm8", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 72 /6", "visual_parts": [], "binary_pattern": "66 | 0F | 72 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts each of the 4 packed 32-bit doublewords in the destination XMM register left logically by the number of bits specified in the 8-bit immediate operand, with zero fill on the right. Shift amounts greater than or equal to 32 zero out the corresponding doubleword. No flags are affected.", "pseudocode": "count ← imm8 AND 0xFF\nfor i = 0 to 3 do\n  if count >= 32 then\n    dest.dword[i] ← 0\n  else\n    dest.dword[i] ← (dest.dword[i] << count) AND 0xFFFFFFFF\n  end if\nend for", "example": "PSLLD xmm0, 3"}
{"mnemonic": "psrlw", "architecture": "x86", "full_name": "Packed Shift Right Logical Word", "summary": "Shifts words right logical.", "syntax": "PSRLW xmm, imm8", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 71 /2", "visual_parts": [], "binary_pattern": "66 | 0F | 71 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts each of the 8 packed 16-bit words in the destination XMM register right logically (unsigned) by the number of bits specified in the 8-bit immediate operand, with zero fill on the left. Shift amounts greater than or equal to 16 zero out the corresponding word. No flags are affected.", "pseudocode": "count ← imm8 AND 0xFF\nfor i = 0 to 7 do\n  if count >= 16 then\n    dest.word[i] ← 0\n  else\n    dest.word[i] ← (dest.word[i] >> count) AND 0xFFFF\n  end if\nend for", "example": "PSRLW xmm0, 3"}
{"mnemonic": "psrld", "architecture": "x86", "full_name": "Packed Shift Right Logical Doubleword", "summary": "Shifts doublewords right logical.", "syntax": "PSRLD xmm, imm8", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 72 /2", "visual_parts": [], "binary_pattern": "66 | 0F | 72 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts each 32-bit doubleword element in the XMM register right logically by the count specified in the immediate value. Bits shifted out are discarded, and vacated positions are filled with zeros. No flags are affected. Available in SSE2 and later; operates on 128-bit packed data (four 32-bit elements).", "pseudocode": "for i ← 0 to 3 do\n  xmm.dword[i] ← xmm.dword[i] >> imm8\nend for", "example": "PSRLD xmm0, 3"}
{"mnemonic": "psraw", "architecture": "x86", "full_name": "Packed Shift Right Arithmetic Word", "summary": "Shifts words right arithmetic (sign bit).", "syntax": "PSRAW xmm, imm8", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 71 /4", "visual_parts": [], "binary_pattern": "66 | 0F | 71 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts each 16-bit word element in the XMM register right arithmetically by the count specified in the immediate value. The sign bit is replicated into vacated positions. No flags are affected. Available in SSE2 and later; operates on 128-bit packed data (eight 16-bit elements).", "pseudocode": "for i ← 0 to 7 do\n  sign_bit ← xmm.word[i][15]\n  xmm.word[i] ← arithmetic_shift_right(xmm.word[i], imm8)\n  if imm8 >= 16 then xmm.word[i] ← sign_bit ? 0xFFFF : 0x0000 end if\nend for", "example": "PSRAW xmm0, 3"}
{"mnemonic": "psrad", "architecture": "x86", "full_name": "Packed Shift Right Arithmetic Doubleword", "summary": "Shifts doublewords right arithmetic.", "syntax": "PSRAD xmm, imm8", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 72 /4", "visual_parts": [], "binary_pattern": "66 | 0F | 72 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts each 32-bit doubleword element in the XMM register right arithmetically by the count specified in the immediate value. The sign bit is replicated into vacated positions. No flags are affected. Available in SSE2 and later; operates on 128-bit packed data (four 32-bit elements).", "pseudocode": "for i ← 0 to 3 do\n  sign_bit ← xmm.dword[i][31]\n  xmm.dword[i] ← arithmetic_shift_right(xmm.dword[i], imm8)\n  if imm8 >= 32 then xmm.dword[i] ← sign_bit ? 0xFFFFFFFF : 0x00000000 end if\nend for", "example": "PSRAD xmm0, 3"}
{"mnemonic": "pcmpeqb", "architecture": "x86", "full_name": "Packed Compare Equal Byte", "summary": "Compares bytes for equality (Result mask 0xFF or 0x00).", "syntax": "PCMPEQB xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 74", "visual_parts": [], "binary_pattern": "66 | 0F | 74", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs a packed comparison for equality on 8-bit byte elements. For each byte position, the result is 0xFF if the elements are equal, or 0x00 if they are not equal. No traditional flags (OF, SF, ZF, etc.) are affected; results are stored in the destination register. Available in SSE2 and later; operates on 128-bit vectors (sixteen 8-bit elements).", "pseudocode": "for i ← 0 to 15 do\n  if dest.byte[i] == src.byte[i] then\n    dest.byte[i] ← 0xFF\n  else\n    dest.byte[i] ← 0x00\n  end if\nend for", "example": "PCMPEQB xmm0, xmm1"}
{"mnemonic": "pcmpeqw", "architecture": "x86", "full_name": "Packed Compare Equal Word", "summary": "Compares words for equality.", "syntax": "PCMPEQW xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 75", "visual_parts": [], "binary_pattern": "66 | 0F | 75", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs a packed comparison for equality on 16-bit word elements. For each word position, the result is 0xFFFF if the elements are equal, or 0x0000 if they are not equal. No traditional flags are affected; results are stored in the destination register. Available in SSE2 and later; operates on 128-bit vectors (eight 16-bit elements).", "pseudocode": "for i ← 0 to 7 do\n  if dest.word[i] == src.word[i] then\n    dest.word[i] ← 0xFFFF\n  else\n    dest.word[i] ← 0x0000\n  end if\nend for", "example": "PCMPEQW xmm0, xmm1"}
{"mnemonic": "pcmpeqd", "architecture": "x86", "full_name": "Packed Compare Equal Doubleword", "summary": "Compares doublewords for equality.", "syntax": "PCMPEQD xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 76", "visual_parts": [], "binary_pattern": "66 | 0F | 76", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Performs a packed comparison for equality on 32-bit doubleword elements. For each doubleword position, the result is 0xFFFFFFFF if the elements are equal, or 0x00000000 if they are not equal. No traditional flags are affected; results are stored in the destination register. Available in SSE2 and later; operates on 128-bit vectors (four 32-bit elements).", "pseudocode": "for i ← 0 to 3 do\n  if dest.dword[i] == src.dword[i] then\n    dest.dword[i] ← 0xFFFFFFFF\n  else\n    dest.dword[i] ← 0x00000000\n  end if\nend for", "example": "PCMPEQD xmm0, xmm1"}
{"mnemonic": "pshufd", "architecture": "x86", "full_name": "Packed Shuffle Doubleword", "summary": "Shuffles 32-bit integers.", "syntax": "PSHUFD xmm, xmm/m128, imm8", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 70", "visual_parts": [], "binary_pattern": "66 | 0F | 70", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src1", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rearranges the four 32-bit doubleword elements in an XMM register according to the shuffle pattern encoded in the 8-bit immediate operand. Each pair of bits in the immediate selects which source doubleword populates each destination position. No flags are affected. Available in SSE2 and later; operates on 128-bit vectors.", "pseudocode": "temp ← src\nfor i ← 0 to 3 do\n  selector ← (imm8 >> (i * 2)) & 0x3\n  dest.dword[i] ← temp.dword[selector]\nend for", "example": "PSHUFD xmm0, xmm1, 3"}
{"mnemonic": "cvtsi2ss", "architecture": "x86", "full_name": "Convert Doubleword Integer to Scalar Single-Precision", "summary": "Converts 32-bit int to float.", "syntax": "CVTSI2SS xmm, r/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 2A", "visual_parts": [], "binary_pattern": "F3 | 0F | 2A", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Converts a 32-bit signed integer operand to a scalar single-precision floating-point value and stores the result in the low 32-bit lane of the destination XMM register, leaving the upper 96 bits unchanged. No traditional flags are affected. Available in SSE and later; the conversion follows IEEE 754 rounding rules.", "pseudocode": "src_int ← [src] (sign-extended if r/m32)\nfp_value ← convert_int32_to_float(src_int)\ndest.float32[0] ← fp_value\n// dest.float32[1..3] unchanged", "example": "CVTSI2SS xmm0, ebx"}
{"mnemonic": "cvtsi2sd", "architecture": "x86", "full_name": "Convert Doubleword Integer to Scalar Double-Precision", "summary": "Converts 32-bit int to double.", "syntax": "CVTSI2SD xmm, r/m32", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 2A", "visual_parts": [], "binary_pattern": "F2 | 0F | 2A", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Converts a 32-bit signed integer to a 64-bit double-precision floating-point value and stores the result in the low 64 bits of the destination XMM register, leaving the upper 64 bits unchanged. The conversion uses the current rounding mode from MXCSR. No EFLAGS are affected by this instruction.", "pseudocode": "dest.low64 ← (double)src32;", "example": "CVTSI2SD xmm0, ebx"}
{"mnemonic": "cvttss2si", "architecture": "x86", "full_name": "Convert with Truncation Scalar Single to Integer", "summary": "Converts float to 32-bit int (Truncate).", "syntax": "CVTTSS2SI r32, xmm/m32", "encoding": {"format": "SSE", "hex_opcode": "F3 0F 2C", "visual_parts": [], "binary_pattern": "F3 | 0F | 2C", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "xmm/m32", "desc": "128-bit XMM register or 32-bit memory"}], "description": "Converts a 32-bit single-precision floating-point value to a 32-bit signed integer using truncation towards zero, regardless of the rounding mode in MXCSR. If a NaN or overflow occurs, the result is INT32_MIN (0x80000000) and no exception is raised by default.", "pseudocode": "dest32 ← (int32)truncate(src32_float); CF ← 0; OF ← 0; SF ← 0; ZF ← 0; AF ← 0; PF ← 0;", "example": "CVTTSS2SI eax, xmm1"}
{"mnemonic": "cvttsd2si", "architecture": "x86", "full_name": "Convert with Truncation Scalar Double to Integer", "summary": "Converts double to 32-bit int (Truncate).", "syntax": "CVTTSD2SI r32, xmm/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 2C", "visual_parts": [], "binary_pattern": "F2 | 0F | 2C", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "xmm/m64", "desc": "128-bit XMM register or 64-bit memory"}], "description": "Converts a 64-bit double-precision floating-point value to a 32-bit signed integer using truncation towards zero, independent of the MXCSR rounding mode. If a NaN or overflow occurs, the result is INT32_MIN (0x80000000) with no exception raised by default.", "pseudocode": "dest32 ← (int32)truncate(src64_double); CF ← 0; OF ← 0; SF ← 0; ZF ← 0; AF ← 0; PF ← 0;", "example": "CVTTSD2SI eax, xmm1"}
{"mnemonic": "cvtss2sd", "architecture": "x86", "full_name": "Convert Scalar Single to Scalar Double", "summary": "Converts float to double.", "syntax": "CVTSS2SD xmm, xmm/m32", "encoding": {"format": "SSE2", "hex_opcode": "F3 0F 5A", "visual_parts": [], "binary_pattern": "F3 | 0F | 5A", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m32", "desc": "128-bit XMM register or 32-bit memory"}], "description": "Converts a 32-bit single-precision floating-point value to a 64-bit double-precision floating-point value and stores the result in the low 64 bits of the destination XMM register, preserving the upper 64 bits. The conversion uses the current rounding mode from MXCSR, though single-to-double conversion is typically lossless.", "pseudocode": "dest.low64 ← (double)src32_float;", "example": "CVTSS2SD xmm0, xmm1"}
{"mnemonic": "cvtsd2ss", "architecture": "x86", "full_name": "Convert Scalar Double to Scalar Single", "summary": "Converts double to float.", "syntax": "CVTSD2SS xmm, xmm/m64", "encoding": {"format": "SSE2", "hex_opcode": "F2 0F 5A", "visual_parts": [], "binary_pattern": "F2 | 0F | 5A", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m64", "desc": "128-bit XMM register or 64-bit memory"}], "description": "Converts a 64-bit double-precision floating-point value to a 32-bit single-precision floating-point value and stores the result in the low 32 bits of the destination XMM register, leaving bits 32-127 unchanged. The conversion uses the current rounding mode from MXCSR and may result in precision loss or denormalized results.", "pseudocode": "dest.low32 ← (float)src64_double;", "example": "CVTSD2SS xmm0, xmm1"}
{"mnemonic": "ucomiss", "architecture": "x86", "full_name": "Unordered Compare Scalar Single-Precision", "summary": "Compares low float and sets EFLAGS.", "syntax": "UCOMISS xmm1, xmm2/m32", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 2E /r", "visual_parts": [], "binary_pattern": "0F | 2E", "bit_positions": "+0 | +1"}, "extension": "SSE", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m32", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs an unordered comparison of two single-precision floating-point values and sets EFLAGS (ZF, PF, CF) based on the result. If either operand is a signaling NaN, the comparison is treated as unordered; quiet NaNs also produce an unordered result. EFLAGS are set such that ZF=1, PF=1, CF=1 for unordered, ZF=0 for less, ZF=0 CF=1 for greater, and ZF=1 for equal.", "pseudocode": "cmp_result ← unordered_compare(dest.low32_float, src.low32_float); ZF ← (cmp_result == equal); PF ← (cmp_result == unordered); CF ← (cmp_result == less || cmp_result == unordered); AF ← 0; OF ← 0; SF ← 0;", "example": "UCOMISS xmm1, xmm2/m32"}
{"mnemonic": "ucomisd", "architecture": "x86", "full_name": "Unordered Compare Scalar Double-Precision", "summary": "Compares low double and sets EFLAGS.", "syntax": "UCOMISD xmm1, xmm2/m64", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 2E", "visual_parts": [], "binary_pattern": "66 | 0F | 2E", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m64", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs an unordered comparison of two double-precision floating-point values and sets EFLAGS (ZF, PF, CF) based on the result. If either operand is a signaling NaN, the comparison is unordered; quiet NaNs also produce an unordered result. EFLAGS reflect unordered (ZF=PF=CF=1), less, greater, or equal conditions.", "pseudocode": "cmp_result ← unordered_compare(dest.low64_double, src.low64_double); ZF ← (cmp_result == equal); PF ← (cmp_result == unordered); CF ← (cmp_result == less || cmp_result == unordered); AF ← 0; OF ← 0; SF ← 0;", "example": "UCOMISD xmm1, xmm2/m64"}
{"mnemonic": "punpcklbw", "architecture": "x86", "full_name": "Unpack Low Data Bytes", "summary": "Interleaves low bytes from two sources.", "syntax": "PUNPCKLBW xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 60", "visual_parts": [], "binary_pattern": "66 | 0F | 60", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Interleaves the low 64 bits (8 bytes) of the destination and source XMM registers, expanding them to 128 bits with alternating bytes from each source: byte 0 from dest, byte 0 from src, byte 1 from dest, byte 1 from src, and so on. No EFLAGS are affected.", "pseudocode": "for i ← 0 to 7 do dest.byte[2*i] ← dest.byte[i]; dest.byte[2*i+1] ← src.byte[i];", "example": "PUNPCKLBW xmm0, xmm1"}
{"mnemonic": "punpcklwd", "architecture": "x86", "full_name": "Unpack Low Data Words", "summary": "Interleaves low words.", "syntax": "PUNPCKLWD xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 61", "visual_parts": [], "binary_pattern": "66 | 0F | 61", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Interleaves the low 64 bits (4 words) of the destination XMM register with the low 64 bits (4 words) of the source XMM/memory operand, placing results back in the destination. No flags are affected. This SSE2 instruction operates on 128-bit packed word data and is available in 64-bit and protected modes.", "pseudocode": "dest[127:0] = [dest[47:32], src[47:32], dest[31:16], src[31:16], dest[15:0], src[15:0], dest[63:48], src[63:48]]", "example": "PUNPCKLWD xmm0, xmm1"}
{"mnemonic": "punpckldq", "architecture": "x86", "full_name": "Unpack Low Data Doublewords", "summary": "Interleaves low doublewords.", "syntax": "PUNPCKLDQ xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 62", "visual_parts": [], "binary_pattern": "66 | 0F | 62", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Interleaves the low 64 bits (2 doublewords) of the destination XMM register with the low 64 bits (2 doublewords) of the source XMM/memory operand, placing results back in the destination. No flags are affected. This SSE2 instruction operates on 128-bit packed doubleword data and is available in 64-bit and protected modes.", "pseudocode": "dest[127:0] = [dest[31:0], src[31:0], dest[63:32], src[63:32]]", "example": "PUNPCKLDQ xmm0, xmm1"}
{"mnemonic": "punpcklqdq", "architecture": "x86", "full_name": "Unpack Low Data Quadwords", "summary": "Interleaves low quadwords.", "syntax": "PUNPCKLQDQ xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 6C", "visual_parts": [], "binary_pattern": "66 | 0F | 6C", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Interleaves the low 64 bits (1 quadword) of the destination XMM register with the low 64 bits (1 quadword) of the source XMM/memory operand, placing results back in the destination. No flags are affected. This SSE2 instruction operates on 128-bit packed quadword data and is available in 64-bit and protected modes.", "pseudocode": "dest[127:0] = [dest[63:0], src[63:0]]", "example": "PUNPCKLQDQ xmm0, xmm1"}
{"mnemonic": "packsswb", "architecture": "x86", "full_name": "Pack with Signed Saturation Word to Byte", "summary": "Converts words to bytes with saturation.", "syntax": "PACKSSWB xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 63", "visual_parts": [], "binary_pattern": "66 | 0F | 63", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Packs 8 signed word values from the destination and source XMM registers into 16 signed byte values using signed saturation, storing the result in the destination. Values outside the range [-128, 127] are clamped to the boundaries. No flags are affected. This SSE2 instruction is available in 64-bit and protected modes.", "pseudocode": "for i in 0..7:\n  dest[8*i+7:8*i] = SaturateSignedWordToByte(dest[16*i+15:16*i])\nfor i in 0..7:\n  dest[8*(i+8)+7:8*(i+8)] = SaturateSignedWordToByte(src[16*i+15:16*i])", "example": "PACKSSWB xmm0, xmm1"}
{"mnemonic": "packssdw", "architecture": "x86", "full_name": "Pack with Signed Saturation Doubleword to Word", "summary": "Converts doublewords to words with saturation.", "syntax": "PACKSSDW xmm, xmm/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 6B", "visual_parts": [], "binary_pattern": "66 | 0F | 6B", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm/m128", "desc": "128-bit XMM register or 128-bit memory"}], "description": "Packs 4 signed doubleword values from the destination and source XMM registers into 8 signed word values using signed saturation, storing the result in the destination. Values outside the range [-32768, 32767] are clamped to the boundaries. No flags are affected. This SSE2 instruction is available in 64-bit and protected modes.", "pseudocode": "for i in 0..3:\n  dest[16*i+15:16*i] = SaturateSignedDwordToWord(dest[32*i+31:32*i])\nfor i in 0..3:\n  dest[16*(i+4)+15:16*(i+4)] = SaturateSignedDwordToWord(src[32*i+31:32*i])", "example": "PACKSSDW xmm0, xmm1"}
{"mnemonic": "pmovmskb", "architecture": "x86", "full_name": "Move Byte Mask", "summary": "Creates a mask from the MSB of each byte in XMM.", "syntax": "PMOVMSKB r32, xmm", "encoding": {"format": "SSE2", "hex_opcode": "66 0F D7", "visual_parts": [], "binary_pattern": "66 | 0F | D7", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}], "description": "Extracts the most significant bit from each of the 16 bytes in the source XMM register and packs them into the low 16 bits of the destination 32-bit register; the upper 16 bits of the destination are zeroed. No flags are affected. This SSE2 instruction is useful for creating byte masks and is available in 64-bit and protected modes.", "pseudocode": "mask = 0\nfor i in 0..15:\n  if src[8*i+7] == 1:\n    mask |= (1 << i)\ndest[31:0] = mask", "example": "PMOVMSKB eax, xmm0"}
{"mnemonic": "maskmovdqu", "architecture": "x86", "full_name": "Store Selected Bytes of Double Quadword", "summary": "Non-temporal store of selected bytes (masked).", "syntax": "MASKMOVDQU xmm, xmm", "encoding": {"format": "SSE2", "hex_opcode": "66 0F F7", "visual_parts": [], "binary_pattern": "66 | 0F | F7", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE2", "operands": [{"name": "dest", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}, {"name": "src", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}], "description": "Conditionally stores bytes from the first XMM register to memory at the address in EDI/RDI, using the second XMM register as a write mask (only bytes with MSB set are written). This is a weakly-ordered operation; memory ordering is not guaranteed without explicit serialization. The first operand is the source of data, the second is the mask. No flags are affected. This SSE2 instruction is available in 64-bit and protected modes.", "pseudocode": "address = EDI (32-bit mode) or RDI (64-bit mode)\nfor i in 0..15:\n  if src[8*i+7] == 1:\n    [address + i] = dest[8*i+7:8*i]", "example": "MASKMOVDQU xmm0, xmm0"}
{"mnemonic": "ldmxcsr", "architecture": "x86", "full_name": "Load MXCSR Register", "summary": "Loads the MXCSR control/status register from memory.", "syntax": "LDMXCSR m32", "encoding": {"format": "SSE", "hex_opcode": "NP 0F AE /2", "visual_parts": [], "binary_pattern": "0F | AE | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "m32", "desc": "32-bit memory operand"}], "description": "Loads the MXCSR control and status register from a 32-bit memory operand, updating all SSE floating-point rounding modes, exception masks, exception flags, and DAZ/FTZ controls. This instruction serializes the CPU pipeline on many implementations. The instruction is available in 64-bit and protected modes with SSE support.", "pseudocode": "MXCSR ← [m32]", "example": "LDMXCSR [rbp-4]"}
{"mnemonic": "stmxcsr", "architecture": "x86", "full_name": "Store MXCSR Register", "summary": "Stores the MXCSR register to memory.", "syntax": "STMXCSR m32", "encoding": {"format": "SSE", "hex_opcode": "NP 0F AE /3", "visual_parts": [], "binary_pattern": "0F | AE | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "m32", "desc": "32-bit memory operand"}], "description": "Stores the 32-bit MXCSR control and status register to a 32-bit memory location. This instruction serializes execution and is typically used to save the SSE/SSE2/SSE3 floating-point state. No flags are modified by this instruction.", "pseudocode": "[dest] ← MXCSR;", "example": "STMXCSR [rbp-4]"}
{"mnemonic": "prefetcht0", "architecture": "x86", "full_name": "Prefetch Data into all Cache Levels", "summary": "Prefetches data to L1 cache.", "syntax": "PREFETCHT0 m8", "encoding": {"format": "SSE", "hex_opcode": "0F 18 /1", "visual_parts": [], "binary_pattern": "0F | 18 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "m8", "desc": "8-bit memory operand"}], "description": "Issues a prefetch hint to load data from the specified memory address into all levels of the cache hierarchy (L1, L2, L3). This is a non-binding hint; the CPU may optimize or ignore it. No flags are modified and no exception is raised for invalid addresses.", "pseudocode": "prefetch_hint(dest, TEMPORAL_ALL_LEVELS);", "example": "PREFETCHT0 [rbp-1]"}
{"mnemonic": "prefetchnta", "architecture": "x86", "full_name": "Prefetch Data using Non-Temporal Access", "summary": "Prefetches data to non-temporal cache structure (minimize pollution).", "syntax": "PREFETCHNTA m8", "encoding": {"format": "SSE", "hex_opcode": "0F 18 /0", "visual_parts": [], "binary_pattern": "0F | 18 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE", "operands": [{"name": "dest", "type": "m8", "desc": "8-bit memory operand"}], "description": "Issues a prefetch hint to load data from the specified memory address into the L1 cache using non-temporal access semantics, minimizing cache pollution for data that will not be reused. This is a non-binding hint; execution continues without waiting. No flags are modified.", "pseudocode": "prefetch_hint(dest, NON_TEMPORAL);", "example": "PREFETCHNTA [rbp-1]"}
{"mnemonic": "vfmadd132ps", "architecture": "x86", "full_name": "Fused Multiply-Add (132) Packed Single", "summary": "Computes (Dest * Src2) + Src1.", "syntax": "VFMADD132PS ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 98 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "FMA3", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Fused multiply-add on four packed single-precision floats: computes (dest × src2) + src1 with a single rounding operation, reducing latency and improving accuracy compared to separate multiply and add. Requires FMA3 extension (Intel Haswell+, AMD Piledriver+). Floating-point exceptions may be raised per IEEE 754; no integer flags are modified.", "pseudocode": "dest ← (dest * src2) + src1;  // single rounding, 256-bit YMM", "example": "VFMADD132PS ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vfmadd213ps", "architecture": "x86", "full_name": "Fused Multiply-Add (213) Packed Single", "summary": "Computes (Src1 * Dest) + Src2.", "syntax": "VFMADD213PS ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 A8 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "FMA3", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Fused multiply-add on four packed single-precision floats: computes (src1 × dest) + src2 with a single rounding operation. The operand order differs from vfmadd132ps. Requires FMA3 extension. Floating-point exceptions may be raised per IEEE 754; no integer flags are modified.", "pseudocode": "dest ← (src1 * dest) + src2;  // single rounding, 256-bit YMM", "example": "VFMADD213PS ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vfmsub132ps", "architecture": "x86", "full_name": "Fused Multiply-Subtract (132) Packed Single", "summary": "Computes (Dest * Src2) - Src1.", "syntax": "VFMSUB132PS ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 9A /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "FMA3", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Fused multiply-subtract on four packed single-precision floats: computes (dest × src2) - src1 with a single rounding operation. Requires FMA3 extension. Floating-point exceptions may be raised per IEEE 754; no integer flags are modified.", "pseudocode": "dest ← (dest * src2) - src1;  // single rounding, 256-bit YMM", "example": "VFMSUB132PS ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vfnmadd132ps", "architecture": "x86", "full_name": "Fused Negative Multiply-Add (132) Packed Single", "summary": "Computes -(Dest * Src2) + Src1.", "syntax": "VFNMADD132PS ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 9C /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "FMA3", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Fused negative multiply-add on four packed single-precision floats: computes -(dest × src2) + src1 with a single rounding operation, negating the product before the addition. Requires FMA3 extension. Floating-point exceptions may be raised per IEEE 754; no integer flags are modified.", "pseudocode": "dest ← -(dest * src2) + src1;  // single rounding, 256-bit YMM", "example": "VFNMADD132PS ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vpaddd", "architecture": "x86", "full_name": "Packed Add Doubleword (AVX2)", "summary": "Adds 8 integers (256-bit).", "syntax": "VPADDD ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F.WIG FE /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Adds eight packed 32-bit signed/unsigned integers from two 256-bit YMM registers or memory, storing the result in the destination. Integer overflow wraps around; no overflow flag is set. Requires AVX2 extension (Intel Haswell+, AMD Excavator+). No flags are modified.", "pseudocode": "for i = 0 to 7:\n  dest[32*i+31:32*i] ← dest[32*i+31:32*i] + src2[32*i+31:32*i];", "example": "VPADDD ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vpaddb", "architecture": "x86", "full_name": "Packed Add Byte (AVX2)", "summary": "Adds 32 bytes (256-bit).", "syntax": "VPADDB ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F.WIG FC /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Adds packed byte integers element-wise across two 256-bit YMM registers (or one YMM and one memory operand), producing 32 sums in the destination. No arithmetic flags are affected; wrapping occurs on overflow. This is a non-destructive three-operand instruction (VEX encoding allows the first source to remain unchanged).", "pseudocode": "for i = 0 to 31:\n  dest[i*8 + 7 : i*8] ← src1[i*8 + 7 : i*8] + src2[i*8 + 7 : i*8]", "example": "VPADDB ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vpsubd", "architecture": "x86", "full_name": "Packed Subtract Doubleword (AVX2)", "summary": "Subtracts 8 integers (256-bit).", "syntax": "VPSUBD ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F.WIG FA /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Subtracts packed doubleword (32-bit) integers element-wise from two 256-bit YMM registers (or one YMM and one memory operand), producing 8 differences in the destination. No arithmetic flags are affected; wrapping occurs on underflow. This is a non-destructive three-operand instruction (VEX encoding).", "pseudocode": "for i = 0 to 7:\n  dest[i*32 + 31 : i*32] ← src1[i*32 + 31 : i*32] - src2[i*32 + 31 : i*32]", "example": "VPSUBD ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vpmulld", "architecture": "x86", "full_name": "Packed Multiply Low Doubleword (AVX2)", "summary": "Multiplies 8 integers (256-bit).", "syntax": "VPMULLD ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.WIG 40 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Multiplies packed doubleword (32-bit) integers element-wise across two 256-bit YMM registers (or one YMM and one memory operand), producing 8 low 32-bit products in the destination. No arithmetic flags are affected; the high 32 bits of each product are discarded. This is a non-destructive three-operand instruction (VEX encoding requires AVX2).", "pseudocode": "for i = 0 to 7:\n  temp_product ← src1[i*32 + 31 : i*32] * src2[i*32 + 31 : i*32]\n  dest[i*32 + 31 : i*32] ← temp_product[31 : 0]", "example": "VPMULLD ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vpshufb", "architecture": "x86", "full_name": "Packed Shuffle Bytes (AVX2)", "summary": "Shuffles 32 bytes based on indices.", "syntax": "VPSHUFB ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.WIG 00 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Shuffles 32 bytes within 256-bit YMM register using per-byte indices from another YMM register or memory; the operation works within 128-bit lanes (bytes 0-15 and 16-31 are shuffled independently). If the index's high bit (bit 7) is set, the result byte is zeroed; otherwise the low 4 bits select which source byte to copy within the lane. No arithmetic flags are affected.", "pseudocode": "for i = 0 to 1:\n  for j = 0 to 15:\n    idx_byte = src2[(i*16 + j)*8 + 7 : (i*16 + j)*8]\n    if idx_byte[7] == 1:\n      dest[(i*16 + j)*8 + 7 : (i*16 + j)*8] ← 0\n    else:\n      byte_offset = (i*16) + (idx_byte[3:0])\n      dest[(i*16 + j)*8 + 7 : (i*16 + j)*8] ← src1[byte_offset*8 + 7 : byte_offset*8]", "example": "VPSHUFB ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vperm2i128", "architecture": "x86", "full_name": "Permute 128-bit Integer Blocks", "summary": "Shuffles two 128-bit lanes between registers.", "syntax": "VPERM2I128 ymm1, ymm2, ymm3/m256, imm8", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F3A.W0 46 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Permutes two 128-bit lanes from two 256-bit YMM registers based on an 8-bit immediate control value. The low nibble selects which 128-bit lane to take from src1, and the high nibble selects from src2; a lane can be zeroed by setting its selector to 0x8. The result fills the destination's two 128-bit halves independently. No arithmetic flags are affected.", "pseudocode": "ctrl_low = src3[3:0]\nctrl_high = src3[7:4]\nif ctrl_low == 0x8:\n  dest[127:0] ← 0\nelse:\n  dest[127:0] ← src1[127:0] if (ctrl_low & 0x4) == 0 else src1[255:128]\nif ctrl_high == 0x8:\n  dest[255:128] ← 0\nelse:\n  dest[255:128] ← src2[127:0] if (ctrl_high & 0x4) == 0 else src2[255:128]", "example": "VPERM2I128 ymm1, ymm2, ymm3/m256, 3"}
{"mnemonic": "vpermd", "architecture": "x86", "full_name": "Permute Doublewords", "summary": "Full permutation of 8 integers using indices from a register.", "syntax": "VPERMD ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 36 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Performs a full permutation of 8 doublewords (32-bit integers) within a 256-bit YMM register using per-element indices from another YMM register or memory. The low 3 bits of each index select which of the 8 source doublewords to place at that position; if bit 31 is set in the index, the result element is zeroed. No arithmetic flags are affected.", "pseudocode": "for i = 0 to 7:\n  idx = src1[i*32 + 31 : i*32]\n  if idx[31] == 1:\n    dest[i*32 + 31 : i*32] ← 0\n  else:\n    src_idx = idx[2:0]\n    dest[i*32 + 31 : i*32] ← src2[src_idx*32 + 31 : src_idx*32]", "example": "VPERMD ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vpermps", "architecture": "x86", "full_name": "Permute Single-Precision Floating-Point", "summary": "Full permutation of 8 floats using indices.", "syntax": "VPERMPS ymm1, ymm2, ymm3/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 16 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "ymm3/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Performs a full permutation of 8 single-precision floating-point values within a 256-bit YMM register using per-element indices from another YMM register or memory. The low 3 bits of each index select which of the 8 source floats to place at that position; if bit 31 is set in the index, the result element is zeroed. No arithmetic flags are affected.", "pseudocode": "for i = 0 to 7:\n  idx = src1[i*32 + 31 : i*32]\n  if idx[31] == 1:\n    dest[i*32 + 31 : i*32] ← 0\n  else:\n    src_idx = idx[2:0]\n    dest[i*32 + 31 : i*32] ← src2[src_idx*32 + 31 : src_idx*32]", "example": "VPERMPS ymm1, ymm2, ymm3/m256"}
{"mnemonic": "vpbroadcastb", "architecture": "x86", "full_name": "Broadcast Byte", "summary": "Broadcasts a byte from memory/register to all elements of YMM.", "syntax": "VPBROADCASTB ymm1, xmm2/m8", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 78 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src", "type": "xmm2/m8", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Broadcasts a single byte from an XMM register or memory location to all 32 byte positions in a 256-bit YMM destination register. The source byte is replicated 32 times, filling the entire YMM with the same byte value. No arithmetic flags are affected.", "pseudocode": "src_byte = src[7:0]\nfor i = 0 to 31:\n  dest[i*8 + 7 : i*8] ← src_byte", "example": "VPBROADCASTB ymm1, xmm2/m8"}
{"mnemonic": "vgatherdps", "architecture": "x86", "full_name": "Gather Packed Single Precision", "summary": "Loads floats from non-contiguous memory using indices.", "syntax": "VGATHERDPS ymm1, [base+ymm_idx*scale], ymm_mask", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 92 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "[base+ymm_idx*scale]", "desc": "AVX scatter: base register + scaled YMM vector index"}, {"name": "src2", "type": "ymm_mask", "desc": "YMM register acting as gather/scatter mask and result destination"}], "description": "Gathers four single-precision floating-point values from non-contiguous memory locations using a base address and a YMM vector of 32-bit indices with optional scaling, storing results in the destination YMM register. The mask register controls which elements are loaded (set bits indicate active gather); masked-out elements are zeroed. Sets ZF if all mask bits are zero, clears CF and OF; other flags undefined.", "pseudocode": "for i = 0 to 3:\n  if mask[i*32 : i*32+31] != 0:\n    addr = base + (index_ymm[i*32 : i*32+31] * scale)\n    dest_ymm[i*32 : i*32+31] = [addr]\n    mask[i*32 : i*32+31] = 0\n  else:\n    dest_ymm[i*32 : i*32+31] = 0\nZF = (mask == 0)\nCF = 0\nOF = 0", "example": "VGATHERDPS ymm1, [base+ymm_idx*scale], ymm_mask"}
{"mnemonic": "vgatherdpd", "architecture": "x86", "full_name": "Gather Packed Double Precision", "summary": "Loads doubles from non-contiguous memory using indices.", "syntax": "VGATHERDPD ymm1, [base+xmm_idx*scale], ymm_mask", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W1 92 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "[base+xmm_idx*scale]", "desc": "AVX gather: base register + scaled XMM vector index"}, {"name": "src2", "type": "ymm_mask", "desc": "YMM register acting as gather/scatter mask and result destination"}], "description": "Gathers two double-precision floating-point values from non-contiguous memory locations using a base address and an XMM vector of 32-bit indices with optional scaling, storing results in the destination YMM register. The mask register (YMM) controls which of the two elements are loaded; masked-out elements are zeroed. Sets ZF if all mask bits are zero, clears CF and OF; other flags undefined.", "pseudocode": "for i = 0 to 1:\n  if mask[i*64 : i*64+63] != 0:\n    addr = base + (index_xmm[i*32 : i*32+31] * scale)\n    dest_ymm[i*64 : i*64+63] = [addr]\n    mask[i*64 : i*64+63] = 0\n  else:\n    dest_ymm[i*64 : i*64+63] = 0\nZF = (mask == 0)\nCF = 0\nOF = 0", "example": "VGATHERDPD ymm1, [base+xmm_idx*scale], ymm_mask"}
{"mnemonic": "andn", "architecture": "x86", "full_name": "Logical AND NOT", "summary": "Calculates (NOT src1) AND src2. Non-destructive.", "syntax": "ANDN r32, r32, r/m32", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.0F38.W0 F2 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI1", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src1", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src2", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Performs bitwise AND of the logical NOT of src1 with src2, storing the result in dest without modifying src1. ZF is set if result is zero; CF and OF are cleared; AF and PF are undefined. Available in 32-bit and 64-bit operand sizes; requires BMI1 extension.", "pseudocode": "dest ← (~src1) & src2\nZF ← (dest == 0)\nCF ← 0\nOF ← 0\nAF ← undefined\nPF ← undefined", "example": "ANDN eax, eax, ebx"}
{"mnemonic": "bextr", "architecture": "x86", "full_name": "Bit Field Extract", "summary": "Extracts sequence of bits from source using index/length.", "syntax": "BEXTR r32, r/m32, r32", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.0F38.W0 F7 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI1", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src1", "type": "r/m32", "desc": "32-bit register or memory"}, {"name": "src2", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Extracts a contiguous sequence of bits from src1 specified by the start position and length encoded in src2 (bits 7:0 = start, bits 15:8 = length), storing the extracted bits in dest. ZF is set if the result is zero; CF and OF are cleared; AF and PF are undefined. Available in 32-bit and 64-bit sizes; requires BMI1 extension.", "pseudocode": "start ← src2[0:7]\nlength ← src2[8:15]\nif length == 0:\n  dest ← 0\nelse if (start + length) > 32:\n  dest ← 0\nelse:\n  dest ← (src1 >> start) & ((1 << length) - 1)\nZF ← (dest == 0)\nCF ← 0\nOF ← 0\nAF ← undefined\nPF ← undefined", "example": "BEXTR eax, ebx, eax"}
{"mnemonic": "blsi", "architecture": "x86", "full_name": "Extract Lowest Set Isolated Bit", "summary": "Extracts the lowest set bit (x & -x).", "syntax": "BLSI r32, r/m32", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.0F38.W0 F3 /3", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI1", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Extracts the lowest set bit from src by computing (src & -src), storing the result in dest. ZF is set if src is zero; CF is set if src is zero; OF is cleared; AF and PF are undefined. Available in 32-bit and 64-bit sizes; requires BMI1 extension.", "pseudocode": "dest ← src & (-src)\nZF ← (src == 0)\nCF ← (src == 0)\nOF ← 0\nAF ← undefined\nPF ← undefined", "example": "BLSI eax, ebx"}
{"mnemonic": "blsmsk", "architecture": "x86", "full_name": "Get Mask Up to Lowest Set Bit", "summary": "Creates mask up to lowest set bit (x ^ (x-1)).", "syntax": "BLSMSK r32, r/m32", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.0F38.W0 F3 /2", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI1", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Creates a mask of all bits set from bit 0 up to and including the lowest set bit in src by computing (src ^ (src - 1)), storing the result in dest. ZF is set if src is zero; CF is set if src is zero; OF is cleared; AF and PF are undefined. Available in 32-bit and 64-bit sizes; requires BMI1 extension.", "pseudocode": "dest ← src ^ (src - 1)\nZF ← (src == 0)\nCF ← (src == 0)\nOF ← 0\nAF ← undefined\nPF ← undefined", "example": "BLSMSK eax, ebx"}
{"mnemonic": "blsr", "architecture": "x86", "full_name": "Reset Lowest Set Bit", "summary": "Clears the lowest set bit (x & (x-1)).", "syntax": "BLSR r32, r/m32", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.0F38.W0 F3 /1", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI1", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Clears the lowest set bit in src by computing (src & (src - 1)), storing the result in dest. ZF is set if the result is zero; CF is set if src is zero; OF is cleared; AF and PF are undefined. Available in 32-bit and 64-bit sizes; requires BMI1 extension.", "pseudocode": "dest ← src & (src - 1)\nZF ← (dest == 0)\nCF ← (src == 0)\nOF ← 0\nAF ← undefined\nPF ← undefined", "example": "BLSR eax, ebx"}
{"mnemonic": "tzcnt", "architecture": "x86", "full_name": "Count Trailing Zeros", "summary": "Counts the number of trailing zeros.", "syntax": "TZCNT r32, r/m32", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F BC", "visual_parts": [], "binary_pattern": "F3 | 0F | BC", "bit_positions": "+0 | +1 | +2"}, "extension": "BMI1", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Counts the number of trailing zero bits in src, storing the count in dest. If src is zero, dest is set to the operand size (32 for r/m32); ZF is set if src is zero; CF is cleared; other flags undefined. Available in 32-bit and 64-bit operand sizes; BMI1 extension provides faster behavior than BSF.", "pseudocode": "if src == 0:\n  dest ← 32\n  ZF ← 1\nelse:\n  count ← 0\n  while (src & 1) == 0:\n    count ← count + 1\n    src ← src >> 1\n  dest ← count\n  ZF ← 0\nCF ← 0", "example": "TZCNT eax, ebx"}
{"mnemonic": "bzhi", "architecture": "x86", "full_name": "Zero High Bits Starting with Specified Bit Position", "summary": "Clears high bits starting at index.", "syntax": "BZHI r32, r/m32, r32", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.0F38.W0 F5 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI2", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src1", "type": "r/m32", "desc": "32-bit register or memory"}, {"name": "src2", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Zero High Bits Starting with Specified Bit Position clears all bits in the source operand at positions greater than or equal to the bit index specified in the third operand, storing the result in the destination. No flags are modified. Supported in 32-bit and 64-bit modes with BMI2 extension; the operand size can be 32 or 64 bits.", "pseudocode": "count ← src2[7:0] & 0x3F; mask ← (1 << count) - 1; dest ← src1 & mask;", "example": "BZHI eax, ebx, eax"}
{"mnemonic": "pext", "architecture": "x86", "full_name": "Parallel Bits Extract", "summary": "Extracts bits from source using mask and packs them to LSB.", "syntax": "PEXT r32, r32, r/m32", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.F3.0F38.W0 F5 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI2", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src1", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src2", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Parallel Bits Extract copies bits from the first source operand to the destination at positions where the mask operand has set bits, compacting them toward the LSB. No flags are modified. Supported in 32-bit and 64-bit modes with BMI2 extension; operand size can be 32 or 64 bits.", "pseudocode": "result ← 0; dest_bit ← 0; for (i = 0; i < operand_size; i++) { if (src2[i]) { result[dest_bit] ← src1[i]; dest_bit += 1; } } dest ← result;", "example": "PEXT eax, eax, ebx"}
{"mnemonic": "pdep", "architecture": "x86", "full_name": "Parallel Bits Deposit", "summary": "Scatters bits from LSB of source to positions marked in mask.", "syntax": "PDEP r32, r32, r/m32", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.F2.0F38.W0 F5 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI2", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src1", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src2", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Parallel Bits Deposit scatters bits from the LSB of the first source operand to positions marked by set bits in the mask operand, storing the result in the destination. No flags are modified. Supported in 32-bit and 64-bit modes with BMI2 extension; operand size can be 32 or 64 bits.", "pseudocode": "result ← 0; src_bit ← 0; for (i = 0; i < operand_size; i++) { if (src2[i]) { result[i] ← src1[src_bit]; src_bit += 1; } } dest ← result;", "example": "PDEP eax, eax, ebx"}
{"mnemonic": "mulx", "architecture": "x86", "full_name": "Unsigned Multiply Without Affecting Flags", "summary": "Unsigned multiply of RDX * Src. Result in Hi:Lo. No flags.", "syntax": "MULX r32, r32, r/m32", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.F2.0F38.W0 F6 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI2", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src1", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src2", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Unsigned Multiply Without Affecting Flags multiplies the implicit RDX register by the source operand and stores the 128-bit product in two destination registers (high part in the first operand, low part in the second), without modifying any arithmetic flags. Supported in 32-bit and 64-bit modes with BMI2 extension; the operand size can be 32 or 64 bits.", "pseudocode": "product ← RDX * src; dest_hi ← product[127:64]; dest_lo ← product[63:0];", "example": "MULX eax, eax, ebx"}
{"mnemonic": "shlx", "architecture": "x86", "full_name": "Shift Logical Left Without Affecting Flags", "summary": "Logical left shift, count in register. No flags update.", "syntax": "SHLX r32, r/m32, r32", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.66.0F38.W0 F7 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI2", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src1", "type": "r/m32", "desc": "32-bit register or memory"}, {"name": "src2", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Shift Logical Left Without Affecting Flags performs a left shift of the source operand by a count held in a register, storing the result in the destination, without modifying any arithmetic flags. Supported in 32-bit and 64-bit modes with BMI2 extension; operand size can be 32 or 64 bits.", "pseudocode": "count ← src2 & ((operand_size == 64) ? 0x3F : 0x1F); dest ← src1 << count;", "example": "SHLX eax, ebx, eax"}
{"mnemonic": "shrx", "architecture": "x86", "full_name": "Shift Logical Right Without Affecting Flags", "summary": "Logical right shift, count in register. No flags update.", "syntax": "SHRX r32, r/m32, r32", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.F2.0F38.W0 F7 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI2", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src1", "type": "r/m32", "desc": "32-bit register or memory"}, {"name": "src2", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Shift Logical Right Without Affecting Flags performs a logical right shift of the source operand by a count held in a register, storing the result in the destination, without modifying any arithmetic flags. Supported in 32-bit and 64-bit modes with BMI2 extension; operand size can be 32 or 64 bits.", "pseudocode": "count ← src2 & ((operand_size == 64) ? 0x3F : 0x1F); dest ← src1 >> count;", "example": "SHRX eax, ebx, eax"}
{"mnemonic": "sarx", "architecture": "x86", "full_name": "Shift Arithmetic Right Without Affecting Flags", "summary": "Arithmetic right shift, count in register. No flags update.", "syntax": "SARX r32, r/m32, r32", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.F3.0F38.W0 F7 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI2", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src1", "type": "r/m32", "desc": "32-bit register or memory"}, {"name": "src2", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Shift Arithmetic Right Without Affecting Flags performs an arithmetic right shift of the source operand by a count held in a register, storing the result in the destination, without modifying any arithmetic flags. Supported in 32-bit and 64-bit modes with BMI2 extension; operand size can be 32 or 64 bits; the sign bit is extended into vacated positions.", "pseudocode": "count ← src2 & ((operand_size == 64) ? 0x3F : 0x1F); dest ← (signed)src1 >> count;", "example": "SARX eax, ebx, eax"}
{"mnemonic": "rorx", "architecture": "x86", "full_name": "Rotate Right Logical Without Affecting Flags", "summary": "Rotate right with immediate. No flags update.", "syntax": "RORX r32, r/m32, imm8", "encoding": {"format": "VEX", "hex_opcode": "VEX.LZ.F2.0F3A.W0 F0 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "BMI2", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src1", "type": "r/m32", "desc": "32-bit register or memory"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rotate Right Logical Without Affecting Flags rotates the source operand right by an immediate count, storing the result in the destination, without modifying any arithmetic flags. Supported in 32-bit and 64-bit modes with BMI2 extension; operand size can be 32 or 64 bits.", "pseudocode": "count ← src2 & ((operand_size == 64) ? 0x3F : 0x1F); dest ← (src1 >> count) | (src1 << (operand_size - count));", "example": "RORX eax, ebx, 3"}
{"mnemonic": "rdrand", "architecture": "x86", "full_name": "Read Random Number", "summary": "Retrieves a hardware-generated random number.", "syntax": "RDRAND r32", "encoding": {"format": "Legacy", "hex_opcode": "NFx 0F C7 /6", "visual_parts": [], "binary_pattern": "0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "RDRAND", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Retrieves a cryptographically secure random number from the CPU's hardware random number generator and stores it in the destination register. The CF flag is set to 1 if a random number was successfully generated within the timeout period, or cleared to 0 if the generator failed to produce a value. No other flags are affected. This instruction is available only on processors with the RDRAND extension and cannot be used in real mode.", "pseudocode": "temp ← hardware_RNG();\nif (RNG_success) {\n  dest ← temp;\n  CF ← 1;\n} else {\n  CF ← 0;\n}", "example": "RDRAND eax"}
{"mnemonic": "rdseed", "architecture": "x86", "full_name": "Read Random Seed", "summary": "Retrieves a random seed from hardware entropy source.", "syntax": "RDSEED r32", "encoding": {"format": "Legacy", "hex_opcode": "NFx 0F C7 /7", "visual_parts": [], "binary_pattern": "0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "RDSEED", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Retrieves an entropy seed value from the CPU's hardware entropy source and stores it in the destination register. The CF flag is set to 1 if the seed was successfully obtained within the timeout period, or cleared to 0 on failure. No other flags are affected. This instruction requires the RDSEED extension and operates in protected and 64-bit modes only.", "pseudocode": "temp ← hardware_entropy_source();\nif (entropy_success) {\n  dest ← temp;\n  CF ← 1;\n} else {\n  CF ← 0;\n}", "example": "RDSEED eax"}
{"mnemonic": "invpcid", "architecture": "x86", "full_name": "Invalidate Process-Context Identifier", "summary": "Invalidates TLB entries based on PCID.", "syntax": "INVPCID r32, m128", "encoding": {"format": "Legacy", "hex_opcode": "66 0F 38 82", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 82", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "INVPCID", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "m128", "desc": "128-bit memory operand"}], "description": "Invalidates TLB entries based on the PCID (Process-Context Identifier) specified in the 128-bit memory operand, with the invalidation type determined by the descriptor type field. The source register provides an address (typically a general register holding PCID context information), and the memory operand contains the full 128-bit invalidation descriptor. This is a privileged instruction (CPL 0 only) that serializes the pipeline and requires the INVPCID extension. No flags are affected.", "pseudocode": "descriptor ← [src + 0:127];\ninvalidation_type ← descriptor.type;\npcid ← descriptor.pcid;\nswitch(invalidation_type) {\n  case 0: invalidate_tlb_entry_by_pcid(pcid); break;\n  case 1: invalidate_all_tlb_entries_by_pcid(pcid); break;\n  case 2: invalidate_all_tlb_entries(); break;\n  case 3: invalidate_all_tlb_entries_except_global(); break;\n}\npipeline_serialization();", "example": "INVPCID eax, [rbp-16]"}
{"mnemonic": "adcx", "architecture": "x86", "full_name": "Unsigned Integer Addition of Two Operands with Carry Flag", "summary": "Adds with Carry Flag (distinct from ADC, affects CF only).", "syntax": "ADCX r32, r/m32", "encoding": {"format": "Legacy", "hex_opcode": "66 0F 38 F6", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | F6", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "ADX", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Adds the source operand and the Carry Flag (CF) to the destination operand, storing the result in the destination. Only the CF flag is modified (set to 1 if unsigned overflow occurs, cleared to 0 otherwise); OF, SF, ZF, AF, and PF are left unchanged. This instruction is distinct from ADC in that it does not affect other flags, making it useful for parallel carry-chain operations with ADOX. Available in 32-bit and 64-bit operand sizes with the ADX extension.", "pseudocode": "temp ← dest + src + CF;\nCF ← (temp > 0xFFFFFFFF) ? 1 : 0;\ndest ← temp & 0xFFFFFFFF;", "example": "ADCX eax, ebx"}
{"mnemonic": "adox", "architecture": "x86", "full_name": "Unsigned Integer Addition of Two Operands with Overflow Flag", "summary": "Adds with Overflow Flag (Parallel addition with ADCX).", "syntax": "ADOX r32, r/m32", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 F6", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | F6", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "ADX", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Adds the source operand and the Overflow Flag (OF) to the destination operand, storing the result in the destination. Only the OF flag is modified (set to 1 if signed overflow occurs, cleared to 0 otherwise); CF, SF, ZF, AF, and PF are left unchanged. This instruction is designed to execute in parallel with ADCX for independent carry and overflow chains in multi-precision arithmetic. Available in 32-bit and 64-bit operand sizes with the ADX extension.", "pseudocode": "temp ← dest + src + OF;\nOF ← (signed_overflow(dest, src, temp)) ? 1 : 0;\ndest ← temp & 0xFFFFFFFF;", "example": "ADOX eax, ebx"}
{"mnemonic": "vinserti128", "architecture": "x86", "full_name": "Insert Integer 128-bit", "summary": "Inserts 128-bits of integer data into a YMM register.", "syntax": "VINSERTI128 ymm1, ymm2, xmm3/m128, imm8", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F3A.W0 38 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "xmm3/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Inserts a 128-bit integer value from the source operand into the destination YMM register at the position specified by the immediate operand. The lower 128 bits of the source YMM register (src1) are preserved or replaced depending on the immediate; typically imm8[0]=0 replaces the lower 128 bits, and imm8[0]=1 replaces the upper 128 bits. No flags are affected. This is a VEX-encoded AVX2 instruction that supports 32-bit or 64-bit vector elements.", "pseudocode": "if (imm8[0] == 0) {\n  dest[127:0] ← src2[127:0];\n  dest[255:128] ← src1[255:128];\n} else {\n  dest[127:0] ← src1[127:0];\n  dest[255:128] ← src2[127:0];\n}", "example": "VINSERTI128 ymm1, ymm2, xmm3/m128, 3"}
{"mnemonic": "vextracti128", "architecture": "x86", "full_name": "Extract Integer 128-bit", "summary": "Extracts 128-bits of integer data from YMM.", "syntax": "VEXTRACTI128 xmm1/m128, ymm2, imm8", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F3A.W0 39 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX2", "operands": [{"name": "dest", "type": "xmm1/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src1", "type": "ymm2", "desc": "256-bit YMM AVX register"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Extracts a 128-bit integer value from the source YMM register and stores it in the destination XMM register or memory location. The specific 128-bit lane extracted is determined by the immediate operand (imm8[0]=0 for lower 128 bits, imm8[0]=1 for upper 128 bits). No flags are affected. This is a VEX-encoded AVX2 instruction that complements VINSERTI128 for manipulating 256-bit vectors.", "pseudocode": "if (imm8[0] == 0) {\n  dest ← src1[127:0];\n} else {\n  dest ← src1[255:128];\n}", "example": "VEXTRACTI128 xmm1/m128, ymm2, 3"}
{"mnemonic": "clac", "architecture": "x86", "full_name": "Clear AC Flag in EFLAGS", "summary": "Clears Alignment Check flag (SMAP prevention).", "syntax": "CLAC", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 01 CA", "visual_parts": [], "binary_pattern": "0F | 01 | CA", "bit_positions": "+0 | +1 | +2"}, "extension": "SMAP", "operands": [], "description": "Clears the Alignment Check (AC) flag in EFLAGS, disabling alignment checking for user-mode code. When combined with SMAP (Supervisor Mode Access Prevention), this instruction allows the kernel to temporarily disable SMAP protections. This is a privileged instruction (CPL 0 only) available with the SMAP extension. No other flags are affected.", "pseudocode": "EFLAGS.AC ← 0;", "example": "CLAC"}
{"mnemonic": "stac", "architecture": "x86", "full_name": "Set AC Flag in EFLAGS", "summary": "Sets Alignment Check flag (Allow user memory access).", "syntax": "STAC", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 01 CB", "visual_parts": [], "binary_pattern": "0F | 01 | CB", "bit_positions": "+0 | +1 | +2"}, "extension": "SMAP", "operands": [], "description": "Sets the Alignment Check (AC) flag in EFLAGS, enabling alignment checking and allowing user-mode access to supervisor-mode data structures when SMAP protection is present. This instruction requires SMAP support and ring 0 privilege. Only the AC flag is modified; all other flags remain unchanged.", "pseudocode": "EFLAGS.AC ← 1;", "example": "STAC"}
{"mnemonic": "gf2p8affineqb", "architecture": "x86", "full_name": "Galois Field Affine Transformation", "summary": "Computes affine transformation in GF(2^8).", "syntax": "GF2P8AFFINEQB xmm1, xmm2/m128, imm8", "encoding": {"format": "VEX", "hex_opcode": "66 0F 3A CE /r ib", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | CE", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "GFNI", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs byte-wise affine transformation in Galois Field GF(2^8) on 128-bit XMM operands using a constant 8-bit immediate as the affine constant. Each byte in the destination is transformed using the corresponding byte from the source operand. No flags are affected; this is a pure data-parallel cryptographic operation.", "pseudocode": "for i in 0..15:\n  dest[i] ← GF2P8_AFFINE_TRANSFORM(dest[i], src[i], imm8);", "example": "GF2P8AFFINEQB xmm1, xmm2/m128, 3"}
{"mnemonic": "gf2p8mulb", "architecture": "x86", "full_name": "Galois Field Multiply Bytes", "summary": "Multiplies bytes in GF(2^8).", "syntax": "GF2P8MULB xmm1, xmm2/m128", "encoding": {"format": "VEX", "hex_opcode": "66 0F 38 CF /r", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | CF", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "GFNI", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Multiplies each byte in the destination XMM register by the corresponding byte in the source operand within Galois Field GF(2^8). The result replaces the destination operand byte-wise. No flags are affected; this is a pure cryptographic SIMD operation with full latency parallelism.", "pseudocode": "for i in 0..15:\n  dest[i] ← GF2P8_MULTIPLY(dest[i], src[i]);", "example": "GF2P8MULB xmm1, xmm2/m128"}
{"mnemonic": "sha1msg1", "architecture": "x86", "full_name": "SHA1 Message Schedule 1", "summary": "Performs intermediate calculation for SHA1 message schedule.", "syntax": "SHA1MSG1 xmm1, xmm2/m128", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 38 C9 /r", "visual_parts": [], "binary_pattern": "0F | 38 | C9", "bit_positions": "+0 | +1 | +2"}, "extension": "SHA", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs the first intermediate step of SHA-1 message schedule expansion on 128-bit XMM operands, computing partial W values (message words) for rounds 16-19. The destination is updated with results of the schedule computation; no flags are affected.", "pseudocode": "W[0..3] ← dest[0..3];\nW[4..7] ← src[0..3];\nfor i in 0..3:\n  dest[i] ← W[i] ⊕ W[i+2] ⊕ W[i+8] ⊕ W[i+13];", "example": "SHA1MSG1 xmm1, xmm2/m128"}
{"mnemonic": "sha1msg2", "architecture": "x86", "full_name": "SHA1 Message Schedule 2", "summary": "Performs final calculation for SHA1 message schedule.", "syntax": "SHA1MSG2 xmm1, xmm2/m128", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 38 CA /r", "visual_parts": [], "binary_pattern": "0F | 38 | CA", "bit_positions": "+0 | +1 | +2"}, "extension": "SHA", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs the second final step of SHA-1 message schedule expansion on 128-bit XMM operands, completing W value computation and applying left rotation. The destination is updated with final message schedule results; no flags are affected.", "pseudocode": "W[0..3] ← dest[0..3];\nW[4..7] ← src[0..3];\nfor i in 0..3:\n  W[i] ← W[i] ⊕ W[i+4] ⊕ W[i+5] ⊕ W[i+6];\n  dest[i] ← ROTL32(W[i], 1);", "example": "SHA1MSG2 xmm1, xmm2/m128"}
{"mnemonic": "sha1nexte", "architecture": "x86", "full_name": "SHA1 State Variable E", "summary": "Calculates SHA1 state variable E.", "syntax": "SHA1NEXTE xmm1, xmm2/m128", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 38 C8 /r", "visual_parts": [], "binary_pattern": "0F | 38 | C8", "bit_positions": "+0 | +1 | +2"}, "extension": "SHA", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Calculates intermediate SHA-1 state variable E for one round, adding the source operand (containing message schedule and round constants) to the destination operand and applying left rotation. The result updates the destination with the next E value; no flags are affected.", "pseudocode": "E ← dest[0];\nW ← src[0];\ndest[0] ← ROTL32(E, 5) + W;\ndest[1..3] ← dest[1..3] rotated left by 30 bits from the previous round state;", "example": "SHA1NEXTE xmm1, xmm2/m128"}
{"mnemonic": "sha1rnds4", "architecture": "x86", "full_name": "SHA1 Rounds 4", "summary": "Performs 4 rounds of SHA1 operation.", "syntax": "SHA1RNDS4 xmm1, xmm2/m128, imm8", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 3A CC /r ib", "visual_parts": [], "binary_pattern": "0F | 3A | CC", "bit_positions": "+0 | +1 | +2"}, "extension": "SHA", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Executes 4 rounds of the SHA-1 compression function, performing circular left shift, addition, and XOR operations on the five 32-bit state variables (A, B, C, D, E). The immediate byte selects the round function constant (K value 0-3); no flags are affected.", "pseudocode": "for round in 0..3:\n  f ← SHA1_FUNCTION(round + imm8*4, B, C, D);\n  K ← SHA1_CONSTANT(round + imm8*4);\n  T ← ROTL32(A, 5) + f + E + K + W[round + imm8*4];\n  E ← D; D ← C; C ← ROTL32(B, 30); B ← A; A ← T;", "example": "SHA1RNDS4 xmm1, xmm2/m128, 3"}
{"mnemonic": "sha256msg1", "architecture": "x86", "full_name": "SHA256 Message Schedule 1", "summary": "Performs intermediate calculation for SHA256 message schedule.", "syntax": "SHA256MSG1 xmm1, xmm2/m128", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 38 CC /r", "visual_parts": [], "binary_pattern": "0F | 38 | CC", "bit_positions": "+0 | +1 | +2"}, "extension": "SHA", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs the first intermediate step of SHA-256 message schedule expansion on 128-bit XMM operands, computing partial W values for the message schedule. The destination is updated with results of the partial expansion; no flags are affected.", "pseudocode": "W[0..3] ← dest[0..3];\nW[4..7] ← src[0..3];\nfor i in 0..3:\n  dest[i] ← W[i] + SHA256_GAMMA0(W[i+1]);", "example": "SHA256MSG1 xmm1, xmm2/m128"}
{"mnemonic": "sha256msg2", "architecture": "x86", "full_name": "SHA256 Message Schedule 2", "summary": "Performs final calculation for SHA256 message schedule.", "syntax": "SHA256MSG2 xmm1, xmm2/m128", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 38 CD /r", "visual_parts": [], "binary_pattern": "0F | 38 | CD", "bit_positions": "+0 | +1 | +2"}, "extension": "SHA", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Performs the final calculation of the SHA256 message schedule for the next 4 message words. The instruction operates on 128-bit XMM registers containing 32-bit message schedule values and combines them with the previous message schedule state. All flags (CF, PF, AF, ZF, SF, OF) remain unchanged; this is a pure data-transformation instruction with no flag effects.", "pseudocode": "xmm1[127:0] ← SHA256_MSG_SCHEDULE_ROUND(xmm1[127:0], xmm2/m128[127:0])", "example": "SHA256MSG2 xmm1, xmm2/m128"}
{"mnemonic": "sha256rnds2", "architecture": "x86", "full_name": "SHA256 Rounds 2", "summary": "Performs 2 rounds of SHA256 operation.", "syntax": "SHA256RNDS2 xmm1, xmm2/m128, xmm0", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 38 CB /r", "visual_parts": [], "binary_pattern": "0F | 38 | CB", "bit_positions": "+0 | +1 | +2"}, "extension": "SHA", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "xmm0", "desc": "128-bit XMM SIMD register"}], "description": "Executes two rounds of the SHA256 compression function on the working variables. The instruction reads round constants from XMM0 and processes the destination register in-place using the source operand as input to the SHA256 rounds. All flags remain unchanged; this instruction has no flag side effects and requires the SHA CPU extension.", "pseudocode": "xmm1[127:0] ← SHA256_ROUNDS(xmm1[127:0], xmm2/m128[127:0], xmm0[127:0], round_constants)", "example": "SHA256RNDS2 xmm1, xmm2/m128, xmm0"}
{"mnemonic": "vmxon", "architecture": "x86", "full_name": "Enter VMX Operation", "summary": "Enters VMX root operation (Host Mode).", "syntax": "VMXON m64", "encoding": {"format": "VMX", "hex_opcode": "F3 0F C7 !(11):110:bbb", "visual_parts": [], "binary_pattern": "F3 | 0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "VMX", "operands": [{"name": "dest", "type": "m64", "desc": "64-bit memory operand (quadword)"}], "description": "Enters VMX root operation (host/hypervisor mode) using a 64-bit VMXON region pointer loaded from memory. The instruction validates the VMXON region, sets the VMXON flag in CR4, and transitions the processor to VMX root mode; failure causes #UD or sets RFLAGS.CF/ZF. This is a privileged instruction (requires CPL=0) and available only on processors with VMX support.", "pseudocode": "if (CPL != 0 || VMX_ENABLED == 0) raise #UD\nVMXON_PTR ← [m64]\nif (!validate_vmxon_region(VMXON_PTR)) { RFLAGS.CF ← 1; RFLAGS.ZF ← 0; } else { VMX_ROOT ← 1; RFLAGS.CF ← 0; RFLAGS.ZF ← 0; }", "example": "VMXON [rbp-8]"}
{"mnemonic": "vmcall", "architecture": "x86", "full_name": "Call to VM Monitor", "summary": "Guest VM calls the Hypervisor (VM Exit).", "syntax": "VMCALL", "encoding": {"format": "VMX", "hex_opcode": "0F 01 C1", "visual_parts": [], "binary_pattern": "0F | 01 | C1", "bit_positions": "+0 | +1 | +2"}, "extension": "VMX", "operands": [], "description": "Initiates a VM exit from guest mode to invoke the VM monitor (hypervisor). The instruction immediately transitions control to the hypervisor and is available only when running in VMX non-root mode; execution in root mode raises #UD. RFLAGS.CF and ZF may be set on VM exit depending on the exit reason; other flags are preserved across the transition.", "pseudocode": "if (CPL != 0 || VMX_ROOT == 1) raise #UD\nVMEXIT(VMCALL_EXIT_REASON)\nif (exit_error) { RFLAGS.CF ← 1; RFLAGS.ZF ← 1; }", "example": "VMCALL"}
{"mnemonic": "vmclear", "architecture": "x86", "full_name": "Clear Virtual-Machine Control Structure", "summary": "Initializes a VMCS region in memory.", "syntax": "VMCLEAR m64", "encoding": {"format": "VMX", "hex_opcode": "66 0F C7 /6", "visual_parts": [], "binary_pattern": "66 | 0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "VMX", "operands": [{"name": "dest", "type": "m64", "desc": "64-bit memory operand (quadword)"}], "description": "Initializes a Virtual Machine Control Structure (VMCS) region in memory by clearing its launch state and marking it as inactive. The instruction loads a 64-bit VMCS pointer from memory, validates the region, and sets CF/ZF on validation failure. This is a privileged instruction (CPL=0) requiring VMX support and must be executed in VMX root mode.", "pseudocode": "if (CPL != 0 || VMX_ROOT == 0) raise #UD\nVMCS_PTR ← [m64]\nif (!validate_vmcs_region(VMCS_PTR)) { RFLAGS.CF ← 1; RFLAGS.ZF ← 0; } else { clear_vmcs(VMCS_PTR); RFLAGS.CF ← 0; RFLAGS.ZF ← 0; }", "example": "VMCLEAR [rbp-8]"}
{"mnemonic": "vmlaunch", "architecture": "x86", "full_name": "Launch Virtual Machine", "summary": "Launches a VM managed by the current VMCS.", "syntax": "VMLAUNCH", "encoding": {"format": "VMX", "hex_opcode": "0F 01 C2", "visual_parts": [], "binary_pattern": "0F | 01 | C2", "bit_positions": "+0 | +1 | +2"}, "extension": "VMX", "operands": [], "description": "Launches a virtual machine using the current VMCS. The instruction reads guest state from the current VMCS, validates it, and transitions to VMX non-root mode; on success, control transfers to the guest; on failure, returns to the instruction with CF/ZF set. This is a privileged instruction (CPL=0) available only in VMX root mode on processors with VMX support.", "pseudocode": "if (CPL != 0 || VMX_ROOT == 0) raise #UD\nif (!validate_vmcs_state()) { RFLAGS.CF ← 1; RFLAGS.ZF ← 0; } else { load_guest_state_from_vmcs(); VMX_ROOT ← 0; transfer_control_to_guest(); }", "example": "VMLAUNCH"}
{"mnemonic": "vmresume", "architecture": "x86", "full_name": "Resume Virtual Machine", "summary": "Resumes a VM from the current VMCS.", "syntax": "VMRESUME", "encoding": {"format": "VMX", "hex_opcode": "0F 01 C3", "visual_parts": [], "binary_pattern": "0F | 01 | C3", "bit_positions": "+0 | +1 | +2"}, "extension": "VMX", "operands": [], "description": "Resumes a suspended virtual machine from the current VMCS. The instruction restores guest CPU state from the VMCS and returns control to the guest; on validation failure, CF/ZF are set and control returns to the hypervisor. This is a privileged instruction (CPL=0) available only in VMX root mode and following a prior VMLAUNCH or VM exit.", "pseudocode": "if (CPL != 0 || VMX_ROOT == 0) raise #UD\nif (!validate_vmcs_state()) { RFLAGS.CF ← 1; RFLAGS.ZF ← 0; } else { restore_guest_state_from_vmcs(); VMX_ROOT ← 0; transfer_control_to_guest(); }", "example": "VMRESUME"}
{"mnemonic": "vmptrld", "architecture": "x86", "full_name": "Load Pointer to VMCS", "summary": "Loads the current VMCS pointer from memory.", "syntax": "VMPTRLD m64", "encoding": {"format": "VMX", "hex_opcode": "NP 0F C7 /6", "visual_parts": [], "binary_pattern": "0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "VMX", "operands": [{"name": "dest", "type": "m64", "desc": "64-bit memory operand (quadword)"}], "description": "Loads a pointer to the Virtual Machine Control Structure (VMCS) from memory and sets it as the current VMCS. The instruction reads a 64-bit VMCS physical address from memory, validates the region, and sets CF/ZF on failure. This is a privileged instruction (CPL=0) requiring VMX support and execution in VMX root mode; the VMCS region must be 4KB-aligned.", "pseudocode": "if (CPL != 0 || VMX_ROOT == 0) raise #UD\nVMCS_PTR ← [m64]\nif (!validate_vmcs_region(VMCS_PTR)) { RFLAGS.CF ← 1; RFLAGS.ZF ← 0; } else { CURRENT_VMCS ← VMCS_PTR; RFLAGS.CF ← 0; RFLAGS.ZF ← 0; }", "example": "VMPTRLD [rbp-8]"}
{"mnemonic": "vmptrst", "architecture": "x86", "full_name": "Store Pointer to VMCS", "summary": "Stores the current VMCS pointer to memory.", "syntax": "VMPTRST m64", "encoding": {"format": "VMX", "hex_opcode": "NP 0F C7 /7", "visual_parts": [], "binary_pattern": "0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2"}, "extension": "VMX", "operands": [{"name": "dest", "type": "m64", "desc": "64-bit memory operand (quadword)"}], "description": "Stores the current VMCS pointer (from the VMCS pointer register) to a 64-bit memory location. This instruction is privileged and requires VMX root operation; it clears the memory destination with the active VMCS pointer value. The CF flag is set if an error occurs (invalid VMCS pointer state); ZF is set to indicate success or failure.", "pseudocode": "if (VMX_mode == ROOT && VMCS_pointer != INVALID) {\n  [dest] ← VMCS_pointer_register;\n  CF ← 0;\n  ZF ← 0;\n} else {\n  CF ← 1;\n  ZF ← 1;\n}", "example": "VMPTRST [rbp-8]"}
{"mnemonic": "vmread", "architecture": "x86", "full_name": "Read Field from VMCS", "summary": "Reads a field from the Virtual Machine Control Structure.", "syntax": "VMREAD r/m64, r64", "encoding": {"format": "VMX", "hex_opcode": "NP 0F 78", "visual_parts": [], "binary_pattern": "0F | 78", "bit_positions": "+0 | +1"}, "extension": "VMX", "operands": [{"name": "dest", "type": "r/m64", "desc": "64-bit register or memory"}, {"name": "src", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}], "description": "Reads a 64-bit field from the current VMCS (specified by the index in the source operand) and writes the value to the destination register or memory. Requires active VMCS and VMX root or non-root operation; CF is set on error, ZF indicates field validity.", "pseudocode": "if (VMCS_pointer_valid && VMX_mode_active) {\n  field_index ← src;\n  value ← VMCS[field_index];\n  dest ← value;\n  CF ← 0;\n  ZF ← 0;\n} else {\n  CF ← 1;\n  ZF ← 1;\n}", "example": "VMREAD rbx, rax"}
{"mnemonic": "vmwrite", "architecture": "x86", "full_name": "Write Field to VMCS", "summary": "Writes a field to the Virtual Machine Control Structure.", "syntax": "VMWRITE r64, r/m64", "encoding": {"format": "VMX", "hex_opcode": "NP 0F 79", "visual_parts": [], "binary_pattern": "0F | 79", "bit_positions": "+0 | +1"}, "extension": "VMX", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}, {"name": "src", "type": "r/m64", "desc": "64-bit register or memory"}], "description": "Writes a 64-bit value to a field in the current VMCS (specified by the index in the destination operand). Requires active VMCS and VMX root or non-root operation; CF is set on error, ZF indicates write success.", "pseudocode": "if (VMCS_pointer_valid && VMX_mode_active) {\n  field_index ← dest;\n  value ← src;\n  VMCS[field_index] ← value;\n  CF ← 0;\n  ZF ← 0;\n} else {\n  CF ← 1;\n  ZF ← 1;\n}", "example": "VMWRITE rax, rbx"}
{"mnemonic": "vmxoff", "architecture": "x86", "full_name": "Leave VMX Operation", "summary": "Leaves VMX root operation.", "syntax": "VMXOFF", "encoding": {"format": "VMX", "hex_opcode": "0F 01 C4", "visual_parts": [], "binary_pattern": "0F | 01 | C4", "bit_positions": "+0 | +1 | +2"}, "extension": "VMX", "operands": [], "description": "Exits VMX root operation and returns the processor to non-VMX mode. This instruction requires VMX root operation and clears the VMXE bit in CR4. CF and ZF flags are set to indicate error conditions if the operation fails; execution may be serialized.", "pseudocode": "if (VMX_root_operation) {\n  VMX_mode ← OFF;\n  CR4.VMXE ← 0;\n  CF ← 0;\n  ZF ← 0;\n} else {\n  CF ← 1;\n  ZF ← 1;\n}", "example": "VMXOFF"}
{"mnemonic": "invept", "architecture": "x86", "full_name": "Invalidate Translations Derived from EPT", "summary": "Invalidates Extended Page Table entries.", "syntax": "INVEPT r64, m128", "encoding": {"format": "VMX", "hex_opcode": "66 0F 38 80", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 80", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "VMX (EPT)", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}, {"name": "src", "type": "m128", "desc": "128-bit memory operand"}], "description": "Invalidates Extended Page Table (EPT) translation cache entries based on the invalidation type and operand descriptor. The destination register specifies the invalidation type (1=single context, 2=all contexts), and the source memory operand contains EPTP and VPID information. CF/ZF flags indicate success or error; this instruction may serialize execution.", "pseudocode": "if (EPT_enabled && VMX_mode_active) {\n  invalidation_type ← dest;\n  descriptor ← [src];\n  if (invalidation_type == 1) {\n    invalidate_EPT_context(descriptor);\n  } else if (invalidation_type == 2) {\n    invalidate_all_EPT();\n  }\n  CF ← 0;\n  ZF ← 0;\n} else {\n  CF ← 1;\n  ZF ← 1;\n}", "example": "INVEPT rax, [rbp-16]"}
{"mnemonic": "invvpid", "architecture": "x86", "full_name": "Invalidate Translations Based on VPID", "summary": "Invalidates TLB entries based on Virtual Processor ID.", "syntax": "INVVPID r64, m128", "encoding": {"format": "VMX", "hex_opcode": "66 0F 38 81", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 81", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "VMX (VPID)", "operands": [{"name": "dest", "type": "r64", "desc": "64-bit general-purpose register (e.g. RAX)"}, {"name": "src", "type": "m128", "desc": "128-bit memory operand"}], "description": "Invalidates TLB entries based on Virtual Processor ID (VPID). The destination register specifies the invalidation type (1=individual address, 2=single VPID context, 3=all VPID contexts, 4=individual address keeping globals), and the source memory operand contains VPID and address information. CF/ZF flags indicate success or error; this instruction serializes execution.", "pseudocode": "if (VPID_enabled && VMX_mode_active) {\n  invalidation_type ← dest;\n  descriptor ← [src];\n  if (invalidation_type == 1) {\n    invalidate_TLB_address(descriptor);\n  } else if (invalidation_type == 2) {\n    invalidate_TLB_VPID(descriptor);\n  } else if (invalidation_type == 3) {\n    invalidate_all_TLB();\n  } else if (invalidation_type == 4) {\n    invalidate_TLB_address_keep_global(descriptor);\n  }\n  CF ← 0;\n  ZF ← 0;\n} else {\n  CF ← 1;\n  ZF ← 1;\n}", "example": "INVVPID rax, [rbp-16]"}
{"mnemonic": "kmovw", "architecture": "x86", "full_name": "Move Word Mask Register", "summary": "Moves 16-bit mask to/from k-register.", "syntax": "KMOVW k1, k2/m16", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.0F.W0 90 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 90", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2/m16", "desc": "AVX-512 opmask register (k0-k7) or Memory operand"}], "description": "Moves a 16-bit value between AVX-512 opmask registers (k0-k7) or from/to a 16-bit memory location. When moving from register/memory to k-register, the upper bits beyond 16 are zeroed. ZF is set based on source value; CF is typically cleared unless an error occurs.", "pseudocode": "if (source_is_register) {\n  dest_k ← src_k & 0xFFFF;\n} else {\n  dest_k ← [src] & 0xFFFF;\n}\nZF ← (dest_k == 0);\nCF ← 0;", "example": "KMOVW k1, k2/m16"}
{"mnemonic": "kmovq", "architecture": "x86", "full_name": "Move Quadword Mask Register", "summary": "Moves 64-bit mask to/from k-register.", "syntax": "KMOVQ k1, k2/m64", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.0F.W1 90 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 90", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512BW", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2/m64", "desc": "AVX-512 opmask register (k0-k7) or Memory operand"}], "description": "Moves a 64-bit value between AVX-512 opmask registers (k0-k7) or from/to a 64-bit memory location. Requires AVX-512BW support; destination k-register receives the full 64-bit mask. ZF is set based on source value; CF is typically cleared unless an error occurs.", "pseudocode": "if (source_is_register) {\n  dest_k ← src_k;\n} else {\n  dest_k ← [src];\n}\nZF ← (dest_k == 0);\nCF ← 0;", "example": "KMOVQ k1, k2/m64"}
{"mnemonic": "kandw", "architecture": "x86", "full_name": "Bitwise Logical AND Masks Word", "summary": "Bitwise AND of 16-bit masks.", "syntax": "KANDW k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.0F.W0 41 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 41", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise AND operation on two 16-bit AVX-512 opmask registers and stores the result in a third opmask register. This is a mask-only operation that does not affect EFLAGS. The instruction operates on the lower 16 bits of the k registers; bits above 16 are zeroed in the destination.", "pseudocode": "k1[15:0] ← k2[15:0] & k3[15:0]; k1[63:16] ← 0;", "example": "KANDW k1, k2, k3"}
{"mnemonic": "kandnw", "architecture": "x86", "full_name": "Bitwise Logical AND NOT Masks Word", "summary": "Bitwise AND NOT of 16-bit masks.", "syntax": "KANDNW k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.0F.W0 42 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 42", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise AND NOT operation (NOT src1 AND src2) on two 16-bit AVX-512 opmask registers and stores the result in a third opmask register. This is a mask-only operation that does not affect EFLAGS. Bits above 16 in the destination are zeroed.", "pseudocode": "k1[15:0] ← (~k2[15:0]) & k3[15:0]; k1[63:16] ← 0;", "example": "KANDNW k1, k2, k3"}
{"mnemonic": "korw", "architecture": "x86", "full_name": "Bitwise Logical OR Masks Word", "summary": "Bitwise OR of 16-bit masks.", "syntax": "KORW k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.0F.W0 45 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 45", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise OR operation on two 16-bit AVX-512 opmask registers and stores the result in a third opmask register. This is a mask-only operation that does not affect EFLAGS. Bits above 16 in the destination are zeroed.", "pseudocode": "k1[15:0] ← k2[15:0] | k3[15:0]; k1[63:16] ← 0;", "example": "KORW k1, k2, k3"}
{"mnemonic": "kxorw", "architecture": "x86", "full_name": "Bitwise Logical XOR Masks Word", "summary": "Bitwise XOR of 16-bit masks.", "syntax": "KXORW k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.0F.W0 47 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 47", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src1", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src2", "type": "k3", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise XOR operation on two 16-bit AVX-512 opmask registers and stores the result in a third opmask register. This is a mask-only operation that does not affect EFLAGS. Bits above 16 in the destination are zeroed.", "pseudocode": "k1[15:0] ← k2[15:0] ^ k3[15:0]; k1[63:16] ← 0;", "example": "KXORW k1, k2, k3"}
{"mnemonic": "knotw", "architecture": "x86", "full_name": "Bitwise Logical NOT Masks Word", "summary": "Bitwise NOT of 16-bit mask.", "syntax": "KNOTW k1, k2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.0F.W0 44 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 44", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise NOT operation on a 16-bit AVX-512 opmask register and stores the result in another opmask register. This is a mask-only operation that does not affect EFLAGS. Bits above 16 in the destination are zeroed.", "pseudocode": "k1[15:0] ← ~k2[15:0]; k1[63:16] ← 0;", "example": "KNOTW k1, k2"}
{"mnemonic": "kortestw", "architecture": "x86", "full_name": "OR Masks And Set Flags Word", "summary": "ORs two masks and sets EFLAGS (ZF, CF) based on result.", "syntax": "KORTESTW k1, k2", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L0.0F.W0 98 /r", "visual_parts": [], "binary_pattern": "EVEX | 0F | 98", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512", "operands": [{"name": "dest", "type": "k1", "desc": "AVX-512 opmask register (k0-k7)"}, {"name": "src", "type": "k2", "desc": "AVX-512 opmask register (k0-k7)"}], "description": "Performs a bitwise OR of two 16-bit AVX-512 opmask registers and sets EFLAGS based on the result. Sets ZF if the result is zero, CF if the result is 0xFFFF (all ones in the 16-bit field), and clears OF and SF. This instruction is typically used for predication and loop control in AVX-512 code.", "pseudocode": "temp ← k1[15:0] | k2[15:0]; ZF ← (temp == 0); CF ← (temp == 0xFFFF); OF ← 0; SF ← 0;", "example": "KORTESTW k1, k2"}
{"mnemonic": "vpternlogd", "architecture": "x86", "full_name": "Packed Doubleword Ternary Logic", "summary": "Performs one of 256 logical operations on 3 inputs.", "syntax": "VPTERNLOGD zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 25 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 25", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs one of 256 possible three-input Boolean logical operations on 512-bit packed doublewords. The immediate operand selects which Boolean function to apply; supports opmask-controlled execution and writes to ZMM registers. No EFLAGS are affected; the instruction is fully predicated by {k1} if specified.", "pseudocode": "for i ← 0 to 15 do if k1[i] or k1 is not specified then zmm1[32*i+31:32*i] ← LUT256[imm8][zmm2[32*i+31:32*i], zmm3[32*i+31:32*i], zmm1[32*i+31:32*i]];", "example": "VPTERNLOGD zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpternlogq", "architecture": "x86", "full_name": "Packed Quadword Ternary Logic", "summary": "Performs one of 256 logical operations on 3 quadwords.", "syntax": "VPTERNLOGQ zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 25 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 25", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs one of 256 possible three-input Boolean logical operations on 512-bit packed quadwords. The immediate operand selects which Boolean function to apply; supports opmask-controlled execution and writes to ZMM registers. No EFLAGS are affected; the instruction is fully predicated by {k1} if specified.", "pseudocode": "for i ← 0 to 7 do if k1[i] or k1 is not specified then zmm1[64*i+63:64*i] ← LUT256[imm8][zmm2[64*i+63:64*i], zmm3[64*i+63:64*i], zmm1[64*i+63:64*i]];", "example": "VPTERNLOGQ zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vcompresspd", "architecture": "x86", "full_name": "Store Sparse Packed Double-Precision Floating-Point Values", "summary": "Compresses active elements from ZMM to memory.", "syntax": "VCOMPRESSPD m512 {k1}, zmm1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 8A /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 8A", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "m512", "desc": "512-bit memory operand"}, {"name": "src", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}], "description": "Stores active (mask-enabled) 64-bit double-precision floating-point elements from a ZMM register to memory in compressed form, where only the elements selected by the opmask k1 are written consecutively to the destination address. No flags are modified. Requires AVX-512F; operates on 512-bit ZMM registers and writes up to 512 bits of memory depending on mask population.", "pseudocode": "count ← 0\nfor i in 0 to 7:\n  if k1[i] == 1:\n    [dest + count * 8] ← ZMM2[i*64 : (i+1)*64]\n    count ← count + 1", "example": "VCOMPRESSPD [rbp-64], zmm1"}
{"mnemonic": "vcompressps", "architecture": "x86", "full_name": "Store Sparse Packed Single-Precision Floating-Point Values", "summary": "Compresses active elements from ZMM to memory.", "syntax": "VCOMPRESSPS m512 {k1}, zmm1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 8A /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 8A", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "m512", "desc": "512-bit memory operand"}, {"name": "src", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}], "description": "Stores active (mask-enabled) 32-bit single-precision floating-point elements from a ZMM register to memory in compressed form, where only the elements selected by the opmask k1 are written consecutively to the destination address. No flags are modified. Requires AVX-512F; operates on 512-bit ZMM registers and writes up to 512 bits of memory depending on mask population.", "pseudocode": "count ← 0\nfor i in 0 to 15:\n  if k1[i] == 1:\n    [dest + count * 4] ← ZMM2[i*32 : (i+1)*32]\n    count ← count + 1", "example": "VCOMPRESSPS [rbp-64], zmm1"}
{"mnemonic": "vexpandpd", "architecture": "x86", "full_name": "Load Sparse Packed Double-Precision Floating-Point Values", "summary": "Expands data from memory into sparse locations in ZMM.", "syntax": "VEXPANDPD zmm1 {k1}, m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 88 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 88", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "m512", "desc": "512-bit memory operand"}], "description": "Loads 64-bit double-precision floating-point elements from memory into a ZMM register at positions selected by the opmask k1, leaving masked-out positions unchanged if zeroing is not enabled. No flags are modified. Requires AVX-512F; reads from memory and expands sparse data into the 512-bit destination register.", "pseudocode": "count ← 0\nfor i in 0 to 7:\n  if k1[i] == 1:\n    ZMM1[i*64 : (i+1)*64] ← [src + count * 8]\n    count ← count + 1\n  else if k1[i] == 0 and zeroing == false:\n    ZMM1[i*64 : (i+1)*64] ← ZMM1[i*64 : (i+1)*64]", "example": "VEXPANDPD zmm1, [rbp-64]"}
{"mnemonic": "vexpandps", "architecture": "x86", "full_name": "Load Sparse Packed Single-Precision Floating-Point Values", "summary": "Expands data from memory into sparse locations in ZMM.", "syntax": "VEXPANDPS zmm1 {k1}, m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 88 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 88", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "m512", "desc": "512-bit memory operand"}], "description": "Loads 32-bit single-precision floating-point elements from memory into a ZMM register at positions selected by the opmask k1, leaving masked-out positions unchanged if zeroing is not enabled. No flags are modified. Requires AVX-512F; reads from memory and expands sparse data into the 512-bit destination register.", "pseudocode": "count ← 0\nfor i in 0 to 15:\n  if k1[i] == 1:\n    ZMM1[i*32 : (i+1)*32] ← [src + count * 4]\n    count ← count + 1\n  else if k1[i] == 0 and zeroing == false:\n    ZMM1[i*32 : (i+1)*32] ← ZMM1[i*32 : (i+1)*32]", "example": "VEXPANDPS zmm1, [rbp-64]"}
{"mnemonic": "vpermi2d", "architecture": "x86", "full_name": "Permute Two-Source Doublewords", "summary": "Shuffles doublewords from two ZMM registers into destination.", "syntax": "VPERMI2D zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 76 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 76", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Permutes 32-bit doublewords from two source operands (zmm2 and zmm3/m512) using indices in zmm1 to produce a shuffled result in zmm1, where each 5-bit index selects one of 16 elements from each source. No flags are modified. Requires AVX-512F; results follow opmask k1 zeroing behavior. The index operand zmm1 is overwritten with the permuted result.", "pseudocode": "temp ← 0\nfor i in 0 to 15:\n  if k1[i] == 1:\n    idx ← ZMM1[i*32+4:i*32] & 0x1F\n    if idx < 16:\n      temp[i*32 : (i+1)*32] ← ZMM2[idx*32 : (idx+1)*32]\n    else:\n      temp[i*32 : (i+1)*32] ← ZMM3/M512[(idx-16)*32 : (idx-15)*32]\n  else if zeroing == true:\n    temp[i*32 : (i+1)*32] ← 0\n  else:\n    temp[i*32 : (i+1)*32] ← ZMM1[i*32 : (i+1)*32]\nZMM1 ← temp", "example": "VPERMI2D zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpermt2d", "architecture": "x86", "full_name": "Permute Two-Source Doublewords (Overwrite)", "summary": "Shuffles 2 sources, overwriting the index register.", "syntax": "VPERMT2D zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 7E /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 7F", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Permutes 32-bit doublewords from two source operands (zmm2 and zmm3/m512) using indices in zmm1 to produce a shuffled result in zmm1, where each 5-bit index selects one of 16 elements from each source. No flags are modified. Requires AVX-512F; the index register zmm1 is overwritten with the permutation result and follows opmask k1 zeroing behavior.", "pseudocode": "temp ← 0\nfor i in 0 to 15:\n  if k1[i] == 1:\n    idx ← ZMM1[i*32+4:i*32] & 0x1F\n    if idx < 16:\n      temp[i*32 : (i+1)*32] ← ZMM2[idx*32 : (idx+1)*32]\n    else:\n      temp[i*32 : (i+1)*32] ← ZMM3/M512[(idx-16)*32 : (idx-15)*32]\n  else if zeroing == true:\n    temp[i*32 : (i+1)*32] ← 0\n  else:\n    temp[i*32 : (i+1)*32] ← ZMM1[i*32 : (i+1)*32]\nZMM1 ← temp", "example": "VPERMT2D zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vshuff32x4", "architecture": "x86", "full_name": "Shuffle Packed Float32x4", "summary": "Shuffles 128-bit blocks of single-precision floats.", "syntax": "VSHUFF32X4 zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.256.66.0F3A.W0 23 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 23", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shuffles 128-bit blocks (each containing four 32-bit floats) from two ZMM sources according to an 8-bit immediate control, writing the result to the destination ZMM register. No flags are modified. Requires AVX-512F; the immediate selects which 128-bit quadwords are interleaved from the two sources. Opmask k1 controls which result elements are written.", "pseudocode": "temp ← 0\nfor i in 0 to 3:\n  sel1 ← (imm8 >> (i*2)) & 0x3\n  sel2 ← (imm8 >> (4 + i*2)) & 0x3\n  temp[i*128 : (i+1)*128] ← ZMM2[sel1*128 : (sel1+1)*128]\n  temp[(i+4)*128 : (i+5)*128] ← ZMM3/M512[sel2*128 : (sel2+1)*128]\nfor i in 0 to 15:\n  if k1[i] == 1:\n    ZMM1[i*32 : (i+1)*32] ← temp[i*32 : (i+1)*32]\n  else if zeroing == true:\n    ZMM1[i*32 : (i+1)*32] ← 0", "example": "VSHUFF32X4 zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpmovdb", "architecture": "x86", "full_name": "Truncate Doubleword to Byte", "summary": "Down-converts 32-bit integers to 8-bit.", "syntax": "VPMOVDB xmm1/m128 {k1}, zmm2", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F38.W0 31 /r", "visual_parts": [], "binary_pattern": "EVEX | F3 | 0F | 38 | 31", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "xmm1/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}], "description": "Truncates 16 32-bit doubleword integers from a ZMM register down to 8-bit bytes, writing the 16 resulting bytes to an XMM register or 128-bit memory location. No flags are modified. Requires AVX-512F; the conversion is a simple truncation (low 8 bits extracted). Opmask k1 controls which byte results are written.", "pseudocode": "temp ← 0\nfor i in 0 to 15:\n  if k1[i] == 1:\n    temp[i*8 : (i+1)*8] ← ZMM2[i*32 : i*32+8]\n  else if zeroing == true:\n    temp[i*8 : (i+1)*8] ← 0\n  else:\n    temp[i*8 : (i+1)*8] ← temp[i*8 : (i+1)*8]\ndest[0 : 128] ← temp[0 : 128]", "example": "VPMOVDB xmm1/m128, zmm2"}
{"mnemonic": "vpmovusdb", "architecture": "x86", "full_name": "Saturate Unsigned Doubleword to Byte", "summary": "Down-converts 32-bit to 8-bit with unsigned saturation.", "syntax": "VPMOVUSDB xmm1/m128 {k1}, zmm2", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F38.W0 11 /r", "visual_parts": [], "binary_pattern": "EVEX | F3 | 0F | 38 | 11", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "xmm1/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}], "description": "Converts 16 packed 32-bit unsigned integers from a ZMM register to 16 packed 8-bit unsigned integers in an XMM register or memory, saturating values that exceed 255 to 255. The operation is element-wise; each 32-bit source value is independently clamped to the range [0, 255] and stored as an 8-bit result. Operates in 64-bit mode only and respects EVEX writemask {k1} for conditional element updates.", "pseudocode": "for i = 0 to 15:\n  src_val = zmm2[i*32 + 31 : i*32]\n  if src_val > 255:\n    result[i*8 + 7 : i*8] = 255\n  else:\n    result[i*8 + 7 : i*8] = src_val[7:0]\nif k1_mask[i] == 1:\n  dest[i*8 + 7 : i*8] = result[i*8 + 7 : i*8]\nelse if {z} == 1:\n  dest[i*8 + 7 : i*8] = 0", "example": "VPMOVUSDB xmm1/m128, zmm2"}
{"mnemonic": "vrndscalepd", "architecture": "x86", "full_name": "Round Packed Double-Precision Floating-Point with Scale", "summary": "Rounds doubles to integer values using imm8 control.", "syntax": "VRNDSCALEPD zmm1 {k1}, zmm2/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 09 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 09", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rounds 8 packed 64-bit floating-point values to integer values using rounding control specified in imm8 (bits 3:0 select round-to-nearest-even, round-down, round-up, or round-toward-zero; bits 5:4 control sign, bits 7:6 control exception behavior). Destination is written with the scaled and rounded results. The instruction may set or clear floating-point exception flags (ZF, CF, OF, SF, PF) depending on the rounding results and imm8 exception control.", "pseudocode": "for i = 0 to 7:\n  src_val = zmm2/m512[i*64 + 63 : i*64]\n  round_mode = imm8[3:0]\n  scaled_val = 2^(-(imm8[5:4])) * src_val\n  rounded = RoundToIntegerFP(scaled_val, round_mode)\n  result[i*64 + 63 : i*64] = rounded\n  if (imm8[6] == 0 and FP_exception_raised):\n    set_FP_exception_flags()\nif k1_mask[i] == 1:\n  zmm1[i*64 + 63 : i*64] = result[i*64 + 63 : i*64]\nelse if {z} == 1:\n  zmm1[i*64 + 63 : i*64] = 0", "example": "VRNDSCALEPD zmm1, zmm2/m512, 3"}
{"mnemonic": "vfixupimmpd", "architecture": "x86", "full_name": "Fix Up Special Packed Float64 Values", "summary": "Fixes special cases (NaN, Inf) using a table.", "syntax": "VFIXUPIMMPD zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 54 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 54", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Fixes up special floating-point cases (NaN, Infinity, denormalized) in 8 packed 64-bit values using a lookup table indexed by imm8 and the class/sign of each element. For each source element, the instruction examines the exceptional condition bits and uses imm8 to select a fixup value or pass-through behavior. The result is placed in the destination; may set floating-point exception flags (ZF, CF, OF, SF, PF) if exceptions are not suppressed.", "pseudocode": "for i = 0 to 7:\n  src1_val = zmm2[i*64 + 63 : i*64]\n  src2_val = zmm3/m512[i*64 + 63 : i*64]\n  class_bits = ClassifyFP64(src1_val)\n  index = (imm8[1:0] << 2) | class_bits[1:0]\n  lookup_result = FIXUP_TABLE[index]\n  if lookup_result == PASS_THROUGH:\n    result[i*64 + 63 : i*64] = src1_val\n  else if lookup_result == USE_SRC2:\n    result[i*64 + 63 : i*64] = src2_val\n  else:\n    result[i*64 + 63 : i*64] = lookup_result\n  if (imm8[3:2] != 11 and exception_condition):\n    set_FP_exception_flags()\nif k1_mask[i] == 1:\n  zmm1[i*64 + 63 : i*64] = result[i*64 + 63 : i*64]\nelse if {z} == 1:\n  zmm1[i*64 + 63 : i*64] = 0", "example": "VFIXUPIMMPD zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vgetmantpd", "architecture": "x86", "full_name": "Get Mantissa Packed Double-Precision", "summary": "Extracts mantissas from doubles.", "syntax": "VGETMANTPD zmm1 {k1}, zmm2/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 26 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 26", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Extracts the mantissa (significand) from 8 packed 64-bit floating-point values and returns them as normalized floating-point results. The imm8 parameter controls which portion of the mantissa is returned (e.g., ±[1.0, 2.0), ±[0.5, 1.0), etc.) and the rounding mode for the mantissa extraction. Denormalized inputs and exceptional cases may be handled according to imm8 bits; floating-point exception flags may be set depending on exception handling mode.", "pseudocode": "for i = 0 to 7:\n  src_val = zmm2/m512[i*64 + 63 : i*64]\n  mantissa_mode = imm8[1:0]\n  round_mode = imm8[3:2]\n  suppress_exceptions = imm8[4]\n  mantissa = ExtractMantissa(src_val, mantissa_mode)\n  rounded_mantissa = RoundMantissa(mantissa, round_mode)\n  result[i*64 + 63 : i*64] = rounded_mantissa\n  if (suppress_exceptions == 0 and exception_condition):\n    set_FP_exception_flags()\nif k1_mask[i] == 1:\n  zmm1[i*64 + 63 : i*64] = result[i*64 + 63 : i*64]\nelse if {z} == 1:\n  zmm1[i*64 + 63 : i*64] = 0", "example": "VGETMANTPD zmm1, zmm2/m512, 3"}
{"mnemonic": "vgetexppd", "architecture": "x86", "full_name": "Get Exponent Packed Double-Precision", "summary": "Extracts exponents from doubles as float values.", "syntax": "VGETEXPPD zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 42 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 42", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Extracts the exponent from 8 packed 64-bit floating-point values and returns each exponent as a 64-bit floating-point value (i.e., the unbiased exponent is converted to a double-precision floating-point number). Special cases such as zero, denormalized, infinite, and NaN inputs follow IEEE 754 semantics; floating-point exception flags (ZF, CF, OF, SF, PF) may be set depending on the nature of the inputs and masking.", "pseudocode": "for i = 0 to 7:\n  src_val = zmm2/m512[i*64 + 63 : i*64]\n  if is_zero(src_val):\n    result[i*64 + 63 : i*64] = -INF\n  else if is_denormal(src_val):\n    exp_val = MIN_EXPONENT\n    result[i*64 + 63 : i*64] = ConvertToFP64(exp_val)\n  else if is_infinity(src_val):\n    result[i*64 + 63 : i*64] = +INF\n  else if is_nan(src_val):\n    result[i*64 + 63 : i*64] = NaN\n  else:\n    unbiased_exp = ExtractExponent(src_val) - BIAS\n    result[i*64 + 63 : i*64] = ConvertToFP64(unbiased_exp)\nif k1_mask[i] == 1:\n  zmm1[i*64 + 63 : i*64] = result[i*64 + 63 : i*64]\nelse if {z} == 1:\n  zmm1[i*64 + 63 : i*64] = 0", "example": "VGETEXPPD zmm1, zmm2/m512"}
{"mnemonic": "vscalefpd", "architecture": "x86", "full_name": "Scale Packed Float64 Values with Float64 Exponents", "summary": "Scales doubles by exponents (x * 2^n).", "syntax": "VSCALEFPD zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 2C /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 2C", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Scales 8 packed 64-bit floating-point values by raising 2 to the power of the corresponding exponent value (dst = src1 * 2^src2) using floating-point exponentiation. Each element of src2 is treated as an integer exponent; the result is computed with full floating-point precision. The instruction may set or clear floating-point exception flags (ZF, CF, OF, SF, PF) based on overflow, underflow, or other exceptional conditions.", "pseudocode": "for i = 0 to 7:\n  mantissa = zmm2[i*64 + 63 : i*64]\n  exponent = zmm3/m512[i*64 + 63 : i*64]\n  exp_int = ConvertToInt(exponent)\n  if exp_int > MAX_EXP:\n    result[i*64 + 63 : i*64] = INF (sign from mantissa)\n    set_FP_exception_flag(OVERFLOW)\n  else if exp_int < MIN_EXP:\n    result[i*64 + 63 : i*64] = 0.0 (sign from mantissa)\n    set_FP_exception_flag(UNDERFLOW)\n  else:\n    scaled = mantissa * (2.0 ^ exp_int)\n    result[i*64 + 63 : i*64] = scaled\nif k1_mask[i] == 1:\n  zmm1[i*64 + 63 : i*64] = result[i*64 + 63 : i*64]\nelse if {z} == 1:\n  zmm1[i*64 + 63 : i*64] = 0", "example": "VSCALEFPD zmm1, zmm2, zmm3/m512"}
{"mnemonic": "valignd", "architecture": "x86", "full_name": "Align Doubleword Vectors", "summary": "Extracts 512-bits from two concatenated ZMMs shifted by count.", "syntax": "VALIGND zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W0 03 /r ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 03", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Extracts 512 bits from the concatenation of two ZMM registers (src2 || src1), where src2 is the high part, shifted right by imm8 * 32 bits, and writes the result to dest. This acts as a multi-element rotate-right or barrel-shift operation on the combined 1024-bit value. All 16 packed 32-bit doubleword elements shift by the same amount; elements that shift out are discarded, and zero-fill enters from the left. Operates only in 64-bit mode.", "pseudocode": "shift_amount = imm8 * 32\ntemp_concat = (zmm2[511:0] << 512) | zmm1[511:0]\nresult = temp_concat >> shift_amount\nfor i = 0 to 15:\n  result_dword[i] = result[(i+1)*32 - 1 : i*32]\nif k1_mask[i] == 1:\n  zmm1[i*32 + 31 : i*32] = result_dword[i]\nelse if {z} == 1:\n  zmm1[i*32 + 31 : i*32] = 0", "example": "VALIGND zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpconflictd", "architecture": "x86", "full_name": "Detect Conflicts Within a Vector of Packed Dword Values", "summary": "Detects duplicate values in a vector (Conflict Detection).", "syntax": "VPCONFLICTD zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 C4 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | C4", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512CD", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Detects conflicting (duplicate) values within a vector of 16 packed 32-bit unsigned integers and writes a conflict mask to the destination. For each element, the instruction generates a 32-bit mask where bit j is set to 1 if the element at position i equals the element at position j (where j > i). This enables efficient identification of duplicate elements within a single vector. Operates only in 64-bit mode; no arithmetic flags are modified.", "pseudocode": "for i = 0 to 15:\n  conflict_mask = 0\n  for j = i + 1 to 15:\n    if zmm2/m512[i*32 + 31 : i*32] == zmm2/m512[j*32 + 31 : j*32]:\n      conflict_mask |= (1 << j)\n  result[i*32 + 31 : i*32] = conflict_mask\nif k1_mask[i] == 1:\n  zmm1[i*32 + 31 : i*32] = result[i*32 + 31 : i*32]\nelse if {z} == 1:\n  zmm1[i*32 + 31 : i*32] = 0", "example": "VPCONFLICTD zmm1, zmm2/m512"}
{"mnemonic": "vplzcntd", "architecture": "x86", "full_name": "Count Leading Zero Bits", "summary": "Counts leading zeros for each doubleword element.", "syntax": "VPLZCNTD zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 44 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 44", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512CD", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Counts the number of leading zero bits in each 32-bit doubleword element of the source operand and writes the count to the corresponding doubleword in the destination. Operates on 512-bit vectors under EVEX encoding with optional write-mask (k1) and zeroing. No EFLAGS are affected by this instruction.", "pseudocode": "for i = 0 to 15 do\n  src_val = zmm2[i*32 : (i+1)*32-1]\n  count = 0\n  for j = 31 downto 0 do\n    if src_val[j] == 1 then break\n    count++\n  zmm1[i*32 : (i+1)*32-1] = count\nend for", "example": "VPLZCNTD zmm1, zmm2/m512"}
{"mnemonic": "vcvtudq2ps", "architecture": "x86", "full_name": "Convert Packed Unsigned Doubleword Integers to Packed Single-Precision Floating-Point", "summary": "Converts unsigned int32 to float.", "syntax": "VCVTUDQ2PS zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F2.0F.W0 7A /r", "visual_parts": [], "binary_pattern": "EVEX | F2 | 0F | 5B", "bit_positions": "+0 | +4 | +5 | +6"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Converts each 32-bit unsigned integer in the source to a single-precision floating-point value and stores the result in the destination. Operates on 512-bit vectors under EVEX encoding with optional write-mask (k1) and rounding control. No EFLAGS are affected; rounding follows MXCSR or embedded rounding mode.", "pseudocode": "for i = 0 to 15 do\n  src_val = zmm2[i*32 : (i+1)*32-1]\n  zmm1[i*32 : (i+1)*32-1] = convert_uint32_to_float32(src_val, rounding_mode)\nend for", "example": "VCVTUDQ2PS zmm1, zmm2/m512"}
{"mnemonic": "vprolvd", "architecture": "x86", "full_name": "Rotate Left Doubleword Variable", "summary": "Rotates doublewords left by amounts in second vector.", "syntax": "VPROLVD zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 15 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 15", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512F", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Rotates each 32-bit element in the first source left by the amount specified in the corresponding 32-bit element of the second source, storing results in the destination. Operates on 512-bit vectors under EVEX encoding with optional write-mask (k1). The rotation amount is taken modulo 32. No EFLAGS are affected.", "pseudocode": "for i = 0 to 15 do\n  value = zmm2[i*32 : (i+1)*32-1]\n  shift = zmm3[i*32 : (i+1)*32-1] & 0x1F\n  zmm1[i*32 : (i+1)*32-1] = (value << shift) | (value >> (32 - shift))\nend for", "example": "VPROLVD zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpopcntd", "architecture": "x86", "full_name": "Packed Population Count Doubleword", "summary": "Counts set bits in each doubleword element.", "syntax": "VPOPCNTD zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 55 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 55", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VPOPCNTDQ", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Counts the number of set bits (1s) in each 32-bit doubleword element of the source operand and writes the population count to the corresponding doubleword in the destination. Operates on 512-bit vectors under EVEX encoding with optional write-mask (k1) and zeroing. No EFLAGS are affected.", "pseudocode": "for i = 0 to 15 do\n  src_val = zmm2[i*32 : (i+1)*32-1]\n  count = 0\n  for j = 0 to 31 do\n    if src_val[j] == 1 then count++\n  zmm1[i*32 : (i+1)*32-1] = count\nend for", "example": "VPOPCNTD zmm1, zmm2/m512"}
{"mnemonic": "encls", "architecture": "x86", "full_name": "Execute Enclave Supervisor Leaf", "summary": "Executes an SGX supervisor function specified by EAX.", "syntax": "ENCLS", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 01 CF", "visual_parts": [], "binary_pattern": "0F | 01 | CF", "bit_positions": "+0 | +1 | +2"}, "extension": "SGX", "operands": [], "description": "Executes an SGX supervisor enclave leaf function specified by a leaf number in EAX. The instruction serializes the CPU pipeline and transitions from non-root mode to root mode for executing privileged enclave operations. The actual operation depends on the leaf function code; CF flag may be set on error conditions, and various other registers may be modified based on the leaf function.", "pseudocode": "leaf_function = EAX\nif (leaf_function == EBLOCK) then\n  // Block enclave\nelseif (leaf_function == ETRACK) then\n  // Flush TLB\nelseif (leaf_function == EWBLOCK) then\n  // Write block enclave\nelse\n  // Execute other supervisor leaf functions\nend if", "example": "ENCLS"}
{"mnemonic": "enclu", "architecture": "x86", "full_name": "Execute Enclave User Leaf", "summary": "Executes an SGX user function specified by EAX.", "syntax": "ENCLU", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F 01 D7", "visual_parts": [], "binary_pattern": "0F | 01 | D7", "bit_positions": "+0 | +1 | +2"}, "extension": "SGX", "operands": [], "description": "Executes an SGX user enclave leaf function specified by a leaf number in EAX. The instruction serializes the CPU pipeline and may transition between user and enclave execution modes depending on the leaf function. The actual operation depends on the leaf function code; various registers and flags may be modified based on the requested operation.", "pseudocode": "leaf_function = EAX\nif (leaf_function == EREPORT) then\n  // Generate enclave report\nelseif (leaf_function == EGETKEY) then\n  // Get sealing/reporting key\nelseif (leaf_function == EEXIT) then\n  // Exit enclave\nelseif (leaf_function == EENTER) then\n  // Enter enclave\nelse\n  // Execute other user leaf functions\nend if", "example": "ENCLU"}
{"mnemonic": "extrq", "architecture": "x86", "full_name": "Extract Field from Register", "summary": "Extracts bit field from register (AMD SSE4a).", "syntax": "EXTRQ xmm1, xmm2", "encoding": {"format": "SSE4a", "hex_opcode": "66 0F 79 /r", "visual_parts": [], "binary_pattern": "66 | 0F | 79 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4a", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2", "desc": "128-bit XMM SIMD register"}], "description": "Extracts a bit field from the 128-bit xmm1 register using the field length and field position specified in xmm2 bits [13:8] and [5:0] respectively. The extracted field is zero-extended and placed in xmm1; bits not part of the extracted field are zeroed. No EFLAGS are affected; this is an AMD SSE4a extension instruction.", "pseudocode": "field_length = xmm2[13:8]\nfield_pos = xmm2[5:0]\nif (field_length == 0) then\n  field_length = 64\nend if\nmask = ((1 << field_length) - 1)\nextracted = (xmm1 >> field_pos) & mask\nxmm1 = extracted", "example": "EXTRQ xmm1, xmm2"}
{"mnemonic": "insertq", "architecture": "x86", "full_name": "Insert Field to Register", "summary": "Inserts bit field into register (AMD SSE4a).", "syntax": "INSERTQ xmm1, xmm2", "encoding": {"format": "SSE4a", "hex_opcode": "F2 0F 79 /r", "visual_parts": [], "binary_pattern": "66 | 0F | 79 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "SSE4a", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2", "desc": "128-bit XMM SIMD register"}], "description": "Inserts a bit field from xmm2 into xmm1 at the position and length specified in xmm2 bits [13:8] and [5:0] respectively. The field from xmm2 is placed into xmm1 starting at the specified bit position; the rest of xmm1 remains unchanged. No EFLAGS are affected; this is an AMD SSE4a extension instruction.", "pseudocode": "field_length = xmm2[13:8]\nfield_pos = xmm2[5:0]\nif (field_length == 0) then\n  field_length = 64\nend if\nmask = ((1 << field_length) - 1)\ninsert_value = xmm2 & mask\nxmm1 = (xmm1 & ~(mask << field_pos)) | (insert_value << field_pos)", "example": "INSERTQ xmm1, xmm2"}
{"mnemonic": "movntss", "architecture": "x86", "full_name": "Move Non-Temporal Scalar Single", "summary": "Stores scalar float bypassing cache (AMD SSE4a).", "syntax": "MOVNTSS m32, xmm1", "encoding": {"format": "SSE4a", "hex_opcode": "F3 0F 2B /r", "visual_parts": [], "binary_pattern": "F3 | 0F | 2B", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE4a", "operands": [{"name": "dest", "type": "m32", "desc": "32-bit memory operand"}, {"name": "src", "type": "xmm1", "desc": "128-bit XMM SIMD register"}], "description": "Stores the low 32-bit scalar single-precision floating-point value from an XMM register to a 32-bit memory location, bypassing the cache hierarchy using non-temporal semantics. The instruction issues a weakly-ordered write that avoids polluting the L1/L2 caches, useful for streaming writes. No arithmetic flags are affected; this is a memory store only.", "pseudocode": "[dest] ← src[31:0];", "example": "MOVNTSS [rbp-4], xmm1"}
{"mnemonic": "movntsd", "architecture": "x86", "full_name": "Move Non-Temporal Scalar Double", "summary": "Stores scalar double bypassing cache (AMD SSE4a).", "syntax": "MOVNTSD m64, xmm1", "encoding": {"format": "SSE4a", "hex_opcode": "F2 0F 2B /r", "visual_parts": [], "binary_pattern": "F2 | 0F | 2B", "bit_positions": "+0 | +1 | +2"}, "extension": "SSE4a", "operands": [{"name": "dest", "type": "m64", "desc": "64-bit memory operand (quadword)"}, {"name": "src", "type": "xmm1", "desc": "128-bit XMM SIMD register"}], "description": "Stores the low 64-bit scalar double-precision floating-point value from an XMM register to a 64-bit memory location, bypassing the cache hierarchy using non-temporal semantics. Similar to MOVNTSS but for 64-bit double-precision values; useful for streaming writes of double-precision data. No arithmetic flags are affected; this is a memory store only.", "pseudocode": "[dest] ← src[63:0];", "example": "MOVNTSD [rbp-8], xmm1"}
{"mnemonic": "clzero", "architecture": "x86", "full_name": "Zero Cache Line", "summary": "Clears the cache line at address RAX/EAX (AMD).", "syntax": "CLZERO", "encoding": {"format": "AMD", "hex_opcode": "0F 01 FC", "visual_parts": [], "binary_pattern": "0F | 01 | FC", "bit_positions": "+0 | +1 | +2"}, "extension": "CLZERO", "operands": [], "description": "Zeros (clears) a 64-byte cache line at the address held in RAX (in 64-bit mode) or EAX (in 32-bit mode), writing zeros to memory while bypassing caches. This instruction is a non-temporal operation useful for initializing large memory regions without cache pollution. No flags are affected; the memory is written directly and cache coherency is maintained.", "pseudocode": "lineaddr ← RAX & ~0x3F; memset([lineaddr], 0, 64);", "example": "CLZERO"}
{"mnemonic": "blci", "architecture": "x86", "full_name": "Bit Line Create Isolated", "summary": "Sets all bits to 0 except the lowest set bit inverted (x | ~(x+1)).", "syntax": "BLCI r32, r/m32", "encoding": {"format": "TBM", "hex_opcode": "XOP.L0.09.W0 02 /6", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "TBM", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Computes (src | ~(src+1)) and stores the result in dest, isolating all bits except the lowest set bit (which is inverted). Part of the TBM (Trailing Bit Manipulation) extension; sets flags based on the result: ZF if result is zero, SF based on sign bit, and CF/OF/PF are undefined. Available in 32-bit and 64-bit variants.", "pseudocode": "result ← src | ~(src + 1); dest ← result; ZF ← (result == 0); SF ← result[31]; CF ← undefined; OF ← undefined; PF ← undefined;", "example": "BLCI eax, ebx"}
{"mnemonic": "blcic", "architecture": "x86", "full_name": "Bit Line Create Isolated and Complement", "summary": "Isolates lowest clear bit (~x & (x+1)).", "syntax": "BLCIC r32, r/m32", "encoding": {"format": "TBM", "hex_opcode": "XOP.L0.09.W0 01 /5", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "TBM", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Computes (~src & (src+1)) and stores the result in dest, isolating the lowest clear (zero) bit. Part of the TBM extension; sets ZF if result is zero and SF based on the sign bit of the result; CF, OF, and PF are undefined. Available in 32-bit and 64-bit variants.", "pseudocode": "result ← ~src & (src + 1); dest ← result; ZF ← (result == 0); SF ← result[31]; CF ← undefined; OF ← undefined; PF ← undefined;", "example": "BLCIC eax, ebx"}
{"mnemonic": "blcmsk", "architecture": "x86", "full_name": "Bit Line Create Mask", "summary": "Creates mask from lowest clear bit (x ^ (x+1)).", "syntax": "BLCMSK r32, r/m32", "encoding": {"format": "TBM", "hex_opcode": "XOP.L0.09.W0 02 /1", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "TBM", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Computes (src ^ (src+1)) and stores the result in dest, creating a mask from the lowest clear bit to bit 0. Part of the TBM extension; sets ZF if result is zero and SF based on the sign bit of the result; CF, OF, and PF are undefined. Available in 32-bit and 64-bit variants.", "pseudocode": "result ← src ^ (src + 1); dest ← result; ZF ← (result == 0); SF ← result[31]; CF ← undefined; OF ← undefined; PF ← undefined;", "example": "BLCMSK eax, ebx"}
{"mnemonic": "blcs", "architecture": "x86", "full_name": "Bit Line Create Set", "summary": "Sets lowest clear bit (x | (x+1)).", "syntax": "BLCS r32, r/m32", "encoding": {"format": "TBM", "hex_opcode": "XOP.L0.09.W0 01 /3", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "TBM", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Computes (src | (src+1)) and stores the result in dest, setting the lowest clear bit. Part of the TBM extension; sets ZF if result is zero and SF based on the sign bit of the result; CF, OF, and PF are undefined. Available in 32-bit and 64-bit variants.", "pseudocode": "result ← src | (src + 1); dest ← result; ZF ← (result == 0); SF ← result[31]; CF ← undefined; OF ← undefined; PF ← undefined;", "example": "BLCS eax, ebx"}
{"mnemonic": "blsfill", "architecture": "x86", "full_name": "Bit Line Set Fill", "summary": "Sets all bits below lowest set bit ((x-1) | x).", "syntax": "BLSFILL r32, r/m32", "encoding": {"format": "TBM", "hex_opcode": "XOP.L0.09.W0 01 /2", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "TBM", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Computes ((src-1) | src) and stores the result in dest, filling all bits below and including the lowest set bit. Part of the TBM extension; sets ZF if result is zero and SF based on the sign bit of the result; CF, OF, and PF are undefined. Available in 32-bit and 64-bit variants.", "pseudocode": "result ← (src - 1) | src; dest ← result; ZF ← (result == 0); SF ← result[31]; CF ← undefined; OF ← undefined; PF ← undefined;", "example": "BLSFILL eax, ebx"}
{"mnemonic": "blsic", "architecture": "x86", "full_name": "Bit Line Set Isolated and Complement", "summary": "Isolates lowest set bit and complements (~x | (x-1)).", "syntax": "BLSIC r32, r/m32", "encoding": {"format": "TBM", "hex_opcode": "XOP.L0.09.W0 01 /6", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "TBM", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Isolates the lowest set bit and complements the result, computing ~src | (src - 1). This TBM instruction is useful for extracting bit masks and operates on 32-bit operands in protected/64-bit modes. No flags are modified by this instruction.", "pseudocode": "dest ← ~src | (src - 1)", "example": "BLSIC eax, ebx"}
{"mnemonic": "t1mskc", "architecture": "x86", "full_name": "Inverse Mask From Trailing Ones", "summary": "Creates mask from trailing ones (~x | (x+1)).", "syntax": "T1MSKC r32, r/m32", "encoding": {"format": "TBM", "hex_opcode": "XOP.L0.09.W0 01 /7", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "TBM", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Creates a mask from trailing ones by computing ~src | (src + 1), isolating all bits from the least significant one through trailing ones. This TBM instruction operates on 32-bit operands and does not modify CPU flags.", "pseudocode": "dest ← ~src | (src + 1)", "example": "T1MSKC eax, ebx"}
{"mnemonic": "tzmsk", "architecture": "x86", "full_name": "Mask From Trailing Zeros", "summary": "Creates mask from trailing zeros (~x & (x-1)).", "syntax": "TZMSK r32, r/m32", "encoding": {"format": "TBM", "hex_opcode": "XOP.L0.09.W0 01 /4", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "TBM", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r/m32", "desc": "32-bit register or memory"}], "description": "Creates a mask from trailing zeros by computing ~src & (src - 1), isolating only the trailing zero bits. This TBM instruction operates on 32-bit operands in protected/64-bit modes and does not modify any CPU flags.", "pseudocode": "dest ← ~src & (src - 1)", "example": "TZMSK eax, ebx"}
{"mnemonic": "vprotb", "architecture": "x86", "full_name": "Vector Packed Rotate Byte", "summary": "Rotates bytes in XMM register.", "syntax": "VPROTB xmm1, xmm2/m128, imm8", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.08.W0 C0 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rotates each byte within a 128-bit XMM register by the amount specified in the 8-bit signed immediate, with rotation direction determined by the sign of the immediate (positive = left rotate, negative = right rotate). This XOP instruction is part of the AMD Bulldozer-era vector extensions and does not modify CPU flags.", "pseudocode": "for i in 0..15:\n  if (imm8 >= 0):\n    xmm1[i*8+7:i*8] ← ROL(src1[i*8+7:i*8], imm8 & 7)\n  else:\n    xmm1[i*8+7:i*8] ← ROR(src1[i*8+7:i*8], (-imm8) & 7)", "example": "VPROTB xmm1, xmm2/m128, 3"}
{"mnemonic": "vprotw", "architecture": "x86", "full_name": "Vector Packed Rotate Word", "summary": "Rotates words in XMM register.", "syntax": "VPROTW xmm1, xmm2/m128, imm8", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.08.W0 C1 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rotates each 16-bit word within a 128-bit XMM register by the amount specified in the 8-bit signed immediate, with rotation direction determined by sign (positive = left rotate, negative = right rotate). This XOP vector instruction does not modify CPU flags.", "pseudocode": "for i in 0..7:\n  if (imm8 >= 0):\n    xmm1[i*16+15:i*16] ← ROL(src1[i*16+15:i*16], imm8 & 15)\n  else:\n    xmm1[i*16+15:i*16] ← ROR(src1[i*16+15:i*16], (-imm8) & 15)", "example": "VPROTW xmm1, xmm2/m128, 3"}
{"mnemonic": "vprotd", "architecture": "x86", "full_name": "Vector Packed Rotate Doubleword", "summary": "Rotates doublewords in XMM register.", "syntax": "VPROTD xmm1, xmm2/m128, imm8", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.08.W0 C2 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rotates each 32-bit doubleword within a 128-bit XMM register by the amount specified in the 8-bit signed immediate, with rotation direction determined by sign (positive = left rotate, negative = right rotate). This XOP instruction does not affect CPU flags.", "pseudocode": "for i in 0..3:\n  if (imm8 >= 0):\n    xmm1[i*32+31:i*32] ← ROL(src1[i*32+31:i*32], imm8 & 31)\n  else:\n    xmm1[i*32+31:i*32] ← ROR(src1[i*32+31:i*32], (-imm8) & 31)", "example": "VPROTD xmm1, xmm2/m128, 3"}
{"mnemonic": "vprotq", "architecture": "x86", "full_name": "Vector Packed Rotate Quadword", "summary": "Rotates quadwords in XMM register.", "syntax": "VPROTQ xmm1, xmm2/m128, imm8", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.08.W0 C3 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Rotates each 64-bit quadword within a 128-bit XMM register by the amount specified in the 8-bit signed immediate, with rotation direction determined by sign (positive = left rotate, negative = right rotate). This XOP vector instruction does not modify CPU flags.", "pseudocode": "for i in 0..1:\n  if (imm8 >= 0):\n    xmm1[i*64+63:i*64] ← ROL(src1[i*64+63:i*64], imm8 & 63)\n  else:\n    xmm1[i*64+63:i*64] ← ROR(src1[i*64+63:i*64], (-imm8) & 63)", "example": "VPROTQ xmm1, xmm2/m128, 3"}
{"mnemonic": "vpshab", "architecture": "x86", "full_name": "Vector Packed Shift Arithmetic Byte", "summary": "Shifts bytes arithmetically.", "syntax": "VPSHAB xmm1, xmm2/m128, xmm3", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.09.W0 98 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs arithmetic left or right shift on each byte element within a 128-bit XMM register based on the 8-bit signed immediate, with positive values for left shift and negative for right shift (sign-extending). This XOP instruction does not modify CPU flags.", "pseudocode": "for i in 0..15:\n  if (imm8 >= 0):\n    xmm1[i*8+7:i*8] ← src1[i*8+7:i*8] << (imm8 & 7)\n  else:\n    xmm1[i*8+7:i*8] ← arithmetic_shift_right(src1[i*8+7:i*8], (-imm8) & 7)", "example": "VPSHAB xmm1, xmm2/m128, 3"}
{"mnemonic": "vpshaw", "architecture": "x86", "full_name": "Vector Packed Shift Arithmetic Word", "summary": "Shifts words arithmetically.", "syntax": "VPSHAW xmm1, xmm2/m128, xmm3", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.09.W0 99 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts each 16-bit word in xmm2/m128 arithmetically by the signed immediate count, storing results in xmm1. Arithmetic right shifts replicate the sign bit; left shifts fill with zeros. This XOP extension instruction operates on 128-bit packed word data and does not affect EFLAGS.", "pseudocode": "for i = 0 to 7 {\n  if (imm8 >= 0) {\n    xmm1[16*i:16*i+15] ← (xmm2/m128[16*i:16*i+15]) << imm8\n  } else {\n    xmm1[16*i:16*i+15] ← (xmm2/m128[16*i:16*i+15]) >> (-imm8)  // arithmetic shift\n  }\n}", "example": "VPSHAW xmm1, xmm2/m128, 3"}
{"mnemonic": "vpshad", "architecture": "x86", "full_name": "Vector Packed Shift Arithmetic Doubleword", "summary": "Shifts doublewords arithmetically.", "syntax": "VPSHAD xmm1, xmm2/m128, xmm3", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.09.W0 9A /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts each 32-bit doubleword in xmm2/m128 arithmetically by the signed immediate count, storing results in xmm1. Arithmetic right shifts preserve the sign bit; left shifts fill with zeros. This XOP extension instruction operates on 128-bit packed doubleword data and does not affect EFLAGS.", "pseudocode": "for i = 0 to 3 {\n  if (imm8 >= 0) {\n    xmm1[32*i:32*i+31] ← (xmm2/m128[32*i:32*i+31]) << imm8\n  } else {\n    xmm1[32*i:32*i+31] ← (xmm2/m128[32*i:32*i+31]) >> (-imm8)  // arithmetic shift\n  }\n}", "example": "VPSHAD xmm1, xmm2/m128, 3"}
{"mnemonic": "vpshaq", "architecture": "x86", "full_name": "Vector Packed Shift Arithmetic Quadword", "summary": "Shifts quadwords arithmetically.", "syntax": "VPSHAQ xmm1, xmm2/m128, xmm3", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.09.W0 9B /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}, {"name": "src2", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Shifts each 64-bit quadword in xmm2/m128 arithmetically by the signed immediate count, storing results in xmm1. Arithmetic right shifts maintain the sign bit; left shifts fill with zeros. This XOP extension instruction operates on 128-bit packed quadword data and does not affect EFLAGS.", "pseudocode": "for i = 0 to 1 {\n  if (imm8 >= 0) {\n    xmm1[64*i:64*i+63] ← (xmm2/m128[64*i:64*i+63]) << imm8\n  } else {\n    xmm1[64*i:64*i+63] ← (xmm2/m128[64*i:64*i+63]) >> (-imm8)  // arithmetic shift\n  }\n}", "example": "VPSHAQ xmm1, xmm2/m128, 3"}
{"mnemonic": "vphaddbw", "architecture": "x86", "full_name": "Vector Packed Horizontal Add Byte to Word", "summary": "Adds adjacent bytes to words.", "syntax": "VPHADDBW xmm1, xmm2/m128", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.09.W0 C1 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Horizontally adds adjacent pairs of signed 8-bit bytes from xmm2/m128, accumulating results as 16-bit words in xmm1. Each pair of bytes produces one 16-bit word result; the operation doubles the data width. This XOP extension instruction does not affect EFLAGS and handles signed arithmetic with saturation or wrapping semantics dependent on implementation.", "pseudocode": "for i = 0 to 7 {\n  xmm1[16*i:16*i+15] ← sign_extend(xmm2/m128[8*(2*i):8*(2*i)+7]) + sign_extend(xmm2/m128[8*(2*i+1):8*(2*i+1)+7])\n}", "example": "VPHADDBW xmm1, xmm2/m128"}
{"mnemonic": "vphaddbd", "architecture": "x86", "full_name": "Vector Packed Horizontal Add Byte to Doubleword", "summary": "Adds adjacent bytes to doublewords.", "syntax": "VPHADDBD xmm1, xmm2/m128", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.09.W0 C2 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Horizontally adds adjacent groups of four signed 8-bit bytes from xmm2/m128, accumulating results as 32-bit doublewords in xmm1. Four consecutive bytes are summed to produce one 32-bit result. This XOP extension instruction does not affect EFLAGS and performs signed arithmetic.", "pseudocode": "for i = 0 to 3 {\n  xmm1[32*i:32*i+31] ← sign_extend(xmm2/m128[8*(4*i):8*(4*i)+7]) + sign_extend(xmm2/m128[8*(4*i+1):8*(4*i+1)+7]) + sign_extend(xmm2/m128[8*(4*i+2):8*(4*i+2)+7]) + sign_extend(xmm2/m128[8*(4*i+3):8*(4*i+3)+7])\n}", "example": "VPHADDBD xmm1, xmm2/m128"}
{"mnemonic": "vphaddbq", "architecture": "x86", "full_name": "Vector Packed Horizontal Add Byte to Quadword", "summary": "Adds adjacent bytes to quadwords.", "syntax": "VPHADDBQ xmm1, xmm2/m128", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.09.W0 C3 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Horizontally adds all eight signed 8-bit bytes from xmm2/m128 (lower half) and (upper half separately), accumulating results as 64-bit quadwords in xmm1. All bytes from each half are summed to produce two 64-bit results. This XOP extension instruction does not affect EFLAGS and performs signed arithmetic.", "pseudocode": "xmm1[63:0] ← sign_extend(xmm2/m128[7:0]) + sign_extend(xmm2/m128[15:8]) + sign_extend(xmm2/m128[23:16]) + sign_extend(xmm2/m128[31:24]) + sign_extend(xmm2/m128[39:32]) + sign_extend(xmm2/m128[47:40]) + sign_extend(xmm2/m128[55:48]) + sign_extend(xmm2/m128[63:56])\nxmm1[127:64] ← sign_extend(xmm2/m128[71:64]) + sign_extend(xmm2/m128[79:72]) + sign_extend(xmm2/m128[87:80]) + sign_extend(xmm2/m128[95:88]) + sign_extend(xmm2/m128[103:96]) + sign_extend(xmm2/m128[111:104]) + sign_extend(xmm2/m128[119:112]) + sign_extend(xmm2/m128[127:120])", "example": "VPHADDBQ xmm1, xmm2/m128"}
{"mnemonic": "vphaddwd", "architecture": "x86", "full_name": "Vector Packed Horizontal Add Word to Doubleword", "summary": "Adds adjacent words to doublewords.", "syntax": "VPHADDWD xmm1, xmm2/m128", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.09.W0 C6 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Horizontally adds adjacent pairs of signed 16-bit words from xmm2/m128, accumulating results as 32-bit doublewords in xmm1. Each pair of words produces one 32-bit doubleword result; the operation doubles the data width. This XOP extension instruction does not affect EFLAGS and performs signed arithmetic.", "pseudocode": "for i = 0 to 3 {\n  xmm1[32*i:32*i+31] ← sign_extend(xmm2/m128[16*(2*i):16*(2*i)+15]) + sign_extend(xmm2/m128[16*(2*i+1):16*(2*i+1)+15])\n}", "example": "VPHADDWD xmm1, xmm2/m128"}
{"mnemonic": "vphaddwq", "architecture": "x86", "full_name": "Vector Packed Horizontal Add Word to Quadword", "summary": "Adds adjacent words to quadwords.", "syntax": "VPHADDWQ xmm1, xmm2/m128", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.09.W0 C7 /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Horizontally adds adjacent groups of four signed 16-bit words from xmm2/m128, accumulating results as 64-bit quadwords in xmm1. Four consecutive words are summed to produce one 64-bit result. This XOP extension instruction does not affect EFLAGS and performs signed arithmetic.", "pseudocode": "for i = 0 to 1 {\n  xmm1[64*i:64*i+63] ← sign_extend(xmm2/m128[16*(4*i):16*(4*i)+15]) + sign_extend(xmm2/m128[16*(4*i+1):16*(4*i+1)+15]) + sign_extend(xmm2/m128[16*(4*i+2):16*(4*i+2)+15]) + sign_extend(xmm2/m128[16*(4*i+3):16*(4*i+3)+15])\n}", "example": "VPHADDWQ xmm1, xmm2/m128"}
{"mnemonic": "vphadddq", "architecture": "x86", "full_name": "Vector Packed Horizontal Add Doubleword to Quadword", "summary": "Adds adjacent doublewords to quadwords.", "syntax": "VPHADDDQ xmm1, xmm2/m128", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.09.W0 CB /r", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src", "type": "xmm2/m128", "desc": "128-bit XMM SIMD register or Memory operand"}], "description": "Adds pairs of adjacent 32-bit signed integers and stores the 64-bit sums in the destination XMM register. This is a horizontal operation that processes two 32-bit elements from each 64-bit lane, producing one 64-bit result per lane. No flags are affected.", "pseudocode": "for i = 0 to 1:\n  result[i*64:(i*64)+63] ← sign_extend_64(src[(i*2)*32:(i*2)*32+31]) +\n                            sign_extend_64(src[(i*2+1)*32:(i*2+1)*32+31])\ndest ← result", "example": "VPHADDDQ xmm1, xmm2/m128"}
{"mnemonic": "vpmacsww", "architecture": "x86", "full_name": "Vector Packed Multiply Accumulate Signed Word", "summary": "Multiply-accumulate signed words.", "syntax": "VPMACSWW xmm1, xmm2, xmm3, xmm4", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.08.W0 95 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3", "desc": "128-bit XMM SIMD register"}, {"name": "src3", "type": "xmm4", "desc": "128-bit XMM SIMD register"}], "description": "Multiplies pairs of signed 16-bit integers, accumulates the 32-bit products, and stores results in the destination XMM register without saturation. This is a 4-operand instruction encoding multiply-accumulate semantics: dest = src1 * src2 + src3. No flags are affected.", "pseudocode": "for i = 0 to 7:\n  product ← sign_extend_32(src1[i*16:(i*16)+15]) *\n            sign_extend_32(src2[i*16:(i*16)+15])\n  result[i*32:(i*32)+31] ← product + sign_extend_32(src3[i*16:(i*16)+15])\ndest ← result", "example": "VPMACSWW xmm1, xmm2, xmm3, xmm4"}
{"mnemonic": "vpmacssww", "architecture": "x86", "full_name": "Vector Packed Multiply Accumulate Signed Saturate Word", "summary": "Multiply-accumulate signed words with saturation.", "syntax": "VPMACSSWW xmm1, xmm2, xmm3, xmm4", "encoding": {"format": "XOP", "hex_opcode": "XOP.128.08.W0 85 /r ib", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "XOP", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2", "desc": "128-bit XMM SIMD register"}, {"name": "src2", "type": "xmm3", "desc": "128-bit XMM SIMD register"}, {"name": "src3", "type": "xmm4", "desc": "128-bit XMM SIMD register"}], "description": "Multiplies pairs of signed 16-bit integers, accumulates the 32-bit products with saturation to signed 32-bit range, and stores results in the destination XMM register. This saturating variant clamps results to [-2³¹, 2³¹-1]. No flags are affected.", "pseudocode": "for i = 0 to 7:\n  product ← sign_extend_32(src1[i*16:(i*16)+15]) *\n            sign_extend_32(src2[i*16:(i*16)+15])\n  sum ← product + sign_extend_32(src3[i*16:(i*16)+15])\n  result[i*32:(i*32)+31] ← saturate_signed_32(sum)\ndest ← result", "example": "VPMACSSWW xmm1, xmm2, xmm3, xmm4"}
{"mnemonic": "vgatherpf0dps", "architecture": "x86", "full_name": "Gather Prefetch Packed Single (L1)", "summary": "Prefetches floats to L1 cache using indices.", "syntax": "VGATHERPF0DPS {k1}, [base+zmm_idx]", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 C6 /1 /vsib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512PF", "operands": [{"name": "dest", "type": "[base+zmm_idx]", "desc": "AVX-512 gather/scatter: base register + ZMM vector index"}], "description": "Prefetches cache lines to L1 for single-precision floats using 32-bit dword indices from a vector register. The instruction performs a gather-style prefetch where each ZMM element acts as an index offset from a base address, but does not load data into registers. The opmask register {k1} controls which prefetch operations execute. No flags are affected.", "pseudocode": "for i = 0 to 15:\n  if k1[i] == 1:\n    addr ← base + zmm_idx[i*32:(i*32)+31] * scale\n    prefetch_L1(addr)\n  endif", "example": "VGATHERPF0DPS {k1}, [base+zmm_idx]"}
{"mnemonic": "vgatherpf0qps", "architecture": "x86", "full_name": "Gather Prefetch Packed Single (L1, Qword Indices)", "summary": "Prefetches floats to L1 using 64-bit indices.", "syntax": "VGATHERPF0QPS {k1}, [base+zmm_idx]", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 C7 /1 /vsib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512PF", "operands": [{"name": "dest", "type": "[base+zmm_idx]", "desc": "AVX-512 gather/scatter: base register + ZMM vector index"}], "description": "Prefetches cache lines to L1 for single-precision floats using 64-bit qword indices from a vector register. Each element of the ZMM vector is treated as a 64-bit index offset from a base address for gather-prefetch semantics. The opmask {k1} selects which prefetch operations occur. No flags are affected.", "pseudocode": "for i = 0 to 7:\n  if k1[i] == 1:\n    addr ← base + zmm_idx[i*64:(i*64)+63] * scale\n    prefetch_L1(addr)\n  endif", "example": "VGATHERPF0QPS {k1}, [base+zmm_idx]"}
{"mnemonic": "vgatherpf0dpd", "architecture": "x86", "full_name": "Gather Prefetch Packed Double (L1)", "summary": "Prefetches doubles to L1 cache using indices.", "syntax": "VGATHERPF0DPD {k1}, [base+ymm_idx]", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 C6 /1 /vsib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512PF", "operands": [{"name": "dest", "type": "[base+ymm_idx]", "desc": "AVX gather/scatter: base register + YMM vector index"}], "description": "Prefetches cache lines to L1 for double-precision floats using 32-bit dword indices from a vector register. Each 32-bit index in the YMM register is scaled and added to a base address for gathering-style prefetch operations. The opmask {k1} gates which prefetch operations execute. No flags are affected.", "pseudocode": "for i = 0 to 7:\n  if k1[i] == 1:\n    addr ← base + ymm_idx[i*32:(i*32)+31] * scale\n    prefetch_L1(addr)\n  endif", "example": "VGATHERPF0DPD {k1}, [base+ymm_idx]"}
{"mnemonic": "vgatherpf0qpd", "architecture": "x86", "full_name": "Gather Prefetch Packed Double (L1, Qword Indices)", "summary": "Prefetches doubles to L1 using 64-bit indices.", "syntax": "VGATHERPF0QPD {k1}, [base+zmm_idx]", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 C7 /1 /vsib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512PF", "operands": [{"name": "dest", "type": "[base+zmm_idx]", "desc": "AVX-512 gather/scatter: base register + ZMM vector index"}], "description": "Prefetches cache lines to L1 for double-precision floats using 64-bit qword indices from a vector register. Each 64-bit element in the ZMM index register is scaled and added to a base address for gather-prefetch semantics. The opmask {k1} controls which prefetch operations are active. No flags are affected.", "pseudocode": "for i = 0 to 7:\n  if k1[i] == 1:\n    addr ← base + zmm_idx[i*64:(i*64)+63] * scale\n    prefetch_L1(addr)\n  endif", "example": "VGATHERPF0QPD {k1}, [base+zmm_idx]"}
{"mnemonic": "vscatterpf0dps", "architecture": "x86", "full_name": "Scatter Prefetch Packed Single (L1)", "summary": "Prefetches cache lines for scatter write (L1).", "syntax": "VSCATTERPF0DPS {k1}, [base+zmm_idx]", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 C6 /5 /vsib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512PF", "operands": [{"name": "dest", "type": "[base+zmm_idx]", "desc": "AVX-512 gather/scatter: base register + ZMM vector index"}], "description": "Prefetches cache lines to L1 in preparation for scatter write operations on single-precision floats using 32-bit dword indices. Unlike gather prefetch, this operation optimizes cache behavior for subsequent scatter stores. The opmask {k1} selects which prefetch operations occur. No flags are affected.", "pseudocode": "for i = 0 to 15:\n  if k1[i] == 1:\n    addr ← base + zmm_idx[i*32:(i*32)+31] * scale\n    prefetch_L1_for_write(addr)\n  endif", "example": "VSCATTERPF0DPS {k1}, [base+zmm_idx]"}
{"mnemonic": "vscatterpf0qps", "architecture": "x86", "full_name": "Scatter Prefetch Packed Single (L1, Qword Indices)", "summary": "Prefetches lines for scatter write (L1, 64-bit idx).", "syntax": "VSCATTERPF0QPS {k1}, [base+zmm_idx]", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W0 C7 /5 /vsib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512PF", "operands": [{"name": "dest", "type": "[base+zmm_idx]", "desc": "AVX-512 gather/scatter: base register + ZMM vector index"}], "description": "Prefetches cache lines for scatter write operations using 64-bit (qword) indices into a ZMM vector, with L1 cache as the target. This is a non-faulting prefetch hint that does not load data or raise exceptions; it only triggers hardware prefetch logic based on the indexed addresses. Execution is masked by the k1 opmask register, and no flags are affected.", "pseudocode": "for (i = 0; i < 8; i++) {\n  if (k1[i]) {\n    addr = base + ZMM_idx[i];\n    prefetch_l1(addr);\n  }\n}", "example": "VSCATTERPF0QPS {k1}, [base+zmm_idx]"}
{"mnemonic": "vscatterpf0dpd", "architecture": "x86", "full_name": "Scatter Prefetch Packed Double (L1)", "summary": "Prefetches lines for scatter write (L1, Double).", "syntax": "VSCATTERPF0DPD {k1}, [base+ymm_idx]", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 C6 /5 /vsib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512PF", "operands": [{"name": "dest", "type": "[base+ymm_idx]", "desc": "AVX gather/scatter: base register + YMM vector index"}], "description": "Prefetches cache lines for scatter write operations using 32-bit (dword) indices into a YMM vector containing doubles, with L1 cache as the target. This is a non-faulting prefetch hint that does not load data or raise exceptions; masked execution by k1 is supported. No flags are affected.", "pseudocode": "for (i = 0; i < 4; i++) {\n  if (k1[i]) {\n    addr = base + ZeroExtend64(YMM_idx[i*32:i*32+31]);\n    prefetch_l1(addr);\n  }\n}", "example": "VSCATTERPF0DPD {k1}, [base+ymm_idx]"}
{"mnemonic": "vscatterpf0qpd", "architecture": "x86", "full_name": "Scatter Prefetch Packed Double (L1, Qword Indices)", "summary": "Prefetches lines for scatter write (L1, Double, 64-bit idx).", "syntax": "VSCATTERPF0QPD {k1}, [base+zmm_idx]", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 C7 /5 /vsib", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512PF", "operands": [{"name": "dest", "type": "[base+zmm_idx]", "desc": "AVX-512 gather/scatter: base register + ZMM vector index"}], "description": "Prefetches cache lines for scatter write operations using 64-bit (qword) indices into a ZMM vector containing doubles, with L1 cache as the target. This non-faulting prefetch hint is masked by the k1 opmask and does not load data or raise exceptions. No flags are affected.", "pseudocode": "for (i = 0; i < 8; i++) {\n  if (k1[i]) {\n    addr = base + ZMM_idx[i];\n    prefetch_l1(addr);\n  }\n}", "example": "VSCATTERPF0QPD {k1}, [base+zmm_idx]"}
{"mnemonic": "vp4dpwssd", "architecture": "x86", "full_name": "Dot Product Signed Word to Signed Doubleword (4-iterations)", "summary": "Neural Net 4-way dot product.", "syntax": "VP4DPWSSD zmm1 {k1}, zmm2+3, m128", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F2.0F38.W0 52 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512-4VNNIW", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2+3", "desc": "ZMM register pair (consecutive even+odd registers, for 4-iteration FMA)"}, {"name": "src2", "type": "m128", "desc": "128-bit memory operand"}], "description": "Performs four iterations of fused multiply-add on signed word operands, accumulating into 32-bit signed doubleword results in zmm1. The instruction reads from a consecutive register pair (zmm2:zmm3) and a 128-bit memory operand, executing four parallel dot products per iteration. Masked by k1; no flags are affected; saturation does not occur (results wrap on overflow).", "pseudocode": "for (j = 0; j < 4; j++) {\n  for (i = 0; i < 16; i++) {\n    zmm1[i*32:(i*32)+31] += (int32_t)(zmm2[(j*4+i)*16:(j*4+i)*16+15]) * (int32_t)(m128[(j*16+i*2):(j*16+i*2)+15]);\n  }\n}", "example": "VP4DPWSSD zmm1, zmm2+3, [rbp-16]"}
{"mnemonic": "vp4dpwssds", "architecture": "x86", "full_name": "Dot Product Signed Word to Signed Doubleword Saturate (4-iter)", "summary": "Neural Net 4-way dot product with saturation.", "syntax": "VP4DPWSSDS zmm1 {k1}, zmm2+3, m128", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F2.0F38.W0 53 /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512-4VNNIW", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2+3", "desc": "ZMM register pair (consecutive even+odd registers, for 4-iteration FMA)"}, {"name": "src2", "type": "m128", "desc": "128-bit memory operand"}], "description": "Performs four iterations of fused multiply-add on signed word operands, accumulating into 32-bit signed doubleword results in zmm1 with saturation. The instruction reads from a consecutive register pair (zmm2:zmm3) and a 128-bit memory operand, executing four parallel dot products per iteration. Results saturate to INT32_MIN/INT32_MAX on overflow; masked by k1; no flags are affected.", "pseudocode": "for (j = 0; j < 4; j++) {\n  for (i = 0; i < 16; i++) {\n    temp = (int64_t)(zmm2[(j*4+i)*16:(j*4+i)*16+15]) * (int64_t)(m128[(j*16+i*2):(j*16+i*2)+15]);\n    zmm1[i*32:(i*32)+31] = SaturateSigned32(zmm1[i*32:(i*32)+31] + temp);\n  }\n}", "example": "VP4DPWSSDS zmm1, zmm2+3, [rbp-16]"}
{"mnemonic": "v4fmaddps", "architecture": "x86", "full_name": "Fused Multiply-Add Packed Single (4-iterations)", "summary": "4-way FMA for Neural Nets (Single).", "syntax": "V4FMADDPS zmm1 {k1}, zmm2+3, m128", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F2.0F38.W0 9A /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512-4FMAPS", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2+3", "desc": "ZMM register pair (consecutive even+odd registers, for 4-iteration FMA)"}, {"name": "src2", "type": "m128", "desc": "128-bit memory operand"}], "description": "Performs four iterations of fused multiply-add on packed single-precision floating-point operands, accumulating results into zmm1. The instruction reads from a consecutive ZMM register pair (zmm2:zmm3) and a 128-bit memory operand, computing four parallel multiply-accumulate chains. Masked by k1; floating-point exceptions (precision, underflow, overflow, denormal) may be signaled; rounding is per MXCSR.", "pseudocode": "for (j = 0; j < 4; j++) {\n  for (i = 0; i < 16; i++) {\n    float mul = zmm2[(j*4+i)*32:(j*4+i)*32+31] * m128[(j*16+i*4):(j*16+i*4)+31];\n    zmm1[i*32:(i*32)+31] = FP_ADD(zmm1[i*32:(i*32)+31], mul);\n  }\n}", "example": "V4FMADDPS zmm1, zmm2+3, [rbp-16]"}
{"mnemonic": "v4fmaddss", "architecture": "x86", "full_name": "Fused Multiply-Add Scalar Single (4-iterations)", "summary": "4-way FMA for Neural Nets (Scalar).", "syntax": "V4FMADDSS xmm1 {k1}, xmm2+3, m128", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.F2.0F38.W0 9B /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512-4FMAPS", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2+3", "desc": "XMM register pair (consecutive even+odd registers)"}, {"name": "src2", "type": "m128", "desc": "128-bit memory operand"}], "description": "Performs four iterations of fused multiply-add on scalar single-precision floating-point operands, accumulating results into the low dword of xmm1. The instruction reads from a consecutive XMM register pair (xmm2:xmm3) and a 128-bit memory operand, computing four parallel multiply-accumulate operations into the scalar. Masked by k1; floating-point exceptions may be signaled; rounding is per MXCSR; high 96 bits of xmm1 are cleared.", "pseudocode": "temp = xmm1[0:31];\nfor (j = 0; j < 4; j++) {\n  float mul = ((j == 0) ? xmm2[0:31] : xmm3[0:31]) * *(float*)&m128[(j*4):(j*4)+31];\n  temp = FP_ADD(temp, mul);\n}\nxmm1[0:31] = temp;\nxmm1[32:127] = 0;", "example": "V4FMADDSS xmm1, xmm2+3, [rbp-16]"}
{"mnemonic": "v4fnmaddps", "architecture": "x86", "full_name": "Fused Negative Multiply-Add Packed Single (4-iterations)", "summary": "4-way Negative FMA for Neural Nets (Single).", "syntax": "V4FNMADDPS zmm1 {k1}, zmm2+3, m128", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F2.0F38.W0 AA /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512-4FMAPS", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2+3", "desc": "ZMM register pair (consecutive even+odd registers, for 4-iteration FMA)"}, {"name": "src2", "type": "m128", "desc": "128-bit memory operand"}], "description": "Performs four iterations of fused negative multiply-add on packed single-precision floating-point operands, computing -(zmm2×m128) + zmm1, accumulating results into zmm1. The instruction reads from a consecutive ZMM register pair (zmm2:zmm3) and a 128-bit memory operand, executing four parallel negated multiply-accumulate chains. Masked by k1; floating-point exceptions may be signaled; rounding is per MXCSR.", "pseudocode": "for (j = 0; j < 4; j++) {\n  for (i = 0; i < 16; i++) {\n    float mul = -(zmm2[(j*4+i)*32:(j*4+i)*32+31] * m128[(j*16+i*4):(j*16+i*4)+31]);\n    zmm1[i*32:(i*32)+31] = FP_ADD(zmm1[i*32:(i*32)+31], mul);\n  }\n}", "example": "V4FNMADDPS zmm1, zmm2+3, [rbp-16]"}
{"mnemonic": "v4fnmaddss", "architecture": "x86", "full_name": "Fused Negative Multiply-Add Scalar Single (4-iterations)", "summary": "4-way Negative FMA for Neural Nets (Scalar).", "syntax": "V4FNMADDSS xmm1 {k1}, xmm2+3, m128", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.F2.0F38.W0 AB /r", "visual_parts": [], "binary_pattern": "EVEX | opcode | ModRM", "bit_positions": "+0 | +4 | +5"}, "extension": "AVX-512-4FMAPS", "operands": [{"name": "dest", "type": "xmm1", "desc": "128-bit XMM SIMD register"}, {"name": "src1", "type": "xmm2+3", "desc": "XMM register pair (consecutive even+odd registers)"}, {"name": "src2", "type": "m128", "desc": "128-bit memory operand"}], "description": "Performs four iterations of fused negative multiply-add on scalar single-precision floating-point values, computing -(src1[i] * src2[i]) + dest for four pairs of operands. This instruction is specialized for neural network operations and executes within a single macro-op, improving throughput for repeated FMA patterns. All MXCSR exception flags may be set based on intermediate results; the result is written to dest with optional write-masking via k1.", "pseudocode": "for i in 0 to 3:\n  temp ← -(xmm2[i] * m128[i])\n  xmm1[i] ← temp + xmm1[i]\n  update_MXCSR_flags(temp, xmm1[i])", "example": "V4FNMADDSS xmm1, xmm2+3, [rbp-16]"}
{"mnemonic": "vcvtdq2ps", "architecture": "x86", "full_name": "Convert Packed Doubleword to Packed Single", "summary": "Converts four 32-bit integers to floats.", "syntax": "VCVTDQ2PS ymm1, ymm2/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.0F.WIG 5B /r", "visual_parts": [], "binary_pattern": "VEX | 0F | 5B", "bit_positions": "+0 | +3 | +4"}, "extension": "AVX", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src", "type": "ymm2/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Converts four packed 32-bit signed doubleword integers to four packed single-precision floating-point values. The conversion uses the current MXCSR rounding mode; inexact results may set the PE (precision exception) flag in MXCSR. Available in 128-bit (XMM) and 256-bit (YMM) variants; the 256-bit form converts eight integers. No legacy flags are modified.", "pseudocode": "if VEX.L = 0:\n  for i in 0 to 1:\n    xmm1[i] ← convert_dword_to_float(xmm2[i])\nelse:\n  for i in 0 to 3:\n    ymm1[i] ← convert_dword_to_float(ymm2[i])\nupdate_MXCSR_flags()", "example": "VCVTDQ2PS ymm1, ymm2/m256"}
{"mnemonic": "vcvtps2dq", "architecture": "x86", "full_name": "Convert Packed Single to Packed Doubleword", "summary": "Converts four floats to 32-bit integers (Rounded).", "syntax": "VCVTPS2DQ ymm1, ymm2/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F.WIG 5B /r", "visual_parts": [], "binary_pattern": "VEX | 66 | 0F | 5B", "bit_positions": "+0 | +3 | +4 | +5"}, "extension": "AVX", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src", "type": "ymm2/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Converts four packed single-precision floating-point values to four packed 32-bit signed doubleword integers using the current MXCSR rounding mode. Overflowing results saturate to INT32_MIN or INT32_MAX; inexact results may set the PE flag in MXCSR. Available in 128-bit (XMM) and 256-bit (YMM) variants; the 256-bit form converts eight floats. No legacy x86 flags are modified.", "pseudocode": "if VEX.L = 0:\n  for i in 0 to 1:\n    xmm1[i] ← convert_float_to_dword_rounded(xmm2[i])\nelse:\n  for i in 0 to 3:\n    ymm1[i] ← convert_float_to_dword_rounded(ymm2[i])\nupdate_MXCSR_flags()", "example": "VCVTPS2DQ ymm1, ymm2/m256"}
{"mnemonic": "vcvttps2dq", "architecture": "x86", "full_name": "Convert with Truncation Packed Single to Doubleword", "summary": "Converts four floats to 32-bit integers (Truncated).", "syntax": "VCVTTPS2DQ ymm1, ymm2/m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.F3.0F.WIG 5B /r", "visual_parts": [], "binary_pattern": "VEX | F3 | 0F | 5B", "bit_positions": "+0 | +3 | +4 | +5"}, "extension": "AVX", "operands": [{"name": "dest", "type": "ymm1", "desc": "256-bit YMM AVX register"}, {"name": "src", "type": "ymm2/m256", "desc": "256-bit YMM AVX register or Memory operand"}], "description": "Converts four packed single-precision floating-point values to four packed 32-bit signed doubleword integers by truncating toward zero (ignoring MXCSR rounding mode). Overflowing results saturate to INT32_MIN or INT32_MAX; inexact results may set the PE flag in MXCSR. Available in 128-bit (XMM) and 256-bit (YMM) variants; the 256-bit form converts eight floats. No legacy x86 flags are modified.", "pseudocode": "if VEX.L = 0:\n  for i in 0 to 1:\n    xmm1[i] ← convert_float_to_dword_truncate(xmm2[i])\nelse:\n  for i in 0 to 3:\n    ymm1[i] ← convert_float_to_dword_truncate(ymm2[i])\nupdate_MXCSR_flags()", "example": "VCVTTPS2DQ ymm1, ymm2/m256"}
{"mnemonic": "iret", "architecture": "x86", "full_name": "Interrupt Return", "summary": "Returns from an interrupt, exception, or task handler.", "syntax": "IRET", "encoding": {"format": "Legacy", "hex_opcode": "CF", "visual_parts": [], "binary_pattern": "CF", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Returns from an interrupt handler, exception handler, or nested task by popping the return address and EFLAGS from the stack and resuming execution at the interrupted instruction. In protected mode, also restores CPL and task context; in 64-bit mode (IRETQ), pops a 64-bit return address. This instruction performs memory serialization and may reload segment registers, making it a heavy-weight operation that flushes pending stores.", "pseudocode": "if OperandSize = 16:\n  temp_IP ← [SP]; SP ← SP + 2\n  temp_CS ← [SP]; SP ← SP + 2\n  EFLAGS ← [SP]; SP ← SP + 2\nelse if OperandSize = 32:\n  temp_EIP ← [ESP]; ESP ← ESP + 4\n  temp_CS ← [ESP]; ESP ← ESP + 4\n  EFLAGS ← [ESP]; ESP ← ESP + 4\nelse if OperandSize = 64:\n  temp_RIP ← [RSP]; RSP ← RSP + 8\n  temp_CS ← [RSP]; RSP ← RSP + 8\n  EFLAGS ← [RSP]; RSP ← RSP + 8\nCS ← temp_CS\nIP/EIP/RIP ← temp_IP/EIP/RIP", "example": "IRET"}
{"mnemonic": "iretd", "architecture": "x86", "full_name": "Interrupt Return Doubleword", "summary": "Returns from interrupt (32-bit operand size).", "syntax": "IRETD", "encoding": {"format": "Legacy", "hex_opcode": "CF", "visual_parts": [], "binary_pattern": "CF", "bit_positions": "+0"}, "extension": "Base", "operands": [], "description": "Returns from an interrupt handler by explicitly using 32-bit operand size, popping the 32-bit return address (EIP) and EFLAGS from the stack. In protected mode, also restores the code segment (CS) and CPL; in real mode, only pops EIP and EFLAGS. This instruction serializes memory and may trigger privilege-level transitions or task switches, causing pipeline flushing.", "pseudocode": "temp_EIP ← [ESP]; ESP ← ESP + 4\ntemp_CS ← [ESP]; ESP ← ESP + 4\ntemp_EFLAGS ← [ESP]; ESP ← ESP + 4\nCS ← temp_CS\nEIP ← temp_EIP\nEFLAGS ← temp_EFLAGS", "example": "IRETD"}
{"mnemonic": "iretq", "architecture": "x86", "full_name": "Interrupt Return Quadword", "summary": "Returns from interrupt (64-bit operand size).", "syntax": "IRETQ", "encoding": {"format": "Legacy", "hex_opcode": "REX.W + CF", "visual_parts": [], "binary_pattern": "CF", "bit_positions": "+0"}, "extension": "Base (64-bit)", "operands": [], "description": "Returns from an interrupt handler using 64-bit operand size, popping the 64-bit return address (RIP), code segment (CS), and RFLAGS from the stack. Exclusively available in 64-bit long mode; enables return to user-mode code and handles CPL transitions. This is a heavy-weight serializing instruction that flushes pending operations and may reload hidden segment state.", "pseudocode": "temp_RIP ← [RSP]; RSP ← RSP + 8\ntemp_CS ← [RSP]; RSP ← RSP + 8\ntemp_RFLAGS ← [RSP]; RSP ← RSP + 8\nCS ← temp_CS\nRIP ← temp_RIP\nRFLAGS ← temp_RFLAGS", "example": "IRETQ"}
{"mnemonic": "in", "architecture": "x86", "full_name": "Input from Port (Variable)", "summary": "Reads data from I/O port specified in DX.", "syntax": "IN AL/AX/EAX, DX", "encoding": {"format": "Legacy", "hex_opcode": "ED", "visual_parts": [], "binary_pattern": "EC", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "AL/AX/EAX", "desc": "Implicit accumulator: AL, AX, or EAX (depends on operand size)"}, {"name": "src", "type": "DX", "desc": "Implicit DX register (I/O port address)"}], "description": "Reads 8, 16, or 32 bits from an I/O port whose address is specified in the DX register and stores the result in the AL, AX, or EAX accumulator respectively. The port number in DX is zero-extended to a full I/O address; I/O addressing and privilege checks are performed according to the IOPL field and TSS I/O bitmap. This instruction does not modify any flag bits and may have side effects on the I/O device.", "pseudocode": "port_address ← DX\nif operand_size = 8:\n  AL ← I/O_Read(port_address, 1)\nelse if operand_size = 16:\n  AX ← I/O_Read(port_address, 2)\nelse if operand_size = 32:\n  EAX ← I/O_Read(port_address, 4)", "example": "IN AL/AX/EAX, DX"}
{"mnemonic": "out", "architecture": "x86", "full_name": "Output to Port (Variable)", "summary": "Writes data to I/O port specified in DX.", "syntax": "OUT DX, AL/AX/EAX", "encoding": {"format": "Legacy", "hex_opcode": "EF", "visual_parts": [], "binary_pattern": "EE", "bit_positions": "+0"}, "extension": "Base", "operands": [{"name": "dest", "type": "DX", "desc": "Implicit DX register (I/O port address)"}, {"name": "src", "type": "AL/AX/EAX", "desc": "Implicit accumulator: AL, AX, or EAX (depends on operand size)"}], "description": "Writes data from the accumulator (AL, AX, or EAX depending on operand size) to an I/O port whose address is specified in the DX register. This instruction is used for legacy port-based I/O and requires I/O privilege level (IOPL) in protected/long modes. No CPU flags are affected.", "pseudocode": "port_address ← DX; if (operand_size == 8) { I/O[port_address] ← AL; } else if (operand_size == 16) { I/O[port_address] ← AX; } else if (operand_size == 32) { I/O[port_address] ← EAX; }", "example": "OUT DX, AL/AX/EAX"}
{"mnemonic": "vpopcntq", "architecture": "x86", "full_name": "Packed Population Count Quadword", "summary": "Counts set bits in each quadword element.", "syntax": "VPOPCNTQ zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 55 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 55", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VPOPCNTDQ", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Counts the number of set bits (population count) in each 64-bit quadword element of the source operand and stores the result in the destination ZMM register. This is an AVX-512-VPOPCNTDQ instruction that operates on 512-bit vectors (8 quadwords). Masking via the opmask register k1 can selectively update or zero destination elements; no CPU arithmetic flags are modified.", "pseudocode": "for i ← 0 to 7 do { if (k1[i] or not_masked) { dst.qword[i] ← popcount(src.qword[i]); } else { dst.qword[i] ← 0; } }", "example": "VPOPCNTQ zmm1, zmm2/m512"}
{"mnemonic": "vpopcntw", "architecture": "x86", "full_name": "Packed Population Count Word", "summary": "Counts set bits in each word element.", "syntax": "VPOPCNTW zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 54 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 54", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-BITALG", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "zmm2/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Counts the number of set bits (population count) in each 16-bit word element of the source operand and stores the result in the destination ZMM register. This is an AVX-512-BITALG instruction that operates on 512-bit vectors (32 words). Masking via opmask register k1 allows selective element updates; no CPU arithmetic flags are modified.", "pseudocode": "for i ← 0 to 31 do { if (k1[i] or not_masked) { dst.word[i] ← popcount(src.word[i]); } else { dst.word[i] ← 0; } }", "example": "VPOPCNTW zmm1, zmm2/m512"}
{"mnemonic": "vpcompressw", "architecture": "x86", "full_name": "Store Sparse Packed Word Integer Values", "summary": "Compresses active words from ZMM to memory.", "syntax": "VPCOMPRESSW m512 {k1}, zmm1", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 63 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 63", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VBMI2", "operands": [{"name": "dest", "type": "m512", "desc": "512-bit memory operand"}, {"name": "src", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}], "description": "Compresses active 16-bit word elements from the source ZMM register into contiguous locations in memory, guided by the opmask register k1. Only elements where the corresponding mask bit is set are written to memory in order; unmasked elements are skipped. This is an AVX-512-VBMI2 instruction; no CPU flags are affected.", "pseudocode": "mem_offset ← 0; for i ← 0 to 31 do { if (k1[i]) { [dest + mem_offset] ← src.word[i]; mem_offset ← mem_offset + 2; } }", "example": "VPCOMPRESSW [rbp-64], zmm1"}
{"mnemonic": "vpexpandw", "architecture": "x86", "full_name": "Load Sparse Packed Word Integer Values", "summary": "Expands words from memory into sparse locations in ZMM.", "syntax": "VPEXPANDW zmm1 {k1}, m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 62 /r", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 62", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VBMI2", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src", "type": "m512", "desc": "512-bit memory operand"}], "description": "Expands 16-bit word elements from memory into sparse positions within the destination ZMM register, guided by the opmask register k1. Words are read sequentially from memory and written to destination positions where the corresponding mask bit is set. This is an AVX-512-VBMI2 instruction; no CPU flags are affected.", "pseudocode": "mem_offset ← 0; for i ← 0 to 31 do { if (k1[i]) { dst.word[i] ← [src + mem_offset]; mem_offset ← mem_offset + 2; } else { dst.word[i] ← 0; } }", "example": "VPEXPANDW zmm1, [rbp-64]"}
{"mnemonic": "vpshldw", "architecture": "x86", "full_name": "Packed Shift Left Word Concatenate", "summary": "Funnel shift left of words.", "syntax": "VPSHLDW zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 70 /r /ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 70", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VBMI2", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs a funnel (concatenate and shift) left operation on pairs of 16-bit word elements: the result is (src1 || src2) shifted left by the count specified in imm8 modulo 16. This is an AVX-512-VBMI2 instruction operating on 32 word elements per 512-bit vector. Masking via k1 allows selective updates; no CPU arithmetic flags are modified.", "pseudocode": "for i ← 0 to 31 do { if (k1[i] or not_masked) { combined ← (src1.word[i] << 16) | src2.word[i]; shift_count ← imm8 & 0xF; dst.word[i] ← (combined >> (16 - shift_count)) & 0xFFFF; } }", "example": "VPSHLDW zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpshldq", "architecture": "x86", "full_name": "Packed Shift Left Quadword Concatenate", "summary": "Funnel shift left of quadwords.", "syntax": "VPSHLDQ zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 71 /r /ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 71", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VBMI2", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs a funnel (concatenate and shift) left operation on pairs of 64-bit quadword elements: the result is (src1 || src2) shifted left by the count specified in imm8 modulo 64. This is an AVX-512-VBMI2 instruction operating on 8 quadword elements per 512-bit vector. Masking via k1 allows selective updates; no CPU arithmetic flags are modified.", "pseudocode": "for i ← 0 to 7 do { if (k1[i] or not_masked) { combined_hi ← src1.qword[i]; combined_lo ← src2.qword[i]; shift_count ← imm8 & 0x3F; if (shift_count == 0) { dst.qword[i] ← combined_lo; } else if (shift_count < 64) { dst.qword[i] ← (combined_lo >> (64 - shift_count)) | (combined_hi << shift_count); } else { dst.qword[i] ← combined_hi << (shift_count - 64); } } }", "example": "VPSHLDQ zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpshrdw", "architecture": "x86", "full_name": "Packed Shift Right Word Concatenate", "summary": "Funnel shift right of words.", "syntax": "VPSHRDW zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 72 /r /ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 72", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VBMI2", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs a funnel (concatenate and shift) right operation on pairs of 16-bit word elements: the result is (src1 || src2) shifted right by the count specified in imm8 modulo 16. This is an AVX-512-VBMI2 instruction operating on 32 word elements per 512-bit vector. Masking via k1 allows selective updates; no CPU arithmetic flags are modified.", "pseudocode": "for i ← 0 to 31 do { if (k1[i] or not_masked) { combined ← (src1.word[i] << 16) | src2.word[i]; shift_count ← imm8 & 0xF; dst.word[i] ← (combined >> shift_count) & 0xFFFF; } }", "example": "VPSHRDW zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vpshrdq", "architecture": "x86", "full_name": "Packed Shift Right Quadword Concatenate", "summary": "Funnel shift right of quadwords.", "syntax": "VPSHRDQ zmm1 {k1}, zmm2, zmm3/m512, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F3A.W1 73 /r /ib", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 3A | 73", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VBMI2", "operands": [{"name": "dest", "type": "zmm1", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}, {"name": "src3", "type": "imm8", "desc": "8-bit signed immediate"}], "description": "Performs a funnel shift right operation on packed 64-bit quadwords across two source operands. Each 64-bit element in zmm2 is concatenated with the corresponding element in zmm3/m512, and the result is shifted right by the amount specified in imm8 (modulo 64), with the lower bits written to zmm1. No flags are affected by this instruction.", "pseudocode": "for i = 0 to 7 {\n  concatenated = (zmm3[i+1] << 64) | zmm2[i];\n  zmm1[i] = (concatenated >> (imm8 % 64)) & 0xFFFFFFFFFFFFFFFF;\n}", "example": "VPSHRDQ zmm1, zmm2, zmm3/m512, 3"}
{"mnemonic": "vp2intersectq", "architecture": "x86", "full_name": "Compute Intersection Pair Quadwords", "summary": "Computes intersection of two ZMM registers into mask pair.", "syntax": "VP2INTERSECTQ k1+1, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.NDS.512.F2.0F38.W1 68 /r", "visual_parts": [], "binary_pattern": "EVEX | F2 | 0F | 38 | 68", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "extension": "AVX-512-VP2INTERSECT", "operands": [{"name": "dest", "type": "k1+1", "desc": "Opmask register pair (k1 and the next adjacent register)"}, {"name": "src1", "type": "zmm2", "desc": "512-bit ZMM AVX-512 register"}, {"name": "src2", "type": "zmm3/m512", "desc": "512-bit ZMM AVX-512 register or Memory operand"}], "description": "Computes the intersection of two sets of 64-bit quadwords, producing a pair of opmask registers (k1 and k1+1) indicating which elements from the first operand have matches in the second operand. The instruction uses special hardware logic to compare quadwords and set mask bits accordingly. No arithmetic flags are affected.", "pseudocode": "for i = 0 to 7 {\n  found_in_src2 = 0;\n  for j = 0 to 7 {\n    if (zmm2[i] == zmm3[j]) {\n      found_in_src2 = 1;\n      break;\n    }\n  }\n  if (found_in_src2) k1[i] = 1; else k1[i] = 0;\n  // k1+1 contains further comparison results or inverted results\n}", "example": "VP2INTERSECTQ k1+1, zmm2, zmm3/m512"}
{"mnemonic": "tdpbuud", "architecture": "x86", "full_name": "Tile Dot Product Byte Unsigned Unsigned Doubleword", "summary": "Matrix multiply (Unsigned * Unsigned) accumulating to Int32.", "syntax": "TDPBUUD tmm1, tmm2, tmm3", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.NP.0F38.W0 5E 11:rrr:bbb", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AMX-INT8", "operands": [{"name": "dest", "type": "tmm1", "desc": "AMX tile register"}, {"name": "src1", "type": "tmm2", "desc": "AMX tile register"}, {"name": "src2", "type": "tmm3", "desc": "AMX tile register"}], "description": "Performs a tile-based dot product operation on 8×32 unsigned byte matrix tmm2 and 32×8 unsigned byte matrix tmm3, accumulating the 32-bit unsigned results into 8×8 doubleword tile tmm1. The instruction uses specialized AMX hardware for fast matrix multiplication without affecting EFLAGS.", "pseudocode": "for i = 0 to 7 {\n  for j = 0 to 7 {\n    product = 0;\n    for k = 0 to 31 {\n      product += (unsigned)tmm2[i][k] * (unsigned)tmm3[k][j];\n    }\n    tmm1[i][j] += product;\n  }\n}", "example": "TDPBUUD tmm1, tmm2, tmm3"}
{"mnemonic": "tdpbusd", "architecture": "x86", "full_name": "Tile Dot Product Byte Unsigned Signed Doubleword", "summary": "Matrix multiply (Unsigned * Signed) accumulating to Int32.", "syntax": "TDPBUSD tmm1, tmm2, tmm3", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.66.0F38.W0 5E 11:rrr:bbb", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AMX-INT8", "operands": [{"name": "dest", "type": "tmm1", "desc": "AMX tile register"}, {"name": "src1", "type": "tmm2", "desc": "AMX tile register"}, {"name": "src2", "type": "tmm3", "desc": "AMX tile register"}], "description": "Performs a tile-based dot product operation multiplying 8×32 unsigned byte matrix tmm2 by 32×8 signed byte matrix tmm3, accumulating the 32-bit signed results into 8×8 doubleword tile tmm1. This is the unsigned-by-signed variant of tile dot product, useful for mixed-precision neural network operations without affecting EFLAGS.", "pseudocode": "for i = 0 to 7 {\n  for j = 0 to 7 {\n    product = 0;\n    for k = 0 to 31 {\n      product += (unsigned)tmm2[i][k] * (signed)tmm3[k][j];\n    }\n    tmm1[i][j] += product;\n  }\n}", "example": "TDPBUSD tmm1, tmm2, tmm3"}
{"mnemonic": "tileloaddt1", "architecture": "x86", "full_name": "Load Tile Data (T1 Hint)", "summary": "Loads data into an AMX tile register with T1 hint.", "syntax": "TILELOADDT1 tmm1, m", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.66.0F38.W0 4B !(11):rrr:100", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "extension": "AMX-TILE", "operands": [{"name": "dest", "type": "tmm1", "desc": "AMX tile register"}, {"name": "src", "type": "m", "desc": "Memory operand"}], "description": "Loads tile data from memory into an AMX tile register with a T1 (temporal) cache hint, indicating the data is likely to be used soon. The memory operand is typically addressed via a base register and optional displacement, and the tile dimensions are pre-configured via TILECONFIG. No flags are affected.", "pseudocode": "tmm1 = load_from_memory_with_t1_hint(m);\n// Tile shape determined by previously configured palette and TILECFG register", "example": "TILELOADDT1 tmm1, [rbp-8]"}
{"mnemonic": "aesdecwide128kl", "architecture": "x86", "full_name": "AES Decrypt Wide 128-bit Key Locker", "summary": "Decrypts 8 blocks using 128-bit Key Locker handle.", "syntax": "AESDECWIDE128KL m128", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 D8 !(11):001:bbb", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | D8", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "KEYLOCKER_WIDE", "operands": [{"name": "dest", "type": "m128", "desc": "128-bit memory operand"}], "description": "Decrypts 8 AES blocks (128 bits each) in parallel using a 128-bit Key Locker encrypted key handle stored at the memory operand. The ciphertext blocks are implicit in XMM0-XMM7 (input) and plaintext results are written back to XMM0-XMM7 (output). The ZF flag is set to 0 on success or 1 if the key handle is invalid.", "pseudocode": "key_handle = load_from_memory_128bit(m128);\nif (key_handle_invalid(key_handle)) {\n  ZF = 1;\n} else {\n  for i = 0 to 7 {\n    XMM[i] = AES_decrypt_block(XMM[i], key_handle);\n  }\n  ZF = 0;\n}", "example": "AESDECWIDE128KL [rbp-16]"}
{"mnemonic": "aesdecwide256kl", "architecture": "x86", "full_name": "AES Decrypt Wide 256-bit Key Locker", "summary": "Decrypts 8 blocks using 256-bit Key Locker handle.", "syntax": "AESDECWIDE256KL m128", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 D8 !(11):011:bbb", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | D8", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "KEYLOCKER_WIDE", "operands": [{"name": "dest", "type": "m128", "desc": "128-bit memory operand"}], "description": "Decrypts 8 AES blocks (128 bits each) in parallel using a 256-bit Key Locker encrypted key handle stored at the memory operand. The ciphertext blocks are implicit in XMM0-XMM7 (input) and plaintext results are written back to XMM0-XMM7 (output). The ZF flag is set to 0 on success or 1 if the key handle is invalid.", "pseudocode": "key_handle = load_from_memory_128bit(m128);\nif (key_handle_invalid(key_handle)) {\n  ZF = 1;\n} else {\n  for i = 0 to 7 {\n    XMM[i] = AES_decrypt_block_256bit_key(XMM[i], key_handle);\n  }\n  ZF = 0;\n}", "example": "AESDECWIDE256KL [rbp-16]"}
{"mnemonic": "encodekey256", "architecture": "x86", "full_name": "Encode 256-bit Key", "summary": "Wraps a 256-bit AES key into a handle.", "syntax": "ENCODEKEY256 r32, r32", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 FB", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | FB", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "KEYLOCKER", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}], "description": "Wraps a 256-bit AES key (provided in XMM registers via the second operand's implicit XMM context) into an encrypted handle stored in memory. This instruction is part of Intel Key Locker and requires the KEYLOCKER CPU feature. It performs cryptographic key material encoding that protects against certain side-channel attacks. No flags are modified.", "pseudocode": "handle ← AES_KW_Wrap_256bit(key_material)\ndest ← handle\n// XMM registers implicitly contain the 256-bit key to be encoded", "example": "ENCODEKEY256 eax, eax"}
{"mnemonic": "aesenc256kl", "architecture": "x86", "full_name": "AES Encrypt 256-bit Key Locker", "summary": "Encrypts data using 256-bit Key Locker handle.", "syntax": "AESENC256KL m128, xmm", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 DE !(11):rrr:bbb", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | DC", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "KEYLOCKER", "operands": [{"name": "dest", "type": "m128", "desc": "128-bit memory operand"}, {"name": "src", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}], "description": "Encrypts a 128-bit plaintext block (from XMM register) using a 256-bit Key Locker handle (from memory), storing the ciphertext back into the XMM register. This requires KEYLOCKER support and performs AES-256 encryption with hardware-protected key material. Sets ZF to indicate success/failure of the operation; other flags undefined.", "pseudocode": "handle ← [dest]\nciphertext ← AES_Encrypt_256(plaintext=src, key_handle=handle)\nsrc ← ciphertext\nZF ← (operation_successful ? 0 : 1)", "example": "AESENC256KL [rbp-16], xmm0"}
{"mnemonic": "aesdec256kl", "architecture": "x86", "full_name": "AES Decrypt 256-bit Key Locker", "summary": "Decrypts data using 256-bit Key Locker handle.", "syntax": "AESDEC256KL m128, xmm", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 DF !(11):rrr:bbb", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | DD", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "KEYLOCKER", "operands": [{"name": "dest", "type": "m128", "desc": "128-bit memory operand"}, {"name": "src", "type": "xmm", "desc": "128-bit SSE/AVX register (XMM)"}], "description": "Decrypts a 128-bit ciphertext block (from XMM register) using a 256-bit Key Locker handle (from memory), storing the plaintext back into the XMM register. This requires KEYLOCKER support and performs AES-256 decryption with hardware-protected key material. Sets ZF to indicate success/failure of the operation; other flags undefined.", "pseudocode": "handle ← [dest]\nplaintext ← AES_Decrypt_256(ciphertext=src, key_handle=handle)\nsrc ← plaintext\nZF ← (operation_successful ? 0 : 1)", "example": "AESDEC256KL [rbp-16], xmm0"}
{"mnemonic": "enqcmds", "architecture": "x86", "full_name": "Enqueue Command Supervisor", "summary": "Writes a command to a device (Supervisor mode).", "syntax": "ENQCMDS r32, m512", "encoding": {"format": "Legacy", "hex_opcode": "F3 0F 38 F8", "visual_parts": [], "binary_pattern": "F3 | 0F | 38 | F8", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "ENQCMD", "operands": [{"name": "dest", "type": "r32", "desc": "32-bit general-purpose register (e.g. EAX)"}, {"name": "src", "type": "m512", "desc": "512-bit memory operand"}], "description": "Enqueues a 512-bit command descriptor to a device queue in supervisor mode only (requires CPL=0). The command is read from memory and written to a device via a memory-mapped queue; requires ENQCMD CPU feature. Sets ZF and CF flags: ZF=1 if queue is full, CF=1 if access denied or invalid descriptor format. Other flags undefined.", "pseudocode": "if (CPL != 0) { fault ← true; return; }\ndescriptor ← [src]\nstatus ← enqueue_device_command(descriptor)\ndest ← status\nZF ← (queue_full ? 1 : 0)\nCF ← (access_denied_or_invalid ? 1 : 0)", "example": "ENQCMDS eax, [rbp-64]"}
{"mnemonic": "xsusldtrk", "architecture": "x86", "full_name": "Suspend Tracking Load Addresses", "summary": "Suspends tracking of load addresses in a TSX suspend-tracking region (resumed with XRESLDTRK).", "syntax": "XSUSLDTRK", "encoding": {"format": "Legacy", "hex_opcode": "F2 0F 01 E8", "visual_parts": [], "binary_pattern": "F2 | 0F | 01 | E8", "bit_positions": "+0 | +1 | +2 | +3"}, "extension": "TSXLDTRK", "operands": [], "description": "Suspends or resumes tracking of load operations within a TSX (Transactional Synchronization Extensions) transaction. Requires TSX support and TSX_LDTRK feature flag. Does not modify any flags. This instruction helps fine-tune transaction conflict detection by toggling whether loads are monitored for abort conditions.", "pseudocode": "if (in_transaction) {\n  TSX_load_tracking_enabled ← !TSX_load_tracking_enabled\n}", "example": "XSUSLDTRK"}
{"mnemonic": "syscall", "architecture": "x86", "full_name": "System Call", "summary": "Fast call to privilege level 0 system procedures.", "syntax": "SYSCALL", "encoding": {"format": "System", "hex_opcode": "0F 05", "length": "2", "visual_parts": [], "binary_pattern": "0F | 05", "bit_positions": "+0 | +1"}, "operands": [], "extension": "System (64-bit)", "description": "Fast low-latency call to a privilege level 0 system procedure (64-bit mode only). Loads the system call target address from IA32_LSTAR MSR, saves the return address (RIP+2) into RCX, and sets RFLAGS according to IA32_FMASK MSR. Does not set any condition flags; acts as a serializing operation. Requires 64-bit mode and supervisor software setup.", "pseudocode": "RCX ← RIP + 2\nRIP ← IA32_LSTAR\nRFLAGS ← RFLAGS & ~IA32_FMASK\n// Transition to CPL 0 with user code segment", "example": "SYSCALL"}
{"mnemonic": "sysret", "architecture": "x86", "full_name": "Return from System Call", "summary": "Fast return to privilege level 3 user code.", "syntax": "SYSRET", "encoding": {"format": "System", "hex_opcode": "0F 07", "length": "2", "visual_parts": [], "binary_pattern": "0F | 07", "bit_positions": "+0 | +1"}, "operands": [], "extension": "System (64-bit)", "description": "Fast return from a system call invoked via SYSCALL, transitioning from CPL 0 back to CPL 3. Restores the user RIP from RCX and re-enables interrupts/flags as appropriate. Requires 64-bit mode and can only be executed at CPL 0. Does not modify condition flags; serializes instruction stream.", "pseudocode": "RIP ← RCX\n// Transition to CPL 3 with user code segment\n// Restore RFLAGS state (interrupts re-enabled per IA32_FMASK)", "example": "SYSRET"}
{"mnemonic": "sal", "architecture": "x86", "full_name": "Shift Arithmetic Left", "summary": "Shifts bits left (Alias for SHL).", "syntax": "SAL r/m, imm8", "encoding": {"format": "Legacy", "hex_opcode": "C1 /4", "length": "3+", "visual_parts": [], "binary_pattern": "C1 | ModRM", "bit_positions": "+0 | +1"}, "operands": [{"name": "dest", "desc": "Reg/Mem"}, {"name": "count", "desc": "Immediate"}], "extension": "Base", "description": "Shifts the bits of the destination operand left by the count specified (immediate or ECX). Each shifted-out bit is moved into CF; vacated bits are filled with zeros. Sets OF if the sign bit changed after the shift, CF from the last shifted bit, ZF and SF based on the result, and PF is undefined. Available in 8/16/32/64-bit variants across all modes.", "pseudocode": "if (count > 0) {\n  temp_cf ← dest >> (operand_width - count)\n  dest ← (dest << count) & ((1 << operand_width) - 1)\n  CF ← temp_cf\n  ZF ← (dest == 0 ? 1 : 0)\n  SF ← (dest >> (operand_width - 1)) & 1\n  if (count == 1) { OF ← (SF != CF ? 1 : 0) }\n  else { OF ← undefined }\n  PF ← undefined\n}", "example": "SAL rbx, 3"}
{"mnemonic": "cmpsw", "architecture": "x86", "full_name": "Compare String Word", "summary": "Compares word at [ESI] with [EDI].", "syntax": "CMPSW", "encoding": {"format": "Legacy", "hex_opcode": "A7", "length": "2", "visual_parts": [], "binary_pattern": "66 | A7", "bit_positions": "+0 | +1"}, "operands": [{"name": "DS:[ESI]", "type": "m16", "desc": "First memory operand at DS:ESI (source index register, typically data segment)."}, {"name": "ES:[EDI]", "type": "m16", "desc": "Second memory operand at ES:EDI (destination index register, typically extra segment)."}], "extension": "Base", "description": "Compares a word (16-bit) at memory address [ESI] with a word at [EDI] by performing an implicit subtraction ([ESI] - [EDI]), updates the EFLAGS register with the result, and increments or decrements both ESI and EDI by 2 depending on the direction flag (DF). The comparison affects OF, SF, ZF, AF, PF, and CF flags but does not modify either operand. Often used with repeat prefixes (REP, REPE, REPNE) for string comparison operations.", "pseudocode": "temp ← [ESI] - [EDI];\nOF ← overflow of subtraction;\nSF ← temp[15];\nZF ← (temp == 0);\nAF ← auxiliary carry of subtraction;\nPF ← parity of temp;\nCF ← borrow;\nif (DF == 0) {\n  ESI ← ESI + 2;\n  EDI ← EDI + 2;\n} else {\n  ESI ← ESI - 2;\n  EDI ← EDI - 2;\n}", "example": "CMPSW"}
{"mnemonic": "cmpsd", "architecture": "x86", "full_name": "Compare String Doubleword", "summary": "Compares doubleword at [ESI] with [EDI].", "syntax": "CMPSD", "encoding": {"format": "Legacy", "hex_opcode": "A7", "length": "1", "visual_parts": [], "binary_pattern": "A7", "bit_positions": "+0"}, "operands": [{"name": "DS:[ESI]", "type": "m32", "desc": "First memory operand at DS:ESI (source index register)."}, {"name": "ES:[EDI]", "type": "m32", "desc": "Second memory operand at ES:EDI (destination index register)."}], "extension": "Base", "description": "Compares a doubleword (32-bit) at memory address [ESI] with a doubleword at [EDI] by performing an implicit subtraction ([ESI] - [EDI]), updates the EFLAGS register with the result, and increments or decrements both ESI and EDI by 4 depending on the direction flag (DF). The comparison affects OF, SF, ZF, AF, PF, and CF flags but does not modify either operand. Commonly used in 32-bit protected mode or with repeat prefixes for string operations.", "pseudocode": "temp ← [ESI] - [EDI];\nOF ← overflow of subtraction;\nSF ← temp[31];\nZF ← (temp == 0);\nAF ← auxiliary carry of subtraction;\nPF ← parity of temp;\nCF ← borrow;\nif (DF == 0) {\n  ESI ← ESI + 4;\n  EDI ← EDI + 4;\n} else {\n  ESI ← ESI - 4;\n  EDI ← EDI - 4;\n}", "example": "CMPSD"}
{"mnemonic": "cmpsq", "architecture": "x86", "full_name": "Compare String Quadword", "summary": "Compares quadword at [RSI] with [RDI].", "syntax": "CMPSQ", "encoding": {"format": "Legacy", "hex_opcode": "REX.W + A7", "length": "2", "visual_parts": [], "binary_pattern": "48 | A7", "bit_positions": "+0 | +1"}, "operands": [{"name": "DS:[RSI]", "type": "m64", "desc": "First memory operand at DS:RSI (source index register in 64-bit mode)."}, {"name": "DS:[RDI]", "type": "m64", "desc": "Second memory operand at DS:RDI (destination index register in 64-bit mode)."}], "extension": "Base (64-bit)", "description": "Compares a quadword (64-bit) at memory address [RSI] with a quadword at [RDI] by performing an implicit subtraction ([RSI] - [RDI]), updates the EFLAGS register with the result, and increments or decrements both RSI and RDI by 8 depending on the direction flag (DF). The comparison affects OF, SF, ZF, AF, PF, and CF flags but does not modify either operand. Available only in 64-bit mode; operand size defaults to 64 bits.", "pseudocode": "temp ← [RSI] - [RDI];\nOF ← overflow of subtraction;\nSF ← temp[63];\nZF ← (temp == 0);\nAF ← auxiliary carry of subtraction;\nPF ← parity of temp;\nCF ← borrow;\nif (DF == 0) {\n  RSI ← RSI + 8;\n  RDI ← RDI + 8;\n} else {\n  RSI ← RSI - 8;\n  RDI ← RDI - 8;\n}", "example": "CMPSQ"}
{"mnemonic": "scasw", "architecture": "x86", "full_name": "Scan String Word", "summary": "Compares AX with memory at [EDI].", "syntax": "SCASW", "encoding": {"format": "Legacy", "hex_opcode": "AF", "length": "2", "visual_parts": [], "binary_pattern": "66 | AF", "bit_positions": "+0 | +1"}, "operands": [{"name": "AX", "type": "r16", "desc": "Implicit source register (accumulator) containing the value to be compared."}, {"name": "ES:[EDI]", "type": "m16", "desc": "Memory operand at ES:EDI (destination index register) to be compared against AX."}], "extension": "Base", "description": "Compares the word in AX with a word at memory address [EDI] by performing an implicit subtraction (AX - [EDI]), updates the EFLAGS register with the result, and increments or decrements EDI by 2 depending on the direction flag (DF). The comparison affects OF, SF, ZF, AF, PF, and CF flags but does not modify either operand. Often used with repeat prefixes (REPE, REPNE) for scanning strings in memory.", "pseudocode": "temp ← AX - [EDI];\nOF ← overflow of subtraction;\nSF ← temp[15];\nZF ← (temp == 0);\nAF ← auxiliary carry of subtraction;\nPF ← parity of temp;\nCF ← borrow;\nif (DF == 0) {\n  EDI ← EDI + 2;\n} else {\n  EDI ← EDI - 2;\n}", "example": "SCASW"}
{"mnemonic": "scasd", "architecture": "x86", "full_name": "Scan String Doubleword", "summary": "Compares EAX with memory at [EDI].", "syntax": "SCASD", "encoding": {"format": "Legacy", "hex_opcode": "AF", "length": "1", "visual_parts": [], "binary_pattern": "AF", "bit_positions": "+0"}, "operands": [{"name": "EAX", "type": "r32", "desc": "Implicit source register (accumulator) containing the value to be compared."}, {"name": "ES:[EDI]", "type": "m32", "desc": "Memory operand at ES:EDI (destination index register) to be compared against EAX."}], "extension": "Base", "description": "Compares the doubleword in EAX with a doubleword at memory address [EDI] by performing an implicit subtraction (EAX - [EDI]), updates the EFLAGS register with the result, and increments or decrements EDI by 4 depending on the direction flag (DF). The comparison affects OF, SF, ZF, AF, PF, and CF flags but does not modify either operand. Commonly used in 32-bit protected mode with repeat prefixes for memory scanning.", "pseudocode": "temp ← EAX - [EDI];\nOF ← overflow of subtraction;\nSF ← temp[31];\nZF ← (temp == 0);\nAF ← auxiliary carry of subtraction;\nPF ← parity of temp;\nCF ← borrow;\nif (DF == 0) {\n  EDI ← EDI + 4;\n} else {\n  EDI ← EDI - 4;\n}", "example": "SCASD"}
{"mnemonic": "scasq", "architecture": "x86", "full_name": "Scan String Quadword", "summary": "Compares RAX with memory at [RDI].", "syntax": "SCASQ", "encoding": {"format": "Legacy", "hex_opcode": "REX.W + AF", "length": "2", "visual_parts": [], "binary_pattern": "48 | AF", "bit_positions": "+0 | +1"}, "operands": [{"name": "RAX", "type": "r64", "desc": "Implicit source register (accumulator in 64-bit mode) containing the value to be compared."}, {"name": "DS:[RDI]", "type": "m64", "desc": "Memory operand at DS:RDI (destination index register in 64-bit mode) to be compared against RAX."}], "extension": "Base (64-bit)", "description": "Compares the quadword in RAX with a quadword at memory address [RDI] by performing an implicit subtraction (RAX - [RDI]), updates the EFLAGS register with the result, and increments or decrements RDI by 8 depending on the direction flag (DF). The comparison affects OF, SF, ZF, AF, PF, and CF flags but does not modify either operand. Available only in 64-bit mode; commonly used with repeat prefixes for scanning 64-bit values in memory.", "pseudocode": "temp ← RAX - [RDI];\nOF ← overflow of subtraction;\nSF ← temp[63];\nZF ← (temp == 0);\nAF ← auxiliary carry of subtraction;\nPF ← parity of temp;\nCF ← borrow;\nif (DF == 0) {\n  RDI ← RDI + 8;\n} else {\n  RDI ← RDI - 8;\n}", "example": "SCASQ"}
{"mnemonic": "lodsw", "architecture": "x86", "full_name": "Load String Word", "summary": "Loads word from [ESI] into AX.", "syntax": "LODSW", "encoding": {"format": "Legacy", "hex_opcode": "AD", "length": "2", "visual_parts": [], "binary_pattern": "66 | AC", "bit_positions": "+0 | +1"}, "operands": [{"name": "AX", "type": "r16", "desc": "Implicit destination register (accumulator) where the loaded word is stored."}, {"name": "DS:[ESI]", "type": "m16", "desc": "Memory operand at DS:ESI (source index register) from which the word is loaded."}], "extension": "Base", "description": "Loads a word (16-bit) from memory at address [ESI] into the AX register, then increments or decrements ESI by 2 depending on the direction flag (DF). No flags are affected by this instruction. Often used with repeat prefix (REP) to load successive words from memory into AX, though the repeat would only load the final value.", "pseudocode": "AX ← [ESI];\nif (DF == 0) {\n  ESI ← ESI + 2;\n} else {\n  ESI ← ESI - 2;\n}", "example": "LODSW"}
{"mnemonic": "lodsd", "architecture": "x86", "full_name": "Load String Doubleword", "summary": "Loads doubleword from [ESI] into EAX.", "syntax": "LODSD", "encoding": {"format": "Legacy", "hex_opcode": "AD", "length": "1", "visual_parts": [], "binary_pattern": "AC", "bit_positions": "+0"}, "operands": [{"name": "EAX", "type": "r32", "desc": "Implicit destination register (accumulator) where the loaded doubleword is stored."}, {"name": "DS:[ESI]", "type": "m32", "desc": "Memory operand at DS:ESI (source index register) from which the doubleword is loaded."}], "extension": "Base", "description": "Loads a doubleword (32-bit) from memory at address [ESI] into the EAX register, then increments or decrements ESI by 4 depending on the direction flag (DF). No flags are affected by this instruction. Commonly used in 32-bit protected mode or with repeat prefix (REP) to load successive doublewords, though the repeat would only retain the final value in EAX.", "pseudocode": "EAX ← [ESI];\nif (DF == 0) {\n  ESI ← ESI + 4;\n} else {\n  ESI ← ESI - 4;\n}", "example": "LODSD"}
{"mnemonic": "lodsq", "architecture": "x86", "full_name": "Load String Quadword", "summary": "Loads quadword from [RSI] into RAX.", "syntax": "LODSQ", "encoding": {"format": "Legacy", "hex_opcode": "REX.W + AD", "length": "2", "visual_parts": [], "binary_pattern": "48 | AC", "bit_positions": "+0 | +1"}, "operands": [], "extension": "Base (64-bit)", "description": "Loads a 64-bit value from memory at [RSI] into RAX, then adjusts RSI by ±8 based on the direction flag (DF). This is a string primitive operation commonly used in loops with REP prefix. No flags are affected by this instruction itself.", "pseudocode": "RAX ← [RSI];\nif (DF == 0) RSI ← RSI + 8;\nelse RSI ← RSI - 8;", "example": "LODSQ"}
{"mnemonic": "stosw", "architecture": "x86", "full_name": "Store String Word", "summary": "Stores AX to memory at [EDI].", "syntax": "STOSW", "encoding": {"format": "Legacy", "hex_opcode": "AB", "length": "2", "visual_parts": [], "binary_pattern": "66 | AA", "bit_positions": "+0 | +1"}, "operands": [], "extension": "Base", "description": "Stores the 16-bit value in AX to memory at [EDI], then adjusts EDI by ±2 based on the direction flag (DF). This is a string primitive typically used with REP prefix for bulk memory fills. No flags are affected.", "pseudocode": "[EDI] ← AX;\nif (DF == 0) EDI ← EDI + 2;\nelse EDI ← EDI - 2;", "example": "STOSW"}
{"mnemonic": "stosd", "architecture": "x86", "full_name": "Store String Doubleword", "summary": "Stores EAX to memory at [EDI].", "syntax": "STOSD", "encoding": {"format": "Legacy", "hex_opcode": "AB", "length": "1", "visual_parts": [], "binary_pattern": "AA", "bit_positions": "+0"}, "operands": [], "extension": "Base", "description": "Stores the 32-bit value in EAX to memory at [EDI], then adjusts EDI by ±4 based on the direction flag (DF). This is a string primitive commonly used with REP prefix for fast memory initialization. No flags are affected.", "pseudocode": "[EDI] ← EAX;\nif (DF == 0) EDI ← EDI + 4;\nelse EDI ← EDI - 4;", "example": "STOSD"}
{"mnemonic": "stosq", "architecture": "x86", "full_name": "Store String Quadword", "summary": "Stores RAX to memory at [RDI].", "syntax": "STOSQ", "encoding": {"format": "Legacy", "hex_opcode": "REX.W + AB", "length": "2", "visual_parts": [], "binary_pattern": "48 | AA", "bit_positions": "+0 | +1"}, "operands": [], "extension": "Base (64-bit)", "description": "Stores the 64-bit value in RAX to memory at [RDI], then adjusts RDI by ±8 based on the direction flag (DF). Available only in 64-bit mode, this is a string primitive typically used with REP prefix for bulk memory operations. No flags are affected.", "pseudocode": "[RDI] ← RAX;\nif (DF == 0) RDI ← RDI + 8;\nelse RDI ← RDI - 8;", "example": "STOSQ"}
{"mnemonic": "movsw", "architecture": "x86", "full_name": "Move String Word", "summary": "Moves word from [ESI] to [EDI].", "syntax": "MOVSW", "encoding": {"format": "Legacy", "hex_opcode": "A5", "length": "2", "visual_parts": [], "binary_pattern": "66 | A5", "bit_positions": "+0 | +1"}, "operands": [], "extension": "Base", "description": "Copies a 16-bit word from memory at [ESI] to memory at [EDI], then adjusts both ESI and EDI by ±2 based on the direction flag (DF). This is a string primitive commonly used with REP prefix for memory-to-memory block moves. No flags are affected.", "pseudocode": "[EDI] ← [ESI];\nif (DF == 0) { ESI ← ESI + 2; EDI ← EDI + 2; }\nelse { ESI ← ESI - 2; EDI ← EDI - 2; }", "example": "MOVSW"}
{"mnemonic": "movsd", "architecture": "x86", "full_name": "Move String Doubleword", "summary": "Moves doubleword from [ESI] to [EDI].", "syntax": "MOVSD", "encoding": {"format": "Legacy", "hex_opcode": "A5", "length": "1", "visual_parts": [], "binary_pattern": "A5", "bit_positions": "+0"}, "operands": [], "extension": "Base", "description": "Copies a 32-bit doubleword from memory at [ESI] to memory at [EDI], then adjusts both ESI and EDI by ±4 based on the direction flag (DF). This is a string primitive frequently used with REP prefix for fast memory copy operations. No flags are affected.", "pseudocode": "[EDI] ← [ESI];\nif (DF == 0) { ESI ← ESI + 4; EDI ← EDI + 4; }\nelse { ESI ← ESI - 4; EDI ← EDI - 4; }", "example": "MOVSD"}
{"mnemonic": "movsq", "architecture": "x86", "full_name": "Move String Quadword", "summary": "Moves quadword from [RSI] to [RDI].", "syntax": "MOVSQ", "encoding": {"format": "Legacy", "hex_opcode": "REX.W + A5", "length": "2", "visual_parts": [], "binary_pattern": "48 | A5", "bit_positions": "+0 | +1"}, "operands": [], "extension": "Base (64-bit)", "description": "Copies a 64-bit quadword from memory at [RSI] to memory at [RDI], then adjusts both RSI and RDI by ±8 based on the direction flag (DF). Available only in 64-bit mode, this string primitive is commonly used with REP prefix for optimized memory block copies. No flags are affected.", "pseudocode": "[RDI] ← [RSI];\nif (DF == 0) { RSI ← RSI + 8; RDI ← RDI + 8; }\nelse { RSI ← RSI - 8; RDI ← RDI - 8; }", "example": "MOVSQ"}
{"mnemonic": "insw", "architecture": "x86", "full_name": "Input String Word from Port", "summary": "Reads word from I/O port to memory at [EDI].", "syntax": "INSW", "encoding": {"format": "Legacy", "hex_opcode": "6D", "length": "2", "visual_parts": [], "binary_pattern": "66 | 6D", "bit_positions": "+0 | +1"}, "operands": [], "extension": "Base", "description": "Reads a 16-bit word from the I/O port specified in DX into memory at [EDI], then adjusts EDI by ±2 based on the direction flag (DF). This instruction is privileged and typically used with REP prefix for bulk I/O input operations. No flags are affected.", "pseudocode": "[EDI] ← IO_PORT[DX];\nif (DF == 0) EDI ← EDI + 2;\nelse EDI ← EDI - 2;", "example": "INSW"}
{"mnemonic": "insd", "architecture": "x86", "full_name": "Input String Doubleword from Port", "summary": "Reads doubleword from I/O port to memory at [EDI].", "syntax": "INSD", "encoding": {"format": "Legacy", "hex_opcode": "6D", "length": "1", "visual_parts": [], "binary_pattern": "6D", "bit_positions": "+0"}, "operands": [{"name": "DX", "type": "implicit", "desc": "The 16-bit port address register, implicitly selects the I/O port."}, {"name": "EDI", "type": "implicit", "desc": "The destination memory address register; auto-incremented or auto-decremented based on DF."}], "extension": "Base", "description": "Reads a 32-bit doubleword from the I/O port specified by the DX register and stores it in memory at the linear address [EDI]. The EDI register is then incremented or decremented based on the DF (Direction Flag); DF=0 increments EDI by 4, DF=1 decrements by 4. This instruction is typically used within a REP prefix loop for block I/O transfers and requires I/O privilege level in protected mode.", "pseudocode": "memory[EDI] ← IO_PORT[DX];\nif (DF == 0) {\n  EDI ← EDI + 4;\n} else {\n  EDI ← EDI - 4;\n}", "example": "INSD"}
{"mnemonic": "outsw", "architecture": "x86", "full_name": "Output String Word to Port", "summary": "Writes word from memory at [ESI] to I/O port.", "syntax": "OUTSW", "encoding": {"format": "Legacy", "hex_opcode": "6F", "length": "2", "visual_parts": [], "binary_pattern": "66 | 6F", "bit_positions": "+0 | +1"}, "operands": [{"name": "DX", "type": "implicit", "desc": "The 16-bit port address register, implicitly selects the I/O port."}, {"name": "ESI", "type": "implicit", "desc": "The source memory address register; auto-incremented or auto-decremented based on DF."}], "extension": "Base", "description": "Reads a 16-bit word from memory at the linear address [ESI] and writes it to the I/O port specified by the DX register. The ESI register is then incremented or decremented based on the DF flag; DF=0 increments ESI by 2, DF=1 decrements by 2. This instruction is typically used within a REP prefix loop for block I/O transfers and requires I/O privilege level in protected mode.", "pseudocode": "IO_PORT[DX] ← memory[ESI];\nif (DF == 0) {\n  ESI ← ESI + 2;\n} else {\n  ESI ← ESI - 2;\n}", "example": "OUTSW"}
{"mnemonic": "outsd", "architecture": "x86", "full_name": "Output String Doubleword to Port", "summary": "Writes doubleword from memory at [ESI] to I/O port.", "syntax": "OUTSD", "encoding": {"format": "Legacy", "hex_opcode": "6F", "length": "1", "visual_parts": [], "binary_pattern": "6F", "bit_positions": "+0"}, "operands": [{"name": "DX", "type": "implicit", "desc": "The 16-bit port address register, implicitly selects the I/O port."}, {"name": "ESI", "type": "implicit", "desc": "The source memory address register; auto-incremented or auto-decremented based on DF."}], "extension": "Base", "description": "Reads a 32-bit doubleword from memory at the linear address [ESI] and writes it to the I/O port specified by the DX register. The ESI register is then incremented or decremented based on the DF flag; DF=0 increments ESI by 4, DF=1 decrements by 4. This instruction is typically used within a REP prefix loop for block I/O transfers and requires I/O privilege level in protected mode.", "pseudocode": "IO_PORT[DX] ← memory[ESI];\nif (DF == 0) {\n  ESI ← ESI + 4;\n} else {\n  ESI ← ESI - 4;\n}", "example": "OUTSD"}
{"mnemonic": "fld1", "architecture": "x86", "full_name": "Load Constant 1.0", "summary": "Pushes +1.0 onto the FPU register stack.", "syntax": "FLD1", "encoding": {"format": "Legacy", "hex_opcode": "D9 E8", "length": "2", "visual_parts": [], "binary_pattern": "D9 | E8", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Decrements the FPU stack pointer (ST(7)→ST(0)), then loads the constant +1.0 (extended precision double) into the top of the x87 FPU register stack (ST(0)). The instruction sets the C1 flag to 0 and leaves other status flags unchanged unless a stack overflow occurs (C0, C2, C3 may be set on exception). No CPU integer flags are affected.", "pseudocode": "FPU_TOP ← FPU_TOP - 1;\nif (FPU_TOP overflow) {\n  raise FPU_EXCEPTION;\n}\nST(0) ← +1.0;", "example": "FLD1"}
{"mnemonic": "fldz", "architecture": "x86", "full_name": "Load Constant +0.0", "summary": "Pushes +0.0 onto the FPU register stack.", "syntax": "FLDZ", "encoding": {"format": "Legacy", "hex_opcode": "D9 EE", "length": "2", "visual_parts": [], "binary_pattern": "D9 | EE", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Decrements the FPU stack pointer (ST(7)→ST(0)), then loads the constant +0.0 (extended precision double) into the top of the x87 FPU register stack (ST(0)). The instruction sets the C1 flag to 0 and leaves other status flags unchanged unless a stack overflow occurs. No CPU integer flags are affected.", "pseudocode": "FPU_TOP ← FPU_TOP - 1;\nif (FPU_TOP overflow) {\n  raise FPU_EXCEPTION;\n}\nST(0) ← +0.0;", "example": "FLDZ"}
{"mnemonic": "fldpi", "architecture": "x86", "full_name": "Load Constant Pi", "summary": "Pushes Pi onto the FPU register stack.", "syntax": "FLDPI", "encoding": {"format": "Legacy", "hex_opcode": "D9 EB", "length": "2", "visual_parts": [], "binary_pattern": "D9 | EB", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Decrements the FPU stack pointer (ST(7)→ST(0)), then loads the constant Pi (π ≈ 3.14159265..., extended precision) into the top of the x87 FPU register stack (ST(0)). The instruction sets the C1 flag to 0 and leaves other status flags unchanged unless a stack overflow occurs. No CPU integer flags are affected.", "pseudocode": "FPU_TOP ← FPU_TOP - 1;\nif (FPU_TOP overflow) {\n  raise FPU_EXCEPTION;\n}\nST(0) ← π;", "example": "FLDPI"}
{"mnemonic": "fldl2e", "architecture": "x86", "full_name": "Load Constant log2(e)", "summary": "Pushes log2(e) onto the FPU register stack.", "syntax": "FLDL2E", "encoding": {"format": "Legacy", "hex_opcode": "D9 EA", "length": "2", "visual_parts": [], "binary_pattern": "D9 | EA", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Decrements the FPU stack pointer (ST(7)→ST(0)), then loads the constant log₂(e) (≈ 1.44269504..., extended precision) into the top of the x87 FPU register stack (ST(0)). This constant is useful for logarithm and exponential calculations. The instruction sets the C1 flag to 0 and leaves other status flags unchanged unless a stack overflow occurs.", "pseudocode": "FPU_TOP ← FPU_TOP - 1;\nif (FPU_TOP overflow) {\n  raise FPU_EXCEPTION;\n}\nST(0) ← log₂(e);", "example": "FLDL2E"}
{"mnemonic": "fldl2t", "architecture": "x86", "full_name": "Load Constant log2(10)", "summary": "Pushes log2(10) onto the FPU register stack.", "syntax": "FLDL2T", "encoding": {"format": "Legacy", "hex_opcode": "D9 E9", "length": "2", "visual_parts": [], "binary_pattern": "D9 | E9", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Decrements the FPU stack pointer (ST(7)→ST(0)), then loads the constant log₂(10) (≈ 3.32192809..., extended precision) into the top of the x87 FPU register stack (ST(0)). This constant is useful for base-10 logarithm calculations. The instruction sets the C1 flag to 0 and leaves other status flags unchanged unless a stack overflow occurs.", "pseudocode": "FPU_TOP ← FPU_TOP - 1;\nif (FPU_TOP overflow) {\n  raise FPU_EXCEPTION;\n}\nST(0) ← log₂(10);", "example": "FLDL2T"}
{"mnemonic": "fldlg2", "architecture": "x86", "full_name": "Load Constant log10(2)", "summary": "Pushes log10(2) onto the FPU register stack.", "syntax": "FLDLG2", "encoding": {"format": "Legacy", "hex_opcode": "D9 EC", "length": "2", "visual_parts": [], "binary_pattern": "D9 | EC", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Pushes the constant log₁₀(2) ≈ 0.30103 onto the FPU register stack, incrementing the stack pointer (TOP). This is a zero-operand x87 FPU instruction that loads a precomputed constant into ST(0). No flags are modified by this instruction.", "pseudocode": "TOP ← (TOP - 1) mod 8; ST(0) ← log10(2);", "example": "FLDLG2"}
{"mnemonic": "fldln2", "architecture": "x86", "full_name": "Load Constant ln(2)", "summary": "Pushes ln(2) onto the FPU register stack.", "syntax": "FLDLN2", "encoding": {"format": "Legacy", "hex_opcode": "D9 ED", "length": "2", "visual_parts": [], "binary_pattern": "D9 | ED", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Pushes the constant ln(2) ≈ 0.69315 onto the FPU register stack, incrementing the stack pointer (TOP). This is a zero-operand x87 FPU instruction that loads a precomputed constant into ST(0). No flags are modified by this instruction.", "pseudocode": "TOP ← (TOP - 1) mod 8; ST(0) ← ln(2);", "example": "FLDLN2"}
{"mnemonic": "fincstp", "architecture": "x86", "full_name": "Increment Stack-Top Pointer", "summary": "Increments the TOP field in the FPU status word.", "syntax": "FINCSTP", "encoding": {"format": "Legacy", "hex_opcode": "D9 F7", "length": "2", "visual_parts": [], "binary_pattern": "D9 | F7", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Increments the TOP field (bits 13:11) of the x87 FPU status word, rotating the register stack pointer forward by one position. This is a zero-operand instruction that does not modify CPU EFLAGS. It is used to manually adjust the FPU stack pointer without popping data.", "pseudocode": "TOP ← (TOP + 1) mod 8;", "example": "FINCSTP"}
{"mnemonic": "fdecstp", "architecture": "x86", "full_name": "Decrement Stack-Top Pointer", "summary": "Decrements the TOP field in the FPU status word.", "syntax": "FDECSTP", "encoding": {"format": "Legacy", "hex_opcode": "D9 F6", "length": "2", "visual_parts": [], "binary_pattern": "D9 | F6", "bit_positions": "+0 | +1"}, "operands": [], "extension": "x87 FPU", "description": "Decrements the TOP field (bits 13:11) of the x87 FPU status word, rotating the register stack pointer backward by one position. This is a zero-operand instruction that does not modify CPU EFLAGS. It is used to manually adjust the FPU stack pointer without pushing data.", "pseudocode": "TOP ← (TOP - 1) mod 8;", "example": "FDECSTP"}
{"mnemonic": "ffree", "architecture": "x86", "full_name": "Free Floating-Point Register", "summary": "Sets the tag for ST(i) to empty.", "syntax": "FFREE ST(i)", "encoding": {"format": "Legacy", "hex_opcode": "DD C0+i", "length": "2", "visual_parts": [], "binary_pattern": "DD", "bit_positions": "+0"}, "operands": [{"name": "dest", "desc": "Register"}], "extension": "x87 FPU", "description": "Sets the tag bits for the specified FPU register to 11b (empty), marking it as unused without removing its value from the register. This instruction does not pop the stack or modify EFLAGS. It is commonly used to release floating-point registers for reuse.", "pseudocode": "Tag[ST(i)] ← 11b;", "example": "FFREE st(1)"}
{"mnemonic": "fcmovb", "architecture": "x86", "full_name": "Floating-Point Conditional Move If Below", "summary": "Moves ST(i) to ST(0) if CF=1.", "syntax": "FCMOVB ST(0), ST(i)", "encoding": {"format": "Legacy", "hex_opcode": "DA C0+i", "length": "2", "visual_parts": [], "binary_pattern": "DA", "bit_positions": "+0"}, "operands": [{"name": "src", "desc": "Register"}], "extension": "x87 FPU (P6+)", "description": "Conditionally moves ST(i) to ST(0) if the carry flag (CF) is set, based on a prior integer comparison or EFLAGS state. This x87 instruction available on Pentium Pro and later does not modify EFLAGS; it only reads CF to determine whether to execute the move. If CF=0, no move occurs and ST(0) remains unchanged.", "pseudocode": "if (CF == 1) { ST(0) ← ST(i); }", "example": "FCMOVB st(0), st(1)"}
{"mnemonic": "fcmove", "architecture": "x86", "full_name": "Floating-Point Conditional Move If Equal", "summary": "Moves ST(i) to ST(0) if ZF=1.", "syntax": "FCMOVE ST(0), ST(i)", "encoding": {"format": "Legacy", "hex_opcode": "DA C8+i", "length": "2", "visual_parts": [], "binary_pattern": "DA", "bit_positions": "+0"}, "operands": [{"name": "src", "desc": "Register"}], "extension": "x87 FPU (P6+)", "description": "Conditionally moves ST(i) to ST(0) if the zero flag (ZF) is set, based on a prior integer comparison or EFLAGS state. This x87 instruction available on Pentium Pro and later does not modify EFLAGS; it only reads ZF to determine whether to execute the move. If ZF=0, no move occurs and ST(0) remains unchanged.", "pseudocode": "if (ZF == 1) { ST(0) ← ST(i); }", "example": "FCMOVE st(0), st(1)"}
{"mnemonic": "fcmovbe", "architecture": "x86", "full_name": "Floating-Point Conditional Move If Below or Equal", "summary": "Moves ST(i) to ST(0) if CF=1 or ZF=1.", "syntax": "FCMOVBE ST(0), ST(i)", "encoding": {"format": "Legacy", "hex_opcode": "DA D0+i", "length": "2", "visual_parts": [], "binary_pattern": "DA", "bit_positions": "+0"}, "operands": [{"name": "src", "desc": "Register"}], "extension": "x87 FPU (P6+)", "description": "Conditionally moves ST(i) to ST(0) if the carry flag (CF) is set or the zero flag (ZF) is set, based on a prior integer comparison or EFLAGS state. This x87 instruction available on Pentium Pro and later does not modify EFLAGS; it only reads CF and ZF to determine whether to execute the move. If neither CF nor ZF is set, no move occurs.", "pseudocode": "if ((CF == 1) || (ZF == 1)) { ST(0) ← ST(i); }", "example": "FCMOVBE st(0), st(1)"}
{"mnemonic": "fcmovu", "architecture": "x86", "full_name": "Floating-Point Conditional Move If Unordered", "summary": "Moves ST(i) to ST(0) if PF=1.", "syntax": "FCMOVU ST(0), ST(i)", "encoding": {"format": "Legacy", "hex_opcode": "DA D8+i", "length": "2", "visual_parts": [], "binary_pattern": "DA", "bit_positions": "+0"}, "operands": [{"name": "src", "desc": "Register"}], "extension": "x87 FPU (P6+)", "description": "Conditionally moves the value in ST(i) to ST(0) if the parity flag (PF) is set, indicating an unordered comparison result (one or both operands are NaN). This instruction is part of the x87 FPU conditional move family introduced in P6 and later processors. No flags are modified by this instruction.", "pseudocode": "if (PF == 1) { ST(0) ← ST(i); }", "example": "FCMOVU st(0), st(1)"}
{"mnemonic": "fcmovnb", "architecture": "x86", "full_name": "Floating-Point Conditional Move If Not Below", "summary": "Moves ST(i) to ST(0) if CF=0.", "syntax": "FCMOVNB ST(0), ST(i)", "encoding": {"format": "Legacy", "hex_opcode": "DB C0+i", "length": "2", "visual_parts": [], "binary_pattern": "DB", "bit_positions": "+0"}, "operands": [{"name": "src", "desc": "Register"}], "extension": "x87 FPU (P6+)", "description": "Conditionally moves the value in ST(i) to ST(0) if the carry flag (CF) is clear, indicating the first operand is not below the second in an x87 FPU comparison context. This is part of the x87 conditional move instruction set available on P6 and later processors. No flags are modified by this instruction.", "pseudocode": "if (CF == 0) { ST(0) ← ST(i); }", "example": "FCMOVNB st(0), st(1)"}
{"mnemonic": "fcmovne", "architecture": "x86", "full_name": "Floating-Point Conditional Move If Not Equal", "summary": "Moves ST(i) to ST(0) if ZF=0.", "syntax": "FCMOVNE ST(0), ST(i)", "encoding": {"format": "Legacy", "hex_opcode": "DB C8+i", "length": "2", "visual_parts": [], "binary_pattern": "DB", "bit_positions": "+0"}, "operands": [{"name": "src", "desc": "Register"}], "extension": "x87 FPU (P6+)", "description": "Conditionally moves the value in ST(i) to ST(0) if the zero flag (ZF) is clear, indicating the operands are not equal in an x87 FPU comparison context. This instruction is part of the x87 conditional move family on P6 and later processors. No flags are modified by this instruction.", "pseudocode": "if (ZF == 0) { ST(0) ← ST(i); }", "example": "FCMOVNE st(0), st(1)"}
{"mnemonic": "fcmovnbe", "architecture": "x86", "full_name": "Floating-Point Conditional Move If Not Below or Equal", "summary": "Moves ST(i) to ST(0) if CF=0 and ZF=0.", "syntax": "FCMOVNBE ST(0), ST(i)", "encoding": {"format": "Legacy", "hex_opcode": "DB D0+i", "length": "2", "visual_parts": [], "binary_pattern": "DB", "bit_positions": "+0"}, "operands": [{"name": "src", "desc": "Register"}], "extension": "x87 FPU (P6+)", "description": "Conditionally moves the value in ST(i) to ST(0) if both the carry flag (CF) and zero flag (ZF) are clear, indicating the first operand is greater than the second in an x87 FPU comparison context. This instruction is part of the x87 conditional move set on P6 and later processors. No flags are modified by this instruction.", "pseudocode": "if (CF == 0 && ZF == 0) { ST(0) ← ST(i); }", "example": "FCMOVNBE st(0), st(1)"}
{"mnemonic": "fcmovnu", "architecture": "x86", "full_name": "Floating-Point Conditional Move If Not Unordered", "summary": "Moves ST(i) to ST(0) if PF=0.", "syntax": "FCMOVNU ST(0), ST(i)", "encoding": {"format": "Legacy", "hex_opcode": "DB D8+i", "length": "2", "visual_parts": [], "binary_pattern": "DB", "bit_positions": "+0"}, "operands": [{"name": "src", "desc": "Register"}], "extension": "x87 FPU (P6+)", "description": "Conditionally moves the value in ST(i) to ST(0) if the parity flag (PF) is clear, indicating an ordered comparison result (neither operand is NaN) in x87 FPU context. This instruction is part of the x87 conditional move family on P6 and later processors. No flags are modified by this instruction.", "pseudocode": "if (PF == 0) { ST(0) ← ST(i); }", "example": "FCMOVNU st(0), st(1)"}
{"mnemonic": "packuswb", "architecture": "x86", "full_name": "Pack with Unsigned Saturation Word to Byte", "summary": "Converts signed words to unsigned bytes with saturation.", "syntax": "PACKUSWB xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 67", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | 67", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Converts four signed 16-bit words from each of two XMM registers or memory into eight unsigned 8-bit bytes with unsigned saturation, storing the result in the destination XMM register. Values greater than 255 saturate to 255, and negative values saturate to 0. No flags are affected by this instruction; it is an SSE2 SIMD operation.", "pseudocode": "for (i = 0; i < 4; i++) {\n  temp1[i] = (dest[i*16:i*16+15] < 0) ? 0 : ((dest[i*16:i*16+15] > 255) ? 255 : dest[i*16:i*16+15]);\n  temp2[i] = (src[i*16:i*16+15] < 0) ? 0 : ((src[i*16:i*16+15] > 255) ? 255 : src[i*16:i*16+15]);\n}\ndest[0:7] = temp1[0]; dest[8:15] = temp1[1]; dest[16:23] = temp1[2]; dest[24:31] = temp1[3];\ndest[32:39] = temp2[0]; dest[40:47] = temp2[1]; dest[48:55] = temp2[2]; dest[56:63] = temp2[3];", "example": "PACKUSWB xmm1, xmm2/m128"}
{"mnemonic": "punpckhbw", "architecture": "x86", "full_name": "Unpack High Data Bytes", "summary": "Interleaves high bytes from two sources.", "syntax": "PUNPCKHBW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 68", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | 68", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Interleaves the high-order bytes from corresponding positions in the destination and source XMM registers, storing bytes from the destination in even-indexed positions and source bytes in odd-indexed positions of the result. This SSE2 instruction performs no flag modifications and operates on 128-bit packed data.", "pseudocode": "for (i = 0; i < 8; i++) {\n  result[i*2] = dest[i*8+64:i*8+71];\n  result[i*2+1] = src[i*8+64:i*8+71];\n}\ndest ← result;", "example": "PUNPCKHBW xmm1, xmm2/m128"}
{"mnemonic": "punpckhwd", "architecture": "x86", "full_name": "Unpack High Data Words", "summary": "Interleaves high words.", "syntax": "PUNPCKHWD xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 69", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | 69", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Interleaves the high-order words from corresponding positions in the destination and source XMM registers, storing words from the destination in even-indexed positions and source words in odd-indexed positions of the result. This SSE2 instruction performs no flag modifications and operates on 128-bit packed data.", "pseudocode": "for (i = 0; i < 4; i++) {\n  result[i*2] = dest[i*16+64:i*16+79];\n  result[i*2+1] = src[i*16+64:i*16+79];\n}\ndest ← result;", "example": "PUNPCKHWD xmm1, xmm2/m128"}
{"mnemonic": "punpckhdq", "architecture": "x86", "full_name": "Unpack High Data Doublewords", "summary": "Interleaves high doublewords.", "syntax": "PUNPCKHDQ xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 6A", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | 6A", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Unpacks and interleaves the high-order 32-bit doublewords from the destination and source XMM registers into the destination. The instruction treats the 128-bit XMM register as four 32-bit elements, selects elements 1 and 3 (the high two), and interleaves them as [src[3], dest[3], src[1], dest[1]]. No flags are affected.", "pseudocode": "dest[0:31] ← dest[63:32]\ndest[32:63] ← src[63:32]\ndest[64:95] ← dest[127:96]\ndest[96:127] ← src[127:96]", "example": "PUNPCKHDQ xmm1, xmm2/m128"}
{"mnemonic": "punpckhqdq", "architecture": "x86", "full_name": "Unpack High Data Quadwords", "summary": "Interleaves high quadwords.", "syntax": "PUNPCKHQDQ xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 6D", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | 6D", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Unpacks and interleaves the high-order 64-bit quadwords from the destination and source XMM registers into the destination. The instruction treats the 128-bit XMM register as two 64-bit elements, selects element 1 (the high half), and interleaves them as [src[1], dest[1]]. No flags are affected.", "pseudocode": "dest[0:63] ← dest[127:64]\ndest[64:127] ← src[127:64]", "example": "PUNPCKHQDQ xmm1, xmm2/m128"}
{"mnemonic": "psadbw", "architecture": "x86", "full_name": "Compute Sum of Absolute Differences", "summary": "Computes absolute differences of bytes and sums them to words.", "syntax": "PSADBW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F F6", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | F6", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Computes the absolute value of the difference for each of 16 packed unsigned bytes in the destination and source, then sums those differences within 64-bit groups and stores the results as two 64-bit values. Useful for motion estimation and SAD (Sum of Absolute Differences) operations. No flags are affected.", "pseudocode": "sum_low ← 0\nsum_high ← 0\nfor i in 0..7:\n  sum_low ← sum_low + abs(dest[i*8 + 7:i*8] - src[i*8 + 7:i*8])\nfor i in 8..15:\n  sum_high ← sum_high + abs(dest[i*8 + 7:i*8] - src[i*8 + 7:i*8])\ndest[0:63] ← sum_low\ndest[64:127] ← sum_high", "example": "PSADBW xmm1, xmm2/m128"}
{"mnemonic": "pmaxub", "architecture": "x86", "full_name": "Maximum of Packed Unsigned Byte Integers", "summary": "Returns maximum of unsigned bytes.", "syntax": "PMAXUB xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F DE", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | DE", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Compares each of 16 packed unsigned bytes in the destination and source registers and stores the maximum value of each pair into the destination. This is an element-wise unsigned 8-bit maximum operation. No flags are affected.", "pseudocode": "for i in 0..15:\n  dest[i*8 + 7:i*8] ← max(dest[i*8 + 7:i*8], src[i*8 + 7:i*8])", "example": "PMAXUB xmm1, xmm2/m128"}
{"mnemonic": "pminub", "architecture": "x86", "full_name": "Minimum of Packed Unsigned Byte Integers", "summary": "Returns minimum of unsigned bytes.", "syntax": "PMINUB xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F DA", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | DA", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Compares each of 16 packed unsigned bytes in the destination and source registers and stores the minimum value of each pair into the destination. This is an element-wise unsigned 8-bit minimum operation. No flags are affected.", "pseudocode": "for i in 0..15:\n  dest[i*8 + 7:i*8] ← min(dest[i*8 + 7:i*8], src[i*8 + 7:i*8])", "example": "PMINUB xmm1, xmm2/m128"}
{"mnemonic": "pmaxsw", "architecture": "x86", "full_name": "Maximum of Packed Signed Word Integers", "summary": "Returns maximum of signed words.", "syntax": "PMAXSW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F EE", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | EE", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Compares each of 8 packed signed words in the destination and source registers and stores the maximum value of each pair into the destination. This is an element-wise signed 16-bit maximum operation. No flags are affected.", "pseudocode": "for i in 0..7:\n  dest[i*16 + 15:i*16] ← max_signed(dest[i*16 + 15:i*16], src[i*16 + 15:i*16])", "example": "PMAXSW xmm1, xmm2/m128"}
{"mnemonic": "pminsw", "architecture": "x86", "full_name": "Minimum of Packed Signed Word Integers", "summary": "Returns minimum of signed words.", "syntax": "PMINSW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F EA", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | EA", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Compares each of 8 packed signed words in the destination and source registers and stores the minimum value of each pair into the destination. This is an element-wise signed 16-bit minimum operation. No flags are affected.", "pseudocode": "for i in 0..7:\n  dest[i*16 + 15:i*16] ← min_signed(dest[i*16 + 15:i*16], src[i*16 + 15:i*16])", "example": "PMINSW xmm1, xmm2/m128"}
{"mnemonic": "pavgb", "architecture": "x86", "full_name": "Average Packed Integers (Byte)", "summary": "Averages packed unsigned bytes (rounded up).", "syntax": "PAVGB xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F E0", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | E0", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Computes the average of each pair of 16 packed unsigned bytes in the destination and source registers, rounding up (toward positive infinity), and stores the results into the destination. The formula is (a + b + 1) >> 1 for each byte pair. No flags are affected.", "pseudocode": "for i in 0..15:\n  dest[i*8 + 7:i*8] ← (dest[i*8 + 7:i*8] + src[i*8 + 7:i*8] + 1) >> 1", "example": "PAVGB xmm1, xmm2/m128"}
{"mnemonic": "pavgw", "architecture": "x86", "full_name": "Average Packed Integers (Word)", "summary": "Averages packed unsigned words (rounded up).", "syntax": "PAVGW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F E3", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | E3", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Averages packed unsigned 16-bit integers element-wise, rounding up by adding 1 before shifting right. Each pair of corresponding 16-bit words from the destination and source are averaged independently and stored back in the destination. No flags are affected; this is a data-parallel operation with no special side effects.", "pseudocode": "for i = 0 to 7:\n  dest.word[i] ← (dest.word[i] + src.word[i] + 1) >> 1", "example": "PAVGW xmm1, xmm2/m128"}
{"mnemonic": "pmulhuw", "architecture": "x86", "full_name": "Packed Multiply High Unsigned", "summary": "Multiplies unsigned words, keeps high 16 bits.", "syntax": "PMULHUW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F E4", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | E4", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Multiplies packed unsigned 16-bit integers and stores the high 16 bits of each 32-bit product. Each pair of corresponding 16-bit unsigned words from destination and source are multiplied (producing 32-bit results), and only the upper 16 bits are retained. No flags are affected.", "pseudocode": "for i = 0 to 7:\n  product ← (uint32_t)dest.word[i] * (uint32_t)src.word[i]\n  dest.word[i] ← (uint16_t)(product >> 16)", "example": "PMULHUW xmm1, xmm2/m128"}
{"mnemonic": "pmulhw", "architecture": "x86", "full_name": "Packed Multiply High Signed", "summary": "Multiplies signed words, keeps high 16 bits.", "syntax": "PMULHW xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F E5", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | E5", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Multiplies packed signed 16-bit integers and stores the high 16 bits of each 32-bit product. Each pair of corresponding 16-bit signed words from destination and source are multiplied (producing 32-bit results), and only the upper 16 bits are retained. No flags are affected.", "pseudocode": "for i = 0 to 7:\n  product ← (int32_t)dest.sword[i] * (int32_t)src.sword[i]\n  dest.sword[i] ← (int16_t)(product >> 16)", "example": "PMULHW xmm1, xmm2/m128"}
{"mnemonic": "psubq", "architecture": "x86", "full_name": "Packed Subtract Quadword", "summary": "Subtracts packed quadwords.", "syntax": "PSUBQ xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F FB", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | FB", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Subtracts packed 64-bit integers element-wise without saturation. The two 64-bit integers in the destination are each subtracted from by the corresponding 64-bit integers in the source, and results wrap on overflow. No flags are affected; wrapping behavior is identical to 64-bit integer subtraction.", "pseudocode": "for i = 0 to 1:\n  dest.quad[i] ← dest.quad[i] - src.quad[i]", "example": "PSUBQ xmm1, xmm2/m128"}
{"mnemonic": "pmuludq", "architecture": "x86", "full_name": "Multiply Packed Unsigned Doubleword Integers", "summary": "Multiplies low 32-bits of each 64-bit chunk to 64-bit result.", "syntax": "PMULUDQ xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F F4", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | F4", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Multiplies the low 32-bit doublewords of packed unsigned integers, producing 64-bit products. The even-indexed 32-bit elements (0, 2) from destination and source are multiplied, and the 64-bit results are written back to the even positions. No flags are affected.", "pseudocode": "dest.quad[0] ← (uint64_t)dest.dword[0] * (uint64_t)src.dword[0]\ndest.quad[1] ← (uint64_t)dest.dword[2] * (uint64_t)src.dword[2]", "example": "PMULUDQ xmm1, xmm2/m128"}
{"mnemonic": "pslldq", "architecture": "x86", "full_name": "Shift Double Quadword Left Logical", "summary": "Shifts the entire 128-bit register left by bytes.", "syntax": "PSLLDQ xmm1, imm8", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 73 /7", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 73 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "count", "desc": "Imm"}], "extension": "SSE2", "description": "Shifts the entire 128-bit value in the destination XMM register left by a byte count, filling with zeros from the right. The shift count is specified as an 8-bit immediate and is applied to the whole register as a unit, not element-wise. No flags are affected.", "pseudocode": "shift_count ← imm8\nif shift_count >= 16:\n  dest ← 0\nelse:\n  dest ← dest << (shift_count * 8)", "example": "PSLLDQ xmm1, 3"}
{"mnemonic": "psrldq", "architecture": "x86", "full_name": "Shift Double Quadword Right Logical", "summary": "Shifts the entire 128-bit register right by bytes.", "syntax": "PSRLDQ xmm1, imm8", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 73 /3", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 73 | ModRM", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "count", "desc": "Imm"}], "extension": "SSE2", "description": "Shifts the entire 128-bit value in the destination XMM register right by a byte count, filling with zeros from the left. The shift count is specified as an 8-bit immediate and is applied to the whole register as a unit, not element-wise. No flags are affected.", "pseudocode": "shift_count ← imm8\nif shift_count >= 16:\n  dest ← 0\nelse:\n  dest ← dest >> (shift_count * 8)", "example": "PSRLDQ xmm1, 3"}
{"mnemonic": "cvtdq2ps", "architecture": "x86", "full_name": "Convert Packed Doubleword Integers to Packed Single-Precision", "summary": "Converts four 32-bit integers to floats.", "syntax": "CVTDQ2PS xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "NP 0F 5B /r", "length": "3+", "visual_parts": [], "binary_pattern": "0F | 5B", "bit_positions": "+0 | +1"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Converts four packed 32-bit signed doubleword integers to four packed single-precision floating-point values. Conversion uses the current rounding mode from MXCSR. Precision may be lost for very large integers; no flags are explicitly set, but the instruction may generate floating-point exceptions via MXCSR.", "pseudocode": "for i = 0 to 3:\n  dest.float[i] ← (float)src.dword[i]", "example": "CVTDQ2PS xmm1, xmm2/m128"}
{"mnemonic": "cvtps2dq", "architecture": "x86", "full_name": "Convert Packed Single-Precision to Packed Doubleword Integers", "summary": "Converts four floats to 32-bit integers (Rounded).", "syntax": "CVTPS2DQ xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 5B", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | 5B", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Converts four packed single-precision floating-point values to four packed signed 32-bit integers using the rounding mode specified in MXCSR. If any input is NaN, the result is the minimum signed 32-bit integer (0x80000000). Operates on 128-bit XMM registers and sets ZF, PF, CF based on rounding exceptions in MXCSR.", "pseudocode": "dest[0:31] ← RoundToNearest(src[0:31]); dest[32:63] ← RoundToNearest(src[32:63]); dest[64:95] ← RoundToNearest(src[64:95]); dest[96:127] ← RoundToNearest(src[96:127]);", "example": "CVTPS2DQ xmm1, xmm2/m128"}
{"mnemonic": "cvttps2dq", "architecture": "x86", "full_name": "Convert with Truncation Packed Single-Precision to Packed Doubleword Integers", "summary": "Converts four floats to 32-bit integers (Truncated).", "syntax": "CVTTPS2DQ xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "F3 0F 5B", "length": "4+", "visual_parts": [], "binary_pattern": "F3 | 0F | 5B", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Converts four packed single-precision floating-point values to four packed signed 32-bit integers by truncating toward zero (discarding fractional part). If any input is NaN or out of range, the result is 0x80000000. Operates on 128-bit XMM registers without using MXCSR rounding mode.", "pseudocode": "dest[0:31] ← Truncate(src[0:31]); dest[32:63] ← Truncate(src[32:63]); dest[64:95] ← Truncate(src[64:95]); dest[96:127] ← Truncate(src[96:127]);", "example": "CVTTPS2DQ xmm1, xmm2/m128"}
{"mnemonic": "movmskps", "architecture": "x86", "full_name": "Extract Packed Single-Precision Mask", "summary": "Extracts sign bits from four floats into low 4 bits of register.", "syntax": "MOVMSKPS r32, xmm", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 50 /r", "length": "3", "visual_parts": [], "binary_pattern": "0F | 50", "bit_positions": "+0 | +1"}, "operands": [{"name": "dest", "desc": "Reg"}, {"name": "src", "desc": "XMM"}], "extension": "SSE", "description": "Extracts the sign bit (bit 31) from each of four packed single-precision floating-point values in an XMM register and packs them into the low 4 bits of a general-purpose 32-bit register. The upper 28 bits of the destination are cleared. No flags are modified.", "pseudocode": "dest ← 0; dest[0] ← src[31]; dest[1] ← src[63]; dest[2] ← src[95]; dest[3] ← src[127];", "example": "MOVMSKPS eax, xmm0"}
{"mnemonic": "movmskpd", "architecture": "x86", "full_name": "Extract Packed Double-Precision Mask", "summary": "Extracts sign bits from two doubles into low 2 bits of register.", "syntax": "MOVMSKPD r32, xmm", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 50", "length": "4", "visual_parts": [], "binary_pattern": "66 | 0F | 50", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "Reg"}, {"name": "src", "desc": "XMM"}], "extension": "SSE2", "description": "Extracts the sign bit (bit 63) from each of two packed double-precision floating-point values in an XMM register and packs them into the low 2 bits of a general-purpose 32-bit register. The upper 30 bits of the destination are cleared. No flags are modified.", "pseudocode": "dest ← 0; dest[0] ← src[63]; dest[1] ← src[127];", "example": "MOVMSKPD eax, xmm0"}
{"mnemonic": "comiss", "architecture": "x86", "full_name": "Compare Scalar Ordered Single-Precision", "summary": "Compares low float and sets EFLAGS (Signaling NaN raises exception).", "syntax": "COMISS xmm1, xmm2/m32", "encoding": {"format": "SSE", "hex_opcode": "NP 0F 2F /r", "length": "3+", "visual_parts": [], "binary_pattern": "0F | 2F", "bit_positions": "+0 | +1"}, "operands": [{"name": "src1", "desc": "XMM"}, {"name": "src2", "desc": "XMM/Mem"}], "extension": "SSE", "description": "Performs an ordered comparison of the low single-precision floating-point values in two XMM registers or memory, setting EFLAGS (ZF, PF, CF) accordingly. Signals invalid operation exception if either operand is a signaling NaN; quiet NaNs set ZF=1, PF=1, CF=1. Does not modify the XMM registers.", "pseudocode": "src1_val ← src1[0:31] (as float); src2_val ← src2[0:31] (as float); if (IsNaN(src1_val) || IsNaN(src2_val)) { ZF ← 1; PF ← 1; CF ← 1; OF ← 0; AF ← 0; SF ← 0; } else if (src1_val < src2_val) { CF ← 1; ZF ← 0; PF ← 0; OF ← 0; AF ← 0; SF ← 0; } else if (src1_val == src2_val) { ZF ← 1; CF ← 0; PF ← 0; OF ← 0; AF ← 0; SF ← 0; } else { ZF ← 0; CF ← 0; PF ← 0; OF ← 0; AF ← 0; SF ← 0; }", "example": "COMISS xmm1, xmm2/m32"}
{"mnemonic": "comisd", "architecture": "x86", "full_name": "Compare Scalar Ordered Double-Precision", "summary": "Compares low double and sets EFLAGS (Signaling NaN raises exception).", "syntax": "COMISD xmm1, xmm2/m64", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 2F", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | 2F", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "src1", "desc": "XMM"}, {"name": "src2", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Performs an ordered comparison of the low double-precision floating-point values in two XMM registers or memory, setting EFLAGS (ZF, PF, CF) accordingly. Signals invalid operation exception if either operand is a signaling NaN; quiet NaNs set ZF=1, PF=1, CF=1. Does not modify the XMM registers.", "pseudocode": "src1_val ← src1[0:63] (as double); src2_val ← src2[0:63] (as double); if (IsNaN(src1_val) || IsNaN(src2_val)) { ZF ← 1; PF ← 1; CF ← 1; OF ← 0; AF ← 0; SF ← 0; } else if (src1_val < src2_val) { CF ← 1; ZF ← 0; PF ← 0; OF ← 0; AF ← 0; SF ← 0; } else if (src1_val == src2_val) { ZF ← 1; CF ← 0; PF ← 0; OF ← 0; AF ← 0; SF ← 0; } else { ZF ← 0; CF ← 0; PF ← 0; OF ← 0; AF ← 0; SF ← 0; }", "example": "COMISD xmm1, xmm2/m64"}
{"mnemonic": "unpcklpd", "architecture": "x86", "full_name": "Unpack Low Packed Double-Precision", "summary": "Interleaves low doubles from two sources.", "syntax": "UNPCKLPD xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 14", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | 14", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Unpacks and interleaves the low-order 64-bit double-precision values from the destination and source XMM registers, placing the result back in the destination. Destination element 0 receives the low double from dest, element 1 receives the low double from src. No flags are modified.", "pseudocode": "temp ← dest; dest[0:63] ← temp[0:63]; dest[64:127] ← src[0:63];", "example": "UNPCKLPD xmm1, xmm2/m128"}
{"mnemonic": "unpckhpd", "architecture": "x86", "full_name": "Unpack High Packed Double-Precision", "summary": "Interleaves high doubles from two sources.", "syntax": "UNPCKHPD xmm1, xmm2/m128", "encoding": {"format": "SSE2", "hex_opcode": "66 0F 15", "length": "4+", "visual_parts": [], "binary_pattern": "66 | 0F | 15", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE2", "description": "Unpacks and interleaves the high-order 64-bit double-precision values from the destination and source XMM registers, placing the result back in the destination. Destination element 0 receives the high double from dest, element 1 receives the high double from src. No flags are modified.", "pseudocode": "temp ← dest; dest[0:63] ← temp[64:127]; dest[64:127] ← src[64:127];", "example": "UNPCKHPD xmm1, xmm2/m128"}
{"mnemonic": "movshdup", "architecture": "x86", "full_name": "Move Packed Single-FP High and Duplicate", "summary": "Duplicates high element of each qword pair.", "syntax": "MOVSHDUP xmm1, xmm2/m128", "encoding": {"format": "SSE3", "hex_opcode": "F3 0F 16", "length": "4+", "visual_parts": [], "binary_pattern": "F3 | 0F | 16", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE3", "description": "Moves and duplicates the high 32-bit single-precision FP value from each 64-bit pair in the source to both elements of the corresponding pair in the destination. This SSE3 instruction operates on 128-bit XMM registers and does not modify flags. It is used for efficient duplication of high elements in packed FP data.", "pseudocode": "dest[127:96] ← src[127:96];\ndest[95:64] ← src[127:96];\ndest[63:32] ← src[63:32];\ndest[31:0] ← src[63:32];", "example": "MOVSHDUP xmm1, xmm2/m128"}
{"mnemonic": "movsldup", "architecture": "x86", "full_name": "Move Packed Single-FP Low and Duplicate", "summary": "Duplicates low element of each qword pair.", "syntax": "MOVSLDUP xmm1, xmm2/m128", "encoding": {"format": "SSE3", "hex_opcode": "F3 0F 12", "length": "4+", "visual_parts": [], "binary_pattern": "F3 | 0F | 12", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE3", "description": "Moves and duplicates the low 32-bit single-precision FP value from each 64-bit pair in the source to both elements of the corresponding pair in the destination. This SSE3 instruction operates on 128-bit XMM registers and does not modify flags. It is the complement to MOVSHDUP, duplicating low rather than high elements.", "pseudocode": "dest[127:96] ← src[95:64];\ndest[95:64] ← src[95:64];\ndest[63:32] ← src[31:0];\ndest[31:0] ← src[31:0];", "example": "MOVSLDUP xmm1, xmm2/m128"}
{"mnemonic": "phsubw", "architecture": "x86", "full_name": "Packed Horizontal Subtract Word", "summary": "Subtracts adjacent 16-bit integers horizontally.", "syntax": "PHSUBW xmm1, xmm2/m128", "encoding": {"format": "SSSE3", "hex_opcode": "66 0F 38 05", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 05", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSSE3", "description": "Subtracts horizontally adjacent 16-bit signed integers within each 128-bit operand, producing 16-bit results. This SSSE3 instruction performs eight parallel subtractions (higher element minus lower element in each pair) and does not modify EFLAGS. Results that overflow wrap with two's-complement semantics.", "pseudocode": "dest[15:0] ← (int16_t)src[31:16] - (int16_t)src[15:0];\ndest[31:16] ← (int16_t)src[63:48] - (int16_t)src[47:32];\ndest[47:32] ← (int16_t)src[95:80] - (int16_t)src[79:64];\ndest[63:48] ← (int16_t)src[127:112] - (int16_t)src[111:96];", "example": "PHSUBW xmm1, xmm2/m128"}
{"mnemonic": "phsubd", "architecture": "x86", "full_name": "Packed Horizontal Subtract Doubleword", "summary": "Subtracts adjacent 32-bit integers horizontally.", "syntax": "PHSUBD xmm1, xmm2/m128", "encoding": {"format": "SSSE3", "hex_opcode": "66 0F 38 06", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 06", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSSE3", "description": "Subtracts horizontally adjacent 32-bit signed integers within each 128-bit operand, producing 32-bit results. This SSSE3 instruction performs four parallel subtractions (higher element minus lower element in each pair) and does not modify EFLAGS. Results wrap with two's-complement semantics on overflow.", "pseudocode": "dest[31:0] ← (int32_t)src[63:32] - (int32_t)src[31:0];\ndest[63:32] ← (int32_t)src[127:96] - (int32_t)src[95:64];", "example": "PHSUBD xmm1, xmm2/m128"}
{"mnemonic": "pmaddubsw", "architecture": "x86", "full_name": "Multiply and Add Packed Signed and Unsigned Bytes", "summary": "Multiplies signed/unsigned bytes and adds pairs to words.", "syntax": "PMADDUBSW xmm1, xmm2/m128", "encoding": {"format": "SSSE3", "hex_opcode": "66 0F 38 04", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 04", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSSE3", "description": "Multiplies unsigned bytes from the destination by signed bytes from the source, then adds the products pairwise to produce signed 16-bit results with saturation. This SSSE3 instruction performs eight parallel multiply-add operations on byte pairs and does not modify EFLAGS. Results are clamped to the signed 16-bit range [-32768, 32767].", "pseudocode": "for i = 0 to 7:\n  prod0 ← (uint8_t)dest[8*i+7:8*i] × (int8_t)src[8*i+7:8*i];\n  prod1 ← (uint8_t)dest[8*i+15:8*i+8] × (int8_t)src[8*i+15:8*i+8];\n  sum ← (int32_t)prod0 + (int32_t)prod1;\n  dest[16*i+15:16*i] ← saturate_to_i16(sum);", "example": "PMADDUBSW xmm1, xmm2/m128"}
{"mnemonic": "phminposuw", "architecture": "x86", "full_name": "Packed Horizontal Minimum", "summary": "Finds minimum word and its index.", "syntax": "PHMINPOSUW xmm1, xmm2/m128", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 41", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 41", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE4.1", "description": "Finds the minimum unsigned 16-bit word among eight packed values and returns the minimum value in the low word of the destination with its index (0-7) in bits 16-18. This SSE4.1 instruction clears bits 19-127 of the destination and does not modify EFLAGS. It is useful for finding the position of minimum values in packed word arrays.", "pseudocode": "min_val ← src[15:0];\nmin_idx ← 0;\nfor i = 1 to 7:\n  if (uint16_t)src[16*i+15:16*i] < min_val:\n    min_val ← (uint16_t)src[16*i+15:16*i];\n    min_idx ← i;\ndest[15:0] ← min_val;\ndest[18:16] ← min_idx;\ndest[127:19] ← 0;", "example": "PHMINPOSUW xmm1, xmm2/m128"}
{"mnemonic": "mpsadbw", "architecture": "x86", "full_name": "Compute Multiple Sums of Absolute Differences", "summary": "Computes multiple SADs of byte blocks.", "syntax": "MPSADBW xmm1, xmm2/m128, imm8", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 3A 42", "length": "6+", "visual_parts": [], "binary_pattern": "66 | 0F | 3A | 42", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}, {"name": "sel", "desc": "Imm"}], "extension": "SSE4.1", "description": "Computes multiple sums of absolute differences between corresponding bytes of two blocks selected by an immediate operand. This SSE4.1 instruction computes four parallel SADs, each summing the absolute differences across a byte block, and produces four 16-bit results. EFLAGS is not modified.", "pseudocode": "offset_dest ← (sel & 0x4) ? 4 : 0;\noffset_src ← (sel & 0x3) ? 4 * (sel & 0x3) : 0;\nfor k = 0 to 3:\n  sum ← 0;\n  for j = 0 to 3:\n    idx_d ← offset_dest + 8*k + 8*j;\n    idx_s ← offset_src + 8*j;\n    sum ← sum + |dest[idx_d+7:idx_d] - src[idx_s+7:idx_s]|;\n  dest[16*k+15:16*k] ← sum;", "example": "MPSADBW xmm1, xmm2/m128, 3"}
{"mnemonic": "pmovsxbq", "architecture": "x86", "full_name": "Packed Move with Sign Extend Byte to Quadword", "summary": "Sign extends 8-bit integers to 64-bit.", "syntax": "PMOVSXBQ xmm1, xmm2/m16", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 22", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 22", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE4.1", "description": "Sign-extends the low four bytes of the source to four 64-bit signed integers in the destination. This SSE4.1 instruction operates on 128-bit XMM registers and does not modify EFLAGS. The source may be a 16-bit memory operand or an XMM register; destination bits are filled with the sign bit of each source byte.", "pseudocode": "dest[63:0] ← sign_extend_64((int8_t)src[7:0]);\ndest[127:64] ← sign_extend_64((int8_t)src[15:8]);", "example": "PMOVSXBQ xmm1, xmm2/m16"}
{"mnemonic": "pmovsxwd", "architecture": "x86", "full_name": "Packed Move with Sign Extend Word to Doubleword", "summary": "Sign extends 16-bit integers to 32-bit.", "syntax": "PMOVSXWD xmm1, xmm2/m64", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 23", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 23", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE4.1", "description": "Sign-extends four packed 16-bit signed integers from the source operand to four packed 32-bit signed integers in the destination XMM register. The source is a 64-bit value (lower 64 bits of XMM or 64-bit memory location) containing four 16-bit elements; the destination is an 128-bit XMM register. No flags are affected.", "pseudocode": "xmm1[31:0] ← sign_extend_32(src[15:0]); xmm1[63:32] ← sign_extend_32(src[31:16]); xmm1[95:64] ← sign_extend_32(src[47:32]); xmm1[127:96] ← sign_extend_32(src[63:48]);", "example": "PMOVSXWD xmm1, xmm2/m64"}
{"mnemonic": "pmovsxwq", "architecture": "x86", "full_name": "Packed Move with Sign Extend Word to Quadword", "summary": "Sign extends 16-bit integers to 64-bit.", "syntax": "PMOVSXWQ xmm1, xmm2/m32", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 24", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 24", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE4.1", "description": "Sign-extends two packed 16-bit signed integers from the source operand to two packed 64-bit signed integers in the destination XMM register. The source is a 32-bit value (lower 32 bits of XMM or 32-bit memory location) containing two 16-bit elements; the destination is an 128-bit XMM register. No flags are affected.", "pseudocode": "xmm1[63:0] ← sign_extend_64(src[15:0]); xmm1[127:64] ← sign_extend_64(src[31:16]);", "example": "PMOVSXWQ xmm1, xmm2/m32"}
{"mnemonic": "pmovsxdq", "architecture": "x86", "full_name": "Packed Move with Sign Extend Doubleword to Quadword", "summary": "Sign extends 32-bit integers to 64-bit.", "syntax": "PMOVSXDQ xmm1, xmm2/m64", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 25", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 25", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE4.1", "description": "Sign-extends two packed 32-bit signed integers from the source operand to two packed 64-bit signed integers in the destination XMM register. The source is a 64-bit value (lower 64 bits of XMM or 64-bit memory location) containing two 32-bit elements; the destination is an 128-bit XMM register. No flags are affected.", "pseudocode": "xmm1[63:0] ← sign_extend_64(src[31:0]); xmm1[127:64] ← sign_extend_64(src[63:32]);", "example": "PMOVSXDQ xmm1, xmm2/m64"}
{"mnemonic": "pmovzxbd", "architecture": "x86", "full_name": "Packed Move with Zero Extend Byte to Doubleword", "summary": "Zero extends 8-bit integers to 32-bit.", "syntax": "PMOVZXBD xmm1, xmm2/m32", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 31", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 31", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE4.1", "description": "Zero-extends four packed 8-bit unsigned integers from the source operand to four packed 32-bit unsigned integers in the destination XMM register. The source is a 32-bit value (lower 32 bits of XMM or 32-bit memory location) containing four 8-bit elements; the destination is an 128-bit XMM register. No flags are affected.", "pseudocode": "xmm1[31:0] ← zero_extend_32(src[7:0]); xmm1[63:32] ← zero_extend_32(src[15:8]); xmm1[95:64] ← zero_extend_32(src[23:16]); xmm1[127:96] ← zero_extend_32(src[31:24]);", "example": "PMOVZXBD xmm1, xmm2/m32"}
{"mnemonic": "pmovzxbq", "architecture": "x86", "full_name": "Packed Move with Zero Extend Byte to Quadword", "summary": "Zero extends 8-bit integers to 64-bit.", "syntax": "PMOVZXBQ xmm1, xmm2/m16", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 32", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 32", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE4.1", "description": "Zero-extends two packed 8-bit unsigned integers from the source operand to two packed 64-bit unsigned integers in the destination XMM register. The source is a 16-bit value (lower 16 bits of XMM or 16-bit memory location) containing two 8-bit elements; the destination is an 128-bit XMM register. No flags are affected.", "pseudocode": "xmm1[63:0] ← zero_extend_64(src[7:0]); xmm1[127:64] ← zero_extend_64(src[15:8]);", "example": "PMOVZXBQ xmm1, xmm2/m16"}
{"mnemonic": "pmovzxwd", "architecture": "x86", "full_name": "Packed Move with Zero Extend Word to Doubleword", "summary": "Zero extends 16-bit integers to 32-bit.", "syntax": "PMOVZXWD xmm1, xmm2/m64", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 33", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 33", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE4.1", "description": "Zero-extends four packed 16-bit unsigned integers from the source operand to four packed 32-bit unsigned integers in the destination XMM register. The source is a 64-bit value (lower 64 bits of XMM or 64-bit memory location) containing four 16-bit elements; the destination is an 128-bit XMM register. No flags are affected.", "pseudocode": "xmm1[31:0] ← zero_extend_32(src[15:0]); xmm1[63:32] ← zero_extend_32(src[31:16]); xmm1[95:64] ← zero_extend_32(src[47:32]); xmm1[127:96] ← zero_extend_32(src[63:48]);", "example": "PMOVZXWD xmm1, xmm2/m64"}
{"mnemonic": "pmovzxwq", "architecture": "x86", "full_name": "Packed Move with Zero Extend Word to Quadword", "summary": "Zero extends 16-bit integers to 64-bit.", "syntax": "PMOVZXWQ xmm1, xmm2/m32", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 34", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 34", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE4.1", "description": "Zero-extends two packed 16-bit unsigned integers from the source operand to two packed 64-bit unsigned integers in the destination XMM register. The source is a 32-bit value (lower 32 bits of XMM or 32-bit memory location) containing two 16-bit elements; the destination is an 128-bit XMM register. No flags are affected.", "pseudocode": "xmm1[63:0] ← zero_extend_64(src[15:0]); xmm1[127:64] ← zero_extend_64(src[31:16]);", "example": "PMOVZXWQ xmm1, xmm2/m32"}
{"mnemonic": "pmovzxdq", "architecture": "x86", "full_name": "Packed Move with Zero Extend Doubleword to Quadword", "summary": "Zero extends 32-bit integers to 64-bit.", "syntax": "PMOVZXDQ xmm1, xmm2/m64", "encoding": {"format": "SSE4.1", "hex_opcode": "66 0F 38 35", "length": "5+", "visual_parts": [], "binary_pattern": "66 | 0F | 38 | 35", "bit_positions": "+0 | +1 | +2 | +3"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "SSE4.1", "description": "Zero-extends two packed 32-bit unsigned integers from the source operand to two packed 64-bit unsigned integers in the destination XMM register. The source is a 64-bit value (lower 64 bits of XMM or 64-bit memory location) containing two 32-bit elements; the destination is an 128-bit XMM register. No flags are affected.", "pseudocode": "xmm1[63:0] ← zero_extend_64(src[31:0]); xmm1[127:64] ← zero_extend_64(src[63:32]);", "example": "PMOVZXDQ xmm1, xmm2/m64"}
{"mnemonic": "vbroadcastsd", "architecture": "x86", "full_name": "Broadcast Scalar Double", "summary": "Broadcasts a double to all elements of YMM.", "syntax": "VBROADCASTSD ymm1, m64", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 19 /r", "length": "5+", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "operands": [{"name": "dest", "desc": "Destination YMM register; all four 64-bit lanes receive the value"}, {"name": "src", "desc": "64-bit memory location holding the double-precision value to broadcast"}], "extension": "AVX2", "description": "Broadcasts a 64-bit double-precision floating-point value from memory to all four 64-bit elements of a 256-bit YMM register. This is a non-temporal data movement that replicates a single FP64 value across the entire YMM destination. No flags are affected.", "pseudocode": "ymm1[63:0] ← m64\nymm1[127:64] ← m64\nymm1[191:128] ← m64\nymm1[255:192] ← m64", "example": "VBROADCASTSD ymm1, [rbp-8]"}
{"mnemonic": "vbroadcastf128", "architecture": "x86", "full_name": "Broadcast 128-bit Floating-Point", "summary": "Broadcasts 128-bit FP block to YMM.", "syntax": "VBROADCASTF128 ymm1, m128", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 1A /r", "length": "5+", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "operands": [{"name": "dest", "desc": "YMM"}, {"name": "src", "desc": "Memory"}], "extension": "AVX", "description": "Broadcasts a 128-bit floating-point block from memory to both 128-bit halves of a 256-bit YMM register, replicating the 16-byte XMM-sized value twice. This instruction operates on floating-point data and does not affect any flags. Available in AVX mode and higher.", "pseudocode": "ymm1[127:0] ← m128\nymm1[255:128] ← m128", "example": "VBROADCASTF128 ymm1, [rbp-16]"}
{"mnemonic": "vbroadcasti128", "architecture": "x86", "full_name": "Broadcast 128-bit Integer", "summary": "Broadcasts 128-bit integer block to YMM.", "syntax": "VBROADCASTI128 ymm1, m128", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 5A /r", "length": "5+", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "operands": [{"name": "dest", "desc": "YMM"}, {"name": "src", "desc": "Memory"}], "extension": "AVX2", "description": "Broadcasts a 128-bit integer block from memory to both 128-bit halves of a 256-bit YMM register, replicating the 16-byte value as integer data. This is the integer-domain equivalent of VBROADCASTF128 and does not affect any CPU flags.", "pseudocode": "ymm1[127:0] ← m128\nymm1[255:128] ← m128", "example": "VBROADCASTI128 ymm1, [rbp-16]"}
{"mnemonic": "vpbroadcastw", "architecture": "x86", "full_name": "Broadcast Word", "summary": "Broadcasts a word to all elements of YMM.", "syntax": "VPBROADCASTW ymm1, xmm2/m16", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 79 /r", "length": "5+", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "operands": [{"name": "dest", "desc": "YMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "AVX2", "description": "Broadcasts a 16-bit word value from either an XMM register or memory to all 16-bit elements of a YMM register (16 copies total). The source operand can be a 16-bit memory location or the low word of an XMM register. No flags are modified.", "pseudocode": "val ← (src[15:0])\nfor i ← 0 to 15 do\n  ymm1[i*16+15:i*16] ← val\nend for", "example": "VPBROADCASTW ymm1, xmm2/m16"}
{"mnemonic": "vpbroadcastq", "architecture": "x86", "full_name": "Broadcast Quadword", "summary": "Broadcasts a quadword to all elements of YMM.", "syntax": "VPBROADCASTQ ymm1, xmm2/m64", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 59 /r", "length": "5+", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "operands": [{"name": "dest", "desc": "YMM"}, {"name": "src", "desc": "XMM/Mem"}], "extension": "AVX2", "description": "Broadcasts a 64-bit quadword value from either an XMM register or memory to all 64-bit elements of a YMM register (four copies total). The source can be a 64-bit memory location or the low quadword of an XMM register. No flags are affected.", "pseudocode": "val ← (src[63:0])\nfor i ← 0 to 3 do\n  ymm1[i*64+63:i*64] ← val\nend for", "example": "VPBROADCASTQ ymm1, xmm2/m64"}
{"mnemonic": "vmaskmovps", "architecture": "x86", "full_name": "Conditional Move Packed Single-Precision", "summary": "Conditionally loads/stores floats based on mask.", "syntax": "VMASKMOVPS ymm1, ymm2, m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 2C /r", "length": "5+", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "operands": [{"name": "dest", "desc": "YMM"}, {"name": "mask", "desc": "YMM"}, {"name": "src", "desc": "Mem"}], "extension": "AVX", "description": "Conditionally loads single-precision floating-point values from memory into a YMM register based on per-element mask bits; unset mask bits leave destination elements unchanged. This is a masked memory read operation where the high bit of each 32-bit mask element controls whether the corresponding FP32 is loaded. No flags are modified.", "pseudocode": "for i ← 0 to 7 do\n  if ymm2[i*32+31] == 1 then\n    ymm1[i*32+31:i*32] ← [memory_address + i*4]\n  end if\nend for", "example": "VMASKMOVPS ymm1, ymm2, [rbp-32]"}
{"mnemonic": "vmaskmovpd", "architecture": "x86", "full_name": "Conditional Move Packed Double-Precision", "summary": "Conditionally loads/stores doubles based on mask.", "syntax": "VMASKMOVPD ymm1, ymm2, m256", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 2D /r", "length": "5+", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "operands": [{"name": "dest", "desc": "YMM"}, {"name": "mask", "desc": "YMM"}, {"name": "src", "desc": "Mem"}], "extension": "AVX", "description": "Conditionally loads double-precision floating-point values from memory into a YMM register based on per-element mask bits; unset mask bits leave destination elements unchanged. This is the FP64 variant of VMASKMOVPS where the high bit of each 64-bit mask element controls the corresponding load. No flags are affected.", "pseudocode": "for i ← 0 to 3 do\n  if ymm2[i*64+63] == 1 then\n    ymm1[i*64+63:i*64] ← [memory_address + i*8]\n  end if\nend for", "example": "VMASKMOVPD ymm1, ymm2, [rbp-32]"}
{"mnemonic": "vpgatherdd", "architecture": "x86", "full_name": "Gather Packed Doubleword with Signed Doubleword Indices", "summary": "Gathers 32-bit integers using 32-bit indices.", "syntax": "VPGATHERDD ymm1, [base+ymm_idx*scale], ymm_mask", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W0 90 /r", "length": "5+", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "operands": [{"name": "dest", "desc": "YMM"}, {"name": "mem", "desc": "Base+Idx"}, {"name": "mask", "desc": "YMM"}], "extension": "AVX2", "description": "Gathers four doubleword (32-bit) integers from memory using 32-bit sign-extended indices in a YMM register, with per-element masking to conditionally perform each load. Each element of the destination YMM is loaded from [base + ymm_index[i] * scale] if the corresponding mask bit is set; mask elements are zeroed after a successful gather. This instruction serializes memory operations and sets mask elements to zero for loaded lanes.", "pseudocode": "for i ← 0 to 3 do\n  if mask_ymm[i*32+31] == 1 then\n    ymm1[i*32+31:i*32] ← [base + sign_extend(ymm_idx[i*32+31:i*32]) * scale]\n    mask_ymm[i*32+31:i*32] ← 0\n  end if\nend for", "example": "VPGATHERDD ymm1, [base+ymm_idx*scale], ymm_mask"}
{"mnemonic": "vpgatherdq", "architecture": "x86", "full_name": "Gather Packed Quadword with Signed Doubleword Indices", "summary": "Gathers 64-bit integers using 32-bit indices.", "syntax": "VPGATHERDQ ymm1, [base+xmm_idx*scale], ymm_mask", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W1 90 /r", "length": "5+", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "operands": [{"name": "dest", "desc": "YMM"}, {"name": "mem", "desc": "Base+Idx"}, {"name": "mask", "desc": "YMM"}], "extension": "AVX2", "description": "Gathers eight 64-bit integers from memory using four 32-bit signed indices packed in an XMM register, with scale and base address, into a YMM destination. The mask register (YMM) controls which elements are gathered; masked-out elements in the destination are zeroed. All memory access and mask updates occur in parallel, and the instruction serializes the CPU pipeline during execution.", "pseudocode": "for i in 0 to 3:\n  if mask[2*i+1:2*i] == all_ones_64bit:\n    addr ← base + sign_extend_32_to_64(index[i*32+31:i*32]) * scale\n    dest[64*i+63:64*i] ← [addr]\n    mask[64*i+63:64*i] ← all_ones_64bit\n  else:\n    dest[64*i+63:64*i] ← 0\n    mask[64*i+63:64*i] ← 0", "example": "VPGATHERDQ ymm1, [base+xmm_idx*scale], ymm_mask"}
{"mnemonic": "vpgatherqd", "architecture": "x86", "full_name": "Gather Packed Doubleword with Signed Quadword Indices", "summary": "Gathers 32-bit integers using 64-bit indices.", "syntax": "VPGATHERQD xmm1, [base+ymm_idx*scale], xmm_mask", "encoding": {"format": "VEX", "hex_opcode": "VEX.128.66.0F38.W0 91 /r", "length": "5+", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "mem", "desc": "Base+Idx"}, {"name": "mask", "desc": "XMM"}], "extension": "AVX2", "description": "Gathers four 32-bit integers from memory using four 64-bit signed indices packed in a YMM register, with scale and base address, into an XMM destination (lower half). The mask register (XMM) controls which elements are gathered; masked-out elements are zeroed and their corresponding mask bits are cleared. The instruction serializes execution and performs all memory accesses in parallel.", "pseudocode": "for i in 0 to 3:\n  if mask[32*i+31:32*i] == all_ones_32bit:\n    addr ← base + index[64*i+63:64*i] * scale\n    dest[32*i+31:32*i] ← [addr]\n    mask[32*i+31:32*i] ← all_ones_32bit\n  else:\n    dest[32*i+31:32*i] ← 0\n    mask[32*i+31:32*i] ← 0", "example": "VPGATHERQD xmm1, [base+ymm_idx*scale], xmm_mask"}
{"mnemonic": "vpgatherqq", "architecture": "x86", "full_name": "Gather Packed Quadword with Signed Quadword Indices", "summary": "Gathers 64-bit integers using 64-bit indices.", "syntax": "VPGATHERQQ ymm1, [base+ymm_idx*scale], ymm_mask", "encoding": {"format": "VEX", "hex_opcode": "VEX.256.66.0F38.W1 91 /r", "length": "5+", "visual_parts": [], "binary_pattern": "VEX | opcode | ModRM", "bit_positions": "+0 | +3 | +4"}, "operands": [{"name": "dest", "desc": "YMM"}, {"name": "mem", "desc": "Base+Idx"}, {"name": "mask", "desc": "YMM"}], "extension": "AVX2", "description": "Gathers four 64-bit integers from memory using four 64-bit signed indices packed in a YMM register, with scale and base address, into a YMM destination. The mask register (YMM) controls which elements are gathered; masked-out elements are zeroed and their corresponding mask bits are cleared. All memory accesses execute in parallel, and the instruction causes pipeline serialization.", "pseudocode": "for i in 0 to 3:\n  if mask[64*i+63:64*i] == all_ones_64bit:\n    addr ← base + index[64*i+63:64*i] * scale\n    dest[64*i+63:64*i] ← [addr]\n    mask[64*i+63:64*i] ← all_ones_64bit\n  else:\n    dest[64*i+63:64*i] ← 0\n    mask[64*i+63:64*i] ← 0", "example": "VPGATHERQQ ymm1, [base+ymm_idx*scale], ymm_mask"}
{"mnemonic": "vpabsq", "architecture": "x86", "full_name": "Packed Absolute Value Quadword", "summary": "Computes absolute value of 64-bit integers.", "syntax": "VPABSQ zmm1 {k1}, zmm2/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 1F /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 1F", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src", "desc": "ZMM/Mem"}], "extension": "AVX-512F", "description": "Computes the absolute value of eight packed 64-bit signed integers from the source operand, storing the results in the destination ZMM register. Opmask register k1 selectively updates destination elements (merging or zeroing based on the mask mode). The operation handles the extreme case where abs(INT64_MIN) = INT64_MIN with wraparound; no overflow flags are set.", "pseudocode": "for i in 0 to 7:\n  if k1[i] or not masked:\n    src_val ← src[64*i+63:64*i]\n    if src_val < 0:\n      dest[64*i+63:64*i] ← -src_val\n    else:\n      dest[64*i+63:64*i] ← src_val\n  else if zeroing:\n    dest[64*i+63:64*i] ← 0", "example": "VPABSQ zmm1, zmm2/m512"}
{"mnemonic": "vpmaxsq", "architecture": "x86", "full_name": "Maximum of Packed Signed Quadword Integers", "summary": "Returns maximum of signed 64-bit integers.", "syntax": "VPMAXSQ zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 3D /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 3D", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src1", "desc": "ZMM"}, {"name": "src2", "desc": "ZMM/Mem"}], "extension": "AVX-512F", "description": "Computes the element-wise maximum of eight packed 64-bit signed integers from two source operands, storing results in the destination ZMM register. Opmask register k1 selectively updates destination elements. The operation compares signed values and has no effect on EFLAGS; results are computed in parallel.", "pseudocode": "for i in 0 to 7:\n  if k1[i] or not masked:\n    src1_val ← src1[64*i+63:64*i]\n    src2_val ← src2[64*i+63:64*i]\n    if src1_val >_signed src2_val:\n      dest[64*i+63:64*i] ← src1_val\n    else:\n      dest[64*i+63:64*i] ← src2_val\n  else if zeroing:\n    dest[64*i+63:64*i] ← 0", "example": "VPMAXSQ zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpmaxuq", "architecture": "x86", "full_name": "Maximum of Packed Unsigned Quadword Integers", "summary": "Returns maximum of unsigned 64-bit integers.", "syntax": "VPMAXUQ zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 3F /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 3F", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src1", "desc": "ZMM"}, {"name": "src2", "desc": "ZMM/Mem"}], "extension": "AVX-512F", "description": "Computes the element-wise maximum of eight packed 64-bit unsigned integers from two source operands, storing results in the destination ZMM register. Opmask register k1 selectively updates destination elements. The operation compares unsigned values and does not affect EFLAGS; all comparisons execute in parallel.", "pseudocode": "for i in 0 to 7:\n  if k1[i] or not masked:\n    src1_val ← src1[64*i+63:64*i]\n    src2_val ← src2[64*i+63:64*i]\n    if src1_val >_unsigned src2_val:\n      dest[64*i+63:64*i] ← src1_val\n    else:\n      dest[64*i+63:64*i] ← src2_val\n  else if zeroing:\n    dest[64*i+63:64*i] ← 0", "example": "VPMAXUQ zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpminsq", "architecture": "x86", "full_name": "Minimum of Packed Signed Quadword Integers", "summary": "Returns minimum of signed 64-bit integers.", "syntax": "VPMINSQ zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 39 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 39", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src1", "desc": "ZMM"}, {"name": "src2", "desc": "ZMM/Mem"}], "extension": "AVX-512F", "description": "Computes the element-wise minimum of eight packed 64-bit signed integers from two source operands, storing results in the destination ZMM register. Opmask register k1 selectively updates destination elements. The operation compares signed values and does not modify EFLAGS; all comparisons are performed in parallel.", "pseudocode": "for i in 0 to 7:\n  if k1[i] or not masked:\n    src1_val ← src1[64*i+63:64*i]\n    src2_val ← src2[64*i+63:64*i]\n    if src1_val <_signed src2_val:\n      dest[64*i+63:64*i] ← src1_val\n    else:\n      dest[64*i+63:64*i] ← src2_val\n  else if zeroing:\n    dest[64*i+63:64*i] ← 0", "example": "VPMINSQ zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vpminuq", "architecture": "x86", "full_name": "Minimum of Packed Unsigned Quadword Integers", "summary": "Returns minimum of unsigned 64-bit integers.", "syntax": "VPMINUQ zmm1 {k1}, zmm2, zmm3/m512", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F38.W1 3B /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 38 | 3B", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src1", "desc": "ZMM"}, {"name": "src2", "desc": "ZMM/Mem"}], "extension": "AVX-512F", "description": "Computes the element-wise minimum of eight packed 64-bit unsigned integers from two source operands, storing results in the destination ZMM register. Opmask register k1 selectively updates destination elements. The operation compares unsigned values and leaves EFLAGS unchanged; all comparisons execute in parallel.", "pseudocode": "for i in 0 to 7:\n  if k1[i] or not masked:\n    src1_val ← src1[64*i+63:64*i]\n    src2_val ← src2[64*i+63:64*i]\n    if src1_val <_unsigned src2_val:\n      dest[64*i+63:64*i] ← src1_val\n    else:\n      dest[64*i+63:64*i] ← src2_val\n  else if zeroing:\n    dest[64*i+63:64*i] ← 0", "example": "VPMINUQ zmm1, zmm2, zmm3/m512"}
{"mnemonic": "vprolq", "architecture": "x86", "full_name": "Rotate Left Quadword", "summary": "Rotates 64-bit integers left.", "syntax": "VPROLQ zmm1 {k1}, zmm2, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F.W1 72 /1 ib", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 72 | ModRM", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src", "desc": "ZMM"}, {"name": "count", "desc": "Imm"}], "extension": "AVX-512F", "description": "Rotates each 64-bit quadword in the source ZMM register left by an immediate count, writing the result to the destination ZMM register under write-mask control. This is a vectorized rotate-left operation with no effect on EFLAGS. Available only in 64-bit mode and requires AVX-512F support.", "pseudocode": "for i = 0 to 7:\n  if k1[i]:\n    zmm1[64*i : 64*i+63] ← (zmm2[64*i : 64*i+63] << count) | (zmm2[64*i : 64*i+63] >> (64 - count))\n  else if zeroing:\n    zmm1[64*i : 64*i+63] ← 0", "example": "VPROLQ zmm1, zmm2, 3"}
{"mnemonic": "vprorq", "architecture": "x86", "full_name": "Rotate Right Quadword", "summary": "Rotates 64-bit integers right.", "syntax": "VPRORQ zmm1 {k1}, zmm2, imm8", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.66.0F.W1 72 /0 ib", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 66 | 0F | 72 | ModRM", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "ZMM"}, {"name": "src", "desc": "ZMM"}, {"name": "count", "desc": "Imm"}], "extension": "AVX-512F", "description": "Rotates each 64-bit quadword in the source ZMM register right by an immediate count, writing the result to the destination ZMM register under write-mask control. This is a vectorized rotate-right operation with no effect on EFLAGS. Available only in 64-bit mode and requires AVX-512F support.", "pseudocode": "for i = 0 to 7:\n  if k1[i]:\n    zmm1[64*i : 64*i+63] ← (zmm2[64*i : 64*i+63] >> count) | (zmm2[64*i : 64*i+63] << (64 - count))\n  else if zeroing:\n    zmm1[64*i : 64*i+63] ← 0", "example": "VPRORQ zmm1, zmm2, 3"}
{"mnemonic": "vpmovswb", "architecture": "x86", "full_name": "Truncate Signed Word to Byte", "summary": "Down-converts 16-bit integers to 8-bit signed saturate.", "syntax": "VPMOVSWB xmm1/m128 {k1}, zmm2", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.256.F3.0F38.W0 20 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | F3 | 0F | 38 | 20", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "ZMM"}], "extension": "AVX-512F", "description": "Truncates 16-bit signed words from a ZMM register to 8-bit signed bytes with saturation, storing the result in an XMM register or 128-bit memory location under write-mask control. Out-of-range values saturate to the signed byte limits (-128 to 127). No flags are affected. This instruction requires AVX-512F and operates only in 64-bit mode.", "pseudocode": "for i = 0 to 31:\n  temp ← zmm2[16*i : 16*i+15]\n  if temp > 127:\n    xmm1[8*i : 8*i+7] ← 127 (under mask k1[i])\n  else if temp < -128:\n    xmm1[8*i : 8*i+7] ← -128 (under mask k1[i])\n  else:\n    xmm1[8*i : 8*i+7] ← temp[7:0] (under mask k1[i])\n  if not k1[i] and zeroing:\n    xmm1[8*i : 8*i+7] ← 0", "example": "VPMOVSWB xmm1/m128, zmm2"}
{"mnemonic": "vpmovsqb", "architecture": "x86", "full_name": "Truncate Signed Quadword to Byte", "summary": "Down-converts 64-bit integers to 8-bit signed saturate.", "syntax": "VPMOVSQB xmm1/m128 {k1}, zmm2", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.512.F3.0F38.W0 22 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | F3 | 0F | 38 | 22", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "ZMM"}], "extension": "AVX-512F", "description": "Truncates 64-bit signed quadwords from a ZMM register to 8-bit signed bytes with saturation, storing the result in an XMM register or 128-bit memory location under write-mask control. Out-of-range values saturate to signed byte limits (-128 to 127). No flags are affected. This instruction requires AVX-512F and operates only in 64-bit mode.", "pseudocode": "for i = 0 to 7:\n  temp ← zmm2[64*i : 64*i+63]\n  if temp > 127:\n    xmm1[8*i : 8*i+7] ← 127 (under mask k1[i])\n  else if temp < -128:\n    xmm1[8*i : 8*i+7] ← -128 (under mask k1[i])\n  else:\n    xmm1[8*i : 8*i+7] ← temp[7:0] (under mask k1[i])\n  if not k1[i] and zeroing:\n    xmm1[8*i : 8*i+7] ← 0", "example": "VPMOVSQB xmm1/m128, zmm2"}
{"mnemonic": "vpmovuswb", "architecture": "x86", "full_name": "Truncate Unsigned Word to Byte", "summary": "Down-converts 16-bit integers to 8-bit unsigned saturate.", "syntax": "VPMOVUSWB xmm1/m128 {k1}, zmm2", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.256.F3.0F38.W0 10 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | F3 | 0F | 38 | 10", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "ZMM"}], "extension": "AVX-512F", "description": "Truncates 16-bit unsigned words from a ZMM register to 8-bit unsigned bytes with saturation, storing the result in an XMM register or 128-bit memory location under write-mask control. Out-of-range values saturate to the unsigned byte limit (0 to 255). No flags are affected. This instruction requires AVX-512F and operates only in 64-bit mode.", "pseudocode": "for i = 0 to 31:\n  temp ← zmm2[16*i : 16*i+15]\n  if temp > 255:\n    xmm1[8*i : 8*i+7] ← 255 (under mask k1[i])\n  else:\n    xmm1[8*i : 8*i+7] ← temp[7:0] (under mask k1[i])\n  if not k1[i] and zeroing:\n    xmm1[8*i : 8*i+7] ← 0", "example": "VPMOVUSWB xmm1/m128, zmm2"}
{"mnemonic": "vpmovusqb", "architecture": "x86", "full_name": "Truncate Unsigned Quadword to Byte", "summary": "Down-converts 64-bit integers to 8-bit unsigned saturate.", "syntax": "VPMOVUSQB xmm1/m128 {k1}, zmm2", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.128.F3.0F38.W0 12 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | F3 | 0F | 38 | 12", "bit_positions": "+0 | +4 | +5 | +6 | +7"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src", "desc": "ZMM"}], "extension": "AVX-512F", "description": "Truncates 64-bit unsigned quadwords from a ZMM register to 8-bit unsigned bytes with saturation, storing the result in an XMM register or 128-bit memory location under write-mask control. Out-of-range values saturate to the unsigned byte limit (0 to 255). No flags are affected. This instruction requires AVX-512F and operates only in 64-bit mode.", "pseudocode": "for i = 0 to 7:\n  temp ← zmm2[64*i : 64*i+63]\n  if temp > 255:\n    xmm1[8*i : 8*i+7] ← 255 (under mask k1[i])\n  else:\n    xmm1[8*i : 8*i+7] ← temp[7:0] (under mask k1[i])\n  if not k1[i] and zeroing:\n    xmm1[8*i : 8*i+7] ← 0", "example": "VPMOVUSQB xmm1/m128, zmm2"}
{"mnemonic": "kaddw", "architecture": "x86", "full_name": "Add Masks Word", "summary": "Adds two 16-bit mask registers.", "syntax": "KADDW k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.0F.W0 4A /r", "length": "3+", "visual_parts": [], "binary_pattern": "EVEX | 0F | 4A", "bit_positions": "+0 | +4 | +5"}, "operands": [{"name": "dest", "desc": "k-reg"}, {"name": "src1", "desc": "k-reg"}, {"name": "src2", "desc": "k-reg"}], "extension": "AVX-512DQ", "description": "Adds two 16-bit mask registers and stores the result in a third 16-bit mask register, with write-mask control applied. The addition is performed on the full 16-bit width of each mask operand; no carry is defined beyond bit 15. No EFLAGS are modified. This instruction requires AVX-512DQ and operates only in 64-bit mode.", "pseudocode": "k1 ← (k2 + k3)[15:0]", "example": "KADDW k1, k2, k3"}
{"mnemonic": "kaddb", "architecture": "x86", "full_name": "Add Masks Byte", "summary": "Adds two 8-bit mask registers.", "syntax": "KADDB k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.66.0F.W0 4A /r", "length": "3+", "visual_parts": [], "binary_pattern": "EVEX | 0F | 4A", "bit_positions": "+0 | +4 | +5"}, "operands": [{"name": "dest", "desc": "k-reg"}, {"name": "src1", "desc": "k-reg"}, {"name": "src2", "desc": "k-reg"}], "extension": "AVX-512DQ", "description": "Adds two 8-bit mask registers and stores the result in a third 8-bit mask register, with write-mask control applied. The addition is performed on the full 8-bit width of each mask operand; no carry is defined beyond bit 7. No EFLAGS are modified. This instruction requires AVX-512DQ and operates only in 64-bit mode.", "pseudocode": "k1 ← (k2 + k3)[7:0]", "example": "KADDB k1, k2, k3"}
{"mnemonic": "kunpckbw", "architecture": "x86", "full_name": "Unpack and Interleave Masks Byte to Word", "summary": "Interleaves 8-bit masks into 16-bit mask.", "syntax": "KUNPCKBW k1, k2, k3", "encoding": {"format": "EVEX", "hex_opcode": "VEX.L1.66.0F.W0 4B /r", "length": "3+", "visual_parts": [], "binary_pattern": "EVEX | 0F | 4B", "bit_positions": "+0 | +4 | +5"}, "operands": [{"name": "dest", "desc": "k-reg"}, {"name": "src1", "desc": "k-reg"}, {"name": "src2", "desc": "k-reg"}], "extension": "AVX-512", "description": "Unpacks and interleaves two 8-bit mask register values into a 16-bit mask register. The operation treats the 8-bit sources as packed bit fields and expands them with interleaving to produce a 16-bit result. No flags are affected by this operation.", "pseudocode": "k1[15:8] ← k3[7:0]\nk1[7:0] ← k2[7:0]", "example": "KUNPCKBW k1, k2, k3"}
{"mnemonic": "vaddss", "architecture": "x86", "full_name": "Add Scalar Single-Precision (EVEX)", "summary": "Adds scalar single precision (EVEX encoded with masking).", "syntax": "VADDSS xmm1 {k1}, xmm2, xmm3/m32", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.F3.0F.W0 58 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 58", "bit_positions": "+0 | +4"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src1", "desc": "XMM"}, {"name": "src2", "desc": "XMM/Mem"}], "extension": "AVX-512F", "description": "Adds the low 32-bit single-precision floating-point operands of xmm2 and xmm3/m32, stores the result in xmm1, and leaves bits 127:32 of xmm1 unchanged. Supports EVEX encoding with optional write-mask (k1) and zeroing behavior. No integer flags are affected.", "pseudocode": "xmm1[31:0] ← xmm2[31:0] + xmm3/m32[31:0]\nxmm1[127:32] ← (k1 is used) ? (zeroing ? 0 : xmm1[127:32]) : xmm1[127:32]", "example": "VADDSS xmm1, xmm2, xmm3/m32"}
{"mnemonic": "vmulss", "architecture": "x86", "full_name": "Multiply Scalar Single-Precision (EVEX)", "summary": "Multiplies scalar single precision (EVEX encoded with masking).", "syntax": "VMULSS xmm1 {k1}, xmm2, xmm3/m32", "encoding": {"format": "EVEX", "hex_opcode": "EVEX.LLIG.F3.0F.W0 59 /r", "length": "6+", "visual_parts": [], "binary_pattern": "EVEX | 59", "bit_positions": "+0 | +4"}, "operands": [{"name": "dest", "desc": "XMM"}, {"name": "src1", "desc": "XMM"}, {"name": "src2", "desc": "XMM/Mem"}], "extension": "AVX-512F", "description": "Multiplies the low 32-bit single-precision floating-point operands of xmm2 and xmm3/m32, stores the result in xmm1, and leaves bits 127:32 of xmm1 unchanged. Supports EVEX encoding with optional write-mask (k1) and zeroing behavior. No integer flags are affected.", "pseudocode": "xmm1[31:0] ← xmm2[31:0] * xmm3/m32[31:0]\nxmm1[127:32] ← (k1 is used) ? (zeroing ? 0 : xmm1[127:32]) : xmm1[127:32]", "example": "VMULSS xmm1, xmm2, xmm3/m32"}
{"mnemonic": "xsaveopt", "architecture": "x86", "full_name": "Save Processor Extended States Optimized", "summary": "Saves state components (optimized for Modified state).", "syntax": "XSAVEOPT m", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F AE /6", "length": "3+", "visual_parts": [], "binary_pattern": "0F | AE | ModRM", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "Memory"}], "extension": "XSAVEOPT", "description": "Saves processor extended state components (FPU, SSE, AVX, etc.) to the memory location specified by EDX:EAX, using an optimized algorithm that tracks which state components have been modified. Requires XSAVEOPT feature support (CPUID EAX=0DH:EAX bit 0). No flags are modified; this instruction serializes execution and may cause VM exits in virtualized environments.", "pseudocode": "mem[EDX:EAX] ← XSTATE_COMPONENTS_PER_XCRF_BITMASK(ECX)\nXSTATE_HEADER[EDX:EAX + 512] ← MODIFIED_STATE_TRACKING", "example": "XSAVEOPT [rbp-8]"}
{"mnemonic": "xsavec", "architecture": "x86", "full_name": "Save Processor Extended States with Compaction", "summary": "Saves state components using compaction.", "syntax": "XSAVEC m", "encoding": {"format": "Legacy", "hex_opcode": "NP 0F C7 /4", "length": "3+", "visual_parts": [], "binary_pattern": "0F | C7 | ModRM", "bit_positions": "+0 | +1 | +2"}, "operands": [{"name": "dest", "desc": "Memory"}], "extension": "XSAVEC", "description": "Saves processor extended state components to the memory location specified by EDX:EAX using compaction, removing unused state and reducing the saved data size. Requires XSAVEC feature support (CPUID EAX=0DH, ECX=1:EAX bit 1). No flags are modified; this instruction serializes execution and may trigger VM exits in virtualized environments.", "pseudocode": "mem[EDX:EAX] ← COMPACT_XSTATE_COMPONENTS()\nXSTATE_HEADER[EDX:EAX + 512] ← COMPACTED_SIZE_AND_LAYOUT", "example": "XSAVEC [rbp-8]"}
{"mnemonic": "vmfunc", "architecture": "x86", "full_name": "Virtual Machine Function", "summary": "Invoke VM function specified in EAX.", "syntax": "VMFUNC", "encoding": {"format": "VMX", "hex_opcode": "NP 0F 01 D4", "length": "3", "visual_parts": [], "binary_pattern": "0F | 01 | D4", "bit_positions": "+0 | +1 | +2"}, "operands": [], "extension": "VMX", "description": "Invokes a VM function as specified by the function number in EAX and additional parameters in ECX. Only valid in VMX non-root operation (guest mode) and transitions control to the host via VM exit. Privilege level: VMX non-root; will raise #UD if not in VMX operation or if called in root mode.", "pseudocode": "FUNC_NUM ← EAX\nFUNC_PARAM ← ECX\nINVOKE_VMFUNCTION(FUNC_NUM, FUNC_PARAM)\nVMEXIT_TO_HOST", "example": "VMFUNC"}
{"mnemonic": "ud0", "architecture": "x86", "full_name": "Undefined Instruction 0", "summary": "Generates invalid opcode exception.", "syntax": "UD0", "encoding": {"format": "Legacy", "hex_opcode": "0F FF /r", "length": "2", "visual_parts": [], "binary_pattern": "0F | FF", "bit_positions": "+0 | +1"}, "operands": [], "extension": "Base", "description": "Generates an invalid opcode exception (#UD). This instruction is reserved for generating intentional undefined instruction exceptions in all processor modes, useful for debugging and kernel routines. No flags are modified; execution terminates with a #UD fault.", "pseudocode": "RAISE_EXCEPTION(#UD)", "example": "UD0"}
{"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>)"}
{"mnemonic": "xvi4ger8", "architecture": "PowerISA", "full_name": "VSX Vector Integer 4-bit GER (Rank-8 Update)", "summary": "Performs an accumulation of eight outer products (rank 8 update) using signed 4-bit integers from two vector scalar registers.", "syntax": "xvi4ger8 AT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | AT | XA | XB | 34", "hex_opcode": "0xEC000118", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "AT", "clean": "AT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "34", "clean": "34"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A (4-bit)"}, {"name": "XB", "desc": "Src B (4-bit)"}], "extension": "MMA", "description": "The instruction multiplies corresponding elements of the matrices X and Y, accumulates the results, and stores them in the accumulator ACC[AT]. The result is chopped to a 32-bit signed integer.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nPMSK ←0b11111111\nXMSK ←0b1111\nYMSK ←0b1111\n\ndo i = 0 to 3\ndo j = 0 to 3\n   if XMSK.bit[i] & YMSK.bit[j] then do\n      prod0 ←(PMSK.bit[0]=0) ? 0 : EXTS(VSR[32×AX+A].word[i].nibble[0]) * EXTS(VSR[32×BX+B].word[j].nibble[0])\n      prod1 ←(PMSK.bit[1]=0) ? 0 : EXTS(VSR[32×AX+A].word[i].nibble[1]) * EXTS(VSR[32×BX+B].word[j].nibble[1])\n      prod2 ←(PMSK.bit[2]=0) ? 0 : EXTS(VSR[32×AX+A].word[i].nibble[2]) * EXTS(VSR[32×BX+B].word[j].nibble[2])\n      prod3 ←(PMSK.bit[3]=0) ? 0 : EXTS(VSR[32×AX+A].word[i].nibble[3]) * EXTS(VSR[32×BX+B].word[j].nibble[3])\n      prod4 ←(PMSK.bit[4]=0) ? 0 : EXTS(VSR[32×AX+A].word[i].nibble[4]) * EXTS(VSR[32×BX+B].word[j].nibble[4])\n      prod5 ←(PMSK.bit[5]=0) ? 0 : EXTS(VSR[32×AX+A].word[i].nibble[5]) * EXTS(VSR[32×BX+B].word[j].nibble[5])\n      prod6 ←(PMSK.bit[6]=0) ? 0 : EXTS(VSR[32×AX+A].word[i].nibble[6]) * EXTS(VSR[32×BX+B].word[j].nibble[6])\n      prod7 ←(PMSK.bit[7]=0) ? 0 : EXTS(VSR[32×AX+A].word[i].nibble[7]) * EXTS(VSR[32×BX+B].word[j].nibble[7])\n\n      psum ←prod0 + prod1 + prod2 + prod3 + prod4 + prod5 + prod6 + prod7\n\n      ACC[AT][i].word[j] ←CHOP32( psum )\n   end\n   else\n      ACC[AT][i].word[j] ←0x0000_0000\nend\nend", "page_found": "Page 917 - 918", "programming_notes": "Let X be the 8×4 matrix of 4-bit signed integer values contained in VSR[XA] in row-major format.\nLet Y be the 8×4 matrix of 4-bit signed integer values contained in VSR[XB] in row-major format.\nLet ACC[AT] be the Accumulator containing a 4×4 matrix of 32-bit signed-integer values.", "special_registers": "MSR", "example": "xvi4ger8 acc0, vs2, vs3"}
{"mnemonic": "xvi4ger8pp", "architecture": "PowerISA", "full_name": "VSX Vector Integer 4-bit GER (Rank-8 Update) Plus/Plus", "summary": "Unsigned 4-bit integer matrix multiply accumulate.", "syntax": "xvi4ger8pp AT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | AT | XA | XB | 35", "hex_opcode": "0xEC000110", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "AT", "clean": "AT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "35", "clean": "35"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "MMA", "description": "Performs an unsigned 4-bit integer matrix multiplication with rank-8 accumulation, accumulating the result with plus-signed saturation. This MMA instruction multiplies 4-bit elements from two VSX registers and adds the partial products to an MMA accumulator, treating both input and output as unsigned values. The plus/plus variant saturates on overflow using unsigned saturation semantics.", "pseudocode": "AT ← ACC[AT] + (XA × XB)", "page_found": "Page 918", "special_registers": "FPSCR, XER", "programming_notes": "This instruction is commonly used for matrix multiplication and accumulation operations on VSX registers with saturation handling. Ensure that the input matrices are correctly aligned and masked as per requirements. The instruction operates at a privilege level that allows access to FPSCR and XER, and it may raise exceptions if there are issues with operand alignment or access rights. Performance can be optimized by ensuring that the masks (XMSK and YMSK) are efficiently set to minimize unnecessary computations.", "example": "xvi4ger8pp acc0, vs2, vs3"}
{"mnemonic": "pmxvi4ger8", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector Integer 4-bit GER", "summary": "Masked 4-bit integer matrix multiply.", "syntax": "pmxvi4ger8 AT, XA, XB, XMSK, YMSK", "encoding": {"format": "MMIRR-form", "binary_pattern": "1 | 3 | PMSK | XMSK | YMSK | 0 | 59 | AT | / | XA | XB | 3 | AX | BX | /", "hex_opcode": "0x07900000EC000118", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "11", "clean": "11"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0 | 6 | 8 | 9 | 14 | 32 | 38 | 41 | 43 | 48 | 53 | 56 | 57 | 58 | "}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "XMSK", "desc": "Mask A"}, {"name": "YMSK", "desc": "Mask B"}], "extension": "Prefixed", "description": "Performs a masked unsigned 4-bit integer matrix multiplication with rank-8 accumulation using separate row and column masks. This prefixed MMA instruction multiplies 4-bit elements from two VSX registers and adds the partial products to an MMA accumulator, with XMSK controlling which rows and YMSK controlling which columns participate. The result is treated as unsigned.", "pseudocode": "AT ← ACC[AT] + ((XA & XMSK) × (XB & YMSK))", "page_found": "Page 918", "programming_notes": "The pmxvi4ger8 instruction is useful for performing masked vector integer operations, multiplying and accumulating products of signed integers from two vectors based on a mask. Ensure that the mask registers (XMSK, YMSK) are correctly set to control which elements are processed. The operation requires proper alignment of VSX registers, and results are clamped to 32-bit signed integers to prevent overflow. This instruction operates at privilege level 0.", "example": "pmxvi4ger8 acc0, vs2, vs3, 15, 15"}
{"mnemonic": "pmxvi4ger8pp", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector Integer 4-bit GER Plus/Plus", "summary": "Masked unsigned 4-bit integer matrix multiply.", "syntax": "pmxvi4ger8pp AT, XA, XB, XMSK, YMSK", "encoding": {"format": "MMIRR-form", "binary_pattern": "1 | 3 | PMSK | XMSK | YMSK | 0 | 59 | AT | / | XA | XB | 3 | AX | BX | /", "hex_opcode": "0x07900000EC000110", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "11", "clean": "11"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0 | 6 | 8 | 9 | 14 | 32 | 38 | 41 | 43 | 48 | 53 | 56 | 57 | 58 | "}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "XMSK", "desc": "Mask A"}, {"name": "YMSK", "desc": "Mask B"}], "extension": "Prefixed", "description": "Performs a masked unsigned 4-bit integer matrix multiplication with rank-8 accumulation and plus-signed saturation using separate row and column masks. This prefixed MMA instruction multiplies masked 4-bit elements from two VSX registers and accumulates the partial products into an MMA accumulator with unsigned saturation on overflow. XMSK controls row participation and YMSK controls column participation.", "pseudocode": "AT ← ACC[AT] + sat_u((XA & XMSK) × (XB & YMSK))", "page_found": "Page 918", "special_registers": "FPSCR", "programming_notes": "This instruction is useful for performing masked vectorized integer operations with saturation, ideal for applications requiring precise control over overflow conditions. Ensure that the mask registers (XMSK and YMSK) are correctly set to avoid unintended computations. The operation is performed at the user privilege level, but care must be taken to handle potential exceptions related to invalid register access or alignment issues. Performance may vary based on the specific data patterns and the effectiveness of the masking applied.", "example": "pmxvi4ger8pp acc0, vs2, vs3, 15, 15"}
{"mnemonic": "dst", "architecture": "PowerISA", "full_name": "Data Stream Touch", "summary": "Initiates a hardware data stream prefetch (AltiVec Legacy).", "syntax": "dst RA, RB, STRM", "encoding": {"format": "X-form", "binary_pattern": "31 | STRM | RA | RB | 342 | /", "hex_opcode": "0x7C0002AC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "STRM", "clean": "STRM"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "342", "clean": "342"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}, {"name": "STRM", "desc": "Stream ID"}], "extension": "Base", "description": "Initiates a hardware prefetch stream for data that is likely to be loaded in the near future. The instruction computes an effective address from RA and RB and hints to the memory subsystem to begin streaming data into the cache with the temporal locality specified by STRM. This is an advisory instruction with no architectural side effects if the hardware does not support data streaming.", "pseudocode": "EA ← (RA | 0) + RB; InitiateDataStream(EA, STRM, isStore=0, isTransient=0)", "example": "dst r4, r5, 0"}
{"mnemonic": "dstt", "architecture": "PowerISA", "full_name": "Data Stream Touch Transient", "summary": "Initiates a transient (non-temporal) data stream prefetch.", "syntax": "dstt RA, RB, STRM", "encoding": {"format": "X-form", "binary_pattern": "31 | STRM | RA | RB | 342 | /", "hex_opcode": "0x7C0002AC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "STRM", "clean": "STRM"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "342", "clean": "342"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}, {"name": "STRM", "desc": "Stream ID"}], "extension": "Base", "description": "Initiates a hardware prefetch stream for transient (non-temporal) data that is likely to be loaded in the near future and not reused. The instruction computes an effective address from RA and RB and hints to the memory subsystem to begin streaming data with transient semantics specified by STRM. This is an advisory instruction that may reduce cache pollution for one-time accesses.", "pseudocode": "EA ← (RA | 0) + RB; InitiateDataStream(EA, STRM, isStore=0, isTransient=1)", "example": "dstt r4, r5, 0"}
{"mnemonic": "dstst", "architecture": "PowerISA", "full_name": "Data Stream Touch for Store", "summary": "Initiates a prefetch for writing.", "syntax": "dstst RA, RB, STRM", "encoding": {"format": "X-form", "binary_pattern": "31 | STRM | RA | RB | 374 | /", "hex_opcode": "0x7C0002EC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "STRM", "clean": "STRM"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "374", "clean": "374"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}, {"name": "STRM", "desc": "Stream ID"}], "extension": "Base", "description": "Initiates a hardware prefetch stream for data that is likely to be written in the near future. The instruction computes an effective address from RA and RB and hints to the memory subsystem to begin preparing the cache line for write-back operations with the temporal locality specified by STRM. This is an advisory instruction supporting store-stream prefetching.", "pseudocode": "EA ← (RA | 0) + RB; InitiateDataStream(EA, STRM, isStore=1, isTransient=0)", "example": "dstst r4, r5, 0"}
{"mnemonic": "dststt", "architecture": "PowerISA", "full_name": "Data Stream Touch for Store Transient", "summary": "Initiates a transient prefetch for writing.", "syntax": "dststt RA, RB, STRM", "encoding": {"format": "X-form", "binary_pattern": "31 | STRM | RA | RB | 374 | /", "hex_opcode": "0x7C0002EC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "STRM", "clean": "STRM"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "374", "clean": "374"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}, {"name": "STRM", "desc": "Stream ID"}], "extension": "Base", "description": "Initiates a hardware prefetch stream for transient (non-temporal) data that is likely to be written in the near future and not reused. The instruction computes an effective address from RA and RB and hints to the memory subsystem to prepare the cache line for write operations with transient semantics. This advisory instruction supports transient store-stream prefetching to reduce cache pollution.", "pseudocode": "EA ← (RA | 0) + RB; InitiateDataStream(EA, STRM, isStore=1, isTransient=1)", "example": "dststt r4, r5, 0"}
{"mnemonic": "dss", "architecture": "PowerISA", "full_name": "Data Stream Stop", "summary": "Stops a data stream prefetch operation.", "syntax": "dss STRM", "encoding": {"format": "X-form", "binary_pattern": "31 | STRM | 0 | 0 | 822 | /", "hex_opcode": "0x7C000666", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "STRM", "clean": "STRM"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "822", "clean": "822"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "STRM", "desc": "Stream ID"}], "extension": "Base", "description": "Stops the hardware prefetch stream identified by STRM. This instruction terminates data stream prefetching for a specific stream, allowing the hardware to cease streaming operations and free associated resources. It is an advisory instruction with no architectural side effects if data streaming is not supported.", "pseudocode": "StopDataStream(STRM)", "example": "dss 0"}
{"mnemonic": "dssall", "architecture": "PowerISA", "full_name": "Data Stream Stop All", "summary": "Stops all active data stream prefetch operations.", "syntax": "dssall", "encoding": {"format": "X-form", "binary_pattern": "31 | 0 | 0 | 0 | 822 | /", "hex_opcode": "0x7C000666", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "822", "clean": "822"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Base", "description": "Stops all active data stream prefetch operations initiated by DSS instructions. This is a privileged instruction that terminates data prefetching without affecting general processor state or condition registers. Used to optimize cache behavior by halting speculative data stream operations.", "programming_notes": "Use dssall to halt all data stream operations, preventing any further processing or transfer of data. This instruction is typically used in scenarios where you need to ensure complete cessation of data flow, such as during system shutdowns or critical error handling. Ensure that this instruction is executed at a privilege level sufficient to control data streams, and be aware that it may trigger exceptions if not properly managed.", "pseudocode": "All data stream prefetch operations are terminated.", "example": "dssall"}
{"mnemonic": "dcba", "architecture": "PowerISA", "full_name": "Data Cache Block Allocate", "summary": "Allocates a cache block without loading from memory (optimization for overwrite).", "syntax": "dcba RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 758 | /", "hex_opcode": "0x7C0005EC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "758", "clean": "758"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Allocates a cache block at the effective address (RA + RB) into the data cache without loading data from memory. This instruction is used as an optimization hint when the application will overwrite the entire cache block, avoiding unnecessary memory traffic. No condition registers or status fields are modified.", "pseudocode": "EA ← (RA) + (RB)\nAllocate cache block at EA without loading from memory", "example": "dcba r4, r5"}
{"mnemonic": "dcbi", "architecture": "PowerISA", "full_name": "Data Cache Block Invalidate", "summary": "Invalidates a cache block (Privileged).", "syntax": "dcbi RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 470 | /", "hex_opcode": "0x7C0003AC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "470", "clean": "470"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Privileged", "programming_notes": "Privileged. Invalidates a cache block without writeback. Use only when you know the block is clean or its contents can be discarded.", "description": "Invalidates the data cache block at effective address (RA + RB), removing it from the cache. This is a privileged instruction used for cache management. The instruction does not modify condition registers and may trigger cache coherency operations on multiprocessor systems.", "pseudocode": "EA ← (RA) + (RB)\nInvalidate cache block at EA", "example": "dcbi r4, r5"}
{"mnemonic": "eciwx", "architecture": "PowerISA", "full_name": "External Control In Word Indexed", "summary": "Loads a word from an external device using the EAR register.", "syntax": "eciwx RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 310 | /", "hex_opcode": "0x7C00026C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "310", "clean": "310"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Loads a 32-bit word from an external control device into RT, using address formation from RA + RB and device selection from the External Address Register (EAR). This instruction requires special external interface hardware support and does not affect condition registers. It is typically used in embedded or specialized processor configurations.", "pseudocode": "EA ← (RA) + (RB)\nRT ← ExternalLoad32(EA, EAR)", "example": "eciwx r3, r4, r5"}
{"mnemonic": "ecowx", "architecture": "PowerISA", "full_name": "External Control Out Word Indexed", "summary": "Stores a word to an external device using the EAR register.", "syntax": "ecowx RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 438 | /", "hex_opcode": "0x7C00036C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "438", "clean": "438"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Stores a 32-bit word from RS to an external control device, using address formation from RA + RB and device selection from the External Address Register (EAR). This instruction requires special external interface hardware support and does not affect condition registers. It is typically used in embedded or specialized processor configurations.", "pseudocode": "EA ← (RA) + (RB)\nExternalStore32(EA, EAR, (RS))", "example": "ecowx r3, r4, r5"}
{"mnemonic": "mcrfs", "architecture": "PowerISA", "full_name": "Move to Condition Register from FPSCR", "summary": "Moves a field from the Floating-Point Status and Control Register (FPSCR) to the Condition Register.", "syntax": "mcrfs BF, BFA", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | / | BFA | / | 64 | /", "hex_opcode": "0xFC000080", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "BFA", "clean": "BFA"}, {"raw": "/", "clean": "/"}, {"raw": "64", "clean": "64"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:13 | 14:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "Target CR"}, {"name": "BFA", "desc": "Src FPSCR"}, {"name": "CRf", "desc": "Condition Register Field"}, {"name": "FPSCRf", "desc": "Floating-Point Status and Control Register Field"}], "extension": "Floating-Point", "pseudocode": "CR[4*BF:4*BF+3] ← FPSCR[4*BFA:4*BFA+3]\nFPSCR[4*BFA:4*BFA+3] ← 0", "special_registers": "CR0, FPSCR", "page_found": "Page 1468 - 1469", "description": "Moves a 4-bit field from the Floating-Point Status and Control Register (FPSCR) into a 4-bit field of the Condition Register (CR). The source field is specified by BFA and the destination field by BF. The corresponding FPSCR field is cleared after the move, and no other status fields are affected.", "programming_notes": "The mcrfs instruction is commonly used to transfer floating-point status and control information from the FPSCR to a general-purpose register. Ensure that the destination register (FRT) is properly aligned for optimal performance. This instruction operates at user privilege level, but accessing certain bits may require higher privileges depending on system configuration. Be cautious of potential exceptions if the FPSCR contains invalid or unexpected values.", "example": "mcrfs cr0, cr1"}
{"mnemonic": "mfmsr", "architecture": "PowerISA", "full_name": "Move From Machine State Register", "summary": "Moves the contents of the Machine State Register (MSR) into a general-purpose register.", "syntax": "mfmsr RT", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | / | / | 83 | /", "hex_opcode": "0x7C0000A6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "83", "clean": "83"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}], "extension": "Privileged", "description": "Moves the entire Machine State Register (MSR) into the general-purpose register RT. This is a privileged instruction that allows reading of system state including interrupt enable, privilege level, and other control bits. No condition registers or status fields are modified by this instruction.", "pseudocode": "RT ← MSR", "programming_notes": "This instruction is privileged.", "page_found": "Page 1145 - 1146", "special_registers": "MSR", "example": "mfmsr r3"}
{"mnemonic": "mtmsr", "architecture": "PowerISA", "full_name": "Move To Machine State Register", "summary": "Sets the Machine State Register (MSR) based on the contents of a source register and a control bit.", "syntax": "mtmsr RS,L", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | / | L | 146 | /", "hex_opcode": "0x7C000124", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "/", "clean": "/"}, {"raw": "L", "clean": "L"}, {"raw": "146", "clean": "146"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "L", "desc": "Load (32/64)"}], "extension": "Privileged", "description": "The MSR is set based on the contents of register RS and the L field. If L=0, specific bits are modified based on logical operations involving RS and the current state of the MSR. If L=1, only certain bits (48 and 62) from RS are placed into the corresponding bits of the MSR.", "pseudocode": "if L = 0 then\n    MSR48 ← (RS)48 | (RS)49 & ¬(MSR41 & MSR3 & (¬(RS)49))\n    MSR58 ← ((RS)58 | (RS)49) & ¬(MSR41 & MSR3 & (¬(RS)49))\n    MSR32:40 42:47 49:50 52:57 60:62 ← (RS)32:40 42:47 49:50 52:57 60:62\nelse\n    MSR48 62 ← (RS)48 62", "special_registers": "MSR", "programming_notes": "If this instruction sets MSRPR to 1, it also sets MSREE, MSRIR, and MSRDR to 1. If this instruction results in MSRS HV PR being equal to 0b110, it also sets MSRIR and MSRDR to 0. This instruction does not alter MSRS, MSRME, or MSRLE. If the only MSR bits to be altered are MSREE RI, to obtain the best performance L=1 should be used. mtmsr serves as both a basic and an extended mnemonic. The Assembler will recognize an mtmsr mnemonic with two operands as the basic form, and an mtmsr mnemonic with one operand as the extended form. In the extended form the L operand is omitted and assumed to be 0.", "extended_mnemonics": [{"mnemonic": "mtmsr", "equivalent_to": "mtmsr RS,0"}], "page_found": "Page 1143 - 1144", "example": "mtmsr r3, 0"}
{"mnemonic": "mtmsrd", "architecture": "PowerISA", "full_name": "Move To Machine State Register Doubleword", "summary": "Sets the Machine State Register (MSR) based on the contents of a source register and an L field.", "syntax": "mtmsrd RS,L", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | / | L | 178 | /", "hex_opcode": "0x7C000164", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "/", "clean": "/"}, {"raw": "L", "clean": "L"}, {"raw": "178", "clean": "178"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "L", "desc": "Load"}], "extension": "Privileged", "description": "The MSR is set based on the contents of register RS and the value of the L field. If L=0, specific bits are updated based on logical operations involving the contents of RS and the current state of the MSR. If L=1, only certain bits (48 and 62) from RS are placed into the corresponding bits of the MSR.", "pseudocode": "if L = 0 then\n    MSR48 ← (RS)48 | (RS)49\n    if MSRPR = 1 then\n        MSREE, MSRIR, MSRDR ← 1\n    if MSRS HV PR = 0b110 then\n        MSRIR, MSRDR ← 0\nelse\n    MSR48 62 ← (RS)48 62", "special_registers": "MSR", "programming_notes": "If this instruction sets MSRPR to 1, it also sets MSREE, MSRIR, and MSRDR to 1. If this instruction results in MSRS HV PR being equal to 0b110, it also sets MSRIR and MSRDR to 0.\n\nIf the only MSR bits to be altered are MSREE RI, to obtain the best performance L=1 should be used.\n\nmtmsrd serves as both a basic and an extended mnemonic. The Assembler will recognize an mtmsrd mnemonic with two operands as the basic form, and an mtmsrd mnemonic with one operand as the extended form. In the extended form the L operand is omitted and assumed to be 0.", "extended_mnemonics": [{"mnemonic": "mtmsrd", "equivalent_to": "mtmsrd RS,0"}], "page_found": "Page 1144 - 1145", "example": "mtmsrd r3, 0"}
{"mnemonic": "tlbia", "architecture": "PowerISA", "full_name": "TLB Invalidate All", "summary": "Invalidates the entire Translation Lookaside Buffer.", "syntax": "tlbia", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | / | 370 | /", "hex_opcode": "0x7C0002E4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "370", "clean": "370"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Privileged", "description": "Invalidates all entries in the Translation Lookaside Buffer (TLB), flushing all virtual-to-physical address translations. This is a privileged instruction used for memory management and typically follows changes to page tables. No condition registers are modified; the instruction may have latency on some implementations.", "pseudocode": "for each TLB entry: InvalidateEntry()", "example": "tlbia"}
{"mnemonic": "tlbsync", "architecture": "PowerISA", "full_name": "TLB Synchronize", "summary": "Provides an ordering function for the effects of all tlbie instructions executed by the thread executing the tlbsync instruction.", "syntax": "tlbsync", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | / | 566 | /", "hex_opcode": "0x7C00046C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "566", "clean": "566"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [], "extension": "Privileged", "description": "Provides a memory ordering function that ensures all tlbie instructions executed by the thread before this instruction have completed before any instruction after tlbsync begins execution. This is a privileged instruction used to synchronize TLB invalidation operations. No condition registers or status fields are affected; this is purely an ordering barrier for memory management operations.", "programming_notes": "tlbsync should not be used to synchronize the completion of tlbiel.", "page_found": "Page 1221 - 1222", "pseudocode": "Synchronize effects of all preceding tlbie instructions", "example": "tlbsync"}
{"mnemonic": "dcbtst", "architecture": "PowerISA", "full_name": "Data Cache Block Touch for Store", "summary": "Provides a hint that describes a block or data stream to which the program may perform a store access.", "syntax": "dcbtst TH, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | TH | RA | RB | 246 | /", "hex_opcode": "0x7C0001EC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "TH", "clean": "TH"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "246", "clean": "246"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "TH", "desc": "Hint"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Issues a cache hint indicating that a data block or stream will be accessed for storage (write). The instruction takes a hint field (TH) and an effective address (RA + RB) but does not load data into cache; it merely communicates intent to the cache hierarchy. No registers are modified and no condition codes are affected.", "programming_notes": "See the Programming Notes at the beginning of this section.", "extended_mnemonics": [{"mnemonic": "dcbtstds RA,RB,TH", "equivalent_to": "dcbtst RA,RB,TH"}, {"mnemonic": "dcbtstt RA,RB", "equivalent_to": "dcbtst RA,RB,0b10000"}], "page_found": "Page 1035 - 1036", "pseudocode": "EA ← (RA) + (RB)\n// Hint to cache management that block at EA will be stored to\n// No actual load or register modification occurs", "example": "dcbtst 0, r4, r5"}
{"mnemonic": "icbt", "architecture": "PowerISA", "full_name": "Instruction Cache Block Touch", "summary": "Provides a hint that the program will soon execute code from the block containing the byte addressed by EA, and that the block should be loaded into the cache specified by the CT field.", "syntax": "icbt RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 22 | /", "hex_opcode": "0x7C00002C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "22", "clean": "22"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}, {"name": "CT", "desc": "Cache Type Field"}], "extension": "Base", "description": "Issues a hint that the program will soon execute code from a block and requests that the block be preloaded into the instruction cache. The effective address is computed from RA + RB, and an optional cache-type field (CT, encoded in bits 21-25 of the instruction) specifies which cache level. This is a hint only and does not guarantee a load; no registers are modified.", "pseudocode": "EA ← (RA) + (RB)\n// Hint to instruction cache that block at EA should be preloaded\n// CT field (from instruction bits 21-25) specifies cache type\n// No register modification", "programming_notes": "The hint is ignored if the block is Caching Inhibited. This instruction treated as a Load (see Section 4.3), except that the system data storage error handler is not invoked, and reference and change recording need not be done.", "page_found": "Page 1026 - 1027", "example": "icbt r4, r5"}
{"mnemonic": "mfpvr", "architecture": "PowerISA", "full_name": "Move From Processor Version Register", "summary": "Reads the PVR (Processor ID).", "syntax": "mfpvr RT", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | 287 | 339 | /", "hex_opcode": "0x7C1F42A6", "visual_parts": [{"raw": "mfspr RT, 287", "clean": "mfspr RT, 287"}], "bit_positions": "0:5 | 6:10 | 11:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}], "extension": "Privileged", "description": "Move From Processor Version Register. Extended mnemonic for MFSPR (mfspr RT,287). Copies the Processor Version Register (PVR) into register RT. The PVR contains the processor version and revision numbers.", "pseudocode": "RT ← PVR", "special_registers": "PVR", "programming_notes": "The mfpvr instruction is used to retrieve the Processor Version Register (PVR), which contains information about the processor's version and revision. This instruction is commonly used for software that needs to detect or adapt to specific processor features or versions. It operates at user privilege level, so no special privileges are required. There are no alignment requirements for this instruction.", "example": "mfpvr r3"}
{"mnemonic": "mftb", "architecture": "PowerISA", "full_name": "Move From Timebase", "summary": "Moves the contents of the Time Base Register (TBR) into a general-purpose register.", "syntax": "mftb RT,268", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RT | 268 | 371 | /", "hex_opcode": "0x7C0002E6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "268", "clean": "268"}, {"raw": "371", "clean": "371"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}], "extension": "Base", "description": "This instruction behaves as if it were an mfspr instruction. The TBR operand is omitted and assumed to be 268 (the value that corresponds to TB).", "pseudocode": "if 'mftb' then\n    RT <- TBR[268]", "programming_notes": "This instruction behaves as if it were an mfspr instruction; see the mfspr instruction description in Section 3.3.19 of Book I.\nNew programs should use mfspr instead of mftb to access the Time Base.", "extended_mnemonics": ["mftb RT", "mfspr RT,268"], "page_found": "Page 1067 - 1068", "special_registers": "TBR", "example": "mftb r3, 268"}
{"mnemonic": "mftbu", "architecture": "PowerISA", "full_name": "Move From Timebase Upper", "summary": "Reads the upper 32 bits of the Timebase (32-bit implementations).", "syntax": "mftbu RT", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RT | 269 | 371 | /", "hex_opcode": "0x7C0002E7", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "269", "clean": "269"}, {"raw": "371", "clean": "371"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}], "extension": "Base", "description": "Reads the upper 32 bits of the Timebase register and places the value into the target GPR. This instruction is primarily used in 32-bit implementations to obtain the high word of the 64-bit Timebase. It does not modify condition registers or status fields.", "pseudocode": "RT ← TBU\n// TBU is the upper 32 bits of the 64-bit Timebase counter", "page_found": "Page 1068", "special_registers": "TBU", "programming_notes": "Use mftbu to capture the high-order bits of the timebase for timestamping or performance measurement. Ensure that your application accounts for potential discrepancies between the upper and lower 32-bit reads due to timebase overflow.", "example": "mftbu r3"}
{"mnemonic": "lbz", "architecture": "PowerISA", "full_name": "Load Byte and Zero", "summary": "Loads a byte from memory into the low 8 bits of a register and clears the upper 56 bits.", "syntax": "lbz RT, D(RA)", "encoding": {"format": "D-form", "binary_pattern": "34 | RT | RA | D", "hex_opcode": "0x88000000", "visual_parts": [{"raw": "34", "clean": "34"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "D", "clean": "D"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "D", "desc": "Displacement (16-bit Signed)"}, {"name": "RA", "desc": "Base Register"}], "pseudocode": "if 'lbz' then\n    EA ← (RA|0) + EXTS64(D)\n    RT ← EXTZ(MEM(EA, 1))", "example": "lbz r3, 0(r4)", "example_note": "Load byte from address in r4.", "extension": "Base", "description": "The effective address (EA) is computed as the sum of the contents of register RA and the sign-extended immediate value D. The byte at EA is loaded into RT, with the upper 56 bits set to zero.", "page_found": "Page 82 - 84", "programming_notes": "The lbz instruction is commonly used for loading a single byte from memory into a register while zeroing out the upper bits. Ensure that the address is properly aligned to avoid potential performance penalties or exceptions. This instruction operates at user privilege level and will raise an exception if the EA is outside the valid address space."}
{"mnemonic": "lhz", "architecture": "PowerISA", "full_name": "Load Halfword and Zero", "summary": "Loads a halfword (16 bits) from memory and clears the upper 48 bits.", "syntax": "lhz RT, D(RA)", "encoding": {"format": "D-form", "binary_pattern": "40 | RT | RA | D", "hex_opcode": "0xA0000000", "visual_parts": [{"raw": "40", "clean": "40"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "D", "clean": "D"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "D", "desc": "Displacement"}, {"name": "RA", "desc": "Base Register"}], "pseudocode": "if RA = 0 then\n  EA ← sign_extend(D)\nelse\n  EA ← (RA) + sign_extend(D)\nRT ← (0 || [EA+1:EA])\n// Load halfword at EA, zero-extend to 64 bits", "example": "lhz r3, 0(r4)", "example_note": "Load unsigned 16-bit value.", "extension": "Base", "description": "Loads a 16-bit halfword from memory at address (RA + sign_extend(D)) and places it into RT with the upper 48 bits cleared to zero. The base register may be R0 if RA is zero in the instruction, in which case the displacement is used as an absolute address. No condition or status registers are affected.", "page_found": "Page 85 - 86", "programming_notes": "The lhz instruction is commonly used for loading halfword values from memory into a register while ensuring the upper 16 bits are zeroed. Ensure that the effective address (EA) is properly aligned to avoid unaligned access exceptions. This instruction operates at user privilege level and will raise an exception if the EA is invalid or if there's a protection fault."}
{"mnemonic": "lha", "architecture": "PowerISA", "full_name": "Load Halfword Algebraic", "summary": "Loads a halfword (16 bits) from memory and sign-extends it to 64 bits.", "syntax": "lha RT, D(RA)", "encoding": {"format": "D-form", "binary_pattern": "42 | RT | RA | D", "hex_opcode": "0xA8000000", "visual_parts": [{"raw": "42", "clean": "42"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "D", "clean": "D"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "D", "desc": "Displacement"}, {"name": "RA", "desc": "Base Register"}], "pseudocode": "if RA = 0 then\n  EA ← sign_extend(D)\nelse\n  EA ← (RA) + sign_extend(D)\nRT ← sign_extend([EA+1:EA])\n// Load halfword at EA and sign-extend to 64 bits", "example": "lha r3, 0(r4)", "example_note": "Load signed 16-bit value.", "extension": "Base", "description": "Loads a 16-bit halfword from memory at address (RA + sign_extend(D)) and places it into RT with sign extension to the full 64-bit width. The base register may be R0 if RA is zero in the instruction. No condition or status registers are affected.", "page_found": "Page 87", "programming_notes": "The lha instruction is commonly used for loading signed halfword values from memory into a register, ensuring proper sign extension. Ensure that the effective address (EA) is properly aligned to avoid alignment faults. This instruction operates at user privilege level and will raise an exception if the EA is invalid or if there are insufficient privileges."}
{"mnemonic": "lwz", "architecture": "PowerISA", "full_name": "Load Word and Zero", "summary": "Loads a word (32 bits) from memory and clears the upper 32 bits.", "syntax": "lwz RT, D(RA)", "encoding": {"format": "D-form", "binary_pattern": "32 | RT | RA | D", "hex_opcode": "0x80000000", "visual_parts": [{"raw": "32", "clean": "32"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "D", "clean": "D"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "D", "desc": "Displacement"}, {"name": "RA", "desc": "Base Register"}], "pseudocode": "EA ← (RA|0) + EXTS64(D)\nRT ← 320 || MEM(EA, 4)", "example": "lwz r3, 8(r4)", "example_note": "Load 32-bit int from r4+8.", "extension": "Base", "description": "The effective address (EA) is calculated as (RA|0) + EXTS64(D). The word in storage addressed by EA is loaded into RT32:63. RT0:31 are set to 0.", "page_found": "Page 88 - 90", "programming_notes": "The lwz instruction is commonly used for loading a word from memory into a register while zeroing the upper half of the target register. Ensure that the address is properly aligned to avoid alignment exceptions. This instruction operates at user privilege level and does not generate any exceptions under normal circumstances."}
{"mnemonic": "lwa", "architecture": "PowerISA", "full_name": "Load Word Algebraic", "summary": "Loads a word (32 bits) from memory and sign-extends it to 64 bits.", "syntax": "lwa RT, DS(RA)", "encoding": {"format": "DS-form", "binary_pattern": "58 | RT | RA | DS | 2", "hex_opcode": "0xE8000002", "visual_parts": [{"raw": "58", "clean": "58"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "DS", "clean": "DS"}, {"raw": "2", "clean": "2"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:29 | 30:31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "DS", "desc": "Displacement (Aligned)"}, {"name": "RA", "desc": "Base Register"}], "pseudocode": "if RA = 0 then\n  EA ← (DS || 0b00)\nelse\n  EA ← (RA) + (DS || 0b00)\nRT ← sign_extend([EA+3:EA])\n// Load word at aligned EA and sign-extend to 64 bits", "example": "lwa r3, 8(r4)", "example_note": "Load signed 32-bit int.", "extension": "Base", "description": "Loads a 32-bit word from memory at address (RA + (DS || 0b00)), where DS is a 14-bit signed displacement (making the effective address 4-byte aligned), and places it into RT with sign extension to 64 bits. This is a 64-bit instruction available only in 64-bit implementations. No condition or status registers are affected.", "page_found": "Page 90", "programming_notes": "The lwa instruction is commonly used for loading a 32-bit word from memory into a target register while zeroing out the upper 32 bits. Ensure that the base address in RA and displacement D are correctly aligned to avoid alignment faults. This instruction operates at user privilege level and will raise an exception if the effective address is invalid or if there is a protection fault."}
{"mnemonic": "ld", "architecture": "PowerISA", "full_name": "Load Doubleword", "summary": "Loads a doubleword (64 bits) from memory.", "syntax": "ld RT, DS(RA)", "encoding": {"format": "DS-form", "binary_pattern": "0 | RT | RA | DS | 0 | 31", "hex_opcode": "0xE8000000", "visual_parts": [{"raw": "58", "clean": "58"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "DS", "clean": "DS"}, {"raw": "0", "clean": "0"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "DS", "desc": "Displacement (14-bit Signed, Multiple of 4)"}, {"name": "RA", "desc": "Base Register"}, {"name": "disp", "desc": "Displacement value"}], "pseudocode": "if 'ld' then\n    EA ← (RA|0) + EXTS64(DS||0b00)\n    RT ← MEM(EA, 8)", "example": "ld r3, 16(r4)", "example_note": "Load 64-bit value.", "extension": "Base", "description": "The doubleword in storage addressed by EA is loaded into RT. The effective address (EA) is the sum of RA and disp, sign-extended to 64 bits.", "page_found": "Page 90 - 92", "programming_notes": "The ld instruction loads a doubleword from memory into a register. Ensure the address is properly aligned to avoid alignment faults. This instruction operates at user privilege level and will raise an exception if the EA is out of bounds or access permissions are violated."}
{"mnemonic": "lwarx", "architecture": "PowerISA", "full_name": "Load Word and Reserve Indexed", "summary": "Loads a word and creates a reservation for use with 'stwcx.'. Critical for implementing atomic primitives (mutexes).", "syntax": "lwarx EH=0 RT,RA,D", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 20 | EH", "hex_opcode": "0x7C000028", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "20", "clean": "20"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Base Register"}, {"name": "RB", "desc": "Index Register"}, {"name": "D", "desc": "Immediate Displacement"}, {"name": "EH", "desc": "Hint for subsequent store operation"}], "pseudocode": "EA ← (RA) + (RB)\nRT ← sign_extend([EA+3:EA])\nRESERVATION_VALID ← 1\nRESERVATION_ADDR ← page_address(EA)\n// EH field (bit 31) is a hint for subsequent stwcx.", "example": "lwarx r3, 0, r4", "example_note": "Start atomic read-modify-write.", "extension": "Base", "description": "Loads a 32-bit word from memory at address (RA + RB) and places it into RT, and creates a reservation on that cache line for atomic updates with stwcx. The optional EH field (bit 31) provides a hint about the expected success of a subsequent conditional store. This instruction is critical for implementing atomic operations and locks. No condition or status registers are modified by this instruction itself.", "special_registers": "XER, LR", "programming_notes": "EH = 0 should be used when all accesses to a mutex variable are performed using an instruction sequence with Load And Reserve followed by Store Conditional. EH = 1 should be used when the program is obtaining a lock variable which it will subsequently release before another program attempts to perform a store to it.", "page_found": "Page 1050 - 1051", "extended_mnemonics": [{"mnemonic": "lwarx", "equivalent_to": "lwarx RT,RA,RB,0"}]}
{"mnemonic": "ldarx", "architecture": "PowerISA", "full_name": "Load Doubleword and Reserve Indexed", "summary": "Loads a doubleword and creates a reservation. 64-bit version of lwarx.", "syntax": "ldarx RT,RA,RB,EH", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 84 | /", "hex_opcode": "0x7C0000A8", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "84", "clean": "84"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Base Register"}, {"name": "RB", "desc": "Index Register"}, {"name": "EH", "desc": "Hint for subsequent store operation"}], "pseudocode": "EA ← (RA) + (RB)\nRT ← MEM(EA, 8)\nReserve(EA, 8)", "example": "ldarx r3, 0, r4", "example_note": "Atomic 64-bit load.", "extension": "Base", "description": "Loads a doubleword from memory at address RA+RB and creates a reservation on that memory location for use with subsequent stdcx. instructions. The EH field provides a hint to the processor about the expected outcome of the following store-conditional. This is the 64-bit variant of lwarx and is essential for atomic operations and synchronization primitives.", "programming_notes": "Load Doubleword And Reserve Indexed X-form serves as both a basic and an extended mnemonic. The Assembler will recognize a ldarx mnemonic with four operands as the basic form, and a ldarx mnemonic with three operands as the extended form.", "extended_mnemonics": [{"mnemonic": "ldarx", "equivalent_to": "ldarx RT,RA,RB,0"}], "page_found": "Page 1056 - 1057", "special_registers": "RESERVE, RESERVE_LENGTH, RESERVE_ADDR"}
{"mnemonic": "mtspr", "architecture": "PowerISA", "full_name": "Move To Special Purpose Register", "summary": "Copies a value from a general-purpose register to a system SPR (e.g., CTR, LR, XER).", "syntax": "mtspr SPR, RS", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RS | SPR | 467 | /", "hex_opcode": "0x7C0003A6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "SPR", "clean": "SPR"}, {"raw": "467", "clean": "467"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:20 | 21:30 | 31"}, "operands": [{"name": "SPR", "desc": "Special Purpose Register ID (Reordered bits)"}, {"name": "RS", "desc": "Source Register"}], "pseudocode": "SPR_index ← (SPR[5:0] || SPR[10:5])\nSPR[SPR_index] ← RS", "example": "mtspr 9, r3", "example_note": "Move r3 to Count Register (CTR).", "extension": "Base", "description": "Moves the contents of a general-purpose register to a special-purpose register (such as CTR, LR, XER, FPSCR, or others). The SPR field is reordered from its 10-bit encoding in the instruction. Privilege level and results depend on which SPR is targeted; some SPRs are supervisor-only. No condition register flags are set by this instruction itself.", "special_registers": "AMR, IAMR, UAMOR, BESCR, BESCRU, HMER, TBL, TBU, SPR", "programming_notes": "spr0=1 if and only if writing the register is privileged. Execution of this instruction specifying an SPR number with spr0=1 when the privilege state of the thread does not permit the access causes one of the following: MSRPR=1: Privileged Instruction type Program interrupt, MSRHV PR=0b00 or MSRS HV PR=0b010 and the SPR is always an ultravisor resource (independent of the contents of SMFCTRL): Privileged Instruction type Program interrupt, LPCREVIRT=0: Privileged Instruction type Program interrupt, LPCREVIRT=1: Hypervisor Emulation Assistance interrupt, MSRS HV PR=0b010 and the SPR is PTCR, DAWRn, DAWRXn, or CIABR when they are ultravisor privileged for the operation: Hypervisor Emulation Assistance interrupt.", "extended_mnemonics": [{"mnemonic": "mtxer", "equivalent_to": "mtspr 1,RS"}, {"mnemonic": "mtlr", "equivalent_to": "mtspr 8,RS"}, {"mnemonic": "mtctr", "equivalent_to": "mtspr 9,RS"}, {"mnemonic": "mtppr", "equivalent_to": "mtspr 896,RS"}, {"mnemonic": "mtppr32", "equivalent_to": "mtspr 898,RS"}], "page_found": "Page 161 - 162"}
{"mnemonic": "mfspr", "architecture": "PowerISA", "full_name": "Move From Special Purpose Register", "summary": "Moves the contents of a special purpose register into a general-purpose register.", "syntax": "mfspr RT, SPR", "encoding": {"format": "XFX-form", "binary_pattern": "10 | RT | SPR[5:0] | SPR[10:5]", "hex_opcode": "0x7C0002A6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "SPR", "clean": "SPR"}, {"raw": "339", "clean": "339"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "SPR", "desc": "Special Purpose Register ID"}], "pseudocode": "SPR_index ← (SPR[5:0] || SPR[10:5])\nRT ← SPR[SPR_index]", "example": "mfspr r3, 8", "example_note": "Move Link Register (LR) to r3.", "extension": "Base", "description": "Moves the contents of a special-purpose register into a general-purpose register. The SPR field is reordered from its 10-bit encoding. Privilege level and results depend on which SPR is read; some SPRs are supervisor-only or hypervisor-only. No condition register flags are modified.", "programming_notes": "The SPR field denotes a Special Purpose Register, encoded as shown in the table below. If the SPR field contains a value from 808 through 811, the instruction specifies a reserved SPR, and is treated as a no-op; see Section 1.3.3, “Reserved Fields, Reserved Values, and Reserved SPRs”. Otherwise, the contents of the designated Special Purpose Register are placed into register RT. For Special Purpose Registers that are 32 bits long, the low-order 32 bits of RT receive the contents of the Special Purpose Register and the high-order 32 bits of RT are set to zero.", "extended_mnemonics": [{"mnemonic": "mfxer", "equivalent_to": "mfspr RT,1"}, {"mnemonic": "mflr", "equivalent_to": "mfspr RT,8"}, {"mnemonic": "mfctr", "equivalent_to": "mfspr RT,9"}], "page_found": "Page 162 - 164", "special_registers": "SPR"}
{"mnemonic": "mullw", "architecture": "PowerISA", "full_name": "Multiply Low Word", "summary": "Multiplies two 32-bit integers and stores the lower 32 bits of the 64-bit result.", "syntax": "mullw RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 235 | Rc", "hex_opcode": "0x7C0001D6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "235", "clean": "235"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src 1"}, {"name": "RB", "desc": "Src 2"}], "pseudocode": "product ← (RA) ×signed (RB)\nRT ← product[32:63]\nif OE = 1 then\n  OV ← (product[0:31] ≠ sign_extend(product[32:63]))\n  SO ← SO | OV\nif Rc = 1 then\n  CR0 ← (RT < 0) || (RT > 0) || (RT = 0) || SO", "example": "mullw r3, r4, r5", "example_note": "32-bit multiply.", "extension": "Base", "description": "Multiplies the contents of RA and RB as signed 32-bit integers and stores the lower 32 bits of the 64-bit result in RT. If OE=1, sets OV and SO in XER if the result overflows (i.e., if the upper 32 bits of the 64-bit product differ from the sign extension of bits 0-31). If Rc=1, updates CR0 based on the result.", "page_found": "Page 116", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "mulld", "architecture": "PowerISA", "full_name": "Multiply Low Doubleword", "summary": "Multiplies the contents of two registers and places the low-order 64 bits of the product into a target register.", "syntax": "mulld RT,RA,RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 233 | Rc", "hex_opcode": "0x7C0001D2", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "233", "clean": "233"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src 1"}, {"name": "RB", "desc": "Src 2"}], "pseudocode": "prod0:127 ← (RA) × (RB)\nRT ← prod0:63\nif OE=1 then\n    OV and OV32 are set to 1 if the product cannot be represented in 64 bits.", "example": "mulld r3, r4, r5", "example_note": "64-bit multiply.", "extension": "Base", "description": "The 64-bit operands are (RA) and (RB). The low-order 64 bits of the 128-bit product of the operands are placed into register RT. Both operands and the product are interpreted as signed integers.", "special_registers": "CR0, XER", "programming_notes": "The XO-form Multiply instructions may execute faster on some implementations if RB contains the operand having the smaller absolute value.", "page_found": "Page 120 - 122"}
{"mnemonic": "mr", "architecture": "PowerISA", "full_name": "Move Register", "summary": "Copies contents of RS to RA. (Alias for 'or RA, RS, RS').", "syntax": "mr RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RS | 444 | /", "hex_opcode": "0x7C000378", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RS", "clean": "RS"}, {"raw": "444", "clean": "444"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}], "extension": "Base", "description": "Move Register. Extended mnemonic for OR (or RA,RS,RS). Copies the contents of register RS into register RA.", "pseudocode": "RA ← RS", "programming_notes": "The `mr` instruction is commonly used to copy values between general-purpose registers. It does not require any special alignment or privilege level. However, be cautious when using this instruction in performance-critical sections as it may introduce pipeline stalls if the destination register is already in use.", "example": "mr r4, r3"}
{"mnemonic": "sc", "architecture": "PowerISA", "full_name": "System Call", "summary": "Provides the means by which a program can call upon the system to perform a service.", "syntax": "sc LEV", "encoding": {"format": "SC-form", "binary_pattern": "17 | / | / | / | LEV | / | 1", "hex_opcode": "0x44000002", "visual_parts": [{"raw": "17", "clean": "17"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "LEV", "clean": "LEV"}, {"raw": "/", "clean": "/"}, {"raw": "1", "clean": "1"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:19 | 20:26 | 27:30 | 31"}, "operands": [{"name": "LEV", "desc": "Level (0=OS, 1=Hypervisor)"}], "extension": "Base", "description": "Triggers a system call, transferring control to the operating system (LEV=0) or hypervisor (LEV=1). The instruction is privileged; attempting to execute it in user mode or with an invalid LEV value may cause an exception. The LEV field indicates the target privilege level for the service request.", "pseudocode": "if LEV = 0 then\n  SyscallOS()\nelse if LEV = 1 then\n  SyscallHypervisor()\nelse\n  raise exception", "special_registers": "SRR0, SRR1, MSR", "programming_notes": "Executing this instruction with LEV=1 or LEV=2 is the only way that executing an instruction can cause a transition from non-hypervisor state to hypervisor state on the thread that executed the instruction. Executing this instruction with LEV=2 when SMFCTRLE=1 is the only way that executing an instruction can cause a transition from non-ultravisor state to ultravisor state on the thread that executed the instruction. In correct use, this instruction is used to 'call up' one privilege level (application program calls operating system, operating system calls hypervisor, hypervisor calls ultravisor). However, it is possible for a program to call up more than one level (e.g., for an application program to call the hypervisor). An attempt to call up more than one level should be considered a programming error.", "extended_mnemonics": ["sc"], "page_found": "Page 1119 - 1120", "example": "sc 0"}
{"mnemonic": "nop", "architecture": "PowerISA", "full_name": "No Operation", "summary": "Does nothing. (Alias for 'ori 0, 0, 0').", "syntax": "nop", "encoding": {"format": "D-form", "binary_pattern": "24 | 0 | 0 | 0", "hex_opcode": "0x60000000", "visual_parts": [{"raw": "24", "clean": "24"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:31", "length": "32"}, "operands": [], "extension": "Base", "description": "A no-operation instruction that performs no action and modifies no registers or status flags. It is commonly used for instruction alignment, timing, or as a placeholder. This is implemented as an alias for 'ori 0, 0, 0' in the base ISA.", "pseudocode": "(no operation)", "page_found": "Page 134", "programming_notes": "The nop instruction is useful for optimizing code by reducing unnecessary operations, but it has no effect on program state or execution flow.", "example": "nop"}
{"mnemonic": "li", "architecture": "PowerISA", "full_name": "Load Immediate", "summary": "Loads a 16-bit signed immediate into a register. (Alias for 'addi RT, 0, SIM').", "syntax": "li RT, SIM", "encoding": {"format": "D-form", "binary_pattern": "14 | RT | 0 | SIM", "hex_opcode": "0x38000000", "visual_parts": [{"raw": "14", "clean": "14"}, {"raw": "RT", "clean": "RT"}, {"raw": "0", "clean": "0"}, {"raw": "SIM", "clean": "SIM"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "SIM", "desc": "Immediate"}], "extension": "Base", "description": "Loads a 16-bit signed immediate value into the target register. This is an assembly-language alias for 'addi RT, 0, SIM' that simplifies loading small constants. No condition register flags are affected.", "pseudocode": "RT ← sign_extend(SIM, 16)", "page_found": "Page 55", "programming_notes": "The `li` instruction is commonly used for initializing or resetting registers to specific values. Ensure the immediate value fits within the 32-bit signed integer range to avoid unexpected behavior. This instruction operates at user privilege level and does not generate exceptions unless there are issues with the instruction encoding.", "example": "li r3, 4"}
{"mnemonic": "lis", "architecture": "PowerISA", "full_name": "Load Immediate Shifted", "summary": "Loads a 16-bit immediate into the upper half of a 32-bit word. (Alias for 'addis RT, 0, SIM').", "syntax": "lis RT, SIM", "encoding": {"format": "D-form", "binary_pattern": "15 | RT | 0 | SIM", "hex_opcode": "0x3C000000", "visual_parts": [{"raw": "15", "clean": "15"}, {"raw": "RT", "clean": "RT"}, {"raw": "0", "clean": "0"}, {"raw": "SIM", "clean": "SIM"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "SIM", "desc": "Immediate"}], "extension": "Base", "description": "The 'lis' instruction loads an immediate value shifted left by 16 bits into a register. If the source register (RA) is zero, it uses the value 0; otherwise, it adds the contents of RA to the sign-extended immediate value.", "pseudocode": "if RA = 0 then\n    RT ← EXTS(SI || 160)\nelse\n    RT ← (RA) + EXTS(SI || 160)", "page_found": "Page 110", "programming_notes": "The 'lis' instruction is commonly used to load large constants into a register by shifting the immediate value left by 16 bits. If the source register (RA) is not zero, its contents are added to the sign-extended immediate value. Be cautious with alignment as this can affect performance and correctness. This instruction operates at user privilege level.", "example": "lis r3, 4"}
{"mnemonic": "not", "architecture": "PowerISA", "full_name": "Complement Register", "summary": "Complements the contents of one register and places the result into another register.", "syntax": "not Rx,Ry", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RS | 124 | /", "hex_opcode": "0x7C0000F8", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RS", "clean": "RS"}, {"raw": "124", "clean": "124"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "Rx", "desc": "Target General Purpose Register"}, {"name": "Ry", "desc": "Source General Purpose Register"}], "extension": "Base", "description": "The 'not' instruction complements the contents of register Ry and places the result into register Rx. This mnemonic can be coded with a final '.' to cause the Rc bit to be set in the underlying instruction.", "pseudocode": "if 'not' then\n    Rx <- ~Ry\nif 'not.' then\n    Rx <- ~Ry\n    Rc = 1", "special_registers": "CR0, XER", "page_found": "Page 1001 - 1002", "programming_notes": "The 'not' instruction is commonly used for bitwise negation of a register's contents. Be cautious with the '.' suffix as it affects the condition register (CR0) by setting the Rc bit, which can impact subsequent conditional branches. Ensure that the registers are properly aligned and accessible at the privilege level required for execution.", "example": "not r3, r4"}
{"mnemonic": "mtctr", "architecture": "PowerISA", "full_name": "Move To Count Register", "summary": "Moves GPR to CTR. (Alias for 'mtspr 9, RS').", "syntax": "mtctr RS", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RS | 9 | 467 | /", "hex_opcode": "0x7C0903A6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "9", "clean": "9"}, {"raw": "467", "clean": "467"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}], "extension": "Base", "description": "Moves a value from a general-purpose register into the Count register (CTR), typically used to set up loop counts or branch targets for branch-to-CTR instructions. This is an alias for 'mtspr 9, RS' where SPR 9 designates CTR. No condition register flags are modified.", "page_found": "Page 162", "pseudocode": "CTR ← RS", "special_registers": "CTR", "programming_notes": "The mtctr instruction is commonly used to set up loop counters by moving values from a general-purpose register into the Count Register (CTR). Ensure that the source register contains the correct value for the desired loop iterations. This instruction operates at user privilege level and does not generate exceptions under normal conditions, but incorrect usage can lead to infinite loops if not managed properly.", "example": "mtctr r3"}
{"mnemonic": "mfctr", "architecture": "PowerISA", "full_name": "Move From Count Register", "summary": "Moves CTR to GPR. (Alias for 'mfspr RT, 9').", "syntax": "mfctr RT", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RT | 9 | 339 | /", "hex_opcode": "0x7C0902A6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "9", "clean": "9"}, {"raw": "339", "clean": "339"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}], "extension": "Base", "description": "Moves the Count Register (CTR) to a general-purpose register. This is an alias for mfspr RT, 9 and is commonly used to save the loop counter or retrieve branching information. No status registers are affected.", "pseudocode": "RT ← CTR", "page_found": "Page 164", "special_registers": "CTR", "programming_notes": "The mfctr instruction is commonly used to retrieve the current count value from the Count Register, which is often utilized in loop control. Ensure that the destination register (RT) is properly aligned and accessible at the privilege level where this instruction is executed. This instruction does not raise exceptions under normal circumstances but should be used with caution in critical loops to avoid unintended behavior.", "example": "mfctr r3"}
{"mnemonic": "mtlr", "architecture": "PowerISA", "full_name": "Move To Link Register", "summary": "Moves GPR to LR. (Alias for 'mtspr 8, RS').", "syntax": "mtlr RS", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RS | 8 | 467 | /", "hex_opcode": "0x7C0803A6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "8", "clean": "8"}, {"raw": "467", "clean": "467"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}], "extension": "Base", "description": "Move To Link Register. Extended mnemonic for MTSPR (mtspr 8,RS). Copies the contents of register RS into the Link Register (LR).", "pseudocode": "LR ← RS", "special_registers": "LR", "programming_notes": "The mtlr instruction is commonly used to update the Link Register with a new value, often during function calls or branch operations. Ensure that the source register contains the correct address or value before executing this instruction. This operation does not require any special privileges and will not generate exceptions under normal circumstances.", "example": "mtlr r3"}
{"mnemonic": "mflr", "architecture": "PowerISA", "full_name": "Move From Link Register", "summary": "Moves LR to GPR. (Alias for 'mfspr RT, 8').", "syntax": "mflr RT", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RT | 8 | 339 | /", "hex_opcode": "0x7C0802A6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "8", "clean": "8"}, {"raw": "339", "clean": "339"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}], "extension": "Base", "description": "Moves the Link Register (LR) to a general-purpose register. This is an alias for mfspr RT, 8 and is commonly used to save the return address before modifying LR. No status registers are affected.", "pseudocode": "RT ← LR", "page_found": "Page 164", "special_registers": "LR", "programming_notes": "Use mflr to save the return address before making a function call, ensuring you can return correctly afterward. Ensure the target register (RT) is not reserved and is properly aligned for your architecture.", "example": "mflr r3"}
{"mnemonic": "rlwinm", "architecture": "PowerISA", "full_name": "Rotate Left Word Immediate Then AND with Mask", "summary": "Rotates the low-order 32 bits of a register left by a specified number of bit positions, generates a mask, and performs an AND operation.", "syntax": "rlwinm RA,RS,SH,MB,ME", "encoding": {"format": "M-form", "binary_pattern": "21 | RS | RA | SH | MB | ME | Rc", "hex_opcode": "0x54000000", "visual_parts": [{"raw": "21", "clean": "21"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "SH", "clean": "SH"}, {"raw": "MB", "clean": "MB"}, {"raw": "ME", "clean": "ME"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "SH", "desc": "Shift"}, {"name": "MB", "desc": "Mask Begin"}, {"name": "ME", "desc": "Mask End"}], "extension": "Base", "description": "The contents of register RS are rotated32 left SH bits. A mask is generated having 1-bits from bit MB+32 through bit ME+32 and 0-bits elsewhere. The rotated data are ANDed with the generated mask and the result is placed into register RA.", "pseudocode": "if 'rlwinm' then\n    n ← SH\n    r ← ROTL32((RS)32:63, n)\n    m ← MASK(MB+32, ME+32)\n    RA ← r & m", "special_registers": "CR0", "programming_notes": "Let RSL represent the low-order 32 bits of register RS, with the bits numbered from 0 through 31. rlwinm can be used to extract an n-bit field that starts at bit position b in RSL, right-justified into the low-order 32 bits of register RA (clearing the remaining 32-n bits of the low-order 32 bits of RA), by setting SH=b+n, MB=32-n, and ME=31. It can be used to extract an n-bit field that starts at bit position b in RSL, left-justified into the low-order 32 bits of register RA (clearing the remaining 32-n bits of the low-order 32 bits of RA), by setting SH=b, MB = 0, and ME=n-1. It can be used to rotate the contents of the low-order 32 bits of a register left (right) by n bits, by setting SH=n (32-n), MB=0, and ME=31. It can be used to shift the contents of the low-order 32 bits of a register right by n bits, by setting SH=32-n, MB=n, and ME=31. It can be used to clear the high-order b bits of the low-order 32 bits of the contents of a register and then shift the result left by n bits, by setting SH=n, MB=b-n, and ME=31-n. It can be used to clear the low-order n bits of the low-order 32 bits of a register, by setting SH=0, MB=0, and ME=31-n.", "extended_mnemonics": [{"mnemonic": "extlwi", "equivalent_to": "rlwinm RA,RS,b,0,n-1"}, {"mnemonic": "srwi", "equivalent_to": "rlwinm RA,RS,32-n,n,31"}, {"mnemonic": "clrrwi", "equivalent_to": "rlwinm RA,RS,0,0,31-n"}, {"name": "extlwi", "equivalent_to": "rlwinm RA,RS,b,0,n-1"}, {"name": "srwi", "equivalent_to": "rlwinm RA,RS,32-n,n,31"}, {"name": "clrrwi", "equivalent_to": "rlwinm RA,RS,0,0,31-n"}], "page_found": "Page 142 - 144", "example": "rlwinm r4, r3, 3, 0, 31"}
{"mnemonic": "rlwimi", "architecture": "PowerISA", "full_name": "Rotate Left Word Immediate Then Mask Insert", "summary": "Rotates a word left, then inserts bits into the target under a mask. Used for inserting bitfields.", "syntax": "rlwimi RA, RS, SH, MB, ME", "encoding": {"format": "M-form", "binary_pattern": "20 | RS | RA | SH | MB | ME", "hex_opcode": "0x50000000", "visual_parts": [{"raw": "20", "clean": "20"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "SH", "clean": "SH"}, {"raw": "MB", "clean": "MB"}, {"raw": "ME", "clean": "ME"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target/Dest"}, {"name": "RS", "desc": "Source"}, {"name": "SH", "desc": "Shift"}, {"name": "MB", "desc": "Mask Begin"}, {"name": "ME", "desc": "Mask End"}], "extension": "Base", "description": "Rotates the contents of RS left by SH bit positions, creates a mask from bits MB through ME, and inserts the rotated value into RA under that mask, leaving other bits in RA unchanged. The condition register CR0 is updated if Rc=1.", "pseudocode": "n ← SH\nmask ← MASK(MB, ME)\nrotated ← ROTL32(RS, n)\nRA ← (RA & ¬mask) | (rotated & mask)\nif Rc = 1 then CR0 ← (RA < 0, RA > 0, RA = 0, SO)", "page_found": "Page 145", "programming_notes": "The rlwimi instruction is commonly used for bit manipulation tasks such as rotating bits and selectively inserting them into a register. Be cautious with the shift amount (SH), mask bits (MB and ME), and ensure they are within valid ranges to avoid unexpected results. This instruction operates at user privilege level and does not generate exceptions under normal conditions, but improper use can lead to data corruption.", "example": "rlwimi r4, r3, 3, 0, 31"}
{"mnemonic": "rlwnm", "architecture": "PowerISA", "full_name": "Rotate Left Word Then AND with Mask", "summary": "Rotates the contents of register RS left by the number of bits specified by (RB)59:63, and then performs a bitwise AND operation with a mask.", "syntax": "rlwnm RT,RS,RB,MB,ME", "encoding": {"format": "M-form", "binary_pattern": "23 | RS | RA | RB | MB | ME | Rc", "hex_opcode": "0x5C000000", "visual_parts": [{"raw": "23", "clean": "23"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "MB", "clean": "MB"}, {"raw": "ME", "clean": "ME"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RB", "desc": "Shift Reg"}, {"name": "MB", "desc": "Mask Begin"}, {"name": "ME", "desc": "Mask End"}, {"name": "RT", "desc": "Target General Purpose Register"}], "extension": "Base", "description": "The contents of register RS are rotated 32 left the number of bits specified by (RB)59:63. A mask is generated having 1-bits from bit MB+32 through bit ME+32 and 0-bits elsewhere. The rotated data are ANDed with the generated mask and the result is placed into register RA.", "pseudocode": "if 'rlwnm' then\n    n ← (RB)59:63\n    r ← ROTL32((RS)32:63, n)\n    m ← MASK(MB+32, ME+32)\n    RA ← r & m\nelse if 'rlwnm.' then\n    n ← (RB)59:63\n    r ← ROTL32((RS)32:63, n)\n    m ← MASK(MB+32, ME+32)\n    RA ← r & m", "special_registers": "CR0", "programming_notes": "RS, with the bits numbered from 0 through 31. rlwnm can be used to extract an n-bit field that starts at variable bit position b in RSL, right-justified into the low-order 32 bits of register RA (clearing the remaining 32-n bits of the low-order 32 bits of RA), by setting RB59:63=b+n, MB=32-n, and ME=31. It can be used to extract an n-bit field that starts at variable bit position b in RSL, left-justified into the low-order 32 bits of register RA (clearing the remaining 32-n bits of the low-order 32 bits of RA), by setting RB59:63=b, MB = 0, and ME=n-1. It can be used to rotate the contents of the low-order 32 bits of a register left (right) by variable n bits, by setting RB59:63=n (32-n), MB=0, and ME=31.", "extended_mnemonics": [{"mnemonic": "rotlw", "equivalent_to": "rlwnm RA,RS,RB,0,31"}, {"mnemonic": "rotlw.", "equivalent_to": "rlwnm. RA,RS,RB,0,31"}], "page_found": "Page 144 - 146", "example": "rlwnm r3, r3, r5, 0, 31"}
{"mnemonic": "rldic", "architecture": "PowerISA", "full_name": "Rotate Left Doubleword Immediate Clear", "summary": "Rotates a 64-bit register left, then clears bits based on a mask. 64-bit equivalent of rlwinm.", "syntax": "rldic RT,RA,RB,MB", "encoding": {"format": "MD-form", "binary_pattern": "30 | RS | RA | SH | MB | 2 | sh Rc", "hex_opcode": "0x78000008", "visual_parts": [{"raw": "30", "clean": "30"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "SH", "clean": "SH"}, {"raw": "MB", "clean": "MB"}, {"raw": "00", "clean": "00"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "SH", "desc": "Shift Amount"}, {"name": "MB", "desc": "Mask Begin"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RB", "desc": "Immediate Value for SH (Shift Amount)"}], "pseudocode": "if 'rldic' then\n    SH ← sh5 || sh0:4\n    r ← ROTL64((RS), SH)\n    MB ← mb5 || mb0:4\n    m ← MASK(MB, 63-SH)\n    RA ← r & m", "example": "rldic r3, r4, 4, 10", "example_note": "Rotate left 4, clear bits 0-9.", "extension": "Base", "description": "The contents of register RS are rotated64 left SH bits. A mask is generated having 1-bits from bit MB through bit 63-SH and 0-bits elsewhere. The rotated data are ANDed with the generated mask and the result is placed into register RA.", "special_registers": "CR0", "programming_notes": "rldic can be used to clear the high-order b bits of the contents of a register and then shift the result left by n bits, by setting SH=n and MB=b-n. It can be used to clear the high-order n bits of a register, by setting SH=0 and MB=n.", "extended_mnemonics": [{"mnemonic": "clrlsldi", "equivalent_to": "rldic RA,RS,n,b-n"}, {"mnemonic": "clrlsldi.RA,RS,b,n", "equivalent_to": "rldic. RA,RS,n,b-n"}], "page_found": "Page 146 - 148"}
{"mnemonic": "rldicl", "architecture": "PowerISA", "full_name": "Rotate Left Doubleword Immediate Clear Left", "summary": "Rotates the contents of a register left by a specified number of bits and clears higher-order bits.", "syntax": "rldicl RA, RS, SH, MB", "encoding": {"format": "MD-form", "binary_pattern": "30 | RS | RA | SH | MB | 0 | sh | Rc", "hex_opcode": "0x78000000", "visual_parts": [{"raw": "30", "clean": "30"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "SH", "clean": "SH"}, {"raw": "MB", "clean": "MB"}, {"raw": "0", "clean": "0"}, {"raw": "SH", "clean": "SH"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:29 | 30 | 31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "SH", "desc": "Shift"}, {"name": "MB", "desc": "Mask Begin"}], "extension": "Base", "description": "The contents of register RS are rotated 64 left SH bits. A mask is generated having 1-bits from bit MB through bit 63 and 0-bits elsewhere. The rotated data are ANDed with the generated mask and the result is placed into register RA.", "pseudocode": "SH ← SH5 || SH0:4\nr ← ROTL64((RS), SH)\nMB ← MB5 || MB0:4\nm ← MASK(MB, 63)\nRA ← r & m", "programming_notes": "rldicl can be used to extract an n-bit field that starts at bit position b in register RS, right-justified into register RA (clearing the remaining 64-n bits of RA), by setting SH=b+n and MB=64-n. It can be used to rotate the contents of a register left by n bits, by setting SH=n and MB=0. It can be used to shift the contents of a register right by n bits, by setting SH=64-n and MB=n. It can be used to clear the high-order n bits of a register, by setting SH=0 and MB=n.", "extended_mnemonics": [{"mnemonic": "extrdi", "equivalent_to": "rldicl RA,RS,b+n,64-n"}, {"mnemonic": "srdi", "equivalent_to": "rldicl RA,RS,64-n,n"}, {"mnemonic": "clrldi", "equivalent_to": "rldicl RA,RS,0,n"}], "page_found": "Page 145 - 146", "special_registers": "CR0", "example": "rldicl r4, r3, 3, 0"}
{"mnemonic": "rldicr", "architecture": "PowerISA", "full_name": "Rotate Left Doubleword Immediate Clear Right", "summary": "Rotates 64-bit RS left by SH, then clears the low-order bits (ME+1 to 63).", "syntax": "rldicr RA, RS, SH, ME", "encoding": {"format": "MD-form", "binary_pattern": "30 | RS | RA | SH | ME | 01 | Rc", "hex_opcode": "0x78000004", "visual_parts": [{"raw": "30", "clean": "30"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "SH", "clean": "SH"}, {"raw": "ME", "clean": "ME"}, {"raw": "01", "clean": "01"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:26 | 27:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "SH", "desc": "Shift Amount"}, {"name": "ME", "desc": "Mask End"}], "pseudocode": "n ← SH\nmask ← MASK(0, ME)\nrotated ← ROTL64(RS, n)\nRA ← rotated & mask\nif Rc = 1 then CR0 ← (RA < 0, RA > 0, RA = 0, SO)", "example": "rldicr r3, r4, 2, 60", "example_note": "Align address to 8 bytes.", "extension": "Base", "description": "Rotates the 64-bit contents of RS left by SH positions, then clears bits (ME+1) through 63, effectively creating a mask from bit 0 through ME. The condition register CR0 is updated if Rc=1.", "page_found": "Page 146", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "rldimi", "architecture": "PowerISA", "full_name": "Rotate Left Doubleword Immediate Mask Insert", "summary": "Rotates 64-bit value and inserts into target under mask.", "syntax": "rldimi RA, RS, SH, MB", "encoding": {"format": "MD-form", "binary_pattern": "30 | RS | RA | SH | MB | 3 | SH", "hex_opcode": "0x7800000C", "visual_parts": [{"raw": "30", "clean": "30"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "SH", "clean": "SH"}, {"raw": "MB", "clean": "MB"}, {"raw": "3", "clean": "3"}, {"raw": "SH", "clean": "SH"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:26 | 27:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "SH", "desc": "Shift"}, {"name": "MB", "desc": "Mask Begin"}], "extension": "Base", "description": "Rotates the 64-bit contents of RS left by SH positions and inserts the result into RA under a mask defined by MB and (63-SH), leaving other bits in RA unchanged. The condition register CR0 is updated if Rc=1.", "pseudocode": "n ← SH\nmask ← MASK(MB, 63 - n)\nrotated ← ROTL64(RS, n)\nRA ← (RA & ¬mask) | (rotated & mask)\nif Rc = 1 then CR0 ← (RA < 0, RA > 0, RA = 0, SO)", "page_found": "Page 148", "programming_notes": "The rldimi instruction is useful for performing masked left rotations on 64-bit values. Ensure that the shift amount (SH) and mask bits (MB) are within valid ranges to avoid undefined behavior. This instruction operates at user privilege level and does not generate exceptions under normal conditions, but incorrect usage can lead to unexpected results.", "example": "rldimi r4, r3, 3, 0"}
{"mnemonic": "sld", "architecture": "PowerISA", "full_name": "Shift Left Doubleword", "summary": "Shifts a 64-bit register left by the amount specified in RB.", "syntax": "sld RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 27 | Rc", "hex_opcode": "0x7C000036", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "27", "clean": "27"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "RB", "desc": "Shift Amount Register"}, {"name": "RT", "desc": "Target General Purpose Register"}], "pseudocode": "if (RB)57 = 0 then\n    n ←(RB)58:63\n    r ←ROTL64((RS), n)\n    m ←MASK(0, 63-n)\nelse\n    m ←640\nRA ←r & m", "example": "sld r3, r4, r5", "example_note": "r3 = r4 << r5 (64-bit).", "extension": "Base", "description": "The contents of register RS are shifted left the number of bits specified by (RB)57:63. Bits shifted out of position 0 are lost. Zeros are supplied to the vacated positions on the right. The result is placed into register RA. Shift amounts from 64 to 127 give a zero result.", "special_registers": "CR0", "page_found": "Page 150 - 152", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "srd", "architecture": "PowerISA", "full_name": "Shift Right Doubleword", "summary": "Logical right shift of 64-bit value.", "syntax": "srd RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 539", "hex_opcode": "0x7C000436", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "539", "clean": "539"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RB", "desc": "Shift Reg"}], "extension": "Base", "description": "Logically shifts RS right by the number of bit positions specified in RB (bits 57-63), inserting zeros at the left. If RB ≥ 64, the result is zero. No status registers are affected.", "pseudocode": "n ← RB[57:63]\nif n < 64 then RA ← RS >> n\nelse RA ← 0", "page_found": "Page 1145", "special_registers": "MSR", "programming_notes": "The srd instruction is used to update the Machine State Register (MSR) based on the contents of a source register and the L field. When L=0, specific bits in the MSR are updated using logical operations involving bits from the source register and the current MSR state. When L=1, only bits 48 and 62 of the MSR are set to match those in the source register, while other bits remain unchanged. This instruction requires supervisor privilege level and can trigger exceptions if not executed properly.", "example": "srd r4, r3, r5"}
{"mnemonic": "srad", "architecture": "PowerISA", "full_name": "Shift Right Algebraic Doubleword", "summary": "Arithmetic right shift of 64-bit value (preserves sign).", "syntax": "srad RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 794", "hex_opcode": "0x7C000634", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "794", "clean": "794"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RB", "desc": "Shift Reg"}], "extension": "Base", "description": "Arithmetically shifts RS right by the number of bit positions specified in RB (bits 57-63), preserving the sign bit (bit 0) and shifting in sign-extended bits. If RB ≥ 64, the result is all 0s or all 1s depending on sign. The XER[CA] carry bit is set if any 1-bits are shifted out from a negative number.", "pseudocode": "n ← RB[57:63]\nif n < 64 then\n  RA ← RS >>a n\n  XER[CA] ← 1 if (RS < 0 & (RS & MASK(64-n, 63)) ≠ 0) else 0\nelse\n  if RS < 0 then RA ← -1; XER[CA] ← 1\n  else RA ← 0; XER[CA] ← 0", "page_found": "Page 151", "programming_notes": "The srad instruction is commonly used for right-shifting signed integers while preserving the sign bit. Be cautious with shift amounts of 32 or more, as they result in a full sign extension and clear the carry bits. Ensure that the input register RS contains valid data and that RB's upper 8 bits specify a valid shift amount (0-63).", "example": "srad r4, r3, r5"}
{"mnemonic": "sradi", "architecture": "PowerISA", "full_name": "Shift Right Algebraic Doubleword Immediate", "summary": "Performs an arithmetic right shift on a 64-bit doubleword by a constant amount.", "syntax": "sradi RA, RS, SH", "encoding": {"format": "XS-form", "binary_pattern": "31 | RS | RA | SH | 413 | Rc", "hex_opcode": "0x7C000674", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "SH", "clean": "SH"}, {"raw": "413", "clean": "413"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "SH", "desc": "Shift Amount (0-63, Split field)"}], "pseudocode": "n ← SH\nRA ← RS >>a n\nif RS < 0 & (RS & MASK(64-n, 63)) ≠ 0 then XER[CA] ← 1\nelse XER[CA] ← 0\nif Rc = 1 then CR0 ← (RA < 0, RA > 0, RA = 0, SO)", "example": "sradi r3, r4, 10", "example_note": "r3 = r4 >> 10 (Signed 64-bit).", "extension": "Base", "description": "Arithmetically shifts RS right by SH bit positions (0-63), preserving the sign bit and shifting in sign-extended bits. Sets XER[CA] if any 1-bits are shifted out from a negative number. The condition register CR0 is updated if Rc=1.", "page_found": "Page 151", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "lhbrx", "architecture": "PowerISA", "full_name": "Load Halfword Byte-Reverse Indexed", "summary": "Loads a halfword from memory, byte-reverses it, and stores it in a register.", "syntax": "lhbrx RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 790 | /", "hex_opcode": "0x7C00062C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "790", "clean": "790"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Loads a halfword from memory at address (RA|0) + RB, byte-reverses it, and stores the result in RT. No status flags are affected. This is part of the Base category and is commonly used for endianness conversion when reading network or file data.", "pseudocode": "EA ← (RA|0) + RB\nRT ← byte_reverse_16([EA])", "programming_notes": "These instructions have the effect of loading and storing data in the opposite byte ordering from that which would be used by other Load and Store instructions.", "page_found": "Page 100 - 102", "example": "lhbrx r3, r4, r5"}
{"mnemonic": "lwbrx", "architecture": "PowerISA", "full_name": "Load Word Byte-Reverse Indexed", "summary": "Loads a word and swaps bytes.", "syntax": "lwbrx RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 534 | /", "hex_opcode": "0x7C00042C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "534", "clean": "534"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Loads a word (32-bit value) from memory at address (RA|0) + RB, byte-reverses it, and stores the result in RT. No status flags are affected. This instruction is used for converting word-sized data between big-endian and little-endian formats.", "pseudocode": "EA ← (RA|0) + RB\nRT ← byte_reverse_32([EA])", "page_found": "Page 102", "programming_notes": "The lwbrx instruction is commonly used to load a word from memory and reverse its byte order, which can be useful for handling data in big-endian or little-endian formats. Ensure that the base address (RA) and index (RB) registers are correctly set to avoid incorrect memory access. This instruction operates at user privilege level and will raise an exception if it accesses invalid memory addresses.", "example": "lwbrx r3, r4, r5"}
{"mnemonic": "sthbrx", "architecture": "PowerISA", "full_name": "Store Halfword Byte-Reverse Indexed", "summary": "Swaps bytes and stores a halfword.", "syntax": "sthbrx RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 918 | /", "hex_opcode": "0x7C00072C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "918", "clean": "918"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Byte-reverses the low 16 bits of RS and stores the result as a halfword in memory at address (RA|0) + RB. No status flags are affected. This is used to write halfword data in reversed byte order to memory.", "pseudocode": "EA ← (RA|0) + RB\n[EA] ← byte_reverse_16(RS[48:63])", "page_found": "Page 102", "programming_notes": "The sthbrx instruction is useful for storing a halfword in memory with byte-reversed order. Ensure that the base address register (RA) and index register (RB) are correctly set to avoid incorrect memory addresses. This instruction operates at user privilege level and will raise an exception if the effective address is out of bounds or if there is a protection fault.", "example": "sthbrx r3, r4, r5"}
{"mnemonic": "stwbrx", "architecture": "PowerISA", "full_name": "Store Word Byte-Reverse Indexed", "summary": "Swaps bytes and stores a word.", "syntax": "stwbrx RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 662 | /", "hex_opcode": "0x7C00052C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "662", "clean": "662"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Byte-reverses the low 32 bits of RS and stores the result as a word in memory at address (RA|0) + RB. No status flags are affected. This instruction is used for writing word-sized data in reversed byte order.", "pseudocode": "EA ← (RA|0) + RB\n[EA] ← byte_reverse_32(RS[32:63])", "page_found": "Page 102", "programming_notes": "The stwbrx instruction is useful for storing a word in memory with its byte order reversed, which can be necessary for compatibility with systems that use different endianness. Ensure that the effective address (EA) calculated from registers RA and RB is properly aligned to avoid alignment exceptions. This instruction operates at user privilege level but will raise an exception if the EA is out of bounds or if there are insufficient permissions.", "example": "stwbrx r3, r4, r5"}
{"mnemonic": "ldbrx", "architecture": "PowerISA", "full_name": "Load Doubleword Byte-Reverse Indexed", "summary": "Loads a doubleword from memory, byte-reversing it before storing in the target register.", "syntax": "ldbrx RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 532 | /", "hex_opcode": "0x7C000428", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "532", "clean": "532"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Loads a doubleword (64-bit value) from memory at address (RA|0) + RB, byte-reverses it, and stores the result in RT. No status flags are affected. This is used for converting doubleword data between big-endian and little-endian byte orders.", "pseudocode": "EA ← (RA|0) + RB\nRT ← byte_reverse_64([EA])", "page_found": "Page 102 - 104", "programming_notes": "The ldbrx instruction is commonly used for loading and reversing the byte order of a doubleword from memory into a register. Ensure that the base address in RA (or 0 if using an absolute address) and the offset in RB are correctly set to avoid accessing invalid memory locations. This instruction operates at user privilege level, but care must be taken to handle potential exceptions such as alignment errors or access violations. Performance may vary depending on memory alignment; optimal performance is achieved when the effective address is 8-byte aligned.", "example": "ldbrx r3, r4, r5"}
{"mnemonic": "stdbrx", "architecture": "PowerISA", "full_name": "Store Doubleword Byte-Reverse Indexed", "summary": "Swaps bytes and stores 64 bits.", "syntax": "stdbrx RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 660 | /", "hex_opcode": "0x7C000528", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "660", "clean": "660"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Byte-reverses all 64 bits of RS and stores the result as a doubleword in memory at address (RA|0) + RB. No status flags are affected. This instruction is used to write doubleword data in reversed byte order to memory.", "pseudocode": "EA ← (RA|0) + RB\n[EA] ← byte_reverse_64(RS)", "page_found": "Page 103", "programming_notes": "The stdbrx instruction is useful for storing a doubleword in memory with byte-reversed order. Ensure that the source register RS contains the data to be stored, and registers RA and RB are correctly set to calculate the effective address. This instruction operates at user privilege level and may raise an exception if there's a memory access violation.", "example": "stdbrx r3, r4, r5"}
{"mnemonic": "stwcx.", "architecture": "PowerISA", "full_name": "Store Word Conditional Indexed", "summary": "Stores a word from a register to memory if the reservation is valid and matches the address used in the corresponding lwarx instruction.", "syntax": "stwcx. RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 150 | 1", "hex_opcode": "0x7C00012D", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "150", "clean": "150"}, {"raw": "1", "clean": "1"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "The stwcx. instruction stores the upper half of the contents of register RS into memory at the effective address (EA) formed by adding the contents of registers RA and RB, provided that a reservation exists for this EA and the reservation length is 4 bytes. If the reservation does not exist or the conditions are not met, no store is performed.", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + (RB)\nif RESERVE then\n    if RESERVE_LENGTH = 4 &\n       RESERVE_ADDR = real_addr(EA) then\n        MEM(EA, 4) ← (RS)32:63\n        undefined_case ← 0\n        store_performed ← 1\n    else\n        z ← smallest real page size supported by implementation\n        if RESERVE_ADDR ÷ z = real_addr(EA) ÷ z then\n          undefined_case ← 1\n        else\n          undefined_case ← 0\n          store_performed ← 0\nelse\n    undefined_case ← 0\n    store_performed ← 0\nif undefined_case then\n    u1 ← undefined 1-bit value\n    if u1 then\n      MEM(EA, 4) ← (RS)32:63\n    u2 ← undefined 1-bit value\n    CR0 ← 0b00 || u2 || XERSO\nelse\n    CR0 ← 0b00 || store_performed || XERSO\nRESERVE ← 0", "special_registers": "CR0, XER", "page_found": "Page 1055 - 1056", "programming_notes": "Succeeds only if a valid reservation exists on the target address. Sets CR0[EQ] to 1 on success, 0 on failure. Must always be used in a retry loop that re-executes the load-reserve instruction on failure.", "example": "stwcx. r3, r4, r5"}
{"mnemonic": "stdcx.", "architecture": "PowerISA", "full_name": "Store Doubleword Conditional Indexed", "summary": "Stores a doubleword from a register to memory if the reservation is valid and matches the address used for the reservation.", "syntax": "stdcx. RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 214 | 1", "hex_opcode": "0x7C0001AD", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "214", "clean": "214"}, {"raw": "1", "clean": "1"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "The stdcx. instruction stores the contents of register RS into memory at the effective address (EA) calculated as the sum of registers RA and RB, but only if there is a valid reservation that matches this EA and has a length of 8 bytes. The reservation is cleared after the operation.", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + (RB)\nif RESERVE then\n    if RESERVE_LENGTH = 8 &\n       RESERVE_ADDR = real_addr(EA) then\n        MEM(EA, 8) ← (RS)\n        undefined_case ← 0\n        store_performed ← 1\n    else\n        z ← smallest real page size supported by implementation\n        if RESERVE_ADDR ÷ z = real_addr(EA) ÷ z then\n          undefined_case ← 1\n        else\n          undefined_case ← 0\n          store_performed ← 0\nelse\n    undefined_case ← 0\n    store_performed ← 0\nif undefined_case then\n    u1 ← undefined 1-bit value\n    if u1 then\n      MEM(EA, 8) ← (RS)\n    u2 ← undefined 1-bit value\n    CR0 ← 0b00 || u2 || XERSO\nelse\n    CR0 ← 0b00 || store_performed || XERSO\nRESERVE ← 0", "special_registers": "CR0, XER", "page_found": "Page 1057 - 1058", "programming_notes": "Succeeds only if a valid reservation exists on the target address. Sets CR0[EQ] to 1 on success, 0 on failure. Must always be used in a retry loop that re-executes the load-reserve instruction on failure.", "example": "stdcx. r3, r4, r5"}
{"mnemonic": "tw", "architecture": "PowerISA", "full_name": "Trap Word", "summary": "Traps if condition (comparison of words) is met.", "syntax": "tw TO, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | TO | RA | RB | 4", "hex_opcode": "0x7C000008", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "TO", "clean": "TO"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "4", "clean": "4"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "TO", "desc": "Options"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Base", "description": "Compares the 32-bit signed values in RA and RB according to the trap condition bits in TO. If the condition is true, a program interrupt (trap) is generated; otherwise execution continues. The TO field encodes up to five independent comparison conditions (less-than, greater-than, equal, unsigned less-than, unsigned greater-than).", "pseudocode": "if (TO[0] & (RA <s RB)) | (TO[1] & (RA >s RB)) | (TO[2] & (RA = RB)) | (TO[3] & (RA <u RB)) | (TO[4] & (RA >u RB)) then\n  Trap_Exception ← 1\nelse\n  Trap_Exception ← 0", "page_found": "Page 130", "special_registers": "CR0, CR1, CR6", "programming_notes": "Generates a program exception (System Call or Trap type) when the trap condition is true. The condition codes in TO select which comparisons trigger the trap: bit 0 = LT, bit 1 = GT, bit 2 = EQ, bit 3 = LU (unsigned), bit 4 = GU (unsigned). TO=31 (all bits set) always traps.", "example": "tw 4, r4, r5"}
{"mnemonic": "twi", "architecture": "PowerISA", "full_name": "Trap Word Immediate", "summary": "Compares the contents of register RA with an immediate value and invokes the system trap handler if any specified condition is met.", "syntax": "twi TO, RA, SIM", "encoding": {"format": "D-form", "binary_pattern": "3 | TO | RA | SI", "hex_opcode": "0x0C000000", "visual_parts": [{"raw": "3", "clean": "3"}, {"raw": "TO", "clean": "TO"}, {"raw": "RA", "clean": "RA"}, {"raw": "SIM", "clean": "SIM"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "TO", "desc": "Options"}, {"name": "RA", "desc": "Src"}, {"name": "SIM", "desc": "Imm"}, {"name": "SI", "desc": "Sign-Extended Immediate Value"}, {"name": "CRb", "desc": "Condition Register Field"}, {"name": "L", "desc": "Link Bit"}, {"name": "Ra", "desc": "Source General Purpose Register"}, {"name": "SIm", "desc": "Immediate Value"}, {"name": "LK", "desc": "Link Bit"}], "extension": "Base", "description": "The contents of register RA are compared with the sign-extended value of the SI field. If any bit in the TO field is set to 1 and its corresponding condition is met by the result of the comparison, the system trap handler is invoked.", "pseudocode": "a ← EXTS((RA)32:63)\nif (a < EXTS(SI)) & TO0 then TRAP\nif (a > EXTS(SI)) & TO1 then TRAP\nif (a = EXTS(SI)) & TO2 then TRAP\nif (a <u EXTS(SI)) & TO3 then TRAP\nif (a >u EXTS(SI)) & TO4 then TRAP", "extended_mnemonics": [{"mnemonic": "tweq", "equivalent_to": "twi 4,RA,RB"}, {"mnemonic": "twgti", "equivalent_to": "twi 8,RA,SI"}, {"mnemonic": "twllei", "equivalent_to": "twi 6,RA,SI"}], "page_found": "Page 129 - 130", "special_registers": "CR0, XER", "programming_notes": "Generates a program exception (System Call or Trap type) when the trap condition is true. The condition codes in TO select which comparisons trigger the trap: bit 0 = LT, bit 1 = GT, bit 2 = EQ, bit 3 = LU (unsigned), bit 4 = GU (unsigned). TO=31 (all bits set) always traps.", "example": "twi 4, r4, 4"}
{"mnemonic": "td", "architecture": "PowerISA", "full_name": "Trap Doubleword", "summary": "Traps if condition (comparison of doublewords) is met.", "syntax": "td TO, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | TO | RA | RB | 68", "hex_opcode": "0x7C000088", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "TO", "clean": "TO"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "68", "clean": "68"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "TO", "desc": "Options"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Base", "description": "Compares the 64-bit signed values in RA and RB according to the trap condition bits in TO. If the condition is true, a program interrupt (trap) is generated; otherwise execution continues. The TO field encodes five independent doubleword comparison conditions (less-than, greater-than, equal, unsigned less-than, unsigned greater-than).", "pseudocode": "if (TO[0] & (RA <s RB)) | (TO[1] & (RA >s RB)) | (TO[2] & (RA = RB)) | (TO[3] & (RA <u RB)) | (TO[4] & (RA >u RB)) then\n  Trap_Exception ← 1\nelse\n  Trap_Exception ← 0", "programming_notes": "Generates a program exception (System Call or Trap type) when the trap condition is true. The condition codes in TO select which comparisons trigger the trap: bit 0 = LT, bit 1 = GT, bit 2 = EQ, bit 3 = LU (unsigned), bit 4 = GU (unsigned). TO=31 (all bits set) always traps.", "example": "td 4, r4, r5"}
{"mnemonic": "tdi", "architecture": "PowerISA", "full_name": "Trap Doubleword Immediate", "summary": "Compares the contents of a register with an immediate value and invokes a trap handler if specified conditions are met.", "syntax": "tdi TO, RA, SIM", "encoding": {"format": "D-form", "binary_pattern": "000010 | CRb | RA | SIMM", "hex_opcode": "0x08000000", "visual_parts": [{"raw": "2", "clean": "2"}, {"raw": "TO", "clean": "TO"}, {"raw": "RA", "clean": "RA"}, {"raw": "SIM", "clean": "SIM"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "TO", "desc": "Options"}, {"name": "RA", "desc": "Src"}, {"name": "SIM", "desc": "Imm"}, {"name": "SI", "desc": "Sign-Extended Immediate Value"}, {"name": "CRb", "desc": "Condition Register Field"}, {"name": "SIMM", "desc": "Signed Immediate Value"}], "extension": "Base", "description": "The contents of register RA are compared with the sign-extended value of the SI field. If any bit in the TO field is set to 1 and its corresponding condition is met by the result of the comparison, the system trap handler is invoked.", "pseudocode": "a ← (RA)\nb ← EXTS(SI)\nif (a < b) & TO0 then TRAP\nif (a > b) & TO1 then TRAP\nif (a = b) & TO2 then TRAP\nif (a <u b) & TO3 then TRAP\nif (a >u b) & TO4 then TRAP", "extended_mnemonics": [{"mnemonic": "tdge", "equivalent_to": "td 12,RA,RB"}, {"mnemonic": "tdlnl", "equivalent_to": "td 5,RA,RB tdlti RA,SI"}, {"mnemonic": "tdnei", "equivalent_to": "tdi 24,RA,SI"}], "page_found": "Page 130 - 132", "special_registers": "CRb, XER", "programming_notes": "Generates a program exception (System Call or Trap type) when the trap condition is true. The condition codes in TO select which comparisons trigger the trap: bit 0 = LT, bit 1 = GT, bit 2 = EQ, bit 3 = LU (unsigned), bit 4 = GU (unsigned). TO=31 (all bits set) always traps.", "example": "tdi 4, r4, 4"}
{"mnemonic": "extsb", "architecture": "PowerISA", "full_name": "Extend Sign Byte", "summary": "Sign extends the low byte of a register to the full width.", "syntax": "extsb RT,RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 954 | /", "hex_opcode": "0x7C000774", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "954", "clean": "954"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RT", "desc": "Target General Purpose Register"}], "extension": "Base", "description": "The contents of the specified byte (RS)56 are placed into RA56:63, and RA0:55 are filled with a copy of (RS)56.", "pseudocode": "if 'extsb' then\n    s ← (RS)56\n    RA56:63 ← (RS)56:63\n    RA0:55 ← 56s\nelse if 'extsb.' then\n    s ← (RS)56\n    RA56:63 ← (RS)56:63\n    RA0:55 ← 56s", "special_registers": "CR0, XER", "page_found": "Page 136 - 138", "programming_notes": "The extsb instruction is commonly used to sign-extend a byte value into a full word. Ensure the source register contains the correct byte to avoid unexpected results. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "extsb r3, r3"}
{"mnemonic": "extsh", "architecture": "PowerISA", "full_name": "Extend Sign Halfword", "summary": "Sign extends the low halfword.", "syntax": "extsh RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 922 | /", "hex_opcode": "0x7C000734", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "922", "clean": "922"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}], "extension": "Base", "description": "Sign-extends the low 16 bits (halfword) of the source register to fill all 64 bits of the destination register. The instruction replicates bit 15 of RS to all higher-order bits. No condition registers or status fields are affected unless an extended form with a recorded bit is used (extsH.).", "pseudocode": "RA ← EXTS(RS[48:63], 64)", "page_found": "Page 137", "programming_notes": "The extsh instruction is commonly used to sign-extend a halfword value from the source register into the destination register. Ensure that the source register contains a valid halfword value, and be aware that this operation affects the entire 64-bit destination register. This instruction operates at user privilege level and does not generate exceptions under normal circumstances.", "example": "extsh r4, r3"}
{"mnemonic": "extsw", "architecture": "PowerISA", "full_name": "Extend Sign Word", "summary": "Sign extends the low word (32-bit) to 64 bits.", "syntax": "extsw RT,RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 986 | /", "hex_opcode": "0x7C0007B4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "986", "clean": "986"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RT", "desc": "Target General Purpose Register"}], "extension": "Base", "description": "The contents of register RS are extended to fill the upper 32 bits of register RA, and the lower 32 bits of RA are filled with a copy of the upper 32 bits of RS.", "pseudocode": "if 'extsw' then\n    s ← (RS)32\n    RA32:63 ← (RS)32:63\n    RA0:31 ← 32s\nelse if 'extsw.' then\n    s ← (RS)32\n    RA32:63 ← (RS)32:63\n    RA0:31 ← 32s", "special_registers": "CR0, XER", "page_found": "Page 138 - 140", "programming_notes": "The extsw instruction is commonly used to sign-extend a 32-bit value in RS to a 64-bit value in RA. Ensure that the source register RS contains the correct 32-bit signed integer to avoid unexpected results. This instruction operates at user privilege level and does not generate exceptions under normal circumstances.", "example": "extsw r3, r3"}
{"mnemonic": "eqv", "architecture": "PowerISA", "full_name": "Equivalent", "summary": "Bitwise Equivalence (XNOR). RA = ~(RS ^ RB).", "syntax": "eqv RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 284 | /", "hex_opcode": "0x7C000238", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "284", "clean": "284"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Base", "description": "Performs a bitwise equivalence (XNOR) operation: RA ← ~(RS XOR RB). Each bit position in RA is set to 1 if the corresponding bits in RS and RB are equal, 0 otherwise. No condition registers or status fields are affected unless an extended form with a recorded bit is used (eqv.).", "pseudocode": "RA ← ~(RS ^ RB)", "page_found": "Page 136", "programming_notes": "The eqv instruction is useful for performing bitwise equivalence operations, which can be applied in various logic and data manipulation tasks. Ensure that the input registers RS and RB are correctly aligned and contain the expected data to avoid unexpected results. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "eqv r4, r3, r5"}
{"mnemonic": "nand", "architecture": "PowerISA", "full_name": "NAND", "summary": "Bitwise NAND. RA = ~(RS & RB).", "syntax": "nand RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 476 | /", "hex_opcode": "0x7C0003B8", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "476", "clean": "476"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Base", "description": "Performs a bitwise NAND operation: RA ← ~(RS AND RB). Each bit position in RA is set to 1 if the corresponding bits in RS and RB are not both 1, 0 otherwise. No condition registers or status fields are affected unless an extended form with a recorded bit is used (nand.).", "pseudocode": "RA ← ~(RS & RB)", "page_found": "Page 79", "special_registers": "CR", "programming_notes": "The crnand instruction is useful for performing bitwise NAND operations on specific bits within the Condition Register. Ensure that the bit positions specified by BA, BB, and BT are valid to avoid undefined behavior. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "nand r4, r3, r5"}
{"mnemonic": "nor", "architecture": "PowerISA", "full_name": "NOR", "summary": "Bitwise NOR. RA = ~(RS | RB).", "syntax": "nor RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 124 | /", "hex_opcode": "0x7C0000F8", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "124", "clean": "124"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Base", "description": "Performs a bitwise NOR operation: RA ← ~(RS OR RB). Each bit position in RA is set to 1 if the corresponding bits in RS and RB are both 0, 0 otherwise. No condition registers or status fields are affected unless an extended form with a recorded bit is used (nor.).", "pseudocode": "RA ← ~(RS | RB)", "page_found": "Page 1037", "programming_notes": "The nor instruction performs a bitwise NOR of registers RS and RB and places the result in RA. Coding RB the same as RS forms the extended mnemonic not RA,RS, the standard way to complement a register. This instruction operates at user privilege level.", "example": "nor r4, r3, r5"}
{"mnemonic": "orc", "architecture": "PowerISA", "full_name": "OR with Complement", "summary": "Performs a bitwise OR operation between the contents of two registers and the complement of the third register.", "syntax": "orc RA,RS,RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 412 | /", "hex_opcode": "0x7C000338", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "412", "clean": "412"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Base", "description": "The contents of register RS are ORed with the complement of the contents of register RB, and the result is placed into register RA.", "pseudocode": "if 'orc' then\n    RA <- (RS) | ¬(RB)\nelse if 'orc.' then\n    RA <- (RS) | ¬(RB)\n    CR0 <- result of OR operation", "special_registers": "CR0", "page_found": "Page 135 - 136", "programming_notes": "The orc instruction is useful for setting bits in a register based on the complement of another register. Be cautious with bit manipulation as incorrect usage can lead to unexpected results. The instruction operates at user privilege level and does not generate exceptions under normal conditions. Performance may vary depending on the specific implementation and architecture.", "example": "orc r4, r3, r5"}
{"mnemonic": "macchw", "architecture": "PowerISA", "full_name": "Multiply Accumulate Cross Halfword", "summary": "Multiply bottom half of RA by top half of RB, add to RT.", "syntax": "macchw RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 172 | 0", "hex_opcode": "0x10000158", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "172", "clean": "172"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the low halfword (bits 48-63) of RA by the high halfword (bits 0-15) of RB and adds the signed 32-bit product to the low 32 bits of RT, placing the result back in the low 32 bits of RT. This is part of the embedded (e200/e500) category. The instruction does not affect condition registers or XER unless an extended variant is used.", "pseudocode": "prod ← EXTS(RA[48:63], 32) * EXTS(RB[0:15], 32); RT[32:63] ← RT[32:63] + prod[0:31]", "example": "macchw r3, r4, r5"}
{"mnemonic": "macchws", "architecture": "PowerISA", "full_name": "Multiply Accumulate Cross Halfword Signed", "summary": "Signed Multiply Accumulate Cross Halfword with Saturation.", "syntax": "macchws RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 236 | 0", "hex_opcode": "0x100001D8", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "236", "clean": "236"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Signed multiply-accumulate of the low halfword of RA by the high halfword of RB, added to RT with saturation. The signed 32-bit product is added to the low 32 bits of RT; if overflow occurs, the result is saturated to the signed 32-bit range. This is an embedded (e200/e500) instruction. The SAT bit in XER is set if saturation occurs; other condition registers are not affected.", "pseudocode": "prod ← EXTS(RA[48:63], 32) * EXTS(RB[0:15], 32); sum ← EXTS(RT[32:63], 33) + EXTS(prod, 33); if (sum > 2^31 - 1) then { RT[32:63] ← 2^31 - 1; XER[SAT] ← 1 } else if (sum < -2^31) then { RT[32:63] ← -2^31; XER[SAT] ← 1 } else { RT[32:63] ← sum[0:31] }", "example": "macchws r3, r4, r5"}
{"mnemonic": "macchwu", "architecture": "PowerISA", "full_name": "Multiply Accumulate Cross Halfword Unsigned", "summary": "Unsigned Multiply Accumulate Cross Halfword.", "syntax": "macchwu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 12 | 0", "hex_opcode": "0x10000118", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "12", "clean": "12"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Unsigned multiply-accumulate of the low halfword of RA by the high halfword of RB, added to RT. The unsigned 32-bit product is added to the low 32 bits of RT, with wraparound on overflow. This is an embedded (e200/e500) instruction. No condition registers or XER fields are affected.", "pseudocode": "prod ← EXTZ(RA[48:63], 32) * EXTZ(RB[0:15], 32); RT[32:63] ← (RT[32:63] + prod[0:31]) mod 2^32", "example": "macchwu r3, r4, r5"}
{"mnemonic": "macchwsu", "architecture": "PowerISA", "full_name": "Multiply Accumulate Cross Halfword Signed Unsigned", "summary": "Mixed Sign Multiply Accumulate Cross Halfword with Saturation.", "syntax": "macchwsu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 204 | 0", "hex_opcode": "0x10000198", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "204", "clean": "204"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Mixed-sign multiply-accumulate of the signed low halfword of RA by the unsigned high halfword of RB, added to RT with saturation. The signed 32-bit product is added to the low 32 bits of RT; if overflow occurs, the result is saturated to the signed 32-bit range. This is an embedded (e200/e500) instruction. The SAT bit in XER is set if saturation occurs.", "pseudocode": "prod ← EXTS(RA[48:63], 32) * EXTZ(RB[0:15], 32); sum ← EXTS(RT[32:63], 33) + EXTS(prod, 33); if (sum > 2^31 - 1) then { RT[32:63] ← 2^31 - 1; XER[SAT] ← 1 } else if (sum < -2^31) then { RT[32:63] ← -2^31; XER[SAT] ← 1 } else { RT[32:63] ← sum[0:31] }", "example": "macchwsu r3, r4, r5"}
{"mnemonic": "machhw", "architecture": "PowerISA", "full_name": "Multiply Accumulate High Halfword", "summary": "Multiply top half of RA by top half of RB, add to RT.", "syntax": "machhw RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 44 | 0", "hex_opcode": "0x10000058", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "44", "clean": "44"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the high halfword (bits 0-15) of RA by the high halfword of RB as signed integers, then adds the 32-bit product to RT and stores the result in RT. This is part of the Embedded (SPE) category and does not affect any condition or status registers.", "pseudocode": "product ← EXTS(RA[0:15]) × EXTS(RB[0:15])\nRT ← RT + product", "example": "machhw r3, r4, r5"}
{"mnemonic": "machhws", "architecture": "PowerISA", "full_name": "Multiply Accumulate High Halfword Signed", "summary": "Signed Multiply Accumulate High Halfword with Saturation.", "syntax": "machhws RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 108 | 0", "hex_opcode": "0x100000D8", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "108", "clean": "108"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the high halfword (bits 0-15) of RA by the high halfword of RB as signed integers, adds the 32-bit product to RT, and saturates the result to the signed 32-bit range if overflow occurs. This is part of the Embedded (SPE) category and sets the SAT bit in the SPEFSCR if saturation occurs.", "pseudocode": "product ← EXTS(RA[0:15]) × EXTS(RB[0:15])\nresult ← RT + product\nif result > 2147483647 then\n  RT ← 2147483647\n  SPEFSCR[SAT] ← 1\nelif result < -2147483648 then\n  RT ← -2147483648\n  SPEFSCR[SAT] ← 1\nelse\n  RT ← result", "example": "machhws r3, r4, r5"}
{"mnemonic": "machhwu", "architecture": "PowerISA", "full_name": "Multiply Accumulate High Halfword Unsigned", "summary": "Unsigned Multiply Accumulate High Halfword.", "syntax": "machhwu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 12 | 0", "hex_opcode": "0x10000018", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "12", "clean": "12"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the high halfword (bits 0-15) of RA by the high halfword of RB as unsigned integers, then adds the 32-bit product to RT and stores the result in RT. This is part of the Embedded (SPE) category and does not affect any condition or status registers.", "pseudocode": "product ← EXTZ(RA[0:15]) × EXTZ(RB[0:15])\nRT ← RT + product", "example": "machhwu r3, r4, r5"}
{"mnemonic": "machhwsu", "architecture": "PowerISA", "full_name": "Multiply Accumulate High Halfword Signed Unsigned", "summary": "Mixed Sign Multiply Accumulate High Halfword with Saturation.", "syntax": "machhwsu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 76 | 0", "hex_opcode": "0x10000098", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "76", "clean": "76"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the high halfword (bits 0-15) of RA (signed) by the high halfword of RB (unsigned), adds the 32-bit product to RT, and saturates the result to the signed 32-bit range if overflow occurs. This is part of the Embedded (SPE) category and sets the SAT bit in SPEFSCR if saturation occurs.", "pseudocode": "product ← EXTS(RA[0:15]) × EXTZ(RB[0:15])\nresult ← RT + product\nif result > 2147483647 then\n  RT ← 2147483647\n  SPEFSCR[SAT] ← 1\nelif result < -2147483648 then\n  RT ← -2147483648\n  SPEFSCR[SAT] ← 1\nelse\n  RT ← result", "example": "machhwsu r3, r4, r5"}
{"mnemonic": "maclhw", "architecture": "PowerISA", "full_name": "Multiply Accumulate Low Halfword", "summary": "Multiply bottom half of RA by bottom half of RB, add to RT.", "syntax": "maclhw RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 428 | 0", "hex_opcode": "0x10000358", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "428", "clean": "428"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the low halfword (bits 16-31) of RA by the low halfword of RB as signed integers, then adds the 32-bit product to RT and stores the result in RT. This is part of the Embedded (SPE) category and does not affect any condition or status registers.", "pseudocode": "product ← EXTS(RA[16:31]) × EXTS(RB[16:31])\nRT ← RT + product", "example": "maclhw r3, r4, r5"}
{"mnemonic": "maclhws", "architecture": "PowerISA", "full_name": "Multiply Accumulate Low Halfword Signed", "summary": "Signed Multiply Accumulate Low Halfword with Saturation.", "syntax": "maclhws RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 492 | 0", "hex_opcode": "0x100003D8", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "492", "clean": "492"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the low halfword (bits 16-31) of RA by the low halfword of RB as signed integers, adds the 32-bit product to RT, and saturates the result to the signed 32-bit range if overflow occurs. This is part of the Embedded (SPE) category and sets the SAT bit in SPEFSCR if saturation occurs.", "pseudocode": "product ← EXTS(RA[16:31]) × EXTS(RB[16:31])\nresult ← RT + product\nif result > 2147483647 then\n  RT ← 2147483647\n  SPEFSCR[SAT] ← 1\nelif result < -2147483648 then\n  RT ← -2147483648\n  SPEFSCR[SAT] ← 1\nelse\n  RT ← result", "example": "maclhws r3, r4, r5"}
{"mnemonic": "maclhwu", "architecture": "PowerISA", "full_name": "Multiply Accumulate Low Halfword Unsigned", "summary": "Unsigned Multiply Accumulate Low Halfword.", "syntax": "maclhwu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 396 | 0", "hex_opcode": "0x10000318", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "396", "clean": "396"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the low halfword (bits 16-31) of RA by the low halfword of RB as unsigned integers, then adds the 32-bit product to RT and stores the result in RT. This is part of the Embedded (SPE) category and does not affect any condition or status registers.", "pseudocode": "product ← EXTZ(RA[16:31]) × EXTZ(RB[16:31])\nRT ← RT + product", "example": "maclhwu r3, r4, r5"}
{"mnemonic": "maclhwsu", "architecture": "PowerISA", "full_name": "Multiply Accumulate Low Halfword Signed Unsigned", "summary": "Mixed Sign Multiply Accumulate Low Halfword with Saturation.", "syntax": "maclhwsu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 460 | 0", "hex_opcode": "0x10000398", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "460", "clean": "460"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the low halfword (bits 16-31) of RA (signed) by the low halfword of RB (unsigned), adds the 32-bit product to RT, and saturates the result to the signed 32-bit range if overflow occurs. This is part of the Embedded (SPE) category and sets the SAT bit in SPEFSCR if saturation occurs.", "pseudocode": "product ← EXTS(RA[16:31]) × EXTZ(RB[16:31])\nresult ← RT + product\nif result > 2147483647 then\n  RT ← 2147483647\n  SPEFSCR[SAT] ← 1\nelif result < -2147483648 then\n  RT ← -2147483648\n  SPEFSCR[SAT] ← 1\nelse\n  RT ← result", "example": "maclhwsu r3, r4, r5"}
{"mnemonic": "mulchw", "architecture": "PowerISA", "full_name": "Multiply Cross Halfword", "summary": "Multiply bottom half of RA by top half of RB.", "syntax": "mulchw RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 168 | 0", "hex_opcode": "0x10000150", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "168", "clean": "168"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the sign-extended bottom halfword of RA by the sign-extended top halfword of RB, storing the low 32 bits of the product in RT. This is a signed 16×16→32 multiply operation. No condition register or status flags are affected.", "pseudocode": "a ← EXTS(RA[16:31])\nb ← EXTS(RB[0:15])\nRT ← (a × b)[32:63]", "example": "mulchw r3, r4, r5"}
{"mnemonic": "mulchwu", "architecture": "PowerISA", "full_name": "Multiply Cross Halfword Unsigned", "summary": "Unsigned Multiply Cross Halfword.", "syntax": "mulchwu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 136 | 0", "hex_opcode": "0x10000110", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "136", "clean": "136"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the zero-extended bottom halfword of RA by the zero-extended top halfword of RB, storing the low 32 bits of the product in RT. This is an unsigned 16×16→32 multiply operation. No condition register or status flags are affected.", "pseudocode": "a ← (RA[16:31])\nb ← (RB[0:15])\nRT ← (a × b)[32:63]", "example": "mulchwu r3, r4, r5"}
{"mnemonic": "mulhhw", "architecture": "PowerISA", "full_name": "Multiply High Halfword", "summary": "Multiply top half of RA by top half of RB.", "syntax": "mulhhw RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 40 | 0", "hex_opcode": "0x10000050", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "40", "clean": "40"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the sign-extended top halfword of RA by the sign-extended top halfword of RB, storing the low 32 bits of the product in RT. This is a signed 16×16→32 multiply operation on the upper halves. No condition register or status flags are affected.", "pseudocode": "a ← EXTS(RA[0:15])\nb ← EXTS(RB[0:15])\nRT ← (a × b)[32:63]", "example": "mulhhw r3, r4, r5"}
{"mnemonic": "mulhhwu", "architecture": "PowerISA", "full_name": "Multiply High Halfword Unsigned", "summary": "Unsigned Multiply High Halfword.", "syntax": "mulhhwu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 8 | 0", "hex_opcode": "0x10000010", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "8", "clean": "8"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the zero-extended top halfword of RA by the zero-extended top halfword of RB, storing the low 32 bits of the product in RT. This is an unsigned 16×16→32 multiply operation on the upper halves. No condition register or status flags are affected.", "pseudocode": "a ← (RA[0:15])\nb ← (RB[0:15])\nRT ← (a × b)[32:63]", "example": "mulhhwu r3, r4, r5"}
{"mnemonic": "mullhw", "architecture": "PowerISA", "full_name": "Multiply Low Halfword", "summary": "Multiply bottom half of RA by bottom half of RB.", "syntax": "mullhw RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 424 | 0", "hex_opcode": "0x10000350", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "424", "clean": "424"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the sign-extended bottom halfword of RA by the sign-extended bottom halfword of RB, storing the low 32 bits of the product in RT. This is a signed 16×16→32 multiply operation on the lower halves. No condition register or status flags are affected.", "pseudocode": "a ← EXTS(RA[16:31])\nb ← EXTS(RB[16:31])\nRT ← (a × b)[32:63]", "example": "mullhw r3, r4, r5"}
{"mnemonic": "mullhwu", "architecture": "PowerISA", "full_name": "Multiply Low Halfword Unsigned", "summary": "Unsigned Multiply Low Halfword.", "syntax": "mullhwu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 392 | 0", "hex_opcode": "0x10000310", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "392", "clean": "392"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the zero-extended bottom halfword of RA by the zero-extended bottom halfword of RB, storing the low 32 bits of the product in RT. This is an unsigned 16×16→32 multiply operation on the lower halves. No condition register or status flags are affected.", "pseudocode": "a ← (RA[16:31])\nb ← (RB[16:31])\nRT ← (a × b)[32:63]", "example": "mullhwu r3, r4, r5"}
{"mnemonic": "nmacchw", "architecture": "PowerISA", "full_name": "Negative Multiply Accumulate Cross Halfword", "summary": "Negate product of cross halfwords and add to accumulator.", "syntax": "nmacchw RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 174 | 0", "hex_opcode": "0x1000015C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "174", "clean": "174"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the sign-extended bottom halfword of RA by the sign-extended top halfword of RB, negates the product, and adds it to the current value of RT (treating RT as a 32-bit accumulator). The result is stored back in RT. No condition register or status flags are affected.", "pseudocode": "a ← EXTS(RA[16:31])\nb ← EXTS(RB[0:15])\nproduct ← (a × b)[32:63]\nRT ← RT + (¬product + 1)", "example": "nmacchw r3, r4, r5"}
{"mnemonic": "nmacchws", "architecture": "PowerISA", "full_name": "Negative Multiply Accumulate Cross Halfword Signed", "summary": "Negate product of cross halfwords and add to accumulator (Signed Saturation).", "syntax": "nmacchws RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 238 | 0", "hex_opcode": "0x100001DC", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "238", "clean": "238"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the sign-extended bottom halfword of RA by the sign-extended top halfword of RB, negates the product, and adds it to RT with signed saturation to 32 bits. The saturated result is stored in RT, and the SAT bit in the SPEFSCR is set if saturation occurred. This instruction requires the SPE category.", "pseudocode": "a ← EXTS(RA[16:31])\nb ← EXTS(RB[0:15])\nproduct ← (a × b)[32:63]\nresult ← RT + (¬product + 1)\nif result > 2147483647 then\n  RT ← 2147483647\n  SPEFSCR[SAT] ← 1\nelif result < -2147483648 then\n  RT ← -2147483648\n  SPEFSCR[SAT] ← 1\nelse\n  RT ← result", "example": "nmacchws r3, r4, r5"}
{"mnemonic": "nmachhw", "architecture": "PowerISA", "full_name": "Negative Multiply Accumulate High Halfword", "summary": "Negate product of high halfwords and add to accumulator.", "syntax": "nmachhw RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 46 | 0", "hex_opcode": "0x1000005C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "46", "clean": "46"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the high halfwords (bits 0-15) of RA and RB as signed 16-bit integers, negates the 32-bit product, and adds it to RT, storing the result in RT. This is an embedded SPE instruction that performs signed halfword multiply-accumulate with negation. The overflow bit (XER[OV]) is set if the result overflows a 32-bit signed integer.", "pseudocode": "prod ← EXTS((RA[0:15]) * (RB[0:15]))\nRT ← RT + (-prod)\nif overflow then XER[OV] ← 1 else XER[OV] ← 0\nXER[SO] ← XER[SO] | XER[OV]", "example": "nmachhw r3, r4, r5"}
{"mnemonic": "nmachhws", "architecture": "PowerISA", "full_name": "Negative Multiply Accumulate High Halfword Signed", "summary": "Negate product of high halfwords and add to accumulator (Signed Saturation).", "syntax": "nmachhws RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 110 | 0", "hex_opcode": "0x100000DC", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "110", "clean": "110"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the high halfwords (bits 0-15) of RA and RB as signed 16-bit integers, negates the 32-bit product, and adds it to RT with signed saturation, storing the result in RT. This is an embedded SPE instruction that performs signed halfword multiply-accumulate with negation and saturation. The overflow and saturation bits (XER[OV] and XER[SAT]) are set appropriately.", "pseudocode": "prod ← EXTS((RA[0:15]) * (RB[0:15]))\nresult ← RT + (-prod)\nif result > 2147483647 then\n  RT ← 2147483647\n  XER[SAT] ← 1\nelse if result < -2147483648 then\n  RT ← -2147483648\n  XER[SAT] ← 1\nelse\n  RT ← result\nXER[OV] ← XER[SAT]", "example": "nmachhws r3, r4, r5"}
{"mnemonic": "nmaclhw", "architecture": "PowerISA", "full_name": "Negative Multiply Accumulate Low Halfword", "summary": "Negate product of low halfwords and add to accumulator.", "syntax": "nmaclhw RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 430 | 0", "hex_opcode": "0x1000035C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "430", "clean": "430"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the low halfwords (bits 16-31) of RA and RB as signed 16-bit integers, negates the 32-bit product, and adds it to RT, storing the result in RT. This is an embedded SPE instruction that performs signed halfword multiply-accumulate with negation. The overflow bit (XER[OV]) is set if the result overflows a 32-bit signed integer.", "pseudocode": "prod ← EXTS((RA[16:31]) * (RB[16:31]))\nRT ← RT + (-prod)\nif overflow then XER[OV] ← 1 else XER[OV] ← 0\nXER[SO] ← XER[SO] | XER[OV]", "example": "nmaclhw r3, r4, r5"}
{"mnemonic": "nmaclhws", "architecture": "PowerISA", "full_name": "Negative Multiply Accumulate Low Halfword Signed", "summary": "Negate product of low halfwords and add to accumulator (Signed Saturation).", "syntax": "nmaclhws RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "4 | RT | RA | RB | 494 | 0", "hex_opcode": "0x100003DC", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "494", "clean": "494"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Acc/Dest"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Embedded", "description": "Multiplies the low halfwords (bits 16-31) of RA and RB as signed 16-bit integers, negates the 32-bit product, and adds it to RT with signed saturation, storing the result in RT. This is an embedded SPE instruction that performs signed halfword multiply-accumulate with negation and saturation. The overflow and saturation bits (XER[OV] and XER[SAT]) are set appropriately.", "pseudocode": "prod ← EXTS((RA[16:31]) * (RB[16:31]))\nresult ← RT + (-prod)\nif result > 2147483647 then\n  RT ← 2147483647\n  XER[SAT] ← 1\nelse if result < -2147483648 then\n  RT ← -2147483648\n  XER[SAT] ← 1\nelse\n  RT ← result\nXER[OV] ← XER[SAT]", "example": "nmaclhws r3, r4, r5"}
{"mnemonic": "dccci", "architecture": "PowerISA", "full_name": "Data Cache Congruence Class Invalidate", "summary": "Invalidates a congruence class in the data cache (Embedded).", "syntax": "dccci RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 454 | /", "hex_opcode": "0x7C00038E", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "454", "clean": "454"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Invalidates a congruence class in the data cache at the address formed by RA + RB. This is an embedded cache-management instruction with no guaranteed semantics on all implementations; behavior is implementation-dependent and may require supervisor privilege. The instruction has no effect on data in higher-level caches or main memory.", "pseudocode": "addr ← (RA) + (RB)\nInvalidate data cache congruence class at addr", "example": "dccci r4, r5"}
{"mnemonic": "dcread", "architecture": "PowerISA", "full_name": "Data Cache Read", "summary": "Reads a data cache tag or data (Debug).", "syntax": "dcread RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 486 | /", "hex_opcode": "0x7C0003CC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "486", "clean": "486"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Reads and returns a data cache tag or data value from the address RA + RB into register RT. This is an embedded debug/diagnostic instruction used to inspect data cache contents; exact behavior (tag vs. data read, selection mechanism) is implementation-dependent. The instruction requires supervisor privilege and may not be available on all embedded PowerPC implementations.", "pseudocode": "addr ← (RA) + (RB)\nRT ← Read data cache entry at addr", "example": "dcread r3, r4, r5"}
{"mnemonic": "iccci", "architecture": "PowerISA", "full_name": "Instruction Cache Congruence Class Invalidate", "summary": "Invalidates a congruence class in the instruction cache (Embedded).", "syntax": "iccci RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 966 | /", "hex_opcode": "0x7C00078E", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "966", "clean": "966"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Invalidates a congruence class in the instruction cache at the address formed by RA + RB. This is an embedded cache-management instruction with no guaranteed semantics on all implementations; behavior is implementation-dependent and may require supervisor privilege. The instruction has no effect on instruction cache entries in higher-level caches or main memory.", "pseudocode": "addr ← (RA) + (RB)\nInvalidate instruction cache congruence class at addr", "example": "iccci r4, r5"}
{"mnemonic": "icread", "architecture": "PowerISA", "full_name": "Instruction Cache Read", "summary": "Reads an instruction cache tag or data (Debug).", "syntax": "icread RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 998 | /", "hex_opcode": "0x7C0007CE", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "998", "clean": "998"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Reads and returns an instruction cache tag or data value from the address RA + RB into a read port. This is an embedded debug/diagnostic instruction used to inspect instruction cache contents; exact behavior (tag vs. instruction read, selection mechanism) is implementation-dependent. The instruction requires supervisor privilege and may not be available on all embedded PowerPC implementations.", "pseudocode": "addr ← (RA) + (RB)\nRead instruction cache entry at addr", "example": "icread r4, r5"}
{"mnemonic": "tlbre", "architecture": "PowerISA", "full_name": "TLB Read Entry", "summary": "Reads a TLB entry into MAS registers.", "syntax": "tlbre", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | / | 946 | /", "hex_opcode": "0x7C000762", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "946", "clean": "946"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Embedded", "description": "Reads a TLB entry specified by MAS0 into the MAS1-MAS3 registers. This instruction is privileged and requires hypervisor mode on some implementations. The TLB entry index and way are determined by the MAS0 register; the instruction populates MAS1-MAS3 with the corresponding entry data.", "pseudocode": "MAS1 ← TLB[MAS0.ESEL, MAS0.TLBSEL].MAS1\nMAS2 ← TLB[MAS0.ESEL, MAS0.TLBSEL].MAS2\nMAS3 ← TLB[MAS0.ESEL, MAS0.TLBSEL].MAS3", "example": "tlbre"}
{"mnemonic": "tlbwe", "architecture": "PowerISA", "full_name": "TLB Write Entry", "summary": "Writes a TLB entry from MAS registers.", "syntax": "tlbwe", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | / | 978 | /", "hex_opcode": "0x7C0007A2", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "978", "clean": "978"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Embedded", "description": "Writes a TLB entry from MAS1-MAS3 registers into the TLB at the location specified by MAS0. This instruction is privileged and requires hypervisor mode on some implementations. The entry index and way are determined by MAS0; the instruction updates the corresponding TLB entry with data from MAS1-MAS3.", "pseudocode": "TLB[MAS0.ESEL, MAS0.TLBSEL].MAS1 ← MAS1\nTLB[MAS0.ESEL, MAS0.TLBSEL].MAS2 ← MAS2\nTLB[MAS0.ESEL, MAS0.TLBSEL].MAS3 ← MAS3", "example": "tlbwe"}
{"mnemonic": "tlbsx", "architecture": "PowerISA", "full_name": "TLB Search Indexed", "summary": "Searches the TLB for an address.", "syntax": "tlbsx RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 914 | /", "hex_opcode": "0x7C000722", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "914", "clean": "914"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Searches the TLB for an entry matching the virtual address formed by combining RA and RB, and loads matching entry data into MAS0-MAS3 registers. If a match is found, MAS0.ESEL contains the entry index and MAS1-MAS3 contain the matching entry data. This instruction is privileged and affects MAS registers but not the general condition register.", "pseudocode": "EA ← (RA) + (RB)\nif TLB.lookup(EA) then\n  MAS0 ← TLB.index(EA)\n  MAS1 ← TLB[index].MAS1\n  MAS2 ← TLB[index].MAS2\n  MAS3 ← TLB[index].MAS3\nelse\n  MAS0.NOMPLT ← 1\nend if", "example": "tlbsx r4, r5"}
{"mnemonic": "tlbivax", "architecture": "PowerISA", "full_name": "TLB Invalidate Virtual Address Indexed", "summary": "Invalidates a TLB entry by virtual address.", "syntax": "tlbivax RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 786 | /", "hex_opcode": "0x7C000622", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "786", "clean": "786"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Invalidates a TLB entry matching the virtual address formed by RA and RB. This instruction is privileged and causes any TLB entry with a matching virtual address to be marked invalid. The exact behavior depends on the MMU implementation and may invalidate one or multiple entries.", "pseudocode": "EA ← (RA) + (RB)\nfor each TLB entry matching EA do\n  TLB[entry].V ← 0\nend for", "example": "tlbivax r4, r5"}
{"mnemonic": "wrtee", "architecture": "PowerISA", "full_name": "Write MSR External Enable", "summary": "Updates the EE bit of the MSR from a GPR.", "syntax": "wrtee RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | / | / | 131 | /", "hex_opcode": "0x7C000106", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "131", "clean": "131"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}], "extension": "Embedded", "description": "Updates the Machine State Register (MSR) External Enable (EE) bit from the least significant bit of RS. This instruction is privileged and allows software to enable or disable external interrupts. The EE bit controls whether external interrupts are recognized by the processor.", "pseudocode": "MSR.EE ← RS[63]", "example": "wrtee r3"}
{"mnemonic": "wrteei", "architecture": "PowerISA", "full_name": "Write MSR External Enable Immediate", "summary": "Updates the EE bit of the MSR from an immediate.", "syntax": "wrteei E", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | E | 163 | /", "hex_opcode": "0x7C000146", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "E", "clean": "E"}, {"raw": "163", "clean": "163"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "E", "desc": "Enable (0/1)"}], "extension": "Embedded", "description": "Updates the Machine State Register (MSR) External Enable (EE) bit from the immediate value E (0 or 1). This instruction is privileged and provides a quick way to enable or disable external interrupts. The EE bit controls whether external interrupts are recognized by the processor.", "pseudocode": "MSR.EE ← E", "example": "wrteei 0"}
{"mnemonic": "mfdcr", "architecture": "PowerISA", "full_name": "Move From Device Control Register", "summary": "Reads an on-chip peripheral register (DCR).", "syntax": "mfdcr RT, DCRN", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RT | DCRN | 323 | /", "hex_opcode": "0x7C000286", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "DCRN", "clean": "DCRN"}, {"raw": "323", "clean": "323"}], "bit_positions": "0:5 | 6:10 | 11:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "DCRN", "desc": "DCR Number"}], "extension": "Embedded", "description": "Reads a Device Control Register (DCR) and writes the value to general-purpose register RT. This instruction is privileged and device-specific; the DCR address is specified by DCRN. Access to DCR is implementation-dependent and may not be available on all processors.", "pseudocode": "RT ← DCR[DCRN]", "example": "mfdcr r3, 0"}
{"mnemonic": "mtdcr", "architecture": "PowerISA", "full_name": "Move To Device Control Register", "summary": "Writes an on-chip peripheral register (DCR).", "syntax": "mtdcr DCRN, RS", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RS | DCRN | 451 | /", "hex_opcode": "0x7C000386", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "DCRN", "clean": "DCRN"}, {"raw": "451", "clean": "451"}], "bit_positions": "0:5 | 6:10 | 11:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "DCRN", "desc": "DCR Number"}, {"name": "RS", "desc": "Source"}], "extension": "Embedded", "description": "Writes the value from general-purpose register RS to a Device Control Register (DCR) specified by DCRN. This instruction is privileged and device-specific. Access to DCR is implementation-dependent and may not be available on all processors; the effects depend on the target DCR.", "pseudocode": "DCR[DCRN] ← RS", "example": "mtdcr 0, r3"}
{"mnemonic": "darn", "architecture": "PowerISA", "full_name": "Deliver A Random Number", "summary": "Returns a random number from the hardware RNG. (L=3: Raw, L=1: Conditioned, L=0: 32-bit).", "syntax": "darn RT, L", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | / | L | 755 | /", "hex_opcode": "0x7C0005E6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "/", "clean": "/"}, {"raw": "L", "clean": "L"}, {"raw": "755", "clean": "755"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:13 | 14:15 | 16:20 | 21:31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "L", "desc": "Mode"}], "extension": "Base", "description": "Delivers a random number from the hardware random number generator into GPR RT. The L field controls the output mode: L=3 returns raw entropy, L=1 returns conditioned/whitened entropy, and L=0 returns a 32-bit conditioned value. This instruction requires the darn facility to be enabled and does not affect any condition or status registers.", "pseudocode": "if L = 3 then\n  RT ← raw_random_64()\nelif L = 1 then\n  RT ← conditioned_random_64()\nelif L = 0 then\n  RT ← (0 || conditioned_random_32())\nelse\n  UNDEFINED", "programming_notes": "The random number generator provides a minimum of 0.5 bits of entropy per bit. For L=0, the random number range is 0:0xFFFFFFFF. For L=1 and L=2, the random number range is 0:0xFFFFFFFF_FFFFFFFE. L=3 is reserved. A raw random number is unconditioned noise source output. A conditioned random number has been processed by hardware to reduce bias. 32-bit software running in an environment that does not preserve the high-order 32 bits of GPRs across invocations of the system error handler, signal handlers, event-based branch handlers, etc., may use the L=0 variant of darn and interpret the value 0xFFFFFFFF to indicate an error condition. When the error value is obtained, software is expected to repeat the operation. If a non-error value has not been obtained after several attempts, a software random number generation method should be used.", "page_found": "Page 119 - 120", "example": "darn r3, 0"}
{"mnemonic": "mffs", "architecture": "PowerISA", "full_name": "Move From FPSCR", "summary": "Moves the contents of the Floating-Point Status and Control Register (FPSCR) into a floating-point register.", "syntax": "mffs FRT", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | / | / | 583 | Rc", "hex_opcode": "0xFC00048E", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "583", "clean": "583"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}], "extension": "Floating-Point", "description": "Moves the contents of the Floating-Point Status and Control Register (FPSCR) into floating-point register FRT. If Rc=1 (mffs.), the instruction updates CR1 based on the moved FPSCR value. This is a privileged instruction that does not alter FPSCR itself.", "pseudocode": "FRT ← FPSCR\nif Rc = 1 then\n  CR1 ← (FRT[0:3])", "special_registers": "FPSCR, CR1, (if, Rc=1), CR0", "extended_mnemonics": ["mffs.", "mffs"], "page_found": "Page 216 - 218", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "mffs f1"}
{"mnemonic": "mtfsf", "architecture": "PowerISA", "full_name": "Move To FPSCR Fields", "summary": "Moves the contents of a floating-point register into specified fields of the FPSCR.", "syntax": "mtfsf FLM,FRB,L,W", "encoding": {"format": "XFL-form", "binary_pattern": "63 | L | FLM | W | FRB | 711 | /", "hex_opcode": "0xFC00058E", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "L", "clean": "L"}, {"raw": "FLM", "clean": "FLM"}, {"raw": "W", "clean": "W"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "711", "clean": "711"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "FLM", "desc": "Field Mask"}, {"name": "FRB", "desc": "Source"}, {"name": "L", "desc": "Load Control Bit"}, {"name": "W", "desc": "Word Select Bit"}], "extension": "Floating-Point", "description": "The FPSCR is modified as specified by the FLM, L, and W fields. If L=0, the contents of register FRB are placed into the FPSCR under control of the W field and the field mask specified by FLM. If L=1, the contents of register FRB are placed into the FPSCR.", "pseudocode": "if 'mtfsf' then\n    if L=0 then\n        for i from 0 to 7 do\n            if FLMi=1 then\n                FPSCR[k] <- FRB[i+8*(1-W)]\n            end if\n        end for\n    else if L=1 then\n        FPSCR <- FRB\n    end if\nend if", "special_registers": "FPSCR, CR1", "programming_notes": "Bits 33 and 34 (FEX and VX) cannot be explicitly reset.\nIf L=1 or if L=0 and FPSCR32:35 is specified, bits 32 (FX) and 35 (OX) are set to the values of (FRB)32 and (FRB)35.", "extended_mnemonics": ["mtfsf FLM,FRB"], "page_found": "Page 220 - 222", "example": "mtfsf 0xFF, f3, 0, 0"}
{"mnemonic": "mtfsfi", "architecture": "PowerISA", "full_name": "Move To FPSCR Field Immediate", "summary": "Writes a 4-bit immediate to a specific FPSCR field.", "syntax": "mtfsfi BF, U", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | / | U | 134 | /", "hex_opcode": "0xFC00010C", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "U", "clean": "U"}, {"raw": "134", "clean": "134"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BF", "desc": "Field Index"}, {"name": "U", "desc": "Immediate"}], "extension": "Floating-Point", "description": "Writes a 4-bit immediate value U into a 4-bit field of the FPSCR selected by BF. The target FPSCR field is at bits [4×BF : 4×BF+3]. This instruction directly modifies FPSCR state and may affect subsequent floating-point operations.", "special_registers": "FPSCR", "programming_notes": "Use mtfsfi to directly manipulate specific fields in the FPSCR, such as enabling or disabling exceptions. Ensure the immediate value fits within the specified field size to avoid undefined behavior. This instruction operates at user privilege level and does not generate exceptions for valid immediate values.", "pseudocode": "FPSCR[4*BF : 4*BF+3] ← U", "example": "mtfsfi cr0, 0"}
{"mnemonic": "mtfsb0", "architecture": "PowerISA", "full_name": "Move To FPSCR Bit 0", "summary": "Clears a specific bit in the FPSCR.", "syntax": "mtfsb0 BT", "encoding": {"format": "X-form", "binary_pattern": "63 | BT | / | / | 70 | /", "hex_opcode": "0xFC00008C", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BT", "clean": "BT"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "70", "clean": "70"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BT", "desc": "Bit Index"}], "extension": "Floating-Point", "description": "Clears (sets to 0) the FPSCR bit specified by BT. The FPSCR bits are numbered 0-31. Clearing certain FPSCR bits (e.g., exception bits or mode flags) can alter the behavior of subsequent floating-point operations.", "pseudocode": "FPSCR[BT] ← 0", "page_found": "Page 221", "special_registers": "FPSCR", "programming_notes": "The mtfsb0 instruction sets a specific bit in the FPSCR register to the value of the U field. It's commonly used for controlling floating-point exceptions and status flags. Be cautious when altering the FX bit, as it affects exception handling. This instruction operates at user privilege level.", "example": "mtfsb0 0"}
{"mnemonic": "mtfsb1", "architecture": "PowerISA", "full_name": "Move To FPSCR Bit 1", "summary": "Sets a specific bit in the FPSCR.", "syntax": "mtfsb1 BT", "encoding": {"format": "X-form", "binary_pattern": "63 | BT | / | / | 38 | /", "hex_opcode": "0xFC00004C", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BT", "clean": "BT"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "38", "clean": "38"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BT", "desc": "Bit Index"}], "extension": "Floating-Point", "description": "Sets (sets to 1) the FPSCR bit specified by BT. The FPSCR bits are numbered 0-31. Setting certain FPSCR bits (e.g., rounding mode or enable flags) can alter the behavior of subsequent floating-point operations.", "pseudocode": "FPSCR[BT] ← 1", "special_registers": "FPSCR", "programming_notes": "This instruction is used to enable a specific floating-point exception. Ensure that the FPSCR register is properly managed to avoid unintended exceptions. This operation requires supervisor privilege level.", "example": "mtfsb1 0"}
{"mnemonic": "hrfid", "architecture": "PowerISA", "full_name": "Hypervisor Return From Interrupt Doubleword", "summary": "Returns from a hypervisor interrupt.", "syntax": "hrfid", "encoding": {"format": "XL-form", "binary_pattern": "19 | / | / | / | 274 | /", "hex_opcode": "0x4C000224", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "274", "clean": "274"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Privileged", "description": "Returns from a hypervisor interrupt by restoring the program counter from HSRR0 and machine state from HSRR1, then resuming execution at the restored address. This is a hypervisor-privileged instruction and only valid when the processor is in hypervisor state. It acts as a serializing instruction.", "pseudocode": "NIA ← HSRR0\nRestore MSR from HSRR1\nReturn", "special_registers": "SRR0, SRR1, MSR", "programming_notes": "The hrfid instruction is crucial for hypervisors to manage interrupt returns, updating the MSR and setting the NIA based on values from HSRR. Ensure that HSRR registers are correctly populated before executing hrfid to avoid undefined behavior. This instruction operates at supervisor level and may trigger exceptions if executed in an inappropriate context.", "example": "hrfid"}
{"mnemonic": "copy", "architecture": "PowerISA", "full_name": "Copy", "summary": "Initiates a hardware copy (accelerator) operation.", "syntax": "copy RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 706 | /", "hex_opcode": "0x7C20060C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "706", "clean": "706"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Dest/Control"}, {"name": "RB", "desc": "Source"}], "extension": "Privileged", "description": "The 'copy' instruction loads a 128-byte block of data and associated metadata from memory into the copy buffer. The effective address (EA) is calculated as the sum of RA and RB. If EA is not aligned to 128 bytes or if the storage is Caching Inhibited, appropriate error handlers are invoked.", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + (RB)\ncopy_buffer ← memory(EA, 128) || MEMmetadata(EA, 128)", "programming_notes": "This instruction is treated as a Load, except that the data transfer ordering is described in Section 1.7.1.1.", "page_found": "Page 1042 - 1043", "example": "copy r4, r5"}
{"mnemonic": "paste", "architecture": "PowerISA", "full_name": "Paste", "summary": "Transfers data from the copy buffer to a specified memory location.", "syntax": "paste RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 770 | /", "hex_opcode": "0x7C00070C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "770", "clean": "770"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Dest"}, {"name": "RB", "desc": "Control"}, {"name": "L", "desc": "Logical flag (0 or 1)"}], "extension": "Privileged", "description": "Transfers data from the processor's copy buffer to a memory location specified by the effective address formed from RA and RB. This instruction is part of the Copy/Paste facility and requires special kernel/hypervisor support. The L operand controls paste behavior (0=non-atomic, 1=atomic).", "pseudocode": "EA ← (RA) + (RB)\nif L = 1 then\n  Paste_Atomic(EA, Copy_Buffer)\nelse\n  Paste_NonAtomic(EA, Copy_Buffer)", "special_registers": "CR0, XERSO", "extended_mnemonics": ["paste. RA,RB", "paste. RA,RB,1"], "page_found": "Page 1043 - 1044", "programming_notes": "The paste instruction is commonly used to transfer data from the copy buffer to memory. Ensure that the effective address (EA) calculated from RA and RB is correctly aligned for optimal performance. If L=1, be aware that metadata bits in the copy buffer are cleared before the transfer, which might affect subsequent operations relying on these bits.", "example": "paste r4, r5"}
{"mnemonic": "vclzb", "architecture": "PowerISA", "full_name": "Vector Count Leading Zeros Byte", "summary": "Counts the number of leading zero bits in each byte element of a vector register.", "syntax": "vclzb vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "0 | VRT | VRB | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0", "hex_opcode": "0x10000702", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1794", "clean": "1794"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vclzb, the number of consecutive zero bits starting at bit 0 of each byte element in VSR[VRB+32] is placed into the corresponding byte element in VSR[VRT+32]. The count ranges from 0 to 8, inclusive.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    n ←0\n    do while n < 8\n        if VSR[VRB+32].byte[i].bit[n] = 0b1 then\n            leave\n        n ←n + 1\n    end\n    VSR[VRT+32].byte[i] ←n\nend", "page_found": "Page 470 - 471", "special_registers": "MSR", "programming_notes": "The vclzb instruction counts leading zeros in each byte of the input vector. Ensure that the Vector Facility is enabled by checking and setting the appropriate bit in the MSR register. This instruction operates on 16-byte vectors, processing each byte individually. Be cautious with alignment; while not strictly required, proper alignment can optimize performance. The result is a vector where each element contains the count of leading zeros from the corresponding input byte.", "example": "vclzb vd, vb"}
{"mnemonic": "vclzh", "architecture": "PowerISA", "full_name": "Vector Count Leading Zeros Halfword", "summary": "Counts leading zeros in each halfword.", "syntax": "vclzh vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1858", "hex_opcode": "0x10000742", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1858", "clean": "1858"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Counts the number of leading zero bits in each of the four 16-bit halfwords of register VB and writes the count (0-16) into the corresponding halfword of register VD. Does not affect CR or FPSCR.", "pseudocode": "for i in 0 to 3 do\n  halfword ← VB[16*i : 16*i+15]\n  VD[16*i : 16*i+15] ← ctz(halfword) // count leading zeros in 16-bit value", "page_found": "Page 471", "special_registers": "MSR", "programming_notes": "The vclzh instruction is useful for counting leading zeros in each halfword of a vector, which can be helpful in various bit manipulation tasks. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The instruction processes 8 halfwords per vector register, and results are stored directly in the destination vector register.", "example": "vclzh vd, vb"}
{"mnemonic": "vclzw", "architecture": "PowerISA", "full_name": "Vector Count Leading Zeros Word", "summary": "Counts the number of leading zero bits in each word element of a vector register.", "syntax": "vclzw vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1922", "hex_opcode": "0x10000782", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1922", "clean": "1922"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vclzw, the number of consecutive zero bits starting at bit 0 of each word element in VSR[VRB+32] is counted and placed into the corresponding word element in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    n ←0\ndo while n < 32\n    if VSR[VRB+32].word[i].bit[n] = 0b1 then\n        leave\n    n ←n + 1\nend\nVSR[VRT+32].word[i] ←n\nend", "page_found": "Page 471 - 472", "special_registers": "MSR", "programming_notes": "vclzw counts leading zeros in each word of the input vector. Ensure VSR[VRB+32] is properly aligned and accessible. This instruction operates at user privilege level unless MSR.VEC is set, in which case it raises an exception.", "example": "vclzw vd, vb"}
{"mnemonic": "vclzd", "architecture": "PowerISA", "full_name": "Vector Count Leading Zeros Doubleword", "summary": "Counts the number of leading zero bits in each doubleword element of a vector register.", "syntax": "vclzd vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1986", "hex_opcode": "0x100007C2", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1986", "clean": "1986"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vclzd, for each integer value i from 0 to 1, counts the number of consecutive zero bits starting at bit 0 of doubleword element i of VSR[VRB+32] and places this count into doubleword element i of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    n ←0\n    do while (n<64) & (VSR[VRB+32].dword[i].bit[n]=0b0)\n        n ←n + 1\n    end\n    VSR[VRT+32].dword[i] ←n\nend", "page_found": "Page 472 - 473", "special_registers": "MSR", "programming_notes": "The vclzd instruction counts leading zeros in each doubleword of the input vector. Ensure that the Vector Facility is enabled by checking and setting the MSR.VEC bit. This instruction operates on 64-bit elements, so input vectors must be aligned accordingly. The result is stored in the destination vector register.", "example": "vclzd vd, vb"}
{"mnemonic": "vctzb", "architecture": "PowerISA", "full_name": "Vector Count Trailing Zeros Byte", "summary": "Counts the number of trailing zero bits in each byte element of a vector register.", "syntax": "vctzb vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | 28 | VRB | 1538", "hex_opcode": "0x101C0602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1794", "clean": "1794"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vctzb, the number of consecutive zero bits starting at bit 7 of each byte element in VSR[VRB+32] is placed into the corresponding byte element in VSR[VRT+32]. The count ranges from 0 to 8, inclusive.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    n ←0\n    do while n < 8\n        if VSR[VRB+32].byte[i].bit[7-n] = 0b1 then\n            leave\n        n ←n + 1\n    end\n    VSR[VRT+32].byte[i] ←CHOP8(EXTZ(n))\nend", "page_found": "Page 473 - 474", "special_registers": "MSR", "programming_notes": "The vctzb instruction counts the number of trailing zero bits in each byte of the source vector, storing the result in the destination vector. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates on 16-byte vectors and processes each byte independently. Be cautious with alignment; while not strictly required, proper alignment can improve performance.", "example": "vctzb vd, vb"}
{"mnemonic": "vctzh", "architecture": "PowerISA", "full_name": "Vector Count Trailing Zeros Halfword", "summary": "Counts trailing zeros in each halfword.", "syntax": "vctzh vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1858", "hex_opcode": "0x101D0602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1858", "clean": "1858"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Counts the number of trailing zero bits in each of the 8 halfword elements in vB and stores the result in the corresponding halfword of vD. Each result is an unsigned integer in the range 0-16. No status flags are affected. This instruction is part of the VMX (AltiVec) extension.", "pseudocode": "for i in 0 to 7 do\n  count ← 0\n  halfword ← vB[i*16 : i*16+15]\n  if halfword = 0 then\n    count ← 16\n  else\n    for j in 0 to 15 do\n      if halfword[j] = 1 then\n        break\n      count ← count + 1\n  vD[i*16 : i*16+15] ← count", "page_found": "Page 474", "special_registers": "MSR", "programming_notes": "The vctzh instruction is useful for counting trailing zeros in each halfword of a vector, which can be helpful in bit manipulation and data compression tasks. Ensure that the Vector Facility (VEC) is enabled in the MSR register to avoid a Vector_Unavailable exception. The instruction processes 8 halfwords per vector register, so ensure your data is properly aligned and structured for optimal performance.", "example": "vctzh vd, vb"}
{"mnemonic": "vctzw", "architecture": "PowerISA", "full_name": "Vector Count Trailing Zeros Word", "summary": "Counts the number of trailing zero bits in each word element of a vector register.", "syntax": "vctzw vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1922", "hex_opcode": "0x101E0602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1922", "clean": "1922"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vctzw, the number of consecutive zero bits starting at bit 31 of each word element in VSR[VRB+32] is counted and placed into the corresponding word element in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    n ←0\ndo while n < 32\n    if VSR[VRB+32].word[i].bit[31-n] = 0b1 then\n        leave\n    n ←n + 1\nend\nVSR[VRT+32].word[i] ←CHOP32(EXTZ(n))\nend", "page_found": "Page 474 - 475", "special_registers": "MSR", "programming_notes": "The vctzw instruction counts the number of trailing zeros in each word element of a vector register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates on 32-bit words, so input data must be aligned accordingly. The result is stored in another vector register, preserving the original data unless explicitly overwritten.", "example": "vctzw vd, vb"}
{"mnemonic": "vctzd", "architecture": "PowerISA", "full_name": "Vector Count Trailing Zeros Doubleword", "summary": "Counts the number of consecutive zero bits starting at bit 63 of each doubleword element in VSR[VRB+32] and places the result into VSR[VRT+32].", "syntax": "vctzd vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1986", "hex_opcode": "0x101F0602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1986", "clean": "1986"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vctzd, for each integer value i from 0 to 1, a count of the number of consecutive zero bits starting at bit 63 of doubleword element i of VSR[VRB+32] is placed into doubleword element i of VSR[VRT+32]. This number ranges from 0 to 64, inclusive.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    n ←0\n    do while n < 64\n        if VSR[VRB+32].dword[i].bit[63-n] = 0b1 then\n            leave\n        n ←n + 1\n    end\n    VSR[VRT+32].dword[i] ←CHOP64(EXTZ(n))\nend", "page_found": "Page 475 - 476", "special_registers": "MSR", "programming_notes": "The vctzd instruction counts trailing zeros in each doubleword of the input vector. Ensure that the Vector Facility is enabled by checking and setting the MSR.VEC bit. This instruction operates on 64-bit elements, so input vectors must be aligned accordingly. The result is a count from 0 to 64 for each element, indicating the number of trailing zeros.", "example": "vctzd vd, vb"}
{"mnemonic": "vpopcntb", "architecture": "PowerISA", "full_name": "Vector Population Count Byte", "summary": "Counts the number of bits set to 1 in each byte of a vector register.", "syntax": "vpopcntb vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1795", "hex_opcode": "0x10000703", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1795", "clean": "1795"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vpopcntb, the number of bits set to 1 in each byte element of VSR[VRB+32] is counted and placed into the corresponding byte element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    n ←0\n    do j = 0 to 7\n        n ←n + VSR[VRB+32].byte[i].bit[j]\n    end\n    VSR[VRT+32].byte[i] ←n\nend", "page_found": "Page 480 - 481", "special_registers": "MSR", "programming_notes": "This instruction is used to count the number of set bits (1s) in each byte of a vector register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. The operation processes 16 bytes, and the result is stored in another vector register. This instruction is available at user privilege level.", "example": "vpopcntb vd, vb"}
{"mnemonic": "vpopcnth", "architecture": "PowerISA", "full_name": "Vector Population Count Halfword", "summary": "Counts set bits in each halfword.", "syntax": "vpopcnth vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1859", "hex_opcode": "0x10000743", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1859", "clean": "1859"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Counts the number of set bits (population count) in each of the 8 halfword elements in vB and stores the result in the corresponding halfword of vD. Each result is an unsigned integer in the range 0-16. No status flags are affected. This instruction is part of the VMX (AltiVec) extension.", "pseudocode": "for i in 0 to 7 do\n  count ← 0\n  halfword ← vB[i*16 : i*16+15]\n  for j in 0 to 15 do\n    if halfword[j] = 1 then\n      count ← count + 1\n  vD[i*16 : i*16+15] ← count", "page_found": "Page 481", "special_registers": "MSR", "programming_notes": "This instruction is useful for counting the number of set bits in each halfword of a vector, which can be helpful in various bit manipulation tasks. Ensure that the Vector Facility (VEC) is enabled in the Machine State Register (MSR) before using this instruction; otherwise, it will raise an exception. The operation is performed on 8 halfwords per vector register, and there are no specific alignment requirements for the data being processed.", "example": "vpopcnth vd, vb"}
{"mnemonic": "vpopcntw", "architecture": "PowerISA", "full_name": "Vector Population Count Word", "summary": "Counts the number of bits set to 1 in each word element of a vector register.", "syntax": "vpopcntw vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1923", "hex_opcode": "0x10000783", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1923", "clean": "1923"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vpopcntw, the number of bits set to 1 in each word element of VSR[VRB+32] is counted and placed into the corresponding word element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    n ←0\n    do j = 0 to 31\n        n ←n + VSR[VRB+32].word[i].bit[j]\n    end\n    VSR[VRT+32].word[i] ←n\nend", "page_found": "Page 481 - 482", "special_registers": "MSR", "programming_notes": "This instruction counts the number of set bits (1s) in each 32-bit word of the source vector and stores the result in the destination vector. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates on 128-bit vectors, processing four 32-bit words per operation.", "example": "vpopcntw vd, vb"}
{"mnemonic": "vpopcntd", "architecture": "PowerISA", "full_name": "Vector Population Count Doubleword", "summary": "Counts set bits in each doubleword.", "syntax": "vpopcntd vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1987", "hex_opcode": "0x100007C3", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1987", "clean": "1987"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Counts the number of set bits (population count) in each of the 2 doubleword elements in vB and stores the result in the corresponding doubleword of vD. Each result is an unsigned integer in the range 0-64. No status flags are affected. This instruction is part of the VMX (AltiVec) extension.", "pseudocode": "for i in 0 to 1 do\n  count ← 0\n  doubleword ← vB[i*64 : i*64+63]\n  for j in 0 to 63 do\n    if doubleword[j] = 1 then\n      count ← count + 1\n  vD[i*64 : i*64+63] ← count", "page_found": "Page 482", "special_registers": "MSR", "programming_notes": "The vpopcntd instruction is useful for counting the number of set bits in each 64-bit element of a vector. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. This instruction operates on two doublewords per vector register, and results are stored in the corresponding positions of the destination vector.", "example": "vpopcntd vd, vb"}
{"mnemonic": "vextractub", "architecture": "PowerISA", "full_name": "Vector Extract Unsigned Byte to VSR using Immediate-specified Index VX-form", "summary": "Extracts an unsigned byte from a vector register and places it into the upper byte of another vector register.", "syntax": "vextractub RA, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | RA | UIM | vB | 525", "hex_opcode": "0x1000020D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RA", "clean": "RA"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "525", "clean": "525"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target GPR"}, {"name": "vB", "desc": "Source Vector"}, {"name": "UIM", "desc": "Index"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The contents of byte element UIM of VSR[VRB+32] are placed into bits 56:63 of VSR[VRT+32]. The contents of the remaining byte elements of VSR[VRT+32] are set to 0.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsrc ←VSR[VRB+32].byte[UIM]\nVSR[VRT+32].dword[0] ←EXTZ64(src)\nVSR[VRT+32].dword[1] ←0x0000_0000_0000_0000", "page_found": "Page 328 - 330", "programming_notes": "If the value of UIM is greater than 14, the results are undefined.", "special_registers": "MSR", "example": "vextractub r4, vb, uim"}
{"mnemonic": "vextractuh", "architecture": "PowerISA", "full_name": "Vector Extract Unsigned Halfword", "summary": "Extracts a halfword from a vector into a GPR.", "syntax": "vextractuh RA, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | RA | UIM | vB | 589", "hex_opcode": "0x1000024D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RA", "clean": "RA"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "589", "clean": "589"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target GPR"}, {"name": "vB", "desc": "Source Vector"}, {"name": "UIM", "desc": "Index"}], "extension": "VMX (AltiVec)", "description": "Extracts an unsigned halfword element from vB at the position specified by UIM and stores the zero-extended 16-bit value into general-purpose register RA. The halfword index (0-7) is provided by the 3-bit immediate UIM. No status flags are affected. This instruction is part of the VMX (AltiVec) extension.", "page_found": "Page 330", "programming_notes": "The vextractuh instruction extracts an unsigned halfword from a vector register at a specified index. Ensure the index is within bounds to avoid undefined behavior. This instruction operates in user privilege level and does not generate exceptions for valid indices.", "pseudocode": "index ← UIM[1:3]\nRA ← (0x0000) || vB[index*16 : index*16+15]", "example": "vextractuh r4, vb, uim"}
{"mnemonic": "vextractuw", "architecture": "PowerISA", "full_name": "Vector Extract Unsigned Word to VSR using Immediate-specified Index VX-form", "summary": "Extracts an unsigned word from a vector register and places it into another vector register using an immediate-specified index.", "syntax": "vextractuw RA, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | RA | UIM | vB | 653", "hex_opcode": "0x1000028D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RA", "clean": "RA"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "653", "clean": "653"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target GPR"}, {"name": "vB", "desc": "Source Vector"}, {"name": "UIM", "desc": "Index"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VX", "desc": "Target Vector Register"}, {"name": "VS", "desc": "Source Vector Register"}, {"name": "UI", "desc": "Immediate-specified index"}], "extension": "VMX (AltiVec)", "description": "The contents of byte elements UIM:UIM+3 of VSR[VRB+32] are placed into word element 1 of VSR[VRT+32]. The contents of the remaining word elements of VSR[VRT+32] are set to 0.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsrc ←VSR[VRB+32].byte[UIM:UIM+3]\nVSR[VRT+32].dword[0] ←EXTZ64(src)\nVSR[VRT+32].dword[1] ←0x0000_0000_0000_0000", "page_found": "Page 330 - 332", "special_registers": "MSR", "programming_notes": "This instruction is used to extract a 4-byte unsigned word from a vector register and place it into another vector register. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. The source byte elements must be correctly specified by UIM, and the destination register will have its first dword set to the extracted value while the second dword is zeroed out.", "example": "vextractuw r4, vb, uim"}
{"mnemonic": "vextractd", "architecture": "PowerISA", "full_name": "Vector Extract Doubleword", "summary": "Extracts a doubleword from a vector into a GPR.", "syntax": "vextractd RA, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | RA | UIM | vB | 717", "hex_opcode": "0x100002CD", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RA", "clean": "RA"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "717", "clean": "717"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target GPR"}, {"name": "vB", "desc": "Source Vector"}, {"name": "UIM", "desc": "Index"}], "extension": "VMX (AltiVec)", "description": "Extracts an unsigned doubleword element from vB at the position specified by UIM and stores the 64-bit value into general-purpose register RA. The doubleword index (0-1) is provided by the 1-bit immediate UIM. No status flags are affected. This instruction is part of the VMX (AltiVec) extension.", "pseudocode": "index ← UIM[0:1]\nRA ← vB[index*64 : index*64+63]", "page_found": "Page 331", "special_registers": "MSR", "programming_notes": "The vextractd instruction is used to extract an 8-byte doubleword from a source vector register into the destination vector register, starting at a specified byte index. Ensure that the MSR.VEC bit is set to enable vector operations; otherwise, a Vector_Unavailable exception will be raised. Be cautious with the UIM index; if it exceeds 8, the results are undefined. The destination register's second doubleword is zeroed out.", "example": "vextractd r4, vb, uim"}
{"mnemonic": "vinsertb", "architecture": "PowerISA", "full_name": "Vector Insert Byte from VSR using Immediate-specified Index", "summary": "Inserts a byte element from one vector register into another at an immediate-specified index.", "syntax": "vinsertb vD, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | UIM | vB | 781", "hex_opcode": "0x1000030D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "781", "clean": "781"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target Vector"}, {"name": "vB", "desc": "Source GPR"}, {"name": "UIM", "desc": "Index"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VX", "desc": "Target Vector Register"}, {"name": "VS", "desc": "Source Vector Register"}, {"name": "VI", "desc": "Immediate Value"}, {"name": "IMM8", "desc": "8-bit Immediate Index"}], "extension": "VMX (AltiVec)", "description": "The contents of byte element 7 of VSR[VRB+32] are placed into byte element UIM of VSR[VRT+32]. The remaining byte elements of VSR[VRT+32] are not modified.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nVRT[32].byte[UIM] ← VRB[32].byte[7]", "page_found": "Page 338 - 339", "special_registers": "MSR", "programming_notes": "This instruction is used to insert a byte from one vector register into another at a specified index. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector Unavailable exception will be raised. The destination and source registers must be in the range of 32-63. Be cautious with alignment as it affects performance and correctness.", "example": "vinsertb vd, vb, uim"}
{"mnemonic": "vinserth", "architecture": "PowerISA", "full_name": "Vector Insert Halfword", "summary": "Inserts a halfword from a GPR into a vector.", "syntax": "vinserth vD, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | UIM | vB | 845", "hex_opcode": "0x1000034D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "845", "clean": "845"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target Vector"}, {"name": "vB", "desc": "Source GPR"}, {"name": "UIM", "desc": "Index"}], "extension": "VMX (AltiVec)", "description": "Inserts the low-order 16 bits of general-purpose register vB into vD at the halfword position specified by UIM, leaving other halfword elements of vD unchanged. The halfword index (0-7) is provided by the 3-bit immediate UIM. No status flags are affected. This instruction is part of the VMX (AltiVec) extension.", "pseudocode": "index ← UIM[1:3]\nvD[index*16 : index*16+15] ← vB[48:63]", "page_found": "Page 339", "special_registers": "MSR", "programming_notes": "The vinserth instruction is used to insert a halfword from one vector register into another at a specified index. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. The destination vector's remaining byte elements remain unchanged after the insertion.", "example": "vinserth vd, vb, uim"}
{"mnemonic": "vinsertw", "architecture": "PowerISA", "full_name": "Vector Insert Word from VSR using Immediate-specified Index", "summary": "Inserts a word element from one vector register into another vector register at an immediate-specified index.", "syntax": "vinsertw vD, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | UIM | vB | 909", "hex_opcode": "0x1000038D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "909", "clean": "909"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target Vector"}, {"name": "vB", "desc": "Source GPR"}, {"name": "UIM", "desc": "Index"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The contents of word element 1 of VSR[VRB+32] are placed into byte elements UIM:UIM+3 of VSR[VRT+32]. The contents of the remaining byte elements of VSR[VRT+32] are not modified. If the value of UIM is greater than 12, the results are undefined.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nVSR[VRT+32].byte[UIM:UIM+3] ← VSR[VRB+32].word[1]", "page_found": "Page 339 - 340", "special_registers": "MSR", "programming_notes": "This instruction is used to insert a word from one vector register into another, with the destination index specified by an immediate value. Ensure that the immediate index (UIM) does not exceed 12 to avoid undefined behavior. This operation requires the Vector Facility to be enabled in the Machine State Register (MSR).", "example": "vinsertw vd, vb, uim"}
{"mnemonic": "vinsertd", "architecture": "PowerISA", "full_name": "Vector Insert Doubleword", "summary": "Inserts a doubleword from a GPR into a vector.", "syntax": "vinsertd vD, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | UIM | vB | 973", "hex_opcode": "0x100003CD", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "973", "clean": "973"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target Vector"}, {"name": "vB", "desc": "Source GPR"}, {"name": "UIM", "desc": "Index"}], "extension": "VMX (AltiVec)", "description": "Inserts the contents of general-purpose register vB into vD at the doubleword position specified by UIM, leaving the other doubleword element of vD unchanged. The doubleword index (0-1) is provided by the 1-bit immediate UIM. No status flags are affected. This instruction is part of the VMX (AltiVec) extension.", "pseudocode": "index ← UIM[0:1]\nvD[index*64 : index*64+63] ← vB[0:63]", "page_found": "Page 340", "special_registers": "MSR", "programming_notes": "The vinsertd instruction is used to insert a doubleword from one vector register into another, with specific byte alignment. Ensure that the UIM value does not exceed 8 to avoid undefined behavior. This instruction requires the VEC bit in the MSR (Machine State Register) to be set; otherwise, it will raise an exception.", "example": "vinsertd vd, vb, uim"}
{"mnemonic": "vaddcuw", "architecture": "PowerISA", "full_name": "Vector Add Carryout Unsigned Word", "summary": "Adds the contents of two vector registers and writes the carry-out to another vector register.", "syntax": "vaddcuw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 384", "hex_opcode": "0x10000180", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "384", "clean": "384"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vaddcuw, the sum of the unsigned integer values in word elements of VSR[VRA+32] and VSR[VRB+32] is placed into word elements of VSR[VRT+32]. The carry out of the 32-bit sum is zero-extended to 32 bits and placed into word element i of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ←EXTZ(VSR[VRA+32].word[i])\n    src2 ←EXTZ(VSR[VRB+32].word[i])\n    VSR[VRT+32].word[i] ←CHOP32((src1 + src2) >> 32)\nend", "page_found": "Page 348 - 349", "special_registers": "MSR", "programming_notes": "This instruction is used for adding unsigned integers in vector registers, with the carry out being zero-extended and stored alongside the result. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation processes each word element independently, so alignment of data within the vectors is not strictly required.", "example": "vaddcuw vd, va, vb"}
{"mnemonic": "vaddcuq", "architecture": "PowerISA", "full_name": "Vector Add Carryout Unsigned Quadword", "summary": "Adds the contents of two vector registers and writes the carry-out to another register.", "syntax": "vaddcuq vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1280", "hex_opcode": "0x10000140", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1280", "clean": "1280"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The instruction adds the unsigned integer values in VSR[VRA+32] and VSR[VRB+32], placing the result in VSR[VRT+32]. The carry-out is also written into VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsrc1 ←EXTZ(VSR[VRA+32])\nsrc2 ←EXTZ(VSR[VRB+32])\nsum  ←EXTZ(src1) + EXTZ(src2)\nVSR[VRT+32] ←EXTZ128((src1 + src2) >> 128)", "programming_notes": "The Vector Add Unsigned Quadword instructions support efficient wide-integer addition.", "page_found": "Page 355 - 356", "special_registers": "MSR", "example": "vaddcuq vd, va, vb"}
{"mnemonic": "vsubcuw", "architecture": "PowerISA", "full_name": "Vector Subtract Carryout Unsigned Word", "summary": "Subtracts the unsigned integer values in word elements of two vector registers and writes the result to another vector register, along with the carry-out.", "syntax": "vsubcuw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1408", "hex_opcode": "0x10000580", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1408", "clean": "1408"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsubcuw, the unsigned integer value in word element i of VSR[VRB+32] is subtracted from the unsigned integer value in word element i of VSR[VRA+32]. The complement of the borrow out of bit 0 of the 32-bit difference is zero-extended to 32 bits and placed into word element i of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ←EXTZ(VSR[VRA+32].word[i])\n    src2 ←EXTZ(¬VSR[VRB+32].word[i])\n    VSR[VRT+32].word[i] ←EXTZ32((src1+src2+1) >> 32)\nend", "page_found": "Page 356 - 357", "special_registers": "MSR", "programming_notes": "The vsubcuw instruction performs an unsigned subtraction with carryout on each word element of the input vectors. It is useful for operations requiring precise control over overflow handling. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation does not require any specific alignment, but inputs must be correctly aligned to 128-bit boundaries as per standard vector register usage.", "example": "vsubcuw vd, va, vb"}
{"mnemonic": "vsubcuq", "architecture": "PowerISA", "full_name": "Vector Subtract Carryout Unsigned Quadword", "summary": "Subtracts the contents of two vector registers, adds one, and writes the carry-out to another register.", "syntax": "vsubcuq vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "0 | VRT | VRA | VRB | 1344", "hex_opcode": "0x10000540", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1280", "clean": "1280"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsubcuq, the difference between the contents of VSR[VRA+32] and the one's complement of VSR[VRB+32], plus one, is placed into VSR[VRT+32]. The carry out is also written to VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsrc1 ←EXTZ(VSR[VRA+32])\nsrc2 ←EXTZ(¬VSR[VRB+32])\nVSR[VRT+32] ←CHOP128((src1 + src2 + 1) >> 128)", "programming_notes": "The Vector Subtract Unsigned Quadword instructions support efficient wide-integer subtraction.", "page_found": "Page 363 - 364", "special_registers": "MSR", "example": "vsubcuq vd, va, vb"}
{"mnemonic": "vprtybw", "architecture": "PowerISA", "full_name": "Vector Parity Byte Word", "summary": "Calculates the parity of each byte in a vector word and stores the result.", "syntax": "vprtybw vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | 8 | VRB | 1538", "hex_opcode": "0x10080602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1540", "clean": "1540"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vprtybw, the parity of each byte in the source vector register VRB is calculated and stored in the corresponding position in the target vector register VRT.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    s ←0\n    do j = 0 to 3\n        s ←s ⊕VSR[VRB+32].word[i].byte[j].bit[7]\n    end\n    VSR[VRT+32].word[i] ←CHOP32(EXTZ(s))\nend", "page_found": "Page 482 - 483", "special_registers": "MSR", "programming_notes": "The vprtybw instruction calculates the parity of each byte in the source vector register and stores the result in the target vector register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates on 128-bit vectors, processing four 32-bit words per iteration. Be cautious with alignment; both source and target registers must be properly aligned to avoid exceptions.", "example": "vprtybw vd, vb"}
{"mnemonic": "vprtybd", "architecture": "PowerISA", "full_name": "Vector Parity Byte Doubleword", "summary": "Computes parity of bytes within doublewords.", "syntax": "vprtybd vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1604", "hex_opcode": "0x10090602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1604", "clean": "1604"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Computes the parity (XOR of all bits) of each byte within the 2 doubleword elements of vB and stores a single parity bit (0 or 1) into the corresponding byte position of vD, with each doubleword's 8 bytes reduced to their individual parities. No status flags are affected. This instruction is part of the VMX (AltiVec) extension.", "pseudocode": "for i in 0 to 1 do\n  for j in 0 to 7 do\n    byte_index ← i*8 + j\n    byte_val ← vB[byte_index*8 : byte_index*8+7]\n    parity ← XOR(byte_val[0], byte_val[1], ..., byte_val[7])\n    vD[byte_index*8 : byte_index*8+7] ← (0x00) || parity", "page_found": "Page 483", "special_registers": "MSR", "programming_notes": "This instruction is useful for calculating the parity of the least significant bit in each byte of a doubleword element. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The operation is performed on 64-bit elements, and the result is stored in the corresponding output vector register. There are no specific alignment requirements for the input data.", "example": "vprtybd vd, vb"}
{"mnemonic": "vprtybq", "architecture": "PowerISA", "full_name": "Vector Parity Byte Quadword", "summary": "Calculates the parity of each byte in a vector register and stores the result in another vector register.", "syntax": "vprtybq vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1668", "hex_opcode": "0x100A0602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1668", "clean": "1668"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Computes the parity bit for each byte in the 128-bit source vector and stores the result in the destination vector. The parity of each byte is XORed across all 8 bits, producing a single bit (0 or 1) for each byte. This is a VMX/AltiVec extension instruction and does not affect condition registers or status fields.", "pseudocode": "for i in 0 to 15 do\n  parity_bit ← 0\n  for j in 0 to 7 do\n    parity_bit ← parity_bit XOR vB[i*8 + j]\n  vD[i*8:i*8+7] ← (0b0000000 || parity_bit)\nend", "page_found": "Page 483 - 484", "special_registers": "MSR", "programming_notes": "The vprtybq instruction calculates the parity of each byte in the source vector register VRB and stores the result in the target vector register VRT. Ensure that the Vector Facility is enabled by checking and setting the MSR.VEC bit. The instruction processes 16 bytes from VRB, and the result is a single bit indicating the parity for each byte, which is then replicated across all 128 bits of VRT.", "example": "vprtybq vd, vb"}
{"mnemonic": "vbcdadd", "architecture": "PowerISA", "full_name": "Vector BCD Add", "summary": "Adds two BCD (Binary Coded Decimal) vectors.", "syntax": "vbcdadd vD, vA, vB, PS", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1", "hex_opcode": "0x10000001", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "PS", "desc": "Sign"}], "extension": "Vector Crypto", "description": "Adds two Binary Coded Decimal (BCD) vectors element-wise and stores the result in the destination vector. The PS field specifies the preferred sign convention for the result. This instruction requires the Vector Crypto extension and does not directly affect condition registers.", "pseudocode": "for i in 0 to 15 do\n  BCD_digit_A ← vA[i*4:i*4+3]\n  BCD_digit_B ← vB[i*4:i*4+3]\n  sum ← BCD_digit_A + BCD_digit_B\n  if sum > 9 then\n    sum ← sum + 6\n  vD[i*4:i*4+3] ← sum[3:0]\nend\nif PS then\n  apply_sign_to_vD()\nend", "example": "vbcdadd vd, va, vb, 0"}
{"mnemonic": "dtstsfi", "architecture": "PowerISA", "full_name": "Decimal Test Significance Immediate", "summary": "Tests the significance of a decimal floating-point value in FPR[FRB] against an immediate value UIM.", "syntax": "dtstsfi BF, U, FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | BF | / | U | FRB | 675", "hex_opcode": "0xEC000546", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "U", "clean": "U"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "675", "clean": "675"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "U", "desc": "Imm"}, {"name": "FRB", "desc": "Source"}, {"name": "UIM", "desc": "Immediate Reference Significance"}], "extension": "Decimal Floating-Point", "description": "The instruction compares the number of significant digits (NSDb) of the DFP value in FPR[FRB] with the reference significance specified by UIM. The result is placed into CR field BF and FPCC.", "pseudocode": "NSDb <- number of significant digits in FPR[FRB]\nif UIM != 0 and UIM < NSDb then\n    CR[BF] <- 0b0010\n    FPCC <- 0b0010\nelse if UIM != 0 and UIM > NSDb or UIM = 0 then\n    CR[BF] <- 0b0100\n    FPCC <- 0b0100\nelse if UIM != 0 and UIM = NSDb then\n    CR[BF] <- 0b1000\n    FPCC <- 0b1000\nelse\n    CR[BF] <- 0b0001\n    FPCC <- 0b0001", "special_registers": "CR, FPSCR", "page_found": "Page 248 - 250", "programming_notes": "The dtstsfi instruction is used to compare the number of significant digits in a DFP value with a specified reference significance. Ensure that the UIM (Upper Immediate) is correctly set according to the desired comparison. This instruction operates at the problem state and may raise exceptions if the FPR[FRB] contains an invalid DFP value. Performance can be optimized by minimizing the use of this instruction in critical loops due to its dependency on floating-point operations.", "example": "dtstsfi cr0, 0, f3"}
{"mnemonic": "dtstsfiq", "architecture": "PowerISA", "full_name": "Decimal Test Significance Immediate Quad", "summary": "Tests DFP Quad significance.", "syntax": "dtstsfiq BF, U, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | / | U | FRB | 675", "hex_opcode": "0xFC000546", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "U", "clean": "U"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "675", "clean": "675"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "U", "desc": "Imm"}, {"name": "FRB", "desc": "Source"}], "extension": "Decimal Floating-Point", "description": "Tests the significance of a Decimal Floating-Point Quad-precision operand based on the immediate value U and updates the specified condition register field. The result indicates whether the value is zero, subnormal, normal, or special (infinity/NaN). Requires the Decimal Floating-Point facility and updates the target CR field.", "pseudocode": "if isSpecial(FRB[0:127]) then\n  CR[BF*4:BF*4+3] ← test_special(FRB[0:127], U)\nelif isZero(FRB[0:127]) then\n  CR[BF*4:BF*4+3] ← 0b0100\nelif isSubnormal(FRB[0:127]) then\n  CR[BF*4:BF*4+3] ← 0b0010\nelse\n  CR[BF*4:BF*4+3] ← 0b0001\nend", "page_found": "Page 249", "special_registers": "FPSCR", "programming_notes": "The dtstsfiq instruction is used to compare the number of significant digits in a DFP value with an immediate reference significance. Ensure that the UIM (immediate reference significance) is correctly set according to your comparison needs. The result is stored in both the condition register field BF and the FPSCR's FPCC field, allowing for easy conditional branching based on the comparison outcome.", "example": "dtstsfiq cr0, 0, f3"}
{"mnemonic": "cmpeqb", "architecture": "PowerISA", "full_name": "Compare Equal Byte", "summary": "Compares the contents of bits 56:63 of register RA with each byte in register RB and sets the condition register field BF.", "syntax": "cmpeqb RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 224 | /", "hex_opcode": "0x7C0001C0", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "224", "clean": "224"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target GPR"}, {"name": "RS", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}, {"name": "BF", "desc": "Condition Register Field"}], "extension": "Base", "description": "Compares the least significant byte of register RS (bits 56:63) against each of the eight bytes in register RB, setting a byte in register RA to 0xFF where a match occurs and 0x00 where no match occurs. The instruction does not update condition registers directly but produces a byte-mask result in RA.", "pseudocode": "search_byte ← RS[56:63]\nfor i in 0 to 7 do\n  if RB[i*8:i*8+7] = search_byte then\n    RA[i*8:i*8+7] ← 0xFF\n  else\n    RA[i*8:i*8+7] ← 0x00\n  end\nend", "special_registers": "CR", "programming_notes": "cmpeqb is useful for implementing character typing functions such as isspace() that are implemented by comparing the character to 1 or more values. A function such as isspace() can be implemented by loading the 6 byte codes corresponding to characters considered as whitespace (HT, LF, VT, FF, CR, and SP) and using the cmpeqb to compare the subject character to those 6 values to determine if any match occurs.", "page_found": "Page 128 - 130", "example": "cmpeqb r4, r3, r5"}
{"mnemonic": "cmpb", "architecture": "PowerISA", "full_name": "Compare Bytes", "summary": "Compares bytes in two GPRs, result is byte mask.", "syntax": "cmpb RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 508 | /", "hex_opcode": "0x7C0003F8", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "508", "clean": "508"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target GPR"}, {"name": "RS", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Base", "description": "Compares each byte of register RS with the corresponding byte in register RB and stores a byte-mask result in register RA. For each byte, 0xFF is written to RA if the bytes are equal, and 0x00 is written if they differ. No condition register fields are updated.", "pseudocode": "for i in 0 to 7 do\n  if RS[i*8:i*8+7] = RB[i*8:i*8+7] then\n    RA[i*8:i*8+7] ← 0xFF\n  else\n    RA[i*8:i*8+7] ← 0x00\n  end\nend", "programming_notes": "The cmpb instruction is useful for performing byte-wise comparisons between two registers. Ensure that the input registers (RS and RB) are properly aligned to avoid unexpected results. The output register (RA) will contain 0xFF in bytes where the comparison was equal, and 0x00 elsewhere. This instruction operates at user privilege level.", "example": "cmpb r4, r3, r5"}
{"mnemonic": "prtyw", "architecture": "PowerISA", "full_name": "Parity Word", "summary": "Calculates parity of a word (Scalar).", "syntax": "prtyw RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | / | 154 | /", "hex_opcode": "0x7C000134", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "/", "clean": "/"}, {"raw": "154", "clean": "154"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}], "extension": "Base", "description": "Computes the parity of the entire 32-bit word in register RS by XORing all 32 bits and stores the result (a single bit) in the low bit of register RA. All other bits of RA are cleared to zero. No condition registers or status fields are affected.", "pseudocode": "parity_bit ← 0\nfor i in 0 to 31 do\n  parity_bit ← parity_bit XOR RS[i]\nend\nRA ← (0 || parity_bit)", "programming_notes": "The prtyw instruction is useful for calculating the parity of each byte in a doubleword, which can be helpful in error detection. Ensure that the input register (RS) contains valid data; otherwise, the output may not reflect meaningful parity information. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "prtyw r4, r3"}
{"mnemonic": "prtyd", "architecture": "PowerISA", "full_name": "Parity Doubleword", "summary": "Calculates parity of a doubleword (Scalar).", "syntax": "prtyd RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | / | 186 | /", "hex_opcode": "0x7C000174", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "/", "clean": "/"}, {"raw": "186", "clean": "186"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "extension": "Base", "special_registers": "CR0, XER", "page_found": "Page 1379 - 1380", "description": "Computes the parity of the entire 64-bit doubleword in register RS by XORing all 64 bits and stores the result (a single bit) in the low bit of register RA. All other bits of RA are cleared to zero. No condition registers or status fields are affected.", "pseudocode": "parity_bit ← 0\nfor i in 0 to 63 do\n  parity_bit ← parity_bit XOR RS[i]\nend\nRA ← (0b0000000000000000000000000000000000000000000000000000000000000 || parity_bit)", "programming_notes": "The prtyd instruction is useful for parity checking on doubleword values. It sets the least significant bit of RA based on the parity of each byte in RS, which can be helpful for error detection. Ensure that RS and RA are properly aligned to avoid unexpected behavior. This instruction operates at user privilege level.", "example": "prtyd r4, r3"}
{"mnemonic": "modsw", "architecture": "PowerISA", "full_name": "Modulo Signed Word", "summary": "Calculates remainder of signed word division.", "syntax": "modsw RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 779 | /", "hex_opcode": "0x7C000616", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "779", "clean": "779"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Dividend"}, {"name": "RB", "desc": "Divisor"}], "extension": "Base", "description": "The 32-bit dividend is (RA)32:63. The 32-bit divisor is (RB)32:63. The 32-bit remainder of the dividend divided by the divisor is placed into RT32:63. The contents of RT0:31 are undefined.", "pseudocode": "dividend = (RA)32:63\n divisor = (RB)32:63\n if dividend >= 0 then\n    quotient = floor(dividend / divisor)\n else\n    quotient = ceil(dividend / divisor)\n RT32:63 <- dividend - (quotient * divisor)\n RT0:31 <- undefined", "programming_notes": "If an attempt is made to perform any of the divisions 0x8000_0000 % -1 or <anything> % 0, then the contents of register RT are undefined.", "page_found": "Page 118 - 120", "example": "modsw r3, r4, r5"}
{"mnemonic": "moduw", "architecture": "PowerISA", "full_name": "Modulo Unsigned Word", "summary": "Calculates remainder of unsigned word division.", "syntax": "moduw RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 267 | /", "hex_opcode": "0x7C000216", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "267", "clean": "267"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Dividend"}, {"name": "RB", "desc": "Divisor"}], "extension": "Base", "description": "Calculates the unsigned remainder (modulo) of a 32-bit word division, storing the result in RT. The dividend is in RA and the divisor is in RB. No status flags are affected; division by zero is not trapped and produces undefined results.", "pseudocode": "RT ← (RA mod RB)", "page_found": "Page 119", "programming_notes": "The moduw instruction is used for performing modulo operations on unsigned integers. Ensure the divisor in RB32:63 is not zero to avoid division by zero exceptions. The result is placed in RT32:63, while RT0:31 remains undefined and should not be relied upon.", "example": "moduw r3, r4, r5"}
{"mnemonic": "modsd", "architecture": "PowerISA", "full_name": "Modulo Signed Doubleword", "summary": "Calculates remainder of signed doubleword division.", "syntax": "modsd RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 777 | /", "hex_opcode": "0x7C000612", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "777", "clean": "777"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Dividend"}, {"name": "RB", "desc": "Divisor"}], "extension": "Base", "description": "The 64-bit dividend is (RA). The 64-bit divisor is (RB). The 64-bit remainder of the dividend divided by the divisor is placed into register RT. The quotient is not supplied as a result. Both operands and the remainder are interpreted as signed integers. The remainder is the unique signed integer that satisfies remainder = dividend - (quotient × divisor) where 0 ≤remainder < |divisor| if the dividend is nonnegative, and -|divisor| < remainder ≤0 if the dividend is negative.", "pseudocode": "dividend ← (RA)\ndivisor ← (RB)\nRT ← dividend % divisor", "programming_notes": "If an attempt is made to perform any of the divisions <anything> % 0 or 0x8000_0000_0000_0000 % -1, then the contents of register RT are undefined.", "page_found": "Page 124 - 126", "example": "modsd r3, r4, r5"}
{"mnemonic": "modud", "architecture": "PowerISA", "full_name": "Modulo Unsigned Doubleword", "summary": "Calculates remainder of unsigned doubleword division.", "syntax": "modud RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 265 | /", "hex_opcode": "0x7C000212", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "265", "clean": "265"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Dividend"}, {"name": "RB", "desc": "Divisor"}], "extension": "Base", "description": "Calculates the unsigned remainder (modulo) of a 64-bit doubleword division, storing the result in RT. The dividend is in RA and the divisor is in RB. No status flags are affected; division by zero is not trapped and produces undefined results.", "pseudocode": "RT ← (RA mod RB)", "page_found": "Page 125", "programming_notes": "The modud instruction is used for performing an unsigned doubleword modulo operation. Ensure that the divisor in register RB is not zero to avoid undefined behavior. The result is placed in register RT, and this instruction operates at user privilege level.", "example": "modud r3, r4, r5"}
{"mnemonic": "ftdiv", "architecture": "PowerISA", "full_name": "Float Test for Divide", "summary": "Tests the double-precision floating-point operand in register FRB and sets flags based on certain conditions.", "syntax": "ftdiv BF, FRA, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | / | FRA | FRB | 128 | /", "hex_opcode": "0xFC000100", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "128", "clean": "128"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "FRA", "desc": "A"}, {"name": "FRB", "desc": "B"}], "extension": "Floating-Point", "description": "This instruction tests the double-precision floating-point operand in register FRB and sets flags based on certain conditions related to its value and exponent. The CR field BF is updated accordingly.", "pseudocode": "Let e_a be the unbiased exponent of the double-precision floating-point operand in register FRA.\nLet e_b be the unbiased exponent of the double-precision floating-point operand in register FRB.\n\nfe_flag is set to 1 if any of the following conditions occur:\n• The double-precision floating-point operand in register FRA is a NaN or an Infinity.\n• The double-precision floating-point operand in register FRB is a Zero, a NaN, or an Infinity.\n• e_b is less than or equal to -1022.\n• e_b is greater than or equal to 1021.\n• The double-precision floating-point operand in register FRA is not a zero and the difference, e_a - e_b, is greater than or equal to 1023.\n• The double-precision floating-point operand in register FRA is not a zero and the difference, e_a - e_b, is less than or equal to -1021.\n• The double-precision floating-point operand in register FRA is not a zero and e_a is less than or equal to -970.\n\nOtherwise fe_flag is set to 0.\n\ngf_flag is set to 1 if the following condition occurs:\n• The double-precision floating-point operand in register FRB is a Zero, an Infinity, or a denormalized value.\n• The double-precision floating-point operand in register FRA is an Infinity.\n\nOtherwise fg_flag is set to 0.\n\nIf the implementation guarantees a relative error of fre[s][.] of less than or equal to 2^-14, then fl_flag is set to 1. Otherwise fl_flag is set to 0.\n\nCR field BF is set to the value fl_flag || fg_flag || fe_flag || 0b0.", "special_registers": "CR, FPSCR", "programming_notes": "ftdiv and ftsqrt are provided to accelerate software emulation of divide and square root operations, by performing the requisite special case checking. Software needs only a single branch, on FE=1 (in CR[BF]), to a special case handler. FG and FL may provide further acceleration opportunities.", "page_found": "Page 202 - 204", "example": "ftdiv cr0, f2, f3"}
{"mnemonic": "ftsqrt", "architecture": "PowerISA", "full_name": "Float Test for Square Root", "summary": "Tests for conditions that would cause a sqrt exception.", "syntax": "ftsqrt BF, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | / | 0 | FRB | 160 | /", "hex_opcode": "0xFC000140", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "160", "clean": "160"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "Tests the floating-point value in FRB to determine if it would cause an exception when used as the operand to a square root instruction, setting the condition bits in CR field BF accordingly. The result encodes whether the operand is negative, zero, positive, or a special value (NaN, infinity). No floating-point result is produced and FPSCR is not modified.", "pseudocode": "if FRB < 0.0 then\n  CR[BF] ← 0b1000\nelse if FRB = 0.0 then\n  CR[BF] ← 0b0100\nelse if FRB > 0.0 then\n  CR[BF] ← 0b0010\nelse\n  CR[BF] ← 0b0001", "page_found": "Page 203", "special_registers": "FPSCR", "programming_notes": "The ftsqrt instruction is useful for checking special conditions of a floating-point number before performing square root operations. It sets the FE flag if the operand is zero, NaN, infinity, negative, or has an exponent less than or equal to -970. The FG flag is set if the operand is zero, infinity, or denormalized. Ensure the operand is properly aligned and in double-precision format to avoid unexpected results.", "example": "ftsqrt cr0, f3"}
{"mnemonic": "fre", "architecture": "PowerISA", "full_name": "Floating Reciprocal Estimate", "summary": "Estimates the reciprocal of a floating-point operand.", "syntax": "fre FRT,FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | 0 | 0 | FRB | 24 | /", "hex_opcode": "0xFC000030", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "24", "clean": "24"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "An estimate of the reciprocal of the floating-point operand in register FRB is placed into register FRT. Unless the reciprocal would be a zero, an infinity, the result of a trap-disabled Overflow exception, or a QNaN, the estimate is correct to a precision of one part in 256 of the reciprocal of (FRB).", "special_registers": "FPSCR (FPRF, FX, OX, UX, ZX, VXSNAN), CR1 (if Rc=1)", "programming_notes": "For the Floating-Point Estimate instructions, some implementations might implement a precision higher than the minimum architected precision.", "page_found": "Page 200 - 202", "pseudocode": "if 'fre' then\n    FRT <- estimate(1 / (FRB))\nelse if 'fre.' then\n    FRT <- estimate(1 / (FRB))\n    CR1 <- result_class(FRT)", "example": "fre f1, f3"}
{"mnemonic": "fres", "architecture": "PowerISA", "full_name": "Floating Reciprocal Estimate Single", "summary": "Estimates the reciprocal of a single-precision floating-point number.", "syntax": "fres FRT, FRB", "encoding": {"format": "A-form", "binary_pattern": "59 | FRT | 0 | 0 | FRB | 24 | /", "hex_opcode": "0xEC000030", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "24", "clean": "24"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}, {"name": "FT", "desc": "Target Floating-Point Register"}, {"name": "FB", "desc": "Source Floating-Point Register"}], "extension": "Floating-Point", "description": "Computes an estimate of the reciprocal (1/x) of the single-precision floating-point value in FRB and stores the result in FRT. The estimate is accurate to approximately 1 part in 256 for normalized values. If Rc=1, CR1 is set based on the result; FPSCR exception bits are set according to the floating-point exception enable controls.", "pseudocode": "FRT ← estimate(1.0 / FRB)\nif Rc = 1 then\n  CR1 ← (FRT_exception_summary)", "special_registers": "FPSCR, CR0", "page_found": "Page 174 - 175", "programming_notes": "The fres instruction provides a fast estimate of the reciprocal for single-precision floating-point numbers. It's useful in performance-critical applications where exact precision is not required, but speed is essential. Be cautious with inputs that have an unbiased exponent greater than +127, as they are treated as Infinity, which might lead to unexpected results if not handled properly.", "example": "fres f1, f3"}
{"mnemonic": "frsqrte", "architecture": "PowerISA", "full_name": "Floating Reciprocal Square Root Estimate", "summary": "Estimates the reciprocal of the square root of a floating-point operand.", "syntax": "frsqrte FRT,FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | 0 | 0 | FRB | 26 | /", "hex_opcode": "0xFC000034", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "26", "clean": "26"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "A estimate of the reciprocal of the square root of the floating-point operand in register FRB is placed into register FRT. The estimate placed into register FRT is correct to a precision of one part in 32 of the reciprocal of the square root of (FRB).", "special_registers": "FPSCR, CR1", "page_found": "Page 201 - 202", "pseudocode": "FRT ← estimate(1 / √FRB)", "programming_notes": "The frsqrte instruction provides a fast, approximate reciprocal square root calculation. It is useful for performance-critical applications where precision can be traded for speed. Ensure the input in FRB is positive to avoid undefined behavior. The result may need refinement for higher precision applications.", "example": "frsqrte f1, f3"}
{"mnemonic": "frsqrtes", "architecture": "PowerISA", "full_name": "Floating Reciprocal Square Root Estimate Single", "summary": "Estimates 1/sqrt(x) (Single Precision).", "syntax": "frsqrtes FRT, FRB", "encoding": {"format": "A-form", "binary_pattern": "59 | FRT | 0 | 0 | FRB | 26 | /", "hex_opcode": "0xEC000034", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "26", "clean": "26"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "Computes an estimate of the reciprocal of the square root (1/sqrt(x)) of the single-precision floating-point value in FRB and stores the result in FRT. The estimate is accurate to approximately 1 part in 256 for normalized positive values. If Rc=1, CR1 is set based on the result; FPSCR exception bits are set according to floating-point exception enable controls.", "pseudocode": "FRT ← estimate(1.0 / sqrt(FRB))\nif Rc = 1 then\n  CR1 ← (FRT_exception_summary)", "page_found": "Page 202", "special_registers": "FPSCR", "programming_notes": "The frsqrtes instruction provides a fast estimate of the reciprocal square root, suitable for performance-critical applications where precision is less critical than speed. Be aware that it may raise exceptions for special values like NaN or infinity, and results are only accurate to within one part in 32 of the true value.", "example": "frsqrtes f1, f3"}
{"mnemonic": "rfebb", "architecture": "PowerISA", "full_name": "Return From Event-Based Branch", "summary": "Returns control to the address specified by EBBRR0:61 || 0b00 or 320 || EBBRR32:61 || 0b00, depending on MSRSF.", "syntax": "rfebb S", "encoding": {"format": "XL-form", "binary_pattern": "0 | 6 | 11 | 16 | 20 | 21 | 31", "hex_opcode": "0x4C000124", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "S", "clean": "S"}, {"raw": "146", "clean": "146"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0 | 6 | 11 | 16 | 20 | 21 | 31"}, "operands": [{"name": "S", "desc": "State"}], "extension": "Base", "description": "The instruction sets BESCRGE to S and updates NIA based on the event-based branch facility's state. If there are no pending exceptions, it fetches the next instruction from a specific address; otherwise, it generates an event-based branch.", "pseudocode": "if 'rfebb' then\n    BESCRGE <- S\n    if MSRSF=1 then\n        NIA <- iea EBBRR0:61 || 0b00\n    else\n        NIA <- 320 || EBBRR32:61 || 0b00", "special_registers": "BESCR, MSR, NIA, EBBRR", "programming_notes": "rfebb serves as both a basic and an extended mnemonic. The Assembler will recognize an rfebb mnemonic with one operand as the basic form, and an rfebb mnemonic with no operand as the intended form. In the extended form, the S operand is omitted and assumed to be 1.", "extended_mnemonics": ["rfebb"], "page_found": "Page 1072 - 1073", "example": "rfebb 0"}
{"mnemonic": "setb", "architecture": "PowerISA", "full_name": "Set Boolean", "summary": "Sets the target register based on the condition register field BFA.", "syntax": "setb RT, BFA", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | BFA | / | 128 | /", "hex_opcode": "0x7C000100", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "BFA", "clean": "BFA"}, {"raw": "/", "clean": "/"}, {"raw": "128", "clean": "128"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "BFA", "desc": "CR Field"}], "extension": "Base", "description": "If bit 0 of CR field BFA is set to 1, the contents of register RT are set to 0xFFFF_FFFF_FFFF_FFFF. If bit 1 of CR field BFA is set to 1, the contents of register RT are set to 0x0000_0000_0000_0001. Otherwise, the contents of register RT are set to 0x0000_0000_0000_0000.", "pseudocode": "if CR4×BFA+32=1 then\n    RT ←0xFFFF_FFFF_FFFF_FFFF\nelse if CR4×BFA+33=1 then\n    RT ←0x0000_0000_0000_0001\nelse\n    RT ←0x0000_0000_0000_0000", "special_registers": "CR, RT", "page_found": "Page 166 - 168", "programming_notes": "The setb instruction is commonly used to conditionally set a register based on the state of specific bits in the CR (Condition Register). Ensure that the BFA field correctly reflects the desired condition before executing this instruction. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "setb r3, cr1"}
{"mnemonic": "divde", "architecture": "PowerISA", "full_name": "Divide Doubleword Extended", "summary": "Divides the contents of two registers and updates the condition register.", "syntax": "divde RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 425 | Rc", "hex_opcode": "0x7C000352", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "425", "clean": "425"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Dividend"}, {"name": "RB", "desc": "Divisor"}], "extension": "Base", "description": "For divde, the quotient of the contents of register RA (dividend) divided by RB (divisor) is placed into register RT. The operands are interpreted as signed integers.", "pseudocode": "if 'divde' then\n    RT <- (RA) ÷ (RB)", "special_registers": "CR0, XER", "page_found": "Page 123 - 124", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "example": "divde r3, r4, r5"}
{"mnemonic": "divdeu", "architecture": "PowerISA", "full_name": "Divide Doubleword Extended Unsigned", "summary": "64-bit extended unsigned division.", "syntax": "divdeu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 393 | Rc", "hex_opcode": "0x7C000312", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "393", "clean": "393"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Dividend"}, {"name": "RB", "desc": "Divisor"}], "extension": "Base", "description": "Performs unsigned extended division of a 128-bit dividend (RA || R0) by the 64-bit unsigned divisor in RB, placing the 64-bit quotient in RT. If OE=1 and overflow occurs, the OV bit in XER is set; if Rc=1, CR0 is set based on the quotient. Division by zero produces undefined results.", "pseudocode": "dividend ← (RA || 0)  # 128-bit value: RA in high 64 bits, 0 in low 64 bits\nRT ← dividend / RB\nif OE = 1 then\n  XER[OV] ← overflow_flag\nif Rc = 1 then\n  CR0 ← (RT_comparison_summary)", "page_found": "Page 124", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "example": "divdeu r3, r4, r5"}
{"mnemonic": "divwe", "architecture": "PowerISA", "full_name": "Divide Word Extended", "summary": "Performs a signed division of a 64-bit dividend by a 32-bit divisor and places the result in a 32-bit register.", "syntax": "divwe RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 427 | Rc", "hex_opcode": "0x7C000356", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "427", "clean": "427"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Dividend"}, {"name": "RB", "desc": "Divisor"}], "extension": "Base", "description": "The 64-bit dividend is formed from the upper 32 bits of RA (RA32:63) concatenated with 320. The 32-bit divisor is taken from RB (RB32:63). If the quotient can be represented in 32 bits, it is placed into RT32:63. The contents of RT0:31 are undefined.", "pseudocode": "if 'divwe' then\n    dividend0:63 ← (RA)32:63 || 320\n    divisor0:31 ← (RB)32:63\n    RT32:63 ← dividend ÷ divisor\n    RT0:31 ← undefined", "special_registers": "CR0, XER", "page_found": "Page 116 - 118", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "example": "divwe r3, r4, r5"}
{"mnemonic": "divweu", "architecture": "PowerISA", "full_name": "Divide Word Extended Unsigned", "summary": "Performs an unsigned division of a 64-bit dividend by a 32-bit divisor and returns the quotient in a 32-bit register.", "syntax": "divweu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 395 | Rc", "hex_opcode": "0x7C000316", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "395", "clean": "395"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Dividend"}, {"name": "RB", "desc": "Divisor"}], "extension": "Base", "description": "Performs unsigned extended division of a 64-bit dividend (RA || R0) by the 32-bit unsigned divisor in RB, placing the 32-bit quotient in RT. If OE=1 and overflow occurs, the OV bit in XER is set; if Rc=1, CR0 is set based on the quotient. Division by zero produces undefined results.", "pseudocode": "dividend ← (RA || 0)  # 64-bit value: RA in high 32 bits, 0 in low 32 bits\nRT ← dividend / RB\nif OE = 1 then\n  XER[OV] ← overflow_flag\nif Rc = 1 then\n  CR0 ← (RT_comparison_summary)", "special_registers": "CR0, XER", "page_found": "Page 117 - 118", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "example": "divweu r3, r4, r5"}
{"mnemonic": "vand", "architecture": "PowerISA", "full_name": "Vector Logical AND VX-form", "summary": "Performs a bitwise AND operation on the contents of two vector registers and stores the result in another vector register.", "syntax": "vand vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1028", "hex_opcode": "0x10000404", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1028", "clean": "1028"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Performs a bitwise logical AND of the 128-bit contents of vector registers vA and vB, storing the 128-bit result in vector register vD. This operation is performed element-independently across all bits without regard to element boundaries. No status flags are affected.", "pseudocode": "vD ← vA & vB", "page_found": "Page 427 - 428", "special_registers": "MSR", "programming_notes": "The vand instruction requires the vector facility to be enabled (MSR.VEC=1); otherwise, it will raise a Vector_Unavailable exception. Ensure that the vector registers are properly aligned and initialized before performing operations.", "example": "vand vd, va, vb"}
{"mnemonic": "vor", "architecture": "PowerISA", "full_name": "Vector OR", "summary": "Bitwise OR of two 128-bit vectors.", "syntax": "vor vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1156", "hex_opcode": "0x10000484", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1156", "clean": "1156"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Performs a bitwise OR of two 128-bit vector registers and stores the result in a third vector register. Each bit position of the result is set if the corresponding bit in either input vector is set. No status flags are affected.", "pseudocode": "vD ← vA | vB", "page_found": "Page 429", "special_registers": "MSR", "programming_notes": "The vor instruction requires the Vector Facility to be enabled in the MSR register; otherwise, it will raise a Vector Unavailable exception. Ensure that the vector registers involved are properly aligned and contain valid data for accurate results.", "example": "vor vd, va, vb"}
{"mnemonic": "vxor", "architecture": "PowerISA", "full_name": "Vector XOR", "summary": "Bitwise XOR of two 128-bit vectors.", "syntax": "vxor vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1220", "hex_opcode": "0x100004C4", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1220", "clean": "1220"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Performs a bitwise XOR (exclusive OR) of two 128-bit vector registers and stores the result in a third vector register. Each bit position of the result is set if the corresponding bits in the two input vectors differ. No status flags are affected.", "pseudocode": "vD ← vA ^ vB", "page_found": "Page 430", "special_registers": "MSR", "programming_notes": "The vxor instruction is used to perform a bitwise XOR operation on two vector registers and store the result in another. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. This instruction operates on 128-bit vector registers.", "example": "vxor vd, va, vb"}
{"mnemonic": "vnor", "architecture": "PowerISA", "full_name": "Vector NOR", "summary": "Performs a logical NOR operation on the contents of two vector registers and stores the result in another vector register.", "syntax": "vnor vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1284", "hex_opcode": "0x10000504", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1284", "clean": "1284"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The contents of VSR[VRA+32] are ORed with the contents of VSR[VRB+32], and the complemented result is placed into VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nelse\n    VSR[VRT+32] ←¬( VSR[VRA+32] | VSR[VRB+32] )", "extended_mnemonics": [{"mnemonic": "vnot", "equivalent_to": "vnor Vx,Vy,Vy"}], "page_found": "Page 429 - 430", "special_registers": "MSR", "programming_notes": "The vnor instruction performs a bitwise NOR operation on two vector registers and stores the result in another register. Ensure that the Vector Facility is enabled by checking and setting the MSR.VEC bit; otherwise, a Vector_Unavailable exception will be raised. This instruction operates at the user privilege level.", "example": "vnor vd, va, vb"}
{"mnemonic": "vandc", "architecture": "PowerISA", "full_name": "Vector AND with Complement", "summary": "Bitwise AND of vA with the ones' complement of vB (vA & ~vB).", "syntax": "vandc vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1092", "hex_opcode": "0x10000444", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1092", "clean": "1092"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Performs a bitwise AND of vA with the ones' complement of vB, effectively computing vA & ~vB, and stores the result in vD. Each bit is set in the result only if it is set in vA and clear in vB. No status flags are affected.", "pseudocode": "vD ← vA & ~vB", "page_found": "Page 428", "special_registers": "MSR", "programming_notes": "The vandc instruction requires the Vector Facility to be enabled; otherwise, it will raise an exception. Ensure that the MSR.VEC bit is set before using this instruction. This operation is useful for masking bits where you want to retain certain bits while complementing others.", "example": "vandc vd, va, vb"}
{"mnemonic": "vcmpequb", "architecture": "PowerISA", "full_name": "Vector Compare Equal Byte", "summary": "Compares two vector registers element by element as unsigned bytes and sets the target vector register based on the comparison.", "syntax": "vcmpequb VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "18 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000006", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "6", "clean": "6"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The Vector Integer Compare instructions compare two VSRs element by element, interpreting the elements as unsigned or signed integers depending on the instruction, and set the corresponding element of the target VSR to all 1s if the relation being tested is true and to all 0s if the relation being tested is false.", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 15\n    src1 ←VSR[VRA+32].byte[i]\n    src2 ←VSR[VRB+32].byte[i]\n    if src1 = src2 then do\n        VSR[VRT+32].byte[i] ←0xFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].byte[i] ←0x00\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6", "programming_notes": "vcmpequb[.], vcmpequh[.], vcmpequw[.], and vcmpequd[.] can be used for unsigned or signed integers.", "page_found": "Page 413 - 414", "example": "vcmpequb v1, v2, v3"}
{"mnemonic": "vcmpequh", "architecture": "PowerISA", "full_name": "Vector Compare Equal Halfword", "summary": "Compares each halfword of two vector registers and sets the corresponding halfword in the target register to all 1s if they are equal, otherwise all 0s.", "syntax": "vcmpequh VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000046", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "70", "clean": "70"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpequh, each halfword of VSR[VRA+32] is compared with the corresponding halfword of VSR[VRB+32]. If they are equal, the corresponding halfword in VSR[VRT+32] is set to all 1s (0xFFFF); otherwise, it is set to all 0s (0x0000).", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\n\nall_true ←1\nall_false ←1\ndo i = 0 to 7\n   src1 ←VSR[VRA+32].hword[i]\n   src2 ←VSR[VRB+32].hword[i]\n   if src1 = src2 then do\n      VSR[VRT+32].hword[i] ←0xFFFF\n      all_false ←0\n   end\n   else do\n      VSR[VRT+32].hword[i] ←0x0000\n      all_true ←0\n   end\nend\ndo i = 0 to 7\n   src1 ←VSR[VRA+32].hword[i]\n   src2 ←VSR[VRB+32].hword[i]\n   if src1 = src2 then do\n      VSR[VRT+32].hword[i] ←0xFFFF\n      all_false ←0\n   end\n   else do\n      VSR[VRT+32].hword[i] ←0x0000\n      all_true ←0\n   end\nend\nif Rc=1 then\n   CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6", "page_found": "Page 414 - 415", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpequh v1, v2, v3"}
{"mnemonic": "vcmpequd", "architecture": "PowerISA", "full_name": "Vector Compare Equal Doubleword", "summary": "Compares two vector registers for equality on an unsigned doubleword basis and stores the result in a third vector register.", "syntax": "vcmpequd VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc | 199", "hex_opcode": "0x100000C7", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "199", "clean": "199"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Compares two vector registers element-wise for equality on an unsigned doubleword basis (2 64-bit elements) and stores a mask in the destination vector register, with all 1s where elements are equal and all 0s where unequal. When the record bit (.) is set, the CR6 field is updated to reflect whether any or all comparisons are equal.", "pseudocode": "for i in 0 to 1 do\n  if VRA[i] = VRB[i] then\n    VRT[i] ← 0xFFFF_FFFF_FFFF_FFFF\n  else\n    VRT[i] ← 0x0000_0000_0000_0000\nif Rc = 1 then CR6 ← comparison results", "special_registers": "CR6", "page_found": "Page 416 - 417", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpequd v1, v2, v3"}
{"mnemonic": "vcmpgtub", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Unsigned Byte", "summary": "Unsigned > comparison for 16 bytes.", "syntax": "vcmpgtub vD, vA, vB", "encoding": {"format": "VC-form", "binary_pattern": "4 | vD | vA | vB | 518", "hex_opcode": "0x10000206", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "518", "clean": "518"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Performs an unsigned greater-than comparison of two vector registers on a byte-by-byte basis (16 bytes) and stores a mask in the destination vector register, with all 1s where the comparison is true and all 0s where false. No CR or XER flags are modified by this instruction.", "pseudocode": "for i in 0 to 15 do\n  if vA[i] > vB[i] (unsigned) then\n    vD[i] ← 0xFF\n  else\n    vD[i] ← 0x00", "page_found": "Page 419", "special_registers": "MSR, CR6", "programming_notes": "vcmpgtub is useful for comparing unsigned byte values in vectors. Ensure both source vectors are properly aligned to avoid alignment faults. The instruction updates CR field 6 if Rc=1, indicating comparison results; check this for conditional logic. Performance may vary based on vector length and data distribution.", "example": "vcmpgtub vd, va, vb"}
{"mnemonic": "vcmpgtsb", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Signed Byte", "summary": "Compares each byte of two vector registers and sets the corresponding result byte to all 1s if the signed byte in the first source register is greater than the signed byte in the second source register, otherwise sets it to all 0s.", "syntax": "vcmpgtsb VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "0 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000306", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "774", "clean": "774"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpgtsb, each byte of VSR[VRA+32] is compared with the corresponding byte of VSR[VRB+32]. If the signed byte in VSR[VRA+32] is greater than the signed byte in VSR[VRB+32], then the corresponding byte in VSR[VRT+32] is set to all 1s (0xFF). Otherwise, it is set to all 0s (0x00).", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 15\n    src1 ←EXTS(VSR[VRA+32].byte[i])\n    src2 ←EXTS(VSR[VRB+32].byte[i])\n    if src1 > src2 then do\n        VSR[VRT+32].byte[i] ←0xFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].byte[i] ←0x00\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR0, XER", "page_found": "Page 418 - 419", "extended_mnemonics": ["vcmpgtsb."], "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpgtsb v1, v2, v3"}
{"mnemonic": "vcmpgtuh", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Unsigned Halfword", "summary": "Unsigned > comparison for 8 halfwords.", "syntax": "vcmpgtuh vD, vA, vB", "encoding": {"format": "VC-form", "binary_pattern": "4 | vD | vA | vB | 582", "hex_opcode": "0x10000246", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "582", "clean": "582"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Performs an unsigned greater-than comparison of two vector registers on a halfword-by-halfword basis (8 halfwords) and stores a mask in the destination vector register, with all 1s where the comparison is true and all 0s where false. No CR or XER flags are modified by this instruction.", "pseudocode": "for i in 0 to 7 do\n  if vA[i] > vB[i] (unsigned) then\n    vD[i] ← 0xFFFF\n  else\n    vD[i] ← 0x0000", "page_found": "Page 420", "special_registers": "MSR, CR", "programming_notes": "The vcmpgtuh instruction is commonly used for comparing unsigned halfword elements in vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The instruction updates the CR field if Rc=1, which can be useful for conditional branching based on the comparison results.", "example": "vcmpgtuh vd, va, vb"}
{"mnemonic": "vcmpgtsh", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Signed Halfword", "summary": "Compares each halfword of two vector registers and sets the corresponding result element to all 1s if the first operand is greater than the second, otherwise all 0s.", "syntax": "vcmpgtsh VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "0 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000346", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "838", "clean": "838"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpgtsh, each halfword of VSR[VRA+32] is compared with the corresponding halfword of VSR[VRB+32]. If the signed value in VSR[VRA+32].hword[i] is greater than that in VSR[VRB+32].hword[i], then VSR[VRT+32].hword[i] is set to 0xFFFF; otherwise, it is set to 0x0000.", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 7\n    src1 ←EXTS(VSR[VRA+32].hword[i])\n    src2 ←EXTS(VSR[VRB+32].hword[i])\n    if src1 > src2 then do\n        VSR[VRT+32].hword[i] ←0xFFFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].hword[i] ←0x0000\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6 (if Rc=1)", "page_found": "Page 419 - 420", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpgtsh v1, v2, v3"}
{"mnemonic": "vcmpgtuw", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Unsigned Word", "summary": "Unsigned > comparison for 4 words.", "syntax": "vcmpgtuw vD, vA, vB", "encoding": {"format": "VC-form", "binary_pattern": "4 | vD | vA | vB | 646", "hex_opcode": "0x10000286", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "646", "clean": "646"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Performs an unsigned greater-than comparison of two vector registers on a word-by-word basis (4 words) and stores a mask in the destination vector register, with all 1s where the comparison is true and all 0s where false. No CR or XER flags are modified by this instruction.", "pseudocode": "for i in 0 to 3 do\n  if vA[i] > vB[i] (unsigned) then\n    vD[i] ← 0xFFFF_FFFF\n  else\n    vD[i] ← 0x0000_0000", "page_found": "Page 421", "special_registers": "MSR, CR6", "programming_notes": "This instruction is commonly used for element-wise comparison of unsigned integers in vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The result register must be aligned to 128 bits, and both source registers should contain valid data. If Rc=1, CR field 6 will reflect whether all comparisons were true or false, which can be useful for conditional branching based on vector comparison results.", "example": "vcmpgtuw vd, va, vb"}
{"mnemonic": "vcmpgtsw", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Signed Word", "summary": "Compares each word of two vector registers and sets the corresponding word in the target vector register to all 1s if the first operand is greater than the second, otherwise to all 0s.", "syntax": "vcmpgtsw VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000386", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "902", "clean": "902"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpgtsw, each word of VSR[VRA+32] is compared with the corresponding word of VSR[VRB+32]. If the signed integer value in the word element i of VSR[VRA+32] is greater than that in VSR[VRB+32], then the contents of word element i of VSR[VRT+32] are set to all 1s; otherwise, they are set to all 0s.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 3\n    src1 ←EXTS(VSR[VRA+32].word[i])\n    src2 ←EXTS(VSR[VRB+32].word[i])\n    if src1 > src2 then do\n        VSR[VRT+32].word[i] ←0xFFFF_FFFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].word[i] ←0x0000_0000\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6 (if Rc=1)", "page_found": "Page 420 - 421", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpgtsw v1, v2, v3"}
{"mnemonic": "vcmpgtud", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Unsigned Doubleword", "summary": "Compares the contents of two vector registers and sets a result based on whether each element in the first register is greater than the corresponding element in the second register.", "syntax": "vcmpgtud vD, vA, vB", "encoding": {"format": "VC-form", "binary_pattern": "4 | vD | vA | vB | 711", "hex_opcode": "0x100002C7", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "711", "clean": "711"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "pseudocode": "for i in 0 to 1 do\n  if vA[i] > vB[i] (unsigned) then\n    vD[i] ← 0xFFFF_FFFF_FFFF_FFFF\n  else\n    vD[i] ← 0x0000_0000_0000_0000", "page_found": "Page 1440 - 1441", "description": "Performs an unsigned greater-than comparison of two vector registers on a doubleword-by-doubleword basis (2 doublewords) and stores a mask in the destination vector register, with all 1s where the comparison is true and all 0s where false. No CR or XER flags are modified by this instruction.", "special_registers": "CR6", "programming_notes": "This instruction is commonly used in scenarios where you need to compare unsigned integers stored in vector registers. Ensure that the input vectors are properly aligned and that the Rc flag is set if you need to use CR6 for further conditional logic. Be aware that this instruction operates on doublewords, so each element must be 32 bits wide.", "example": "vcmpgtud vd, va, vb"}
{"mnemonic": "vcmpgtsd", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Signed Doubleword", "summary": "Compares two doublewords of signed integers and sets the result vector based on the comparison.", "syntax": "vcmpgtsd VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x100003C7", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "967", "clean": "967"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpgtsd, each doubleword in VSR[VRA+32] is compared to the corresponding doubleword in VSR[VRB+32]. If a doubleword in VSR[VRA+32] is greater than the corresponding doubleword in VSR[VRB+32], the corresponding doubleword in VSR[VRT+32] is set to all 1s; otherwise, it is set to all 0s.", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 1\n    src1 ←EXTS(VSR[VRA+32].dword[i])\n    src2 ←EXTS(VSR[VRB+32].dword[i])\n    if src1 > src2 then do\n        VSR[VRT+32].dword[i] ←0xFFFF_FFFF_FFFF_FFFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].dword[i] ←0x0000_0000_0000_0000\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6 (if Rc=1)", "page_found": "Page 421 - 422", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpgtsd v1, v2, v3"}
{"mnemonic": "vavgub", "architecture": "PowerISA", "full_name": "Vector Average Unsigned Byte", "summary": "Computes (a+b+1)/2 for bytes.", "syntax": "vavgub vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1026", "hex_opcode": "0x10000402", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1026", "clean": "1026"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Computes the average of corresponding unsigned bytes in vA and vB using rounding (vA + vB + 1) >> 1, storing the result in vD. This is a vector operation that processes 16 independent byte elements in parallel. No condition flags or status fields are affected.", "pseudocode": "for i in 0 to 15 do\n  vD[8*i:8*i+7] ← ((vA[8*i:8*i+7] + vB[8*i:8*i+7] + 1) >> 1)[7:0]\nend for", "page_found": "Page 401", "special_registers": "MSR", "programming_notes": "The vavgub instruction is commonly used for averaging pixel values in image processing tasks. Ensure that the source vectors are properly aligned to avoid performance penalties. This instruction operates at user privilege level and will raise an exception if the vector facility is not enabled (MSR.VEC=0).", "example": "vavgub vd, va, vb"}
{"mnemonic": "vavgsb", "architecture": "PowerISA", "full_name": "Vector Average Signed Byte", "summary": "Performs a signed byte-wise average of two vector registers and stores the result in another vector register.", "syntax": "vavgsb vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1282", "hex_opcode": "0x10000502", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1282", "clean": "1282"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vavgsb, each byte element of VSR[VRA+32] is added to the corresponding byte element of VSR[VRB+32], incremented by 1, then right-shifted by 1 bit. The low-order 8 bits of the result are placed into the corresponding byte element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    src1 ←EXTS(VSR[VRA+32].byte[i])\n    src2 ←EXTS(VSR[VRB+32].byte[i])\n    VSR[VRT+32].byte[i] ←CHOP8((src1 + src2 + 1) >> 1)\nend", "page_found": "Page 400 - 401", "special_registers": "MSR", "programming_notes": "The vavgsb instruction performs a signed byte average, rounding up by adding 1 before shifting. Ensure that the Vector Facility is enabled in the MSR register to avoid exceptions. This operation is useful for blending two images or averaging data with precision.", "example": "vavgsb vd, va, vb"}
{"mnemonic": "vavguh", "architecture": "PowerISA", "full_name": "Vector Average Unsigned Halfword", "summary": "Computes (a+b+1)/2 for halfwords.", "syntax": "vavguh vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1090", "hex_opcode": "0x10000442", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1090", "clean": "1090"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Computes the average of corresponding unsigned halfwords in vA and vB using rounding (vA + vB + 1) >> 1, storing the result in vD. This is a vector operation that processes 8 independent halfword elements in parallel. No condition flags or status fields are affected.", "pseudocode": "for i in 0 to 7 do\n  vD[16*i:16*i+15] ← ((vA[16*i:16*i+15] + vB[16*i:16*i+15] + 1) >> 1)[15:0]\nend for", "page_found": "Page 402", "special_registers": "MSR", "programming_notes": "The vavguh instruction is used to compute the average of corresponding halfwords from two source vectors, rounding up. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set; otherwise, a Vector_Unavailable exception will be raised. This instruction operates on 16-bit unsigned integers and stores the result in the destination vector. Be cautious of overflow when adding the two source halfwords before rounding.", "example": "vavguh vd, va, vb"}
{"mnemonic": "vavgsh", "architecture": "PowerISA", "full_name": "Vector Average Signed Halfword", "summary": "Performs a signed halfword average operation on vector elements.", "syntax": "vavgsh vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "0 | VRT | VRA | VRB | 1346", "hex_opcode": "0x10000542", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1346", "clean": "1346"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vavgsh, the sum of the contents of each corresponding pair of halfwords from VSR[VRA+32] and VSR[VRB+32] is calculated, incremented by 1, shifted right by 1 bit, and then placed into the corresponding halfword in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 7\n    src1 ←EXTS(VSR[VRA+32].hword[i])\n    src2 ←EXTS(VSR[VRB+32].hword[i])\n    VSR[VRT+32].hword[i] ← CHOP16((src1 + src2 + 1) >> 1)\nend", "page_found": "Page 401 - 402", "special_registers": "MSR", "programming_notes": "The vavgsh instruction performs a signed halfword average, rounding up by adding 1 before shifting. Ensure that the vector facility is enabled in the MSR register to avoid exceptions. This operation processes each pair of halfwords independently, so alignment requirements are minimal.", "example": "vavgsh vd, va, vb"}
{"mnemonic": "vavguw", "architecture": "PowerISA", "full_name": "Vector Average Unsigned Word", "summary": "Computes (a+b+1)/2 for words.", "syntax": "vavguw vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1154", "hex_opcode": "0x10000482", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1154", "clean": "1154"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Computes the average of corresponding unsigned words in vA and vB using rounding (vA + vB + 1) >> 1, storing the result in vD. This is a vector operation that processes 4 independent word elements in parallel. No condition flags or status fields are affected.", "pseudocode": "for i in 0 to 3 do\n  vD[32*i:32*i+31] ← ((vA[32*i:32*i+31] + vB[32*i:32*i+31] + 1) >> 1)[31:0]\nend for", "page_found": "Page 403", "special_registers": "MSR", "programming_notes": "The vavguw instruction is used to compute the average of unsigned word elements from two vectors. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set; otherwise, a Vector_Unavailable exception will be raised. This instruction processes each 32-bit word element independently, so alignment requirements are not strict. Be cautious with potential overflow when summing large unsigned integers.", "example": "vavguw vd, va, vb"}
{"mnemonic": "vavgsw", "architecture": "PowerISA", "full_name": "Vector Average Signed Word", "summary": "Performs a vector average of signed words from two source vectors and stores the result in a destination vector.", "syntax": "vavgsw vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1410", "hex_opcode": "0x10000582", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1410", "clean": "1410"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vavgsw, each word element in VSR[VRA+32] is added to the corresponding word element in VSR[VRB+32], incremented by 1, and then shifted right by 1 bit. The low-order 32 bits of the result are placed into the corresponding word element in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ←EXTS(VSR[VRA+32].word[i])\n    src2 ←EXTS(VSR[VRB+32].word[i])\n    VSR[VRT+32].word[i] ← Chop32((src1 + src2 + 1) >> 1)", "page_found": "Page 402 - 403", "special_registers": "MSR", "programming_notes": "vavgsw is used for averaging signed word elements from two vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. The operation includes an implicit rounding by adding 1 before shifting right, which can affect results for negative numbers. This instruction operates on 32-bit word elements and requires proper alignment of input vectors.", "example": "vavgsw vd, va, vb"}
{"mnemonic": "vminub", "architecture": "PowerISA", "full_name": "Vector Minimum Unsigned Byte", "summary": "Selects minimum value per byte (unsigned).", "syntax": "vminub vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1026", "hex_opcode": "0x10000202", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1026", "clean": "1026"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Selects the minimum unsigned value for each corresponding byte pair from vA and vB, storing the results in vD. This is a vector operation that performs 16 independent byte-wise minimum comparisons in parallel. No condition flags or status fields are affected.", "pseudocode": "for i in 0 to 15 do\n  vD[8*i:8*i+7] ← MIN_UNSIGNED(vA[8*i:8*i+7], vB[8*i:8*i+7])\nend for", "page_found": "Page 410", "special_registers": "MSR", "programming_notes": "The vminub instruction is used to perform element-wise minimum comparison of unsigned bytes between two vector registers and store the results in a third register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation is straightforward but requires both source vectors to be properly aligned for optimal performance.", "example": "vminub vd, va, vb"}
{"mnemonic": "vminsb", "architecture": "PowerISA", "full_name": "Vector Minimum Signed Byte", "summary": "Compares the signed byte elements of two vector registers and stores the minimum values in a third vector register.", "syntax": "vminsb vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1538", "hex_opcode": "0x10000302", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1538", "clean": "1538"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vminsb, each byte element of VSR[VRA+32] is compared to the corresponding byte element of VSR[VRB+32]. The smaller value is stored in the corresponding byte element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    src1 ← VSR[VRA+32].byte[i]\n    src2 ← VSR[VRB+32].byte[i]\n    lt_flag ← EXTS(src1) < EXTS(src2)\n    VSR[VRT+32].byte[i] ← lt_flag=1 ? src1 : src2\nend", "page_found": "Page 409 - 410", "special_registers": "MSR", "programming_notes": "This instruction is used to perform element-wise minimum comparison on signed byte values. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation respects the sign of the bytes, so it correctly handles negative numbers. There are no specific alignment requirements for the vector registers involved.", "example": "vminsb vd, va, vb"}
{"mnemonic": "vminuh", "architecture": "PowerISA", "full_name": "Vector Minimum Unsigned Halfword", "summary": "Selects minimum value per halfword (unsigned).", "syntax": "vminuh vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1090", "hex_opcode": "0x10000242", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1090", "clean": "1090"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Selects the minimum unsigned value for each corresponding halfword pair from vA and vB, storing the results in vD. This is a vector operation that performs 8 independent halfword-wise minimum comparisons in parallel. No condition flags or status fields are affected.", "pseudocode": "for i in 0 to 7 do\n  vD[16*i:16*i+15] ← MIN_UNSIGNED(vA[16*i:16*i+15], vB[16*i:16*i+15])\nend for", "page_found": "Page 411", "special_registers": "MSR", "programming_notes": "The vminuh instruction is used to perform element-wise minimum operations on unsigned halfwords from two source vectors. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation does not require any specific alignment for the data, but both source and destination vectors must be properly loaded into the vector registers VRA, VRB, and VRT respectively.", "example": "vminuh vd, va, vb"}
{"mnemonic": "vminsh", "architecture": "PowerISA", "full_name": "Vector Minimum Signed Halfword", "summary": "Compares the signed halfwords of two vector registers and selects the minimum value for each corresponding pair.", "syntax": "vminsh vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1602", "hex_opcode": "0x10000342", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1602", "clean": "1602"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vminsh, the instruction compares the signed halfwords of VSR[VRA+32] and VSR[VRB+32]. The smaller value is placed into the corresponding halfword element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 7\n    src1 ← VSR[VRA+32].hword[i]\n    src2 ← VSR[VRB+32].hword[i]\n    lt_flag ← EXTS(src1) < EXTS(src2)\n    VSR[VRT+32].hword[i] ← lt_flag=1 ? src1 : src2\nend", "page_found": "Page 410 - 411", "special_registers": "MSR", "programming_notes": "This instruction is used to perform element-wise minimum comparison of signed halfwords from two vector registers and store the results in another vector register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation respects the sign of the halfwords, so negative values are correctly handled. There are no specific alignment requirements for the data being processed.", "example": "vminsh vd, va, vb"}
{"mnemonic": "vminuw", "architecture": "PowerISA", "full_name": "Vector Minimum Unsigned Word", "summary": "Selects minimum value per word (unsigned).", "syntax": "vminuw vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1154", "hex_opcode": "0x10000282", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1154", "clean": "1154"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Selects the minimum unsigned value for each corresponding word pair from vA and vB, storing the results in vD. This is a vector operation that performs 4 independent word-wise minimum comparisons in parallel. No condition flags or status fields are affected.", "pseudocode": "for i in 0 to 3 do\n  vD[32*i:32*i+31] ← MIN_UNSIGNED(vA[32*i:32*i+31], vB[32*i:32*i+31])\nend for", "page_found": "Page 412", "special_registers": "MSR", "programming_notes": "The vminuw instruction is used to perform element-wise minimum operations on unsigned words from two vectors. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation is performed in parallel across four elements per vector register.", "example": "vminuw vd, va, vb"}
{"mnemonic": "vminsw", "architecture": "PowerISA", "full_name": "Vector Minimum Signed Word", "summary": "Compares the signed integer values in each word element of two vector registers and stores the smaller value into a target vector register.", "syntax": "vminsw vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1666", "hex_opcode": "0x10000382", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1666", "clean": "1666"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vminsw, the instruction compares the signed integer values in each word element of VSR[VRA+32] and VSR[VRB+32]. The smaller value is placed into the corresponding word element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ← VSR[VRA+32].word[i]\n    src2 ← VSR[VRB+32].word[i]\n    lt_flag ← EXTS(src1) < EXTS(src2)\n    VSR[VRT+32].word[i] ← lt_flag=1 ? src1 : src2", "page_found": "Page 411 - 412", "special_registers": "MSR", "programming_notes": "This instruction is used to perform element-wise minimum comparison of signed 32-bit integers in vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation respects the sign of the integers, so negative numbers are correctly handled as expected in signed comparisons.", "example": "vminsw vd, va, vb"}
{"mnemonic": "vmaxub", "architecture": "PowerISA", "full_name": "Vector Maximum Unsigned Byte", "summary": "Selects maximum value per byte (unsigned).", "syntax": "vmaxub vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 4", "hex_opcode": "0x10000002", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "4", "clean": "4"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Selects the maximum unsigned value for each corresponding byte pair from vA and vB, storing the results in vD. This is a vector operation that performs 16 independent byte-wise maximum comparisons in parallel. No condition flags or status fields are affected.", "pseudocode": "for i in 0 to 15 do\n  vD[8*i:8*i+7] ← MAX_UNSIGNED(vA[8*i:8*i+7], vB[8*i:8*i+7])\nend for", "page_found": "Page 406", "special_registers": "MSR", "programming_notes": "The vmaxub instruction is used to perform element-wise comparison of unsigned bytes from two vector registers and store the maximum values in a third register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. This instruction operates on 16-byte vectors, so ensure proper alignment for optimal performance.", "example": "vmaxub vd, va, vb"}
{"mnemonic": "vmaxsb", "architecture": "PowerISA", "full_name": "Vector Maximum Signed Byte", "summary": "Performs a signed byte-wise maximum operation on two vector registers and stores the result in another vector register.", "syntax": "vmaxsb vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 516", "hex_opcode": "0x10000102", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "516", "clean": "516"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmaxsb, each byte element of VSR[VRA+32] is compared with the corresponding byte element of VSR[VRB+32]. The larger value is stored in the corresponding byte element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    src1 ← VSR[VRA+32].byte[i]\n    src2 ← VSR[VRB+32].byte[i]\n    gt_flag ← EXTS(src1) > EXTS(src2)\n    VSR[VRT+32].byte[i] ← gt_flag=1 ? src1 : src2\nend", "page_found": "Page 405 - 406", "special_registers": "MSR", "programming_notes": "This instruction is used to perform element-wise signed byte comparisons and store the maximum values in the destination vector. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation respects the signed nature of bytes, so developers should be cautious with negative values. This instruction operates on 16 byte elements and does not require any specific alignment for the vector registers.", "example": "vmaxsb vd, va, vb"}
{"mnemonic": "vmaxuh", "architecture": "PowerISA", "full_name": "Vector Maximum Unsigned Halfword", "summary": "Selects maximum value per halfword (unsigned).", "syntax": "vmaxuh vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 68", "hex_opcode": "0x10000042", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "68", "clean": "68"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Selects the maximum unsigned value for each corresponding halfword pair from vA and vB, storing the results in vD. This is a vector operation that performs 8 independent halfword-wise maximum comparisons in parallel. No condition flags or status fields are affected.", "pseudocode": "for i in 0 to 7 do\n  vD[16*i:16*i+15] ← MAX_UNSIGNED(vA[16*i:16*i+15], vB[16*i:16*i+15])\nend for", "page_found": "Page 407", "special_registers": "MSR", "programming_notes": "The vmaxuh instruction is used to perform element-wise comparisons of unsigned halfwords from two source vectors and store the maximum values in a destination vector. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. This instruction operates on 16-bit unsigned integers, so ensure proper alignment and data type handling to avoid unexpected results.", "example": "vmaxuh vd, va, vb"}
{"mnemonic": "vmaxsh", "architecture": "PowerISA", "full_name": "Vector Maximum Signed Halfword", "summary": "Compares the signed halfwords of two vector registers and stores the maximum values in a third vector register.", "syntax": "vmaxsh vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 580", "hex_opcode": "0x10000142", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "580", "clean": "580"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmaxsh, each pair of corresponding halfwords from VSR[VRA+32] and VSR[VRB+32] are compared. The larger value is stored in the corresponding halfword of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 7\n    src1 ← VSR[VRA+32].hword[i]\n    src2 ← VSR[VRB+32].hword[i]\n    gt_flag ← EXTS(src1) > EXTS(src2)\n    VSR[VRT+32].hword[i] ← gt_flag=1 ? src1 : src2\nend", "page_found": "Page 406 - 407", "special_registers": "MSR", "programming_notes": "This instruction is used to perform element-wise signed halfword maximum operations between two vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation respects the sign of the halfwords and stores the larger value in the corresponding position of the destination register. Be cautious with alignment as unaligned access might lead to performance penalties or exceptions depending on the system configuration.", "example": "vmaxsh vd, va, vb"}
{"mnemonic": "vmaxuw", "architecture": "PowerISA", "full_name": "Vector Maximum Unsigned Word", "summary": "Selects maximum value per word (unsigned).", "syntax": "vmaxuw vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 132", "hex_opcode": "0x10000082", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "132", "clean": "132"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Compares four unsigned word elements from vA and vB, writing the maximum value of each pair to the corresponding word element in vD. This is a VMX (AltiVec) instruction that operates on all four 32-bit words in parallel with no condition register or status updates.", "pseudocode": "vD[0:31] ← max(vA[0:31], vB[0:31])\nvD[32:63] ← max(vA[32:63], vB[32:63])\nvD[64:95] ← max(vA[64:95], vB[64:95])\nvD[96:127] ← max(vA[96:127], vB[96:127])", "page_found": "Page 408", "special_registers": "MSR", "programming_notes": "The vmaxuw instruction is used to perform element-wise comparison of unsigned 32-bit words in vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation does not require any specific alignment for the data being processed.", "example": "vmaxuw vd, va, vb"}
{"mnemonic": "vmaxsw", "architecture": "PowerISA", "full_name": "Vector Maximum Signed Word", "summary": "Compares the signed integer values in each word element of two vector registers and stores the larger value into a third vector register.", "syntax": "vmaxsw vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 644", "hex_opcode": "0x10000182", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "644", "clean": "644"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmaxsw, for each integer value i from 0 to 3, the signed integer value in word element i of VSR[VRA+32] is compared to the signed integer value in word element i of VSR[VRB+32]. The larger of the two values is placed into word element i of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ← VSR[VRA+32].word[i]\n    src2 ← VSR[VRB+32].word[i]\n    gt_flag ← EXTS(src1) > EXTS(src2)\n    VSR[VRT+32].word[i] ← gt_flag=1 ? src1 : src2", "page_found": "Page 407 - 408", "special_registers": "MSR", "programming_notes": "The vmaxsw instruction compares each signed word element of two vector registers and stores the maximum value in the destination register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates on 4-word elements, so input vectors must be properly aligned. Be cautious with signed integer overflow; if both operands are negative and one is closer to zero than the other, the result may not be as expected.", "example": "vmaxsw vd, va, vb"}
{"mnemonic": "vmrghb", "architecture": "PowerISA", "full_name": "Vector Merge High Byte", "summary": "Interleaves high-order bytes from two vectors (Permutation).", "syntax": "vmrghb vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 12", "hex_opcode": "0x1000000C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "12", "clean": "12"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmrghb, the high byte elements of VSR[VRA+32] and VSR[VRB+32] are merged into VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 7\n    VSR[VRT+32].hword[i].byte[0] ← VSR[VRA+32].byte[i]\n    VSR[VRT+32].hword[i].byte[1] ← VSR[VRB+32].byte[i]", "page_found": "Page 314 - 316", "special_registers": "MSR", "programming_notes": "This instruction is used to merge the high byte elements from two vector registers into a third. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. The operation processes each of the 8 high bytes, placing them alternately into the destination register. This instruction operates at the user privilege level and does not generate exceptions beyond those related to facility availability or invalid operand access.", "example": "vmrghb vd, va, vb"}
{"mnemonic": "vmrghh", "architecture": "PowerISA", "full_name": "Vector Merge High Halfword", "summary": "Merges the high halfwords of two vector registers into a target vector register.", "syntax": "vmrghh vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 76", "hex_opcode": "0x1000004C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "76", "clean": "76"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmrghh, the contents of halfword elements 0 to 3 of VSR[VRA+32] are placed into halfword elements 0 to 7 of VSR[VRT+32], and the contents of halfword elements 0 to 3 of VSR[VRB+32] are placed into halfword elements 1 to 8 of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    VSR[VRT+32].word[i].hword[0] ← VSR[VRA+32].hword[i]\n    VSR[VRT+32].word[i].hword[1] ← VSR[VRB+32].hword[i]", "page_found": "Page 315 - 316", "special_registers": "MSR", "programming_notes": "The vmrghh instruction is used to merge the high halfwords from two vector registers into a single destination register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. This operation is useful for combining data from two sources into one vector, but be cautious of alignment issues if the data elements are not properly aligned to halfword boundaries.", "example": "vmrghh vd, va, vb"}
{"mnemonic": "vmrghw", "architecture": "PowerISA", "full_name": "Vector Merge High Word", "summary": "Merges the high words of two vector registers into a target vector register.", "syntax": "vmrghw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O", "hex_opcode": "0x1000008C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "140", "clean": "140"}], "length": "32", "bit_positions": "0 | 6 | 11 | 16 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  | "}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VT", "desc": "Target Vector Register"}, {"name": "VS30", "desc": "Source Vector Register"}, {"name": "VS31", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The contents of word element 0 of VSR[VRA+32] are placed into word element 0 of VSR[VRT+32]. The contents of word element 0 of VSR[VRB+32] are placed into word element 1 of VSR[VRT+32]. The contents of word element 1 of VSR[VRA+32] are placed into word element 2 of VSR[VRT+32]. The contents of word element 1 of VSR[VRB+32] are placed into word element 3 of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nelse\n    VSR[VRT+32].word[0] ← VSR[VRA+32].word[0]\n    VSR[VRT+32].word[1] ← VSR[VRB+32].word[0]\n    VSR[VRT+32].word[2] ← VSR[VRA+32].word[1]\n    VSR[VRT+32].word[3] ← VSR[VRB+32].word[1]", "page_found": "Page 316 - 318", "special_registers": "MSR", "programming_notes": "The vmrghw instruction is used to merge high words from two vector registers into a third. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. This operation is useful for combining specific elements from different vectors into a single output vector.", "example": "vmrghw vd, va, vb"}
{"mnemonic": "vmrglb", "architecture": "PowerISA", "full_name": "Vector Merge Low Byte", "summary": "Interleaves low-order bytes.", "syntax": "vmrglb vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 268", "hex_opcode": "0x1000010C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "268", "clean": "268"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Merges the eight low-order (rightmost) bytes from vA and vB in an alternating interleaved pattern into vD, with vA bytes in even positions and vB bytes in odd positions. This VMX instruction does not affect any condition or status registers.", "pseudocode": "vD[0:7] ← vA[120:127]\nvD[8:15] ← vB[120:127]\nvD[16:23] ← vA[112:119]\nvD[24:31] ← vB[112:119]\nvD[32:39] ← vA[104:111]\nvD[40:47] ← vB[104:111]\nvD[48:55] ← vA[96:103]\nvD[56:63] ← vB[96:103]\nvD[64:71] ← vA[88:95]\nvD[72:79] ← vB[88:95]\nvD[80:87] ← vA[80:87]\nvD[88:95] ← vB[80:87]\nvD[96:103] ← vA[72:79]\nvD[104:111] ← vB[72:79]\nvD[112:119] ← vA[64:71]\nvD[120:127] ← vB[64:71]", "page_found": "Page 315", "special_registers": "MSR", "programming_notes": "The vmrglb instruction is useful for merging data from two vectors by alternating bytes into a third vector. Ensure that the target and source registers are properly aligned to avoid unexpected behavior. This instruction requires the Vector Facility to be enabled in the MSR register; otherwise, it will raise an exception. Performance may vary based on the specific implementation and alignment of the data.", "example": "vmrglb vd, va, vb"}
{"mnemonic": "vmrglh", "architecture": "PowerISA", "full_name": "Vector Merge Low Halfword", "summary": "Interleaves low-order halfwords.", "syntax": "vmrglh vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 332", "hex_opcode": "0x1000014C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "332", "clean": "332"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Merges the four low-order (rightmost) halfwords from vA and vB in an alternating interleaved pattern into vD, with vA halfwords in even positions and vB halfwords in odd positions. This VMX instruction does not affect any condition or status registers.", "pseudocode": "vD[0:15] ← vA[112:127]\nvD[16:31] ← vB[112:127]\nvD[32:47] ← vA[96:111]\nvD[48:63] ← vB[96:111]\nvD[64:79] ← vA[80:95]\nvD[80:95] ← vB[80:95]\nvD[96:111] ← vA[64:79]\nvD[112:127] ← vB[64:79]", "page_found": "Page 316", "special_registers": "MSR", "programming_notes": "The vmrglh instruction is used to merge the lower halfwords from two source vectors into a destination vector. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation interleaves the halfwords from the two sources, so the resulting vector will have elements from both sources in an alternating pattern.", "example": "vmrglh vd, va, vb"}
{"mnemonic": "vmrglw", "architecture": "PowerISA", "full_name": "Vector Merge Low Word", "summary": "Interleaves low-order words.", "syntax": "vmrglw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 396", "hex_opcode": "0x1000018C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "396", "clean": "396"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Merges the two low-order (rightmost) words from vA and vB in an alternating interleaved pattern into vD, with vA word in even position and vB word in odd position. This VMX instruction does not affect any condition or status registers.", "pseudocode": "vD[0:31] ← vA[96:127]\nvD[32:63] ← vB[96:127]\nvD[64:95] ← vA[64:95]\nvD[96:127] ← vB[64:95]", "page_found": "Page 317", "special_registers": "MSR", "programming_notes": "The vmrglw instruction is used to merge the low words from two source vectors into a destination vector. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set; otherwise, a Vector_Unavailable exception will be raised. This instruction operates on 128-bit vector registers and requires proper alignment of the input vectors to avoid unexpected results.", "example": "vmrglw vd, va, vb"}
{"mnemonic": "vpkuhum", "architecture": "PowerISA", "full_name": "Vector Pack Unsigned Halfword Unsigned Modulo", "summary": "Packs the upper half of each 16-bit element from two vector registers into a single byte in another vector register.", "syntax": "vpkuhum vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "18 | VRT | VRA | VRB | 14", "hex_opcode": "0x1000000E", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "14", "clean": "14"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The instruction packs the upper half of each 16-bit element from VSR[VRA+32] and VSR[VRB+32] into the corresponding byte elements of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nelse\n    vsrc.qword[0] ← VSR[VRA+32]\n    vsrc.qword[1] ← VSR[VRB+32]\n    for i = 0 to 15 do\n        VSR[VRT+32].byte[i] ← vsrc.hword[i].bit[8:15]\n    end\nend", "page_found": "Page 307 - 308", "special_registers": "MSR", "programming_notes": "This instruction is used to pack the upper half of each 16-bit element from two source vectors into a destination vector. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set before using this instruction; otherwise, it will raise an exception. The operation processes 32 bytes (16 elements) from each source vector and packs them into the destination vector, maintaining the upper half of each element. This instruction does not require any specific alignment but must be executed in a privileged context where the VEC bit is enabled.", "example": "vpkuhum vd, va, vb"}
{"mnemonic": "vpkuwum", "architecture": "PowerISA", "full_name": "Vector Pack Unsigned Word Unsigned Modulo", "summary": "Packs the upper half of each word from two vector registers into a single vector register using modulo arithmetic.", "syntax": "vpkuwum vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 78", "hex_opcode": "0x1000004E", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "78", "clean": "78"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The instruction concatenates the contents of VSR[VRA+32] and VSR[VRB+32], then extracts the upper half of each word (bits 16:31) and places them into the corresponding halfword elements of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nvsrc.qword[0] ← VSR[VRA+32]\nvsrc.qword[1] ← VSR[VRB+32]\ndo i = 0 to 7\n    VSR[VRT+32].hword[i] ← vsrc.word[i].bit[16:31]\nend", "page_found": "Page 308 - 310", "special_registers": "MSR", "programming_notes": "This instruction is used for packing the upper half of each word from two vector registers into a single destination register. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set to 1; otherwise, a Vector Unavailable exception will be raised. The operation requires both source vectors to be aligned on 16-byte boundaries for optimal performance.", "example": "vpkuwum vd, va, vb"}
{"mnemonic": "vpkuhus", "architecture": "PowerISA", "full_name": "Vector Pack Unsigned Halfword Unsigned Saturate", "summary": "Saturates 8 halfwords to 16 unsigned bytes.", "syntax": "vpkuhus vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 142", "hex_opcode": "0x1000008E", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "142", "clean": "142"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Packs and saturates eight unsigned halfword elements from vA and vB into sixteen unsigned bytes in vD, discarding or saturating values that exceed 255. The saturation flag in VSCR is set if any saturation occurred. This VMX instruction operates in saturating mode for unsigned values.", "pseudocode": "for i in 0 to 3:\n  vD[2*i:2*i+7] ← Saturate_UH_to_UB(vA[16*i:16*i+15])\n  vD[2*i+8:2*i+15] ← Saturate_UH_to_UB(vB[16*i:16*i+15])\nif any saturation occurred:\n  VSCR[SAT] ← 1", "page_found": "Page 308", "special_registers": "MSR", "programming_notes": "The vpkuhus instruction is used to pack unsigned halfwords from two source vectors into a destination vector, with saturation applied if the values exceed 8 bits. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The operation processes each halfword from the input vectors and clamps the result to fit within an 8-bit unsigned integer range.", "example": "vpkuhus vd, va, vb"}
{"mnemonic": "vpkshss", "architecture": "PowerISA", "full_name": "Vector Pack Signed Halfword Signed Saturate", "summary": "Packs signed halfwords from two vector registers into a single vector register with signed saturation.", "syntax": "vpkshss vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 462", "hex_opcode": "0x1000018E", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "462", "clean": "462"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The instruction concatenates the contents of VSR[VRA+32] and VSR[VRB+32], then for each integer value i from 0 to 15, it places the signed integer value in halfword element i of the concatenated source into byte element i of VSR[VRT+32] in signed integer format. If the value is greater than 2^7 - 1 or less than -2^7, it saturates and sets SAT to 1.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nvsrc.qword[0] ← VSR[VRA+32]\nvsrc.qword[1] ← VSR[VRB+32]\ndo i = 0 to 15\n    VSR[VRT+32].byte[i] ← si8_CLAMP(EXTS(vsrc.hword[i]))\nend", "special_registers": "VSCR (SAT)", "page_found": "Page 304 - 306", "programming_notes": "This instruction is useful for packing signed halfwords into bytes with saturation. Ensure that the source vectors are correctly aligned and that the vector facility (MSR.VEC) is enabled to avoid exceptions. Be aware of saturation conditions, as they will set the SAT bit in VSCR.", "example": "vpkshss vd, va, vb"}
{"mnemonic": "vpkswss", "architecture": "PowerISA", "full_name": "Vector Pack Signed Word Signed Saturate", "summary": "Packs signed words from two vector registers into a single vector register with signed saturation.", "syntax": "vpkswss vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 526", "hex_opcode": "0x100001CE", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "526", "clean": "526"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The instruction vpkswss packs the contents of VSR[VRA+32] and VSR[VRB+32] into VSR[VRT+32], converting each word to a halfword with signed saturation.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nvsrc.qword[0] ← VSR[VRA+32]\nvsrc.qword[1] ← VSR[VRB+32]\ndo i = 0 to 7\n    VSR[VRT+32].hword[i] ← si16_CLAMP(EXTS(vsrc.word[i]))\nend", "special_registers": "VSCR.SAT", "page_found": "Page 305 - 306", "programming_notes": "This instruction is commonly used for efficiently packing and saturating signed word values into halfwords. Ensure that the vector facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation involves extending each 32-bit word to 64 bits with sign extension, then clamping the result to fit within a 16-bit signed integer range. Be aware of potential saturation effects when dealing with values that exceed the halfword range.", "example": "vpkswss vd, va, vb"}
{"mnemonic": "vupkhsb", "architecture": "PowerISA", "full_name": "Vector Unpack High Signed Byte", "summary": "Unpacks the high signed byte from each element of a vector register into halfwords of another vector register.", "syntax": "vupkhsb vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "0 | VRT | VRB | 18 | LI | AA | LK", "hex_opcode": "0x1000020E", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "526", "clean": "526"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:29 | 30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vupkhsb, the signed integer value in byte element i of VSR[VRB+32] is sign-extended and placed into half-word element i in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 7\n    VSR[VRT+32].hword[i] ←EXTS16(VSR[VRB+32].byte[i])\nend", "page_found": "Page 310 - 312", "special_registers": "MSR", "programming_notes": "This instruction is used to unpack the high signed bytes from one vector register into half-words of another. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector Unavailable exception will be raised. The operation processes each byte element, sign-extending it to a half-word, which can affect the result if the original byte values are negative.", "example": "vupkhsb vd, vb"}
{"mnemonic": "vupkhsh", "architecture": "PowerISA", "full_name": "Vector Unpack High Signed Halfword", "summary": "Unpacks the high signed halfwords from a vector register into a new vector register.", "syntax": "vupkhsh vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 590", "hex_opcode": "0x1000024E", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "590", "clean": "590"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The instruction unpacks the high signed halfwords from VSR[VRB+32] and places them into VSR[VRT+32]. Each halfword is sign-extended to form a word.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nfor each integer value i from 0 to 3 do\n    VSR[VRT+32].word[i] ←EXTS32(VSR[VRB+32].hword[i])", "page_found": "Page 311 - 312", "special_registers": "MSR", "programming_notes": "This instruction is used to extract the high signed halfwords from a vector register and sign-extend them into another vector register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The operation processes each of the four halfwords in the source register, so ensure proper alignment if dealing with specific data structures.", "example": "vupkhsh vd, vb"}
{"mnemonic": "vupklsb", "architecture": "PowerISA", "full_name": "Vector Unpack Low Signed Byte", "summary": "Unpacks low 8 signed bytes to 8 signed halfwords.", "syntax": "vupklsb vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 654", "hex_opcode": "0x1000028E", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "654", "clean": "654"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Unpacks the eight low-order (rightmost) signed bytes from vB into eight signed halfwords in vD, sign-extending each byte to 16 bits. This is a VMX instruction that does not modify condition or status registers.", "pseudocode": "vD[0:15] ← sign_extend(vB[120:127])\nvD[16:31] ← sign_extend(vB[112:119])\nvD[32:47] ← sign_extend(vB[104:111])\nvD[48:63] ← sign_extend(vB[96:103])\nvD[64:79] ← sign_extend(vB[88:95])\nvD[80:95] ← sign_extend(vB[80:87])\nvD[96:111] ← sign_extend(vB[72:79])\nvD[112:127] ← sign_extend(vB[64:71])", "page_found": "Page 311", "special_registers": "MSR", "programming_notes": "This instruction is useful for processing byte data by converting it into signed halfwords, which can be beneficial for operations requiring sign extension. Ensure that the vector facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will occur. The input vector must be properly aligned to avoid unexpected results.", "example": "vupklsb vd, vb"}
{"mnemonic": "vupklsh", "architecture": "PowerISA", "full_name": "Vector Unpack Low Signed Halfword", "summary": "Unpacks low 4 signed halfwords to 4 signed words.", "syntax": "vupklsh vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 718", "hex_opcode": "0x100002CE", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "718", "clean": "718"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Unpacks the four low-order (rightmost) signed halfwords from vB into four signed words in vD, sign-extending each halfword to 32 bits. This is a VMX instruction that does not modify condition or status registers.", "pseudocode": "vD[0:31] ← sign_extend(vB[112:127])\nvD[32:63] ← sign_extend(vB[96:111])\nvD[64:95] ← sign_extend(vB[80:95])\nvD[96:127] ← sign_extend(vB[64:79])", "page_found": "Page 312", "special_registers": "MSR", "programming_notes": "This instruction is used to unpack the low halfwords from a source vector register into a destination vector register, sign-extending each halfword to form words. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation targets the high 128 bits of the vector registers, so ensure that VRB and VRT are correctly set for the desired vector elements.", "example": "vupklsh vd, vb"}
{"mnemonic": "vaddubm", "architecture": "PowerISA", "full_name": "Vector Add Unsigned Byte Modulo", "summary": "Adds the contents of two vector registers and updates the result in another vector register, modulo operation for bytes.", "syntax": "vaddubm vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 0", "hex_opcode": "0x10000000", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "0", "clean": "0"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vaddubm, each byte element of VSR[VRA+32] is added to the corresponding byte element of VSR[VRB+32], and the low-order 8 bits of the result are placed into the corresponding byte element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    src1 ←EXTZ(VSR[VRA+32].byte[i])\n    src2 ←EXTZ(VSR[VRB+32].byte[i])\n    VSR[VRT+32].byte[i] ←CHOP8(src1 + src2)\nend", "programming_notes": "vaddubm can be used for unsigned or signed integers.", "page_found": "Page 350 - 351", "special_registers": "MSR", "example": "vaddubm vd, va, vb"}
{"mnemonic": "vadduhm", "architecture": "PowerISA", "full_name": "Vector Add Unsigned Halfword Modulo", "summary": "Adds 8 halfwords modulo 65536.", "syntax": "vadduhm vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 64", "hex_opcode": "0x10000040", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "64", "clean": "64"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Adds eight pairs of unsigned halfword elements from vA and vB with modulo 65536 arithmetic (overflow wraps around) and stores the results in vD. This VMX instruction does not affect condition or status registers and operates in modulo mode without saturation.", "pseudocode": "vD[0:15] ← (vA[0:15] + vB[0:15]) mod 2^16\nvD[16:31] ← (vA[16:31] + vB[16:31]) mod 2^16\nvD[32:47] ← (vA[32:47] + vB[32:47]) mod 2^16\nvD[48:63] ← (vA[48:63] + vB[48:63]) mod 2^16\nvD[64:79] ← (vA[64:79] + vB[64:79]) mod 2^16\nvD[80:95] ← (vA[80:95] + vB[80:95]) mod 2^16\nvD[96:111] ← (vA[96:111] + vB[96:111]) mod 2^16\nvD[112:127] ← (vA[112:127] + vB[112:127]) mod 2^16", "page_found": "Page 351", "special_registers": "MSR", "programming_notes": "This instruction is commonly used for vectorized addition of unsigned 16-bit integers with modulo behavior, useful in applications like image processing or cryptography. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation processes each halfword element independently, so there are no ordering requirements between elements, but alignment of input vectors to 16-byte boundaries can improve performance.", "example": "vadduhm vd, va, vb"}
{"mnemonic": "vadduwm", "architecture": "PowerISA", "full_name": "Vector Add Unsigned Word Modulo", "summary": "Adds 4 words modulo 2^32.", "syntax": "vadduwm vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 128", "hex_opcode": "0x10000080", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "128", "clean": "128"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Adds each of four unsigned 32-bit words in vA to the corresponding word in vB, with results modulo 2^32 (wrapping on overflow). No status flags are affected; this is a basic VMX/AltiVec arithmetic operation.", "pseudocode": "for i in 0 to 3 do\n  vD[i*32:(i+1)*32-1] ← (vA[i*32:(i+1)*32-1] + vB[i*32:(i+1)*32-1]) mod 2^32", "page_found": "Page 352", "special_registers": "MSR", "programming_notes": "This instruction is commonly used for performing element-wise addition of unsigned 32-bit integers in vector registers. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set to avoid a Vector_Unavailable exception. The operation wraps around using modulo arithmetic, so there's no need to handle overflow separately. This instruction operates at the user privilege level and does not generate exceptions for normal arithmetic operations.", "example": "vadduwm vd, va, vb"}
{"mnemonic": "vaddudm", "architecture": "PowerISA", "full_name": "Vector Add Unsigned Doubleword Modulo", "summary": "Adds 2 doublewords modulo 2^64.", "syntax": "vaddudm vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 192", "hex_opcode": "0x100000C0", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "192", "clean": "192"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Adds each of two unsigned 64-bit doublewords in vA to the corresponding doubleword in vB, with results modulo 2^64 (wrapping on overflow). No status flags are affected; this is a VMX/AltiVec arithmetic operation available on some implementations.", "pseudocode": "for i in 0 to 1 do\n  vD[i*64:(i+1)*64-1] ← (vA[i*64:(i+1)*64-1] + vB[i*64:(i+1)*64-1]) mod 2^64", "page_found": "Page 352", "special_registers": "MSR", "programming_notes": "This instruction is commonly used for performing element-wise addition of two vectors treating each element as a 64-bit unsigned integer. Ensure that the vector registers are properly aligned and that the VEC bit in the MSR register is set to 1 to avoid exceptions. Be cautious of overflow, as the operation uses modulo arithmetic, which wraps around without generating an exception.", "example": "vaddudm vd, va, vb"}
{"mnemonic": "vaddubs", "architecture": "PowerISA", "full_name": "Vector Add Unsigned Byte Saturate", "summary": "Adds the contents of two vector registers and saturates the result if it overflows.", "syntax": "vaddubs vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | VRA | VRB | 512", "hex_opcode": "0x10000200", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "512", "clean": "512"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vaddubs, each byte element in VSR[VRA+32] is added to the corresponding byte element in VSR[VRB+32]. If the sum exceeds 255, it saturates to 255 and sets the SAT field in VSCR.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    src1 ←EXTZ(VSR[VRA+32].byte[i])\n    src2 ←EXTZ(VSR[VRB+32].byte[i])\n    VSR[VRT+32].byte[i] ←ui8_CLAMP(src1 + src2)\nend", "special_registers": "VSCR", "page_found": "Page 352 - 353", "programming_notes": "vaddubs is commonly used for adding unsigned byte elements in vector registers with saturation to handle overflow. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. The operation processes 16 bytes per instruction, and results are clamped to 255 if they exceed this value, setting the SAT field in VSCR accordingly.", "example": "vaddubs vd, va, vb"}
{"mnemonic": "vadduhs", "architecture": "PowerISA", "full_name": "Vector Add Unsigned Halfword Saturate", "summary": "Adds the contents of two vector registers and saturates the result.", "syntax": "vadduhs vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 576", "hex_opcode": "0x10000240", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "576", "clean": "576"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "page_found": "Page 1439 - 1440", "description": "Adds each of eight unsigned 16-bit halfwords in vA to the corresponding halfword in vB, with saturation at the unsigned range [0, 65535]. Any result exceeding 65535 is clamped to 65535; no status flags are affected.", "pseudocode": "for i in 0 to 7 do\n  sum ← vA[i*16:(i+1)*16-1] + vB[i*16:(i+1)*16-1]\n  if sum > 65535 then\n    vD[i*16:(i+1)*16-1] ← 65535\n  else\n    vD[i*16:(i+1)*16-1] ← sum", "special_registers": "MSR", "programming_notes": "The vadduhs instruction is commonly used for adding pairs of unsigned halfwords with saturation, which prevents overflow by clamping results to the maximum representable value. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation processes 8 halfword elements in parallel, and both source registers must be properly aligned for optimal performance.", "example": "vadduhs vd, va, vb"}
{"mnemonic": "vadduws", "architecture": "PowerISA", "full_name": "Vector Add Unsigned Word Saturate", "summary": "Adds the contents of two vector registers and saturates the result if it exceeds 32 bits.", "syntax": "vadduws vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 640", "hex_opcode": "0x10000280", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "640", "clean": "640"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vadduws, each word element in VSR[VRA+32] is added to the corresponding word element in VSR[VRB+32]. If the sum exceeds 2^32 - 1, it saturates to 2^32 - 1 and sets the SAT field in VSCR.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ←EXTZ(VSR[VRA+32].word[i])\n    src2 ←EXTZ(VSR[VRB+32].word[i])\n\n    VSR[VRT+32].word[i] ←ui32_CLAMP(src1 + src2)\nend", "special_registers": "VSCR.SAT", "page_found": "Page 353 - 354", "programming_notes": "vadduws is used for adding unsigned 32-bit integers in vector registers with saturation. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will occur. The operation saturates sums exceeding 2^32 - 1 and sets the SAT field in VSCR to indicate saturation occurred.", "example": "vadduws vd, va, vb"}
{"mnemonic": "vaddsbs", "architecture": "PowerISA", "full_name": "Vector Add Signed Byte Saturate", "summary": "Adds 16 signed bytes with saturation (-128..127).", "syntax": "vaddsbs vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 768", "hex_opcode": "0x10000300", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "768", "clean": "768"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Adds each of sixteen signed 8-bit bytes in vA to the corresponding byte in vB, with saturation at the signed range [-128, 127]. Results below -128 are clamped to -128, and results above 127 are clamped to 127; no status flags are affected.", "pseudocode": "for i in 0 to 15 do\n  sum ← SIGN_EXTEND(vA[i*8:(i+1)*8-1], 9) + SIGN_EXTEND(vB[i*8:(i+1)*8-1], 9)\n  if sum > 127 then\n    vD[i*8:(i+1)*8-1] ← 127\n  else if sum < -128 then\n    vD[i*8:(i+1)*8-1] ← -128\n  else\n    vD[i*8:(i+1)*8-1] ← sum[7:0]", "page_found": "Page 349", "special_registers": "MSR", "programming_notes": "The vaddsbs instruction is commonly used for vectorized addition of signed bytes, ensuring that results are clamped to the 8-bit signed integer range. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. This instruction operates on 16-byte vectors and processes each byte independently.", "example": "vaddsbs vd, va, vb"}
{"mnemonic": "vaddshs", "architecture": "PowerISA", "full_name": "Vector Add Signed Halfword Saturate", "summary": "Adds the contents of two vector registers and saturates the result if it overflows.", "syntax": "vaddshs vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 832", "hex_opcode": "0x10000340", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "832", "clean": "832"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vaddshs, each halfword element in VSR[VRA+32] is added to the corresponding halfword element in VSR[VRB+32]. The result is saturated if it exceeds the range of a signed 16-bit integer.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 7\n    src1 ←EXTS(VSR[VRA+32].hword[i])\n    src2 ←EXTS(VSR[VRB+32].hword[i])\n    VSR[VRT+32].hword[i] ←si16_CLAMP(src1 + src2)\nend", "special_registers": "VSCR (SAT)", "page_found": "Page 349 - 350", "programming_notes": "vaddshs is used for adding signed halfwords with saturation. Ensure that the vector facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will occur. The operation saturates results if they exceed the 16-bit signed integer range, preventing overflow. This instruction operates on elements in the upper half of the VSX registers.", "example": "vaddshs vd, va, vb"}
{"mnemonic": "vaddsws", "architecture": "PowerISA", "full_name": "Vector Add Signed Word Saturate", "summary": "Adds 4 signed words with saturation.", "syntax": "vaddsws vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 896", "hex_opcode": "0x10000380", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "896", "clean": "896"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Adds each of four signed 32-bit words in vA to the corresponding word in vB, with saturation at the signed range [-2^31, 2^31-1]. Results are clamped to the valid signed 32-bit range; no status flags are affected.", "pseudocode": "for i in 0 to 3 do\n  sum ← SIGN_EXTEND(vA[i*32:(i+1)*32-1], 33) + SIGN_EXTEND(vB[i*32:(i+1)*32-1], 33)\n  if sum > 2147483647 then\n    vD[i*32:(i+1)*32-1] ← 2147483647\n  else if sum < -2147483648 then\n    vD[i*32:(i+1)*32-1] ← -2147483648\n  else\n    vD[i*32:(i+1)*32-1] ← sum[31:0]", "page_found": "Page 350", "special_registers": "MSR", "programming_notes": "The vaddsws instruction is useful for adding signed integers with overflow protection, ensuring that results do not exceed the bounds of a 32-bit signed integer. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set to 1 before using this instruction; otherwise, a Vector_Unavailable exception will be raised. Be cautious of potential performance overhead due to saturation checks, which can impact execution speed if many elements overflow.", "example": "vaddsws vd, va, vb"}
{"mnemonic": "vsububm", "architecture": "PowerISA", "full_name": "Vector Subtract Unsigned Byte Modulo", "summary": "Subtracts the contents of two vector registers and updates the result in another vector register using modulo operation for bytes.", "syntax": "vsububm vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1024", "hex_opcode": "0x10000400", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1024", "clean": "1024"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsububm, each byte element in VSR[VRB+32] is subtracted from the corresponding byte element in VSR[VRA+32], and the result is placed into the corresponding byte element of VSR[VRT+32]. The operation uses modulo arithmetic.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    src1 ←EXTZ(VSR[VRA+32].byte[i])\n    src2 ←EXTZ(VSR[VRB+32].byte[i])\n    VSR[VRT+32].byte[i] ←CHOP8(src1 + ¬src2 + 1)\nend", "page_found": "Page 358 - 359", "special_registers": "MSR", "programming_notes": "This instruction performs vectorized byte-wise subtraction with modulo arithmetic. Ensure that the Vector Facility is enabled by checking and setting the appropriate bit in the MSR register. Be cautious of potential overflow issues due to the modulo operation, which can wrap around values. This instruction operates at a privilege level where the Vector Facility is accessible.", "example": "vsububm vd, va, vb"}
{"mnemonic": "vsubuhm", "architecture": "PowerISA", "full_name": "Vector Subtract Unsigned Halfword Modulo", "summary": "Subtracts 8 halfwords modulo 65536.", "syntax": "vsubuhm vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1088", "hex_opcode": "0x10000440", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1088", "clean": "1088"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Subtracts each of eight unsigned 16-bit halfwords in vB from the corresponding halfword in vA, with results modulo 2^16 (wrapping on underflow). No status flags are affected; this is a basic VMX/AltiVec arithmetic operation.", "pseudocode": "for i in 0 to 7 do\n  vD[i*16:(i+1)*16-1] ← (vA[i*16:(i+1)*16-1] - vB[i*16:(i+1)*16-1]) mod 2^16", "page_found": "Page 359", "special_registers": "MSR", "programming_notes": "This instruction is useful for performing element-wise subtraction of unsigned halfwords with modulo 65536, which can be particularly handy in graphics or audio processing where overflow needs to wrap around. Ensure that the vector registers are properly aligned and that the VEC bit in the MSR register is set to enable vector operations. Be cautious of potential performance overhead if used in tight loops without optimization.", "example": "vsubuhm vd, va, vb"}
{"mnemonic": "vsubudm", "architecture": "PowerISA", "full_name": "Vector Subtract Unsigned Doubleword Modulo", "summary": "Subtracts the contents of two vector registers and places the result in a third vector register, modulo operation.", "syntax": "vsubudm vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "000100 | vD | vA | vB | 10011 | 000000", "hex_opcode": "0x100004C0", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1216", "clean": "1216"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "page_found": "Page 1447 - 1448", "description": "Subtracts each of two unsigned 64-bit doublewords in vB from the corresponding doubleword in vA, with results modulo 2^64 (wrapping on underflow). No status flags are affected; this is a VMX/AltiVec arithmetic operation.", "pseudocode": "for i in 0 to 1 do\n  vD[i*64:(i+1)*64-1] ← (vA[i*64:(i+1)*64-1] - vB[i*64:(i+1)*64-1]) mod 2^64", "special_registers": "MSR", "programming_notes": "This instruction is used for performing unsigned doubleword subtraction with modulo arithmetic. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation is performed on each pair of elements from two source vectors, and the results are stored in the destination vector. Be cautious with alignment as it may affect performance or cause exceptions if not properly managed.", "example": "vsubudm vd, va, vb"}
{"mnemonic": "vsububs", "architecture": "PowerISA", "full_name": "Vector Subtract Unsigned Byte Saturate", "summary": "Subtracts the contents of two vector registers and saturates the result to zero if it underflows.", "syntax": "vsububs vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1536", "hex_opcode": "0x10000600", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1536", "clean": "1536"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsububs, each byte element in VSR[VRA+32] is subtracted from the corresponding byte element in VSR[VRB+32]. If the result is less than zero, it saturates to zero and sets the SAT flag in VSCR.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    src1 ←EXTZ(VSR[VRA+32].byte[i])\n    src2 ←EXTZ(VSR[VRB+32].byte[i])\n    VSR[VRT+32].byte[i] ←ui8_CLAMP(src1 + ¬src2 + 1)\nend", "special_registers": "VSCR.SAT", "page_found": "Page 360 - 361", "programming_notes": "Use vsububs for subtracting unsigned byte elements with saturation. Ensure vectors are properly aligned and check VSCR.SAT to verify saturation occurred. Requires vector facility enabled; otherwise, triggers an exception.", "example": "vsububs vd, va, vb"}
{"mnemonic": "vsubuhs", "architecture": "PowerISA", "full_name": "Vector Subtract Unsigned Halfword Saturate", "summary": "Subtracts 8 unsigned halfwords with saturation.", "syntax": "vsubuhs vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1600", "hex_opcode": "0x10000640", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1600", "clean": "1600"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Subtracts each of eight unsigned 16-bit halfwords in vB from the corresponding halfword in vA, with saturation at the unsigned range [0, 65535]. Results below 0 are clamped to 0; no status flags are affected.", "pseudocode": "for i in 0 to 7 do\n  diff ← vA[i*16:(i+1)*16-1] - vB[i*16:(i+1)*16-1]\n  if diff < 0 then\n    vD[i*16:(i+1)*16-1] ← 0\n  else\n    vD[i*16:(i+1)*16-1] ← diff", "page_found": "Page 361", "special_registers": "MSR, VSCR", "programming_notes": "This instruction is useful for performing element-wise unsigned subtraction on vectors with saturation to handle overflow. Ensure that the vector registers are properly aligned and that the VEC bit in the MSR register is set to 1. Be aware of potential performance implications due to saturation handling, which may affect throughput.", "example": "vsubuhs vd, va, vb"}
{"mnemonic": "vsubuws", "architecture": "PowerISA", "full_name": "Vector Subtract Unsigned Word Saturate", "summary": "Subtracts the contents of two vector registers and saturates the result if it underflows.", "syntax": "vsubuws vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1664", "hex_opcode": "0x10000680", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1664", "clean": "1664"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsubuws, each word element in VSR[VRB+32] is subtracted from the corresponding word element in VSR[VRA+32]. If the intermediate result is less than 0, it saturates to 0 and sets the SAT field in VSCR.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ←EXTZ(VSR[VRA+32].word[i])\n    src2 ←EXTZ(VSR[VRB+32].word[i])\n    VSR[VRT+32].word[i] ←ui32_CLAMP(src1 + ¬src2 + 1)\nend", "special_registers": "VSCR.SAT", "page_found": "Page 361 - 362", "programming_notes": "This instruction is commonly used for vectorized unsigned word subtraction with saturation, useful in image processing and other applications requiring bounded arithmetic. Ensure that the Vector Status and Control Register (VSCR) is properly managed to handle saturation flags. The operation saturates underflows to zero, so be cautious of cases where results might wrap around unexpectedly.", "example": "vsubuws vd, va, vb"}
{"mnemonic": "vsubsbs", "architecture": "PowerISA", "full_name": "Vector Subtract Signed Byte Saturate", "summary": "Subtracts 16 signed bytes with saturation.", "syntax": "vsubsbs vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1792", "hex_opcode": "0x10000700", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1792", "clean": "1792"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Subtracts each of 16 signed 8-bit elements in vB from the corresponding element in vA, with saturation to the signed 8-bit range [-128, 127]. If overflow or underflow occurs, the result saturates to the minimum or maximum signed byte value. No condition register fields are affected.", "pseudocode": "for i in 0 to 15 do\n  result ← vA[8*i:8*i+7] - vB[8*i:8*i+7]\n  if result < -128 then vD[8*i:8*i+7] ← -128\n  elsif result > 127 then vD[8*i:8*i+7] ← 127\n  else vD[8*i:8*i+7] ← result", "page_found": "Page 357", "special_registers": "MSR", "programming_notes": "This instruction is commonly used in applications requiring vectorized arithmetic operations on signed bytes, such as image processing or audio signal processing. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation saturates results to prevent overflow or underflow, which can be crucial for maintaining data integrity in certain applications.", "example": "vsubsbs vd, va, vb"}
{"mnemonic": "vsubshs", "architecture": "PowerISA", "full_name": "Vector Subtract Signed Halfword Saturate", "summary": "Subtracts the contents of two vector registers and saturates the result to halfword elements.", "syntax": "vsubshs vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1856", "hex_opcode": "0x10000740", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1856", "clean": "1856"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsubshs, each signed halfword element in VSR[VRB+32] is subtracted from the corresponding signed halfword element in VSR[VRA+32]. The result is saturated if it exceeds the range of a signed 16-bit integer.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 7\n    src1 ←EXTS(VSR[VRA+32].hword[i])\n    src2 ←EXTS(VSR[VRB+32].hword[i])\n    VSR[VRT+32].hword[i] ←si16_CLAMP(src1 + ¬src2 + 1)\nend", "special_registers": "VSCR (SAT)", "page_found": "Page 357 - 358", "programming_notes": "vsubshs is used for subtracting signed halfwords with saturation. Ensure that the vector facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will occur. The operation saturates results if they exceed the signed 16-bit integer range, preventing overflow. This instruction operates on elements in VSR[VRB+32] and VSR[VRA+32], storing the result in VSR[VRT+32].", "example": "vsubshs vd, va, vb"}
{"mnemonic": "vsubsws", "architecture": "PowerISA", "full_name": "Vector Subtract Signed Word Saturate", "summary": "Subtracts 4 signed words with saturation.", "syntax": "vsubsws vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1920", "hex_opcode": "0x10000780", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1920", "clean": "1920"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Subtracts each of 4 signed 32-bit elements in vB from the corresponding element in vA, with saturation to the signed 32-bit range [-2147483648, 2147483647]. If overflow or underflow occurs, the result saturates to the minimum or maximum signed word value. No condition register fields are affected.", "pseudocode": "for i in 0 to 3 do\n  result ← vA[32*i:32*i+31] - vB[32*i:32*i+31]\n  if result < -2147483648 then vD[32*i:32*i+31] ← -2147483648\n  elsif result > 2147483647 then vD[32*i:32*i+31] ← 2147483647\n  else vD[32*i:32*i+31] ← result", "page_found": "Page 358", "special_registers": "MSR, VSCR", "programming_notes": "The vsubsws instruction is useful for performing vectorized subtraction of signed words with saturation, ensuring that results do not overflow. Ensure that the VEC bit in the MSR register is set to enable vector operations; otherwise, a Vector_Unavailable exception will be raised. Be aware that the SAT flag in the VSCR register indicates if any result was saturated during the operation.", "example": "vsubsws vd, va, vb"}
{"mnemonic": "xsaddsp", "architecture": "PowerISA", "full_name": "VSX Scalar Add Single-Precision", "summary": "Adds the contents of two single-precision floating-point numbers and places the result in a double-precision format.", "syntax": "xsaddsp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "18 | XA | XB | 000000 | 000000 | 000000 | 000000 | 000000", "hex_opcode": "0xF0000000", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "0", "clean": "0"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "The instruction adds the contents of src1 and src2, producing a sum with unbounded range and precision. The sum is normalized and rounded to single-precision using the rounding mode specified by RN. The result is placed into doubleword element 0 of VSR[XT] in double-precision format, while doubleword element 1 of VSR[XT] is set to 0.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc1 ← bfp_CONVERT_FROM_BFP64(VSR[VRA+32].dword[0])\nsrc2 ← bfp_CONVERT_FROM_BFP64(VSR[VRB+32].dword[0])\nv ← bfp_ADD(src1, src2)\nrnd ← bfp_ROUND_TO_BFP32(FPSCR.RN, v)\nresult32 ← bfp32_CONVERT_FROM_BFP(rnd)\nresult64 ← bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxisi_flag=1 then SetFX(FPSCR.VXISI)\nif ox_flag=1 then SetFX(FPSCR.OX)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvx_flag ← vxsnan_flag | vxisi_flag\nvex_flag ← FPSCR.VE & vx_flag\nif vex_flag=0 then do\n    VSR[32×TX+T].dword[0] ← result64\n    VSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\n    FPSCR.FPRF ← fprf_CLASS_BFP32(result32)\n    FPSCR.FR ← inc_flag\n    FPSCR.FI ← xx_flag\nend else do\n    FPSCR.FR ← 0b0\n    FPSCR.FI ← 0b0\nend", "special_registers": "FPSCR, VXSNAN, VXISI, OX, UX", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 657 - 658", "example": "xsaddsp vs1, vs2, vs3"}
{"mnemonic": "xssubsp", "architecture": "PowerISA", "full_name": "VSX Scalar Subtract Single-Precision", "summary": "Subtracts the contents of two single-precision floating-point values and places the result in a vector register.", "syntax": "xssubsp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | 8 | AX | BX | TX", "hex_opcode": "0xF0000040", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "8", "clean": "8"}], "length": "32", "bit_positions": "0 | 1:4 | 5:9 | 10:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "The instruction subtracts the double-precision floating-point value in doubleword element 0 of VSR[XB] from the double-precision floating-point value in doubleword element 0 of VSR[XA], negates the result, and adds it to src1. The result is normalized and rounded to single-precision using the rounding mode specified by RN.", "pseudocode": "if src1 is NaN or src2 is NaN then\n    v <- Q(src1) if src1 is SNaN else Q(src2) if src2 is SNaN else dQNaN\nelse if src1 is +Infinity and src2 is +Infinity then\n    v <- +Infinity\n    vxisi_flag <- 1\nelse if src1 is -Infinity and src2 is -Infinity then\n    v <- -Infinity\n    vxisi_flag <- 1\nelse if src1 is NZF and src2 is NZF then\n    v <- S(src1, src2)\nelse if src1 is Zero and src2 is Zero then\n    v <- Rezd\nelse if src1 is +Zero and src2 is -Zero then\n    v <- +Zero\nelse if src1 is -Zero and src2 is +Zero then\n    v <- -Zero\nelse if src1 is NZF and src2 is Zero then\n    v <- src1\nelse if src1 is Zero and src2 is NZF then\n    v <- -src2\nelse if src1 is +Infinity and src2 is NZF then\n    v <- +Infinity\n    vxisi_flag <- 1\nelse if src1 is NZF and src2 is +Infinity then\n    v <- -Infinity\n    vxisi_flag <- 1\nelse if src1 is -Infinity and src2 is NZF then\n    v <- -Infinity\n    vxisi_flag <- 1\nelse if src1 is NZF and src2 is -Infinity then\n    v <- +Infinity\n    vxisi_flag <- 1\nelse if src1 is QNaN or src2 is QNaN then\n    v <- src1 if src1 is QNaN else src2 if src2 is QNaN else dQNaN\nelse if src1 is SNaN or src2 is SNaN then\n    v <- Q(src1) if src1 is SNaN else Q(src2) if src2 is SNaN else dQNaN\n    vxsnan_flag <- 1", "special_registers": "FPSCR, VSR[XT]", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 681 - 682", "example": "xssubsp vs1, vs2, vs3"}
{"mnemonic": "xsmulsp", "architecture": "PowerISA", "full_name": "VSX Scalar Multiply Single-Precision", "summary": "Multiplies two single-precision floating-point numbers and stores the result in a doubleword element of a VSX register.", "syntax": "xsmulsp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 16", "hex_opcode": "0xF0000080", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "16", "clean": "16"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Multiplies the single-precision floating-point value in the lower 32 bits of XA by the single-precision floating-point value in the lower 32 bits of XB, produces a single-precision result, and stores it in the lower 32 bits of XT. The upper 32 bits of XT are set to zero. FPSCR is updated with the exception flags and result class from the operation.", "pseudocode": "SP_A ← XA[32:63]\nSP_B ← XB[32:63]\nproduct ← SPFP_multiply(SP_A, SP_B)\nXT[0:31] ← 0\nXT[32:63] ← product\nFPSCR ← update_fpscr(FPSCR, product)", "special_registers": "FPSCR, VSR[XT]", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 669 - 670", "example": "xsmulsp vs1, vs2, vs3"}
{"mnemonic": "xsdivsp", "architecture": "PowerISA", "full_name": "VSX Scalar Divide Single-Precision", "summary": "Divides the contents of two doubleword elements in VSX registers and places the result in a single-precision format.", "syntax": "xsdivsp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "111100 | XA | XB | XT | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000", "hex_opcode": "0xF00000C0", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "24", "clean": "24"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "The instruction divides the double-precision floating-point value in doubleword element 0 of VSR[XB] by the double-precision floating-point value in doubleword element 0 of VSR[XA]. The quotient is normalized, rounded to single-precision using the rounding mode specified by RN, and placed into doubleword element 0 of VSR[XT] in double-precision format. Doubleword element 1 of VSR[XT] is set to 0.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[0])\nsrc2 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nv    ←bfp_DIVIDE(src1,src2)\nrnd      ←bfp_ROUND_TO_BFP32(FPSCR.RN,v)\nresult32 ←bfp32_CONVERT_FROM_BFP(rnd)\nresult64 ←bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxidi_flag=1 then SetFX(FPSCR.VXIDI)\nif vxzdz_flag=1 then SetFX(FPSCR.VXZDZ)\nvx_flag  ←vxsnan_flag | vxidi_flag | vxzdz_flag\nvex_flag ←FPSCR.VE & vx_flag\nzex_flag ←FPSCR.ZE & zx_flag\nif vex_flag=0 & zex_flag=0 then do\n   VSR[32×TX+T].dword[0] ←result64\n   VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n   FPSCR.FPRF ←fprf_CLASS_BFP32(result32)\n   FPSCR.FR  ←inc_flag\n   FPSCR.FI  ←xx_flag\nelse do\n   FPSCR.FR  ←0b0\n   FPSCR.FI  ←0b0\nend", "special_registers": "FPSCR, VXSNAN, VXIDI, VXZDZ, OX, UX, ZX, XX", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 663 - 664", "example": "xsdivsp vs1, vs2, vs3"}
{"mnemonic": "xsmaxdp", "architecture": "PowerISA", "full_name": "Vector Scalar Maximum Double-Precision Floating-Point", "summary": "Compares the doubleword elements of two vector scalar registers and stores the maximum value in another vector scalar register.", "syntax": "xsmaxdp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 160", "hex_opcode": "0xF0000500", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "160", "clean": "160"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Compares the double-precision floating-point value in XA with the value in XB and stores the maximum (or quiet NaN if either operand is NaN) in XT. Following IEEE 754 semantics, quiet NaNs propagate, and negative zero is considered less than positive zero. FPSCR is updated with the comparison result flags.", "pseudocode": "result ← DPFP_maximum(XA[0:63], XB[0:63])\nXT[0:63] ← result\nFPSCR ← update_fpscr(FPSCR, result)", "special_registers": "FPSCR, VXSNAN", "programming_notes": "This instruction can be used to operate on single-precision source operands. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 794 - 795", "example": "xsmaxdp vs1, vs2, vs3"}
{"mnemonic": "xsmindp", "architecture": "PowerISA", "full_name": "VSX Scalar Minimum Double-Precision", "summary": "Computes the minimum of two double-precision floating-point values and places the result into a vector scalar register.", "syntax": "xsmindp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 168", "hex_opcode": "0xF0000540", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "168", "clean": "168"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Compares the double-precision floating-point value in XA with the value in XB and stores the minimum (or quiet NaN if either operand is NaN) in XT. Following IEEE 754 semantics, quiet NaNs propagate, and negative zero is considered less than positive zero. FPSCR is updated with the comparison result flags.", "pseudocode": "result ← DPFP_minimum(XA[0:63], XB[0:63])\nXT[0:63] ← result\nFPSCR ← update_fpscr(FPSCR, result)", "special_registers": "FPSCR, VXSNAN", "programming_notes": "The minimum of +0 and -0 is -0. The minimum of a QNaN and any value is that value. The minimum of any value and an SNaN is that SNaN converted to a QNaN. FPRF, FR and FI are not modified. If a trap-enabled invalid operation exception occurs, VSR[XT] is not modified. This instruction can be used to operate on single-precision source operands.", "page_found": "Page 802 - 803", "example": "xsmindp vs1, vs2, vs3"}
{"mnemonic": "xssqrtdp", "architecture": "PowerISA", "full_name": "VSX Scalar Square Root Double-Precision", "summary": "Computes the unbounded-precision square root of a double-precision floating-point value and rounds it to double-precision format.", "syntax": "xssqrtdp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "11110001 | 00000000 | 00000000 | 1000", "hex_opcode": "0xF000012C", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "75", "clean": "75"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}, {"name": "VX", "desc": "Target Vector Register"}, {"name": "VB", "desc": "Source Vector Register"}], "extension": "VSX", "description": "The instruction computes the square root of the double-precision floating-point value in doubleword element 0 of VSR[XB]. The result is placed into doubleword element 0 of VSR[XT] in double-precision format, with doubleword element 1 set to 0. The FPRF is updated to reflect the class and sign of the result, and FR and FI are set based on rounding operations.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nv ← bfp_SQUARE_ROOT(src)\nrnd ← bfp_ROUND_TO_BFP64(0b0, FPSCR.RN, v)\nresult ← bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxsqrt_flag=1 then SetFX(FPSCR.VXSQRT)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvx_flag ← vxsnan_flag | vxsqrt_flag\nvex_flag ← FPSCR.VE & vx_flag\nif vex_flag=0 then do\n    VSR[32×TX+T].dword[0] ← result\n    VSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\n    FPSCR.FPRF ← fprf_CLASS_BFP64(result)\n    FPSCR.FR ← inc_flag\n    FPSCR.FI ← xx_flag\nend else do\n    FPSCR.FR ← 0b0\n    FPSCR.FI ← 0b0\nend", "special_registers": "FPSCR (FPRF, FR, FI, FX, XX), VXSNAN, VXSQRT", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 671 - 672", "example": "xssqrtdp vs1, vs3"}
{"mnemonic": "xsabsdp", "architecture": "PowerISA", "full_name": "VSX Scalar Absolute Value Double-Precision", "summary": "Computes the absolute value of a double-precision floating-point number.", "syntax": "xsabsdp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 345", "hex_opcode": "0xF0000564", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "345", "clean": "345"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "The absolute value of the double-precision floating-point operand in doubleword element 0 of VSR[XB] is placed into doubleword element 0 of VSR[XT] in double-precision format. The contents of doubleword element 1 of VSR[XT] are set to 0.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nsrc ←VSR[32×BX+B].dword[0]\nLet XT be the value 32×TX + T.\nVSR[XT].dword[0] ←bfp64_ABSOLUTE(src)\nVSR[XT].dword[1] ←0x0000_0000_0000_0000", "programming_notes": "This instruction can be used to operate on a single-precision source operand.\nPrevious versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 642 - 643", "special_registers": "MSR", "example": "xsabsdp vs1, vs3"}
{"mnemonic": "xsnegdp", "architecture": "PowerISA", "full_name": "VSX Scalar Negate Double-Precision", "summary": "Negates the contents of a double-precision floating-point register and stores the result in another register.", "syntax": "xsnegdp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | T | B | BX | TX | 0 | 0", "hex_opcode": "0xF00005E4", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "361", "clean": "361"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "The instruction negates the value in VSR[32×BX+B].dword[0] (which represents a single-precision floating-point number) and places the result into VSR[32×TX+T].dword[0]. The contents of doubleword element 1 of VSR[XT] are set to 0.", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\nsrc ←VSR[32×BX+B].dword[0]\nVSR[32×TX+T].dword[0] ←bfp64_NEGATE(src)\nVSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000", "programming_notes": "This instruction can be used to operate on a single-precision source operand. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 645 - 646", "special_registers": "MSR", "example": "xsnegdp vs1, vs3"}
{"mnemonic": "xscmpodp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Ordered Double-Precision", "summary": "Compares two double-precision floating-point values and sets the condition register based on the comparison.", "syntax": "xscmpodp BF, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | BF | / | XA | XB | 43", "hex_opcode": "0xF0000158", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "43", "clean": "43"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Performs an ordered comparison of the double-precision floating-point values in XA and XB, setting the specified CR field (BF) with the comparison result: less-than, greater-than, equal, or unordered. If either operand is a signaling NaN, an invalid operation exception is raised in FPSCR. Quiet NaNs result in an unordered condition.", "pseudocode": "if isnan(XA[0:63]) | isnan(XB[0:63]) then\n  FPSCR[VXVC] ← 1\n  CR[BF*4:BF*4+3] ← 0001\nelsif XA[0:63] < XB[0:63] then\n  CR[BF*4:BF*4+3] ← 1000\nelsif XA[0:63] > XB[0:63] then\n  CR[BF*4:BF*4+3] ← 0100\nelse\n  CR[BF*4:BF*4+3] ← 0010", "special_registers": "CR, FPSCR, VXSNAN, VXVC", "programming_notes": "This instruction can be used to operate on single-precision source operands.", "page_found": "Page 778 - 779", "example": "xscmpodp cr0, vs2, vs3"}
{"mnemonic": "xscmpudp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Unordered Double-Precision", "summary": "Compares two double-precision floating-point values and sets the condition register based on the comparison.", "syntax": "xscmpudp BF, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "111100 | XA | XB | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000", "hex_opcode": "0xF0000118", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "35", "clean": "35"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "VS32", "desc": "Target Vector Register"}], "extension": "VSX", "description": "The instruction compares the double-precision floating-point value in doubleword element 0 of VSR[XA] with the double-precision floating-point value in doubleword element 0 of VSR[XB]. The result is placed into CR field BF and the FPCC. If either operand is a NaN, VXSNAN is set.", "pseudocode": "if 'xscmpudp' then\n    src1 <- VSR[XA][0]\n    src2 <- VSR[XB][0]\n    cc <- C(src1, src2)\n    FPCC <- cc\n    CR[BF] <- cc\n    if vxsnan_flag then\n        fx(VXSNAN)\n        if VE and not ignore-exception mode then\n            error()\n", "special_registers": "CR, FPSCR", "programming_notes": "This instruction can be used to operate on single-precision source operands. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register.", "page_found": "Page 781 - 782", "example": "xscmpudp cr0, vs2, vs3"}
{"mnemonic": "vsl", "architecture": "PowerISA", "full_name": "Vector Shift Left", "summary": "Shifts the contents of a vector register left by a specified number of bits.", "syntax": "vsl vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 452", "hex_opcode": "0x100001C4", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "452", "clean": "452"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift Count"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Shift Amount Vector Register"}], "extension": "VMX (AltiVec)", "description": "The contents of VSR[VRA+32] are shifted left by the number of bits specified in bits 125:127 of VSR[VRB+32]. Bits shifted out of bit 0 are lost, and zeros are supplied to the vacated bits on the right. The result is placed into VSR[VRT+32], except if, for any byte element in VSR[VRB+32], the low-order 3 bits are not equal to the shift amount, then VSR[VRT+32] is undefined.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsh ←VSR[VRB+32].bit[125:127]\nt ←1\ndo i = 0 to 14\n    t ←t & (VSR[VRB+32].byte[i].bit[5:7] = sh)\nend\nif t=1 then\n    VSR[VRT+32] ←VSR[VRA+32] << sh\nelse\n    VSR[VRT+32] ←UNDEFINED", "page_found": "Page 325 - 326", "special_registers": "MSR", "programming_notes": "The vsl instruction shifts the contents of a vector register left by a specified number of bits. Ensure that the shift amount is consistent across all byte elements in the control vector to avoid undefined results. This instruction requires the Vector Facility (MSR.VEC) to be enabled; otherwise, it will raise an exception.", "example": "vsl vd, va, vb"}
{"mnemonic": "vsr", "architecture": "PowerISA", "full_name": "Vector Shift Right", "summary": "Shifts vector right by octet count in vB.", "syntax": "vsr vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 708", "hex_opcode": "0x100002C4", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "708", "clean": "708"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift Count"}], "extension": "VMX (AltiVec)", "description": "Shifts the 128-bit value in vA right by the number of octets (bytes) specified in the low 5 bits of vB, filling vacated positions on the left with zeros. The shift amount is taken from bits 123-127 of vB (the low-order 5 bits). No condition register fields are affected.", "page_found": "Page 290", "programming_notes": "The vsr instruction is commonly used for bit manipulation in vector operations, where each element of the vector is shifted right by a number of bits specified in a control register. Ensure that the control register contains valid shift amounts to avoid unexpected results. This operation does not require any specific privilege level and will not generate exceptions unless there are alignment issues with the vector data.", "pseudocode": "shift_count ← vB[123:127]\nif shift_count > 16 then shift_count ← 16\nvD ← vA >> (shift_count * 8)", "example": "vsr vd, va, vb"}
{"mnemonic": "vslo", "architecture": "PowerISA", "full_name": "Vector Shift Left by Octet", "summary": "Shifts the contents of a vector register left by a specified number of bytes.", "syntax": "vslo vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | VRA | VRB | 1036", "hex_opcode": "0x1000040C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1036", "clean": "1036"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift Count"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Shift Count Vector Register"}, {"name": "VZ", "desc": "Target Vector Register"}, {"name": "VX", "desc": "Source Vector Register"}, {"name": "VY", "desc": "Shift Count Vector Register"}], "extension": "VMX (AltiVec)", "description": "The contents of VSR[VRA+32] are shifted left by the number of bytes specified in bits 121:124 of VSR[VRB+32]. Bytes shifted out of byte 0 are lost, and zeros are supplied to the vacated bytes on the right. The result is placed into VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nshb ← VSR[VRB+32].bit[121:124] << 3\nVSR[VRT+32] ← VSR[VRA+32] << shb", "page_found": "Page 326 - 328", "programming_notes": "A pair of these instructions, specifying the same shift count register, can be used to shift the contents of a VSR left or right by the number of bits (0-127) specified in the shift count register.", "special_registers": "MSR", "example": "vslo vd, va, vb"}
{"mnemonic": "vsro", "architecture": "PowerISA", "full_name": "Vector Shift Right by Octet", "summary": "Shifts vector right by byte count.", "syntax": "vsro vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1100", "hex_opcode": "0x1000044C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1100", "clean": "1100"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift Count"}], "extension": "VMX (AltiVec)", "description": "Shifts the 128-bit value in vA right by the number of octets (bytes) specified in the low 4 bits of vB, filling vacated positions on the left with zeros. This instruction is similar to vsr but uses only the low 4 bits of the shift count, limiting the shift to 0-15 bytes. No condition register fields are affected.", "pseudocode": "shift_count ← vB[124:127]\nvD ← vA >> (shift_count * 8)", "page_found": "Page 327", "special_registers": "MSR", "programming_notes": "The vsro instruction shifts the contents of a vector register right by a specified number of bytes. Ensure that the shift amount is within the valid range (0-15) to avoid undefined behavior. This instruction requires the VEC bit in the MSR to be set; otherwise, it will raise an exception. Be cautious with alignment as shifting by byte boundaries can lead to unexpected results if not handled properly.", "example": "vsro vd, va, vb"}
{"mnemonic": "vrlb", "architecture": "PowerISA", "full_name": "Vector Rotate Left Byte", "summary": "Rotates each byte of the source vector left by a specified number of bits.", "syntax": "vrlb vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 4", "hex_opcode": "0x10000004", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "4", "clean": "4"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Rotate Count"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Shift Control Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vrlb, each byte in VSR[VRA+32] is rotated left by the number of bits specified in the low-order 3 bits of the corresponding byte in VSR[VRB+32]. The result is stored in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 7\n    src ← VSR[VRA+32].byte[i]\n    sh  ← VSR[VRB+32].byte[i].bit[5:7]\n    VSR[VRT+32].byte[i] ← src <<< sh", "page_found": "Page 430 - 431", "special_registers": "MSR", "programming_notes": "The vrlb instruction rotates each byte in the source vector left by a specified number of bits determined by another vector. Ensure that the Vector Facility is enabled (MSR.VEC=1) to avoid exceptions. The shift amount is derived from the high-order 3 bits of each byte in the second vector, so be cautious with bit manipulation to achieve the desired rotation.", "example": "vrlb vd, va, vb"}
{"mnemonic": "vrlh", "architecture": "PowerISA", "full_name": "Vector Rotate Left Halfword", "summary": "Rotates each halfword left.", "syntax": "vrlh vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 68", "hex_opcode": "0x10000044", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "68", "clean": "68"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Rotate Count"}], "extension": "VMX (AltiVec)", "description": "Rotates each of the eight 16-bit elements in vA left by the number of bits specified by the corresponding 16-bit element in vB. The rotate count is masked to bits 0-3 (modulo 16). No condition register or status flags are affected.", "pseudocode": "for i in 0 to 7 do\n  shift_amount ← vB[i*16+0:i*16+15] & 0xF\n  vD[i*16+0:i*16+15] ← ROTL16(vA[i*16+0:i*16+15], shift_amount)", "page_found": "Page 431", "special_registers": "MSR", "programming_notes": "The vrlh instruction is commonly used for bit manipulation tasks that require rotating halfwords within a vector. Ensure that the source and destination vectors are properly aligned to avoid data corruption. This instruction operates at user privilege level, but if MSR.VEC is not set, it will raise a Vector_Unavailable exception. Performance may vary based on the specific implementation and the alignment of the input vectors.", "example": "vrlh vd, va, vb"}
{"mnemonic": "vrlw", "architecture": "PowerISA", "full_name": "Vector Rotate Left Word", "summary": "Rotates each word element of the source vector left by a specified number of bits.", "syntax": "vrlw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | VRA | VRB | 132", "hex_opcode": "0x10000084", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "132", "clean": "132"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Rotate Count"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vrlw, each word element in VSR[VRA+32] is rotated left by the number of bits specified in the low-order 5 bits of the corresponding word element in VSR[VRB+32]. The result is placed into the corresponding word element in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ← VSR[VRA+32].word[i]\n    sh ← VSR[VRB+32].word[i].bit[27:31]\n    VSR[VRT+32].word[i] ← src1 <<< sh", "page_found": "Page 431 - 432", "special_registers": "MSR", "programming_notes": "The vrlw instruction is commonly used for performing bitwise rotations on vector elements. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set to 1; otherwise, a Vector_Unavailable exception will be raised. The shift amount is determined by the low-order 5 bits of each word element in the second source vector register (VRB). Be cautious with alignment as unaligned access can lead to performance penalties or exceptions depending on the system configuration.", "example": "vrlw vd, va, vb"}
{"mnemonic": "vrld", "architecture": "PowerISA", "full_name": "Vector Rotate Left Doubleword", "summary": "Rotates each doubleword left.", "syntax": "vrld vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 196", "hex_opcode": "0x100000C4", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "196", "clean": "196"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Rotate Count"}], "extension": "VMX (AltiVec)", "description": "Rotates each of the two 64-bit elements in vA left by the number of bits specified by the corresponding 64-bit element in vB. The rotate count is masked to bits 0-5 (modulo 64). No condition register or status flags are affected.", "pseudocode": "for i in 0 to 1 do\n  shift_amount ← vB[i*64+0:i*64+63] & 0x3F\n  vD[i*64+0:i*64+63] ← ROTL64(vA[i*64+0:i*64+63], shift_amount)", "page_found": "Page 432", "special_registers": "MSR", "programming_notes": "The vrld instruction is commonly used for bit manipulation tasks that require rotating doublewords within a vector. Ensure that the source vectors are properly aligned to avoid unexpected behavior. This instruction operates at user privilege level and will raise an exception if the VEC bit in the MSR register is not set.", "example": "vrld vd, va, vb"}
{"mnemonic": "daddq", "architecture": "PowerISA", "full_name": "Decimal Add Quad-Precision", "summary": "Adds two 128-bit DFP numbers.", "syntax": "daddq vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | vA | vB | 2 | /", "hex_opcode": "0xFC000004", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "2", "clean": "2"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "Decimal Floating-Point", "description": "Adds two 128-bit Decimal Floating-Point (DFP) values held in vA and vB, storing the result in vD. The operation follows DFP semantics, respecting the current rounding mode in FPSCR and producing an exact result or DFP overflow/underflow exception as appropriate. The FPSCR is updated with exception flags.", "page_found": "Page 240", "special_registers": "FPSCR", "programming_notes": "The daddq instruction is used for adding two quad-precision decimal numbers. Ensure that the operands are correctly aligned to avoid precision errors. Be aware of potential overflow conditions, which will be indicated in the FPSCR register. This operation requires floating-point privilege level access.", "pseudocode": "vD ← vA + vB (DFP arithmetic)\nFPSCR ← updated with exception flags (XX, ZX, UX, OX, IE)", "example": "daddq vd, va, vb"}
{"mnemonic": "dsubq", "architecture": "PowerISA", "full_name": "Decimal Subtract Quad-Precision", "summary": "Subtracts two 128-bit DFP numbers.", "syntax": "dsubq vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | vA | vB | 514 | /", "hex_opcode": "0xFC000404", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "514", "clean": "514"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "Decimal Floating-Point", "description": "Subtracts the 128-bit Decimal Floating-Point value in vB from vA, storing the result in vD. The operation follows DFP semantics, respecting the current rounding mode in FPSCR and producing an exact result or DFP exception as appropriate. The FPSCR is updated with exception flags.", "pseudocode": "vD ← vA - vB (DFP arithmetic)\nFPSCR ← updated with exception flags (XX, ZX, UX, OX, IE)", "page_found": "Page 241", "special_registers": "FPSCR", "programming_notes": "The dsubq instruction is used for precise decimal subtraction of quad-precision numbers. Ensure that the operands are correctly aligned and formatted to avoid precision loss. The result's rounding mode is controlled by the FPSCR register, so verify DRN settings before execution. This operation requires floating-point privilege level.", "example": "dsubq vd, va, vb"}
{"mnemonic": "dmulq", "architecture": "PowerISA", "full_name": "Decimal Multiply Quad-Precision", "summary": "Multiplies two 128-bit DFP numbers.", "syntax": "dmulq vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | vA | vB | 34 | /", "hex_opcode": "0xFC000044", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "34", "clean": "34"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "Decimal Floating-Point", "description": "Multiplies two 128-bit Decimal Floating-Point values in vA and vB, storing the result in vD. The operation follows DFP semantics, respecting the current rounding mode in FPSCR. The result may be rounded or may signal overflow, underflow, or inexact exception. The FPSCR is updated with exception flags.", "pseudocode": "vD ← vA × vB (DFP arithmetic)\nFPSCR ← updated with exception flags (XX, ZX, UX, OX, IE)", "page_found": "Page 242", "special_registers": "FPSCR", "programming_notes": "The dmulq instruction is used for multiplying two decimal floating-point numbers with quad-precision. Ensure that the operands are correctly aligned and formatted as DFP. The result's precision is controlled by the FPSCR register, specifically the DRN bits. Be aware of potential rounding errors based on the target format precision.", "example": "dmulq vd, va, vb"}
{"mnemonic": "ddivq", "architecture": "PowerISA", "full_name": "Decimal Divide Quad-Precision", "summary": "Divides two 128-bit DFP numbers.", "syntax": "ddivq vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | vA | vB | 546 | /", "hex_opcode": "0xFC000444", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "546", "clean": "546"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "Decimal Floating-Point", "description": "Divides the 128-bit Decimal Floating-Point value in vA by the value in vB, storing the result in vD. The operation follows DFP semantics, respecting the current rounding mode in FPSCR. Division by zero signals the ZX exception, and inexact results are rounded according to FPSCR[RN]. The FPSCR is updated with exception flags.", "pseudocode": "vD ← vA ÷ vB (DFP arithmetic)\nFPSCR ← updated with exception flags (XX, ZX, UX, OX, IE)", "page_found": "Page 243", "special_registers": "FPSCR", "programming_notes": "The ddivq instruction is used for performing decimal division with quad-precision operands. Ensure that the operands are correctly aligned and formatted to avoid precision loss. The result rounding mode is controlled by the DRN field in the FPSCR register, so verify this setting before execution. This instruction operates at a privilege level that allows access to floating-point registers and may raise exceptions if operands are invalid or division by zero occurs.", "example": "ddivq vd, va, vb"}
{"mnemonic": "dcmpuq", "architecture": "PowerISA", "full_name": "Decimal Compare Unordered Quad-Precision", "summary": "Compares two 128-bit DFP numbers (Non-signaling).", "syntax": "dcmpuq BF, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | / | vA | vB | 642 | /", "hex_opcode": "0xFC000504", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "642", "clean": "642"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "Decimal Floating-Point", "description": "Compares two 128-bit Decimal Floating-Point values in vA and vB without signaling an exception on QNaN operands (unordered comparison). The result is written to the condition register field BF as: LT, GT, EQ, or UN (unordered). NaN comparisons result in UN, and FPSCR[VXSNAN] is not set unless SNaN is present.", "special_registers": "FPSCR", "programming_notes": "Use dcmpuq for comparing two DFP operands while handling unordered cases, which include NaNs. Ensure that the operands are properly aligned and check the FPSCR for exception conditions after execution.", "pseudocode": "if vA is NaN or vB is NaN then\n  CR[BF] ← 0b0001 (UN)\nelse if vA < vB then\n  CR[BF] ← 0b1000 (LT)\nelse if vA > vB then\n  CR[BF] ← 0b0100 (GT)\nelse\n  CR[BF] ← 0b0010 (EQ)", "example": "dcmpuq cr0, va, vb"}
{"mnemonic": "dcmpoq", "architecture": "PowerISA", "full_name": "Decimal Compare Ordered Quad-Precision", "summary": "Compares two DFP values and sets the condition register based on their order.", "syntax": "dcmpoq BF, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | / | vA | vB | 130 | /", "hex_opcode": "0xFC000104", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "130", "clean": "130"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "extension": "Decimal Floating-Point", "pseudocode": "if vA is SNaN or vB is SNaN then\n  FPSCR[VXSNAN] ← 1\nif vA is NaN or vB is NaN then\n  CR[BF] ← 0b0001 (UN)\nelse if vA < vB then\n  CR[BF] ← 0b1000 (LT)\nelse if vA > vB then\n  CR[BF] ← 0b0100 (GT)\nelse\n  CR[BF] ← 0b0010 (EQ)", "special_registers": "CR0, FPSCR", "page_found": "Page 1392 - 1393", "description": "Compares two 128-bit Decimal Floating-Point values in vA and vB with signaling behavior on NaN (ordered comparison). The result is written to the condition register field BF as: LT, GT, EQ, or UN (unordered). If either operand is QNaN, the VXSNAN exception is raised and FPSCR[VE] or FPSCR[FEX] handling applies; SNaN always signals VXSNAN.", "programming_notes": "The dcmpoq instruction is used to compare two quad-precision decimal floating-point numbers. It sets the CR0 register field to indicate whether the first operand is less than, greater than, or equal to the second operand. Ensure that operands are properly aligned and that the FPSCR (Floating Point Status and Control Register) is correctly configured for accurate comparison results.", "example": "dcmpoq cr0, va, vb"}
{"mnemonic": "dquaq", "architecture": "PowerISA", "full_name": "Decimal Quantize Quad-Precision", "summary": "Adjusts exponent of 128-bit DFP number.", "syntax": "dquaq vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | vA | vB | 66 | /", "hex_opcode": "0xFC000006", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "66", "clean": "66"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source"}, {"name": "vB", "desc": "Reference"}], "extension": "Decimal Floating-Point", "description": "Quantizes a 128-bit decimal floating-point number in vA to match the exponent of the reference value in vB, producing a result in vD. The operation adjusts the exponent and coefficient of the source operand while preserving the value's significance. Rounding is performed if necessary according to the current DFP rounding mode in FPSCR. The instruction is part of the Decimal Floating-Point extension.", "pseudocode": "vD ← QuantizeDFP128(vA, vB, FPSCR[RN])", "page_found": "Page 251", "special_registers": "FPSCR", "programming_notes": "The dquaq instruction is used to convert and round a decimal floating-point number to a specified exponent. Ensure the operand is correctly aligned and check the FPSCR for rounding mode settings. This instruction operates at the problem state privilege level and may raise exceptions if overflow occurs or if invalid operands are provided.", "example": "dquaq vd, va, vb"}
{"mnemonic": "drrndq", "architecture": "PowerISA", "full_name": "Decimal Reround Quad-Precision", "summary": "Rerounds a 128-bit DFP number to fewer digits.", "syntax": "drrndq vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | vA | vB | 98 | /", "hex_opcode": "0xFC000046", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "98", "clean": "98"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source"}, {"name": "vB", "desc": "Control"}], "extension": "Decimal Floating-Point", "description": "Rerounds a 128-bit decimal floating-point number in vA to a precision specified by control information in vB, storing the result in vD. This operation reduces the number of significant digits while adjusting the exponent accordingly. Rounding uses the mode specified in FPSCR[RN]. The instruction is part of the Decimal Floating-Point extension.", "page_found": "Page 253", "special_registers": "FPSCR", "programming_notes": "The drrndq instruction is used for precise decimal arithmetic operations, particularly useful in financial applications where exact decimal representation is crucial. Ensure that the source operands (FRA and FRB) are correctly aligned and formatted as quad-precision decimals to avoid precision loss. The rounding mode control (RMC) should be set according to the desired rounding behavior, such as round-to-nearest or truncate. This instruction operates at a privilege level that allows access to floating-point operations, and it may raise exceptions if operands are out of range or if there are invalid operations.", "pseudocode": "vD ← ReroundDFP128(vA, vB, FPSCR[RN])", "example": "drrndq vd, va, vb"}
{"mnemonic": "dcffixq", "architecture": "PowerISA", "full_name": "Decimal Convert From Fixed Quad-Precision", "summary": "Converts 64-bit integer to 128-bit DFP.", "syntax": "dcffixq vD, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | 0 | vB | 802 | /", "hex_opcode": "0xFC000642", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "802", "clean": "802"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "Decimal Floating-Point", "special_registers": "FPSCR", "description": "Converts a 64-bit signed fixed-point integer from vB into a 128-bit decimal floating-point number, storing the result in vD. The integer is interpreted as an exact value with an implied exponent of zero. No rounding is required since the conversion is exact. The instruction is part of the Decimal Floating-Point extension.", "pseudocode": "vD ← ConvertFromFixedDFP128(vB[0:63])", "example": "dcffixq vd, vb"}
{"mnemonic": "dctfixq", "architecture": "PowerISA", "full_name": "Decimal Convert To Fixed Quad-Precision", "summary": "Converts 128-bit DFP to 64-bit integer.", "syntax": "dctfixq vD, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | 0 | vB | 290 | /", "hex_opcode": "0xFC000244", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "290", "clean": "290"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "Decimal Floating-Point", "description": "Converts a 128-bit decimal floating-point number from vB into a 64-bit signed integer, storing the result in vD. The conversion rounds toward zero (truncates). If the DFP value is out of range for a 64-bit integer or is NaN, the result is undefined and FPSCR status flags may be set. The instruction is part of the Decimal Floating-Point extension.", "pseudocode": "vD ← ConvertToFixedDFP128(vB, FPSCR[RN])", "page_found": "Page 264", "special_registers": "FPSCR", "programming_notes": "The dctfixq instruction is used to convert a DFP Extended value to a 64-bit signed integer. It rounds the result and preserves the sign of the source operand. If the source is zero, the result is explicitly set to +0. This instruction operates at the FPSCR privilege level and may raise exceptions based on rounding modes or overflow conditions.", "example": "dctfixq vd, vb"}
{"mnemonic": "dxexq", "architecture": "PowerISA", "full_name": "Decimal Extract Exponent Quad-Precision", "summary": "Extracts exponent from 128-bit DFP.", "syntax": "dxexq vD, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | 0 | vB | 354 | /", "hex_opcode": "0xFC0002C4", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "354", "clean": "354"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "Decimal Floating-Point", "description": "Extracts the exponent field from a 128-bit decimal floating-point number in vB and stores it as a 64-bit signed integer in vD. For normal numbers, the result is the biased exponent; for special values (zero, infinity, NaN), the result follows the DFP specification. The instruction is part of the Decimal Floating-Point extension.", "page_found": "Page 267", "special_registers": "FPSCR", "programming_notes": "The dxexq instruction is used to extract the biased exponent from a quad-precision decimal floating-point number. Ensure the source operand is properly aligned, as misalignment can lead to exceptions. This operation requires FPSCR (Floating Point Status and Control Register) to be correctly set for proper rounding modes and exception handling.", "pseudocode": "vD ← ExponentExtractDFP128(vB)", "example": "dxexq vd, vb"}
{"mnemonic": "diexq", "architecture": "PowerISA", "full_name": "Decimal Insert Exponent Quad-Precision", "summary": "Inserts exponent into 128-bit DFP.", "syntax": "diexq vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | vA | vB | 866 | /", "hex_opcode": "0xFC0006C4", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "866", "clean": "866"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Coeff"}, {"name": "vB", "desc": "Exp"}], "extension": "Decimal Floating-Point", "description": "Inserts a 64-bit signed exponent from vB into a 128-bit DFP coefficient from vA, producing a complete 128-bit DFP number in vD. The coefficient in vA is interpreted as having an exponent of zero, and the exponent from vB replaces it. The resulting value may be a normal number, zero, or special value depending on the inputs. The instruction is part of the Decimal Floating-Point extension.", "page_found": "Page 267", "special_registers": "FPSCR", "programming_notes": "The `diexq` instruction is used to insert the biased exponent from one decimal floating-point (DFP) operand into another. Ensure both operands are properly aligned and that the FPSCR register is correctly configured for desired rounding modes and exception handling. This instruction operates at the problem state privilege level, so ensure your program has the appropriate privileges. Be cautious of potential exceptions such as invalid operations or overflow, which may require additional error handling code.", "pseudocode": "vD ← InsertExponentDFP128(vA, vB)", "example": "diexq vd, va, vb"}
{"mnemonic": "denbcdq", "architecture": "PowerISA", "full_name": "Decimal Encode BCD Quad-Precision", "summary": "Encodes 128-bit DFP to BCD.", "syntax": "denbcdq vD, vB, S", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | S | vB | 834 | /", "hex_opcode": "0xFC000684", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "S", "clean": "S"}, {"raw": "vB", "clean": "vB"}, {"raw": "834", "clean": "834"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "S", "desc": "Sign"}], "extension": "Decimal Floating-Point", "description": "Encodes a 128-bit decimal floating-point number from vB into binary-coded decimal (BCD) format, storing the result in vD. The sign field S specifies how the sign is encoded. The instruction converts the DFP representation to BCD digits with appropriate sign handling. The instruction is part of the Decimal Floating-Point extension.", "pseudocode": "vD ← EncodeBCDDFP128(vB, S)", "special_registers": "FPSCR", "programming_notes": "The denbcdq instruction is used to convert BCD values into DPD format, which is essential for handling high-precision decimal arithmetic. Ensure that the input data is correctly aligned and formatted as BCD before encoding. This instruction operates at user privilege level and may raise exceptions if the input data contains invalid BCD values.", "example": "denbcdq vd, vb, 0"}
{"mnemonic": "ddedpdq", "architecture": "PowerISA", "full_name": "Decimal Decode DPD Quad-Precision", "summary": "Decodes BCD to 128-bit DFP.", "syntax": "ddedpdq vD, vB, SP", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | SP | vB | 322 | /", "hex_opcode": "0xFC000284", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "SP", "clean": "SP"}, {"raw": "vB", "clean": "vB"}, {"raw": "322", "clean": "322"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "SP", "desc": "Sign"}], "extension": "Decimal Floating-Point", "description": "Decodes a binary-coded decimal (BCD) value from vB into a 128-bit decimal floating-point number, storing the result in vD. The sign field SP specifies how to interpret the sign encoding in the BCD representation. The instruction converts BCD digits to the internal DFP representation. The instruction is part of the Decimal Floating-Point extension.", "pseudocode": "vD ← DecodeDFP128(vB, SP)", "special_registers": "FPSCR", "programming_notes": "The ddedpdq instruction is used to convert a DPD-encoded decimal value from one register to BCD format in another. Ensure that the source register contains valid DPD data; otherwise, the result will be undefined. This operation does not require any specific privilege level but may alter the FPSCR register based on the conversion outcome.", "example": "ddedpdq vd, vb, 0"}
{"mnemonic": "vspltb", "architecture": "PowerISA", "full_name": "Vector Splat Byte", "summary": "Splat a byte from one vector element into all elements of another vector.", "syntax": "vspltb vD, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "1001010 | VRT | UIM | VRB", "hex_opcode": "0x1000020C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "524", "clean": "524"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "UIM", "desc": "Index"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Splats (replicates) a single byte element from vB across all 16 byte elements of vD. The byte element selected is determined by the 4-bit unsigned immediate UIM (where UIM=0 selects byte 0, UIM=15 selects byte 15 in big-endian order). No status flags are affected. This is a VMX/AltiVec instruction.", "pseudocode": "index ← UIM\nvD ← replicate(vB[index*8:index*8+7] to all 16 byte positions)", "programming_notes": "The Vector Splat instructions can be used in preparation for performing arithmetic for which one source vector is to consist of elements that all have the same value (e.g., multiplying all elements of a VSR by a constant).", "page_found": "Page 318 - 320", "special_registers": "MSR", "example": "vspltb vd, vb, uim"}
{"mnemonic": "vsplth", "architecture": "PowerISA", "full_name": "Vector Splat Halfword", "summary": "Duplicates a halfword element across the vector.", "syntax": "vsplth vD, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | UIM | vB | 588", "hex_opcode": "0x1000024C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "588", "clean": "588"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "UIM", "desc": "Index"}], "extension": "VMX (AltiVec)", "description": "Splats (replicates) a single halfword element from vB across all 8 halfword elements of vD. The halfword element selected is determined by the 3-bit unsigned immediate UIM (where UIM=0 selects halfword 0, UIM=7 selects halfword 7 in big-endian order). No status flags are affected. This is a VMX/AltiVec instruction.", "pseudocode": "index ← UIM\nvD ← replicate(vB[index*16:index*16+15] to all 8 halfword positions)", "page_found": "Page 319", "programming_notes": "The vsplth instruction is commonly used when you need to replicate a specific halfword from a source vector into all elements of a destination vector, which is useful for operations requiring uniform operands. Ensure the specified bit position (b) is within the valid range to avoid undefined behavior. This instruction operates at user privilege level and does not generate exceptions under normal circumstances.", "example": "vsplth vd, vb, uim"}
{"mnemonic": "vspltisb", "architecture": "PowerISA", "full_name": "Vector Splat Immediate Signed Byte", "summary": "Splat an immediate signed byte value into all elements of a vector register.", "syntax": "vspltisb vD, SIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | SIM | 00000 | 780", "hex_opcode": "0x1000030C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "SIM", "clean": "SIM"}, {"raw": "00000", "clean": "00000"}, {"raw": "780", "clean": "780"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "SIM", "desc": "Immediate"}, {"name": "VRT", "desc": "Target Vector Register"}], "extension": "VMX (AltiVec)", "description": "Splats a 5-bit signed immediate value into all 16 byte elements of vD, sign-extended to 8 bits per byte. The immediate SIM is a signed 5-bit value (range -16 to 15). No status flags are affected. This is a VMX/AltiVec instruction.", "pseudocode": "value ← sign_extend(SIM, 8)\nvD ← replicate(value to all 16 byte positions)", "page_found": "Page 320 - 322", "special_registers": "MSR", "programming_notes": "This instruction is used to fill a vector register with the sign-extended value of an 8-bit immediate. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise a Vector Unavailable exception. The immediate value is sign-extended and replicated across all elements of the target vector register.", "example": "vspltisb vd, 4"}
{"mnemonic": "vspltish", "architecture": "PowerISA", "full_name": "Vector Splat Immediate Signed Halfword", "summary": "Fills vector with immediate 5-bit signed value.", "syntax": "vspltish vD, SIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | SIM | 00000 | 844", "hex_opcode": "0x1000034C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "SIM", "clean": "SIM"}, {"raw": "00000", "clean": "00000"}, {"raw": "844", "clean": "844"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "SIM", "desc": "Immediate"}], "extension": "VMX (AltiVec)", "description": "Splats a 5-bit signed immediate value into all 8 halfword elements of vD, sign-extended to 16 bits per halfword. The immediate SIM is a signed 5-bit value (range -16 to 15). No status flags are affected. This is a VMX/AltiVec instruction.", "pseudocode": "value ← sign_extend(SIM, 16)\nvD ← replicate(value to all 8 halfword positions)", "page_found": "Page 321", "special_registers": "MSR", "programming_notes": "The vspltish instruction is used to replicate a signed halfword value across all elements of a vector register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The immediate value is sign-extended to 16 bits and then replicated in each halfword element of the target vector register.", "example": "vspltish vd, 4"}
{"mnemonic": "vspltisw", "architecture": "PowerISA", "full_name": "Vector Splat Immediate Signed Word", "summary": "Splat a signed immediate value into all elements of a vector register.", "syntax": "vspltisw vD, SIM", "encoding": {"format": "VX-form", "binary_pattern": "000100 | vD | SIM | // | 01110 | 001100", "hex_opcode": "0x1000038C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "SIM", "clean": "SIM"}, {"raw": "00000", "clean": "00000"}, {"raw": "908", "clean": "908"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "SIM", "desc": "Immediate"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "SI16", "desc": "Signed Immediate Value (16-bit)"}], "extension": "VMX (AltiVec)", "page_found": "Page 1421 - 1422", "description": "Splats a 5-bit signed immediate value into all 4 word elements of vD, sign-extended to 32 bits per word. The immediate SIM is a signed 5-bit value (range -16 to 15). No status flags are affected. This is a VMX/AltiVec instruction.", "pseudocode": "value ← sign_extend(SIM, 32)\nvD ← replicate(value to all 4 word positions)", "special_registers": "MSR", "programming_notes": "The vspltisw instruction is commonly used to initialize a vector register with a repeated signed word value. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The immediate value is sign-extended from 16 bits to 32 bits and replicated across all four elements of the target vector register.", "example": "vspltisw vd, 4"}
{"mnemonic": "vslb", "architecture": "PowerISA", "full_name": "Vector Shift Left Byte", "summary": "Shifts each byte element of the source vector left by a specified number of bits.", "syntax": "vslb vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 260", "hex_opcode": "0x10000104", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "260", "clean": "260"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Shift Control Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vslb, each byte element of VSR[VRA+32] is shifted left by the number of bits specified in the low-order 3 bits of the corresponding byte element of VSR[VRB+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    src1 ← VSR[VRA+32].byte[i]\n    src2 ← VSR[VRB+32].byte[i].bit[5:7]\n    VSR[VRT+32].byte[i] ← src1 << src2", "page_found": "Page 437 - 438", "special_registers": "MSR", "programming_notes": "The vslb instruction shifts each byte of the source vector left by a specified number of bits, determined by the lower 3 bits of the corresponding byte in the second source vector. Ensure that the Vector Facility is enabled (MSR.VEC=1) to avoid a Vector_Unavailable exception. This operation is useful for bit manipulation tasks but requires careful handling of alignment and privilege levels.", "example": "vslb vd, va, vb"}
{"mnemonic": "vslh", "architecture": "PowerISA", "full_name": "Vector Shift Left Halfword", "summary": "Shifts each halfword left.", "syntax": "vslh vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 324", "hex_opcode": "0x10000144", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "324", "clean": "324"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift"}], "extension": "VMX (AltiVec)", "description": "Shifts each of the 8 halfword elements in vA left by a variable number of bits specified by the low 4 bits of the corresponding halfword element in vB. Bits shifted out are lost; positions vacated are filled with zeros. No status flags are affected. This is a VMX/AltiVec instruction.", "pseudocode": "for i ← 0 to 7 do\n  shift_amount ← vB[i*16:i*16+3]\n  vD[i*16:i*16+15] ← vA[i*16:i*16+15] << shift_amount", "page_found": "Page 438", "special_registers": "MSR", "programming_notes": "The vslh instruction shifts each halfword element of the source vector left by a specified number of bits. Ensure that the shift amount is within the valid range to avoid unexpected results. This instruction operates at the user privilege level and does not generate exceptions under normal conditions.", "example": "vslh vd, va, vb"}
{"mnemonic": "vsrb", "architecture": "PowerISA", "full_name": "Vector Shift Right Byte", "summary": "Shifts each byte element of the source vector right by a specified number of bits.", "syntax": "vsrb vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "0 | VRT | VRA | VRB | 516", "hex_opcode": "0x10000204", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "516", "clean": "516"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Shift Control Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsrb, each byte element of VSR[VRA+32] is shifted right by the number of bits specified in the low-order 3 bits of the corresponding byte element in VSR[VRB+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    src1 ← VSR[VRA+32].byte[i]\n    src2 ← VSR[VRB+32].byte[i].bit[5:7]\n    VSR[VRT+32].byte[i] ← CHOP8(EXTZ(src1) >> src2)\nend", "page_found": "Page 440 - 441", "special_registers": "MSR", "programming_notes": "The vsrb instruction shifts each byte of the source vector right by a specified number of bits, determined by the lower 3 bits of the corresponding byte in another vector. Ensure that the Vector Facility is enabled (MSR.VEC=1); otherwise, a Vector_Unavailable exception will be raised. This operation is useful for bit manipulation tasks but requires careful handling of alignment and privilege levels to avoid exceptions.", "example": "vsrb vd, va, vb"}
{"mnemonic": "vsrh", "architecture": "PowerISA", "full_name": "Vector Shift Right Halfword", "summary": "Shifts the contents of each element in a vector right by a specified number of bits.", "syntax": "vsrh vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "000100 | vD | vA | vB | 01001 | 000100", "hex_opcode": "0x10000244", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "580", "clean": "580"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "page_found": "Page 1366 - 1367", "description": "Shifts each of the 8 halfword elements in vA right (logically, without sign extension) by a variable number of bits specified by the low 4 bits of the corresponding halfword element in vB. Bits shifted out are lost; positions vacated are filled with zeros. No status flags are affected. This is a VMX/AltiVec instruction.", "pseudocode": "for i ← 0 to 7 do\n  shift_amount ← vB[i*16:i*16+3]\n  vD[i*16:i*16+15] ← vA[i*16:i*16+15] >> shift_amount", "special_registers": "MSR", "programming_notes": "The vsrh instruction is used to perform element-wise right shifts on halfwords within a vector. Ensure that the shift amounts in the second source vector are within the range of 0-15 to avoid unexpected behavior. This instruction requires the VEC bit in the MSR register to be set; otherwise, it will raise an exception. Be cautious with alignment as unaligned access might lead to performance penalties or exceptions depending on the system configuration.", "example": "vsrh vd, va, vb"}
{"mnemonic": "vsrw", "architecture": "PowerISA", "full_name": "Vector Shift Right Word", "summary": "Shifts each word element of the source vector right by a specified number of bits.", "syntax": "vsrw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 644", "hex_opcode": "0x10000284", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "644", "clean": "644"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsrw, each word element of VSR[VRA+32] is shifted right by the number of bits specified in the low-order 5 bits of the corresponding word element of VSR[VRB+32]. The result is placed into the corresponding word element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ← VSR[VRA+32].word[i]\n    src2 ← VSR[VRB+32].word[i].bit[27:31]\n    VSR[VRT+32].word[i] ← CHOP32(EXTZ(src1) >> src2)\nend", "page_found": "Page 441 - 442", "special_registers": "MSR", "programming_notes": "The vsrw instruction shifts each word element of the source vector right by a specified number of bits, determined by the corresponding word element in another vector. Ensure that the shift amount is within the range of 0 to 31 to avoid undefined behavior. This instruction requires the Vector Facility to be enabled; otherwise, it will raise an exception.", "example": "vsrw vd, va, vb"}
{"mnemonic": "vsrab", "architecture": "PowerISA", "full_name": "Vector Shift Right Algebraic Byte", "summary": "Shifts each byte of the source vector right by a specified number of bits, filling vacated bits with copies of the sign bit.", "syntax": "vsrab vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 772", "hex_opcode": "0x10000304", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "772", "clean": "772"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Shift Amount Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsrab, each byte element in VSR[VRA+32] is shifted right by the number of bits specified in the low-order 3 bits of the corresponding byte element in VSR[VRB+32]. The result is placed into the corresponding byte element in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    src1 ← VSR[VRA+32].byte[i]\n    src2 ← VSR[VRB+32].byte[i].bit[5:7]\n    VSR[VRT+32].byte[i] ← CHOP8(EXTS(src1) >> src2)\nend", "page_found": "Page 443 - 444", "special_registers": "MSR", "programming_notes": "The vsrab instruction performs a right algebraic shift on each byte of the source vector, using the low-order 3 bits of the corresponding byte in the second source vector as the shift amount. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates at the user privilege level and does not generate exceptions for valid shifts; however, invalid shifts (e.g., shifting more than 7 bits) will result in undefined behavior.", "example": "vsrab vd, va, vb"}
{"mnemonic": "vsrah", "architecture": "PowerISA", "full_name": "Vector Shift Right Algebraic Halfword", "summary": "Arithmetic right shift of halfwords.", "syntax": "vsrah vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 836", "hex_opcode": "0x10000344", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "836", "clean": "836"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift"}], "extension": "VMX (AltiVec)", "description": "Shifts each of the 8 halfword elements in vA right arithmetically (with sign extension) by a variable number of bits specified by the low 4 bits of the corresponding halfword element in vB. The sign bit is replicated into vacated positions; bits shifted out are lost. No status flags are affected. This is a VMX/AltiVec instruction.", "pseudocode": "for i ← 0 to 7 do\n  shift_amount ← vB[i*16:i*16+3]\n  vD[i*16:i*16+15] ← arithmetic_shift_right(vA[i*16:i*16+15], shift_amount)", "page_found": "Page 444", "special_registers": "MSR", "programming_notes": "The vsrah instruction is used to perform right algebraic shifts on halfword elements of a vector. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The shift amount for each element is determined by the low-order 4 bits of the corresponding element in the second source vector. Be cautious with alignment as halfword operations require proper alignment to avoid undefined behavior.", "example": "vsrah vd, va, vb"}
{"mnemonic": "vsraw", "architecture": "PowerISA", "full_name": "Vector Shift Right Algebraic Word", "summary": "Shifts each word element of the source vector right by a specified number of bits, filling vacated bits with copies of the sign bit.", "syntax": "vsraw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 900", "hex_opcode": "0x10000384", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "900", "clean": "900"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Shift Count Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsraw, each word element of VSR[VRA+32] is shifted right by the number of bits specified in the low-order 5 bits of the corresponding word element of VSR[VRB+32]. The result is placed into the corresponding word element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ← VSR[VRA+32].word[i]\n    src2 ← VSR[VRB+32].word[i].bit[27:31]\n    VSR[VRT+32].word[i] ← CHOP32(EXTS(src1) >> src2)\nend", "page_found": "Page 444 - 445", "special_registers": "MSR", "programming_notes": "The vsraw instruction performs a right algebraic shift on each word element of the source vector, using the low-order 5 bits of the corresponding element in the second source vector as the shift count. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. Be cautious with alignment; while vsraw does not require specific alignment, incorrect alignment can lead to performance penalties or exceptions if data is not properly aligned in memory.", "example": "vsraw vd, va, vb"}
{"mnemonic": "vmrgew", "architecture": "PowerISA", "full_name": "Vector Merge Even Word", "summary": "Merges even word elements from two vector registers into a third.", "syntax": "vmrgew vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1932", "hex_opcode": "0x1000078C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1932", "clean": "1932"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The contents of word element 0 of VSR[VRA+32] are placed into word element 0 of VSR[VRT+32]. The contents of word element 0 of VSR[VRB+32] are placed into word element 1 of VSR[VRT+32]. The contents of word element 2 of VSR[VRA+32] are placed into word element 2 of VSR[VRT+32]. The contents of word element 2 of VSR[VRB+32] are placed into word element 3 of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nelse\n    VSR[VRT+32].word[0] ←VSR[VRA+32].word[0]\n    VSR[VRT+32].word[1] ←VSR[VRB+32].word[0]\n    VSR[VRT+32].word[2] ←VSR[VRA+32].word[2]\n    VSR[VRT+32].word[3] ←VSR[VRB+32].word[2]", "programming_notes": "vmrgew is treated as a Vector instruction in terms of resource availability.", "page_found": "Page 317 - 318", "special_registers": "MSR", "example": "vmrgew vd, va, vb"}
{"mnemonic": "vmrgow", "architecture": "PowerISA", "full_name": "Vector Merge Odd Word", "summary": "Merges odd words from two vectors.", "syntax": "vmrgow vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1676", "hex_opcode": "0x1000068C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1676", "clean": "1676"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Merges the odd-indexed words (words 1 and 3) from vector registers vA and vB into vD. This instruction interleaves odd-positioned word elements: vD[0] ← vA[1], vD[1] ← vB[1], vD[2] ← vA[3], vD[3] ← vB[3]. No condition flags are affected.", "pseudocode": "vD[0:31] ← vA[32:63]\nvD[32:63] ← vB[32:63]\nvD[64:95] ← vA[96:127]\nvD[96:127] ← vB[96:127]", "page_found": "Page 318", "special_registers": "MSR", "programming_notes": "The vmrgow instruction is used to merge odd-numbered words from two source vectors into a destination vector. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set; otherwise, a Vector_Unavailable exception will be raised. This instruction operates on 128-bit vectors and requires proper alignment of the source and destination registers.", "example": "vmrgow vd, va, vb"}
{"mnemonic": "vmulesb", "architecture": "PowerISA", "full_name": "Vector Multiply Even Signed Byte", "summary": "Multiplies the even-indexed bytes of two vector registers and stores the results in a destination vector register.", "syntax": "vmulesb vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 776", "hex_opcode": "0x10000308", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "776", "clean": "776"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmulesb, each pair of even-indexed bytes from VSR[VRA+32] and VSR[VRB+32] are multiplied, and the 16-bit products are stored in halfwords of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 7\n    src1 ←EXTS(VSR[VRA+32].byte[2×i])\n    src2 ←EXTS(VSR[VRB+32].byte[2×i])\n    VSR[VRT+32].hword[i] ←CHOP16(src1 × src2)\nend", "page_found": "Page 364 - 365", "special_registers": "MSR", "programming_notes": "The vmulesb instruction multiplies even-indexed bytes from two vector registers and stores the 16-bit products in another vector register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates on 32-byte vectors, so ensure proper alignment of data for optimal performance. Be cautious with overflow conditions as the multiplication results are truncated to 16 bits.", "example": "vmulesb vd, va, vb"}
{"mnemonic": "vmuleub", "architecture": "PowerISA", "full_name": "Vector Multiply Even Unsigned Byte", "summary": "Multiplies even-indexed bytes of two vector registers and stores the results in a destination vector register.", "syntax": "vmuleub vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 520", "hex_opcode": "0x10000208", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "520", "clean": "520"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmuleub, each pair of even-indexed bytes from VSR[VRA+32] and VSR[VRB+32] are multiplied, and the 16-bit products are stored in halfwords of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 7\n    src1 ←EXTZ(VSR[VRA+32].byte[2×i])\n    src2 ←EXTZ(VSR[VRB+32].byte[2×i])\n    VSR[VRT+32].hword[i] ←CHOP16(src1 × src2)\nend", "page_found": "Page 365 - 366", "special_registers": "MSR", "programming_notes": "This instruction multiplies even-indexed bytes from two vector registers and stores the 16-bit products in another vector register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. Be cautious of overflow, as the multiplication results are truncated to 16 bits.", "example": "vmuleub vd, va, vb"}
{"mnemonic": "vmulesh", "architecture": "PowerISA", "full_name": "Vector Multiply Even Signed Halfword", "summary": "Multiplies the even-numbered halfwords of two vector registers and places the results into a destination vector register.", "syntax": "vmulesh vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | VRA | VRB | 840", "hex_opcode": "0x10000348", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "840", "clean": "840"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmulesh, the signed integer value in each even-numbered halfword element of VSR[VRA+32] is multiplied by the corresponding signed integer value in each even-numbered halfword element of VSR[VRB+32]. The 32-bit product is placed into each word element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ←EXTS(VSR[VRA+32].hword[2×i])\n    src2 ←EXTS(VSR[VRB+32].hword[2×i])\n    VSR[VRT+32].word[i] ←CHOP32(src1 × src2)\nend", "page_found": "Page 366 - 367", "special_registers": "MSR", "programming_notes": "This instruction is used for multiplying signed halfwords from two vector registers and storing the 32-bit results in another vector register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation processes even-numbered halfwords, so developers should ensure proper alignment of data within the vector registers to avoid unexpected results.", "example": "vmulesh vd, va, vb"}
{"mnemonic": "vmuleuh", "architecture": "PowerISA", "full_name": "Vector Multiply Even Unsigned Halfword", "summary": "Multiplies the even-numbered halfwords of two vector registers and places the results into a destination vector register.", "syntax": "vmuleuh vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 584", "hex_opcode": "0x10000248", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "584", "clean": "584"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmuleuh, each pair of even-numbered halfwords from VSR[VRA+32] and VSR[VRB+32] are multiplied, and the 32-bit products are placed into corresponding word elements of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ← EXTZ(VSR[VRA+32].hword[2×i])\n    src2 ← EXTZ(VSR[VRB+32].hword[2×i])\n    VSR[VRT+32].word[i] ← CHOP32(src1 × src2)\nend", "page_found": "Page 367 - 368", "special_registers": "MSR", "programming_notes": "This instruction multiplies even-numbered halfwords from two vector registers and stores the 32-bit products in another register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. Be cautious of overflow, as only the lower 32 bits of each product are stored. This operation requires the use of VSX (Vector Scalar Extensions) registers.", "example": "vmuleuh vd, va, vb"}
{"mnemonic": "vmulosb", "architecture": "PowerISA", "full_name": "Vector Multiply Odd Signed Byte", "summary": "Multiplies odd signed bytes to halfwords.", "syntax": "vmulosb vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 264", "hex_opcode": "0x10000108", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "264", "clean": "264"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Multiplies the odd-indexed signed bytes from vA and vB, producing signed halfword results in vD. Operates on bytes at indices 1, 3, 5, 7, 9, 11, 13, 15, generating four halfword products. No condition flags are affected.", "pseudocode": "vD[0:15] ← (vA[8:15] × vB[8:15]) as signed\nvD[16:31] ← (vA[24:31] × vB[24:31]) as signed\nvD[32:47] ← (vA[40:47] × vB[40:47]) as signed\nvD[48:63] ← (vA[56:63] × vB[56:63]) as signed\nvD[64:79] ← (vA[72:79] × vB[72:79]) as signed\nvD[80:95] ← (vA[88:95] × vB[88:95]) as signed\nvD[96:111] ← (vA[104:111] × vB[104:111]) as signed\nvD[112:127] ← (vA[120:127] × vB[120:127]) as signed", "page_found": "Page 365", "special_registers": "MSR", "programming_notes": "This instruction is useful for performing element-wise multiplication of odd-numbered bytes from two vectors, storing the results as signed halfwords. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. The operation respects byte ordering, so developers must ensure proper alignment and data format to avoid unexpected results.", "example": "vmulosb vd, va, vb"}
{"mnemonic": "vmuloub", "architecture": "PowerISA", "full_name": "Vector Multiply Odd Unsigned Byte", "summary": "Multiplies odd unsigned bytes to halfwords.", "syntax": "vmuloub vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "00000 | 001000 | VRT | VRA | VRB", "hex_opcode": "0x10000008", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "8", "clean": "8"}], "length": "32", "bit_positions": "0:5 | 6:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register A"}, {"name": "VRB", "desc": "Source Vector Register B"}], "extension": "VMX (AltiVec)", "page_found": "Page 1328 - 1329", "description": "Multiplies the odd-indexed unsigned bytes from vA and vB, producing unsigned halfword results in vD. Operates on bytes at indices 1, 3, 5, 7, 9, 11, 13, 15, generating eight halfword products without sign extension. No condition flags are affected.", "pseudocode": "vD[0:15] ← (vA[8:15] × vB[8:15]) as unsigned\nvD[16:31] ← (vA[24:31] × vB[24:31]) as unsigned\nvD[32:47] ← (vA[40:47] × vB[40:47]) as unsigned\nvD[48:63] ← (vA[56:63] × vB[56:63]) as unsigned\nvD[64:79] ← (vA[72:79] × vB[72:79]) as unsigned\nvD[80:95] ← (vA[88:95] × vB[88:95]) as unsigned\nvD[96:111] ← (vA[104:111] × vB[104:111]) as unsigned\nvD[112:127] ← (vA[120:127] × vB[120:127]) as unsigned", "programming_notes": "This instruction is useful for performing element-wise multiplication of odd-numbered bytes from two vectors. Ensure that the input vectors are properly aligned to avoid unexpected results. The operation does not require any special privileges, but it's important to handle potential overflow by zero-extending the 8-bit result to 16 bits.", "example": "vmuloub vd, va, vb"}
{"mnemonic": "vmulosh", "architecture": "PowerISA", "full_name": "Vector Multiply Odd Signed Halfword", "summary": "Multiplies odd signed halfwords to words.", "syntax": "vmulosh vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 328", "hex_opcode": "0x10000148", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "328", "clean": "328"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Multiplies the odd-indexed signed halfwords from vA and vB, producing signed word results in vD. Operates on halfwords at indices 1 and 3, generating two word products. No condition flags are affected.", "pseudocode": "vD[0:31] ← (vA[16:31] × vB[16:31]) as signed\nvD[32:63] ← (vA[48:63] × vB[48:63]) as signed\nvD[64:95] ← (vA[80:95] × vB[80:95]) as signed\nvD[96:127] ← (vA[112:127] × vB[112:127]) as signed", "page_found": "Page 367", "special_registers": "MSR", "programming_notes": "This instruction is useful for performing element-wise multiplication of odd-numbered signed halfwords from two vectors. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The result is stored as 32-bit words in the destination vector, so ensure proper alignment and size of the vectors to avoid unexpected behavior.", "example": "vmulosh vd, va, vb"}
{"mnemonic": "vmulouh", "architecture": "PowerISA", "full_name": "Vector Multiply Odd Unsigned Halfword", "summary": "Multiplies odd unsigned halfwords to words.", "syntax": "vmulouh vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 72", "hex_opcode": "0x10000048", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "72", "clean": "72"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Multiplies the odd-indexed unsigned halfwords from vA and vB, producing unsigned word results in vD. Operates on halfwords at indices 1 and 3, generating four word products without sign extension. No condition flags are affected.", "pseudocode": "vD[0:31] ← (vA[16:31] × vB[16:31]) as unsigned\nvD[32:63] ← (vA[48:63] × vB[48:63]) as unsigned\nvD[64:95] ← (vA[80:95] × vB[80:95]) as unsigned\nvD[96:127] ← (vA[112:127] × vB[112:127]) as unsigned", "page_found": "Page 368", "special_registers": "MSR", "programming_notes": "This instruction is useful for performing element-wise multiplication of unsigned halfwords from two vectors. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation targets odd-numbered halfwords, so developers should align their data accordingly to achieve the desired results.", "example": "vmulouh vd, va, vb"}
{"mnemonic": "vabsdub", "architecture": "PowerISA", "full_name": "Vector Absolute Difference Unsigned Byte", "summary": "Returns the absolute value of the difference of integer values in byte elements.", "syntax": "vabsdub vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | VRT | VRA | VRB | 1027", "hex_opcode": "0x10000403", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1027", "clean": "1027"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vabsdub, the absolute value of the difference between corresponding byte elements of VSR[VRA+32] and VSR[VRB+32] is placed into corresponding byte elements of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    src1 ← EXTZ(VSR[VRA+32].byte[i])\n    src2 ← EXTZ(VSR[VRB+32].byte[i])\n    if src1 > src2 then\n        VSR[VRT+32].byte[i] ← CHOP8(src1 + ¬src2 + 1)\n    else\n        VSR[VRT+32].byte[i] ← CHOP8(src2 + ¬src1 + 1)\nend", "page_found": "Page 403 - 404", "special_registers": "MSR", "programming_notes": "This instruction computes the absolute difference between corresponding bytes of two vector registers and stores the result in another register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. The operation does not require any specific alignment, but both input vectors must be properly loaded into the specified registers. This instruction operates at a high performance due to its parallel processing capabilities on vector elements.", "example": "vabsdub vd, va, vb"}
{"mnemonic": "vabsduh", "architecture": "PowerISA", "full_name": "Vector Absolute Difference Unsigned Halfword", "summary": "Computes |A - B| for halfwords.", "syntax": "vabsduh vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1091", "hex_opcode": "0x10000443", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1091", "clean": "1091"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Computes the absolute value of the difference between corresponding unsigned halfwords in vA and vB, storing results in vD. Each result is calculated as |vA[i] - vB[i]| for each of four halfword elements. No condition flags are affected.", "pseudocode": "vD[0:15] ← |vA[0:15] - vB[0:15]| as unsigned\nvD[16:31] ← |vA[16:31] - vB[16:31]| as unsigned\nvD[32:47] ← |vA[32:47] - vB[32:47]| as unsigned\nvD[48:63] ← |vA[48:63] - vB[48:63]| as unsigned\nvD[64:79] ← |vA[64:79] - vB[64:79]| as unsigned\nvD[80:95] ← |vA[80:95] - vB[80:95]| as unsigned\nvD[96:111] ← |vA[96:111] - vB[96:111]| as unsigned\nvD[112:127] ← |vA[112:127] - vB[112:127]| as unsigned", "page_found": "Page 404", "special_registers": "MSR", "programming_notes": "The vabsduh instruction is commonly used for vectorized image processing tasks where pixel intensity differences need to be calculated. Ensure that the input vectors are properly aligned to halfword boundaries to avoid misaligned access exceptions. This instruction operates at user privilege level and does not generate any exceptions under normal operation, but it will raise a Vector_Unavailable exception if the VEC bit in the MSR is not set.", "example": "vabsduh vd, va, vb"}
{"mnemonic": "vabsduw", "architecture": "PowerISA", "full_name": "Vector Absolute Difference Unsigned Word", "summary": "Calculates the absolute difference of unsigned words from two vector registers and stores the result in another vector register.", "syntax": "vabsduw vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1155", "hex_opcode": "0x10000483", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1155", "clean": "1155"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vabsduw, the absolute difference of each word element from VSR[VRA+32] and VSR[VRB+32] is calculated and stored in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\ndo i = 0 to 3\n    src1 ←EXTZ(VSR[VRA+32].word[i])\n    src2 ←EXTZ(VSR[VRB+32].word[i])\n\n    if src1 > src2 then\n        VSR[VRT+32].word[i] ←CHOP32(src1 + ¬src2 + 1)\n    else\n        VSR[VRT+32].word[i] ←CHOP32(src2 + ¬src1 + 1)\nend", "page_found": "Page 404 - 405", "special_registers": "MSR", "programming_notes": "This instruction calculates the absolute difference of each word element between two vector registers and stores the result in another register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. The operation handles unsigned integers, so be cautious with negative values if they are interpreted as signed. This instruction does not require any specific alignment for the data it operates on.", "example": "vabsduw vd, va, vb"}
{"mnemonic": "xsmaxcqp", "architecture": "PowerISA", "full_name": "VSX Scalar Maximum Type-C Quad-Precision", "summary": "Compares two quad-precision floating-point values and selects the maximum.", "syntax": "xsmaxcqp vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | FRA | FRB | 674 | Rc", "hex_opcode": "0xFC000548", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "676", "clean": "676"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector-Scalar Register"}, {"name": "VRA", "desc": "Source Vector-Scalar Register"}, {"name": "VRB", "desc": "Source Vector-Scalar Register"}, {"name": "XT", "desc": "Target Vector Register"}], "extension": "VSX", "description": "Compares two quad-precision floating-point values in VSRs and returns the maximum, using Type-C comparison rules (NaN handling as per VSX specification). Results are written to the VSR specified by XT. No exception or condition register fields are altered unless Rc=1 for VSX comparisons.", "pseudocode": "fD ← max(fA, fB) using Type-C comparison\nif fA is NaN or fB is NaN then\n  fD ← QNaN\nend if", "special_registers": "FPSCR (FX, VXSNAN)", "programming_notes": "xsmaxcqp can be used to implement the C/C++ conditional operation (x>y)?x:y for quad-precision arguments. VSR[VRT+32] ←result", "page_found": "Page 792 - 793", "example": "xsmaxcqp vd, va, vb"}
{"mnemonic": "xsmincqp", "architecture": "PowerISA", "full_name": "VSX Scalar Minimum Type-C Quad-Precision", "summary": "Compares two quad-precision floating-point values and selects the minimum value.", "syntax": "xsmincqp vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | FRA | FRB | 710 | Rc", "hex_opcode": "0xFC0005C8", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "708", "clean": "708"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VSX", "description": "Compares two quad-precision floating-point values in VSRs and returns the minimum, using Type-C comparison rules (NaN handling as per VSX specification). Results are written to the VSR specified by XT. No exception or condition register fields are altered unless Rc=1 for VSX comparisons.", "pseudocode": "fD ← min(fA, fB) using Type-C comparison\nif fA is NaN or fB is NaN then\n  fD ← QNaN\nend if", "special_registers": "FPSCR.FX, FPSCR.VXSNAN", "programming_notes": "xsmincqp can be used to implement the C/C++ conditional operator (x<y)?x:y for quad-precision arguments.", "page_found": "Page 800 - 801", "example": "xsmincqp vd, va, vb"}
{"mnemonic": "xscpsgnqp", "architecture": "PowerISA", "full_name": "VSX Scalar Copy Sign Quad-Precision", "summary": "Copies sign from B to A (128-bit).", "syntax": "xscpsgnqp vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | vA | vB | 100 | /", "hex_opcode": "0xFC0000C8", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "100", "clean": "100"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VSX", "description": "Copies the sign bit from the quad-precision floating-point value in vB to the quad-precision value in vA, placing the result in vD. The magnitude of vA is preserved while the sign of vB is applied. No condition register or status flags are affected.", "pseudocode": "vD[0] ← vB[0] || vA[1:127]", "page_found": "Page 644", "special_registers": "MSR", "programming_notes": "The xscpsgnqp instruction is used to copy the sign bit from one quad-precision floating-point number to another while keeping its magnitude unchanged. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting the appropriate bit in the MSR register. This instruction operates on 128-bit values, so both source operands must be properly aligned. Be cautious of potential exceptions if the VSX is not available or if there are alignment issues.", "example": "xscpsgnqp vd, va, vb"}
{"mnemonic": "xststdcqp", "architecture": "PowerISA", "full_name": "VSX Scalar Test Data Class Quad-Precision", "summary": "Tests the data class of a quad-precision floating-point value and sets condition register bits based on the result.", "syntax": "xststdcqp BF, vB, DCM", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | / | DCM | vB | 706 | /", "hex_opcode": "0xFC000588", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "DCM", "clean": "DCM"}, {"raw": "vB", "clean": "vB"}, {"raw": "706", "clean": "706"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "vB", "desc": "Source"}, {"name": "DCM", "desc": "Mask"}, {"name": "VRB", "desc": "Vector-Scalar Register B"}, {"name": "DCMX", "desc": "Data Class Mask"}], "extension": "VSX", "description": "Tests the data class of a quad-precision floating-point value in vB against a data class mask (DCM) and stores the result in condition register field BF. The result is 1 if the value belongs to any class selected by the mask, 0 otherwise. This instruction requires VSX support and updates the specified CR field without affecting other status registers.", "pseudocode": "if (vB matches data class selected by DCM) then\n  CR[BF] ← 0b100\nelse\n  CR[BF] ← 0b000\nendif", "special_registers": "CR, FPSCR", "page_found": "Page 902 - 903", "programming_notes": "The xststdcqp instruction is used to test the data class of a quad-precision floating-point value. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register, otherwise, an exception will be raised. The result is stored in the condition register CR and FPSCR.FPCC, which can be used for conditional branching based on the data class match.", "example": "xststdcqp cr0, vb, 0"}
{"mnemonic": "xscmpexpqp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Exponents Quad-Precision", "summary": "Compares the exponents of two quad-precision floating-point values and updates the condition register.", "syntax": "xscmpexpqp BF, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | / | vA | vB | 228 | /", "hex_opcode": "0xFC000148", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "228", "clean": "228"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRA", "desc": "Vector Register A"}, {"name": "VRB", "desc": "Vector Register B"}], "extension": "VSX", "description": "The exponent of src1 is compared with the exponent of src2 as unsigned integer values. The result of the compare is placed into FPCC and CR field BF.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nreset_flags()\n\nsrc1 ← VSR[VRA+32]\nsrc2 ← VSR[VRB+32]\n\nsrc1.exponent ← EXTZ(src1.bit[1:15])\nsrc2.exponent ← EXTZ(src2.bit[1:15])\nsrc1.fraction ← EXTZ(src1.bit[16:127])\nsrc2.fraction ← EXTZ(src2.bit[16:127])\n\nsrc1.class.NaN ← (src1.exponent = 32767) & (src1.fraction != 0)\nsrc2.class.NaN ← (src2.exponent = 32767) & (src2.fraction != 0)\n\nlt_flag ← (src1.exponent < src2.exponent)\ngt_flag ← (src1.exponent > src2.exponent)\neq_flag ← (src1.exponent = src2.exponent)\nuo_flag ← src1.class.NaN | src2.class.NaN\n\nCR.bit[4×BF+32] ← FPSCR.FL ← !uo_flag & lt_flag\nCR.bit[4×BF+33] ← FPSCR.FG ← !uo_flag & gt_flag\nCR.bit[4×BF+34] ← FPSCR.FE ← !uo_flag & eq_flag\nCR.bit[4×BF+35] ← FPSCR.FU ← uo_flag", "special_registers": "CR, FPSCR", "page_found": "Page 898 - 899", "programming_notes": "This instruction compares the exponents of two quad-precision floating-point numbers. Ensure that VSX is enabled in the MSR register to avoid exceptions. The result is stored in both the CR and FPSCR registers, with flags indicating less than, greater than, equal, or unordered comparisons. Handle NaN values appropriately as they set the unordered flag.", "example": "xscmpexpqp cr0, va, vb"}
{"mnemonic": "tcheck", "architecture": "PowerISA", "full_name": "Transaction Check", "summary": "Checks transaction status and updates CR.", "syntax": "tcheck BF", "encoding": {"format": "X-form", "binary_pattern": "31 | BF | / | / | 716 | /", "hex_opcode": "0x7C00059C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "716", "clean": "716"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BF", "desc": "CR Field"}], "extension": "Transactional Memory", "description": "Transaction Check. Tests the state of the current transaction and sets CR field BF based on whether a transaction is active, suspended, or whether a failure has been recorded. No effect outside a transaction.", "pseudocode": "if Transactional_or_Suspended() then\n  CR[4*BF:4*BF+3] ← transaction_state_bits()\nelse\n  CR[4*BF:4*BF+3] ← 0b0000", "special_registers": "CR", "programming_notes": "The tcheck instruction is used to determine the state of the current transaction, setting the condition register field BF accordingly. It should be used within a transactional context; outside transactions, it will clear the specified CR field. Ensure proper alignment and ordering relative to other transactional instructions for accurate state checks.", "example": "tcheck cr0"}
{"mnemonic": "tsuspend", "architecture": "PowerISA", "full_name": "Transaction Suspend", "summary": "Suspends the current transaction.", "syntax": "tsuspend.", "encoding": {"format": "X-form", "binary_pattern": "31 | 0 | 0 | 0 | 750 | 1", "hex_opcode": "0x7C0005DE", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "750", "clean": "750"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Transactional Memory", "description": "Suspends the current transaction without aborting it, allowing the processor to handle interrupts and other exceptions while preserving transactional state for later resumption via tresume. This instruction requires Transactional Memory support and always sets CR0 to indicate successful suspension. The instruction has a dot form that updates CR0.", "pseudocode": "Transaction ← Suspended\nCR0 ← 0b0010", "example": "tsuspend."}
{"mnemonic": "tresume", "architecture": "PowerISA", "full_name": "Transaction Resume", "summary": "Resumes a suspended transaction.", "syntax": "tresume.", "encoding": {"format": "X-form", "binary_pattern": "31 | 1 | 0 | 0 | 750 | 1", "hex_opcode": "0x7C2005DE", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "1", "clean": "1"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "750", "clean": "750"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Transactional Memory", "description": "Resumes a transaction that was previously suspended via tsuspend, restoring the transactional state and continuing execution. This instruction requires Transactional Memory support and always sets CR0 to indicate successful resumption. The instruction has a dot form that updates CR0.", "pseudocode": "Transaction ← Active\nCR0 ← 0b0010", "example": "tresume."}
{"mnemonic": "dcbtls", "architecture": "PowerISA", "full_name": "Data Cache Block Touch and Lock Set", "summary": "Locks a cache line in the L1 cache.", "syntax": "dcbtls CT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | CT | RA | RB | 166 | /", "hex_opcode": "0x7C00014C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "CT", "clean": "CT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "166", "clean": "166"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "CT", "desc": "Cache Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Privileged", "description": "Locks a data cache line in the L1 data cache at the address computed from RA+RB. The cache target (CT) field specifies the cache level and operation type. This is a privileged instruction that provides cache locking hints to the processor and does not modify any general-purpose registers or condition flags.", "pseudocode": "EA ← (RA|0) + RB\nLock cache line at EA in L1 data cache based on CT", "example": "dcbtls 0, r4, r5"}
{"mnemonic": "slbsync", "architecture": "PowerISA", "full_name": "SLB Synchronize", "summary": "Provides an ordering function for the effects of all slbieg and slbiag instructions executed by the thread executing the slbsync instruction.", "syntax": "slbsync", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | / | 870 | /", "hex_opcode": "0x7C0002A4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "438", "clean": "438"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [], "extension": "Privileged", "description": "Provides a synchronization point ensuring that all slbieg and slbiag instructions executed by the current thread prior to this instruction have completed their effects before any subsequent memory operations are visible. This is a privileged instruction with no operands that enforces ordering of segment lookaside buffer (SLB) invalidation operations.", "programming_notes": "slbsync should not be used to synchronize the completion of slbie.", "page_found": "Page 1206 - 1207", "pseudocode": "Synchronize all prior slbieg and slbiag effects", "example": "slbsync"}
{"mnemonic": "lbarx", "architecture": "PowerISA", "full_name": "Load Byte And Reserve Indexed", "summary": "Loads a byte from memory and reserves the location for exclusive access.", "syntax": "lbarx RT,RA,RB,EH", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 52 | 0", "hex_opcode": "0x7C000068", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "52", "clean": "52"}, {"raw": "0", "clean": "0"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}, {"name": "EH", "desc": "Hint for subsequent store operation"}], "extension": "Base", "description": "Loads a single byte from memory at the address computed from RA+RB into RT, zero-extending to 64 bits, and reserves the location for exclusive access for a subsequent stbcx. instruction. The optional EH field provides a hint for the subsequent store. No condition register fields are affected by this load.", "pseudocode": "EA ← (RA|0) + RB\nRT ← (56)0 || MEM[EA, 1]\nRESERVED ← EA", "programming_notes": "lbarx serves as both a basic and an extended mnemonic. The Assembler will recognize a lbarx mnemonic with four operands as the basic form, and a lbarx mnemonic with three operands as the extended form. In the extended form the EH operand is omitted and assumed to be 0.", "page_found": "Page 1051 - 1052", "special_registers": "RESERVE, RESERVE_LENGTH, RESERVE_ADDR", "example": "lbarx r3, r4, r5, 0"}
{"mnemonic": "lharx", "architecture": "PowerISA", "full_name": "Load Halfword And Reserve Indexed", "summary": "Atomic Load Halfword.", "syntax": "lharx RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 116 | 0", "hex_opcode": "0x7C0000E8", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "116", "clean": "116"}, {"raw": "0", "clean": "0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Load the halfword at the effective address into the low 16 bits of RT, sign-extending to 32 bits in 32-bit mode or 64 bits in 64-bit mode, and reserve the addressed halfword for atomic update. Sets the reservation granule; any store to the reserved address by any processor will clear the reservation. This instruction requires that RA or 0 is added to RB to form the effective address.", "page_found": "Page 1052", "programming_notes": "Places a reservation on the cache line containing the effective address. The subsequent store-conditional (stwcx./stdcx. etc.) will fail if the reservation has been lost due to an intervening store from any processor or an exception. Always check the EQ bit in CR0 after the store-conditional.", "pseudocode": "EA ← (RA | 0) + RB\nRT ← EXTS(MEM(EA, 2), 16)\nReserveWord(EA)", "example": "lharx r3, r4, r5"}
{"mnemonic": "lqarx", "architecture": "PowerISA", "full_name": "Load Quadword And Reserve Indexed", "summary": "Loads a quadword from memory and reserves the location for conditional store.", "syntax": "lqarx RTp, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RTp | RA | RB | 276 | 0", "hex_opcode": "0x7C000228", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RTp", "clean": "RTp"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "276", "clean": "276"}, {"raw": "0", "clean": "0"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RTp", "desc": "Target Pair"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}, {"name": "EH", "desc": "Hint operand"}], "extension": "Base", "description": "For lqarx, the quadword in storage addressed by EA is loaded into an even-odd pair of GPRs. In Big-Endian mode, the even-numbered GPR is loaded with the doubleword from storage addressed by EA and the odd-numbered GPR is loaded with the doubleword addressed by EA+8. In Little-Endian mode, the even-numbered GPR is loaded with the byte-reversed doubleword from storage addressed by EA+8 and the odd-numbered GPR is loaded with the byte-reversed doubleword addressed by EA.", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + (RB)\nRESERVE ← 1\nRESERVE_LENGTH ← 16\nRESERVE_ADDR ← real_addr(EA)\nRTp ← MEM(EA, 16)", "programming_notes": "lqarx serves as both a basic and an extended mnemonic. The Assembler will recognize a lqarx mnemonic with four operands as the basic form, and a lqarx mnemonic with three operands as the extended form. In the extended form the EH operand is omitted and assumed to be 0.", "extended_mnemonics": [{"mnemonic": "lqarx", "syntax": "lqarx RTp,RA,RB", "description": "Equivalent to lqarx RTp,RA,RB,0"}], "page_found": "Page 1058 - 1059", "special_registers": "RESERVE, RESERVE_LENGTH, RESERVE_ADDR", "example": "lqarx r4, r4, r5"}
{"mnemonic": "stbcx.", "architecture": "PowerISA", "full_name": "Store Byte Conditional Indexed", "summary": "Stores a byte from a register to memory if the reservation is valid and matches the address.", "syntax": "stbcx. RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 694 | 1", "hex_opcode": "0x7C00056D", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "694", "clean": "694"}, {"raw": "1", "clean": "1"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "The stbcx. instruction stores a byte from the specified source register (RS) into memory at an effective address calculated by adding the contents of two registers (RA and RB). The operation is conditional on whether a reservation exists and matches the target address.", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + (RB)\nif RESERVE then\n    if RESERVE_LENGTH = 1 &\n       RESERVE_ADDR = real_addr(EA) then\n        MEM(EA, 1) ← (RS)56:63\n        undefined_case ← 0\n        store_performed ← 1\n     else\n        z ← smallest real page size supported by implementation\n        if RESERVE_ADDR ÷ z = real_addr(EA) ÷ z then\n          undefined_case ← 1\n        else\n          undefined_case ← 0\n          store_performed ← 0\nelse\n    undefined_case ← 0\n    store_performed ← 0\nif undefined_case then\n    u1 ← undefined 1-bit value\n    if u1 then\n      MEM(EA, 1) ← (RS)56:63\n    u2 ← undefined 1-bit value\n    CR0 ← 0b00 || u2 || XERSO\nelse\n    CR0 ← 0b00 || store_performed || XERSO\nRESERVE ← 0", "special_registers": "CR0, XER", "page_found": "Page 1053 - 1054", "programming_notes": "Succeeds only if a valid reservation exists on the target address. Sets CR0[EQ] to 1 on success, 0 on failure. Must always be used in a retry loop that re-executes the load-reserve instruction on failure.", "example": "stbcx. r3, r4, r5"}
{"mnemonic": "sthcx.", "architecture": "PowerISA", "full_name": "Store Halfword Conditional Indexed", "summary": "Stores a halfword from a register to memory conditionally based on a reservation.", "syntax": "sthcx. RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "011111 | RS | RA | RB | 10110 | 101101", "hex_opcode": "0x7C0005AD", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "726", "clean": "726"}, {"raw": "1", "clean": "1"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "The sthcx. instruction stores the upper half of the contents of register RS into memory at the effective address (EA) if a reservation exists and meets certain conditions. The EA is calculated as the sum of RA and RB, with RA being zero-extended to 64 bits. If the reservation length is not 2 bytes or the real storage location does not match the reservation, the store may be undefined or no store may occur.", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + (RB)\nif RESERVE then\n    if RESERVE_LENGTH = 2 &\n       RESERVE_ADDR = real_addr(EA) then\n        MEM(EA, 2) ← (RS)48:63\n        undefined_case ← 0\n        store_performed ← 1\n    else\n        z ← smallest real page size supported by implementation\n        if RESERVE_ADDR ÷ z = real_addr(EA) ÷ z then\n          undefined_case ← 1\n        else\n          undefined_case ← 0\n          store_performed ← 0\nelse\n    undefined_case ← 0\n    store_performed ← 0\nif undefined_case then\n    u1 ← undefined 1-bit value\n    if u1 then\n      MEM(EA, 2) ← (RS)48:63\n    u2 ← undefined 1-bit value\n    CR0 ← 0b00 || u2 || XERSO\nelse\n    CR0 ← 0b00 || store_performed || XERSO\nRESERVE ← 0", "special_registers": "CR0, XER", "page_found": "Page 1054 - 1055", "programming_notes": "Succeeds only if a valid reservation exists on the target address. Sets CR0[EQ] to 1 on success, 0 on failure. Must always be used in a retry loop that re-executes the load-reserve instruction on failure.", "example": "sthcx. r3, r4, r5"}
{"mnemonic": "slw", "architecture": "PowerISA", "full_name": "Shift Left Word", "summary": "Shifts a 32-bit register left by the amount specified in RB.", "syntax": "slw RT,RA,RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 24 | Rc", "hex_opcode": "0x7C000030", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "24", "clean": "24"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "RB", "desc": "Shift Amount Register"}, {"name": "RT", "desc": "Target General Purpose Register"}], "pseudocode": "n ← (RB)59:63\nr ← ROTL32((RS)32:63, n)\nif (RB)58 = 0 then\n    m ← MASK(32, 63-n)\nelse\n    m ← 640\nRA ← r & m", "example": "slw r3, r4, r5", "example_note": "r3 = r4 << r5 (32-bit).", "extension": "Base", "description": "The contents of the low-order 32 bits of register RS are shifted left the number of bits specified by (RB)58:63. Bits shifted out of position 32 are lost. Zeros are supplied to the vacated positions on the right. The 32-bit result is placed into RA32:63. RA0:31 are set to zero. Shift amounts from 32 to 63 give a zero result.", "special_registers": "CR0", "page_found": "Page 148 - 150", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "srw", "architecture": "PowerISA", "full_name": "Shift Right Word", "summary": "Performs a logical right shift (zeros shifted in) on a 32-bit word.", "syntax": "srw RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 536 | Rc", "hex_opcode": "0x7C000430", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "536", "clean": "536"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "RB", "desc": "Shift Amount Register"}], "pseudocode": "n ← RB[27:31]\nif n < 32 then\n  RA[0:63] ← EXTZ(RS[32:63] >> n, 32)\nelse\n  RA[0:63] ← 0\nif Rc = 1 then\n  CR0 ← (RA = 0) || LT || GT || SO", "example": "srw r3, r4, r5", "example_note": "r3 = r4 >> r5 (Unsigned 32-bit).", "extension": "Base", "description": "Logically shift the 32-bit word in RS right by the number of bits specified in RB[27:31] (only the low 5 bits are used), filling vacated positions with zeros. The result is placed in RA. If Rc=1, CR0 is updated based on the result.", "page_found": "Page 149", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "sraw", "architecture": "PowerISA", "full_name": "Shift Right Algebraic Word", "summary": "Performs an arithmetic right shift (sign bit replicated) on a 32-bit word. Updates Carry (CA) if bits are shifted out.", "syntax": "sraw RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 792 | Rc", "hex_opcode": "0x7C000630", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "792", "clean": "792"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "RB", "desc": "Shift Amount Register"}], "pseudocode": "n ← RB[27:31]\nif n = 0 then\n  RA ← RS\n  CA ← 0\nelse if n < 32 then\n  shifted ← RS >> n\n  if RS[0] = 1 ∧ (RS & ((1 << n) - 1)) ≠ 0 then\n    CA ← 1\n  else\n    CA ← 0\n  RA ← shifted\nelse\n  if RS[0] = 1 then\n    RA ← -1\n    CA ← 1\n  else\n    RA ← 0\n    CA ← 0\nif Rc = 1 then\n  CR0 ← (RA = 0) || LT || GT || SO", "example": "sraw r3, r4, r5", "example_note": "r3 = r4 >> r5 (Signed 32-bit).", "extension": "Base", "description": "Arithmetically shift the 32-bit word in RS right by the number of bits specified in RB[27:31], replicating the sign bit into vacated positions. The result is placed in RA. The CA bit in XER is set if any 1-bits are shifted out from a negative value, otherwise cleared. If Rc=1, CR0 is updated based on the result.", "page_found": "Page 149", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "srawi", "architecture": "PowerISA", "full_name": "Shift Right Algebraic Word Immediate", "summary": "Shifts the contents of a register right by an immediate value and replicates the sign bit.", "syntax": "srawi RA, RS, SH", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | SH | 824 | Rc", "hex_opcode": "0x7C000670", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "SH", "clean": "SH"}, {"raw": "824", "clean": "824"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "SH", "desc": "Shift Amount (0-31)"}, {"name": "RT", "desc": "Target General Purpose Register"}], "pseudocode": "if 'srawi' then\n    n ← SH\n    r ← ROTL32((RS)32:63, 64-n)\n    m ← MASK(n+32, 63)\n    s ← (RS)32\n    RA ← r&m | (64s) & ¬m\n    carry ← s & ((r & ¬m)32:63 ≠ 0 )\n    CA   ← carry\n    CA32 ← carry", "example": "srawi r3, r4, 5", "example_note": "r3 = r4 >> 5 (Signed).", "extension": "Base", "description": "The low-order 32 bits of register RS are shifted right SH bits. Bits shifted out of position 63 are lost. Bit 32 of RS is replicated to fill the vacated positions on the left. The 32-bit result is placed into RA32:63. Bit 32 of RS is replicated to fill RA0:31. CA and CA32 are set to 1 if the low-order 32 bits of (RS) contain a negative number and any 1-bits are shifted out of position 63; otherwise CA and CA32 are set to 0. A shift amount of zero causes RA to receive EXTS((RS)32:63), and CA and CA32 to be set to 0.", "special_registers": "CR0, XER", "page_found": "Page 149 - 150", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "stb", "architecture": "PowerISA", "full_name": "Store Byte", "summary": "Stores the low 8 bits of a register to memory.", "syntax": "stb RS, D(RA)", "encoding": {"format": "D-form", "binary_pattern": "10 | DS | RS | RA | SIMM[15:0]", "hex_opcode": "0x98000000", "visual_parts": [{"raw": "38", "clean": "38"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "D", "clean": "D"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "RS", "desc": "Source Register"}, {"name": "D", "desc": "Displacement"}, {"name": "RA", "desc": "Base Register"}, {"name": "EA", "desc": "Effective Address"}], "pseudocode": "EA ← EXTS(D, 16) + (RA | 0)\nMEM(EA, 1) ← RS[56:63]", "example": "stb r3, 0(r4)", "example_note": "Store byte from r3 to address r4.", "extension": "Base", "description": "Store the low 8 bits of RS to the byte in memory at the effective address formed by adding the displacement D (sign-extended) to RA, or to the displacement alone if RA is 0. This is a Base category instruction with no status field updates.", "page_found": "Page 92 - 94", "programming_notes": "The stb instruction is commonly used to store a single byte from a register into memory. Ensure that the destination address is properly aligned for optimal performance and avoid accessing invalid or protected memory regions to prevent exceptions."}
{"mnemonic": "sth", "architecture": "PowerISA", "full_name": "Store Halfword", "summary": "Stores the high half of a doubleword from a register to memory.", "syntax": "sth RS, D(RA)", "encoding": {"format": "D-form", "binary_pattern": "44 | RS | RA | D", "hex_opcode": "0xB0000000", "visual_parts": [{"raw": "44", "clean": "44"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "D", "clean": "D"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "RS", "desc": "Source Register"}, {"name": "D", "desc": "Displacement"}, {"name": "RA", "desc": "Base Register"}], "pseudocode": "EA ← EXTS(D, 16) + (RA | 0)\nMEM(EA, 2) ← RS[48:63]", "example": "sth r3, 0(r4)", "example_note": "Store 16-bit halfword.", "extension": "Base", "description": "Store the low 16 bits of RS to the halfword in memory at the effective address formed by adding the displacement D (sign-extended) to RA, or to the displacement alone if RA is 0. This is a Base category instruction with no status field updates.", "page_found": "Page 93 - 94", "programming_notes": "The sth instruction stores the high half of a register value into memory. Ensure that the destination address is properly aligned to avoid alignment faults. This instruction operates at user privilege level and will raise an exception if the EA is out of bounds or if there are insufficient permissions."}
{"mnemonic": "stw", "architecture": "PowerISA", "full_name": "Store Word", "summary": "Stores the low 32 bits of a register to memory.", "syntax": "stw RS, D(RA)", "encoding": {"format": "D-form", "binary_pattern": "36 | RS | RA | D", "hex_opcode": "0x90000000", "visual_parts": [{"raw": "36", "clean": "36"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "D", "clean": "D"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "RS", "desc": "Source Register"}, {"name": "D", "desc": "Displacement"}, {"name": "RA", "desc": "Base Register"}], "pseudocode": "EA ← EXTS(D, 16) + (RA | 0)\nMEM(EA, 4) ← RS[32:63]", "example": "stw r3, 0(r4)", "example_note": "Store 32-bit word.", "extension": "Base", "description": "Store the low 32 bits of RS to the word in memory at the effective address formed by adding the displacement D (sign-extended) to RA, or to the displacement alone if RA is 0. This is a Base category instruction with no status field updates.", "page_found": "Page 94 - 96", "programming_notes": "The stw instruction stores the lower 32 bits of a register into memory. Ensure that the destination address is properly aligned to avoid alignment faults. This instruction operates at user privilege level and will raise an exception if the EA is out of bounds or access permissions are violated."}
{"mnemonic": "std", "architecture": "PowerISA", "full_name": "Store Doubleword", "summary": "Stores a 64-bit doubleword to memory.", "syntax": "std RS, DS(RA)", "encoding": {"format": "DS-form", "binary_pattern": "62 | RS | RA | DS | 00", "hex_opcode": "0xF8000000", "visual_parts": [{"raw": "62", "clean": "62"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "DS", "clean": "DS"}, {"raw": "00", "clean": "00"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:29 | 30:31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source Register"}, {"name": "DS", "desc": "Displacement (Multiple of 4)"}, {"name": "RA", "desc": "Base Register"}], "pseudocode": "EA ← EXTS(DS || 00, 16) + (RA | 0)\nMEM(EA, 8) ← RS[0:63]", "example": "std r3, 16(r4)", "example_note": "Store 64-bit value.", "extension": "Base", "description": "Store the 64-bit doubleword in RS to memory at the effective address formed by adding the displacement DS (a 14-bit field shifted left 2 positions, thus a multiple of 4) to RA, or to the displacement alone if RA is 0. This is a Base category, 64-bit mode instruction with no status field updates.", "page_found": "Page 96", "programming_notes": "The std instruction stores a doubleword from a source register into memory. Ensure that the destination address is properly aligned to avoid performance penalties or exceptions. This instruction operates at user privilege level and will raise an exception if the EA is out of bounds."}
{"mnemonic": "trap", "architecture": "PowerISA", "full_name": "Trap (Pseudo)", "summary": "Unconditional trap. Forces an exception. (Encoded as tw 31, 0, 0).", "syntax": "trap", "encoding": {"format": "Pseudo", "binary_pattern": "3 | 11111 | 00000 | 00000 | 4 | /", "hex_opcode": "0x0FE00008", "visual_parts": [{"raw": "tw 31, r0, r0", "clean": "tw 31, r0, r0"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "pseudocode": "Trap()", "example": "trap", "example_note": "Crash/Breakpoint.", "extension": "Base", "description": "Trap. Extended mnemonic for TW (tw 31,0,0). Unconditionally traps, transferring control to the system trap handler.", "special_registers": "MSR, SRR0, SRR1", "programming_notes": "Generates a program exception (System Call or Trap type) when the trap condition is true. The condition codes in TO select which comparisons trigger the trap: bit 0 = LT, bit 1 = GT, bit 2 = EQ, bit 3 = LU (unsigned), bit 4 = GU (unsigned). TO=31 (all bits set) always traps."}
{"mnemonic": "xor", "architecture": "PowerISA", "full_name": "XOR", "summary": "Performs a bitwise Exclusive OR comparison.", "syntax": "xor RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 316 | Rc", "hex_opcode": "0x7C000278", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "316", "clean": "316"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}], "pseudocode": "RA ← RS ⊕ RB\nif Rc = 1 then\n  CR0 ← (RA = 0) || LT || GT || SO", "example": "xor r3, r4, r5", "example_note": "r3 = r4 ^ r5", "extension": "Base", "description": "Perform a bitwise XOR of RS and RB, storing the result in RA. If Rc=1, CR0 is updated with the comparison flags based on the result. This is a Base category logical instruction.", "page_found": "Page 141", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "xori", "architecture": "PowerISA", "full_name": "XOR Immediate", "summary": "Performs a bitwise XOR with a 16-bit unsigned immediate.", "syntax": "xori RA, RS, UI", "encoding": {"format": "D-form", "binary_pattern": "26 | RS | RA | UI", "hex_opcode": "0x68000000", "visual_parts": [{"raw": "26", "clean": "26"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "UI", "clean": "UI"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "UI", "desc": "Unsigned 16-bit Immediate"}], "pseudocode": "RA ← RS XOR (0x0000 || UI)", "example": "xori r3, r4, 0x1", "example_note": "Toggle bit 0.", "extension": "Base", "description": "XOR Immediate performs a bitwise XOR between the contents of GPR RS and a 16-bit zero-extended unsigned immediate, storing the result in GPR RA. This is a Base category instruction that does not affect condition registers or status fields.", "page_found": "Page 134", "programming_notes": "The xori instruction is commonly used for setting or clearing specific bits in a register by XORing with a mask. Be cautious of overflow as this operation does not affect the carry flag. The immediate value is zero-extended to 64 bits before the XOR operation, so ensure that the upper bits are not inadvertently set if only lower bits are intended to be modified."}
{"mnemonic": "xoris", "architecture": "PowerISA", "full_name": "XOR Immediate Shifted", "summary": "Performs a bitwise XOR with a 16-bit immediate shifted left by 16 bits.", "syntax": "xoris RA, RS, UI", "encoding": {"format": "D-form", "binary_pattern": "27 | RS | RA | UI", "hex_opcode": "0x6C000000", "visual_parts": [{"raw": "27", "clean": "27"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "UI", "clean": "UI"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "UI", "desc": "Unsigned 16-bit Immediate"}], "pseudocode": "RA ← RS XOR (UI || 0x0000)", "example": "xoris r3, r4, 0xFFFF", "example_note": "Toggle upper 16 bits.", "extension": "Base", "description": "XOR Immediate Shifted performs a bitwise XOR between the contents of GPR RS and a 16-bit unsigned immediate shifted left by 16 bits, storing the result in GPR RA. This is a Base category instruction that does not affect condition registers or status fields.", "page_found": "Page 134", "programming_notes": "The xoris instruction is useful for performing bitwise operations with a large immediate value. Be cautious of overflow if the immediate value exceeds 16 bits, as only the lower 16 bits are considered. This instruction operates at user privilege level and does not generate exceptions under normal circumstances."}
{"mnemonic": "xvsubdp", "architecture": "PowerISA", "full_name": "VSX Vector Subtract Double-Precision", "summary": "Subtracts the contents of two vector registers and places the result in a target vector register.", "syntax": "xvsubdp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "11110001 | 00000000 | 00000000 | 1000", "hex_opcode": "0xF0000340", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "104", "clean": "104"}], "length": "32", "bit_positions": "0:5 | 6:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "VX", "desc": "Target Vector Register"}], "extension": "VSX", "description": "For xvsubdp, each double-precision floating-point operand in the source vector registers is negated and added to the corresponding operand in the other source vector register. The results are normalized and rounded to double precision before being stored in the target vector register.", "pseudocode": "for i = {0, 1} do\n    src1 <- VSR[XA][i]\n    src2 <- VSR[XB][i]\n    if src1 is NaN or src2 is NaN then\n        v <- Q(src1) if src1 is NaN else Q(src2)\n        vxsnan_flag <- 1 if either src1 or src2 is SNaN\n    else if src1 is +Infinity and src2 is +Infinity then\n        v <- +Infinity\n        vxisi_flag <- 1\n    else if src1 is -Infinity and src2 is -Infinity then\n        v <- -Infinity\n        vxisi_flag <- 1\n    else if src1 is NZF and src2 is NZF then\n        v <- S(src1, -src2)\n    else if src1 is Zero and src2 is Zero then\n        v <- Rezd\n    else if src1 is +Zero and src2 is -Zero then\n        v <- +Zero\n    else if src1 is -Zero and src2 is +Zero then\n        v <- -Zero\n    else if src1 is NZF and src2 is Zero then\n        v <- src1\n    else if src1 is Zero and src2 is NZF then\n        v <- -src2\n    else if src1 is NZF and src2 is +Infinity then\n        v <- -Infinity\n    else if src1 is NZF and src2 is -Infinity then\n        v <- +Infinity\n    else if src1 is Zero and src2 is +Infinity then\n        v <- -Infinity\n    else if src1 is Zero and src2 is -Infinity then\n        v <- +Infinity\n    VSR[VX][i] <- v", "special_registers": "vxisi_flag, vxsnan_flag", "page_found": "Page 741 - 742", "programming_notes": "The xvsubdp instruction performs element-wise subtraction of double-precision floating-point numbers from two source vectors, negating the operands before addition. Be cautious with NaN and infinity values as they can set flags (vxsnan_flag, vxisi_flag) and affect results. Ensure proper alignment for vector registers to avoid performance penalties.", "example": "xvsubdp vs1, vs2, vs3"}
{"mnemonic": "xvmuldp", "architecture": "PowerISA", "full_name": "VSX Vector Multiply Double-Precision", "summary": "Multiplies two double-precision floating-point numbers in vector registers and stores the result.", "syntax": "xvmuldp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 112", "hex_opcode": "0xF0000380", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "112", "clean": "112"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "VSX Vector Multiply Double-Precision multiplies two double-precision floating-point elements from VSX registers XA and XB, storing the results in VSX register XT. This VSX category instruction processes two 64-bit elements in parallel and may update FPSCR with floating-point exception flags.", "pseudocode": "XT[0:63] ← XA[0:63] × XB[0:63]\nXT[64:127] ← XA[64:127] × XB[64:127]", "special_registers": "FPSCR", "page_found": "Page 735 - 736", "programming_notes": "The xvmuldp instruction performs element-wise multiplication of double-precision floating-point values in VSX registers. Ensure that the input vectors are properly aligned to avoid alignment faults. Be cautious with NaN and infinity handling, as they follow specific rules for propagation and sign determination. This instruction operates at user privilege level.", "example": "xvmuldp vs1, vs2, vs3"}
{"mnemonic": "xvdivdp", "architecture": "PowerISA", "full_name": "VSX Vector Divide Double-Precision", "summary": "Divides the contents of two vector registers and places the result in another vector register.", "syntax": "xvdivdp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 120", "hex_opcode": "0xF00003C0", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "120", "clean": "120"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register (Dividend)"}, {"name": "VRB", "desc": "Source Vector Register (Divisor)"}], "extension": "VSX", "description": "For xvdivdp, each double-precision floating-point operand in doubleword elements of VSR[XA] is divided by the corresponding operand in VSR[XB], producing a quotient that is normalized and rounded to double precision. The result is placed into doubleword elements of VSR[XT].", "pseudocode": "for i = 0 to 1 do\n    src1 <- VSR[XA][i]\n    src2 <- VSR[XB][i]\n    if src2 is NaN then\n        v <- Q(src2)\n        vxsnan_flag <- 1\n    else if src1 is NaN then\n        v <- Q(src1)\n        vxsnan_flag <- 1\n    else if src1 is +Infinity and src2 is +Infinity then\n        v <- +Infinity\n        vxidi_flag <- 1\n    else if src1 is -Infinity and src2 is -Infinity then\n        v <- +Infinity\n        vxidi_flag <- 1\n    else if src1 is +Infinity and src2 is -Infinity then\n        v <- -Infinity\n        vxidi_flag <- 1\n    else if src1 is -Infinity and src2 is +Infinity then\n        v <- -Infinity\n        vxidi_flag <- 1\n    else if src1 is +Zero and src2 is +Zero then\n        v <- +Zero\n        zx_flag <- 1\n    else if src1 is -Zero and src2 is -Zero then\n        v <- +Zero\n        zx_flag <- 1\n    else if src1 is +Zero and src2 is -Zero then\n        v <- -Zero\n        zx_flag <- 1\n    else if src1 is -Zero and src2 is +Zero then\n        v <- -Zero\n        zx_flag <- 1\n    else if src1 is +Infinity or src1 is -Infinity and src2 is not zero then\n        v <- Q(src2)\n        vxidi_flag <- 1\n    else if src2 is +Zero or src2 is -Zero and src1 is not zero then\n        v <- dQNaN\n        vxzdz_flag <- 1\n    else\n        v <- D(src1, src2)\n    VSR[VRT][i] <- v", "special_registers": "FPSCR, VXSNAN, VXIDI, VXZDZ, OX, UX, ZX, XX", "page_found": "Page 731 - 732", "programming_notes": "The xvdivdp instruction performs element-wise division of double-precision floating-point numbers. Ensure that the input vectors are properly aligned and that the destination vector is distinct to avoid unintended data corruption. Be aware of special cases like division by zero, which sets VXZDZ flag and results in a NaN. Handle exceptions by checking the FPSCR register flags after execution.", "example": "xvdivdp vs1, vs2, vs3"}
{"mnemonic": "xvabsdp", "architecture": "PowerISA", "full_name": "VSX Vector Absolute Value Double-Precision", "summary": "Computes the absolute value of each double-precision floating-point element in a vector.", "syntax": "xvabsdp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 473", "hex_opcode": "0xF0000764", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "473", "clean": "473"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "The instruction computes the absolute value of each double-precision floating-point element in the source vector VSR[XB] and stores the result in the target vector VSR[XT].", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\ndo i = 0 to 1\n    src ←VSR[32×BX+B].dword[i]\n    VSR[32×TX+T].dword[i] ←bfp64_ABSOLUTE(src)\nend", "page_found": "Page 646 - 647", "special_registers": "MSR", "programming_notes": "This instruction is used to compute the absolute value of each double-precision floating-point element in a vector. Ensure that VSX (Vector Scalar Extensions) is enabled by checking and setting the appropriate bit in the MSR register. The operation processes two elements per vector register, so ensure proper alignment if manipulating individual elements directly.", "example": "xvabsdp vs1, vs3"}
{"mnemonic": "xvnegdp", "architecture": "PowerISA", "full_name": "VSX Vector Negate Double-Precision", "summary": "Negates the contents of a double-precision floating-point vector register and stores the result in another vector register.", "syntax": "xvnegdp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 489", "hex_opcode": "0xF00007E4", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "489", "clean": "489"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "The instruction negates each doubleword element of the source vector register VSR[XB] and stores the results in the target vector register VSR[XT].", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\ndo i = 0 to 3\n    src ←VSR[32×BX+B].dword[i]\n    VSR[32×TX+T].dword[i] ←bfp64_NEGATE(src)\nend", "page_found": "Page 649 - 650", "special_registers": "MSR", "programming_notes": "This instruction is used to negate each double-precision floating-point element in a vector. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting the appropriate bit in the MSR register. The operation processes four elements per vector register, so ensure proper alignment of data for optimal performance. This instruction operates at the user privilege level and will raise an exception if VSX is not available.", "example": "xvnegdp vs1, vs3"}
{"mnemonic": "xvsqrtdp", "architecture": "PowerISA", "full_name": "VSX Vector Square Root Double-Precision", "summary": "Computes the square root of each double-precision floating-point element in a vector.", "syntax": "xvsqrtdp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 203", "hex_opcode": "0xF000032C", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "203", "clean": "203"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "For xvsqrtdp, the unbounded-precision square root of each double-precision floating-point operand in doubleword elements of VSR[XB] is computed and rounded to double-precision format. The result is placed into corresponding elements of VSR[XT].", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nex_flag ←0b0\ndo i = 0 to 1\n    reset_xflags()\n    src ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    v   ←bfp_SQUARE_ROOT(src)\n    rnd ←bfp_ROUND_TO_BFP64(0b0,FPSCR.RN,v)\n    vresult.dword[i] ←bfp64_CONVERT_FROM_BFP(rnd)\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vxsqrt_flag=1 then SetFX(FPSCR.VXSQRT)\n    if xx_flag=1 then SetFX(FPSCR.XX)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vxsqrt_flag) | (FPSCR.XE & xx_flag)\nend\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR FX XX VXSNAN VXSQRT", "page_found": "Page 739 - 740", "programming_notes": "The xvsqrtdp instruction computes the square root of each double-precision floating-point operand in a vector. Ensure that VSX is enabled by checking MSR.VSX. Handle exceptions by examining FPSCR flags such as VXSNAN, VXSQRT, and XX. The instruction operates on aligned data and requires supervisor privilege level.", "example": "xvsqrtdp vs1, vs3"}
{"mnemonic": "xvmaxdp", "architecture": "PowerISA", "full_name": "Vector Scalar Maximum Double-Precision Floating Point", "summary": "Compares two double-precision floating-point values and selects the maximum value for each element.", "syntax": "xvmaxdp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 224", "hex_opcode": "0xF0000700", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "224", "clean": "224"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "For xvmaxdp, the instruction compares the double-precision floating-point values in the elements of VSR[XA] and VSR[XB], and places the maximum value into the corresponding elements of VSR[XT].", "pseudocode": "for i in {0, 1} do\n    src1 <- VSR[XA][i]\n    src2 <- VSR[XB][i]\n    if src1 is QNaN or src2 is QNaN then\n        T(Q(src2))\n    else if src1 is SNaN or src2 is SNaN then\n        fx(VXSNAN)\n    else if src1 is +Infinity and src2 is -Infinity then\n        T(src1)\n    else if src1 is -Infinity and src2 is +Infinity then\n        T(src2)\n    else if src1 is NZF and src2 is Zero then\n        T(src1)\n    else if src1 is Zero and src2 is NZF then\n        T(src2)\n    else if src1 is NZF and src2 is NZF then\n        T(M(src1,src2))\n    else if src1 is +Zero and src2 is +Zero then\n        T(src1)\n    else if src1 is -Zero and src2 is -Zero then\n        T(src2)\n    else if src1 is +Infinity and src2 is +Infinity then\n        T(src1)\n    else if src1 is -Infinity and src2 is -Infinity then\n        T(src2)\n    else if src1 is QNaN or SNaN then\n        T(src2)\n    end if\nend for", "special_registers": "FPSCR (FX, VXSNAN)", "page_found": "Page 812 - 813", "programming_notes": "This instruction compares two double-precision floating-point vectors element-wise and stores the maximum value in each corresponding element of the destination vector. Be cautious with NaN values, as they can trigger exceptions or propagate through the operation. Ensure that the input vectors are properly aligned to avoid performance penalties.", "example": "xvmaxdp vs1, vs2, vs3"}
{"mnemonic": "xvmindp", "architecture": "PowerISA", "full_name": "VSX Vector Minimum Double-Precision", "summary": "Compares two double-precision floating-point values and selects the minimum value for each element.", "syntax": "xvmindp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "111100 | XA | XT | 000000 | 000000 | 000000 | 000000 | 000000 | 000000", "hex_opcode": "0xF0000740", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "232", "clean": "232"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "VSX Vector Minimum Double-Precision compares two double-precision floating-point elements from VSX registers XA and XB element-wise, selecting the minimum value for each element and storing results in VSX register XT. This VSX category instruction processes two 64-bit elements in parallel and follows IEEE 754 minimum semantics.", "pseudocode": "XT[0:63] ← min(XA[0:63], XB[0:63])\nXT[64:127] ← min(XA[64:127], XB[64:127])", "special_registers": "FPSCR (FX, VXSNAN)", "page_found": "Page 816 - 817", "programming_notes": "The xvmindp instruction is used to perform element-wise minimum comparison of double-precision floating-point values in VSX registers. Ensure that the input vectors are properly aligned and that the FPSCR register is correctly configured to handle exceptions like NaNs or infinities. This instruction operates at a privilege level that allows access to VSX registers, typically requiring supervisor or higher privileges.", "example": "xvmindp vs1, vs2, vs3"}
{"mnemonic": "xvcmpeqdp", "architecture": "PowerISA", "full_name": "VSX Vector Compare Equal Double-Precision", "summary": "Compares two double-precision floating-point values in vector registers and sets the target register based on equality.", "syntax": "xvcmpeqdp XT,XA,XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | Rc | AX | BX | TX", "hex_opcode": "0xF0000318", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "99", "clean": "99"}], "length": "32", "bit_positions": "6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "For xvcmpeqdp, each element of the source vectors VSR[XA] and VSR[XB] is compared. The result is stored in VSR[XT]. If Rc=1, CR field 6 is updated with comparison results.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nex_flag ←0b0\nall_false ←0b1\nall_true ←0b1\ndo i = 0 to 1\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[i])\n    src2 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    vxsnan_flag ←IsSNaN(src1) | IsSNaN(src2)\n    if src1 = src2 then do\n        all_false ←0b0\n    end\n    else do\n        vresult.dword[i] ←0x0000_0000_0000_0000\n        all_true ←0b0\n    end\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag)\nend\nif Rc=1 then do\n    if vex_flag=0 then\n        CR[6] ←all_true || 0b0 || all_false || 0b0\n    else\n        CR[6] ←0bUUUU\nend", "special_registers": "CR, FPSCR", "page_found": "Page 806 - 807", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xvcmpeqdp vs1, vs2, vs3"}
{"mnemonic": "xvcmpgtdp", "architecture": "PowerISA", "full_name": "VSX Vector Compare Greater Than Double-Precision", "summary": "Compares two double-precision floating-point values and sets the target vector register based on the comparison.", "syntax": "xvcmpgtdp XT,XA,XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | Rc | AX | BX | TX", "hex_opcode": "0xF0000358", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "107", "clean": "107"}], "length": "32", "bit_positions": "6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "For xvcmpgtdp, each element of the source vectors VSR[XA] and VSR[XB] is compared. The result is stored in VSR[XT]. If Rc=1, CR Field 6 is updated with the results of the comparison.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ← 0b0\nall_false ← 0b1\nall_true ← 0b1\ndo i = 0 to 1\n    reset_xflags()\n    src1 ← bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[i])\n    src2 ← bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    if src1.class.SNaN | src2.class.SNaN then do\n        vxsnan_flag ← 0b1\n        if FPSCR.VE=0 then vxvc_flag ← 0b1\n    end else vxvc_flag ← IsQNaN(src1) | IsQNaN(src2)\n    if src1 > src2 then do\n        vresult.dword[i] ← 0xFFFF_FFFF_FFFF_FFFF\n        all_false ← 0b0\n    end else do\n        all_true ← 0b0\n        vresult.dword[i] ← 0x0000_0000_0000_0000\n    end\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vxvc_flag=1 then SetFX(FPSCR.VXVC)\n    ex_flag ← ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vxvc_flag)\nend\nif ex_flag=0 then VSR[32×TX+T] ← vresult\nif Rc=1 then do\n    if vex_flag=0 then CR.field[6] ← all_true || 0b0 || all_false || 0b0 else CR.field[6] ← 0bUUUU\nend", "special_registers": "CR, FPSCR", "page_found": "Page 810 - 811", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xvcmpgtdp vs1, vs2, vs3"}
{"mnemonic": "xvcmpgedp", "architecture": "PowerISA", "full_name": "VSX Vector Compare Greater or Equal Double-Precision", "summary": "Compares two double-precision floating-point values and sets the target vector register based on the comparison.", "syntax": "xvcmpgedp XT,XA,XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | Rc | 115 | AX | BX | TX", "hex_opcode": "0xF0000398", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "115", "clean": "115"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VSX", "description": "For xvcmpgedp, each integer value i from 0 to 1, the double-precision floating-point operand in doubleword element i of VSR[XA] is compared to the double-precision floating-point operand in doubleword element i of VSR[XB]. The contents of doubleword element i of VSR[XT] are set to all 1s if src1 is greater than or equal to src2, and is set to all 0s otherwise.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nex_flag ←0b0\nall_false ←0b1\nall_true ←0b1\ndo i = 0 to 1\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[i])\n    src2 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    if src1.class.SNaN | src2.class.SNaN then do\n        vxsnan_flag ←0b1\n        if FPSCR.VE=0 then vxvc_flag ←0b1\n    end\n    else vxvc_flag ←IsQNaN(src1) | IsQNaN(src2)\n    if src1 >= src2 then do\n        vresult.dword[i] ←0xFFFF_FFFF_FFFF_FFFF\n        all_false ←0b0\n    end\n    else do\n        vresult.dword[i] ←0x0000_0000_0000_0000\n        all_true ←0b0\n    end\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vxvc_flag=1 then SetFX(FPSCR.VXVC)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vxvc_flag)\nend\nif ex_flag=0 then VSR[32×TX+T] ←vresult\nif Rc=1 then do\n    if vex_flag=0 then CR.field[6] ←all_true || 0b0 || all_false || 0b0\n    else CR.field[6] ←0bUUUU\nend", "special_registers": "CR6, FPSCR", "page_found": "Page 808 - 809", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xvcmpgedp vs1, vs2, vs3"}
{"mnemonic": "xvaddsp", "architecture": "PowerISA", "full_name": "VSX Vector Add Single-Precision", "summary": "Adds the contents of two single-precision floating-point vector registers and places the result in another vector register.", "syntax": "xvaddsp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 64", "hex_opcode": "0xF0000200", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "64", "clean": "64"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "VSRD", "desc": "Destination Vector-Single-Precision Register"}, {"name": "VSRA", "desc": "Source Vector-Single-Precision Register"}, {"name": "VSRC", "desc": "Source Vector-Single-Precision Register"}], "extension": "VSX", "description": "For xvaddsp, each element of the source vector VSRA is added to the corresponding element of the source vector VSRC, and the results are placed into the destination vector VSRD.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\ndo i = 0 to 3\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP32(VSR[32×AX+A].word[i])\n    src2 ←bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n    v    ←bfp_ADD(src1,src2)\n    rnd  ←bfp_ROUND_TO_BFP32(FPSCR.RN,v)\n    vresult.word[i] ←bfp32_CONVERT_FROM_BFP(rnd)\n\n    if vxisi_flag=1 then SetFX(FPSCR.VXISI)\n    if ox_flag=1 then SetFX(FPSCR.OX)\n    if ux_flag=1 then SetFX(FPSCR.UX)\n    if xx_flag=1 then SetFX(FPSCR.XX)\n\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vxisi_flag) | (FPSCR.OE & ox_flag) | (FPSCR.UE & ux_flag) | (FPSCR.XE & xx_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "page_found": "Page 564 - 565", "special_registers": "VSR, vxsnan_flag, vxisi_flag", "programming_notes": "The xvaddsp instruction is used for adding single-precision floating-point numbers in vector registers. Ensure that the VSX feature is enabled by checking and setting MSR.VSX. Be aware of potential exceptions such as invalid operations (VXISI), overflow (OX), underflow (UX), or inexact results (XX). These conditions can be checked using the FPSCR flags.", "example": "xvaddsp vs1, vs2, vs3"}
{"mnemonic": "xvsubsp", "architecture": "PowerISA", "full_name": "VSX Vector Subtract Single-Precision", "summary": "Subtracts the contents of two vector registers and places the result in another vector register.", "syntax": "xvsubsp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "110000 | VX | XA | XB | 000000 | 000000 | 000000 | 000000", "hex_opcode": "0xF0000240", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "72", "clean": "72"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "VX", "desc": "Target Vector Register"}], "extension": "VSX", "description": "For xvsubsp, each single-precision floating-point operand in word elements of VSR[XA] is negated and added to the corresponding element in VSR[XB]. The results are normalized and rounded to single precision before being placed into VSR[XT].", "pseudocode": "for i = 0 to 3 do\n    src1 <- VSR[XA][i]\n    src2 <- VSR[XB][i]\n    if src1 is NaN or src2 is NaN then\n        v <- Q(src1) or Q(src2)\n        vxsnan_flag <- 1\n    else if src1 is +Infinity and src2 is +Infinity then\n        v <- +Infinity\n        vxisi_flag <- 1\n    else if src1 is -Infinity and src2 is -Infinity then\n        v <- -Infinity\n        vxisi_flag <- 1\n    else if src1 is NZF and src2 is NZF then\n        v <- S(src1, -src2)\n    else if src1 is Zero and src2 is Zero then\n        v <- Rezd\n    else if src1 is +Zero and src2 is -Zero then\n        v <- +Zero\n    else if src1 is -Zero and src2 is +Zero then\n        v <- -Zero\n    else if src1 is NZF and src2 is Zero then\n        v <- src1\n    else if src1 is Zero and src2 is NZF then\n        v <- -src2\n    else if src1 is +Infinity and src2 is NZF then\n        v <- +Infinity\n    else if src1 is NZF and src2 is +Infinity then\n        v <- -Infinity\n    else if src1 is -Infinity and src2 is NZF then\n        v <- -Infinity\n    else if src1 is NZF and src2 is -Infinity then\n        v <- +Infinity\n    VSR[VX][i] <- v", "special_registers": "vxsnan_flag, vxisi_flag", "page_found": "Page 743 - 744", "programming_notes": "The xvsubsp instruction performs element-wise subtraction of single-precision floating-point numbers in VSX registers. Be cautious with NaNs, infinities, and zeros as they can trigger special flags (vxsnan_flag, vxisi_flag) and may result in unexpected outcomes. Ensure that the input vectors are properly aligned to avoid alignment faults.", "example": "xvsubsp vs1, vs2, vs3"}
{"mnemonic": "xvmulsp", "architecture": "PowerISA", "full_name": "VSX Vector Multiply Single-Precision", "summary": "Multiplies the contents of two single-precision floating-point values and places the result into a vector register.", "syntax": "xvmulsp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 80", "hex_opcode": "0xF0000280", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "80", "clean": "80"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "VSX Vector Multiply Single-Precision multiplies four single-precision floating-point elements from VSX registers XA and XB, storing the results in VSX register XT. This VSX category instruction processes four 32-bit elements in parallel and may update FPSCR with floating-point exception flags.", "pseudocode": "XT[0:31] ← XA[0:31] × XB[0:31]\nXT[32:63] ← XA[32:63] × XB[32:63]\nXT[64:95] ← XA[64:95] × XB[64:95]\nXT[96:127] ← XA[96:127] × XB[96:127]", "special_registers": "FPSCR", "page_found": "Page 737 - 738", "programming_notes": "The xvmulsp instruction performs element-wise multiplication of single-precision floating-point values in vector registers. Ensure that the input vectors are properly aligned to avoid alignment faults. Be cautious with NaN and infinity handling, as they follow specific rules for propagation and sign determination. This instruction operates at user privilege level.", "example": "xvmulsp vs1, vs2, vs3"}
{"mnemonic": "xvdivsp", "architecture": "PowerISA", "full_name": "VSX Vector Divide Single-Precision", "summary": "Divides the contents of two vector registers and places the result in another vector register.", "syntax": "xvdivsp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 88", "hex_opcode": "0xF00002C0", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "88", "clean": "88"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "VD", "desc": "Destination Vector Register"}, {"name": "VA", "desc": "Source Vector Register (Dividend)"}, {"name": "VB", "desc": "Source Vector Register (Divisor)"}], "extension": "VSX", "description": "For xvdivsp, each element of the source vectors VSR[XA] and VSR[XB] is divided to produce a quotient that is placed into the corresponding element of the target vector VSR[XT].", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\ndo i = 0 to 3\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP32(VSR[32×AX+A].word[i])\n    src2 ←bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n    v    ←bfp_DIVIDE(src1,src2)\n    rnd  ←bfp_ROUND_TO_BFP32(FPSCR.RN,v)\n    vresult.word[i] ←bfp32_CONVERT_FROM_BFP(rnd)\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vxidi_flag=1 then SetFX(FPSCR.VXIDI)\n    if vxisi_flag=1 then SetFX(FPSCR.VXZDZ)\n    if ox_flag=1 then SetFX(FPSCR.OX)\n    if ux_flag=1 then SetFX(FPSCR.UX)\n    if xx_flag=1 then SetFX(FPSCR.XX)\n    if zx_flag=1 then SetFX(FPSCR.ZX)\n\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) \n                       | (FPSCR.VE & vxidi_flag) \n                       | (FPSCR.VE & vxzdz_flag) \n                       | (FPSCR.OE & ox_flag) \n                       | (FPSCR.UE & ux_flag) \n                       | (FPSCR.ZE & zx_flag) \n                       | (FPSCR.XE & xx_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR, VXSNAN, VXIDI, VXZDZ, OX, UX, ZX, XX", "page_found": "Page 733 - 734", "programming_notes": "The xvdivsp instruction performs element-wise division of single-precision floating-point numbers in VSX vectors. Ensure that the VSX facility is enabled (MSR.VSX=1) to avoid exceptions. Handle potential exceptions by checking the FPSCR flags, especially VXSNAN, VXIDI, VXZDZ, OX, UX, ZX, and XX. Be cautious of alignment requirements for vector registers to maintain performance.", "example": "xvdivsp vs1, vs2, vs3"}
{"mnemonic": "xvabssp", "architecture": "PowerISA", "full_name": "VSX Vector Absolute Value Single-Precision", "summary": "Computes absolute value for four single-precision floats.", "syntax": "xvabssp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 409", "hex_opcode": "0xF0000664", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "409", "clean": "409"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "VSX Vector Absolute Value Single-Precision computes the absolute value of four single-precision floating-point elements from VSX register XB, storing the results in VSX register XT. This VSX category instruction clears the sign bit of each 32-bit element and does not affect floating-point status flags.", "pseudocode": "XT[0:31] ← |XB[0:31]|\nXT[32:63] ← |XB[32:63]|\nXT[64:95] ← |XB[64:95]|\nXT[96:127] ← |XB[96:127]|", "page_found": "Page 647", "special_registers": "MSR", "programming_notes": "The xvabssp instruction is used to compute the absolute value of each single-precision floating-point element in a vector register. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting the appropriate bit in the MSR register. This instruction processes four elements per operation, so ensure your data is appropriately aligned for optimal performance.", "example": "xvabssp vs1, vs3"}
{"mnemonic": "xvnegsp", "architecture": "PowerISA", "full_name": "VSX Vector Negate Single-Precision", "summary": "Negates the contents of a single-precision floating-point register.", "syntax": "xvnegsp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 425", "hex_opcode": "0xF00006E4", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "425", "clean": "425"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VSX", "pseudocode": "XT[0:31] ← -XB[0:31]\nXT[32:63] ← -XB[32:63]\nXT[64:95] ← -XB[64:95]\nXT[96:127] ← -XB[96:127]", "page_found": "Page 1452 - 1453", "description": "VSX Vector Negate Single-Precision negates four single-precision floating-point elements from VSX register XB, storing the results in VSX register XT. This VSX category instruction inverts the sign bit of each 32-bit element and does not affect floating-point status flags.", "programming_notes": "Use xvnegsp to negate each single-precision float in a VSX vector. Ensure vectors are properly aligned; misalignment can cause exceptions. This instruction operates at user privilege level.", "example": "xvnegsp vs1, vs3"}
{"mnemonic": "xvsqrtsp", "architecture": "PowerISA", "full_name": "VSX Vector Square Root Single-Precision", "summary": "Computes the square root of each single-precision floating-point element in a vector.", "syntax": "xvsqrtsp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 139", "hex_opcode": "0xF000022C", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "139", "clean": "139"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "For xvsqrtsp, the unbounded-precision square root of each single-precision floating-point operand in word elements i of VSR[XB] is computed. The result is rounded to single precision using the rounding mode specified by RN and placed into word element i of VSR[XT].", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nex_flag ←0b0\ndo i = 0 to 3\n    reset_xflags()\n    src ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].word[i])\n    v   ←bfp_SQUARE_ROOT(src)\n    rnd ←bfp_ROUND_TO_BFP32(FPSCR.RN,v)\n    vresult.word[i] ←bfp32_CONVERT_FROM_BFP(rnd)\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vxsqrt_flag=1 then SetFX(FPSCR.VXSQRT)\n    if xx_flag=1     then SetFX(FPSCR.XX)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vxsqrt_flag) | (FPSCR.XE & xx_flag)\nend\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR, VXSNAN, VXSQRT, XX", "page_found": "Page 740 - 741", "programming_notes": "The xvsqrtsp instruction computes the square root of each single-precision floating-point element in a vector. Ensure that VSX is enabled (MSR.VSX=1) to avoid exceptions. Handle potential exceptions by checking FPSCR flags such as VXSNAN, VXSQRT, and XX. The instruction operates on 4 elements per vector register.", "example": "xvsqrtsp vs1, vs3"}
{"mnemonic": "xvmaxsp", "architecture": "PowerISA", "full_name": "VSX Vector Maximum Single-Precision", "summary": "Computes the maximum of corresponding single-precision floating-point elements in two vector registers and stores the result in a third vector register.", "syntax": "xvmaxsp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 192", "hex_opcode": "0xF0000600", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "192", "clean": "192"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "For xvmaxsp, the instruction compares each element of the source vectors VSR[XA] and VSR[XB] and places the larger value into the corresponding element of the target vector VSR[XT].", "pseudocode": "for i = 0 to 3 do\n    src1 <- VSR[XA][i]\n    src2 <- VSR[XB][i]\n    if isNaN(src1) or isNaN(src2) then\n        fx(VXSNAN)\n        T(Q(src2))\n    else if isInfinity(src1) and isInfinity(src2) and sign(src1) != sign(src2) then\n        fx(VXSNAN)\n        T(Q(src2))\n    else if isZero(src1) and isZero(src2) and sign(src1) != sign(src2) then\n        fx(VXSNAN)\n        T(Q(src2))\n    else\n        T(M(src1, src2))\n    end if\nend for", "special_registers": "FPSCR (FX, VXSNAN)", "page_found": "Page 814 - 815", "programming_notes": "The xvmaxsp instruction compares each element of two source vectors and stores the larger value in the target vector. It handles NaNs by setting VXSNAN in the FPSCR and transferring the quiet NaN to the result. Be cautious with infinities and zeros of opposite signs, as they also trigger VXSNAN. Ensure that the vectors are properly aligned for optimal performance.", "example": "xvmaxsp vs1, vs2, vs3"}
{"mnemonic": "xvminsp", "architecture": "PowerISA", "full_name": "VSX Vector Minimum Single-Precision", "summary": "Performs a minimum operation on single-precision floating-point values from two vector scalar registers and stores the result in another vector scalar register.", "syntax": "xvminsp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 200", "hex_opcode": "0xF0000640", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "200", "clean": "200"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "VSX Vector Minimum Single-Precision compares four single-precision floating-point elements from VSX registers XA and XB element-wise, selecting the minimum value for each element and storing results in VSX register XT. This VSX category instruction processes four 32-bit elements in parallel and follows IEEE 754 minimum semantics.", "pseudocode": "XT[0:31] ← min(XA[0:31], XB[0:31])\nXT[32:63] ← min(XA[32:63], XB[32:63])\nXT[64:95] ← min(XA[64:95], XB[64:95])\nXT[96:127] ← min(XA[96:127], XB[96:127])", "special_registers": "FPSCR (FX, VXSNAN)", "page_found": "Page 818 - 819", "programming_notes": "The xvminsp instruction is commonly used for performing element-wise minimum comparisons on single-precision floating-point values in VSX registers. Ensure that the VSX facility is enabled by checking and setting the MSR.VSX bit. Be aware of the VXSNAN flag, which indicates a quiet NaN result; this can be checked via the FPSCR register. The instruction operates at the user privilege level and does not raise exceptions unless enabled through the FPSCR's VE (Invalid Operation Enable) bit.", "example": "xvminsp vs1, vs2, vs3"}
{"mnemonic": "xvcmpeqsp", "architecture": "PowerISA", "full_name": "VSX Vector Compare Equal Single-Precision", "summary": "Compares each single-precision floating-point element of two VSX registers and sets the corresponding element in the target register to all 1s if they are equal, otherwise all 0s.", "syntax": "xvcmpeqsp XT,XA,XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | Rc | AX | BX | TX", "hex_opcode": "0xF0000218", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "67", "clean": "67"}], "length": "32", "bit_positions": "6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "For xvcmpeqsp, each integer value i from 0 to 3, the single-precision floating-point operand in word element i of VSR[XA] is compared to the single-precision floating-point operand in word element i of VSR[XB]. The contents of word element i of VSR[XT] are set to all 1s if they are equal, and all 0s otherwise.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nex_flag ←0b0\nall_false ←0b1\nall_true ←0b1\ndo i = 0 to 3\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP32(VSR[32×AX+A].word[i])\n    src2 ←bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n    vxsnan_flag ←IsSNaN(src1) | IsSNaN(src2)\n    if src1 = src2 then do\n        all_false ←0b0\n    end\n    else do\n        vresult.word[i] ←0x0000_0000\n        all_true ←0b0\n    end\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag)\nend\nif Rc=1 then do\n    if vex_flag=0 then\n        CR.field[6] ←all_true || 0b0 || all_false || 0b0\n    else\n        CR.field[6] ←0bUUUU\nend", "special_registers": "CR, FPSCR", "page_found": "Page 807 - 808", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xvcmpeqsp vs1, vs2, vs3"}
{"mnemonic": "xvcmpgtsp", "architecture": "PowerISA", "full_name": "VSX Vector Compare Greater Than Single-Precision", "summary": "Compares each single-precision floating-point element in two vector registers and sets the corresponding element in a target vector register to all 1s if the first element is greater than the second, otherwise all 0s.", "syntax": "xvcmpgtsp XT,XA,XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | Rc | AX | BX | TX", "hex_opcode": "0xF0000258", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "75", "clean": "75"}], "length": "32", "bit_positions": "6:10 | 11:15 | 16:20 | 21 | 22:28 | 29 | 30:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "For xvcmpgtsp, each integer value i from 0 to 3, the single-precision floating-point operand in word element i of VSR[XA] is compared to the single-precision floating-point operand in word element i of VSR[XB]. The contents of word element i of VSR[XT] are set to all 1s if the first operand is greater than the second, and all 0s otherwise.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\nall_false ←0b1\nall_true ←0b1\ndo i = 0 to 3\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP32(VSR[32×AX+A].word[i])\n    src2 ←bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n    if IsSNaN(src1)=1 | IsSNaN(src2)=1 then do\n        vxsnan_flag ←0b1\n        if FPSCR.VE=0 then vxvc_flag ←0b1\n    end\n    else\n        vxvc_flag ←src1.class.QNaN | src2.class.QNaN\n    if src1 > src2 then do\n        vresult.word[i] ←0xFFFF_FFFF\n        all_false ←0b0\n    end\n    else\n        vresult.word[i] ←0x0000_0000\n        all_true ←0b0\n    end\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vxvc_flag=1 then SetFX(FPSCR.VXVC)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vxvc_flag)\nend\nif ex_flag=0 then VSR[32×TX+T] ←vresult\nif Rc=1 then do\n    if vex_flag=0 then\n        CR.field[6] ←all_true || 0b0 || all_false || 0b0\n    else\n        CR.field[6] ←0bUUUU\nend", "special_registers": "CR6, FPSCR", "page_found": "Page 811 - 812", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xvcmpgtsp vs1, vs2, vs3"}
{"mnemonic": "xvcmpgesp", "architecture": "PowerISA", "full_name": "VSX Vector Compare Greater or Equal Single-Precision", "summary": "Compares each element of two single-precision floating-point vectors and sets the target vector elements to all 1s if the corresponding source elements are greater than or equal, otherwise all 0s.", "syntax": "xvcmpgesp XT,XA,XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | Rc | 83 | AX | BX | TX", "hex_opcode": "0xF0000298", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "83", "clean": "83"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "For xvcmpgesp, each element of the single-precision floating-point vector in VSR[XA] is compared with the corresponding element in VSR[XB]. The result is stored in VSR[XT]. If Rc=1, CR field 6 is updated based on the comparison results.", "pseudocode": "if 'xvcmpgesp' then\n    for each integer value i from 0 to 3 do\n        src1 ← bfp_CONVERT_FROM_BFP32(VSR[32×AX+A].word[i])\n        src2 ← bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n        if src1.class.SNaN | src2.class.SNaN then\n            vxsnan_flag ← 0b1\n            if FPSCR.VE=0 then vxvc_flag ← 0b1\n        else vxvc_flag ← IsQNaN(src1) | IsQNaN(src2)\n        if src1 >= src2 then\n            vresult.word[i] ← 0xFFFF_FFFF\n        else\n            vresult.word[i] ← 0x0000_0000\n        ex_flag ← ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vxvc_flag)\n    end\n    if ex_flag=0 then VSR[32×TX+T] ← vresult\n    if Rc=1 then do\n        CR.field[6] ← all_true || 0b0 || all_false || 0b0\n    end", "special_registers": "CR6, FPSCR (FX VXSNAN VXVC)", "page_found": "Page 809 - 810", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xvcmpgesp vs1, vs2, vs3"}
{"mnemonic": "xscvdpsxds", "architecture": "PowerISA", "full_name": "VSX Scalar Convert Double-Precision to Signed Doubleword with Round to Zero", "summary": "Converts a double-precision floating-point value to a signed doubleword integer using round towards zero.", "syntax": "xscvdpsxds XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | T | B | 344 | BX | TX", "hex_opcode": "0xF0000560", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "344", "clean": "344"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "The instruction converts the double-precision floating-point value in doubleword element 0 of VSR[XB] to a signed doubleword integer. The result is placed into doubleword element 0 of VSR[XT], and doubleword element 1 of VSR[XT] is set to 0.", "pseudocode": "if src ≤ Nmin - 1 then\n    T(Nmin)\n    fr(0)\n    fi(0)\n    fx(VXCVI)\n    if error() then invoke system error handler\nelse if Nmin - 1 < src < Nmin then\n    T(Nmin)\n    fr(0)\n    fi(1)\n    fx(XX)\n    if error() then invoke system error handler\nelse if src = Nmin then\n    T(Nmin)\n    fr(0)\n    fi(0)\nelse if Nmin < src < Nmax then\n    T(f2i(trunc(src)))\n    fr(0)\n    fi(1)\n    fx(XX)\n    if error() then invoke system error handler\nelse if src = Nmax then\n    T(Nmax)\n    fr(0)\n    fi(0)\nelse if Nmax < src < Nmax + 1 then\n    T(Nmax)\n    fr(0)\n    fi(1)\n    fx(XX)\n    if error() then invoke system error handler\nelse if src ≥ Nmax + 1 then\n    T(Nmin)\n    fr(0)\n    fi(0)\n    fx(VXCVI)\n    if error() then invoke system error handler\nelse if src is a QNaN then\n    T(Nmin)\n    fr(0)\n    fi(0)\n    fx(VXCVI)\n    if error() then invoke system error handler\nelse if src is a SNaN then\n    T(Nmin)\n    fr(0)\n    fi(0)\n    fx(VXCVI)\n    fx(VXSNAN)\n    if error() then invoke system error handler", "special_registers": "FPSCR, VSR[XT]", "programming_notes": "xscvdpsxds rounds using Round towards Zero rounding mode. For other rounding modes, software must use a Round to Double-Precision Integer instruction that corresponds to the desired rounding mode. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 851 - 852", "example": "xscvdpsxds vs1, vs3"}
{"mnemonic": "xscvdpuxds", "architecture": "PowerISA", "full_name": "VSX Scalar Convert Double-Precision to Unsigned Doubleword with Round to Zero", "summary": "Converts a double-precision floating-point value to an unsigned 64-bit integer using round towards zero.", "syntax": "xscvdpuxds XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "18 | T | B | 328 | BX | TX", "hex_opcode": "0xF0000520", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "328", "clean": "328"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "The instruction converts the double-precision floating-point value in doubleword element 0 of VSR[XB] to an unsigned 64-bit integer. The result is placed into doubleword element 0 of VSR[XT], and doubleword element 1 of VSR[XT] is set to 0.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nrnd ← bfp_ROUND_TO_INTEGER(0b001, src)\nresult ← ui64_CONVERT_FROM_BFP(rnd)\nvxsnan_flag ← vxsnan(src)\nvxcvi_flag ← vxcvi(src)\nxx_flag ← xx(src)\nvx_flag ← vxsnan_flag | vxcvi_flag\nvex_flag ← FPSCR.VE & vx_flag\nif vex_flag=0 then\ndo\n    VSR[32×TX+T].dword[1] ← result\n    VSR[32×TX+T].dword[2] ← 0x0000_0000_0000_0000\n    FPSCR.FPRF ← 0bUUUUU\n    FPSCR.FR ← inc_flag\n    FPSCR.FI ← xx_flag\nend\nelse\ndo\n    FPSCR.FR ← 0b0\n    FPSCR.FI ← 0b0\nend", "special_registers": "FPSCR (undefined), VXSNAN, VXCVI, FX, XX", "programming_notes": "If src is a NaN, the result is 0x0000_0000_0000_0000 and VXCVI is set to 1. If src is an SNaN, VXSNAN is also set to 1. If the rounded value is greater than 264 -1, the result is 0xFFFF_FFFF_FFFF_FFFF and VXCVI is set to 1. Otherwise, if the rounded value is less than 0, the result is 0x0000_0000_0000_0000 and VXCVI is set to 1. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 855 - 856", "example": "xscvdpuxds vs1, vs3"}
{"mnemonic": "xscvspdp", "architecture": "PowerISA", "full_name": "Vector Scalar Convert Single-Precision to Double-Precision format Non-signalling", "summary": "Converts a single-precision floating-point value in VSR[XB] to double-precision format and places the result into VSR[XT].", "syntax": "xscvspdp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 408", "hex_opcode": "0xF0000524", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "408", "clean": "408"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "Converts a single-precision floating-point value in the lower 32 bits of VSR[XB] to double-precision format and places the result in VSR[XT]. This is a scalar VSX instruction that operates on element 0 of the VSR. The instruction does not signal on NaN or other exceptional floating-point conditions.", "pseudocode": "VSR[XT].element[0] ← ConvertSP_to_DP(VSR[XB].element[0])", "special_registers": "FPSCR, VXSNAN", "programming_notes": "xscvspdp can be used to convert a single-precision value in single-precision format to double-precision format for use by Floating-Point scalar single-precision operations. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 832 - 833", "example": "xscvspdp vs1, vs3"}
{"mnemonic": "xscvdpsp", "architecture": "PowerISA", "full_name": "VSX Scalar Convert Double-Precision to Single-Precision", "summary": "Converts a double-precision floating-point value in VSR[XB] to single-precision format and places the result into VSR[XT].", "syntax": "xscvdpsp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 264", "hex_opcode": "0xF0000424", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "264", "clean": "264"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "The instruction converts the double-precision floating-point value from word element 0 of VSR[XB] to single-precision format. The result is placed into word elements 0 and 1 of VSR[XT], with word elements 2 and 3 set to zero.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nrnd ← bfp_ROUND_TO_BFP32(FPSCR.RN, src)\nresult ← bfp32_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif xx_flag=1 then SetFX(FPSCR.XX)\nif ox_flag=1 then SetFX(FPSCR.OX)\nif ux_flag=1 then SetFX(FPSCR.UX)\nvex_flag ← FPSCR.VE & vxsnan_flag\nif vex_flag=0 then do\n    VSR[32×TX+T].word[0] ← result\n    VSR[32×TX+T].word[1] ← result\n    VSR[32×TX+T].word[2] ← 0x0000_0000\n    VSR[32×TX+T].word[3] ← 0x0000_0000\n    FPSCR.FPRF ← fprf_CLASS_BFP32(result)\n    FPSCR.FR ← inc_flag\n    FPSCR.FI ← xx_flag\nend else do\n    FPSCR.FI ← 0b0\nend", "special_registers": "FPSCR, FPRF, FR, FI, VXSNAN", "programming_notes": "This instruction can be used to operate on a single-precision source operand. Previous versions of the architecture allowed the contents of words 1, 2, and 3 of the result register to be undefined, however, all processors that support this instruction write the result into both words 0 and 1 of the result register, as is required by this version of the architecture. If src is a SNaN, the result is src converted to a QNaN (i.e., bit 12 of src is set to 1). VXSNAN is set to 1.", "page_found": "Page 824 - 825", "example": "xscvdpsp vs1, vs3"}
{"mnemonic": "xvcvdpsp", "architecture": "PowerISA", "full_name": "Vector Convert Double-Precision to Single-Precision", "summary": "Converts double-precision floating-point values in a vector to single-precision format.", "syntax": "xvcvdpsp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 393", "hex_opcode": "0xF0000624", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "393", "clean": "393"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "Converts two double-precision floating-point values in VSR[XB] to single-precision format and places the results in VSR[XT]. The two double-precision elements (0 and 1) are converted and packed into the single-precision elements (0 and 1) of the target. Rounding is performed according to the current rounding mode in FPSCR.", "pseudocode": "VSR[XT].element[0] ← ConvertDP_to_SP(VSR[XB].element[0])\nVSR[XT].element[1] ← ConvertDP_to_SP(VSR[XB].element[1])", "special_registers": "FPSCR", "programming_notes": "Previous versions of the architecture allowed the contents of bits 32:63 of each doubleword in the result register to be undefined, however, all processors that support this instruction write the result into bits 32:63 of each doubleword in the result register as well as into bits 0:31, as is required by this version of the architecture. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 828 - 829", "example": "xvcvdpsp vs1, vs3"}
{"mnemonic": "xvcvspdp", "architecture": "PowerISA", "full_name": "VSX Vector Convert Single to Double", "summary": "Converts two floats to two doubles.", "syntax": "xvcvspdp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 457", "hex_opcode": "0xF0000724", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "457", "clean": "457"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "Converts two single-precision floating-point values in VSR[XB] to double-precision format and places the results in VSR[XT]. The single-precision elements (0 and 1) are expanded to double-precision elements (0 and 1). No rounding is required for this widening conversion.", "pseudocode": "VSR[XT].element[0] ← ConvertSP_to_DP(VSR[XB].element[0])\nVSR[XT].element[1] ← ConvertSP_to_DP(VSR[XB].element[1])", "page_found": "Page 836", "special_registers": "FPSCR, MSR", "programming_notes": "The xvcvspdp instruction is used to convert a vector of single-precision floating-point values to double-precision. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register, otherwise, an exception will be raised. Handle special cases like signaling NaNs by checking and setting the appropriate flags in FPSCR.", "example": "xvcvspdp vs1, vs3"}
{"mnemonic": "xvcvdpsxds", "architecture": "PowerISA", "full_name": "VSX Vector Convert Double-Precision to Signed Doubleword for- mat XX2-form", "summary": "Converts a double-precision floating-point value to a signed doubleword integer, rounding according to the current rounding mode.", "syntax": "xvcvdpsxds XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | / | XB | 472", "hex_opcode": "0xF0000760", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "472", "clean": "472"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "Converts two double-precision floating-point values in VSR[XB] to signed 64-bit integer format (doubleword) and places the results in VSR[XT]. Rounding is performed according to the current rounding mode in FPSCR. On overflow or invalid operation, the result is saturated to the maximum or minimum signed 64-bit integer.", "pseudocode": "VSR[XT].element[0] ← ConvertDP_to_SXD_Round(VSR[XB].element[0], RoundMode)\nVSR[XT].element[1] ← ConvertDP_to_SXD_Round(VSR[XB].element[1], RoundMode)", "special_registers": "FPSCR, VSR[XT], VSR[XB]", "programming_notes": "xvcvdpsxds rounds using Round towards Zero rounding mode. For other rounding modes, software must use a Round to Double-Precision Integer instruction that corresponds to the desired rounding mode.", "page_found": "Page 871 - 872", "example": "xvcvdpsxds vs1, vs3"}
{"mnemonic": "xvcvdpuxds", "architecture": "PowerISA", "full_name": "Vector Convert Double-Precision to Unsigned Doubleword with Round to Zero", "summary": "Converts double-precision floating-point values in a vector to unsigned doublewords using round towards zero.", "syntax": "xvcvdpuxds XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | / | XB | 456 | BX | TX", "hex_opcode": "0xF0000720", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "456", "clean": "456"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}], "extension": "VSX", "description": "This instruction converts each element of the source vector (VSR[XB]) from double-precision floating-point format to an unsigned 64-bit integer, rounding towards zero. The result is stored in the corresponding element of the target vector (VSR[XT]). If any element results in a NaN or SNaN, VXSNAN and VXCVI are set accordingly.", "pseudocode": "for i = 0 to 1 do\n    src <- VSR[XB][i]\n    if src is a QNaN then\n        T(Nmin), fx(VXCVI)\n        if FPSCR.VXCVI=0 and MSR.FE0!=ignore-exception-mode then error()\n    else if src is a SNaN then\n        T(Nmin), fx(VXCVI), fx(VXSNAN)\n        if FPSCR.VXSNAN=0 and MSR.FE1!=ignore-exception-mode then error()\n    else if src ≤ Nmin-1 then\n        T(Nmin), fx(VXCVI)\n        if FPSCR.VXCVI=0 and MSR.FE0!=ignore-exception-mode then error()\n    else if Nmin-1 < src < Nmin then\n        if FPSCR.VE=0 then\n            T(Nmin), fx(XX)\n            if FPSCR.XX=0 and MSR.FE1!=ignore-exception-mode then error()\n        else\n            fx(XX), error()\n    else if src = Nmin then\n        T(Nmin)\n    else if Nmin < src < Nmax then\n        if FPSCR.VE=0 then\n            T(f2i(trunc(src))), fx(XX)\n            if FPSCR.XX=0 and MSR.FE1!=ignore-exception-mode then error()\n        else\n            fx(XX), error()\n    else if src = Nmax then\n        T(Nmax)\n    else if Nmax < src < Nmax+1 then\n        if FPSCR.VE=0 then\n            T(Nmax), fx(XX)\n            if FPSCR.XX=0 and MSR.FE1!=ignore-exception-mode then error()\n        else\n            fx(XX), error()\n    else if src ≥ Nmax+1 then\n        T(Nmin), fx(VXCVI)\n        if FPSCR.VXCVI=0 and MSR.FE0!=ignore-exception-mode then error()\n    end if\nend for", "special_registers": "FPSCR, VXSNAN, VXCVI, XX", "programming_notes": "xvcvdpuxds rounds using Round towards Zero rounding mode. For other rounding modes, software must use a Round to Double-Precision Integer instruction that corresponds to the desired rounding mode.", "page_found": "Page 875 - 876", "example": "xvcvdpuxds vs1, vs3"}
{"mnemonic": "xvcvspsxds", "architecture": "PowerISA", "full_name": "Vector Convert with round to zero Single-Precision to Signed Doubleword format XX2-form", "summary": "Converts single-precision floating-point values in a vector to signed doublewords, rounding towards zero.", "syntax": "xvcvspsxds XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "110000 | T | B | 000000 | 000000 | 000000 | BX | TX", "hex_opcode": "0xF0000660", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "408", "clean": "408"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "Converts single-precision floating-point values in VSR[XB] to signed 64-bit integer format (doubleword) and places the results in VSR[XT], rounding towards zero (truncation). Only the first two single-precision elements are converted; results are placed in the two doubleword elements of the target.", "pseudocode": "VSR[XT].element[0] ← ConvertSP_to_SXD_Truncate(VSR[XB].element[0])\nVSR[XT].element[1] ← ConvertSP_to_SXD_Truncate(VSR[XB].element[1])", "special_registers": "FPSCR, VXSNAN, VXCVI, XX", "programming_notes": "xvcvspsxds rounds using Round towards Zero rounding mode. For other rounding modes, software must use a Round to Single-Precision Integer instruction that corresponds to the desired rounding mode, including xvrspic which uses the rounding mode specified by RN.", "page_found": "Page 879 - 880", "example": "xvcvspsxds vs1, vs3"}
{"mnemonic": "xvcvsxwsp", "architecture": "PowerISA", "full_name": "VSX Vector Convert with round Signed Word to Single-Precision format", "summary": "Converts a signed integer in each word of the source vector to single-precision floating-point and rounds it.", "syntax": "xvcvsxwsp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 168", "hex_opcode": "0xF00002E0", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "168", "clean": "168"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "For xvcvsxwsp, each word element of VSR[XB] is converted from a signed integer to an unbounded-precision floating-point value, rounded to single-precision using the rounding mode specified by RN, and placed into the corresponding word element of VSR[XT].", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\n\ndo i = 0 to 3\n    reset_xflags()\n\n    src ←bfp_CONVERT_FROM_SI32(VSR[32×BX+B].word[i])\n    rnd ←bfp_ROUND_TO_BFP32(FPSCR.RN,src)\n\n    vresult.word[i] ←bfp32_CONVERT_FROM_BFP(rnd)\n\n    if xx_flag=1 then SetFX(FPSCR.XX)\n    ex_flag ←ex_flag | (FPSCR.XE & xx_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR.FX, FPSCR.XX", "page_found": "Page 896 - 897", "programming_notes": "This instruction is commonly used for converting signed integer values to single-precision floating-point numbers in vector operations. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting MSR.VSX if necessary. Be aware of rounding modes specified by FPSCR.RN, as they can affect the precision of the conversion. Handle exceptions properly by checking FPSCR.XX and FPSCR.XE after execution.", "example": "xvcvsxwsp vs1, vs3"}
{"mnemonic": "xvcvuxwsp", "architecture": "PowerISA", "full_name": "VSX Vector Convert Unsigned Word to Single", "summary": "Converts four 32-bit unsigned integers to four floats.", "syntax": "xvcvuxwsp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 136", "hex_opcode": "0xF00002A0", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "136", "clean": "136"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "Converts four 32-bit unsigned integer values in VSR[XB] to four single-precision floating-point results and places them in VSR[XT]. Each unsigned word element is converted to the corresponding single-precision element. Rounding is performed according to the current rounding mode in FPSCR.", "pseudocode": "VSR[XT].element[0] ← ConvertUW_to_SP(VSR[XB].element[0])\nVSR[XT].element[1] ← ConvertUW_to_SP(VSR[XB].element[1])\nVSR[XT].element[2] ← ConvertUW_to_SP(VSR[XB].element[2])\nVSR[XT].element[3] ← ConvertUW_to_SP(VSR[XB].element[3])", "page_found": "Page 897", "special_registers": "FPSCR, MSR", "programming_notes": "This instruction is commonly used for converting unsigned integer data to floating-point format in vector operations. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting MSR.VSX before using this instruction. Be aware of potential exceptions during conversion, as no results will be written to the target register if any trap-enabled exception occurs. The rounding mode is determined by FPSCR.RN, so ensure it's set appropriately for your application.", "example": "xvcvuxwsp vs1, vs3"}
{"mnemonic": "xxspltiw", "architecture": "PowerISA", "full_name": "VSX Vector Splat Immediate Word", "summary": "Spatially duplicates a 32-bit immediate into all 4 words of the target.", "syntax": "xxspltiw XT, IMM", "encoding": {"format": "8RR:D-form", "binary_pattern": "000001 | 01000 | imm[7:0] | VT[4:0]", "hex_opcode": "0x0500000080060000", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:10 | 11:20 | 21:63"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "IMM", "desc": "32-bit Value"}, {"name": "VT", "desc": "Target Vector Register"}, {"name": "imm", "desc": "Immediate Word Value"}], "extension": "VSX", "description": "Duplicates a 32-bit immediate value into all four 32-bit word elements of VSR[XT]. This is a VSX vector splat immediate instruction that fills the entire 128-bit register with copies of the 32-bit immediate. No floating-point status updates occur.", "pseudocode": "imm32 ← sign_extend(IMM)\nVSR[XT].element[0] ← imm32\nVSR[XT].element[1] ← imm32\nVSR[XT].element[2] ← imm32\nVSR[XT].element[3] ← imm32", "page_found": "Page 1493 - 1494", "programming_notes": "The xxspltiw instruction is commonly used to initialize a VSX vector with a repeated immediate word value. Ensure that the 'imm' field is within the valid range of a 32-bit signed integer to avoid unexpected behavior. This instruction operates at user privilege level and does not generate exceptions under normal circumstances.", "example": "xxspltiw vs1, 1"}
{"mnemonic": "xxspltidp", "architecture": "PowerISA", "full_name": "VSX Vector Splat Immediate Double-Precision", "summary": "Spatially duplicates a 32-bit immediate (converted to double) into both double elements.", "syntax": "xxspltidp XT, IMM", "encoding": {"format": "8RR:D-form", "binary_pattern": "1 | 0 | 0 | // | // | imm0", "hex_opcode": "0x0500000080040000", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8:11 | 12:13 | 14:15 | 16:63"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "IMM", "desc": "32-bit Value"}, {"name": "IMM32", "desc": "Immediate Value"}], "extension": "VSX", "description": "The instruction splats the double-precision value formed by concatenating imm0 and imm1 into each doubleword element of VSR[XT].", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nIMM32 ←imm0<<16 | imm1\nVSR[32×TX+T].dword[0] ←bfp64_CONVERT_FROM_BFP(IMM32)\nVSR[32×TX+T].dword[1] ←bfp64_CONVERT_FROM_BFP(IMM32)", "page_found": "Page 955 - 956", "special_registers": "MSR", "programming_notes": "This instruction is used to replicate a double-precision floating-point value across all elements of a VSX vector register. Ensure that the VSX facility is enabled in the MSR register; otherwise, it will raise an exception. The immediate values imm0 and imm1 are concatenated to form a 32-bit integer, which is then converted to a double-precision float and replicated across the vector. Be cautious of alignment requirements for the target vector register.", "example": "xxspltidp vs1, 1"}
{"mnemonic": "xxmrghd", "architecture": "PowerISA", "full_name": "VSX Vector Merge High Doubleword", "summary": "Merges high doublewords from XA and XB.", "syntax": "xxmrghd XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 144", "hex_opcode": "0xF0000050", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "144", "clean": "144"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Merges the two high-order doubleword elements from VSR[XA] and VSR[XB] into VSR[XT]. Element 0 of XA is placed in element 0 of XT, and element 0 of XB is placed in element 1 of XT. This is a vector permutation instruction with no floating-point status updates.", "pseudocode": "VSR[XT].element[0] ← VSR[XA].element[0]\nVSR[XT].element[1] ← VSR[XB].element[0]", "page_found": "Page 958", "special_registers": "MSR", "programming_notes": "The xxmrghd instruction is used to merge the high doublewords from two source vector registers into a target vector register. Ensure that the VSX facility is enabled by checking and setting the appropriate bit in the MSR register. Be cautious with the DM bits, as they determine which source doubleword is merged into the target register. This instruction operates at the user privilege level and will raise an exception if the VSX facility is not available.", "example": "xxmrghd vs1, vs2, vs3"}
{"mnemonic": "xxmrgld", "architecture": "PowerISA", "full_name": "VSX Vector Merge Low Doubleword", "summary": "Merges low doublewords from XA and XB.", "syntax": "xxmrgld XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 208", "hex_opcode": "0xF0000050", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "208", "clean": "208"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Merges the low (rightmost) doubleword from XA and the low doubleword from XB into the target register XT, placing XA's low doubleword in the high position and XB's low doubleword in the low position. This is a VSX instruction that operates on 128-bit vector registers and does not affect any condition or status flags.", "pseudocode": "XT[0:63] ← XB[64:127]\nXT[64:127] ← XA[64:127]", "page_found": "Page 958", "special_registers": "MSR", "programming_notes": "The xxmrgld instruction is used to merge the low doublewords of two VSX registers into a target register. Ensure that the VSX facility is enabled by checking and setting the appropriate bit in the MSR register. Be cautious with the DM bits as they determine which doubleword from the source registers is placed into the target register's second doubleword position.", "example": "xxmrgld vs1, vs2, vs3"}
{"mnemonic": "xxswapd", "architecture": "PowerISA", "full_name": "VSX Vector Swap Doubleword", "summary": "Swaps the two doublewords in the register.", "syntax": "xxswapd XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 250", "hex_opcode": "0xF00000FA", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "250", "clean": "250"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "Swaps the two doublewords within the XB register and stores the result in XT. The high doubleword becomes the low doubleword and vice versa. This is a VSX instruction that does not affect condition or status flags.", "pseudocode": "XT[0:63] ← XB[64:127]\nXT[64:127] ← XB[0:63]", "page_found": "Page 958", "special_registers": "MSR", "programming_notes": "The xxswapd instruction swaps doubleword elements between two VSX registers based on the DM bit setting. Ensure that the VSX facility is enabled in the MSR register to avoid a VSX_Unavailable exception. This instruction operates at user privilege level and does not require specific alignment of data.", "example": "xxswapd vs1, vs3"}
{"mnemonic": "xxsel", "architecture": "PowerISA", "full_name": "VSX Vector Select", "summary": "Selects elements from two source vectors based on a mask vector.", "syntax": "xxsel XT, XA, XB, XC", "encoding": {"format": "XX4-form", "binary_pattern": "60 | XT | XA | XB | XC | 3", "hex_opcode": "0xF0000030", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "XC", "clean": "XC"}, {"raw": "3", "clean": "3"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "True Src"}, {"name": "XB", "desc": "False Src"}, {"name": "XC", "desc": "Mask"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Source Vector Register"}], "extension": "VSX", "description": "Selects bits from XA or XB for each bit position based on the corresponding bit in the mask register XC. Where XC has a 1 bit, the result takes the bit from XA; where XC has a 0 bit, the result takes the bit from XB. This is a VSX instruction with no effect on condition or status flags.", "pseudocode": "for i in 0 to 127 do\n  if XC[i] = 1 then\n    XT[i] ← XA[i]\n  else\n    XT[i] ← XB[i]", "page_found": "Page 944 - 945", "special_registers": "MSR", "programming_notes": "The xxsel instruction is commonly used for conditional vector selection based on a mask. Ensure that the VSX feature is enabled in the MSR register to avoid an exception. The source and destination vectors must be properly aligned, typically requiring 16-byte alignment for optimal performance.", "example": "xxsel vs1, vs2, vs3, vs4"}
{"mnemonic": "xxlor", "architecture": "PowerISA", "full_name": "VSX Vector Logical OR", "summary": "Bitwise OR.", "syntax": "xxlor XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 448", "hex_opcode": "0xF0000490", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "448", "clean": "448"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Performs a bitwise logical OR of the contents of XA and XB, storing the result in XT. This is a VSX instruction that does not affect condition or status flags.", "pseudocode": "XT ← XA | XB", "page_found": "Page 944", "special_registers": "MSR", "programming_notes": "The xxlor instruction is used to perform a bitwise OR operation on two VSX registers. Ensure that the VSX facility is enabled by checking and setting the MSR.VSX bit; otherwise, a VSX_Unavailable exception will be raised. This instruction operates on 128-bit vectors and requires proper alignment of the input and output registers.", "example": "xxlor vs1, vs2, vs3"}
{"mnemonic": "xxlxor", "architecture": "PowerISA", "full_name": "VSX Vector Logical XOR", "summary": "Bitwise XOR.", "syntax": "xxlxor XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 456", "hex_opcode": "0xF00004D0", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "456", "clean": "456"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Performs a bitwise logical XOR of the contents of XA and XB, storing the result in XT. This is a VSX instruction that does not affect condition or status flags.", "pseudocode": "XT ← XA XOR XB", "page_found": "Page 944", "special_registers": "MSR", "programming_notes": "The xxlxor instruction requires the VSX facility to be enabled; otherwise, it will raise an exception. Ensure that the VSX bit in the MSR register is set before using this instruction. The operation is performed on 128-bit vector registers, so ensure proper alignment and that the input registers contain valid data for accurate results.", "example": "xxlxor vs1, vs2, vs3"}
{"mnemonic": "xxland", "architecture": "PowerISA", "full_name": "VSX Vector Logical AND", "summary": "Performs a bitwise AND operation on the contents of two vector registers and stores the result in another vector register.", "syntax": "xxland XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | 130 | AX | BX | TX", "hex_opcode": "0xF0000410", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "440", "clean": "440"}], "length": "32", "bit_positions": "6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "The contents of VSR[XA] are ANDed with the contents of VSR[XB] and the result is placed into VSR[XT].", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nVSR[32×TX+T] ← VSR[32×AX+A] & VSR[32×BX+B]", "page_found": "Page 942 - 943", "special_registers": "MSR", "programming_notes": "Ensure that the VSX (Vector Scalar Extensions) is enabled in the MSR register before using this instruction. The operation is performed on 128-bit vector registers, so both input and output must be properly aligned. This instruction operates at a high performance for bitwise operations on vectors.", "example": "xxland vs1, vs2, vs3"}
{"mnemonic": "xxlnor", "architecture": "PowerISA", "full_name": "VSX Vector Logical NOR", "summary": "Performs a logical NOR operation on the contents of two VSX registers and stores the result in another VSX register.", "syntax": "xxlnor XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "18 | T | A | B | AX | BX | TX", "hex_opcode": "0xF0000510", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "464", "clean": "464"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "The contents of VSR[XA] are ORed with the contents of VSR[XB], then the complemented result is placed into VSR[XT].", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\nXT <- ¬(XA | XB)", "page_found": "Page 943 - 944", "special_registers": "MSR", "programming_notes": "The xxlnor instruction performs a logical NOR operation between two vector registers and stores the result in another. Ensure that the VSX (Vector Scalar Extensions) is enabled by checking and setting the MSR.VSX bit; otherwise, handle the VSX_Unavailable exception. This instruction operates on 128-bit vectors and requires proper alignment of the input and output registers.", "example": "xxlnor vs1, vs2, vs3"}
{"mnemonic": "vmulouw", "architecture": "PowerISA", "full_name": "Vector Multiply Odd Unsigned Word", "summary": "Multiplies the 1st and 3rd words of the source vectors to produce two 64-bit results.", "syntax": "vmulouw vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 128", "hex_opcode": "0x10000088", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "128", "clean": "128"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source A"}, {"name": "vB", "desc": "Source B"}], "pseudocode": "vD[0:63] ← (vA[32:63] unsigned) × (vB[32:63] unsigned)\nvD[64:127] ← (vA[96:127] unsigned) × (vB[96:127] unsigned)", "example": "vmulouw v1, v2, v3", "example_note": "Widening multiply (32x32->64).", "extension": "VMX (AltiVec)", "description": "Multiplies the unsigned 32-bit words at positions 1 and 3 of vA by the corresponding words in vB, producing two unsigned 64-bit results stored in vD. This is a VMX (AltiVec) instruction that does not affect condition or status flags.", "page_found": "Page 370", "programming_notes": "This instruction is useful for performing element-wise multiplication of unsigned integers stored in odd-numbered positions of two vectors. Ensure that the input vectors are properly aligned to avoid alignment faults. The result is a vector with doubleword elements, so be mindful of potential overflow if the product exceeds 64 bits."}
{"mnemonic": "vmulosw", "architecture": "PowerISA", "full_name": "Vector Multiply Odd Signed Word", "summary": "Multiplies odd words (1,3) to 64-bit signed result.", "syntax": "vmulosw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 392", "hex_opcode": "0x10000188", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "392", "clean": "392"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Multiplies the signed 32-bit words at positions 1 and 3 of vA by the corresponding words in vB, producing two signed 64-bit results stored in vD. This is a VMX (AltiVec) instruction that does not affect condition or status flags.", "pseudocode": "vD[0:63] ← (vA[32:63] signed) × (vB[32:63] signed)\nvD[64:127] ← (vA[96:127] signed) × (vB[96:127] signed)", "page_found": "Page 369", "special_registers": "MSR", "programming_notes": "The vmulosw instruction is used for multiplying signed integers located in the odd word elements of two vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The result is stored in doubleword elements of the destination register, and developers should handle potential overflow by checking the sign extension of the products.", "example": "vmulosw vd, va, vb"}
{"mnemonic": "vmuleuw", "architecture": "PowerISA", "full_name": "Vector Multiply Even Unsigned Word", "summary": "Multiplies the even-numbered words of two vector registers and places the results in a destination vector register.", "syntax": "vmuleuw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 136", "hex_opcode": "0x10000288", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "136", "clean": "136"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmuleuw, each pair of even-numbered words from VSR[VRA+32] and VSR[VRB+32] are multiplied, and the results are placed into VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    src1 ←EXTZ(VSR[VRA+32].word[2×i])\n    src2 ←EXTZ(VSR[VRB+32].word[2×i])\n    VSR[VRT+32].dword[i] ←CHOP64(src1 × src2)\nend", "page_found": "Page 369 - 370", "special_registers": "MSR", "programming_notes": "This instruction multiplies even-numbered words from two vector registers and stores the results in another register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. Be cautious of overflow, as the multiplication result is truncated to 64 bits before storage.", "example": "vmuleuw vd, va, vb"}
{"mnemonic": "vmulesw", "architecture": "PowerISA", "full_name": "Vector Multiply Even Signed Word", "summary": "Multiplies even-indexed signed words from two vector registers and stores the results in a destination vector register.", "syntax": "vmulesw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 392", "hex_opcode": "0x10000388", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "392", "clean": "392"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmulesw, each pair of even-indexed signed words from VSR[VRA+32] and VSR[VRB+32] are multiplied, and the 64-bit products are stored in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    src1 ←EXTS(VSR[VRA+32].word[2×i])\n    src2 ←EXTS(VSR[VRB+32].word[2×i])\n    VSR[VRT+32].dword[i] ←CHOP64(src1 × src2)\nend", "page_found": "Page 368 - 369", "special_registers": "MSR", "programming_notes": "This instruction multiplies even-indexed signed words from two vector registers and stores the 64-bit products in another register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. Be cautious of overflow, as the multiplication results are truncated to 64 bits.", "example": "vmulesw vd, va, vb"}
{"mnemonic": "vmsumubm", "architecture": "PowerISA", "full_name": "Vector Multiply-Sum Unsigned Byte Modulo", "summary": "Multiplies bytes and sums adjacent results into words.", "syntax": "vmsumubm vD, vA, vB, vC", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | vC | 36", "hex_opcode": "0x10000024", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "vC", "clean": "vC"}, {"raw": "36", "clean": "36"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "vC", "desc": "Accumulator"}], "extension": "VMX (AltiVec)", "description": "Multiplies each unsigned byte in vA by the corresponding byte in vB, then sums the products of adjacent byte pairs to produce four unsigned 32-bit word results. The results are added to the four words in the accumulator vC and stored in vD. This is a VMX (AltiVec) instruction that does not affect condition or status flags.", "pseudocode": "vD[0:31] ← (vA[0:7] × vB[0:7]) + (vA[8:15] × vB[8:15]) + vC[0:31]\nvD[32:63] ← (vA[16:23] × vB[16:23]) + (vA[24:31] × vB[24:31]) + vC[32:63]\nvD[64:95] ← (vA[32:39] × vB[32:39]) + (vA[40:47] × vB[40:47]) + vC[64:95]\nvD[96:127] ← (vA[48:55] × vB[48:55]) + (vA[56:63] × vB[56:63]) + vC[96:127]", "special_registers": "MSR", "programming_notes": "This instruction is commonly used for performing efficient vectorized operations on unsigned byte data. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation processes 8 bytes per iteration, multiplying corresponding elements and adding to the third source vector's word element, storing the result in the destination vector. Be cautious of overflow as only the low-order 16 bits are stored.", "example": "vmsumubm vd, va, vb, vc"}
{"mnemonic": "vmsumshm", "architecture": "PowerISA", "full_name": "Vector Multiply-Sum Signed Halfword Modulo", "summary": "Multiplies halfwords and sums adjacent results into words.", "syntax": "vmsumshm vD, vA, vB, vC", "encoding": {"format": "VA-form", "binary_pattern": "4 | VRT | VRA | VRB | VRC | 40", "hex_opcode": "0x10000028", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "vC", "clean": "vC"}, {"raw": "40", "clean": "40"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "vC", "desc": "Accumulator"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "special_registers": "VSCR", "page_found": "Page 1332 - 1333", "description": "Multiplies four pairs of signed halfword elements from vA and vB, then sums the adjacent pairs of products modulo 2^32 and adds the corresponding word element from vC (accumulator), storing the result in vD. This instruction operates on Classic VMX (AltiVec) and does not set any condition flags.", "pseudocode": "for i in 0 to 1 do\n  prod_hi ← vA[i*2] × vB[i*2]\n  prod_lo ← vA[i*2+1] × vB[i*2+1]\n  vD[i] ← (prod_hi + prod_lo + vC[i]) mod 2^32\nendfor", "programming_notes": "This instruction is useful for performing vectorized multiply-sum operations on signed halfwords, ensuring results are within the range of a 16-bit signed integer by applying modulo arithmetic. Ensure that input vectors and accumulator are properly aligned to avoid performance penalties. This operation does not require any special privileges but can generate exceptions if input data exceeds expected ranges.", "example": "vmsumshm vd, va, vb, vc"}
{"mnemonic": "vmsumshs", "architecture": "PowerISA", "full_name": "Vector Multiply-Sum Signed Halfword Saturate", "summary": "Performs a vector multiply-sum operation on signed halfwords and saturates the result.", "syntax": "vmsumshs vD, vA, vB, vC", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | vC | 41", "hex_opcode": "0x10000029", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "vC", "clean": "vC"}, {"raw": "41", "clean": "41"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "vC", "desc": "Accumulator"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmsumshs, each element in VRA and VRB is multiplied by corresponding elements in VRC. The results are summed and saturated if necessary.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    temp ←EXTS(VSR[VRC+32].word[i])\n    do j = 0 to 1\n        src1 ←EXTS(VSR[VRA+32].word[i].hword[j])\n        src2 ←EXTS(VSR[VRB+32].word[i].hword[j])\n        temp ←temp + (src1 × src2)\n    end\n    VSR[VRT+32].word[i] ←si32_CLAMP(temp)\n    VSCR.SAT ←sat_flag\nend", "special_registers": "VSCR", "page_found": "Page 379 - 380", "programming_notes": "vmsumshs is used for vectorized operations involving signed halfword multiplication and summation. Ensure that the Vector Status and Control Register (VSCR) is properly managed, especially when handling saturation flags. This instruction operates at the user privilege level and will raise an exception if the vector facility is not enabled in the Machine State Register (MSR).", "example": "vmsumshs vd, va, vb, vc"}
{"mnemonic": "vsum4ubs", "architecture": "PowerISA", "full_name": "Vector Sum-across Partial (1/4) Unsigned Byte Saturate", "summary": "Sums the unsigned byte elements of two vector registers and saturates the result.", "syntax": "vsum4ubs vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1632", "hex_opcode": "0x10000608", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1632", "clean": "1632"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Accumulator"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsum4ubs, the sum of the unsigned integer values in the four byte elements contained in each word element of VSR[VRA+32] is added to the unsigned integer value in the corresponding word element of VSR[VRB+32]. If the intermediate result exceeds 2^32 - 1, it saturates to 2^32 - 1 and sets the SAT flag.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    temp ← EXTZ(VSR[VRB+32].word[i])\n    do j = 0 to 3\n        temp ← temp + EXTZ(VSR[VRA+32].word[i].byte[j])\n    end\n    VSR[VRT+32].word[i] ← ui32_CLAMP(temp)\n    VSCR.SAT ← sat_flag\nend", "special_registers": "VSCR.SAT", "page_found": "Page 395 - 396", "programming_notes": "vsum4ubs is commonly used for accumulating sums of byte elements within vector registers, with saturation to prevent overflow. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation processes four bytes per word, and results are clamped to 32-bit unsigned integers, setting the VSCR.SAT flag if saturation occurs.", "example": "vsum4ubs vd, va, vb"}
{"mnemonic": "vsum4sbs", "architecture": "PowerISA", "full_name": "Vector Sum-across Partial (1/4) Signed Byte Saturate", "summary": "Adds the contents of four signed byte elements from two vector registers and saturates the result.", "syntax": "vsum4sbs vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1888", "hex_opcode": "0x10000708", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1888", "clean": "1888"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Accumulator"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsum4sbs, the sum of the signed integer values in the four byte elements contained in word element i of VSR[VRA+32] is added to the signed integer value in word element i of VSR[VRB+32]. If the intermediate result is greater than 2^31-1 or less than -2^31, the result saturates and SAT is set to 1.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    temp ←EXTS(VSR[VRB+32].word[i])\n    do j = 0 to 3\n        temp ←temp + EXTS(VSR[VRA+32].word[i].byte[j])\n    end\n    VSR[VRT+32].word[i] ←si32_CLAMP(temp)\n    VSCR.SAT ←sat_flag\nend", "special_registers": "VSCR.SAT", "page_found": "Page 394 - 395", "programming_notes": "vsum4sbs is useful for accumulating sums of byte elements within words, with saturation handling. Ensure vectors are properly aligned and check VSCR.SAT after execution to handle overflow cases. This instruction operates at the user privilege level.", "example": "vsum4sbs vd, va, vb"}
{"mnemonic": "vsum4shs", "architecture": "PowerISA", "full_name": "Vector Sum-across Partial (1/4) Signed Halfword Saturate", "summary": "Sums every 2 halfwords into a word.", "syntax": "vsum4shs vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1608", "hex_opcode": "0x10000648", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1608", "clean": "1608"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Accumulator"}], "extension": "VMX (AltiVec)", "description": "Sums pairs of signed halfword elements from vA and accumulates into words in vB (accumulator), storing saturated results in vD. The instruction processes 2 halfword pairs per word, setting the saturation bit (VSCR[SAT]) if any result overflows. This is a Classic VMX (AltiVec) instruction.", "pseudocode": "for i in 0 to 3 do\n  sum ← vA[i*2] + vA[i*2+1] + vB[i]\n  vD[i] ← SATURATE_SIGNED_WORD(sum)\n  if overflow then VSCR[SAT] ← 1\nendfor", "page_found": "Page 395", "special_registers": "MSR, VSCR", "programming_notes": "The vsum4shs instruction is commonly used for performing saturated addition of signed halfwords within vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. Be cautious with saturation handling as it can affect the results if intermediate sums exceed 32-bit integer limits.", "example": "vsum4shs vd, va, vb"}
{"mnemonic": "vsum2sws", "architecture": "PowerISA", "full_name": "Vector Sum-across Partial (1/2) Signed Word Saturate", "summary": "Adds the contents of two vector registers and updates the saturation flag.", "syntax": "vsum2sws vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1672", "hex_opcode": "0x10000688", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1672", "clean": "1672"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Accumulator"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Sums pairs of signed word elements from vA and accumulates into doublewords conceptually, storing the lower 32 bits of saturated results in alternating word positions of vD. The instruction sets the saturation bit (VSCR[SAT]) if any result overflows a signed 32-bit word. This is a Classic VMX (AltiVec) instruction.", "pseudocode": "for i in 0 to 1 do\n  sum ← sign_extend_64(vA[i*2]) + sign_extend_64(vA[i*2+1]) + sign_extend_64(vB[i*2])\n  vD[i*2] ← SATURATE_SIGNED_WORD(sum)\n  if overflow then VSCR[SAT] ← 1\nendfor", "special_registers": "VSCR.SAT", "page_found": "Page 393 - 394", "programming_notes": "This instruction is useful for performing saturated addition of word elements in vector registers. Ensure that the VSCR.SAT flag is checked after execution to handle saturation cases. The instruction operates on 32-bit signed integers and requires the vector facility to be enabled (MSR.VEC=1).", "example": "vsum2sws vd, va, vb"}
{"mnemonic": "vsumsws", "architecture": "PowerISA", "full_name": "Vector Sum-across Signed Word Saturate", "summary": "Adds the contents of four word elements of one vector register to a single word element of another vector register and saturates the result.", "syntax": "vsumsws vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "000100 | vD | vA | vB | 11110 | 001000", "hex_opcode": "0x10000788", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1928", "clean": "1928"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Accumulator"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VA", "desc": "Source Vector Register"}, {"name": "VB", "desc": "Source Vector Register"}, {"name": "VC", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The sum of the signed integer values in the four word elements of VSR[VRA+32] is added to the signed integer value in the word element 3 of VSR[VRB+32]. The low-order 32 bits of the result are placed into word element 3 of VSR[VRT+32], and the high-order 96 bits are set to zero. If the intermediate result is greater than 2^31 - 1, it saturates to 2^31 - 1; if less than -2^31, it saturates to -2^31.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ntemp ←EXTS(VSR[VRB+32].word[3])\ndo i = 0 to 3\n    temp ←temp + EXTS(VSR[VRA+32].word[i])\nend\nVSR[VRT+32].word[0] ←0x0000_0000\nVSR[VRT+32].word[1] ←0x0000_0000\nVSR[VRT+32].word[2] ←0x0000_0000\nVSR[VRT+32].word[3] ←si32_CLAMP(temp)\nVSCR.SAT ←sat_flag", "special_registers": "VSCR", "page_found": "Page 392 - 393", "programming_notes": "This instruction is useful for accumulating sums of signed integers with saturation, preventing overflow. Ensure that the vector registers are properly aligned and that the VEC bit in the MSR is set to 1. Be aware of the saturation behavior; if the sum exceeds the 32-bit signed integer range, it will be clamped to the maximum or minimum value. The result is stored only in the fourth word element of the destination register, with the other elements zeroed out.", "example": "vsumsws vd, va, vb"}
{"mnemonic": "vaddfp", "architecture": "PowerISA", "full_name": "Vector Add Floating-Point", "summary": "Adds the contents of two vector registers and places the result in another vector register.", "syntax": "vaddfp vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 10", "hex_opcode": "0x1000000A", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "10", "clean": "10"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vaddfp, each element of the source vectors VRA and VRB is added to produce corresponding elements in the destination vector VRT.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ← VSR[VRA+32].word[i]\n    src2 ← VSR[VRB+32].word[i]\n    VSR[VRT+32].word[i] ← bfp32_ADD(src1,src2)\nend", "page_found": "Page 446 - 447", "special_registers": "MSR", "programming_notes": "The vaddfp instruction adds corresponding elements of two source vectors and stores the results in a destination vector. Ensure that the Vector Facility is enabled by setting MSR.VEC to 1; otherwise, a Vector_Unavailable exception will be raised. This instruction operates on single-precision floating-point numbers and processes four elements per operation.", "example": "vaddfp vd, va, vb"}
{"mnemonic": "vsubfp", "architecture": "PowerISA", "full_name": "Vector Subtract Floating-Point", "summary": "Subtracts four single-precision floats (Classic VMX).", "syntax": "vsubfp vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 74", "hex_opcode": "0x1000004A", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "74", "clean": "74"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Subtracts four single-precision floating-point elements in vB from the corresponding elements in vA, storing the IEEE 754 results in vD. No condition flags are set by this instruction. This is a Classic VMX (AltiVec) floating-point operation.", "pseudocode": "for i in 0 to 3 do\n  vD[i] ← vA[i] - vB[i]  (IEEE 754 single precision)\nendfor", "page_found": "Page 447", "special_registers": "MSR", "programming_notes": "The vsubfp instruction is used for vectorized subtraction of single-precision floating-point numbers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation processes four elements at a time, so ensure that the input vectors are properly aligned and contain valid floating-point data to avoid unexpected results.", "example": "vsubfp vd, va, vb"}
{"mnemonic": "vctuxs", "architecture": "PowerISA", "full_name": "Vector Convert to Unsigned Fixed-Point Word Saturate", "summary": "Converts 4 floats to 4 unsigned 32-bit integers.", "syntax": "vctuxs vD, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | UIM | vB | 906", "hex_opcode": "0x1000038A", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "906", "clean": "906"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "UIM", "desc": "Fraction bits"}], "extension": "VMX (AltiVec)", "description": "Converts four single-precision floating-point elements in vB to unsigned 32-bit fixed-point integers with UIM fractional bits, saturating to the unsigned 32-bit range and storing results in vD. Sets the saturation bit (VSCR[SAT]) if any conversion saturates. This is a Classic VMX (AltiVec) instruction.", "pseudocode": "scale ← 2^UIM\nfor i in 0 to 3 do\n  converted ← round(vB[i] × scale)\n  vD[i] ← SATURATE_UNSIGNED_WORD(converted)\n  if saturated then VSCR[SAT] ← 1\nendfor", "page_found": "Page 450", "special_registers": "MSR", "programming_notes": "The vctuxs instruction converts floating-point elements to unsigned fixed-point words with saturation. Ensure the vector facility is enabled by checking and setting MSR.VEC. Handle exceptions for invalid operations or overflow carefully. The conversion respects the rounding mode specified by UIM, so verify its configuration for accurate results.", "example": "vctuxs vd, vb, uim"}
{"mnemonic": "vctsxs", "architecture": "PowerISA", "full_name": "Vector Convert to Signed Fixed-Point Word Saturate", "summary": "Converts a vector of floating-point values to signed fixed-point integers with rounding towards zero and saturation.", "syntax": "vctsxs vD, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | UIM | vB | 970", "hex_opcode": "0x100003CA", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "970", "clean": "970"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "UIM", "desc": "Fraction bits"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vctsxs, each element in the source vector VRB is converted to a signed fixed-point integer using the specified scale factor UIM. The result is saturated if it exceeds the range of a 32-bit signed integer.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src ← VSR[VRB+32].word[i]\n    VSR[VRT+32].word[i] ← si32_CONVERT_FROM_BFP32(src, UIM)\nend", "special_registers": "VSCR (SAT)", "extended_mnemonics": ["vcfpsxws"], "page_found": "Page 449 - 450", "programming_notes": "The vctsxs instruction converts each element of the source vector to a signed fixed-point integer using the specified scale factor. Ensure that the scale factor is appropriate for your data range to avoid saturation. This instruction operates at user privilege level and will raise an exception if the VEC bit in the MSR register is not set.", "example": "vctsxs vd, vb, uim"}
{"mnemonic": "vcfux", "architecture": "PowerISA", "full_name": "Vector Convert from Unsigned Fixed-Point Word", "summary": "Converts 4 unsigned 32-bit integers to floats.", "syntax": "vcfux vD, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | UIM | vB | 778", "hex_opcode": "0x1000030A", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "778", "clean": "778"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "UIM", "desc": "Fraction bits"}], "extension": "VMX (AltiVec)", "description": "Converts four unsigned 32-bit fixed-point integers in vB (with UIM fractional bits) to single-precision floating-point elements, storing IEEE 754 results in vD. No saturation or condition flags are set. This is a Classic VMX (AltiVec) instruction.", "pseudocode": "scale ← 2^(-UIM)\nfor i in 0 to 3 do\n  vD[i] ← unsigned_word_to_float(vB[i]) × scale  (IEEE 754)\nendfor", "page_found": "Page 451", "special_registers": "MSR", "programming_notes": "The vcfux instruction is used for converting signed floating-point values to unsigned fixed-point integers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. Be cautious of saturation when results exceed 2^32 - 1.", "example": "vcfux vd, vb, uim"}
{"mnemonic": "vcfsx", "architecture": "PowerISA", "full_name": "Vector Convert from Signed Fixed-Point Word to Single-Precision Floating-Point", "summary": "Converts signed fixed-point values in a vector register to single-precision floating-point values.", "syntax": "vcfsx vD, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | UIM | vB | 842", "hex_opcode": "0x1000034A", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "842", "clean": "842"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "UIM", "desc": "Fraction bits"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcfsx, each word element of the source vector register VRB is converted to a nearest single-precision floating-point value and divided by 2^UIM. The results are stored in the corresponding word elements of the target vector register VRT.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src ← VSR[VRB+32].word[i]\n    VSR[VRT+32].word[i] ← bfp32_CONVERT_FROM_SI32(src, UIM)\nend", "programming_notes": "The fixed-point integers used by the Vector Convert instructions can be interpreted as consisting of 32-UIM integer bits followed by UIM fraction bits.", "extended_mnemonics": [{"mnemonic": "vcsxwfp", "equivalent_to": "vcfsx VRT,VRB,UIM"}], "page_found": "Page 450 - 451", "special_registers": "MSR", "example": "vcfsx vd, vb, uim"}
{"mnemonic": "vrfim", "architecture": "PowerISA", "full_name": "Vector Round to Floating-Point Integer towards Minus Infinity", "summary": "Rounds each element of a vector toward negative infinity.", "syntax": "vrfim vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 714", "hex_opcode": "0x100002CA", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "714", "clean": "714"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vrfim, each single-precision floating-point value in the elements of VSR[VRB+32] is rounded toward negative infinity and placed into the corresponding elements of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src ← VSR[VRB+32].word[i]\n    VSR[VRT+32].word[i] ← bfp32_ROUND_TO_INTEGER_FLOOR(src)\nend", "page_found": "Page 451 - 452", "special_registers": "MSR", "programming_notes": "This instruction rounds each single-precision floating-point value in the source vector towards negative infinity. Ensure that the Vector Facility is enabled by checking and setting the appropriate bit in the MSR register. Be cautious of potential exceptions if the input values are out of range for integer representation.", "example": "vrfim vd, vb"}
{"mnemonic": "vrfin", "architecture": "PowerISA", "full_name": "Vector Round to Floating-Point Integer Nearest", "summary": "Rounds 4 floats to nearest integer.", "syntax": "vrfin vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 522", "hex_opcode": "0x1000020A", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "522", "clean": "522"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Rounds four single-precision floating-point elements in vB to the nearest integer value (using round-to-nearest-even), storing IEEE 754 results in vD. No condition flags are set. This is a Classic VMX (AltiVec) instruction.", "pseudocode": "for i in 0 to 3 do\n  vD[i] ← round_nearest_even(vB[i])  (IEEE 754 single precision)\nendfor", "page_found": "Page 452", "special_registers": "MSR", "programming_notes": "The vrfin instruction is commonly used for rounding floating-point numbers in vector operations. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. Be aware of potential precision loss when rounding to integers, especially with ties. This instruction operates on 32-bit floating-point elements and requires proper alignment for optimal performance.", "example": "vrfin vd, vb"}
{"mnemonic": "vrfip", "architecture": "PowerISA", "full_name": "Vector Round to Floating-Point Integer towards Plus Infinity", "summary": "Rounds each element of a vector to the nearest integer towards positive infinity.", "syntax": "vrfip vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | VRB | 11 | 0", "hex_opcode": "0x1000028A", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "650", "clean": "650"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vrfip, each single-precision floating-point value in VSR[VRB+32] is rounded towards positive infinity and placed into the corresponding word element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src ← VSR[VRB+32].word[i]\n    VSR[VRT+32].word[i] ← bfp32_ROUND_TO_INTEGER_CEIL(src)\nend", "page_found": "Page 452 - 453", "special_registers": "MSR", "programming_notes": "This instruction rounds each single-precision floating-point value in the source vector towards positive infinity. Ensure that the Vector Facility is enabled by checking and setting the appropriate bit in the MSR register. Be cautious of potential overflow when rounding very large numbers.", "example": "vrfip vd, vb"}
{"mnemonic": "vrfiz", "architecture": "PowerISA", "full_name": "Vector Round to Floating-Point Integer towards Zero", "summary": "Rounds 4 floats to integer (trunc).", "syntax": "vrfiz vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 586", "hex_opcode": "0x1000024A", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "586", "clean": "586"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Rounds each of four 32-bit floating-point elements in vB towards zero (truncate) and stores the integer results as floating-point values in vD. This instruction operates on the VMX/AltiVec extension and does not modify condition registers or exception flags.", "pseudocode": "for i in 0 to 3:\n  vD[32*i:32*i+31] ← RoundTowardZero(vB[32*i:32*i+31])", "page_found": "Page 453", "special_registers": "MSR", "programming_notes": "The vrfiz instruction rounds each single-precision floating-point value in the source vector towards zero. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates on 32-bit words, so ensure proper alignment of the data for optimal performance.", "example": "vrfiz vd, vb"}
{"mnemonic": "vcmpeqfp", "architecture": "PowerISA", "full_name": "Vector Compare Equal Floating-Point", "summary": "Compares the elements of two vector registers for equality and stores the result in a third vector register.", "syntax": "vcmpeqfp VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x100000C6", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "198", "clean": "198"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpeqfp, each element of VSR[VRA+32] is compared to the corresponding element of VSR[VRB+32]. If they are equal, the corresponding element of VSR[VRT+32] is set to all 1s; otherwise, it is set to all 0s.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 3\n    src1 ←VSR[VRA+32].word[i]\n    src2 ←VSR[VRB+32].word[i]\n    if bool_COMPARE_EQ_BFP32(src1,src2)=1 then\n        VSR[VRT+32].word[i] ←0xFFFF_FFFF\n        all_false ←0\n    else\n        VSR[VRT+32].word[i] ←0x0000_0000\n        all_true ←0\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR0, XER", "page_found": "Page 454 - 455", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpeqfp v1, v2, v3"}
{"mnemonic": "vcmpgtfp", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Floating-Point", "summary": "Compares the contents of two vector registers and sets the target vector register based on whether each element is greater than the corresponding element in the other vector.", "syntax": "vcmpgtfp VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x100002C6", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "710", "clean": "710"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpgtfp, the contents of VSR[VRA+32] are compared to the contents of VSR[VRB+32]. The result is stored in VSR[VRT+32], with each word set to all 1s if the corresponding element in VSR[VRA+32] is greater than that in VSR[VRB+32], and all 0s otherwise.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 3\n    src1 ←VSR[VRA+32].word[i]\n    src2 ←VSR[VRB+32].word[i]\n    if bool_COMPARE_GT_BFP32(src1,src2)=1 then\n        VSR[VRT+32].word[i] ←0xFFFF_FFFF\n        all_false ←0\n    else\n        all_true ←0\n        VSR[VRT+32].word[i] ←0x0000_0000\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6", "page_found": "Page 455 - 456", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpgtfp v1, v2, v3"}
{"mnemonic": "vcmpgefp", "architecture": "PowerISA", "full_name": "Vector Compare Greater Equal Floating-Point", "summary": "Compares 4 floats (A >= B).", "syntax": "vcmpgefp vD, vA, vB", "encoding": {"format": "VC-form", "binary_pattern": "4 | vD | vA | vB | 454", "hex_opcode": "0x100001C6", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "454", "clean": "454"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Compares each of four 32-bit floating-point elements: vA >= vB. For each element, stores all 1s (0xFFFFFFFF) if the condition is true, or all 0s if false, into the corresponding word of vD. This instruction operates on VMX/AltiVec and does not modify the condition register.", "pseudocode": "for i in 0 to 3:\n  if vA[32*i:32*i+31] >= vB[32*i:32*i+31] then\n    vD[32*i:32*i+31] ← 0xFFFFFFFF\n  else\n    vD[32*i:32*i+31] ← 0x00000000", "special_registers": "MSR, CR6", "programming_notes": "This instruction is commonly used for element-wise comparison of single-precision floating-point numbers in vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The result of each comparison is stored as 0xFFFFFFFF if true or 0x0000_0000 if false in the target VSR. If Rc=1, CR Field 6 is updated to reflect whether all comparisons were true, all were false, or a mix of both.", "example": "vcmpgefp vd, va, vb"}
{"mnemonic": "vcmpbfp", "architecture": "PowerISA", "full_name": "Vector Compare Bounds Floating-Point", "summary": "Compares two VSRs word element by word and sets the target VSR if Rc=1.", "syntax": "vcmpbfp VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc | 966", "hex_opcode": "0x100003C6", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "966", "clean": "966"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Performs a bounds check comparing each of four 32-bit floating-point elements in VRA against the range defined by two bounds in VRB. The result is stored in VRT as a 4-bit value per element indicating which bound(s) the value violates. When the Rc bit is set (vcmpbfp.), the CR6 field is updated based on the result.", "pseudocode": "for i in 0 to 3:\n  if isnan(VRA[32*i:32*i+31]) or isnan(VRB[32*i:32*i+31]) then\n    VRT[30*i:30*i+29] ← 0b11\n  else if VRA[32*i:32*i+31] < -VRB[32*i:32*i+31] then\n    VRT[30*i:30*i+29] ← 0b10\n  else if VRA[32*i:32*i+31] > VRB[32*i:32*i+31] then\n    VRT[30*i:30*i+29] ← 0b01\n  else\n    VRT[30*i:30*i+29] ← 0b00\nif Rc = 1 then\n  CR6 ← 0b0001 if all results are within bounds else 0b0000", "special_registers": "CR6", "programming_notes": "Each single-precision floating-point value in VSR[VRB+32] should be non-negative; if it is negative, the corresponding element in VSR[VRA+32] will necessarily be out of bounds. One exception to this is when the value of an element in VSR[VRB+32] is -0.0 and the value of the corresponding element in VSR[VRA+32] is either +0.0 or -0.0. +0.0 and -0.0 compare equal to -0.0.", "page_found": "Page 453 - 454", "example": "vcmpbfp v1, v2, v3"}
{"mnemonic": "vpkpx", "architecture": "PowerISA", "full_name": "Vector Pack Pixel", "summary": "Packs the contents of two vector registers into a single vector register, with each source word being considered as a 32-bit pixel and each target halfword as a 16-bit pixel.", "syntax": "vpkpx vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 782", "hex_opcode": "0x1000030E", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "782", "clean": "782"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vpkpx, the contents of VSR[VRA+32] and VSR[VRB+32] are concatenated to form a single vector. Each word element from this concatenated vector is then packed into a halfword element in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nlet vsrc be the concatenation of the contents of VSR[VRA+32] followed by the contents of VSR[VRB+32].\ndo i = 0 to 7\n    VSR[VRT+32].hword[i].bit[0] ← vsrc.word[i].bit[7]\n    VSR[VRT+32].hword[i].bit[1:5] ← vsrc.word[i].bit[8:12]\n    VSR[VRT+32].hword[i].bit[6:10] ← vsrc.word[i].bit[16:20]\n    VSR[VRT+32].hword[i].bit[11:15] ← vsrc.word[i].bit[24:28]", "programming_notes": "Each source word can be considered to be a 32-bit 'pixel', consisting of four 8-bit 'channels'. Each target halfword can be considered to be a 16-bit pixel, consisting of one 1-bit channel and three 5-bit channels.", "page_found": "Page 303 - 304", "special_registers": "MSR", "example": "vpkpx vd, va, vb"}
{"mnemonic": "vupkhpx", "architecture": "PowerISA", "full_name": "Vector Unpack High Pixel", "summary": "Unpacks high 4 pixels to 4 words.", "syntax": "vupkhpx vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 846", "hex_opcode": "0x1000034E", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "846", "clean": "846"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Unpacks the four high-order pixel values (each 8 bits) from vB into four 32-bit word elements in vD, expanding each pixel into a word with implicit format expansion. This VMX/AltiVec instruction is commonly used in graphics processing and does not affect status registers.", "pseudocode": "for i in 0 to 3:\n  pixel ← vB[8*(i+4):8*(i+4)+7]\n  vD[32*i:32*i+31] ← ExpandPixel(pixel)", "page_found": "Page 314", "special_registers": "MSR", "programming_notes": "The vupkhpx instruction is used to unpack the high halfwords of a vector register into bytes, sign-extending the most significant bit and zero-extending the remaining bits. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. This operation is useful for processing pixel data where each pixel requires byte-level manipulation.", "example": "vupkhpx vd, vb"}
{"mnemonic": "vupklpx", "architecture": "PowerISA", "full_name": "Vector Unpack Low Pixel", "summary": "Unpacks low 4 pixels to 4 words.", "syntax": "vupklpx vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 974", "hex_opcode": "0x100003CE", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "974", "clean": "974"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Unpacks the four low-order pixel values (each 8 bits) from vB into four 32-bit word elements in vD, expanding each pixel into a word with implicit format expansion. This VMX/AltiVec instruction is commonly used in graphics processing and does not affect status registers.", "pseudocode": "for i in 0 to 3:\n  pixel ← vB[8*i:8*i+7]\n  vD[32*i:32*i+31] ← ExpandPixel(pixel)", "page_found": "Page 314", "special_registers": "MSR", "programming_notes": "The vupklpx instruction is used to unpack the low halfwords of a vector register into bytes, sign-extending the first bit and zero-extending the remaining bits. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. This instruction operates on 128-bit vector registers and processes each halfword in the source register to produce four bytes per iteration.", "example": "vupklpx vd, vb"}
{"mnemonic": "vpermr", "architecture": "PowerISA", "full_name": "Vector Permute Right", "summary": "Bitwise byte shuffle similar to vperm but for little-endian access optimization.", "syntax": "vpermr vD, vA, vB, vC", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | vC | 59", "hex_opcode": "0x1000003B", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "vC", "clean": "vC"}, {"raw": "59", "clean": "59"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "vC", "desc": "Permute"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "page_found": "Page 1334 - 1335", "description": "Performs a byte permutation by selecting bytes from the concatenation of vA and vB using indices from vC, optimized for little-endian access patterns. This VMX/AltiVec instruction rearranges 16 bytes across the three source registers and stores the result in vD, with no impact on condition registers.", "programming_notes": "The vpermr instruction is used to perform a right permutation on the elements of a vector register. It is commonly used in scenarios where data needs to be shifted or rotated within a vector for operations like cryptography, signal processing, or custom algorithms. Ensure that the input vector is properly aligned and that the operation does not exceed the bounds of the vector register to avoid undefined behavior. This instruction operates at user privilege level and may raise exceptions if the alignment requirements are not met.", "pseudocode": "src ← vA || vB\nfor i in 0 to 15:\n  index ← vC[4*i:4*i+3]\n  vD[8*i:8*i+7] ← src[8*index:8*index+7]", "example": "vpermr vd, va, vb, vc"}
{"mnemonic": "vpmsumb", "architecture": "PowerISA", "full_name": "Vector Polynomial Multiply-Sum Byte", "summary": "Performs GF(2) polynomial arithmetic (Carryless Multiply) on bytes.", "syntax": "vpmsumb vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1032", "hex_opcode": "0x10000408", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1032", "clean": "1032"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "Vector Crypto", "description": "For vpmsumb, each byte element in VSR[VRA+32] is multiplied by each byte element in VSR[VRB+32], and the results are summed. The final result is stored in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    prod[i].bit[0:14] ←0\n    srcA ←VSR[VRA+32].byte[i]\n    srcB ←VSR[VRB+32].byte[i]\n    do j = 0 to 7\n        do k = 0 to j\n            gbit ←srcA.bit[k] & srcB.bit[j-k]\n            prod[i].bit[j] ←prod[i].bit[j] ⊕gbit\n        end\n    end\n    do j = 8 to 14\n        do k = j-7 to 7\n            gbit ←(srcA.bit[k] & srcB.bit[j-k])\n            prod[i].bit[j] ←prod[i].bit[j] ⊕gbit\n        end\n    end\nend\ndo i = 0 to 7\n    VSR[VRT+32].hword[i] ←0b0 || (prod[2×i] ⊕prod[2×i+1])\nend", "page_found": "Page 465 - 466", "special_registers": "MSR", "programming_notes": "The vpmsumb instruction performs a polynomial multiplication and summation on byte elements of vector registers. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates on 16-byte vectors, so input and output vectors must be properly aligned. Be cautious with handling overflow as the result is truncated to fit into the destination register.", "example": "vpmsumb vd, va, vb"}
{"mnemonic": "vpmsumh", "architecture": "PowerISA", "full_name": "Vector Polynomial Multiply-Sum Halfword", "summary": "Performs GF(2) polynomial arithmetic on halfwords.", "syntax": "vpmsumh vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "000100 | vD | vA | vB | 10001 | 001000", "hex_opcode": "0x10000448", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1096", "clean": "1096"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "page_found": "Page 1410 - 1411", "description": "Performs GF(2) polynomial multiplication on pairs of 16-bit halfword elements from vA and vB, accumulating the results into vD. This VMX/AltiVec instruction is used in cryptographic and polynomial arithmetic operations and does not modify condition registers or exception status.", "pseudocode": "for i in 0 to 3:\n  prod ← PolyMultiply_GF2(vA[32*i:32*i+31], vB[32*i:32*i+31])\n  vD[64*i:64*i+63] ← vD[64*i:64*i+63] XOR prod", "special_registers": "MSR", "programming_notes": "The vpmsumh instruction is commonly used for finite field arithmetic operations, particularly in cryptographic algorithms. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. Be cautious of alignment requirements; source vectors must be aligned to halfword boundaries. This instruction operates at a privilege level where vector operations are supported, typically user or supervisor mode. Exception conditions include a Vector Unavailable exception if the facility is not enabled.", "example": "vpmsumh vd, va, vb"}
{"mnemonic": "vpmsumw", "architecture": "PowerISA", "full_name": "Vector Polynomial Multiply-Sum Word", "summary": "Performs a polynomial multiply-sum operation on word elements of two vector registers and stores the result in another vector register.", "syntax": "vpmsumw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1160", "hex_opcode": "0x10000488", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1160", "clean": "1160"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "Vector Crypto", "description": "Performs GF(2) polynomial multiplication on pairs of 32-bit word elements from vA and vB, accumulating the results into vD. This instruction is part of the Vector Crypto extension and is essential for cryptographic operations such as CRC and GHASH computation. No condition registers or exception flags are modified.", "pseudocode": "for i in 0 to 1:\n  prod ← PolyMultiply_GF2(vA[32*i:32*i+31], vB[32*i:32*i+31])\n  vD[64*i:64*i+63] ← vD[64*i:64*i+63] XOR prod", "page_found": "Page 466 - 467", "special_registers": "MSR", "programming_notes": "The vpmsumw instruction is used for polynomial multiplication of word elements in vector registers. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates on 128-bit vectors, processing four 32-bit words each. Be cautious with alignment; input vectors must be properly aligned to avoid undefined behavior. The result is a 64-bit word for each pair of input words, XORed together and stored in the destination vector. Exception conditions include invalid use of registers or disabled Vector Facility.", "example": "vpmsumw vd, va, vb"}
{"mnemonic": "vpmsumd", "architecture": "PowerISA", "full_name": "Vector Polynomial Multiply-Sum Doubleword", "summary": "Performs GF(2) polynomial arithmetic on doublewords.", "syntax": "vpmsumd vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1224", "hex_opcode": "0x100004C8", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1224", "clean": "1224"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "Vector Crypto", "description": "Performs Galois Field GF(2) polynomial multiplication and summation on doubleword elements. The instruction multiplies corresponding doubleword elements from vA and vB using polynomial arithmetic over GF(2), accumulating partial products into the destination register vD. This instruction is part of the Vector Crypto extension and does not affect CR0 or condition registers.", "page_found": "Page 467", "programming_notes": "The vpmsumd instruction is commonly used for performing polynomial multiplication and summation operations on large datasets efficiently. Ensure that the input vectors are properly aligned to doubleword boundaries to avoid alignment faults. This instruction operates at user privilege level, but care must be taken to handle potential overflow conditions in the sum results. Performance can be optimized by ensuring that the data is loaded into vector registers before executing vpmsumd.", "pseudocode": "vD[0:63] ← GF(2)_multiply_sum(vA[0:63], vB[0:63])\nvD[64:127] ← GF(2)_multiply_sum(vA[64:127], vB[64:127])", "example": "vpmsumd vd, va, vb"}
{"mnemonic": "lxv", "architecture": "PowerISA", "full_name": "Load VSX Vector", "summary": "Loads a 128-bit vector from memory (VSX aligned offset).", "syntax": "lxv XT, DQ(RA)", "encoding": {"format": "DQ-form", "binary_pattern": "0 | T | RA | DQ | TX | 1", "hex_opcode": "0xF4000001", "visual_parts": [{"raw": "61", "clean": "61"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "DQ", "clean": "DQ"}, {"raw": "1", "clean": "1"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:27 | 28:30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "DQ", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "disp", "desc": "Displacement value"}], "extension": "VSX", "description": "For lxv, the contents of the quadword in storage at address EA are placed into load_data. The order of bytes depends on the endianness (Big-Endian or Little-Endian). load_data is then placed into VSR[XT].", "pseudocode": "if 'lxv' & TX=0 & MSR.VSX=0 then VSX_Unavailable()\nif 'lxv' & TX=1 & MSR.VEC=0 then Vector_Unavailable()\nEA ←(RA|0) + EXTS64(DQ||0b0000)\nVSR[32×TX+T] ←MEM(EA,16)", "page_found": "Page 610 - 611", "special_registers": "MSR", "programming_notes": "The lxv instruction loads a 16-byte vector from memory into a VSX register. Ensure the address is properly aligned to avoid alignment faults. Check that the appropriate privilege levels (MSR.VSX for VSX operations and MSR.VEC for vector operations) are enabled before executing this instruction.", "example": "lxv vs1, 0(r4)"}
{"mnemonic": "stxv", "architecture": "PowerISA", "full_name": "Store VSX Vector", "summary": "Stores a 128-bit vector to memory (VSX aligned offset).", "syntax": "stxv XS, DQ(RA)", "encoding": {"format": "DQ-form", "binary_pattern": "61 | XS | RA | DQ | 5 | TX", "hex_opcode": "0xF4000005", "visual_parts": [{"raw": "61", "clean": "61"}, {"raw": "XS", "clean": "XS"}, {"raw": "RA", "clean": "RA"}, {"raw": "DQ", "clean": "DQ"}, {"raw": "5", "clean": "5"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:27 | 28:30 | 31"}, "operands": [{"name": "XS", "desc": "Source"}, {"name": "DQ", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "disp", "desc": "Displacement value"}, {"name": "VX", "desc": "VSX Register"}, {"name": "RB", "desc": "Index General Purpose Register"}, {"name": "VS32", "desc": "Source VSX Register"}], "extension": "VSX", "description": "For stxv, the contents of VSR[XS] are stored into memory at the effective address (EA), which is the sum of the contents of GPR[RA] and the value DQ sign-extended to 64 bits. If RA=0, EA is set to 0.", "pseudocode": "if 'stxv' & SX=0 & MSR.VSX=0 then VSX_Unavailable()\nif 'stxv' & SX=1 & MSR.VEC=0 then Vector_Unavailable()\nEA ← (RA|0) + EXTS64(DQ||0b0000)\nMEM(EA,16) ← VSR[32×SX+S]", "page_found": "Page 626 - 627", "special_registers": "MSR", "programming_notes": "The stxv instruction stores a VSX vector from the VSR register to memory. Ensure that the VSX or Vector facility is enabled in the MSR register based on the SX field value. The effective address (EA) is calculated by adding the contents of GPR[RA] and the sign-extended DQ value. If RA is 0, EA defaults to 0. This instruction operates at user privilege level unless otherwise specified.", "example": "stxv vs1, 0(r4)"}
{"mnemonic": "lxvdsx", "architecture": "PowerISA", "full_name": "Load VSX Vector Doubleword and Splat Indexed", "summary": "Loads a doubleword from memory and splats it into two elements of a VSX vector register.", "syntax": "lxvdsx XT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | XT | RA | RB | 332 | TX", "hex_opcode": "0x7C000298", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "332", "clean": "332"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}, {"name": "VX", "desc": "Destination Vector Register"}], "extension": "VSX", "description": "Loads a doubleword from memory at the address computed from RA+RB and splats it across two doubleword elements in the VSX vector register XT. The effective address is formed by adding the contents of RA (or 0 if RA=0) and RB. The 64-bit value is replicated into both elements of the 128-bit VSX register. This VSX extension instruction does not affect condition registers.", "pseudocode": "EA ← (RA = 0) ? RB : RA + RB\ndoubleword ← [EA]\nXT[0:63] ← doubleword\nXT[64:127] ← doubleword", "page_found": "Page 617 - 618", "special_registers": "CR0, XER", "programming_notes": "The lxvdsx instruction is commonly used to load a doubleword from memory and replicate it across both elements of a VSX vector register. Ensure that the VSX facility is enabled (MSR.VSX=1) to avoid exceptions. The effective address must be aligned to an 8-byte boundary for optimal performance, although unaligned accesses are supported with potential performance penalties.", "example": "lxvdsx vs1, r4, r5"}
{"mnemonic": "lxvw4x", "architecture": "PowerISA", "full_name": "Load VSX Vector Word*4 Indexed", "summary": "Loads four words into a vector (unaligned).", "syntax": "lxvw4x XT, RA, RB", "encoding": {"format": "XX1-form", "binary_pattern": "31 | XT | RA | RB | 780", "hex_opcode": "0x7C000618", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "780", "clean": "780"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "VSX", "description": "The contents of the byte in storage at address EA+4×i+3 are placed into byte element 3 of load_data. When Little-Endian byte ordering is employed, the contents of the word in storage at address EA+4×i are placed into word element i of VSR[XT] in such an order that; if MSR.VSX=0 then VSX_Unavailable(). EA ←((RA=0) ? 0 : GPR[RA]) + GPR[RB]. Let XT be the value 32×TX + T. Let EA be the sum of the contents of GPR[RA], or 0 if RA is equal to 0, and the contents of GPR[RB]. For each integer value i from 0 to 3, do the following.", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\nEA ←((RA=0) ? 0 : GPR[RA]) + GPR[RB]\nfor i from 0 to 3 do\n    VSR[32×TX+T].word[i] ←MEM(EA+4×i, 4)", "programming_notes": "lxvd2x, lxvw4x, lxvh8x, lxvb16x, and lxvx exhibit identical behavior in Big-Endian mode.", "page_found": "Page 614 - 615", "special_registers": "MSR", "example": "lxvw4x vs1, r4, r5"}
{"mnemonic": "stxvw4x", "architecture": "PowerISA", "full_name": "Store VSX Vector Word*4 Indexed", "summary": "Stores four words from a vector (unaligned).", "syntax": "stxvw4x XS, RA, RB", "encoding": {"format": "XX1-form", "binary_pattern": "18 | S | RA | RB | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0", "hex_opcode": "0x7C000718", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XS", "clean": "XS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "972", "clean": "972"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "VSX", "description": "Stores four 32-bit word elements from a VSX vector register XS into memory at an unaligned address computed as RA+RB. The effective address is calculated by adding RA (or 0 if RA=0) and RB, and the four words from the source register are written to consecutive memory locations. This VSX extension instruction does not affect condition registers and permits unaligned access.", "pseudocode": "EA ← (RA = 0) ? RB : RA + RB\n[EA:EA+3] ← XS[0:31]\n[EA+4:EA+7] ← XS[32:63]\n[EA+8:EA+11] ← XS[64:95]\n[EA+12:EA+15] ← XS[96:127]", "programming_notes": "stxvd2x, stxvw4x, stxvh8x, stxvb16x, and stxvx exhibit identical behavior in Big-Endian mode.", "page_found": "Page 630 - 631", "special_registers": "MSR", "example": "stxvw4x vs1, r4, r5"}
{"mnemonic": "lxsiwax", "architecture": "PowerISA", "full_name": "Load VSX Scalar as Integer Word Algebraic Indexed", "summary": "Loads a word from memory into the left-most doubleword element of a VSR, sign-extends it to 64 bits, and aligns it.", "syntax": "lxsiwax XT, RA, RB", "encoding": {"format": "XX1-form", "binary_pattern": "31 | XT | RA | RB | 76 | TX", "hex_opcode": "0x7C000098", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "76", "clean": "76"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}, {"name": "VX", "desc": "Target Vector-Specific Register"}], "extension": "VSX", "description": "Loads a 32-bit signed integer word from memory at address RA+RB into the left-most doubleword element of VSX register XT, with the value sign-extended to 64 bits. The effective address is computed by adding RA (or 0 if RA=0) and RB. The loaded and sign-extended value occupies bits 0-63 of the VSX register, leaving the right element undefined. This VSX extension instruction does not affect condition registers.", "pseudocode": "EA ← (RA = 0) ? RB : RA + RB\nword ← [EA:EA+3]\nXT[0:63] ← sign_extend(word, 64)\nXT[64:127] ← undefined", "page_found": "Page 596 - 597", "special_registers": "MSR", "programming_notes": "The lxsiwax instruction is commonly used to load a 32-bit integer from memory into the left-most doubleword of a VSX register, with sign extension. Ensure that the VSX facility is enabled in the MSR register; otherwise, a VSX_Unavailable exception will be raised. The effective address (EA) must be properly calculated and aligned to a word boundary for optimal performance and correct data loading.", "example": "lxsiwax vs1, r4, r5"}
{"mnemonic": "lxsiwzx", "architecture": "PowerISA", "full_name": "Load VSX Scalar as Integer Word Zero Indexed", "summary": "Loads a word from memory and places it into the specified VSX register, zero-extending it.", "syntax": "lxsiwzx XT, RA, RB", "encoding": {"format": "XX1-form", "binary_pattern": "0 | T | RA | RB | 12 | TX", "hex_opcode": "0x7C000018", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "12", "clean": "12"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "VSX", "description": "Loads a 32-bit unsigned integer word from memory at address RA+RB into the left-most doubleword element of VSX register XT, with the value zero-extended to 64 bits. The effective address is computed by adding RA (or 0 if RA=0) and RB. The loaded and zero-extended value occupies bits 0-63 of the VSX register. This VSX extension instruction does not affect condition registers.", "pseudocode": "EA ← (RA = 0) ? RB : RA + RB\nword ← [EA:EA+3]\nXT[0:63] ← zero_extend(word, 64)\nXT[64:127] ← undefined", "page_found": "Page 601 - 602", "special_registers": "MSR", "programming_notes": "The lxsiwzx instruction is commonly used to load a word from memory into a VSX register, ensuring zero-extension. Ensure that the VSX facility is enabled in the MSR register; otherwise, a VSX_Unavailable exception will be raised. The address calculation respects the base and offset registers, with RA being optional (use 0 if not needed). This instruction does not require any specific alignment but must be executed at a privilege level where VSX operations are permitted.", "example": "lxsiwzx vs1, r4, r5"}
{"mnemonic": "stxsiwx", "architecture": "PowerISA", "full_name": "Store VSX Scalar as Integer Word Indexed", "summary": "Stores a single-precision floating-point value from a VSX register into memory, indexed by another register.", "syntax": "stxsiwx XS, RA, RB", "encoding": {"format": "XX1-form", "binary_pattern": "011111 | RS | B | RB | 00100 | 01100", "hex_opcode": "0x7C000118", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XS", "clean": "XS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "140", "clean": "140"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "XS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}, {"name": "RS", "desc": "Source VSX Register"}, {"name": "B", "desc": "Base General Purpose Register"}], "extension": "VSX", "description": "Stores the low-order 32 bits from the left-most doubleword element of VSX register XS into memory at the address computed as RA+RB. The effective address is formed by adding RA (or 0 if RA=0) and RB. The 32-bit word from XS[32:63] is written to the memory location. This VSX extension instruction does not affect condition registers.", "pseudocode": "EA ← (RA = 0) ? RB : RA + RB\n[EA:EA+3] ← XS[32:63]", "page_found": "Page 607 - 608", "special_registers": "MSR", "programming_notes": "The stxsiwx instruction stores the second word of a VSX register into memory. Ensure that the VSX facility is enabled in the MSR register to avoid exceptions. The effective address is calculated from two GPRs, so ensure proper alignment and bounds checking to prevent memory access errors.", "example": "stxsiwx vs1, r4, r5"}
{"mnemonic": "mfvsrd", "architecture": "PowerISA", "full_name": "Move From VSR Doubleword", "summary": "Moves the contents of a doubleword element from a Vector-Scalar Register (VSR) to a General Purpose Register (GPR).", "syntax": "mfvsrd RA, XS", "encoding": {"format": "XX1-form", "binary_pattern": "31 | S | RA | /// | 51 | SX", "hex_opcode": "0x7C000066", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XS", "clean": "XS"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "51", "clean": "51"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target GPR"}, {"name": "XS", "desc": "Source VSR"}], "extension": "VSX", "description": "The contents of doubleword element 0 of VSR[XS] are placed into GPR[RA]. For SX=0, mfvsrd is treated as a Floating-Point instruction in terms of resource availability. For SX=1, mfvsrd is treated as a Vector instruction in terms of resource availability.", "pseudocode": "if SX=0 & MSR.FP=0 then FP_Unavailable()\nif SX=1 & MSR.VEC=0 then Vector_Unavailable()\nGPR[RA] ← VSR[32×SX+S].dword[0]", "programming_notes": "For SX=0, mfvsrd is treated as a Floating-Point instruction in terms of resource availability.\nFor SX=1, mfvsrd is treated as a Vector instruction in terms of resource availability.", "extended_mnemonics": [{"mnemonic": "mffprd", "equivalent_to": "mfvsrd RA,frs"}, {"mnemonic": "mfvrd", "equivalent_to": "mfvsrd RA,vrs+32"}], "page_found": "Page 156 - 158", "special_registers": "MSR", "example": "mfvsrd r4, vs1"}
{"mnemonic": "mtvsrd", "architecture": "PowerISA", "full_name": "Move To VSR Doubleword", "summary": "Moves 64 bits from a GPR to a VSR.", "syntax": "mtvsrd XT, RA", "encoding": {"format": "XX1-form", "binary_pattern": "31 | XT | RA | 0 | 179", "hex_opcode": "0x7C000166", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "179", "clean": "179"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target VSR"}, {"name": "RA", "desc": "Source GPR"}], "extension": "VSX", "description": "Moves a 64-bit value from general-purpose register RA into the left-most doubleword element of VSX register XT. The entire 64-bit content of RA is copied to bits 0-63 of the target VSX register; the right doubleword element (bits 64-127) is left undefined. This VSX extension instruction does not affect condition registers.", "pseudocode": "XT[0:63] ← RA\nXT[64:127] ← undefined", "page_found": "Page 159", "special_registers": "MSR", "programming_notes": "The mtvsrd instruction is commonly used to transfer data from a general-purpose register to the first doubleword of a vector-scalar register. Ensure that the appropriate privilege level (FP or VEC) is enabled in the MSR register, otherwise, an exception will be raised. Note that the second doubleword of the VSR is zeroed out during this operation.", "example": "mtvsrd vs1, r4"}
{"mnemonic": "mfvsrwz", "architecture": "PowerISA", "full_name": "Move From VSR Word and Zero", "summary": "Moves the contents of a word element from a vector-scalar register to a general-purpose register, zeroing the upper bits.", "syntax": "mfvsrwz RA, XS", "encoding": {"format": "XX1-form", "binary_pattern": "31 | XS | RA | 0 | 115", "hex_opcode": "0x7C0000E6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XS", "clean": "XS"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "115", "clean": "115"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target GPR"}, {"name": "XS", "desc": "Source VSR"}], "extension": "VSX", "description": "The contents of word element 1 of VSR[XS] are placed into bits 32:63 of GPR[RA]. The contents of bits 0:31 of GPR[RA] are set to 0. Let XS be the value 32×SX + S.", "pseudocode": "if SX=0 & MSR.FP=0 then FP_Unavailable()\nif SX=1 & MSR.VEC=0 then Vector_Unavailable()\nGPR[RA] ←EXTZ64(VSR[32×SX+S].word[1])", "programming_notes": "For SX=0, mfvsrwz is treated as a Floating-Point instruction in terms of resource availability.\nFor SX=1, mfvsrwz is treated as a Vector instruction in terms of resource availability.", "extended_mnemonics": [{"mnemonic": "mffprwz", "equivalent_to": "mfvsrwz RA,frs"}, {"mnemonic": "mfvrwz", "equivalent_to": "mfvsrwz RA,vrs+32"}], "page_found": "Page 158 - 160", "special_registers": "MSR", "example": "mfvsrwz r4, vs1"}
{"mnemonic": "mtvsrwa", "architecture": "PowerISA", "full_name": "Move To VSR Word Algebraic", "summary": "Moves the two's-complement integer in bits 32:63 of GPR[RA] to doubleword element 0 of VSR[XT], sign-extended to 64 bits.", "syntax": "mtvsrwa XT, RA", "encoding": {"format": "XX1-form", "binary_pattern": "31 | XT | RA | / | 211 | TX", "hex_opcode": "0x7C0001A6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "211", "clean": "211"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "XT", "desc": "Target VSR"}, {"name": "RA", "desc": "Source GPR"}, {"name": "VS", "desc": "Target Vector Scalar Register"}], "extension": "VSX", "description": "The two’s-complement integer in bits 32:63 of GPR[RA] is sign-extended to 64 bits and placed into doubleword element 0 of VSR[XT]. The contents of doubleword element 1 of VSR[XT] are undefined.", "pseudocode": "if TX=0 & MSR.FP=0 then FP_Unavailable()\nif TX=1 & MSR.VEC=0 then Vector_Unavailable()\nVSR[32×TX+T].dword[0] ←EXTS64(GPR[RA].bit[32:63])\nVSR[32×TX+T].dword[1] ←0xUUUU_UUUU_UUUU_UUUU", "programming_notes": "For TX=0, mtvsrwa is treated as a Floating-Point instruction in terms of resource availability.\nFor TX=1, mtvsrwa is treated as a Vector instruction in terms of resource availability.", "extended_mnemonics": [{"mnemonic": "mtfprwa", "equivalent_to": "mtvsrwa frt,RA"}, {"mnemonic": "mtvrwa", "equivalent_to": "mtvsrwa vrt+32,RA"}], "page_found": "Page 159 - 160", "special_registers": "MSR", "example": "mtvsrwa vs1, r4"}
{"mnemonic": "cmp", "architecture": "PowerISA", "full_name": "Compare", "summary": "Compares two registers as signed integers and records the result in the specified Condition Register Field.", "syntax": "cmp BF, L, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | BF | / | L | RA | RB | 0000000000 | 1", "hex_opcode": "0x7C000000", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "L", "clean": "L"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "0000000000", "clean": "0000000000"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:8 | 9 | 10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BF", "desc": "Condition Register Field (0-7)"}, {"name": "L", "desc": "Operand Size (0=32-bit, 1=64-bit)"}, {"name": "RA", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}], "pseudocode": "if (RA) < (RB) then CR[BF] <- 0b1000 (LT)...", "example": "cmp cr7, 0, r3, r4", "example_note": "Compare r3 vs r4 (32-bit signed), result in cr7.", "extension": "Base", "description": "The fixed-point Compare instructions compare the contents of register RA with either the sign-extended value of the SI field, the zero-extended value of the UI field, or the contents of register RB. The comparison is signed for cmpi and cmp, and unsigned for cmpli and cmpl. The L field determines whether the operands are treated as 32-bit or 64-bit quantities.", "page_found": "Page 126", "special_registers": "CR", "programming_notes": "The cmp instruction is commonly used for signed comparisons between two registers. Ensure that the operands are correctly aligned and consider the L field to specify whether the comparison should be performed on 32-bit or 64-bit values. The result of the comparison updates the Condition Register (CR), so always check CR[BF] after executing cmp to determine the outcome."}
{"mnemonic": "cmpi", "architecture": "PowerISA", "full_name": "Compare Immediate", "summary": "Compares the contents of register RA with a sign-extended immediate value.", "syntax": "cmpi BF, L, RA, SI", "encoding": {"format": "D-form", "binary_pattern": "11 | BF | / | L | RA | SI", "hex_opcode": "0x2C000000", "visual_parts": [{"raw": "11", "clean": "11"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "L", "clean": "L"}, {"raw": "RA", "clean": "RA"}, {"raw": "SI", "clean": "SI"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "L", "desc": "Size (0=32-bit, 1=64-bit)"}, {"name": "RA", "desc": "Source Register"}, {"name": "SI", "desc": "Signed 16-bit Immediate"}], "pseudocode": "if L = 0 then a ←EXTS((RA)32:63)\nelse a ←(RA)\nif      a < EXTS(SI) then c ←0b100\nelse if a > EXTS(SI) then c ←0b010\nelse                      c ←0b001\nCR4×BF+32:4×BF+35 ←c || XERSO", "example": "cmpi cr0, 1, r3, -5", "example_note": "Compare r3 vs -5 (64-bit signed).", "extension": "Base", "description": "The contents of register RA ((RA)32:63 sign-extended to 64 bits if L=0) are compared with the sign-extended value of the SI field, treating the operands as signed integers. The result of the comparison is placed into CR field BF.", "special_registers": "CR, XER", "extended_mnemonics": [{"mnemonic": "cmpdi", "equivalent_to": "cmpi BF,1,RA,SI"}, {"mnemonic": "cmpwi", "equivalent_to": "cmpi BF,0,RA,SI"}], "page_found": "Page 125 - 126", "programming_notes": "The cmpi instruction is commonly used for signed integer comparisons where one operand is an immediate value. Be cautious with the alignment of the register RA, as incorrect alignment can lead to unexpected results. This instruction operates at user privilege level and does not generate exceptions under normal circumstances."}
{"mnemonic": "cmpl", "architecture": "PowerISA", "full_name": "Compare Logical", "summary": "Compares two registers as unsigned integers.", "syntax": "cmpl BF, L, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | BF | / | L | RA | RB | 0000100000 | 1", "hex_opcode": "0x7C000040", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "L", "clean": "L"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "0000100000", "clean": "0000100000"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:8 | 9 | 10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "L", "desc": "Size (0=32-bit, 1=64-bit)"}, {"name": "RA", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}], "pseudocode": "if L = 0 then\n  a ← zero_extend(RA[32:63], 64)\n  b ← zero_extend(RB[32:63], 64)\nelse\n  a ← RA\n  b ← RB\nif a < b then\n  CR[BF] ← 0b100 || SO\nelseif a > b then\n  CR[BF] ← 0b010 || SO\nelse\n  CR[BF] ← 0b001 || SO", "example": "cmpl cr1, 1, r3, r4", "example_note": "Unsigned compare of r3 vs r4.", "extension": "Base", "description": "Performs an unsigned logical comparison between RA and RB, with L determining the operand size (L=0 for 32-bit, L=1 for 64-bit). The comparison result is written to condition register field BF. The comparison sets the LT, GT, or EQ bits in the target CR field based on whether RA is less than, greater than, or equal to RB when interpreted as unsigned integers. This Base category instruction affects only the specified condition register field, not CR0.", "page_found": "Page 126", "special_registers": "CR", "programming_notes": "Use cmpl for unsigned comparisons. Ensure registers RA and RB are properly aligned if they contain pointers or data structures. The instruction modifies the Condition Register (CR), so check the appropriate field after execution to determine the result of the comparison."}
{"mnemonic": "cmpli", "architecture": "PowerISA", "full_name": "Compare Logical Immediate", "summary": "Compares the contents of a register with an immediate value and updates the condition register.", "syntax": "cmpli BF, L, RA, UI", "encoding": {"format": "D-form", "binary_pattern": "10 | BF | / | L | RA | UI", "hex_opcode": "0x28000000", "visual_parts": [{"raw": "10", "clean": "10"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "L", "clean": "L"}, {"raw": "RA", "clean": "RA"}, {"raw": "UI", "clean": "UI"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "L", "desc": "Size"}, {"name": "RA", "desc": "Source Register"}, {"name": "UI", "desc": "Unsigned 16-bit Immediate"}, {"name": "CRb", "desc": "Condition Register Field"}, {"name": "SIMM", "desc": "Signed Immediate Value"}], "pseudocode": "if L = 0 then a ←320 || (RA)32:63\nelse a ←(RA)\nif      a <u (480 || UI) then c ←0b100\nelse if a >u (480 || UI) then c ←0b010\nelse                         c ←0b001\nCR4×BF+32:4×BF+35 ←c || XERSO", "example": "cmpli cr0, 0, r3, 0xFF", "example_note": "Check if r3 < 255 (unsigned).", "extension": "Base", "description": "The contents of register RA ((RA)32:63 zero-extended to 64 bits if L=0) are compared with 480 || UI, treating the operands as unsigned integers. The result of the comparison is placed into CR field BF.", "special_registers": "CR, XER", "extended_mnemonics": [{"mnemonic": "cmpldi", "equivalent_to": "cmpli BF,1,RA,UI"}], "page_found": "Page 126 - 128", "programming_notes": "The cmpli instruction is commonly used for unsigned integer comparisons where one operand is an immediate value. Be cautious with the zero-extension behavior when L=0, as it can lead to unexpected results if not accounted for. This instruction operates at user privilege level and does not generate exceptions under normal circumstances."}
{"mnemonic": "cntlzw", "architecture": "PowerISA", "full_name": "Count Leading Zeros Word", "summary": "Counts the number of consecutive 0 bits starting from bit 32 (MSB of the low word).", "syntax": "cntlzw RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 00000 | 000011010 | Rc", "hex_opcode": "0x7C000034", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "00000", "clean": "00000"}, {"raw": "000011010", "clean": "000011010"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}], "pseudocode": "n ← 0\nwhile n < 32 and RS[n] = 0 do n ← n + 1\nRA ← n\nif Rc = 1 then CR0 ← (RA = 0, RA < 0, RA > 0, SO)", "example": "cntlzw r3, r4", "example_note": "r3 = Leading Zeros in lower 32-bits of r4.", "extension": "Base", "description": "Counts the number of consecutive zero bits from the MSB (bit 0) of the 32-bit word in RS and stores the result in RA. The count ranges from 0 to 32. If Rc=1, CR0 is updated based on the result.", "page_found": "Page 137", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "cntlzd", "architecture": "PowerISA", "full_name": "Count Leading Zeros Doubleword", "summary": "Counts the number of consecutive 0 bits starting from bit 0 (MSB of 64-bit reg).", "syntax": "cntlzd RT,RA", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 00000 | 000111010 | Rc", "hex_opcode": "0x7C000074", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "00000", "clean": "00000"}, {"raw": "000111010", "clean": "000111010"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "RT", "desc": "Target General Purpose Register"}], "pseudocode": "n ← 0\nwhile n < 64 and RS[n] = 0 do n ← n + 1\nRT ← n\nif Rc = 1 then CR0 ← (RT = 0, RT < 0, RT > 0, SO)", "example": "cntlzd r3, r4", "example_note": "r3 = Leading Zeros in 64-bit r4.", "extension": "Base", "description": "Counts the number of consecutive zero bits from the MSB (bit 0) of the 64-bit doubleword in RS and stores the result in RT. The count ranges from 0 to 64. If Rc=1, CR0 is updated based on the result.", "special_registers": "CR0", "page_found": "Page 139 - 140", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "crand", "architecture": "PowerISA", "full_name": "Condition Register AND", "summary": "Performs a bitwise AND between two bits in the Condition Register.", "syntax": "crand BT, BA, BB", "encoding": {"format": "XL-form", "binary_pattern": "19 | BT | BA | BB | 257 | /", "hex_opcode": "0x4C000202", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "BT", "clean": "BT"}, {"raw": "BA", "clean": "BA"}, {"raw": "BB", "clean": "BB"}, {"raw": "257", "clean": "257"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BT", "desc": "Target Bit (0-31)"}, {"name": "BA", "desc": "Source Bit A"}, {"name": "BB", "desc": "Source Bit B"}], "pseudocode": "CR[BT] <- CR[BA] & CR[BB]", "example": "crand 4*cr0+eq, 4*cr1+lt, 4*cr2+gt", "example_note": "If (cr1.lt AND cr2.gt), set cr0.eq.", "extension": "Base", "description": "The bit in the Condition Register specified by BA+32 is ANDed with the bit in the Condition Register specified by BB+32, and the result is placed into the bit in the Condition Register specified by BT+32.", "special_registers": "CR", "page_found": "Page 78 - 80", "programming_notes": "The crand instruction performs a bitwise AND operation on specific bits of the Condition Register (CR). It's commonly used to combine condition flags from different operations. Ensure that the BA, BB, and BT fields are correctly set to avoid unintended results. This instruction operates at user privilege level."}
{"mnemonic": "cror", "architecture": "PowerISA", "full_name": "Condition Register OR", "summary": "Performs a bitwise OR between two bits in the Condition Register.", "syntax": "cror BT, BA, BB", "encoding": {"format": "XL-form", "binary_pattern": "19 | BT | BA | BB | 449 | /", "hex_opcode": "0x4C000382", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "BT", "clean": "BT"}, {"raw": "BA", "clean": "BA"}, {"raw": "BB", "clean": "BB"}, {"raw": "449", "clean": "449"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BT", "desc": "Target Bit"}, {"name": "BA", "desc": "Source Bit A"}, {"name": "BB", "desc": "Source Bit B"}], "pseudocode": "CR[BT] ← CR[BA] | CR[BB]", "example": "cror 0, 1, 2", "example_note": "CR[0] = CR[1] | CR[2].", "extension": "Base", "description": "Performs a bitwise OR of CR bit BA and CR bit BB, storing the result in CR bit BT. This instruction operates only on the Condition Register and is commonly used in conditional branch sequences.", "page_found": "Page 79", "special_registers": "CR", "programming_notes": "The cror instruction is commonly used to combine condition flags from different parts of the Condition Register (CR) for conditional branching or logical operations. Ensure that the BA, BB, and BT fields correctly specify the bits you intend to OR; otherwise, it may lead to incorrect results. This instruction operates at user privilege level and does not generate exceptions under normal circumstances."}
{"mnemonic": "crxor", "architecture": "PowerISA", "full_name": "Condition Register XOR", "summary": "Performs a bitwise XOR between two bits in the Condition Register. Used to clear CR bits (crxor x,x,x).", "syntax": "crxor BT, BA, BB", "encoding": {"format": "XL-form", "binary_pattern": "19 | BT | BA | BB | 193 | /", "hex_opcode": "0x4C000182", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "BT", "clean": "BT"}, {"raw": "BA", "clean": "BA"}, {"raw": "BB", "clean": "BB"}, {"raw": "193", "clean": "193"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BT", "desc": "Target Bit"}, {"name": "BA", "desc": "Source Bit A"}, {"name": "BB", "desc": "Source Bit B"}], "pseudocode": "CR[BT] ← CR[BA] ^ CR[BB]", "example": "crxor 0, 0, 0", "example_note": "Clears CR bit 0 (sets it to 0).", "extension": "Base", "description": "Performs a bitwise XOR of CR bit BA and CR bit BB, storing the result in CR bit BT. When BA and BB are the same bit, this effectively clears CR[BT]; this form is frequently used for clearing condition register fields.", "page_found": "Page 79", "special_registers": "CR", "programming_notes": "The crxor instruction is used to perform a bitwise XOR operation between two condition register bits and store the result in another condition register bit. Ensure that the BA, BB, and BT fields are correctly set to avoid unintended behavior. This instruction operates at the problem state privilege level."}
{"mnemonic": "b", "architecture": "PowerISA", "full_name": "Branch", "summary": "Unconditionally branches to a target address relative to the current instruction pointer.", "syntax": "b target_addr (AA=0 LK=0)", "encoding": {"format": "I-form", "binary_pattern": "18 | LI | AA | LK", "hex_opcode": "0x48000000", "visual_parts": [{"raw": "18", "clean": "18"}, {"raw": "LI", "clean": "LI"}, {"raw": "AA", "clean": "AA"}, {"raw": "LK", "clean": "LK"}], "length": "32", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "operands": [{"name": "LI", "desc": "24-bit Signed Immediate (Displacement / 4)"}, {"name": "target_addr", "desc": "Branch Target Address"}], "pseudocode": "if AA then\n    NIA ←iea EXTS(LI || 0b00)\nelse\n    NIA ←iea CIA + EXTS(LI || 0b00)\nif LK then\n    LR ←iea CIA + 4", "example": "b label", "example_note": "Jump to 'label'.", "extension": "Base", "description": "The branch target address is the sum of LI || 0b00 sign-extended and the address of this instruction, with the high-order 32 bits of the branch target address set to 0 in 32-bit mode.", "special_registers": "LR", "page_found": "Page 74 - 76", "programming_notes": "The b instruction is used for unconditional branching. The AA and LK fields control whether the address is absolute or relative and whether to link back to the current instruction."}
{"mnemonic": "ba", "architecture": "PowerISA", "full_name": "Branch Absolute", "summary": "Unconditionally branches to an absolute address.", "syntax": "ba target_addr", "encoding": {"format": "I-form", "binary_pattern": "18 | LI | 1 | LK", "hex_opcode": "0x48000002", "visual_parts": [{"raw": "18", "clean": "18"}, {"raw": "LI", "clean": "LI"}, {"raw": "1", "clean": "1"}, {"raw": "LK", "clean": "LK"}], "bit_positions": "0:5 | 6:29 | 30 | 31", "length": "32"}, "operands": [{"name": "LI", "desc": "24-bit Signed Immediate (Address / 4)"}], "pseudocode": "NIA ← (LI || 0b00)\nif LK = 1 then LR ← CIA + 4", "example": "ba 0x1000", "example_note": "Jump to address 0x1000.", "extension": "Base", "description": "Unconditionally branches to an absolute address formed by sign-extending the 24-bit immediate LI and shifting left by 2 bits. The Link Register is not modified unless LK=1. This instruction does not check any condition bits.", "page_found": "Page 76", "programming_notes": "When LK=1, the address of the next sequential instruction is placed in LR, making this a subroutine call. Use blr to return."}
{"mnemonic": "bl", "architecture": "PowerISA", "full_name": "Branch and Link", "summary": "Branches to a target address and saves the return address (CIA + 4) in the Link Register (LR). Used for function calls.", "syntax": "bl target_addr", "encoding": {"format": "I-form", "binary_pattern": "18 | LI | AA | 1", "hex_opcode": "0x48000001", "visual_parts": [{"raw": "18", "clean": "18"}, {"raw": "LI", "clean": "LI"}, {"raw": "AA", "clean": "AA"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:29 | 30 | 31", "length": "32"}, "operands": [{"name": "LI", "desc": "24-bit Signed Immediate"}], "pseudocode": "if AA = 0 then NIA ← CIA + (LI || 0b00) else NIA ← (LI || 0b00)\nLR ← CIA + 4", "example": "bl printf", "example_note": "Call 'printf' function.", "extension": "Base", "description": "Branches to a target address calculated from the 24-bit signed immediate and saves the return address (CIA + 4) in the Link Register (LR). The AA bit determines whether the address is absolute or relative. This is the standard instruction for subroutine calls.", "page_found": "Page 76", "special_registers": "LR", "programming_notes": "The bl instruction is commonly used for function calls where a return to the caller is required. Ensure that the target address is correctly calculated and aligned, as misalignment can lead to exceptions. The link register (LR) must be preserved if nested subroutine calls are made to maintain correct return paths."}
{"mnemonic": "bc", "architecture": "PowerISA", "full_name": "Branch Conditional", "summary": "Branches conditionally based on the Count Register (CTR) and/or a bit in the Condition Register (CR).", "syntax": "bc BO,BI,target_addr (AA=0 LK=0)", "encoding": {"format": "B-form", "binary_pattern": "10 | BO | BI | AA | LK | target_addr", "hex_opcode": "0x40000000", "visual_parts": [{"raw": "16", "clean": "16"}, {"raw": "BO", "clean": "BO"}, {"raw": "BI", "clean": "BI"}, {"raw": "BD", "clean": "BD"}, {"raw": "AA", "clean": "AA"}, {"raw": "LK", "clean": "LK"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "BO", "desc": "Branch Options (5 bits)"}, {"name": "BI", "desc": "CR Bit Index (5 bits)"}, {"name": "BD", "desc": "14-bit Signed Displacement"}, {"name": "target_addr", "desc": "Target address"}], "pseudocode": "ctr_ok ← (BO[2] = 1) | (CTR ≠ 0 ⊕ BO[3])\nif BO[2] = 0 then CTR ← CTR - 1\ncr_ok ← (BO[0] = 1) | (CR[BI] = BO[1])\nif ctr_ok & cr_ok then\n  if AA = 0 then NIA ← CIA + (BD || 0b00) else NIA ← (BD || 0b00)\nif LK = 1 then LR ← CIA + 4", "example": "bc 12, 2, label", "example_note": "Branch if CR bit 2 is set (beq).", "extension": "Base", "description": "Branches conditionally based on the state of the Count Register (CTR) and/or a bit in the Condition Register (CR), as controlled by the BO field. The AA field determines absolute vs. relative addressing; LK=1 saves the return address in LR. This is the fundamental conditional branch instruction.", "special_registers": "LR, CTR", "extended_mnemonics": ["bca", "bclr", "bcctr"], "page_found": "Page 990 - 991", "programming_notes": "The bc instruction branches to a target address based on the condition bits in the Condition Register (CR). Ensure that the branch condition and target address are correctly set. The instruction operates at user privilege level, but care must be taken with conditional logic to avoid unintended execution paths."}
{"mnemonic": "bclr", "architecture": "PowerISA", "full_name": "Branch Conditional to Link Register", "summary": "Branches to the address in the Link Register (LR) if the condition is met. Used for function returns.", "syntax": "bclr BO,BI,BH", "encoding": {"format": "XL-form", "binary_pattern": "19 | BO | BI | 000 | 16 | LK", "hex_opcode": "0x4C000020", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "BO", "clean": "BO"}, {"raw": "BI", "clean": "BI"}, {"raw": "000", "clean": "000"}, {"raw": "16", "clean": "16"}, {"raw": "LK", "clean": "LK"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BO", "desc": "Branch Options"}, {"name": "BI", "desc": "CR Bit Index"}, {"name": "BH", "desc": "Hint bits"}, {"name": "LK", "desc": "Link Register Update field"}], "pseudocode": "ctr_ok ← (BO[2] = 1) | (CTR ≠ 0 ⊕ BO[3])\nif BO[2] = 0 then CTR ← CTR - 1\ncr_ok ← (BO[0] = 1) | (CR[BI] = BO[1])\nif ctr_ok & cr_ok then NIA ← LR[0:61] || 0b00\nif LK = 1 then LR ← CIA + 4", "example": "bclr 20, 0", "example_note": "Unconditional return (blr).", "extension": "Base", "description": "Branches to the address in the Link Register (LR) if the condition specified by BO and BI is satisfied. The CTR is decremented if BO[2]=0. If LK=1, the return address (CIA + 4) is saved in LR, enabling exception-safe subroutine returns. The BH field provides a branch prediction hint to the processor.", "special_registers": "CTR, LR", "programming_notes": "bclr, bclrl, bcctr, and bcctrl each serve as both a basic and an extended mnemonic. The Assembler will recognize a bclr, bclrl, bcctr, or bcctrl mnemonic with three operands as the basic form, and a bclr, bclrl, bcctr, or bcctrl mnemonic with two operands as the extended form. In the extended form the BH operand is omitted and assumed to be 0b00.", "extended_mnemonics": [{"mnemonic": "bcctr", "equivalent_to": "bcctr BO,BI,BH"}, {"mnemonic": "bltctr", "equivalent_to": "bcctr 12,0,0"}, {"mnemonic": "bnectr", "equivalent_to": "bcctr 4,10,0"}, {"mnemonic": "bclr", "equivalent_to": "bclr BO,BI,BH"}, {"mnemonic": "bltlr", "equivalent_to": "bclr 12,0,0"}, {"mnemonic": "bnelr", "equivalent_to": "bclr 4,10,0"}, {"mnemonic": "bdnzlr", "equivalent_to": "bclr 16,0,0"}, {"mnemonic": "bcctr", "equivalent_to": "bcctr BO,BI,BH (LK=0)"}, {"mnemonic": "bcctrl", "equivalent_to": "bcctr BO,BI,BH (LK=1)"}, {"mnemonic": "bclr 4,6", "equivalent_to": "bclr 4,6,0"}, {"mnemonic": "bnelr cr2", "equivalent_to": "bclr 4,10,0"}], "page_found": "Page 76 - 78"}
{"mnemonic": "bcctr", "architecture": "PowerISA", "full_name": "Branch Conditional to Count Register", "summary": "Branches to the address in the Count Register (CTR) if the condition is met. Used for computed jumps and switch statements.", "syntax": "bcctr BO, BI", "encoding": {"format": "XL-form", "binary_pattern": "19 | BO | BI | 000 | 528 | LK", "hex_opcode": "0x4C000420", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "BO", "clean": "BO"}, {"raw": "BI", "clean": "BI"}, {"raw": "000", "clean": "000"}, {"raw": "528", "clean": "528"}, {"raw": "LK", "clean": "LK"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BO", "desc": "Branch Options"}, {"name": "BI", "desc": "CR Bit Index"}], "pseudocode": "if (BO[0] = 0) then CTR ← CTR - 1; ctr_ok ← (BO[2] ∨ (CTR ≠ 0)); cond_ok ← (BO[4] ∨ (CR[BI] = BO[3])); if (ctr_ok ∧ cond_ok) then NIA ← CTR[0:61]; if (LK = 1) then LR ← CIA + 4;", "example": "bcctr 20, 0", "example_note": "Jump to address in CTR (bctr).", "extension": "Base", "description": "Conditionally branches to the address in the Count Register based on the Branch Options (BO) field and the state of the condition register bit selected by BI. The link register is optionally updated if LK=1. This instruction is commonly used for computed jumps and indirect branches in switch statements and virtual function calls.", "page_found": "Page 77", "special_registers": "CTR", "programming_notes": "When LK=1, the address of the next sequential instruction is placed in LR, making this a subroutine call. Use blr to return.\nCTR is decremented before the branch condition is tested; the branch is taken only if the combined CTR-and-condition test passes. Do not use this instruction inside a loop that also modifies CTR."}
{"mnemonic": "bpermd", "architecture": "PowerISA", "full_name": "Bit Permute Doubleword", "summary": "Permutes bits from RS based on the index values in RB. Highly optimized for bit shuffling.", "syntax": "bpermd RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 252 | /", "hex_opcode": "0x7C0001F8", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "252", "clean": "252"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register (Data)"}, {"name": "RB", "desc": "Permute Control Byte Selects"}], "pseudocode": "for i in 0 to 7 do; index ← RB[i*8+2:i*8+7]; if (index < 64) then RA[i] ← RS[index]; else RA[i] ← 0;", "example": "bpermd r3, r4, r5", "example_note": "Complex bit permutation.", "extension": "Base", "description": "Permutes the bits of RS according to bit indices specified in RB, placing the result in RA. Each byte of RB contains a 6-bit index (0-63) that selects which bit from RS to place at that bit position in RA. This is a Base-category scalar instruction with no CR or XER updates.", "programming_notes": "The fact that the permuted bit is 0 if the corresponding index value exceeds 63 permits the permuted bits to be selected from a 128-bit quantity, using a single index register.", "page_found": "Page 140 - 142"}
{"mnemonic": "cfuged", "architecture": "PowerISA", "full_name": "Centrifuge Doubleword", "summary": "Separates bits of the source register into two groups based on a mask (Power10 Scalar).", "syntax": "cfuged RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 68 | /", "hex_opcode": "0x7C0001B8", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "68", "clean": "68"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RB", "desc": "Mask"}], "extension": "Base", "description": "Centrifuges a 64-bit doubleword by separating bits according to a mask RB, moving masked bits to the low order of the result and unmasked bits to the high order (Power10 Scalar). The result is placed in RA. No CR, XER, or FPSCR fields are affected.", "pseudocode": "do_mask ← RB; result_low ← []; result_high ← []; j_low ← 0; j_high ← 0; for i in 0 to 63 do; if (do_mask[i] = 1) then result_low[j_low] ← RS[i]; j_low ← j_low + 1; else result_high[j_high] ← RS[i]; j_high ← j_high + 1; RA ← result_low || result_high;", "page_found": "Page 141", "programming_notes": "The cfuged instruction is useful for counting leading zeros in a doubleword value, but only considering the bits that are set to 1 in a mask. Ensure the mask register (RB) has bits set where you want to consider leading zeros in the source register (RS). The result is zero-extended to 64 bits before being stored in the destination register (RA). This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "cfuged r4, r3, r5"}
{"mnemonic": "pdepd", "architecture": "PowerISA", "full_name": "Parallel Bits Deposit Doubleword", "summary": "Deposits bits from RS to RA under control of mask RB (Scalar).", "syntax": "pdepd RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 196 | /", "hex_opcode": "0x7C000138", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "196", "clean": "196"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RB", "desc": "Mask"}], "extension": "Base", "description": "Deposits bits from RS into RA at positions specified by the mask RB (Power10 Scalar). Bits set to 1 in RB indicate positions where bits from RS are placed in RA; bits set to 0 in RB receive zeros. No CR, XER, or FPSCR fields are affected.", "pseudocode": "mask ← RB; result ← [0]*64; src_idx ← 0; for i in 0 to 63 do; if (mask[i] = 1) then result[i] ← RS[src_idx]; src_idx ← src_idx + 1; RA ← result;", "page_found": "Page 142", "programming_notes": "The pdepd instruction is useful for selectively depositing bits from one register into another based on a mask. Ensure that the source and destination registers are properly aligned to avoid unexpected behavior. This instruction operates at user privilege level, but care must be taken with the mask to prevent unintended data corruption.", "example": "pdepd r4, r3, r5"}
{"mnemonic": "pextd", "architecture": "PowerISA", "full_name": "Parallel Bits Extract Doubleword", "summary": "Extracts bits from a source register based on a mask and places them into the target register.", "syntax": "pextd RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 132 | /", "hex_opcode": "0x7C000178", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "132", "clean": "132"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RB", "desc": "Mask"}], "extension": "Base", "description": "The contents of the bits in register RS corresponding to bits in mask containing a 1 are packed into an n-bit value. The extracted value is placed into register RA.", "pseudocode": "result ← 0\nmask ← (RB)\nm ← 0\nk ← 0\ndo while (m < 64) \n    if ((RB)63-m == 1) then do\n        result63-k ← (RS)63-m\n        k ← k + 1\n    end\n    m ← m + 1\nend\nRA ← result", "page_found": "Page 141 - 142", "programming_notes": "The pextd instruction is useful for extracting and packing bits from a source register based on a mask. Ensure the mask register (RB) has bits set to 1 where you want to extract corresponding bits from the source register (RS). The operation is performed in little-endian order, so the least significant bit of the result corresponds to the first bit set in the mask. This instruction operates at user privilege level and does not generate exceptions for normal use cases.", "example": "pextd r4, r3, r5"}
{"mnemonic": "cntlzdm", "architecture": "PowerISA", "full_name": "Count Leading Zeros Doubleword under Mask", "summary": "Counts leading zeros in RS, but only considering bits set in mask RB.", "syntax": "cntlzdm RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 59 | /", "hex_opcode": "0x7C000076", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "59", "clean": "59"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RB", "desc": "Mask"}], "extension": "Base", "description": "Counts the number of leading zeros in RS considering only the bit positions set to 1 in the mask RB (Power10 Scalar). The count is placed in RA. No CR, XER, or FPSCR fields are affected.", "pseudocode": "mask ← RB; masked_value ← RS ∧ mask; if (masked_value = 0) then RA ← 64; else count ← 0; for i in 0 to 63 do; if (masked_value[i] = 1) then break; count ← count + 1; RA ← count;", "page_found": "Page 140", "programming_notes": "The cntlzdm instruction is useful for counting leading zeros in a doubleword while considering only the bits that are set to 1 in a mask. Ensure that both the source and mask registers are correctly aligned and that the mask register has at least one bit set to 1 to avoid undefined behavior. This instruction operates at user privilege level and does not generate exceptions under normal conditions, but it may incur performance penalties on processors without hardware support for this operation.", "example": "cntlzdm r4, r3, r5"}
{"mnemonic": "cnttzdm", "architecture": "PowerISA", "full_name": "Count Trailing Zeros Doubleword under Mask", "summary": "Counts trailing zeros in RS, but only considering bits set in mask RB.", "syntax": "cnttzdm RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 571 | /", "hex_opcode": "0x7C000476", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "571", "clean": "571"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RB", "desc": "Mask"}, {"name": "RT", "desc": "Target General Purpose Register"}], "extension": "Base", "special_registers": "CR0, XER", "page_found": "Page 1434 - 1435", "description": "Counts the number of trailing zeros in RS considering only the bit positions set to 1 in the mask RB (Power10 Scalar). The count is placed in RA. No CR, XER, or FPSCR fields are affected.", "pseudocode": "mask ← RB; masked_value ← RS ∧ mask; if (masked_value = 0) then RA ← 64; else count ← 0; for i in 63 downto 0 do; if (masked_value[i] = 1) then break; count ← count + 1; RA ← count;", "programming_notes": "The cnttzdm instruction is useful for counting trailing zeros in a doubleword while applying a mask. Ensure that the mask register (RB) has bits set to 1 where you want to consider the corresponding bits in the source register (RS). The result is zero-extended to 64 bits before being stored in the destination register (RA). This instruction operates at user privilege level and does not generate any exceptions under normal conditions. Performance may vary based on the distribution of zeros and ones in the registers.", "example": "cnttzdm r4, r3, r5"}
{"mnemonic": "crc32b", "architecture": "PowerISA", "full_name": "Cyclic Redundancy Check 32-bit Byte", "summary": "Accumulates a CRC32 checksum using the low byte of RS.", "syntax": "crc32b RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 0 | 522 | /", "hex_opcode": "0x7C00020A", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "522", "clean": "522"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target/Accumulator"}, {"name": "RS", "desc": "Data"}], "extension": "Base", "description": "Accumulates a 32-bit CRC checksum using the low byte (bits 56-63) of RS, with the running CRC value in RA. The updated CRC result is written to RA. This is a Base-category instruction with no CR, XER, or FPSCR updates.", "pseudocode": "byte_val ← RS[56:63]; crc ← RA ⊕ (byte_val || [0]*24); for i in 0 to 7 do; if (crc[31] = 1) then crc ← (crc << 1) ⊕ 0x04C11DB7; else crc ← crc << 1; crc ← crc ∧ 0xFFFFFFFF; RA ← crc;", "example": "crc32b r4, r3"}
{"mnemonic": "crc32h", "architecture": "PowerISA", "full_name": "Cyclic Redundancy Check 32-bit Halfword", "summary": "Accumulates a CRC32 checksum using the low halfword of RS.", "syntax": "crc32h RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 0 | 586 | /", "hex_opcode": "0x7C00024A", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "586", "clean": "586"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target/Accumulator"}, {"name": "RS", "desc": "Data"}], "extension": "Base", "description": "Accumulates a 32-bit CRC checksum using the low halfword (bits 48-63) of RS, with the running CRC value in RA. The updated CRC result is written to RA. This is a Base-category instruction with no CR, XER, or FPSCR updates.", "pseudocode": "halfword_val ← RS[48:63]; crc ← RA ⊕ (halfword_val || [0]*16); for i in 0 to 15 do; if (crc[31] = 1) then crc ← (crc << 1) ⊕ 0x04C11DB7; else crc ← crc << 1; crc ← crc ∧ 0xFFFFFFFF; RA ← crc;", "example": "crc32h r4, r3"}
{"mnemonic": "crc32w", "architecture": "PowerISA", "full_name": "Cyclic Redundancy Check 32-bit Word", "summary": "Accumulates a CRC32 checksum using the word in RS.", "syntax": "crc32w RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 0 | 650 | /", "hex_opcode": "0x7C00028A", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "650", "clean": "650"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target/Accumulator"}, {"name": "RS", "desc": "Data"}], "extension": "Base", "description": "Accumulates a CRC32 checksum by processing the 32-bit word in RS using the Castagnoli polynomial. The result is XORed with the accumulator in RA and stored back to RA. This instruction is part of the Base extension and does not affect condition registers or status fields.", "pseudocode": "RA ← CRC32(RA, RS[32:63])", "example": "crc32w r4, r3"}
{"mnemonic": "crc32d", "architecture": "PowerISA", "full_name": "Cyclic Redundancy Check 32-bit Doubleword", "summary": "Accumulates a CRC32 checksum using the doubleword in RS.", "syntax": "crc32d RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 0 | 714 | /", "hex_opcode": "0x7C0002CA", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "714", "clean": "714"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target/Accumulator"}, {"name": "RS", "desc": "Data"}], "extension": "Base", "description": "Accumulates a CRC32 checksum by processing the 64-bit doubleword in RS using the Castagnoli polynomial. The result is XORed with the accumulator in RA and stored back to RA. This instruction is part of the Base extension and does not affect condition registers or status fields.", "pseudocode": "RA ← CRC32(RA, RS[0:63])", "example": "crc32d r4, r3"}
{"mnemonic": "pli", "architecture": "PowerISA", "full_name": "Prefixed Load Immediate", "summary": "Loads a 34-bit signed immediate into a register. (Replaces multiple 'lis/ori' instructions).", "syntax": "pli RT, SI34", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 14 | RT | 0 | D1", "hex_opcode": "0x0400000038000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "0", "clean": "0"}, {"raw": "...", "clean": "..."}, {"raw": "14", "clean": "14"}, {"raw": "RT", "clean": "RT"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "SI34", "desc": "Immediate"}], "extension": "Prefixed", "description": "Loads a 34-bit signed immediate value into GPR RT, replacing the need for multiple lis/ori instructions. This is a prefixed instruction (2 words / 64 bits total) where the prefix encodes bits 0-17 and the main instruction encodes bits 18-33 of the immediate. No condition registers or status fields are affected.", "pseudocode": "RA ← SI34 (sign-extended to 64 bits)", "page_found": "Page 109", "programming_notes": "The pli instruction is used to load an immediate value directly into a target register. This is useful for initializing registers with constants or small values. Ensure the immediate value fits within the 16-bit signed integer range to avoid overflow issues.", "example": "pli r3, 16"}
{"mnemonic": "xxpermx", "architecture": "PowerISA", "full_name": "VSX Vector Permute Extended", "summary": "Permutes bytes from two source vectors using a control vector and a 3-bit selector.", "syntax": "xxpermx XT, XA, XB, XC, UIM", "encoding": {"format": "XX4-form", "binary_pattern": "1 | 8 | 0 | / | 60 | XT | XA | XB | XC | UIM", "hex_opcode": "0x0500000088000000", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "XC", "clean": "XC"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:8 | 9 | 10:31 | 32:37 | 38:42 | 43:47 | 48:52 | 53:57 | 58:63"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "XC", "desc": "Control"}, {"name": "UIM", "desc": "Selector"}, {"name": "VX1", "desc": "Target Vector Register"}, {"name": "VX2", "desc": "Source Vector Register"}, {"name": "VX3", "desc": "Source Vector Register"}], "extension": "VSX", "description": "Permutes bytes from source vectors XA and XB using byte indices in XC, with a 3-bit UIM field selecting between different permutation modes. The permutation control bytes in XC determine which source byte maps to each position in XT. This VSX instruction does not affect condition registers or status fields.", "pseudocode": "for i in 0 to 15:\n  idx ← (XC[8*i:8*i+7] & 0x1F) | (UIM << 5)\n  if idx < 16:\n    XT[8*i:8*i+7] ← XA[8*idx:8*idx+7]\n  else:\n    XT[8*i:8*i+7] ← XB[8*(idx-16):8*(idx-16)+7]", "programming_notes": "The following is an example of emulating 256-bit xxperm, where a 256-bit vector is contained in a pair of VSRs. The instruction is capable of emulating up to a 2048-bit xxperm.", "page_found": "Page 959 - 960", "special_registers": "MSR", "example": "xxpermx vs1, vs2, vs3, vs4, uim"}
{"mnemonic": "xxblendvb", "architecture": "PowerISA", "full_name": "VSX Vector Blend Variable Byte", "summary": "Selects bytes from XA or XB based on the MSB of bytes in XC.", "syntax": "xxblendvb XT, XA, XB, XC", "encoding": {"format": "XX4-form", "binary_pattern": "60 | XT | XA | XB | XC | 33", "hex_opcode": "0x0500000084000000", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "XC", "clean": "XC"}, {"raw": "33", "clean": "33"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "XC", "desc": "Control"}], "extension": "VSX", "description": "For xxblendvb, the contents of VSR[XT] are determined by the contents of VSR[XC]. If bit 0 of byte element i in VSR[XC] is 0, then byte element i of VSR[XT] is taken from VSR[XA]; otherwise, it is taken from VSR[XB].", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\ndo i = 0 to 15\n    if VSR[32×CX+C].byte[i].bit[0]=0 then\n        VSR[32×TX+T].byte[i] ←VSR[32*AX+A].byte[i]\n    else\n        VSR[32×TX+T].byte[i] ←VSR[32*BX+B].byte[i]\nend", "page_found": "Page 947 - 948", "special_registers": "MSR", "programming_notes": "The xxblendvb instruction blends bytes from two source vectors based on a control vector. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid an exception. The instruction operates on 16-byte vectors, and each byte is independently selected from either of the two source vectors based on the corresponding bit in the control vector. This instruction is useful for conditional data merging but requires careful handling of the control vector to achieve the desired result.", "example": "xxblendvb vs1, vs2, vs3, vs4"}
{"mnemonic": "xxblendvh", "architecture": "PowerISA", "full_name": "VSX Vector Blend Variable Halfword", "summary": "Selects halfwords from XA or XB based on the MSB of halfwords in XC.", "syntax": "xxblendvh XT, XA, XB, XC", "encoding": {"format": "XX4-form", "binary_pattern": "60 | XT | XA | XB | XC | 34", "hex_opcode": "0x0500000084000010", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "XC", "clean": "XC"}, {"raw": "34", "clean": "34"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "XC", "desc": "Control"}, {"name": "VRT", "desc": "Target VSX Register"}, {"name": "VRA", "desc": "Source VSX Register"}, {"name": "VRB", "desc": "Source VSX Register"}], "extension": "VSX", "description": "For xxblendvh, the contents of each halfword in the target vector are selected from either the first or second source vector based on the corresponding bit in the control vector.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\ndo i = 0 to 7\n    if VSR[32×CX+C].hword[i].bit[0]=0 then\n        VSR[32×TX+T].hword[i] ←VSR[32×AX+A].hword[i]\n    else\n        VSR[32×TX+T].hword[i] ←VSR[32×BX+B].hword[i]\nend", "page_found": "Page 948 - 949", "special_registers": "MSR", "programming_notes": "Ensure VSX is enabled by checking and setting the appropriate bit in the MSR register. This instruction blends halfwords from two source vectors into a target vector based on a control vector's bits. Be cautious of alignment requirements for vector registers to avoid undefined behavior.", "example": "xxblendvh vs1, vs2, vs3, vs4"}
{"mnemonic": "xxblendvw", "architecture": "PowerISA", "full_name": "VSX Vector Blend Variable Word", "summary": "Selects words from XA or XB based on the MSB of words in XC.", "syntax": "xxblendvw XT, XA, XB, XC", "encoding": {"format": "XX4-form", "binary_pattern": "60 | XT | XA | XB | XC | 35", "hex_opcode": "0x0500000084000020", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "XC", "clean": "XC"}, {"raw": "35", "clean": "35"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "XC", "desc": "Control"}], "extension": "VSX", "description": "Selects whole words from XA or XB based on the MSB of the corresponding word in control register XC. If the MSB of a word in XC is 1, the word from XB is selected; otherwise the word from XA is selected. This VSX instruction does not affect condition registers or status fields.", "pseudocode": "for i in 0 to 3:\n  if XC[32*i] == 1:\n    XT[32*i:32*i+31] ← XB[32*i:32*i+31]\n  else:\n    XT[32*i:32*i+31] ← XA[32*i:32*i+31]", "page_found": "Page 949", "special_registers": "MSR", "programming_notes": "The xxblendvw instruction is commonly used for conditional blending of word elements from two source vectors based on a control vector. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. This instruction operates on 16-word elements, so alignment and ordering of input registers must be correct to prevent data corruption or incorrect results.", "example": "xxblendvw vs1, vs2, vs3, vs4"}
{"mnemonic": "xxblendvd", "architecture": "PowerISA", "full_name": "VSX Vector Blend Variable Doubleword", "summary": "Selects doublewords from XA or XB based on the MSB of doublewords in XC.", "syntax": "xxblendvd XT, XA, XB, XC", "encoding": {"format": "XX4-form", "binary_pattern": "60 | XT | XA | XB | XC | 36", "hex_opcode": "0x0500000084000030", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "XC", "clean": "XC"}, {"raw": "36", "clean": "36"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "XC", "desc": "Control"}, {"name": "VRT", "desc": "Target VSX Register"}, {"name": "VRA", "desc": "Source VSX Register"}, {"name": "VRB", "desc": "Source VSX Register"}], "extension": "VSX", "page_found": "Page 1380 - 1381", "description": "Selects whole doublewords from XA or XB based on the MSB of the corresponding doubleword in control register XC. If the MSB of a doubleword in XC is 1, the doubleword from XB is selected; otherwise the doubleword from XA is selected. This VSX instruction does not affect condition registers or status fields.", "programming_notes": "The xxblendvd instruction is useful for selectively blending elements from two source vectors (A and B) into a destination vector based on control bits derived from a third vector (C). Ensure that all input vectors are properly aligned to avoid alignment faults. This instruction operates at the user privilege level and may raise exceptions if the immediate field value exceeds valid range or if there are invalid operand types.", "pseudocode": "for i in 0 to 1:\n  if XC[64*i] == 1:\n    XT[64*i:64*i+63] ← XB[64*i:64*i+63]\n  else:\n    XT[64*i:64*i+63] ← XA[64*i:64*i+63]", "example": "xxblendvd vs1, vs2, vs3, vs4"}
{"mnemonic": "lxvwsx", "architecture": "PowerISA", "full_name": "Load VSX Vector Word and Splat Indexed", "summary": "Loads a 32-bit word and replicates it across the vector.", "syntax": "lxvwsx XT, RA, RB", "encoding": {"format": "XX1-form", "binary_pattern": "31 | XT | RA | RB | 364", "hex_opcode": "0x7C0002D8", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "364", "clean": "364"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "VSX", "description": "Loads a 32-bit word from memory at address RA + RB, then replicates it across all four 32-bit word positions in the target VSX register XT. This VSX instruction does not affect condition registers or status fields.", "pseudocode": "EA ← RA + RB\nword ← [EA:EA+3]\nfor i in 0 to 3:\n  XT[32*i:32*i+31] ← word", "page_found": "Page 619", "special_registers": "MSR", "programming_notes": "The lxvwsx instruction is commonly used for loading a word from memory and replicating it across all elements of a VSX vector register. Ensure that the appropriate privilege levels (MSR.VSX or MSR.VEC) are enabled to avoid exceptions. The instruction requires 4-byte alignment for the memory address; unaligned accesses may result in performance penalties or exceptions depending on the system configuration.", "example": "lxvwsx vs1, r4, r5"}
{"mnemonic": "mtvsrws", "architecture": "PowerISA", "full_name": "Move To VSR Word and Splat", "summary": "Moves a 32-bit word from a GPR and replicates it across the vector.", "syntax": "mtvsrws XT, RA", "encoding": {"format": "XX1-form", "binary_pattern": "31 | XT | RA | 0 | 243", "hex_opcode": "0x7C000326", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "243", "clean": "243"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "RA", "desc": "Source GPR"}], "extension": "VSX", "description": "Moves the low 32 bits from GPR RA into a VSX register, then replicates that 32-bit word across all four 32-bit word positions in XT. This VSX instruction does not affect condition registers or status fields.", "pseudocode": "word ← RA[32:63]\nfor i in 0 to 3:\n  XT[32*i:32*i+31] ← word", "page_found": "Page 161", "special_registers": "MSR", "programming_notes": "The mtvsrws instruction is used to move the upper 32 bits of a general-purpose register into the first word element of a vector-scalar register and splat it across the remaining elements. Ensure that the VSX or Vector facility is enabled in the MSR before using this instruction, otherwise, an exception will be raised. This instruction treats the operation as a Vector instruction, so developers should consider resource availability accordingly.", "example": "mtvsrws vs1, r4"}
{"mnemonic": "xsmaxcdp", "architecture": "PowerISA", "full_name": "VSX Scalar Maximum Type-C Double-Precision", "summary": "Computes the maximum of two double-precision floating-point values and stores the result in a vector scalar register.", "syntax": "xsmaxcdp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 152", "hex_opcode": "0xF0000400", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "152", "clean": "152"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Computes the maximum of two double-precision floating-point scalar values and stores the result in the target VSR. The operation follows the IEEE 754 maximum semantics where positive zero is greater than negative zero, and any comparison with NaN returns NaN. This instruction is part of the VSX category and does not set CR or XER flags.", "pseudocode": "XT_dp ← maxc_dp(XA_dp, XB_dp)", "special_registers": "FPSCR (FX, VXSNAN)", "programming_notes": "xsmaxcdp can be used to implement the C/C++/Java conditional operation (x>y)?x:y for single-precision and double-precision arguments. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 790 - 791", "example": "xsmaxcdp vs1, vs2, vs3"}
{"mnemonic": "xsmincdp", "architecture": "PowerISA", "full_name": "VSX Scalar Minimum Type-C Double-Precision", "summary": "Computes the minimum of two double-precision floating-point numbers and handles NaNs according to Type-C rules.", "syntax": "xsmincdp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 153", "hex_opcode": "0xF0000440", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "153", "clean": "153"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "If either src1 or src2 is a NaN, result is src2. Otherwise, if src1 is less than src2, result is src1. Otherwise, result is src2. The contents of doubleword 0 of VSR[XT] are set to the value result. The contents of doubleword 1 of VSR[XT] are set to 0.", "pseudocode": "if 'xsmincdp' then\n    src1 <- VSR[XA]\n    src2 <- VSR[XB]\n    if src2 is QNaN or SNaN then\n        fx(VXSNAN)\n    else if src2 is -Infinity then\n        T(src2) <- src2\n    else if src2 is +Zero then\n        T(src2) <- src2\n    else if src2 is +NZF then\n        T(src2) <- M(src1, src2)\n    else if src2 is +Infinity then\n        T(src2) <- src2\n    VSR[XT] <- T(src2)", "special_registers": "FPSCR (FX, VXSNAN)", "programming_notes": "xsmincdp can be used to implement the C/C++/Java conditional operator (x<y)?x:y for single-precision and double-precision arguments. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 798 - 799", "example": "xsmincdp vs1, vs2, vs3"}
{"mnemonic": "xsmaxjdp", "architecture": "PowerISA", "full_name": "Vector Scalar Maximum of Double-Precision Floating-Point Values with Java Rounding", "summary": "Compares two double-precision floating-point values and returns the larger one, with specific handling for zero and NaN values.", "syntax": "xsmaxjdp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "18 | T | A | B | 144 | AX | BX | TX", "hex_opcode": "0xF0000480", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "160", "clean": "160"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Computes the maximum of two double-precision floating-point scalar values using Java-compliant semantics, where -0.0 is greater than +0.0, and NaN handling follows Java rules. The result is stored in the target VSR. This instruction is part of the VSX category and does not update CR or XER.", "pseudocode": "XT_dp ← maxj_dp(XA_dp, XB_dp)", "special_registers": "FPSCR (FX, VXSNAN)", "programming_notes": "xsmaxjdp can be used to implement the Java max() function for single-precision and double-precision arguments. Despite Java not recognizing the concept of exception status, VXSNAN is set to 1 if either operand is an SNaN.", "page_found": "Page 796 - 797", "example": "xsmaxjdp vs1, vs2, vs3"}
{"mnemonic": "xsminjdp", "architecture": "PowerISA", "full_name": "Vector Scalar Minimum of Double-Precision Floating-Point Values", "summary": "Compares two double-precision floating-point values and selects the minimum value, handling special cases like NaNs and zeros.", "syntax": "xsminjdp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "111100 | XA | XB | XT | 000000 | 010001101000", "hex_opcode": "0xF00004C0", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "168", "clean": "168"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Computes the minimum of two double-precision floating-point scalar values using Java-compliant semantics, where +0.0 is less than -0.0, and NaN handling follows Java rules. The result is stored in the target VSR. This instruction is part of the VSX category and does not update CR or XER.", "pseudocode": "XT_dp ← minj_dp(XA_dp, XB_dp)", "special_registers": "FPSCR (FX, VXSNAN)", "programming_notes": "xsminjdp can be used to implement the Java min() function for single-precision and double-precision arguments. Java only recognizes the concept of a NaN, but does not distinguish any difference between different NaN encodings, including between a QNaN and a SNaN. As a result, a SNaN operand is propagated as a SNaN (i.e., not converted to a QNaN). Despite Java not recognizing the concept of exception status, VXSNAN is set to 1 if either operand is a SNaN. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 804 - 805", "example": "xsminjdp vs1, vs2, vs3"}
{"mnemonic": "xxgenpcvbm", "architecture": "PowerISA", "full_name": "VSX Vector Generate Permute Control Vector from Byte Mask", "summary": "Generates a permute control vector based on the byte mask in VSR[VRB+32].", "syntax": "xxgenpcvbm XT, XB, IMM", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | IMM | XB | 916", "hex_opcode": "0xF0000728", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "IMM", "clean": "IMM"}, {"raw": "XB", "clean": "XB"}, {"raw": "916", "clean": "916"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}, {"name": "IMM", "desc": "Mask"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "vPCV", "desc": "Target Vector Register"}, {"name": "vMASK", "desc": "Source Vector Register containing the mask byte"}, {"name": "IMM8", "desc": "Immediate value specifying the control vector type"}], "extension": "VSX", "description": "Generates a permute control vector in XT based on a byte mask contained in XB and an immediate value that specifies the control vector type. The instruction uses the byte mask to determine which bytes are selected for permutation operations. This VSX instruction sets no CR or XER flags.", "pseudocode": "XT ← GeneratePermuteControl(XB, IMM)", "page_found": "Page 961 - 962", "special_registers": "MSR", "programming_notes": "The xxgenpcvbm instruction is used to generate a permute control vector based on a byte mask. Ensure the VSX facility is enabled by checking and setting the MSR.VSX bit. The operation mode (expansion or compression) and endianness (big or little) are determined by the IMM field. Be cautious with alignment as VSR registers must be properly aligned for operations.", "example": "xxgenpcvbm vs1, vs3, 1"}
{"mnemonic": "xxgenpcvhm", "architecture": "PowerISA", "full_name": "VSX Generate PCV from Halfword Mask", "summary": "Generates a permute control vector (PCV) based on the halfword mask in VSR[VRB+32].", "syntax": "xxgenpcvhm XT, XB, IMM", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | IMM | XB | 917", "hex_opcode": "0xF000072A", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "IMM", "clean": "IMM"}, {"raw": "XB", "clean": "XB"}, {"raw": "917", "clean": "917"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}, {"name": "IMM", "desc": "Mask"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VSX", "description": "The instruction generates a permute control vector (PCV) based on the halfword mask in VSR[VRB+32] and stores it in VSR[XT]. The operation depends on the value of IMM.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nif IMM=0b00000 then do  // Big-Endian expansion\n    j ←0\n    do i = 0 to 7\n        if VSR[VRB+32].hword[i].bit[0]=1 then do\n            VSR[XT].hword[i].byte[0] ←2×j + 0x00\n            VSR[XT].hword[i].byte[1] ←2×j + 0x01\n            j ←j + 1\n        end else do\n            VSR[XT].hword[i].byte[0] ←2×i + 0x10\n            VSR[XT].hword[i].byte[1] ←2×i + 0x11\n        end\n    end\nend else if IMM=0b00001 then do  // Big-Endian compression\n    j ←0\n    do i = 0 to 7\n        if VSR[VRB+32].hword[i].bit[0]=1 then do\n            VSR[XT].hword[j].byte[0] ←2×i + 0x00\n            VSR[XT].hword[j].byte[1] ←2×i + 0x01\n            j ←j + 1\n        end\n    end\n    do i = j to 7\n        VSR[XT].hword[i] ←0xUUUU\n    end\nend else if IMM=0b00010 then do  // Little-Endian expansion\n    j ←0\n    do i = 0 to 7\n        if VSR[VRB+32].hword[7-i].bit[0]=1 then do\n            VSR[XT].hword[7-i].byte[1] ←2×j + 0x00\n            VSR[XT].hword[7-i].byte[0] ←2×j + 0x01\n            j ←j + 1\n        end else do\n            VSR[XT].hword[7-i].byte[1] ←2×i + 0x10\n            VSR[XT].hword[7-i].byte[0] ←2×i + 0x11\n        end\n    end\nend else if IMM=0b00011 then do  // Little-Endian compression\n    j ←0\n    do i = 0 to 7\n        if VSR[VRB+32].hword[7-i].bit[0]=1 then do\n            VSR[XT].hword[7-j].byte[1] ←2×i + 0x00\n            VSR[XT].hword[7-j].byte[0] ←2×i + 0x01\n            j ←j + 1\n        end\n    end\n    do i = j to 7\n        VSR[XT].hword[7-i] ←0xUUUU\n    end\nend", "page_found": "Page 966 - 967", "special_registers": "MSR", "programming_notes": "This instruction is used for generating permute control vectors based on a halfword mask. Ensure that the VSX facility is enabled in the MSR register to avoid an exception. The operation mode (expansion or compression) and byte order (big-endian or little-endian) are determined by the IMM field. Be cautious with alignment as it affects how the data is interpreted within the vector registers.", "example": "xxgenpcvhm vs1, vs3, 1"}
{"mnemonic": "xxgenpcvwm", "architecture": "PowerISA", "full_name": "VSX Generate PCV from Word Mask", "summary": "Generates a permute control vector (PCV) based on the word mask in VSR[VRB+32] and stores it in VSR[XT].", "syntax": "xxgenpcvwm XT, XB, IMM", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | IMM | XB | 948", "hex_opcode": "0xF0000768", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "IMM", "clean": "IMM"}, {"raw": "XB", "clean": "XB"}, {"raw": "948", "clean": "948"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}, {"name": "IMM", "desc": "Mask"}, {"name": "VRB", "desc": "Source Vector-Specific Register"}], "extension": "VSX", "description": "The instruction generates a permute control vector (PCV) based on the word mask in VSR[VRB+32] and stores it in VSR[XT]. The PCV is used to enable a left-indexed or right-indexed permute operation.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nLet TX be the value 32×TX + T.\n\nif IMM=0b00000 then do  // Big-Endian expansion\n    j ←0\n    do i = 0 to 3\n        if VSR[VRB+32].word[i].bit[0]=1 then do\n            VSR[XT].word[i].byte[0] ←4×j + 0x00\n            VSR[XT].word[i].byte[1] ←4×j + 0x01\n            VSR[XT].word[i].byte[2] ←4×j + 0x02\n            VSR[XT].word[i].byte[3] ←4×j + 0x03\n            j = j + 1\n        end\n        else do\n            VSR[XT].word[i].byte[0] ←4×i + 0x10\n            VSR[XT].word[i].byte[1] ←4×i + 0x11\n            VSR[XT].word[i].byte[2] ←4×i + 0x12\n            VSR[XT].word[i].byte[3] ←4×i + 0x13\n        end\n    end\nend\nelse if IMM=0b00001 then do  // Big-Endian compression\n    j ←0\n    do i = 0 to 3\n        if VSR[VRB+32].word[i].bit[0]=1 then do\n            VSR[XT].word[j].byte[1] ←4×i + 0x01\n            VSR[XT].word[j].byte[2] ←4×i + 0x02\n            VSR[XT].word[j].byte[3] ←4×i + 0x03\n            j ←j + 1\n        end\n    end\n    do i = j to 3\n        VSR[XT].word[i] ←0xUUUU_UUUU\n    end\nend\nelse if IMM=0b00010 then do  // Little-Endian expansion\n    j ←0\n    do i = 0 to 3\n        if VSR[VRB+32].word[3-i].bit[0]=1 then do\n            VSR[XT].word[3-i].byte[3] ←4×j + 0x00\n            VSR[XT].word[3-i].byte[2] ←4×j + 0x01\n            VSR[XT].word[3-i].byte[1] ←4×j + 0x02\n            VSR[XT].word[3-i].byte[0] ←4×j + 0x03\n            j ←j + 1\n        end\n        else do\n            VSR[XT].word[3-i].byte[3] ←4×i + 0x10\n            VSR[XT].word[3-i].byte[2] ←4×i + 0x11\n            VSR[XT].word[3-i].byte[1] ←4×i + 0x12\n            VSR[XT].word[3-i].byte[0] ←4×i + 0x13\n        end\n    end\nend\nelse if IMM=0b00011 then do  // Little-Endian compression\n    j ←0\n    do i = 0 to 3\n        if VSR[VRB+32].word[3-i].bit[0]=1 then do\n            VSR[XT].word[3-j].byte[3] ←4×i + 0x00\n            VSR[XT].word[3-j].byte[2] ←4×i + 0x01\n            VSR[XT].word[3-j].byte[1] ←4×i + 0x02\n            VSR[XT].word[3-j].byte[0] ←4×i + 0x03\n            j ←j + 1\n        end\n    end\n    do i = j to 3\n        VSR[XT].word[3-i] ←0xUUUU_UUUU\n    end\nend", "programming_notes": "The instruction generates a permute control vector (PCV) based on the word mask in VSR[VRB+32] and stores it in VSR[XT]. The PCV is used to enable a left-indexed or right-indexed permute operation.", "page_found": "Page 968 - 969", "special_registers": "MSR", "example": "xxgenpcvwm vs1, vs3, 1"}
{"mnemonic": "xxgenpcvdm", "architecture": "PowerISA", "full_name": "VSX Generate PCV from Doubleword Mask", "summary": "Generates a permute control vector (PCV) based on the doubleword mask in VSR[VRB+32] and stores it in VSR[XT].", "syntax": "xxgenpcvdm XT, XB, IMM", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | IMM | XB | 949", "hex_opcode": "0xF000076A", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "IMM", "clean": "IMM"}, {"raw": "XB", "clean": "XB"}, {"raw": "949", "clean": "949"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}, {"name": "IMM", "desc": "Mask"}, {"name": "VRB", "desc": "Source Vector-Specific Register"}], "extension": "VSX", "description": "The instruction generates a permute control vector (PCV) based on the doubleword mask in VSR[VRB+32] and stores it in VSR[XT]. The operation depends on the value of IMM.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nXT ←32×TX+T\nif IMM=0b00000 then do  // Big-Endian expansion\n   j ←0\ndo i = 0 to 1\n   if VSR[VRB+32].dword[i].bit[0]=1 then do\n      VSR[XT].dword[i].byte[0] ←8×j + 0x00\n      VSR[XT].dword[i].byte[1] ←8×j + 0x01\n      VSR[XT].dword[i].byte[2] ←8×j + 0x02\n      VSR[XT].dword[i].byte[3] ←8×j + 0x03\n      VSR[XT].dword[i].byte[4] ←8×j + 0x04\n      VSR[XT].dword[i].byte[5] ←8×j + 0x05\n      VSR[XT].dword[i].byte[6] ←8×j + 0x06\n      VSR[XT].dword[i].byte[7] ←8×j + 0x07\n      j ←j + 1\n   end\n   else do\n      VSR[XT].dword[i].byte[0] ←8×i + 0x10\n      VSR[XT].dword[i].byte[1] ←8×i + 0x11\n      VSR[XT].dword[i].byte[2] ←8×i + 0x12\n      VSR[XT].dword[i].byte[3] ←8×i + 0x13\n      VSR[XT].dword[i].byte[4] ←8×i + 0x14\n      VSR[XT].dword[i].byte[5] ←8×i + 0x15\n      VSR[XT].dword[i].byte[6] ←8×i + 0x16\n      VSR[XT].dword[i].byte[7] ←8×i + 0x17\n   end\nend\ndo i = j to 1\n   VSR[XT].dword[i] ←0xUUUU_UUUU_UUUU_UUUU\nend\nelse if IMM=0b00001 then do  // Big-Endian compression\n   j ←0\ndo i = 0 to 1\n   if VSR[VRB+32].dword[i].bit[0]=1 then do\n      VSR[XT].dword[j].byte[0] ←8×i + 0x00\n      VSR[XT].dword[j].byte[1] ←8×i + 0x01\n      VSR[XT].dword[j].byte[2] ←8×i + 0x02\n      VSR[XT].dword[j].byte[3] ←8×i + 0x03\n      VSR[XT].dword[j].byte[4] ←8×i + 0x04\n      VSR[XT].dword[j].byte[5] ←8×i + 0x05\n      VSR[XT].dword[j].byte[6] ←8×i + 0x06\n      VSR[XT].dword[j].byte[7] ←8×i + 0x07\n   end\n   j ←j + 1\nend\ndo i = j to 1\n   VSR[XT].dword[i] ←0xUUUU_UUUU_UUUU_UUUU\nend\nelse if IMM=0b00010 then do  // Little-Endian expansion\n   j ←0\ndo i = 0 to 1\n   if VSR[VRB+32].dword[1-i].bit[0]=1 then do\n      VSR[XT].dword[1-i].byte[7] ←8×j + 0x00\n      VSR[XT].dword[1-i].byte[6] ←8×j + 0x01\n      VSR[XT].dword[1-i].byte[5] ←8×j + 0x02\n      VSR[XT].dword[1-i].byte[4] ←8×j + 0x03\n      VSR[XT].dword[1-i].byte[3] ←8×j + 0x04\n      VSR[XT].dword[1-i].byte[2] ←8×j + 0x05\n      VSR[XT].dword[1-i].byte[1] ←8×j + 0x06\n      VSR[XT].dword[1-i].byte[0] ←8×j + 0x07\n   end\n   j ←j + 1\nend\ndo i = j to 1\n   VSR[XT].dword[i] ←0xUUUU_UUUU_UUUU_UUUU\nend\nelse if IMM=0b00011 then do  // Little-Endian compression\n   j ←0\ndo i = 0 to 1\n   if VSR[VRB+32].dword[1-i].bit[0]=1 then do\n      VSR[XT].dword[1-j].byte[7] ←8×i + 0x00\n      VSR[XT].dword[1-j].byte[6] ←8×i + 0x01\n      VSR[XT].dword[1-j].byte[5] ←8×i + 0x02\n      VSR[XT].dword[1-j].byte[4] ←8×i + 0x03\n      VSR[XT].dword[1-j].byte[3] ←8×i + 0x04\n      VSR[XT].dword[1-j].byte[2] ←8×i + 0x05\n      VSR[XT].dword[1-j].byte[1] ←8×i + 0x06\n      VSR[XT].dword[1-j].byte[0] ←8×i + 0x07\n   end\n   j ←j + 1\nend\ndo i = j to 1\n   VSR[XT].dword[i] ←0xUUUU_UUUU_UUUU_UUUU\nend\nend", "page_found": "Page 963 - 964", "special_registers": "MSR", "programming_notes": "This instruction is used to generate a permute control vector (PCV) based on a doubleword mask. Ensure that the VSX facility is enabled in the MSR register before using this instruction. The operation mode (expansion or compression) is determined by the IMM field. Be cautious with alignment and ensure that the input and output vectors are correctly set up to avoid undefined behavior.", "example": "xxgenpcvdm vs1, vs3, 1"}
{"mnemonic": "vclzlsbb", "architecture": "PowerISA", "full_name": "Vector Count Leading Zero Least Significant Bits Byte", "summary": "Counts the number of contiguous leading byte elements in VSR[VRB+32] having a zero least-significant bit.", "syntax": "vclzlsbb RA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | RT | 0 | VRB | 1538", "hex_opcode": "0x10000602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1541", "clean": "1541"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target GPR"}, {"name": "vB", "desc": "Source"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VSRC", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The instruction counts the number of contiguous leading byte elements in VSR[VRB+32] that have a zero least-significant bit and places the count into GPR[RT].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ncount ←0\ndo while count < 16\n    if VSR[VRB+32].byte[count].bit[7]=1 then\n        break\n    count ←count + 1\nend\nGPR[RT] ←EXTZ64(count)", "page_found": "Page 476 - 477", "special_registers": "MSR", "programming_notes": "This instruction is useful for counting leading zero least significant bits in a vector register. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. The operation processes 16 bytes, and the result is stored in a general-purpose register. Be cautious of alignment requirements when accessing vector registers.", "example": "vclzlsbb r4, vb"}
{"mnemonic": "vctzlsbb", "architecture": "PowerISA", "full_name": "Vector Count Trailing Zero Least Significant Bits Byte", "summary": "Counts the number of trailing zero bits in each byte element of a vector.", "syntax": "vctzlsbb RA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | RA | 0 | vB | 1543", "hex_opcode": "0x10010602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1543", "clean": "1543"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target GPR"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "pseudocode": "RA ← count_trailing_zeros_lsb_byte(vB[0:7])", "page_found": "Page 1477 - 1478", "description": "Counts the number of trailing zero bits in each byte of the source vector and stores the scalar result (the count from the least-significant byte) in a GPR. This VMX instruction updates CR6 based on the result to indicate whether all bytes contain zero or not.", "programming_notes": "Use vctzlsbb to efficiently count the number of contiguous trailing zero bytes with a zero least-significant bit. Ensure that the input vector is properly aligned and that you have the necessary privileges to execute this instruction. The result is stored in a general-purpose register, so be mindful of register usage and dependencies.", "example": "vctzlsbb r4, vb"}
{"mnemonic": "vstril", "architecture": "PowerISA", "full_name": "Vector String Isolate Left", "summary": "Isolates the leftmost element that matches the condition.", "syntax": "vstril vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1607", "hex_opcode": "0x10000647", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1607", "clean": "1607"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Searches the source vector vB from left to right for the first null byte (0x00) and isolates it, placing the result in vD with all bytes after the found null set to zero. Updates CR6 to indicate whether a null byte was found. This VMX instruction operates on byte elements.", "pseudocode": "vD ← isolate_left_null_byte(vB); CR6 ← null_byte_found_flag", "example": "vstril vd, vb"}
{"mnemonic": "vstrir", "architecture": "PowerISA", "full_name": "Vector String Isolate Right", "summary": "Isolates the rightmost element that matches the condition.", "syntax": "vstrir vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1671", "hex_opcode": "0x10000687", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1671", "clean": "1671"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Searches the source vector vB from right to left for the first null byte (0x00) and isolates it, placing the result in vD with all bytes before the found null set to zero. Updates CR6 to indicate whether a null byte was found. This VMX instruction operates on byte elements.", "pseudocode": "vD ← isolate_right_null_byte(vB); CR6 ← null_byte_found_flag", "example": "vstrir vd, vb"}
{"mnemonic": "xxsplti32dx", "architecture": "PowerISA", "full_name": "VSX Vector Splat Immediate 32-bit Double Index", "summary": "Splats a 32-bit immediate into a doubleword index.", "syntax": "xxsplti32dx XT, IX, IMM", "encoding": {"format": "8RR:D-form", "binary_pattern": "60 | XT | IX | IMM", "hex_opcode": "0x0500000080000000", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "IX", "clean": "IX"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:10 | 11:20 | 21:63"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "IX", "desc": "Index"}, {"name": "IMM", "desc": "Value"}], "extension": "VSX", "page_found": "Page 1357 - 1358", "description": "Splats a sign-extended 32-bit immediate value into the doubleword at index IX within VSR XT. IX selects either the upper (0) or lower (1) doubleword; the 32-bit immediate is sign-extended to 64 bits and replicated. This is a VSX instruction that does not update condition flags.", "pseudocode": "imm64 ← SignExtend(IMM, 32)\nif IX = 0 then\n  XT[0:63] ← imm64\nelse\n  XT[64:127] ← imm64", "programming_notes": "Use xxsplti32dx to initialize a VSX vector with a repeated 32-bit immediate value. Ensure the immediate value fits within 32 bits; otherwise, it will be truncated. This instruction is available in all privilege levels and does not raise exceptions for valid inputs.", "example": "xxsplti32dx vs1, 0, 1"}
{"mnemonic": "xxspltib", "architecture": "PowerISA", "full_name": "VSX Vector Splat Immediate Byte", "summary": "Copies an immediate byte value into each byte element of a vector register.", "syntax": "xxspltib XT, IMM", "encoding": {"format": "X-form", "binary_pattern": "60 | XT | 0 | IMM | 360", "hex_opcode": "0xF00002D0", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "IMM", "clean": "IMM"}, {"raw": "360", "clean": "360"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "IMM", "desc": "Value"}, {"name": "IMM8", "desc": "Immediate Byte Value"}], "extension": "VSX", "description": "Splats an 8-bit immediate byte value across all 16 byte elements of VSR XT. Each byte of XT is set to the same immediate value, providing an efficient way to initialize a vector with a constant. This is a VSX instruction that does not update condition flags.", "pseudocode": "byte_val ← IMM[0:7]\nfor i ← 0 to 15\n  XT[i * 8 : i * 8 + 7] ← byte_val", "page_found": "Page 954 - 955", "special_registers": "MSR", "programming_notes": "The xxspltib instruction is used to fill a VSX vector register with an immediate byte value. Ensure that the appropriate privilege level (VSX or Vector) is enabled in the MSR register, otherwise, it will raise an exception. This instruction is useful for initializing vectors with a constant value.", "example": "xxspltib vs1, 1"}
{"mnemonic": "hashchk", "architecture": "PowerISA", "full_name": "Hash Check", "summary": "Checks the hash of the Return Address Stack (ROP Protection).", "syntax": "hashchk RA", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | / | 754 | /", "hex_opcode": "0x7C0005E4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "/", "clean": "/"}, {"raw": "754", "clean": "754"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Address"}, {"name": "RB", "desc": "Source General Purpose Register"}, {"name": "oﬀset", "desc": "Offset value"}, {"name": "RT", "desc": "Target General Purpose Register"}], "extension": "Base", "description": "Verifies the integrity of a hashed Return Address Stack entry at the address in RA to provide Return-Oriented Programming (ROP) protection. The instruction reads the hash stored at RA, recomputes it, and compares against an expected value; if they do not match, a program interrupt is triggered. This is a privileged instruction requiring supervisor-level access.", "pseudocode": "hash_addr ← RA\nstored_hash ← [hash_addr]\nexpected_hash ← ComputeHash(RA)\nif stored_hash ≠ expected_hash then\n  TrapException()", "programming_notes": "If RA=0, the instruction form is invalid. EA must be a multiple of 8.", "page_found": "Page 155 - 156", "special_registers": "HASHKEYR", "example": "hashchk r4"}
{"mnemonic": "hashchkp", "architecture": "PowerISA", "full_name": "Hash Check Privileged", "summary": "Checks the hash value of a memory location against a computed hash.", "syntax": "hashchkp RA", "encoding": {"format": "X-form", "binary_pattern": "0 | D | RA | RB | DX | 111_1111 || DW || 0b000", "hex_opcode": "0x7C000564", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "/", "clean": "/"}, {"raw": "722", "clean": "722"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "RA", "desc": "Address"}, {"name": "RB", "desc": "Source General Purpose Register"}, {"name": "oﬀset", "desc": "Offset to be added to the contents of RA to form the effective address EA."}], "extension": "Privileged", "description": "The HashDigest function is used to compute a hash value from the contents of RA, RB, and the hypervisor privileged SPR HASHPKEYR. This instruction compares the computed hash with the doubleword in storage addressed by EA. If they are unequal, a system trap handler is invoked.", "pseudocode": "DW <- 32 * DX + D\nd <- EXTS(0b111_1111 || DW || 0b000)\nEA <- (RA) + d\ntemp <- HashDigest((RA), (RB), (HASHPKEYR))\ntemp1 <- MEM(EA, 8)\nif (temp != temp1) then TRAP", "programming_notes": "See the Programming Notes that appear in the description of hashst and hashchk in Section 3.3.17.2 of Book I.", "page_found": "Page 1134 - 1135", "special_registers": "HASHPKEYR", "example": "hashchkp r4"}
{"mnemonic": "hashst", "architecture": "PowerISA", "full_name": "Hash Store", "summary": "Stores the computed doubleword hash value to a doubleword storage location.", "syntax": "hashst RA", "encoding": {"format": "X-form", "binary_pattern": "0 | D | RA | RB | DX | 754", "hex_opcode": "0x7C0005A4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "/", "clean": "/"}, {"raw": "755", "clean": "755"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "RA", "desc": "Address"}, {"name": "RB", "desc": "Source General Purpose Register"}, {"name": "oﬀset", "desc": "Offset to be added to the base address in RA"}, {"name": "offset", "desc": "Offset to be added to the base address in RB"}], "extension": "Base", "description": "Computes and stores a 64-bit hash value derived from the contents at the memory address RA. The hash is calculated based on the address and associated data, then written to the doubleword storage location at RA. This is a privileged instruction used for Return-Oriented Programming (ROP) protection.", "pseudocode": "hash_addr ← RA\nhash_value ← ComputeHash(hash_addr)\n[hash_addr] ← hash_value", "special_registers": "HASHKEYR", "programming_notes": "The EA specified by the Hash instructions - (RA) + EXTS(0b111_1111 || DW || 0b000) - can be expressed as (RA) -(64-DW)×8. Therefore the Hash instructions can only access one of the 64 doublewords preceding the address provided by RA.", "page_found": "Page 154 - 156", "example": "hashst r4"}
{"mnemonic": "hashstp", "architecture": "PowerISA", "full_name": "Hash Store Privileged", "summary": "Privileged version of hash store.", "syntax": "hashstp RA", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | / | 723 | /", "hex_opcode": "0x7C000524", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "/", "clean": "/"}, {"raw": "723", "clean": "723"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Address"}], "extension": "Privileged", "description": "Privileged instruction that stores a hash value to the address specified in RA. This instruction is used by privileged software (such as the hypervisor) to update hash tables for memory protection or integrity checking. Requires hypervisor privilege level and may affect storage subsystem state.", "pseudocode": "[RA] ← hash_compute(current_state)", "page_found": "Page 1135", "special_registers": "MSR", "programming_notes": "The hashstp instruction is used for storing a doubleword into memory while verifying its integrity against a previously computed hash. It requires privileged access and must be executed in a context where the MSR register allows such operations. Ensure that the effective address (EA) is correctly calculated and aligned to avoid exceptions. If the stored value does not match the expected hash, a trap will occur, necessitating proper error handling.", "example": "hashstp r4"}
{"mnemonic": "psq_l", "architecture": "PowerISA", "full_name": "Paired Single Quantized Load", "summary": "Loads a paired single from memory (Embedded/Legacy).", "syntax": "psq_l FRT, D(RA), W, I", "encoding": {"format": "X-form", "binary_pattern": "56 | FRT | RA | W | I | 6", "hex_opcode": "0xE0000006", "visual_parts": [{"raw": "56", "clean": "56"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "RA", "clean": "RA"}, {"raw": "W", "clean": "W"}, {"raw": "I", "clean": "I"}, {"raw": "6", "clean": "6"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "D", "desc": "Disp"}, {"name": "RA", "desc": "Base"}, {"name": "W", "desc": "Width"}, {"name": "I", "desc": "Scale"}], "extension": "VMX (AltiVec)", "description": "Loads a pair of single-precision floating-point values from memory into an FPR, with optional quantization/scaling applied. The W field controls element width, and the I field specifies the scale factor applied during load. This is a legacy VMX/AltiVec instruction primarily found on embedded PowerPC implementations.", "pseudocode": "EA ← (RA = 0 ? 0 : GPR[RA]) + D\ndata ← [EA] (quantized width W, scale I)\nFPR[FRT] ← float32_pair(data)", "example": "psq_l f1, 0(r4), 0, 0"}
{"mnemonic": "psq_st", "architecture": "PowerISA", "full_name": "Paired Single Quantized Store", "summary": "Stores a paired single to memory (Embedded/Legacy).", "syntax": "psq_st FRS, D(RA), W, I", "encoding": {"format": "X-form", "binary_pattern": "60 | FRS | RA | W | I | 7", "hex_opcode": "0xF0000007", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "FRS", "clean": "FRS"}, {"raw": "RA", "clean": "RA"}, {"raw": "W", "clean": "W"}, {"raw": "I", "clean": "I"}, {"raw": "7", "clean": "7"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRS", "desc": "Source"}, {"name": "D", "desc": "Disp"}, {"name": "RA", "desc": "Base"}, {"name": "W", "desc": "Width"}, {"name": "I", "desc": "Scale"}], "extension": "VMX (AltiVec)", "description": "Stores a pair of single-precision floating-point values from an FPR to memory, with optional quantization/scaling applied. The W field controls element width, and the I field specifies the scale factor applied during store. This is a legacy VMX/AltiVec instruction primarily found on embedded PowerPC implementations.", "pseudocode": "EA ← (RA = 0 ? 0 : GPR[RA]) + D\ndata ← quantize(FPR[FRS], width W, scale I)\n[EA] ← data", "example": "psq_st f1, 0(r4), 0, 0"}
{"mnemonic": "ps_add", "architecture": "PowerISA", "full_name": "Paired Single Add", "summary": "Adds two paired singles.", "syntax": "ps_add FRT, FRA, FRB", "encoding": {"format": "A-form", "binary_pattern": "60 | FRT | FRA | FRB | 21", "hex_opcode": "0xF0000015", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "21", "clean": "21"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Src A"}, {"name": "FRB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Adds two pairs of single-precision floating-point values element-wise, storing the result in FRT. Each of the two single-precision elements in FRA and FRB is added independently. May set FPSCR status flags if exceptions occur.", "pseudocode": "FPR[FRT].upper ← FPR[FRA].upper + FPR[FRB].upper\nFPR[FRT].lower ← FPR[FRA].lower + FPR[FRB].lower", "example": "ps_add f1, f2, f3"}
{"mnemonic": "ps_sub", "architecture": "PowerISA", "full_name": "Paired Single Subtract", "summary": "Subtracts two paired singles.", "syntax": "ps_sub FRT, FRA, FRB", "encoding": {"format": "A-form", "binary_pattern": "60 | FRT | FRA | FRB | 20", "hex_opcode": "0xF0000014", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "20", "clean": "20"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Src A"}, {"name": "FRB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Subtracts two pairs of single-precision floating-point values element-wise, storing the result in FRT. Each of the two single-precision elements in FRB is subtracted from FRA independently. May set FPSCR status flags if exceptions occur.", "pseudocode": "FPR[FRT].upper ← FPR[FRA].upper - FPR[FRB].upper\nFPR[FRT].lower ← FPR[FRA].lower - FPR[FRB].lower", "example": "ps_sub f1, f2, f3"}
{"mnemonic": "ps_mul", "architecture": "PowerISA", "full_name": "Paired Single Multiply", "summary": "Multiplies two paired singles.", "syntax": "ps_mul FRT, FRA, FRC", "encoding": {"format": "A-form", "binary_pattern": "60 | FRT | FRA | FRC | 25", "hex_opcode": "0xF0000019", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRC", "clean": "FRC"}, {"raw": "25", "clean": "25"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Src A"}, {"name": "FRC", "desc": "Src C"}], "extension": "VMX (AltiVec)", "description": "Multiplies two pairs of single-precision floating-point values element-wise, storing the result in FRT. Each of the two single-precision elements in FRA and FRC is multiplied independently. May set FPSCR status flags if exceptions occur.", "pseudocode": "FPR[FRT].upper ← FPR[FRA].upper × FPR[FRC].upper\nFPR[FRT].lower ← FPR[FRA].lower × FPR[FRC].lower", "example": "ps_mul f1, f2, f4"}
{"mnemonic": "ps_madd", "architecture": "PowerISA", "full_name": "Paired Single Multiply-Add", "summary": "Multiply-Add on paired singles.", "syntax": "ps_madd FRT, FRA, FRC, FRB", "encoding": {"format": "A-form", "binary_pattern": "60 | FRT | FRA | FRB | FRC | 29", "hex_opcode": "0xF000001D", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "FRC", "clean": "FRC"}, {"raw": "29", "clean": "29"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Src A"}, {"name": "FRC", "desc": "Src C"}, {"name": "FRB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Performs multiply-add on two pairs of single-precision floating-point values element-wise, computing FRA × FRC + FRB and storing the result in FRT. All three source registers contribute to the operation, with each element pair computed independently. May set FPSCR status flags if exceptions occur.", "pseudocode": "FPR[FRT].upper ← FPR[FRA].upper × FPR[FRC].upper + FPR[FRB].upper\nFPR[FRT].lower ← FPR[FRA].lower × FPR[FRC].lower + FPR[FRB].lower", "example": "ps_madd f1, f2, f4, f3"}
{"mnemonic": "lbzepx", "architecture": "PowerISA", "full_name": "Load Byte and Zero External Process ID Indexed", "summary": "Loads a byte using the External PID (for OS kernels accessing user memory).", "syntax": "lbzepx RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 31 | /", "hex_opcode": "0x7C00003E", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Loads a byte from memory using the External Process ID (EPID), which allows privileged code to access memory belonging to an external process. The effective address is computed from RA and RB, and the loaded byte is zero-extended into the target GPR. This is an embedded/privileged instruction used by operating system kernels.", "pseudocode": "EA ← (RA = 0 ? 0 : GPR[RA]) + GPR[RB]\nGPR[RT] ← (0)56 || [EA]8", "example": "lbzepx r3, r4, r5"}
{"mnemonic": "lhzepx", "architecture": "PowerISA", "full_name": "Load Halfword and Zero External Process ID Indexed", "summary": "Loads a halfword using the External PID.", "syntax": "lhzepx RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 95 | /", "hex_opcode": "0x7C0000BE", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "95", "clean": "95"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Loads a halfword (16-bit value) from memory using an address formed by adding RA and RB, performing the load using the External PID for address translation in embedded environments. The loaded halfword is zero-extended and placed into RT. No condition flags are affected.", "pseudocode": "EA ← (RA) + (RB)\nRT ← (64-48 bits are 0) || ([EA + 0:1])", "example": "lhzepx r3, r4, r5"}
{"mnemonic": "lwzepx", "architecture": "PowerISA", "full_name": "Load Word and Zero External Process ID Indexed", "summary": "Loads a word using the External PID.", "syntax": "lwzepx RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 63 | /", "hex_opcode": "0x7C00007E", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "63", "clean": "63"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Loads a word (32-bit value) from memory using an address formed by adding RA and RB, performing the load using the External PID for address translation in embedded environments. The loaded word is zero-extended and placed into RT. No condition flags are affected.", "pseudocode": "EA ← (RA) + (RB)\nRT ← (32 bits are 0) || ([EA + 0:3])", "example": "lwzepx r3, r4, r5"}
{"mnemonic": "stbepx", "architecture": "PowerISA", "full_name": "Store Byte External Process ID Indexed", "summary": "Stores a byte using the External PID.", "syntax": "stbepx RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 159 | /", "hex_opcode": "0x7C00013E", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "159", "clean": "159"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Stores a byte (8-bit value) to memory using an address formed by adding RA and RB, performing the store using the External PID for address translation in embedded environments. The least significant byte of RS is written to memory. No condition flags are affected.", "pseudocode": "EA ← (RA) + (RB)\n[EA] ← (RS)[56:63]", "example": "stbepx r3, r4, r5"}
{"mnemonic": "sthep", "architecture": "PowerISA", "full_name": "Store Halfword External Process ID Indexed", "summary": "Stores a halfword using the External PID.", "syntax": "sthepx RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 223 | /", "hex_opcode": "0x7C0001BE", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "223", "clean": "223"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Stores a halfword (16-bit value) to memory using an address formed by adding RA and RB, performing the store using the External PID for address translation in embedded environments. The least significant halfword of RS is written to memory. No condition flags are affected.", "pseudocode": "EA ← (RA) + (RB)\n[EA + 0:1] ← (RS)[48:63]", "example": "sthepx r3, r4, r5"}
{"mnemonic": "stwepx", "architecture": "PowerISA", "full_name": "Store Word External Process ID Indexed", "summary": "Stores a word using the External PID.", "syntax": "stwepx RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 191 | /", "hex_opcode": "0x7C00017E", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "191", "clean": "191"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Stores a word (32-bit value) to memory using an address formed by adding RA and RB, performing the store using the External PID for address translation in embedded environments. The least significant word of RS is written to memory. No condition flags are affected.", "pseudocode": "EA ← (RA) + (RB)\n[EA + 0:3] ← (RS)[32:63]", "example": "stwepx r3, r4, r5"}
{"mnemonic": "mfpmr", "architecture": "PowerISA", "full_name": "Move From Performance Monitor Register", "summary": "Reads a performance monitor register (Embedded).", "syntax": "mfpmr RT, PMRN", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | PMRN | 334 | /", "hex_opcode": "0x7C00029E", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "PMRN", "clean": "PMRN"}, {"raw": "334", "clean": "334"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "PMRN", "desc": "Register Num"}], "extension": "Embedded", "description": "Moves a value from a performance monitor register identified by PMRN into the general-purpose register RT. This instruction is available only in embedded Power ISA implementations with performance monitoring support and typically requires supervisor privilege. No condition flags are affected.", "pseudocode": "RT ← PMR[PMRN]", "example": "mfpmr r3, 0"}
{"mnemonic": "mtpmr", "architecture": "PowerISA", "full_name": "Move To Performance Monitor Register", "summary": "Writes a performance monitor register (Embedded).", "syntax": "mtpmr PMRN, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | PMRN | 462 | /", "hex_opcode": "0x7C00039E", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "PMRN", "clean": "PMRN"}, {"raw": "462", "clean": "462"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "PMRN", "desc": "Register Num"}, {"name": "RS", "desc": "Source"}], "extension": "Embedded", "description": "Moves a value from the general-purpose register RS into the performance monitor register identified by PMRN. This instruction is available only in embedded Power ISA implementations with performance monitoring support and typically requires supervisor privilege. No condition flags are affected.", "pseudocode": "PMR[PMRN] ← RS", "example": "mtpmr 0, r3"}
{"mnemonic": "dcblc", "architecture": "PowerISA", "full_name": "Data Cache Block Lock Clear", "summary": "Clears a cache line lock.", "syntax": "dcblc CT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | CT | RA | RB | 390 | /", "hex_opcode": "0x7C00030C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "CT", "clean": "CT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "390", "clean": "390"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "CT", "desc": "Cache Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Clears the lock bit associated with the cache line at the address formed by adding RA and RB. The CT field specifies the cache target (L1, L2, etc.). This embedded instruction is typically used in multiprocessor environments to release a previously locked cache line. No condition flags are affected.", "pseudocode": "EA ← (RA) + (RB)\nClearCacheLock(CT, EA)", "example": "dcblc 0, r4, r5"}
{"mnemonic": "icblc", "architecture": "PowerISA", "full_name": "Instruction Cache Block Lock Clear", "summary": "Clears an instruction cache line lock.", "syntax": "icblc CT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | CT | RA | RB | 230 | /", "hex_opcode": "0x7C0001CC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "CT", "clean": "CT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "230", "clean": "230"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "CT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Clears the instruction cache block lock at the address computed from RA + RB. The CT field specifies the cache block class to unlock. This is an embedded (SPE/VLE) instruction used in cache management and requires careful synchronization in multi-threaded environments.", "pseudocode": "EA ← (RA) + (RB)\nClear_ICacheBlockLock(EA, CT)", "example": "icblc 0, r4, r5"}
{"mnemonic": "waitimpl", "architecture": "PowerISA", "full_name": "Wait for Implementation Dependent", "summary": "Waits for a specific implementation event.", "syntax": "waitimpl", "encoding": {"format": "X-form", "binary_pattern": "31 | 0 | 0 | 0 | 62 | /", "hex_opcode": "0x7C00003C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "62", "clean": "62"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Base", "description": "Suspends instruction execution until an implementation-dependent event occurs. The exact event is determined by the processor implementation and may involve power-management, interrupt handling, or other microarchitectural conditions. This is a Base ISA instruction with no operands.", "pseudocode": "Wait_for_implementation_event()", "example": "waitimpl"}
{"mnemonic": "waitrsv", "architecture": "PowerISA", "full_name": "Wait for Reservation Loss", "summary": "Waits until a reservation is lost (Multithreading sync).", "syntax": "waitrsv", "encoding": {"format": "X-form", "binary_pattern": "31 | 0 | 0 | 0 | 62 | /", "hex_opcode": "0x7C00003C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "62", "clean": "62"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Base", "description": "Suspends instruction execution until the reservation created by a lwarx/ldarx instruction is lost. This synchronization primitive is used in multi-threaded code to wait for concurrent modifications to shared memory locations. The reservation is typically lost when another processor executes a store to the reserved address or on context switches.", "pseudocode": "Wait_until_reservation_is_lost()", "programming_notes": "Use waitrsv when you need to ensure that a storage location has not been modified by another processor since it was reserved. This instruction is useful in multi-processor environments where data consistency is critical. Ensure that the address is correctly aligned and that the reservation is properly set before using this instruction. If the reservation is lost, the instruction will return true; otherwise, it returns false.", "example": "waitrsv"}
{"mnemonic": "eieio", "architecture": "PowerISA", "full_name": "Enforce In-order Execution of I/O", "summary": "Ensures that load/store instructions preceding the EIEIO complete before those following it. Used for Memory-Mapped I/O synchronization.", "syntax": "eieio", "encoding": {"format": "X-form", "binary_pattern": "31 | 00000 | 00000 | 00000 | 854 | /", "hex_opcode": "0x7C0006AC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "00000", "clean": "00000"}, {"raw": "00000", "clean": "00000"}, {"raw": "00000", "clean": "00000"}, {"raw": "854", "clean": "854"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [], "pseudocode": "Synchronize_IO()\nWait_for_all_preceding_loads_and_stores_to_complete()", "example": "eieio", "example_note": "I/O Barrier.", "extension": "Base", "description": "Enforces in-order completion of all load and store instructions issued before it with respect to all load and store instructions issued after it. This is essential for memory-mapped I/O synchronization and weak-ordering memory models. No condition register or status fields are affected.", "programming_notes": "The eieio instruction is intended for use in doing memory-mapped I/O. Because loads, and separately stores, to storage that is both Caching Inhibited and Guarded are performed in program order (see Section 1.7.1, “Storage Access Ordering ” on page 973), eieio is needed for such storage only when loads must be ordered with respect to stores.", "page_found": "Page 1063 - 1064"}
{"mnemonic": "fadd", "architecture": "PowerISA", "full_name": "Floating Add", "summary": "Adds the contents of two floating-point registers and places the result into another register.", "syntax": "fadd FRT,FRA,FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | FRA | FRB | 00000 | 21 | Rc", "hex_opcode": "0xFC00002A", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "00000", "clean": "00000"}, {"raw": "21", "clean": "21"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target FPR"}, {"name": "FRA", "desc": "Source FPR A"}, {"name": "FRB", "desc": "Source FPR B"}], "pseudocode": "if 'fadd' then\n    FRT <- (FRA) + (FRB)\nelse if 'fadd.' then\n    FRT <- (FRA) + (FRB)\n    CR1 <- result class and sign", "example": "fadd f1, f2, f3", "example_note": "f1 = f2 + f3", "extension": "Floating-Point", "description": "The floating-point operand in register FRA is added to the floating-point operand in register FRB. The result is rounded to the target precision under control of RN and placed into register FRT.", "special_registers": "FPSCR, CR1, CR0", "page_found": "Page 197 - 198", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes."}
{"mnemonic": "fmul", "architecture": "PowerISA", "full_name": "Floating Multiply", "summary": "Multiplies the contents of two floating-point registers and places the result into another register.", "syntax": "fmul FRT,FRA,FRC", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | FRA | 00000 | FRC | 25 | Rc", "hex_opcode": "0xFC000032", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "00000", "clean": "00000"}, {"raw": "FRC", "clean": "FRC"}, {"raw": "25", "clean": "25"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target FPR"}, {"name": "FRA", "desc": "Source FPR A"}, {"name": "FRC", "desc": "Source FPR C"}], "pseudocode": "if 'fmul' then\n    FRT <- (FRA) * (FRC)\nelse if 'fmul.' then\n    FRT <- (FRA) * (FRC)", "example": "fmul f1, f2, f3", "example_note": "f1 = f2 * f3", "extension": "Floating-Point", "description": "The floating-point operand in register FRA is multiplied by the floating-point operand in register FRC. The result is rounded to the target precision under control of RN and placed into register FRT.", "special_registers": "FPSCR, CR1, CR0", "page_found": "Page 198 - 200", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes."}
{"mnemonic": "fmadd", "architecture": "PowerISA", "full_name": "Floating Multiply-Add", "summary": "Performs (A * C) + B with a single rounding step. (The classic FMA).", "syntax": "fmadd FRT,FRA,FRC,FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | FRA | FRB | FRC | 29 | Rc", "hex_opcode": "0xFC00003A", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "FRC", "clean": "FRC"}, {"raw": "29", "clean": "29"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target FPR"}, {"name": "FRA", "desc": "Multiplier"}, {"name": "FRC", "desc": "Multiplicand"}, {"name": "FRB", "desc": "Addend"}], "pseudocode": "FRT ←[(FRA)×(FRC)] + (FRB)\nif 'fmadd.' then\n    CR1 <- result class and sign", "example": "fmadd f1, f2, f3, f4", "example_note": "f1 = (f2 * f3) + f4", "extension": "Floating-Point", "description": "The instruction multiplies the contents of register FRA by the contents of register FRC, then adds the result to the contents of register FRB. The final result is placed into register FRT.", "special_registers": "FPSCR, CR1, CR0", "page_found": "Page 203 - 204", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes."}
{"mnemonic": "fcmpu", "architecture": "PowerISA", "full_name": "Floating Compare Unordered", "summary": "Compares two floating-point registers and sets the Condition Register (CR) field. Does not trap on NaNs.", "syntax": "fcmpu BF, FRA, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | / | FRA | FRB | 0000000000 | /", "hex_opcode": "0xFC000000", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "0000000000", "clean": "0000000000"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "FRA", "desc": "Source A"}, {"name": "FRB", "desc": "Source B"}, {"name": "CRb", "desc": "Condition Register Field"}, {"name": "FRa", "desc": "Floating-Point Register Source"}, {"name": "FRc", "desc": "Floating-Point Register Source"}], "pseudocode": "if (FRA) is NaN or (FRB) is NaN then\n  CR[BF] ← 0b0001\n  FPSCR[VXCC] ← 1\nelif (FRA) < (FRB) then\n  CR[BF] ← 0b1000\nelif (FRA) > (FRB) then\n  CR[BF] ← 0b0100\nelse\n  CR[BF] ← 0b0010", "example": "fcmpu cr0, f1, f2", "example_note": "Compare f1 vs f2.", "extension": "Floating-Point", "description": "Compares two floating-point registers (FRA and FRB) and writes the result (less-than, equal, greater-than, or unordered) into the specified CR field (BF). Unlike fcmpo, this instruction does not trap on signaling NaN operands. The FPSCR may record VXCC (invalid operation) for signaling NaNs.", "special_registers": "FPSCR, CR", "page_found": "Page 214 - 216", "programming_notes": "The fcmpu instruction is commonly used for unordered floating-point comparisons, which are useful in scenarios where NaN values need to be handled gracefully. Be cautious with signaling NaNs (SNaNs), as they can trigger exceptions and set the VXSNAN flag. Ensure that the FPSCR and CR registers are properly managed to handle comparison results and exceptions correctly."}
{"mnemonic": "fctiw", "architecture": "PowerISA", "full_name": "Floating Convert with round Double-Precision To Signed Word format", "summary": "Converts a float to a 32-bit signed integer (using the current rounding mode) and stores it in the lower half of the FPR.", "syntax": "fctiw FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | / | FRB | 14 | Rc", "hex_opcode": "0xFC00001C", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "/", "clean": "/"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "14", "clean": "14"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target FPR"}, {"name": "FRB", "desc": "Source FPR"}, {"name": "RT", "desc": "Target Floating Point Register"}, {"name": "RA", "desc": "Source Floating Point Register"}], "pseudocode": "round_mode ← FPSCRRN\ntgt_precision ← '32-bit signed integer'\n\nsign ← (FRB)0\nif (FRB)1:11 = 2047 and (FRB)12:63 = 0 then goto Infinity Operand\nif (FRB)1:11 = 2047 and (FRB)12 = 0 then goto SNaN Operand\nif (FRB)1:11 = 2047 and (FRB)12 = 1 then goto QNaN Operand\nif (FRB)1:11 > 1086 then goto Large Operand\n\nif (FRB)1:11 > 0 then exp ← (FRB)1:11 - 1023   /* exp - bias */\nif (FRB)1:11 = 0 then exp ← -1022\nif (FRB)1:11 > 0 then frac0:64 ← 0b01 || (FRB)12:63 || 110   /* normal */\nif (FRB)1:11 = 0 then frac0:64 ← 0b00 || (FRB)12:63 || 110   /* denormal */\n\nrbit || xbit ← 0b00\nfor i=1,63-exp    /* do the loop 0 times if exp = 63 */\n    frac0:64 || rbit || xbit ← 0b0 || frac0:64 || (rbit | xbit)\nend\n\nFRT ← Round Integer(sign, frac0:64, gbit, rbit, xbit, round_mode)", "example": "fctiw f1, f2", "example_note": "Convert float f2 to int in f1.", "extension": "Floating-Point", "description": "The instruction converts the double-precision floating-point value in FRB to a signed word using the specified rounding mode. If the result is out of range, it saturates to the maximum or minimum signed integer value.", "special_registers": "FPSCR, (FR, FI, FX, XX, VXSNAN, VXCVI), CR1, (if, Rc=1), CR0", "page_found": "Page 208 - 210", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes."}
{"mnemonic": "isel", "architecture": "PowerISA", "full_name": "Integer Select", "summary": "Conditionally copies RA or RB to RT based on a CR bit. (Equivalent to C ternary operator 'cond ? a : b').", "syntax": "isel RT, RA, RB, BC", "encoding": {"format": "A-form", "binary_pattern": "31 | RT | RA | RB | BC | 15 | /", "hex_opcode": "0x7C00001E", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "BC", "clean": "BC"}, {"raw": "15", "clean": "15"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source (If True) - 0 means 0"}, {"name": "RB", "desc": "Source (If False)"}, {"name": "BC", "desc": "CR Bit Index (Condition)"}, {"name": "CR", "desc": "Condition Register Field"}], "pseudocode": "BIT ← CR[BC]\nif BIT = 1 then\n  RT ← (RA)\nelse\n  RT ← (RB)", "example": "isel r3, r4, r5, 2", "example_note": "r3 = (CR.eq) ? r4 : r5", "extension": "Base", "description": "Conditionally selects between RA and RB based on the value of a single bit in the Condition Register, writing the result to RT. If the CR bit BC is 1, RT ← RA (or 0 if RA=0); otherwise RT ← RB. This provides a branch-free ternary operation.", "extended_mnemonics": [{"mnemonic": "iselgt", "equivalent_to": "isel RT,RA,RB,1"}, {"mnemonic": "iseleq", "equivalent_to": "isel RT,RA,RB,2"}, {"mnemonic": "isellt", "equivalent_to": "isel RT,RA,RB,0"}], "page_found": "Page 131 - 132", "special_registers": "CR0, CR1-CR7", "programming_notes": "isel is used for conditional moves based on the condition register."}
{"mnemonic": "icbi", "architecture": "PowerISA", "full_name": "Instruction Cache Block Invalidate", "summary": "Invalidates the instruction cache block associated with the address. Critical for self-modifying code or JITs.", "syntax": "icbi RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 982 | /", "hex_opcode": "0x7C0007AC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "982", "clean": "982"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base Address"}, {"name": "RB", "desc": "Index Address"}], "pseudocode": "EA ← (RA) + (RB)\nInvalidate_ICacheBlock(EA)", "example": "icbi 0, r3", "example_note": "Invalidate instruction cache at r3.", "extension": "Base", "description": "Invalidates the instruction cache block that contains the address RA + RB, forcing subsequent instruction fetches from that block to reload from lower cache levels or memory. Essential for self-modifying code and JIT compilers. May affect performance on some implementations.", "page_found": "Page 1027", "programming_notes": "Use icbi to ensure that changes to executable code in memory are reflected in the instruction cache. This is crucial after modifying code at runtime. Ensure the address is properly aligned; typically, block boundaries align with cache line sizes. This instruction operates at user privilege level and may raise an exception if the address is invalid or access is denied."}
{"mnemonic": "isync", "architecture": "PowerISA", "full_name": "Instruction Synchronize", "summary": "Ensures that all instructions preceding the isync instruction have completed before it completes, and that no subsequent instructions are initiated until after the isync instruction completes.", "syntax": "isync", "encoding": {"format": "XL-form", "binary_pattern": "19 | 00000 | 00000 | 00000 | 150 | /", "hex_opcode": "0x4C00012C", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "00000", "clean": "00000"}, {"raw": "00000", "clean": "00000"}, {"raw": "00000", "clean": "00000"}, {"raw": "150", "clean": "150"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [], "pseudocode": "ContextSynchronize()", "example": "isync", "example_note": "Refetch instructions.", "extension": "Base", "description": "Executing an isync instruction ensures that all instructions preceding the isync instruction have completed before the isync instruction completes, and that no subsequent instructions are initiated until after the isync instruction completes. It also ensures that all instruction cache block invalidations caused by icbi instructions preceding the isync instruction have been performed with respect to the processor executing the isync instruction, and then causes any prefetched instructions to be discarded.", "programming_notes": "Except as described in the preceding sentence, the isync instruction may complete before storage accesses associated with instructions preceding the isync instruction have been performed.", "page_found": "Page 1049 - 1050"}
{"mnemonic": "mcrf", "architecture": "PowerISA", "full_name": "Move Condition Register Field", "summary": "Copies the contents of one Condition Register field to another. Used to save comparison results.", "syntax": "mcrf BF, BFA", "encoding": {"format": "XL-form", "binary_pattern": "00000 | CRFD | CRFS | 00000 | 00000 | 00000 | 00000 | 00000", "hex_opcode": "0x4C000000", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "BFA", "clean": "BFA"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "16", "clean": "16"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:13 | 14:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "Target Field (0-7)"}, {"name": "BFA", "desc": "Source Field (0-7)"}, {"name": "CRFD", "desc": "Destination Condition Register Field"}, {"name": "CRFS", "desc": "Source Condition Register Field"}], "pseudocode": "CR4×BF+32:4×BF+35 ← CR4×BFA+32:4×BFA+35", "example": "mcrf cr0, cr7", "example_note": "Copy result from CR7 to CR0.", "extension": "Base", "description": "The contents of Condition Register field BFA are copied to Condition Register field BF.", "special_registers": "CR0, CR1-CR7", "page_found": "Page 80 - 82", "programming_notes": "Use mcrf to copy condition register fields, ensuring BFA and BF are valid. This instruction operates at user privilege level and does not raise exceptions under normal conditions."}
{"mnemonic": "mfcr", "architecture": "PowerISA", "full_name": "Move From Condition Register", "summary": "Copies the entire 32-bit Condition Register into a General Purpose Register.", "syntax": "mfcr RT", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | 00000 | 00000 | 19 | /", "hex_opcode": "0x7C000026", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "00000", "clean": "00000"}, {"raw": "00000", "clean": "00000"}, {"raw": "19", "clean": "19"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}], "pseudocode": "RT ← CR", "example": "mfcr r3", "example_note": "Save flags to r3.", "extension": "Base", "description": "Moves the entire 32-bit Condition Register into the target GPR. All eight 4-bit CR fields (CR0-CR7) are copied as a single 32-bit value. No condition register or status fields are modified by this operation.", "special_registers": "CR", "page_found": "Page 165 - 166", "programming_notes": "The mfcr instruction is commonly used to save the current state of the condition register for later use, such as before a function call or when implementing exception handling. It's important to note that this instruction does not affect any flags in the condition register itself; it merely copies its contents. Ensure that the target general-purpose register RT is properly aligned and accessible at the privilege level where the instruction is executed."}
{"mnemonic": "mtcrf", "architecture": "PowerISA", "full_name": "Move To Condition Register Fields", "summary": "Copies bits from a register into the Condition Register, updated only the fields specified by the mask (FXM).", "syntax": "mtcrf FXM, RS", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RS | 0 | FXM | 144 | /", "hex_opcode": "0x7C000120", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "0", "clean": "0"}, {"raw": "FXM", "clean": "FXM"}, {"raw": "144", "clean": "144"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11 | 12:19 | 20:30 | 31", "length": "32"}, "operands": [{"name": "FXM", "desc": "Field Mask (8 bits)"}, {"name": "RS", "desc": "Source Register"}], "pseudocode": "do i = 0 to 7\n  if FXM[i] = 1 then\n    CR[4*i:4*i+3] ← RS[4*i:4*i+3]\nend do", "example": "mtcrf 0xFF, r3", "example_note": "Restore all CR fields from r3.", "extension": "Base", "description": "Moves bits from the source register (RS) into the Condition Register (CR), updating only the fields specified by the mask FXM. Each bit in FXM corresponds to one of the eight 4-bit CR fields; a 1 indicates that field should be updated. This instruction affects the CR as specified by the mask, with no other status register modifications.", "page_found": "Page 165", "special_registers": "CR", "programming_notes": "The mtcrf instruction is used to move specific fields of the Condition Register (CR) into general-purpose registers. It's important to note that if the SPR number is between 808 and 811, the instruction acts as a no-op. Ensure that the FXM field correctly specifies which CR fields to transfer to avoid unintended behavior."}
{"mnemonic": "xsaddqp", "architecture": "PowerISA", "full_name": "VSX Scalar Add Quad-Precision", "summary": "Adds two 128-bit Quad-Precision floating-point numbers held in VSX registers (pairs).", "syntax": "xsaddqp vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "0 | VRT | VRA | VRB | RO | 11000000000000000000000000000000", "hex_opcode": "0xFC000008", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "4", "clean": "4"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vD", "desc": "Target (128-bit)"}, {"name": "vA", "desc": "Source A"}, {"name": "vB", "desc": "Source B"}, {"name": "VRT", "desc": "Target Vector-Specific Register"}, {"name": "VRA", "desc": "Source Vector-Specific Register"}, {"name": "VRB", "desc": "Source Vector-Specific Register"}, {"name": "VT", "desc": "Target Vector Register"}], "pseudocode": "FPR[vD:vD+1] ← quad_precision(FPR[vA:vA+1] + FPR[vB:vB+1])\nFPSCR ← updated with exception flags", "example": "xsaddqp v2, v3, v4", "example_note": "Scientific Quad-Float Add.", "extension": "VSX", "description": "Adds two 128-bit quad-precision floating-point numbers held in VSX register pairs and stores the result in another VSX register pair. The operation uses full precision during computation and rounds the result to quad-precision format. This instruction requires VSX support and updates FPSCR with exception flags as appropriate.", "special_registers": "vxisi_flag, vxsnan_flag", "page_found": "Page 655 - 656", "programming_notes": "The xsaddqp instruction is used for adding two quad-precision floating-point numbers. Ensure that the VSX feature is enabled by checking and setting MSR.VSX. Be aware of special cases like NaNs, which can set flags such as vxsnan_flag or vxisi_flag. The result is stored in VSR[VT+32], and proper rounding and exception handling are managed internally."}
{"mnemonic": "xsmulqp", "architecture": "PowerISA", "full_name": "VSX Scalar Multiply Quad-Precision", "summary": "Multiplies two quad-precision floating-point numbers and rounds the result to odd.", "syntax": "xsmulqp vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | FRA | FRB | 36 | Rc", "hex_opcode": "0xFC000048", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "36", "clean": "36"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source A"}, {"name": "vB", "desc": "Source B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "pseudocode": "FPR[vD:vD+1] ← quad_precision_round_to_odd(FPR[vA:vA+1] × FPR[vB:vB+1])\nFPSCR ← updated with exception flags", "example": "xsmulqp v2, v3, v4", "example_note": "Scientific Quad-Float Multiply.", "extension": "VSX", "description": "Multiplies two 128-bit quad-precision floating-point numbers held in VSX register pairs and stores the result in another VSX register pair, rounding to odd. The operation computes the full product and rounds using the round-to-odd mode to ensure correct rounding behavior. This instruction requires VSX support and updates FPSCR with exception flags.", "special_registers": "vximz_flag, vxsnan_flag", "page_found": "Page 667 - 668", "programming_notes": "The xsmulqp instruction handles special cases like NaNs and infinities, setting flags accordingly. Ensure proper handling of these conditions to avoid unexpected results. The instruction operates at the VSX privilege level and may raise exceptions for invalid operations. Performance can vary based on input values and rounding modes."}
{"mnemonic": "xscvdpqp", "architecture": "PowerISA", "full_name": "VSX Scalar Convert Double-Precision to Quad-Precision format", "summary": "Converts a double-precision floating-point value to a quad-precision floating-point value.", "syntax": "xscvdpqp vD, vB", "encoding": {"format": "X-form", "binary_pattern": "0 | VRT | VRB | 11000000000000000000000000000000", "hex_opcode": "0xFC160688", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "/", "clean": "/"}, {"raw": "vB", "clean": "vB"}, {"raw": "340", "clean": "340"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target (Quad)"}, {"name": "vB", "desc": "Source (Double)"}, {"name": "VRT", "desc": "Target Vector-Scalar Register"}, {"name": "VRB", "desc": "Source Vector-Scalar Register"}], "pseudocode": "FPR[vD:vD+1] ← convert_to_quad_precision(FPR[vB])\nFPSCR ← updated with exception flags", "example": "xscvdpqp v2, v3", "example_note": "Promote Double to Quad.", "extension": "VSX", "description": "Converts a double-precision floating-point value held in a VSX register to quad-precision format and stores the result in a VSX register pair. The conversion is exact since double-precision has fewer significant bits than quad-precision. This instruction requires VSX support and updates FPSCR with exception flags as needed.", "special_registers": "FPSCR.FPRF, FPSCR.FX, FPSCR.VXSNAN, FPSCR.FR, FPSCR.FI", "page_found": "Page 830 - 831", "programming_notes": "This instruction is used to convert a double-precision floating-point number to a quad-precision format. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register, otherwise, an exception will be raised. Be cautious with signaling NaNs (SNaNs), as they are converted to quiet NaNs and may trigger exceptions based on the FPSCR settings."}
{"mnemonic": "dadd", "architecture": "PowerISA", "full_name": "Decimal Add", "summary": "Adds two 64-bit Decimal Floating Point (DFP) numbers. Used in financial calculations to avoid rounding errors.", "syntax": "dadd FRT,FRA,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | FRA | FRB | 2 | /", "hex_opcode": "0xEC000004", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "2", "clean": "2"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target FPR"}, {"name": "FRA", "desc": "Source A"}, {"name": "FRB", "desc": "Source B"}], "pseudocode": "FPR[FRT] ← DFP_add(FPR[FRA], FPR[FRB])\nFPSCR ← updated with exception flags", "example": "dadd f1, f2, f3", "example_note": "Financial Add.", "extension": "Decimal Floating-Point", "description": "Adds two 64-bit Decimal Floating Point (DFP) numbers held in FPRs and stores the result in another FPR. DFP arithmetic maintains decimal precision without binary rounding errors, making it essential for financial applications. This instruction updates FPSCR with exception flags and condition codes based on the result.", "special_registers": "FPSCR, CR1", "extended_mnemonics": ["dadd."], "page_found": "Page 238 - 240", "programming_notes": "The dadd instruction is used for adding two decimal floating-point numbers. Ensure that the source registers FRA and FRB are correctly aligned and contain valid decimal floating-point values. The result will be rounded according to the rounding mode specified in the FPSCR register's DRN field. Be aware of potential exceptions such as overflow or underflow, which may require handling in your code."}
{"mnemonic": "dmul", "architecture": "PowerISA", "full_name": "Decimal Multiply", "summary": "Multiplies the contents of two DFP registers and places the result in another DFP register.", "syntax": "dmul FRT,FRA,FRB", "encoding": {"format": "X-form", "binary_pattern": "0 | FRT | FRA | FRB | Rc | 0 | 0 | 0", "hex_opcode": "0xEC000044", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "34", "clean": "34"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26 | 27:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target FPR"}, {"name": "FRA", "desc": "Source A"}, {"name": "FRB", "desc": "Source B"}], "pseudocode": "FPR[FRT] ← DFP_multiply(FPR[FRA], FPR[FRB])\nFPSCR ← updated with exception flags\nif Rc = 1 then CR0 ← condition_code(FPR[FRT])", "example": "dmul f1, f2, f3", "example_note": "Financial Multiply.", "extension": "Decimal Floating-Point", "description": "Multiplies two 64-bit Decimal Floating Point (DFP) numbers held in FPRs and stores the result in another FPR. DFP multiplication preserves decimal precision required for financial calculations. The instruction can optionally update CR0 (via the dot form); FPSCR is always updated with exception flags and rounding information.", "special_registers": "FPSCR, CR1", "programming_notes": "dmul[q][.] are treated as Floating-Point instructions in terms of resource availability.", "page_found": "Page 241 - 242"}
{"mnemonic": "dqua", "architecture": "PowerISA", "full_name": "Decimal Quantize", "summary": "Adjusts the exponent of a DFP number to match a reference. Critical for aligning decimal points before addition.", "syntax": "dqua FRT,FRA,FRB,RMC", "encoding": {"format": "X-form", "binary_pattern": "0 | FRT | FRA | FRB | RMC | Rc | 3 | 21 | 23", "hex_opcode": "0xEC000006", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "66", "clean": "66"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Source Value"}, {"name": "FRB", "desc": "Reference Exponent"}, {"name": "RMC", "desc": "Rounding Mode Control"}], "pseudocode": "FPR[FRT] ← DFP_quantize(FPR[FRA], FPR[FRB], RMC)\nFPSCR ← updated with exception flags\nif Rc = 1 then CR0 ← condition_code(FPR[FRT])", "example": "dqua f1, f2, f3", "example_note": "Align decimal points.", "extension": "Decimal Floating-Point", "description": "Adjusts the exponent of a 64-bit DFP number to match a reference exponent, rounding the significand as needed according to the RMC control bits. This operation is essential for aligning decimal points before addition in financial calculations. The instruction can optionally update CR0 via the dot form; FPSCR is always updated with exception flags.", "special_registers": "FPSCR, FPRF, FR, FI, FX, XX, VXSNAN, VXCVI, CR1", "programming_notes": "DFP Quantize can be used to adjust one DFP value to a form having the same exponent as another DFP value. If the adjustment requires the significand to be shifted left and would cause overflow from the most significant digit, the result is a default QNaN.", "page_found": "Page 250 - 252", "extended_mnemonics": ["dqua", "dqua."]}
{"mnemonic": "vbrh", "architecture": "PowerISA", "full_name": "Vector Byte-Reverse Halfword", "summary": "Reverses bytes within each halfword (Endian Swap).", "syntax": "vbrh vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1606", "hex_opcode": "0x10000646", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1606", "clean": "1606"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Reverses the order of bytes within each halfword (16-bit element) of the source vector, effectively performing a 16-bit endianness swap. The operation processes all 8 halfwords in the 128-bit vector independently. This instruction requires VMX/AltiVec support and does not affect any status registers.", "pseudocode": "for i = 0 to 7 do\n  VR[vD][i*16:i*16+15] ← reverse_bytes(VR[vB][i*16:i*16+15])\nend for", "example": "vbrh vd, vb"}
{"mnemonic": "vbrw", "architecture": "PowerISA", "full_name": "Vector Byte-Reverse Word", "summary": "Reverses bytes within each word.", "syntax": "vbrw vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1670", "hex_opcode": "0x10000686", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1670", "clean": "1670"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Reverses the byte order within each 32-bit word of the source vector and stores the result in the destination vector. This instruction operates on four words in parallel across the 128-bit vector. No condition flags are affected; this is a VMX/AltiVec instruction.", "pseudocode": "vD[0:31] ← vB[24:31] || vB[16:23] || vB[8:15] || vB[0:7]\nvD[32:63] ← vB[56:63] || vB[48:55] || vB[40:47] || vB[32:39]\nvD[64:95] ← vB[88:95] || vB[80:87] || vB[72:79] || vB[64:71]\nvD[96:127] ← vB[120:127] || vB[112:119] || vB[104:111] || vB[96:103]", "example": "vbrw vd, vb"}
{"mnemonic": "vbrd", "architecture": "PowerISA", "full_name": "Vector Byte-Reverse Doubleword", "summary": "Reverses bytes within each doubleword.", "syntax": "vbrd vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1734", "hex_opcode": "0x100006C6", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1734", "clean": "1734"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Reverses the byte order within each 64-bit doubleword of the source vector and stores the result in the destination vector. This instruction operates on two doublewords in parallel across the 128-bit vector. No condition flags are affected; this is a VMX/AltiVec instruction.", "pseudocode": "vD[0:63] ← vB[56:63] || vB[48:55] || vB[40:47] || vB[32:39] || vB[24:31] || vB[16:23] || vB[8:15] || vB[0:7]\nvD[64:127] ← vB[120:127] || vB[112:119] || vB[104:111] || vB[96:103] || vB[88:95] || vB[80:87] || vB[72:79] || vB[64:71]", "example": "vbrd vd, vb"}
{"mnemonic": "vbrq", "architecture": "PowerISA", "full_name": "Vector Byte-Reverse Quadword", "summary": "Reverses bytes within the entire 128-bit quadword.", "syntax": "vbrq vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1798", "hex_opcode": "0x10000706", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1798", "clean": "1798"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Reverses the byte order across the entire 128-bit quadword of the source vector and stores the result in the destination vector. This is a single whole-vector operation. No condition flags are affected; this is a VMX/AltiVec instruction.", "pseudocode": "vD[0:127] ← vB[120:127] || vB[112:119] || vB[104:111] || vB[96:103] || vB[88:95] || vB[80:87] || vB[72:79] || vB[64:71] || vB[56:63] || vB[48:55] || vB[40:47] || vB[32:39] || vB[24:31] || vB[16:23] || vB[8:15] || vB[0:7]", "example": "vbrq vd, vb"}
{"mnemonic": "vextsb2w", "architecture": "PowerISA", "full_name": "Vector Extend Sign Byte To Word", "summary": "Sign-extends each byte in a vector to a word.", "syntax": "vextsb2w vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | 16 | VRB | 1538", "hex_opcode": "0x10100602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1542", "clean": "1542"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vextsb2w, the signed integer in bits 24:31 of each word element of VSR[VRB+32] is sign-extended and placed into the corresponding word element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src ← VSR[VRB+32].word[i].bit[24:31]\n    VSR[VRT+32].word[i] ← EXTS32(src)\nend", "page_found": "Page 397 - 398", "special_registers": "MSR", "programming_notes": "This instruction is used to sign-extend the most significant byte of each word in a vector register. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set; otherwise, a Vector Unavailable exception will be raised. The operation processes four words per vector register, and it's important to handle exceptions properly to avoid program crashes.", "example": "vextsb2w vd, vb"}
{"mnemonic": "vextsh2w", "architecture": "PowerISA", "full_name": "Vector Extend Sign Halfword To Word", "summary": "Sign-extends halfwords to words.", "syntax": "vextsh2w vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1606", "hex_opcode": "0x10110602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1606", "clean": "1606"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Sign-extends each of four 16-bit halfwords in the source vector to 32-bit words, filling the upper bits with the sign bit, and stores the result in the destination vector. The instruction operates on the four halfwords in the lower 64 bits of the source. No condition flags are affected; this is a VMX/AltiVec instruction.", "pseudocode": "vD[0:31] ← (vB[0] replicated to 16 bits) || vB[0:15]\nvD[32:63] ← (vB[16] replicated to 16 bits) || vB[16:31]\nvD[64:95] ← (vB[32] replicated to 16 bits) || vB[32:47]\nvD[96:127] ← (vB[48] replicated to 16 bits) || vB[48:63]", "page_found": "Page 398", "special_registers": "MSR", "programming_notes": "This instruction is used to sign-extend the upper half of each word in a vector register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The operation processes four 32-bit words per vector register, and there are no specific alignment requirements for the data.", "example": "vextsh2w vd, vb"}
{"mnemonic": "vextsb2d", "architecture": "PowerISA", "full_name": "Vector Extend Sign Byte To Doubleword", "summary": "Sign-extends the byte elements of a vector register to doublewords.", "syntax": "vextsb2d vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | 24 | VRB | 1538", "hex_opcode": "0x10180602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1798", "clean": "1798"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vextsb2d, each byte element in VSR[VRB+32] is sign-extended and placed into corresponding doubleword elements in VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    src ← VSR[VRB+32].dword[i].bit[56:63]\n    VSR[VRT+32].dword[i] ← EXTS64(src)\nend", "page_found": "Page 398 - 399", "special_registers": "MSR", "programming_notes": "This instruction is used to sign-extend each byte in the source vector register into a doubleword in the destination vector register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The operation processes two elements per iteration, and there are no specific alignment requirements for the data. This instruction operates at the user privilege level.", "example": "vextsb2d vd, vb"}
{"mnemonic": "vextsh2d", "architecture": "PowerISA", "full_name": "Vector Extend Sign Halfword To Doubleword", "summary": "Extends the sign of each halfword in a vector to doubleword.", "syntax": "vextsh2d vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1862", "hex_opcode": "0x10190602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1862", "clean": "1862"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VSRC", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "page_found": "Page 1365 - 1366", "description": "Sign-extends each of two 16-bit halfwords in the source vector to 64-bit doublewords, filling the upper bits with the sign bit, and stores the result in the destination vector. The instruction operates on the two halfwords in the lower 32 bits of the source. No condition flags are affected; this is a VMX/AltiVec instruction.", "pseudocode": "vD[0:63] ← (vB[0] replicated to 48 bits) || vB[0:15]\nvD[64:127] ← (vB[16] replicated to 48 bits) || vB[16:31]", "special_registers": "MSR", "programming_notes": "This instruction is used for sign-extending the upper 16 bits of each doubleword in a vector from VRB to VRT. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The operation processes two elements per instruction execution.", "example": "vextsh2d vd, vb"}
{"mnemonic": "vextsw2d", "architecture": "PowerISA", "full_name": "Vector Extend Sign Word To Doubleword", "summary": "Extends the sign of each word in a vector to doubleword.", "syntax": "vextsw2d vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1926", "hex_opcode": "0x101A0602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1926", "clean": "1926"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The signed integer in bits 32:63 of each doubleword element of VSR[VRB+32] is sign-extended and placed into the corresponding doubleword element of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    src ← VSR[VRB+32].dword[i].bit[32:63]\n    VSR[VRT+32].dword[i] ← EXTS64(src)\nend", "page_found": "Page 399 - 400", "special_registers": "MSR", "programming_notes": "This instruction is used to sign-extend the upper 32 bits of each doubleword in a vector register. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector Unavailable exception will be raised. The operation processes two elements per iteration, and it's important to verify that the source and target registers are correctly aligned for optimal performance.", "example": "vextsw2d vd, vb"}
{"mnemonic": "vcmpneb", "architecture": "PowerISA", "full_name": "Vector Compare Not Equal Byte", "summary": "Compares each byte of two vector registers and sets the result register to all 1s if the bytes are not equal, otherwise all 0s.", "syntax": "vcmpneb VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000007", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "7", "clean": "7"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpneb, each byte of VSR[VRA+32] is compared with the corresponding byte of VSR[VRB+32]. If they are not equal, the corresponding byte in VSR[VRT+32] is set to 0xFF; otherwise, it is set to 0x00.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 15\n    src1 ←VSR[VRA+32].byte[i]\n    src2 ←VSR[VRB+32].byte[i]\n    if src1 != src2 then do\n        VSR[VRT+32].byte[i] ←0xFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].byte[i] ←0x00\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR0, XER", "page_found": "Page 423 - 424", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpneb v1, v2, v3"}
{"mnemonic": "vcmpneh", "architecture": "PowerISA", "full_name": "Vector Compare Not Equal Halfword", "summary": "Compares the contents of two vector registers and sets the result register to all 1s if the elements are not equal, otherwise all 0s.", "syntax": "vcmpneh VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000047", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "71", "clean": "71"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpneh, each halfword element in VSR[VRA+32] is compared with the corresponding element in VSR[VRB+32]. If they are not equal, the corresponding element in VSR[VRT+32] is set to all 1s; otherwise, it is set to all 0s.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 7\n    src1 ←VSR[VRA+32].hword[i]\n    src2 ←VSR[VRB+32].hword[i]\n    if src1 != src2 then do\n        VSR[VRT+32].hword[i] ←0xFFFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].hword[i] ←0x0000\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6 (if Rc=1)", "page_found": "Page 424 - 425", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpneh v1, v2, v3"}
{"mnemonic": "vcmpnew", "architecture": "PowerISA", "full_name": "Vector Compare Not Equal Word", "summary": "Compares each word of two vector registers and sets the corresponding word in the target vector register to all 1s if the words are not equal, otherwise to all 0s.", "syntax": "vcmpnew VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000087", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "135", "clean": "135"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpnew, each word of VSR[VRA+32] is compared with the corresponding word of VSR[VRB+32]. If they are not equal, the corresponding word in VSR[VRT+32] is set to 0xFFFF_FFFF; otherwise, it is set to 0x0000_0000.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 3\n    src1 ←VSR[VRA+32].word[i]\n    src2 ←VSR[VRB+32].word[i]\n    if src1 != src2 then do\n        VSR[VRT+32].word[i] ←0xFFFF_FFFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].word[i] ←0x0000_0000\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6 (if Rc=1)", "page_found": "Page 425 - 426", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpnew v1, v2, v3"}
{"mnemonic": "vadduqm", "architecture": "PowerISA", "full_name": "Vector Add Unsigned Quadword Modulo", "summary": "Adds the contents of two vector registers and updates the destination register with the result modulo 2^128.", "syntax": "vadduqm vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 256", "hex_opcode": "0x10000100", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "256", "clean": "256"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vadduqm, the sum of the contents of vector registers VRA and VRB is placed into vector register VRT. The operation is performed modulo 2^128.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsrc1 ←EXTZ(VSR[VRA+32])\nsrc2 ←EXTZ(VSR[VRB+32])\nVSR[VRT+32] ←CHOP128(src1 + src2)", "page_found": "Page 354 - 355", "special_registers": "MSR", "programming_notes": "This instruction is used for adding two 128-bit unsigned integers stored in vector registers modulo 2^128. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set to 1; otherwise, a Vector_Unavailable exception will be raised. The operation does not require any specific alignment for the data being processed.", "example": "vadduqm vd, va, vb"}
{"mnemonic": "vsubuqm", "architecture": "PowerISA", "full_name": "Vector Subtract Unsigned Quadword Modulo", "summary": "Subtracts the contents of two vector registers and places the result in another vector register, modulo operation.", "syntax": "vsubuqm vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | 1280", "hex_opcode": "0x10000500", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1280", "clean": "1280"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vsubuqm, the unsigned quadword subtraction of the contents of VSR[VRA+32] and the one's complement of VSR[VRB+32], plus 1, is placed into VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsrc1 ←EXTZ(VSR[VRA+32])\nsrc2 ←EXTZ(¬VSR[VRB+32])\nVSR[VRT+32] ←CHOP128(src1 + src2 + 1)", "page_found": "Page 362 - 363", "special_registers": "MSR", "programming_notes": "This instruction performs an unsigned quadword subtraction modulo operation. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. Be cautious with alignment as it may affect performance or cause exceptions if not properly aligned. The result is placed in the destination vector register, and developers should handle potential overflow conditions appropriately.", "example": "vsubuqm vd, va, vb"}
{"mnemonic": "vrlq", "architecture": "PowerISA", "full_name": "Vector Rotate Left Quadword", "summary": "Rotates the contents of a vector register left by a specified number of bits.", "syntax": "vrlq vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 260", "hex_opcode": "0x10000005", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "260", "clean": "260"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Rotates the 128-bit contents of the source vector left by the number of bits specified in the shift-count register and stores the result in the destination vector. The rotate amount is taken modulo 128; bits shifted out the left end wrap around to the right. No condition flags are affected; this is a VMX/AltiVec instruction.", "pseudocode": "shiftAmount ← vB[121:127] mod 128\nvD[0:127] ← (vA[0:127] << shiftAmount) | (vA[0:127] >> (128 - shiftAmount))", "page_found": "Page 432 - 433", "special_registers": "MSR", "programming_notes": "The vrlq instruction is used to perform a left rotation of 128 bits in a vector register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The shift amount is determined by the upper 7 bits of another vector register, so ensure these bits are set correctly to avoid unexpected results.", "example": "vrlq vd, va, vb"}
{"mnemonic": "vslq", "architecture": "PowerISA", "full_name": "Vector Shift Left Quadword", "summary": "Shifts the contents of a vector register left by a specified number of bits.", "syntax": "vslq vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 261", "hex_opcode": "0x10000105", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "261", "clean": "261"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Shift Count Vector Register"}], "extension": "VMX (AltiVec)", "description": "Shifts the 128-bit contents of the source vector left by the number of bits specified in the shift-count register and stores the result in the destination vector. Bits shifted out the left end are discarded; zeros are shifted in from the right. The shift amount is taken modulo 128. No condition flags are affected; this is a VMX/AltiVec instruction.", "pseudocode": "shiftAmount ← vB[121:127] mod 128\nvD[0:127] ← vA[0:127] << shiftAmount\nvD[shiftAmount:127] ← 0 (shifted-in zeros)", "page_found": "Page 439 - 440", "special_registers": "MSR", "programming_notes": "Ensure that the Vector Facility (MSR.VEC) is enabled before using vslq; otherwise, a Vector_Unavailable exception will occur. The shift amount is determined by the low-order 7 bits of the second source vector register, and shifts greater than 63 bits will result in zero being placed into the destination register.", "example": "vslq vd, va, vb"}
{"mnemonic": "vsrq", "architecture": "PowerISA", "full_name": "Vector Shift Right Quadword", "summary": "Shifts the contents of a vector register right by a specified number of bits.", "syntax": "vsrq vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 517", "hex_opcode": "0x10000205", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "517", "clean": "517"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Shifts the 128-bit contents of the source vector right by the number of bits specified in the shift-count register and stores the result in the destination vector. Bits shifted out the right end are discarded; zeros are shifted in from the left. The shift amount is taken modulo 128. No condition flags are affected; this is a VMX/AltiVec instruction.", "pseudocode": "shiftAmount ← vB[121:127] mod 128\nvD[0:127] ← vA[0:127] >> shiftAmount\nvD[0:(127-shiftAmount)] ← 0 (shifted-in zeros)", "page_found": "Page 442 - 443", "special_registers": "MSR", "programming_notes": "The vsrq instruction requires the Vector Facility to be enabled in the MSR register. Ensure that the shift amount is within the range of 0-127 bits to avoid unexpected results. The operation is performed on quadword elements, so alignment considerations are not necessary for this specific instruction.", "example": "vsrq vd, va, vb"}
{"mnemonic": "vsraq", "architecture": "PowerISA", "full_name": "Vector Shift Right Algebraic Quadword", "summary": "Shifts the contents of a vector register right algebraically by a specified number of bits.", "syntax": "vsraq vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 773", "hex_opcode": "0x10000305", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "773", "clean": "773"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Data"}, {"name": "vB", "desc": "Shift"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Shift Count Vector Register"}], "extension": "VMX (AltiVec)", "description": "Shifts the 128-bit contents of vector register vA right algebraically (with sign extension) by the number of bits specified in the low 7 bits of vB, placing the result in vD. Each of the two 64-bit doublewords in vA is independently shifted right with sign extension. No condition register or status field modifications occur.", "pseudocode": "shift_amount ← vB[57:63]\nvD ← arithmetic_shift_right(vA, shift_amount)", "page_found": "Page 445 - 446", "special_registers": "MSR", "programming_notes": "The vsraq instruction is used for performing algebraic right shifts on quadword vector elements. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set to 1; otherwise, a Vector_Unavailable exception will be raised. The shift amount is derived from the low-order 7 bits of the second source register, and the result is stored in the destination register. Be cautious with alignment as it affects performance and correctness.", "example": "vsraq vd, va, vb"}
{"mnemonic": "vmulhsw", "architecture": "PowerISA", "full_name": "Vector Multiply High Signed Word", "summary": "Multiplies the signed integer values in each word element of two vector registers and places the high-order 32 bits of the 64-bit product into the corresponding word element of a third vector register.", "syntax": "vmulhsw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 904", "hex_opcode": "0x10000389", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "904", "clean": "904"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmulhsw, the signed integer value in word element i of VSR[VRA+32] is multiplied by the signed integer value in word element i of VSR[VRB+32]. The high-order 32 bits of the 64-bit product are placed into word element i of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ←EXTS(VSR[VRA+32].word[i])\n    src2 ←EXTS(VSR[VRB+32].word[i])\n    VSR[VRT+32].word[i] ←CHOP32((src1 × src2) >> 32)\nend", "page_found": "Page 373 - 374", "special_registers": "MSR", "programming_notes": "This instruction is used for multiplying signed integers stored in the high half of vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation processes four 32-bit words per vector register, and the result is the high-order 32 bits of each 64-bit product. Be cautious with overflow conditions as they are not handled by this instruction.", "example": "vmulhsw vd, va, vb"}
{"mnemonic": "vmulhuw", "architecture": "PowerISA", "full_name": "Vector Multiply High Unsigned Word", "summary": "Multiplies unsigned words, returning the high 32 bits.", "syntax": "vmulhuw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 648", "hex_opcode": "0x10000289", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "648", "clean": "648"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Multiplies each pair of unsigned 32-bit words from vA and vB, producing 64-bit products, and places the high 32 bits of each product into the corresponding 32-bit word of vD. Four independent word multiplications are performed. No condition register or status field modifications occur.", "pseudocode": "for i = 0 to 3 do\n  product ← (vA[i*32:(i+1)*32]) × (vB[i*32:(i+1)*32])\n  vD[i*32:(i+1)*32] ← product[32:63]\nend for", "page_found": "Page 374", "special_registers": "MSR", "programming_notes": "The vmulhuw instruction is used for multiplying pairs of unsigned 32-bit integers from two source vectors and storing the high-order 32 bits of each product in a destination vector. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set to 1; otherwise, a Vector_Unavailable exception will be raised. This instruction operates on 128-bit vectors, so ensure proper alignment and ordering of data for accurate results.", "example": "vmulhuw vd, va, vb"}
{"mnemonic": "vmulhsd", "architecture": "PowerISA", "full_name": "Vector Multiply High Signed Doubleword", "summary": "Multiplies the signed doublewords of two vector registers and stores the high-order 64 bits of each product in a result vector register.", "syntax": "vmulhsd vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 968", "hex_opcode": "0x100003C9", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "968", "clean": "968"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vmulhsd, the signed integer value in doubleword element i of VSR[VRA+32] is multiplied by the signed integer value in doubleword element i of VSR[VRB+32]. The high-order 64 bits of the 128-bit product are placed into doubleword element i of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    src1 ←EXTS(VSR[VRA+32].dword[i])\n    src2 ←EXTS(VSR[VRB+32].dword[i])\n    VSR[VRT+32].dword[i] ←CHOP64((src1 × src2) >> 64)\nend", "page_found": "Page 374 - 375", "special_registers": "MSR", "programming_notes": "This instruction is used for high-precision multiplication of signed doublewords. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation is performed on each pair of doubleword elements from the input vectors, and only the high 64 bits of the 128-bit product are stored in the result vector. Be cautious of overflow conditions as they can lead to unexpected results.", "example": "vmulhsd vd, va, vb"}
{"mnemonic": "vmulhud", "architecture": "PowerISA", "full_name": "Vector Multiply High Unsigned Doubleword", "summary": "Multiplies unsigned doublewords, returning the high 64 bits.", "syntax": "vmulhud vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 712", "hex_opcode": "0x100002C9", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "712", "clean": "712"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VMX (AltiVec)", "description": "Multiplies each pair of unsigned 64-bit doublewords from vA and vB, producing 128-bit products, and places the high 64 bits of each product into the corresponding 64-bit doubleword of vD. Two independent doubleword multiplications are performed. No condition register or status field modifications occur.", "pseudocode": "for i = 0 to 1 do\n  product ← (vA[i*64:(i+1)*64]) × (vB[i*64:(i+1)*64])\n  vD[i*64:(i+1)*64] ← product[64:127]\nend for", "page_found": "Page 375", "special_registers": "MSR", "programming_notes": "The vmulhud instruction is used for high-precision multiplication of unsigned doublewords. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. This instruction processes each pair of elements from two source vectors and stores the upper 64 bits of their product in the destination vector. Be cautious with alignment as unaligned access can lead to exceptions.", "example": "vmulhud vd, va, vb"}
{"mnemonic": "xxlandc", "architecture": "PowerISA", "full_name": "VSX Vector Logical AND with Complement", "summary": "vD = vA & ~vB", "syntax": "xxlandc XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 444", "hex_opcode": "0xF0000450", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "444", "clean": "444"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Performs a bitwise logical AND operation between XT and the bitwise complement of XB, storing the result in XT. The operation is XT ← XT & ~XB on all 128 bits. No condition register or status field modifications occur.", "pseudocode": "XT ← XA & ~XB", "page_found": "Page 943", "special_registers": "MSR", "programming_notes": "The xxlandc instruction is used for performing a bitwise logical AND operation between the contents of two vector registers, where one register's bits are complemented before the operation. Ensure that the VSX (Vector Scalar Extensions) facility is enabled in the MSR (Machine State Register) to avoid an exception. This instruction operates on 128-bit vectors and requires proper alignment of the input and output registers.", "example": "xxlandc vs1, vs2, vs3"}
{"mnemonic": "xxlorc", "architecture": "PowerISA", "full_name": "VSX Vector Logical OR with Complement", "summary": "vD = vA | ~vB", "syntax": "xxlorc XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 452", "hex_opcode": "0xF0000550", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "452", "clean": "452"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Performs a bitwise logical OR operation between XA and the bitwise complement of XB, storing the result in XT. The operation is XT ← XA | ~XB on all 128 bits. No condition register or status field modifications occur.", "pseudocode": "XT ← XA | ~XB", "page_found": "Page 944", "special_registers": "MSR", "programming_notes": "The xxlorc instruction is useful for performing bitwise operations on VSX registers. Ensure that the VSX facility is enabled by checking and setting the MSR.VSX bit; otherwise, a VSX_Unavailable exception will occur. The operation is performed on 128-bit vectors, so ensure proper alignment of the data in the registers to avoid unexpected results.", "example": "xxlorc vs1, vs2, vs3"}
{"mnemonic": "xxlnand", "architecture": "PowerISA", "full_name": "VSX Vector Logical NAND", "summary": "vD = ~(vA & vB)", "syntax": "xxlnand XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 442", "hex_opcode": "0xF0000590", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "442", "clean": "442"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Performs a bitwise logical NAND operation on XA and XB, storing the result in XT. The operation is XT ← ~(XA & XB) on all 128 bits. No condition register or status field modifications occur.", "pseudocode": "XT ← ~(XA & XB)", "page_found": "Page 943", "programming_notes": "The xxlnand instruction is commonly used for bitwise logical operations in VSX registers. Ensure that the source and target registers are properly aligned to avoid alignment faults. This instruction operates at user privilege level, but care should be taken to handle potential exceptions if unaligned access occurs.", "example": "xxlnand vs1, vs2, vs3"}
{"mnemonic": "xxleqv", "architecture": "PowerISA", "full_name": "VSX Vector Logical Equivalence", "summary": "vD = ~(vA ^ vB) (XNOR)", "syntax": "xxleqv XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 458", "hex_opcode": "0xF00005D0", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "458", "clean": "458"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Performs a bitwise logical equivalence (XNOR) operation on XA and XB, storing the result in XT. The operation is XT ← ~(XA ^ XB) on all 128 bits, producing all 1-bits where XA and XB have the same bit value. No condition register or status field modifications occur.", "pseudocode": "XT ← ~(XA ^ XB)", "page_found": "Page 943", "programming_notes": "The xxleqv instruction is used to perform a vector logical equivalence operation between two VSX registers. It's useful for comparing vectors and determining where elements are not equal, as it effectively computes the bitwise NOT of the equality result. Ensure that the input registers (XA and XB) are properly aligned and contain valid data to avoid unexpected results. This instruction operates at the user privilege level and does not generate exceptions under normal conditions.", "example": "xxleqv vs1, vs2, vs3"}
{"mnemonic": "vgbbd", "architecture": "PowerISA", "full_name": "Vector Gather Bits by Bytes by Doubleword", "summary": "The contents of bit j of each byte of doubleword element i of VSR[VRB+32] are concatenated and placed into byte j of doubleword element i of VSR[VRT+32].", "syntax": "vgbbd vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "0 | 6 | 11 | 16 | 21 | 31", "hex_opcode": "0x1000050C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1282", "clean": "1282"}], "length": "32", "bit_positions": "0 | 6 | 11 | 16 | 21 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vgbbd, the contents of bit j of each byte of doubleword element i of VSR[VRB+32] are concatenated and placed into byte j of doubleword element i of VSR[VRT+32]. An 8-bit × 8-bit bit-matrix transpose is performed on the contents of each doubleword element of VSR[VRB+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    do j = 0 to 7\n        do k = 0 to 7\n            b ← VSR[VRB+32].dword[i].byte[k].bit[j]\n            VSR[VRT+32].dword[i].byte[j].bit[k] ← b\n        end\n    end\nend", "page_found": "Page 468 - 469", "special_registers": "MSR", "programming_notes": "The vgbbd instruction performs a bit-matrix transpose on each doubleword element of the source vector, effectively rotating bits within bytes. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This operation requires aligned access to the vector registers. Be cautious with privilege levels; this instruction may require supervisor or hypervisor mode depending on system configuration.", "example": "vgbbd vd, vb"}
{"mnemonic": "vpdepd", "architecture": "PowerISA", "full_name": "Vector Parallel Bits Deposit Doubleword", "summary": "Deposits bits from source to target under control of a mask (Power10).", "syntax": "vpdepd vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1485", "hex_opcode": "0x100005CD", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1485", "clean": "1485"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source"}, {"name": "vB", "desc": "Mask"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Mask Vector Register"}], "extension": "VMX (AltiVec)", "description": "The contents of bits in doubleword element i of VSR[VRT+32] corresponding to bits in doubleword element i of VSR[VRB+32] that contain a 0 are set to 0. The contents of the rightmost n bits of doubleword element i of VSR[VRA+32] are placed into doubleword element i of VSR[VRT+32] under control of the mask in doubleword element i of VSR[VRB+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    VSR[VRT+32].dword[i] ←0\n    m ←0\n    k ←0\n    do while(m < 64)\n        if VSR[VRB+32].dword[i].bit[63-m]=1 then do\n            result ←VSR[VRA+32].dword[i].bit[63-k]\n            VSR[VRT+32].dword[i].bit[63-m] ←result\n            k ←k + 1\n        end\n        m ←m + 1\n    end\nend", "page_found": "Page 477 - 478", "special_registers": "MSR", "programming_notes": "The vpdepd instruction is used to deposit bits from one vector register into another based on a mask specified in a third vector register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The operation processes each doubleword element independently, and the alignment of the input vectors must be considered to avoid unexpected results. This instruction is particularly useful for bit manipulation tasks where selective depositing of bits is required.", "example": "vpdepd vd, va, vb"}
{"mnemonic": "vpextd", "architecture": "PowerISA", "full_name": "Vector Parallel Bits Extract Doubleword", "summary": "Extracts bits from one vector register based on the bit positions specified in another vector register and places them into a third vector register.", "syntax": "vpextd vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1421", "hex_opcode": "0x1000058D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1421", "clean": "1421"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source"}, {"name": "vB", "desc": "Mask"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register A"}, {"name": "VRB", "desc": "Source Vector Register B"}], "extension": "VMX (AltiVec)", "description": "Extracts bits from vA based on bit-position indices specified in vB, placing extracted bits into the corresponding doubleword elements of vD. The instruction operates on 64-bit doubleword elements, where vB contains bit indices (0-63) that select which bits from vA are gathered into vD. This is a VMX extension instruction with no condition register or status flag updates.", "pseudocode": "for i in 0 to 1 do\n  vD[i*64:(i+1)*64] ← 0\n  for j in 0 to 63 do\n    if vB[i*64+j] < 64 then\n      vD[i*64+j] ← vA[i*64 + vB[i*64+j:i*64+j+5]]\n    else\n      vD[i*64+j] ← 0", "page_found": "Page 478 - 479", "special_registers": "MSR", "programming_notes": "The vpextd instruction is used to extract bits from one vector register based on the bit positions specified in another vector register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. This operation is performed on each doubleword element of the vectors, so ensure proper alignment and indexing to avoid unexpected results.", "example": "vpextd vd, va, vb"}
{"mnemonic": "vcfuged", "architecture": "PowerISA", "full_name": "Vector Centrifuge Doubleword", "summary": "Separates bits of source into two groups based on mask (Power10).", "syntax": "vcfuged vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1357", "hex_opcode": "0x1000054D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1357", "clean": "1357"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source"}, {"name": "vB", "desc": "Mask"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Mask Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcfuged, the bits of VSR[VRA+32] are rearranged based on the mask in VSR[VRB+32]. Bits corresponding to 1s in the mask are placed in the rightmost positions, and other bits are placed in the leftmost positions.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    ptr0 ←0\n    ptr1 ←0\n    do j = 0 to 63\n        if VSR[VRB+32].dword[i].bit[j]=0b0 then do\n            result.bit[ptr0] ←\n               VSR[VRA+32].dword[i].bit[j]\n            ptr0 ←ptr0 + 1\n        end\n        if VSR[VRB+32].dword[i].bit[63-j]=1 then do\n            result.bit[63-ptr1] ←\n               VSR[VRA+32].dword[i].bit[63-j]\n            ptr1 ←ptr1 + 1\n        end\n    end\n    VSR[VRT+32].dword[i] ←result\nend", "page_found": "Page 479 - 480", "special_registers": "MSR", "programming_notes": "The vcfuged instruction rearranges bits in a vector register based on a mask from another vector register. Ensure the Vector Facility is enabled by checking and setting the MSR.VEC bit. The operation processes each doubleword independently, moving bits to the right or left based on the mask's 0s and 1s. Be cautious of alignment issues when accessing vector registers.", "example": "vcfuged vd, va, vb"}
{"mnemonic": "vgnb", "architecture": "PowerISA", "full_name": "Vector Gather Non-Zero Bytes", "summary": "Gathers every Nth bit from a vector register and places it into a general-purpose register.", "syntax": "vgnb vD, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | UIM | vB | 1228", "hex_opcode": "0x100004CC", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "1228", "clean": "1228"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "UIM", "desc": "Stream"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "N", "desc": "Gather interval (2 to 7)"}], "extension": "VMX (AltiVec)", "description": "Gathers every Nth bit (where N is 2-7 as specified by UIM) from vector register vB and packs them into a 64-bit general-purpose register. The bits are gathered starting from bit 0 of vB and compacted into the lower bits of the result; unused upper bits are zeroed. This is a VMX extension instruction with no condition register or status flag updates.", "pseudocode": "N ← UIM\nresult ← 0\nbit_pos ← 0\nfor i in 0 to 127 by N do\n  if i < 128 then\n    result[bit_pos] ← vB[i]\n    bit_pos ← bit_pos + 1\nvD[0:63] ← result", "programming_notes": "N must be between 2 and 7 inclusive.", "page_found": "Page 469 - 470", "special_registers": "MSR", "example": "vgnb vd, vb, uim"}
{"mnemonic": "vclrlb", "architecture": "PowerISA", "full_name": "Vector Clear Left Bytes", "summary": "Clears the leftmost bytes in a vector register based on the value in a general-purpose register.", "syntax": "vclrlb vD, vA, RB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | RB | 397", "hex_opcode": "0x1000018D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "RB", "clean": "RB"}, {"raw": "397", "clean": "397"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source"}, {"name": "RB", "desc": "Count (GPR)"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The contents of VSR[VRA+32] are placed into VSR[VRT+32] with the leftmost 16-N bytes set to 0, where N is the integer value in GPR[RB] or 16 if GPR[RB] > 15.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nN ← (GPR[RB] > 15) ? 16 : GPR[RB]\ndo i = 0 to N-1\n    VSR[VRT+32].byte[15-i] ← VSR[VRA+32].byte[15-i]\nend\ndo i = N to 15\n    VSR[VRT+32].byte[15-i] ← 0x00\nend", "page_found": "Page 499 - 500", "special_registers": "MSR", "programming_notes": "The vclrlb instruction is useful for clearing the leftmost bytes of a vector register based on the value in GPR[RB]. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. Be cautious with alignment and ensure that the values in VRA and VRT are correctly set to avoid unintended data manipulation.", "example": "vclrlb vd, va, r5"}
{"mnemonic": "vclrrb", "architecture": "PowerISA", "full_name": "Vector Clear Right Bytes", "summary": "Clears the N rightmost bytes of a vector.", "syntax": "vclrrb vD, vA, RB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | RB | 461", "hex_opcode": "0x100001CD", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "RB", "clean": "RB"}, {"raw": "461", "clean": "461"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source"}, {"name": "RB", "desc": "Count (GPR)"}], "extension": "VMX (AltiVec)", "description": "Clears the rightmost N bytes of vector register vA (where N is derived from the low 4 bits of RB) and places the result in vD. Bits corresponding to the rightmost N bytes are set to zero while remaining bits are preserved. This is a VMX extension instruction with no condition register or status flag updates.", "pseudocode": "N ← RB[60:63]\nif N > 16 then N ← 16\nvD ← vA\nfor i in 0 to N-1 do\n  vD[128-8*(i+1):128-8*i] ← 0", "page_found": "Page 500", "special_registers": "MSR", "programming_notes": "The vclrrb instruction is useful for clearing the rightmost bytes of a vector register based on a specified count. Ensure that the Vector Facility (MSR.VEC) is enabled to avoid a Vector_Unavailable exception. The value in GPR[RB] should be between 0 and 15; values greater than 15 will result in all bytes being cleared. This instruction operates on vector registers, so ensure proper alignment and privilege level as required by the system.", "example": "vclrrb vd, va, r5"}
{"mnemonic": "plq", "architecture": "PowerISA", "full_name": "Prefixed Load Quadword", "summary": "Loads 128 bits into two GPRs using a 34-bit offset.", "syntax": "plq RTp, D(RA), R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 56 | RT | RA | D1", "hex_opcode": "0x04000000E0000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "...", "clean": "..."}, {"raw": "56", "clean": "56"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RTp", "desc": "Target Pair"}, {"name": "D", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "R", "desc": "PC-Rel"}], "extension": "Prefixed", "description": "Prefixed load of 128 bits from memory into two consecutive general-purpose registers (RT and RT+1) using a 34-bit signed offset. The effective address is computed as RA + D (if R=0) or the prefixed address. This is a prefixed instruction requiring the Prefixed extension; no condition register or status flags are affected.", "pseudocode": "if RA = 0 then\n  EA ← D\nelse\n  EA ← (RA) + D\nRT ← [EA]\nRT+1 ← [EA+8]", "page_found": "Page 99", "programming_notes": "The plq instruction is used to load a quadword from memory into an even-odd pair of GPRs. Ensure that the effective address (EA) is properly aligned to 16 bytes for optimal performance and to avoid alignment exceptions. This instruction operates at the problem state privilege level, so it cannot be executed in supervisor or hypervisor states.", "example": "plq r4, 0(r4), 0"}
{"mnemonic": "pstq", "architecture": "PowerISA", "full_name": "Prefixed Store Quadword", "summary": "Stores 128 bits from two GPRs using a 34-bit offset.", "syntax": "pstq RSp, D(RA), R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 60 | RS | RA | D1", "hex_opcode": "0x04000000F0000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "...", "clean": "..."}, {"raw": "60", "clean": "60"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RSp", "desc": "Src Pair"}, {"name": "D", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "R", "desc": "PC-Rel"}], "extension": "Prefixed", "description": "Prefixed store of 128 bits from two consecutive general-purpose registers (RS and RS+1) to memory using a 34-bit signed offset. The effective address is computed as RA + D (if R=0) or the prefixed address. This is a prefixed instruction requiring the Prefixed extension; no condition register or status flags are affected.", "pseudocode": "if RA = 0 then\n  EA ← D\nelse\n  EA ← (RA) + D\n[EA] ← RS\n[EA+8] ← RS+1", "page_found": "Page 100", "special_registers": "CIA", "programming_notes": "The pstq instruction is used to store a quadword from registers RSp and RSp+1 into memory. It calculates the effective address based on the base register RA, displacement, and current instruction address CIA, depending on the prefix field R. Ensure proper alignment for optimal performance and be aware of byte ordering differences between Big-Endian and Little-Endian systems.", "example": "pstq r4, 0(r4), 0"}
{"mnemonic": "xxmrghw", "architecture": "PowerISA", "full_name": "VSX Vector Merge High Word", "summary": "Merges the high words of two VSX registers into a target VSX register.", "syntax": "xxmrghw XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "18 | T | A | B | AX | BX | TX", "hex_opcode": "0xF0000090", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "18", "clean": "18"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Merges the high-order words (words 0 and 1) from VSX registers XA and XB into XT, interleaving them as: XT[0:31] ← XA[0:31], XT[32:63] ← XB[0:31], XT[64:95] ← XA[32:63], XT[96:127] ← XB[32:63]. This is a VSX instruction with no condition register or status flag updates.", "pseudocode": "XT[0:31] ← XA[0:31]\nXT[32:63] ← XB[0:31]\nXT[64:95] ← XA[32:63]\nXT[96:127] ← XB[32:63]", "page_found": "Page 953 - 954", "special_registers": "MSR", "programming_notes": "The xxmrghw instruction is commonly used to merge high words from two vector registers into a third register. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register; otherwise, a VSX_Unavailable exception will be raised. This instruction operates on 128-bit vectors and requires proper alignment of the input registers for optimal performance.", "example": "xxmrghw vs1, vs2, vs3"}
{"mnemonic": "xxmrglw", "architecture": "PowerISA", "full_name": "VSX Vector Merge Low Word", "summary": "Merges low words from two VSRs.", "syntax": "xxmrglw XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 82", "hex_opcode": "0xF0000190", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "82", "clean": "82"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "Merges the low-order words (words 2 and 3) from VSX registers XA and XB into XT, interleaving them as: XT[0:31] ← XA[64:95], XT[32:63] ← XB[64:95], XT[64:95] ← XA[96:127], XT[96:127] ← XB[96:127]. This is a VSX instruction with no condition register or status flag updates.", "pseudocode": "XT[0:31] ← XA[64:95]\nXT[32:63] ← XB[64:95]\nXT[64:95] ← XA[96:127]\nXT[96:127] ← XB[96:127]", "page_found": "Page 954", "special_registers": "MSR", "programming_notes": "The xxmrglw instruction is commonly used for merging specific word elements from two VSX vectors into a new vector. Ensure that the VSX facility is enabled by checking and setting the appropriate bit in the MSR register. This instruction operates on 128-bit vectors, so source and destination registers must be properly aligned. Be cautious of potential exceptions if the VSX facility is not available or if there are alignment issues with the vector registers.", "example": "xxmrglw vs1, vs2, vs3"}
{"mnemonic": "vexpandbm", "architecture": "PowerISA", "full_name": "Vector Expand Byte Mask", "summary": "Expands the mask from bit 0 of each byte element in the source VSR to all bits in the corresponding element in the target VSR.", "syntax": "vexpandbm vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | 0 | VRB | 1602", "hex_opcode": "0x10000642", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1602", "clean": "1602"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Expands the mask bit (bit 0) of each byte element in vB to all 8 bits of the corresponding byte in vD. If vB[byte][0] = 1, the entire byte in vD becomes 0xFF; if vB[byte][0] = 0, the entire byte in vD becomes 0x00. This is a VMX extension instruction with no condition register or status flag updates.", "pseudocode": "for i in 0 to 15 do\n  if vB[i*8] = 1 then\n    vD[i*8:(i+1)*8] ← 0xFF\n  else\n    vD[i*8:(i+1)*8] ← 0x00", "page_found": "Page 489 - 490", "special_registers": "MSR", "programming_notes": "The vexpandbm instruction is useful for creating masks where each byte is either all zeros or all ones based on the least significant bit of the corresponding source byte. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. This operation is efficient for processing data in parallel across multiple bytes.", "example": "vexpandbm vd, vb"}
{"mnemonic": "vexpandhm", "architecture": "PowerISA", "full_name": "Vector Expand Halfword Mask", "summary": "Expands bits from a GPR mask into a halfword-element vector.", "syntax": "vexpandhm vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1666", "hex_opcode": "0x10010642", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1666", "clean": "1666"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Expands individual bits from a source vector register into halfword-sized elements in the destination vector register, where each bit controls whether the corresponding halfword is set to all 1s or all 0s. This is a VMX instruction with no effect on condition registers or status fields.", "pseudocode": "for i in 0 to 7 do\n  if vB[i] = 1 then\n    vD[i*16:(i+1)*16-1] ← 0xFFFF\n  else\n    vD[i*16:(i+1)*16-1] ← 0x0000\n  end if\nend for", "page_found": "Page 490", "special_registers": "MSR", "programming_notes": "The vexpandhm instruction is useful for creating masks based on the least significant bit of each halfword in the source vector. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set to 1 before using this instruction, as attempting to execute it with VEC=0 will result in a Vector Unavailable exception. This instruction operates on 8 halfwords per vector register and does not require any specific alignment of the data.", "example": "vexpandhm vd, vb"}
{"mnemonic": "vexpandwm", "architecture": "PowerISA", "full_name": "Vector Expand Word Mask", "summary": "Expands bits from a GPR mask into a word-element vector.", "syntax": "vexpandwm vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | 2 | VRB | 1602", "hex_opcode": "0x10020642", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1730", "clean": "1730"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vexpandwm, each word element of VSR[VRT+32] is set to all 0s or all 1s based on the value of bit 0 of the corresponding word element in VSR[VRB+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    let bmi be the contents of bit 0 of word element i of VSR[VRB+32]\n    if bmi is equal to 0 then\n        VSR[VRT+32].word[i] ←0xFFFF_FFFF\n    else\n        VSR[VRT+32].word[i] ←0x0000_0000\nend", "page_found": "Page 490 - 491", "special_registers": "MSR", "programming_notes": "The vexpandwm instruction sets each word in the destination vector to all 1s or all 0s based on the least significant bit of the corresponding word in the source vector. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates on 32-bit words, so ensure proper alignment if manipulating data directly. The operation is performed on vectors, so verify that the input vectors are correctly loaded before execution.", "example": "vexpandwm vd, vb"}
{"mnemonic": "vexpanddm", "architecture": "PowerISA", "full_name": "Vector Expand Doubleword Mask", "summary": "Expands bits from a GPR mask into a doubleword-element vector.", "syntax": "vexpanddm vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1794", "hex_opcode": "0x10030642", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1794", "clean": "1794"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Expands individual bits from a source vector register into doubleword-sized elements in the destination vector register, where each bit controls whether the corresponding doubleword is set to all 1s or all 0s. This is a VMX instruction with no effect on condition registers or status fields.", "pseudocode": "for i in 0 to 3 do\n  if vB[i] = 1 then\n    vD[i*64:(i+1)*64-1] ← 0xFFFFFFFFFFFFFFFF\n  else\n    vD[i*64:(i+1)*64-1] ← 0x0000000000000000\n  end if\nend for", "page_found": "Page 491", "special_registers": "MSR", "programming_notes": "This instruction is useful for creating masks where each doubleword element in the target vector register is either all ones or all zeros based on the least significant bit of the corresponding source vector element. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set to 1; otherwise, a Vector Unavailable exception will be raised. The instruction operates on doubleword elements, so ensure proper alignment and indexing when using this instruction.", "example": "vexpanddm vd, vb"}
{"mnemonic": "vexpandqm", "architecture": "PowerISA", "full_name": "Vector Expand Quadword Mask", "summary": "Expands bits from a GPR mask into a quadword-element vector.", "syntax": "vexpandqm vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1858", "hex_opcode": "0x10040642", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1858", "clean": "1858"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Expands individual bits from a source vector register into quadword-sized elements in the destination vector register, where each bit controls whether the corresponding quadword is set to all 1s or all 0s. This is a VMX instruction with no effect on condition registers or status fields.", "pseudocode": "for i in 0 to 1 do\n  if vB[i] = 1 then\n    vD[i*128:(i+1)*128-1] ← 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n  else\n    vD[i*128:(i+1)*128-1] ← 0x00000000000000000000000000000000\n  end if\nend for", "page_found": "Page 491 - 492", "special_registers": "MSR", "programming_notes": "The vexpandqm instruction is used to set all elements in a vector register based on the value of a single mask bit. Ensure that the Vector Facility (VEC) is enabled in the MSR before using this instruction; otherwise, it will raise an exception. This instruction is useful for quickly initializing vectors with either all ones or all zeros based on a condition.", "example": "vexpandqm vd, vb"}
{"mnemonic": "vextractbm", "architecture": "PowerISA", "full_name": "Vector Extract Byte Mask", "summary": "Extracts bit 0 of each byte element from a VSR into a GPR.", "syntax": "vextractbm RA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | RT | 8 | VRB | 1602", "hex_opcode": "0x10080642", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1602", "clean": "1602"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The contents of bit 0 of each byte element of VSR[VRB+32] are concatenated and placed into bits 48:63 of GPR[RT]. Bits 0:47 of GPR[RT] are set to 0.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    GPR[RT].bit[48+i] ← VSR[VRB+32].byte[i].bit[0]\nend\nGPR[RT].bit[0:47] ← 0", "page_found": "Page 494 - 495", "special_registers": "MSR", "programming_notes": "This instruction is used to extract the least significant bit from each byte of a vector register and pack them into the upper half of a general-purpose register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The lower half of the target GPR is always zeroed out, so be cautious if you need to preserve existing data in that portion.", "example": "vextractbm r4, vb"}
{"mnemonic": "vextracthm", "architecture": "PowerISA", "full_name": "Vector Extract Halfword Mask", "summary": "Extracts MSB of each halfword into a GPR mask.", "syntax": "vextracthm RA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | RA | 0 | vB | 1666", "hex_opcode": "0x10090642", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1666", "clean": "1666"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Extracts the most significant bit from each halfword element in the source vector and packs these bits into a general-purpose register as a mask. This is a VMX instruction with no effect on condition registers or status fields.", "pseudocode": "result ← 0\nfor i in 0 to 7 do\n  if vB[i*16] = 1 then\n    result[i] ← 1\n  else\n    result[i] ← 0\n  end if\nend for\nRA ← result", "page_found": "Page 495", "special_registers": "MSR", "programming_notes": "The vextracthm instruction is useful for extracting the least significant bit of each halfword from a vector register and placing them into a general-purpose register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The upper 16 bits of the destination GPR will contain the extracted bits, with the lower 48 bits set to zero.", "example": "vextracthm r4, vb"}
{"mnemonic": "vextractwm", "architecture": "PowerISA", "full_name": "Vector Extract Word Mask", "summary": "Extracts the least significant bit of each word element from a vector register and places them into a general-purpose register.", "syntax": "vextractwm RA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | RA | 0 | vB | 1730", "hex_opcode": "0x100A0642", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1730", "clean": "1730"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The contents of bit 0 of each word element of VSR[VRB+32] are concatenated and placed into bits 60:63 of GPR[RT]. Bits 0:59 of GPR[RT] are set to 0.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    GPR[RT].bit[60+i] ← VSR[VRB+32].word[i].bit[0]\nend\nGPR[RT].bit[0:59] ← 0", "page_found": "Page 495 - 496", "special_registers": "MSR", "programming_notes": "This instruction is used to extract the least significant bit of each word from a vector register and pack them into the upper four bits of a general-purpose register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The lower 60 bits of the target GPR are always cleared, so be cautious if you need to preserve existing data in those positions.", "example": "vextractwm r4, vb"}
{"mnemonic": "vextractdm", "architecture": "PowerISA", "full_name": "Vector Extract Doubleword Mask", "summary": "Extracts MSB of each doubleword into a GPR mask.", "syntax": "vextractdm RA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | RA | 0 | vB | 1794", "hex_opcode": "0x100B0642", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1794", "clean": "1794"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Extracts the most significant bit from each doubleword element in the source vector and packs these bits into a general-purpose register as a mask. This is a VMX instruction with no effect on condition registers or status fields.", "pseudocode": "result ← 0\nfor i in 0 to 3 do\n  if vB[i*64] = 1 then\n    result[i] ← 1\n  else\n    result[i] ← 0\n  end if\nend for\nRA ← result", "page_found": "Page 496", "special_registers": "MSR", "programming_notes": "This instruction is useful for extracting the least significant bit of each doubleword in a vector register and placing it into a general-purpose register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The result is stored in bits 62:63 of the target GPR, with all other bits set to zero.", "example": "vextractdm r4, vb"}
{"mnemonic": "vextractqm", "architecture": "PowerISA", "full_name": "Vector Extract Quadword Mask", "summary": "Extracts the least significant bit of a vector register and places it into a general-purpose register.", "syntax": "vextractqm RA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | RA | 0 | vB | 1858", "hex_opcode": "0x100C0642", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1858", "clean": "1858"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The contents of bit 0 of VSR[VRB+32] are placed into bit 63 of GPR[RT]. Bits 0:62 of GPR[RT] are set to 0.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nGPR[RT] ← EXTZ64(VSR[VRB+32].bit[0])", "page_found": "Page 496 - 497", "special_registers": "MSR", "programming_notes": "This instruction extracts the least significant bit from a vector register and places it into the most significant bit of a general-purpose register, setting all other bits in the GPR to zero. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register before using this instruction. This operation is useful for extracting flags or status information from vector operations.", "example": "vextractqm r4, vb"}
{"mnemonic": "mtvsrdd", "architecture": "PowerISA", "full_name": "Move To VSR Double Double", "summary": "Moves the contents of two general-purpose registers into a vector-scalar register (VSR) as doublewords.", "syntax": "mtvsrdd XT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | XT | RA | RB | 435 | /", "hex_opcode": "0x7C000366", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "435", "clean": "435"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "XT", "desc": "Target VSR"}, {"name": "RA", "desc": "High GPR"}, {"name": "RB", "desc": "Low GPR"}], "extension": "VSX", "description": "Moves the contents of two general-purpose registers into a VSR as doublewords, with RA forming the high doubleword and RB forming the low doubleword. This is a VSX instruction that does not affect condition registers or status fields.", "pseudocode": "XT[0:63] ← RA\nXT[64:127] ← RB", "programming_notes": "For TX=0, mtvsrdd is treated as a VSX instruction in terms of resource availability.\nFor TX=1, mtvsrdd is treated as a Vector instruction in terms of resource availability.", "page_found": "Page 160 - 162", "special_registers": "MSR", "example": "mtvsrdd vs1, r4, r5"}
{"mnemonic": "mfvsrld", "architecture": "PowerISA", "full_name": "Move From VSR Lower Doubleword", "summary": "Moves the lower doubleword of a vector register to a general-purpose register.", "syntax": "mfvsrld RA, XS", "encoding": {"format": "XX1-form", "binary_pattern": "31 | XS | RA | 0 | 307", "hex_opcode": "0x7C000266", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XS", "clean": "XS"}, {"raw": "RA", "clean": "RA"}, {"raw": "0", "clean": "0"}, {"raw": "307", "clean": "307"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target GPR"}, {"name": "XS", "desc": "Source VSR"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "VSRL", "desc": "Source Vector Register Lower Doubleword"}], "extension": "VSX", "pseudocode": "RA ← XS[64:127]", "page_found": "Page 1377 - 1378", "description": "Moves the lower doubleword of a VSR to a general-purpose register. This is a VSX instruction that does not affect condition registers or status fields.", "programming_notes": "Use mfvsrld to transfer data from a vector register's lower doubleword into a general-purpose register. Ensure that the VSR index (determined by SX and S fields) is correctly specified to avoid unintended data access. This instruction operates at user privilege level but will raise an exception if executed in supervisor mode with invalid register indices.", "example": "mfvsrld r4, vs1"}
{"mnemonic": "vstribl", "architecture": "PowerISA", "full_name": "Vector String Isolate Byte Left", "summary": "Stores the leftmost byte of each element in a vector register to memory.", "syntax": "vstribl vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | 0 | VRB | Rc | 13", "hex_opcode": "0x1000000D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "518", "clean": "518"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VS32", "desc": "Target Vector Register"}, {"name": "VS31", "desc": "Source Vector Register"}, {"name": "RB", "desc": "Base Address General Purpose Register"}], "extension": "VMX (AltiVec)", "page_found": "Page 1359 - 1360", "description": "Isolates the leftmost non-zero byte in each element of the source vector register and stores the result in the destination vector register. This is a VMX instruction that does not affect condition registers or status fields.", "programming_notes": "The vstribl instruction is useful for extracting the first character from strings stored in vector registers. Ensure that the input vectors are properly aligned to avoid alignment faults. This instruction operates at user privilege level and will raise an exception if executed in a kernel context without proper permissions.", "pseudocode": "for i in 0 to 15 do\n  found ← 0\n  for j in 0 to 7 do\n    if vB[i*8 + j] != 0 then\n      vD[i*8:(i+1)*8-1] ← vB[j*8:(j+1)*8-1]\n      found ← 1\n      break\n    end if\n  end for\n  if found = 0 then\n    vD[i*8:(i+1)*8-1] ← 0\n  end if\nend for", "example": "vstribl vd, vb"}
{"mnemonic": "vstribr", "architecture": "PowerISA", "full_name": "Vector String Isolate Byte Right", "summary": "Isolates the rightmost non-zero byte in a vector string and shifts it to the left.", "syntax": "vstribr VRT,VRB", "encoding": {"format": "VX-form", "binary_pattern": "0 | VRT | VRB | Rc | 13", "hex_opcode": "0x1001000D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "582", "clean": "582"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Isolates the rightmost non-zero byte in each 16-byte element of the source vector and shifts it to the leftmost position of the corresponding result element; all other bytes in the result are zeroed. When Rc=1, the instruction updates CR6 based on whether a zero vector was produced.", "pseudocode": "for i in 0 to 15:\n  byte_value ← VRB[i*8:(i+1)*8]\n  if byte_value ≠ 0 then\n    VRT[i*8:(i+1)*8] ← byte_value\n  else\n    VRT[i*8:(i+1)*8] ← 0\nif Rc = 1 then CR6 ← record_zero_vector(VRT)", "special_registers": "CR6 (if Rc=1)", "page_found": "Page 497 - 498", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vstribr v1, v3"}
{"mnemonic": "xststdcsp", "architecture": "PowerISA", "full_name": "VSX Scalar Test Data Class Single-Precision", "summary": "Tests the data class of a single-precision floating-point value in a VSX register and sets condition bits accordingly.", "syntax": "xststdcsp BF, vB, DCM", "encoding": {"format": "XX2-form", "binary_pattern": "60 | BF | / | DCM | vB | 298", "hex_opcode": "0xF00004A8", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "DCM", "clean": "DCM"}, {"raw": "vB", "clean": "vB"}, {"raw": "298", "clean": "298"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "vB", "desc": "Source"}, {"name": "DCM", "desc": "Mask"}, {"name": "XB", "desc": "Index of VSX register containing the double-precision floating-point value"}, {"name": "DCMX", "desc": "Data Class Mask"}], "extension": "VSX", "description": "The instruction tests the data class of the double-precision floating-point value in the doubleword element 0 of VSR[XB] and sets the corresponding condition bits in CR field BF and FPCC based on the specified data classes in DCMX.", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\nsrc ← VSR[32×BX+B].dword[0]\nexponent ← src.bit[1:11]\nfraction ← src.bit[12:63]\nclass.Infinity ← (exponent = 0x7FF) & (fraction = 0)\nclass.NaN ← (exponent = 0x7FF) & (fraction != 0)\nclass.Zero ← (exponent = 0x000) & (fraction = 0)\nclass.Denormal ← (exponent = 0x000) & (fraction != 0) | (exponent > 0x000) & (exponent < 0x381)\nmatch ← (DCMX.bit[0] & class.NaN) | (DCMX.bit[1] & class.Infinity & !sign) | (DCMX.bit[2] & class.Infinity & sign) | (DCMX.bit[3] & class.Zero & !sign) | (DCMX.bit[4] & class.Zero & sign) | (DCMX.bit[5] & class.Denormal & !sign) | (DCMX.bit[6] & class.Denormal & sign)\nnot_SP_value ← ¬bfp64_IS_BFP32_VALUE(src)\nCR.bit[4×BF] ← FPSCR.FL ← src.sign\nCR.bit[4×BF+1] ← FPSCR.FG ← 0b0\nCR.bit[4×BF+2] ← FPSCR.FE ← match\nCR.bit[4×BF+3] ← FPSCR.FU ← not_SP_value", "special_registers": "CR, FPSCR", "page_found": "Page 903 - 904", "programming_notes": "This instruction is used to test the data class of a single-precision floating-point value in VSX registers. Ensure that the VSX facility is enabled (MSR.VSX=1) before using this instruction, otherwise it will raise an exception. The result sets condition bits in CR and FPSCR, which can be used for conditional branching based on the tested data class. Be cautious with alignment; the source value must be properly aligned within the VSR register to avoid undefined behavior.", "example": "xststdcsp cr0, vb, 0"}
{"mnemonic": "tlbiel", "architecture": "PowerISA", "full_name": "TLB Invalidate Entry Local", "summary": "Invalidates a TLB entry on the current processor only.", "syntax": "tlbiel RS, RIC, PRS, effR", "encoding": {"format": "X-form", "binary_pattern": "0 | RS | RIC | PRS | R | RB", "hex_opcode": "0x7C000224", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "274", "clean": "274"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RB", "desc": "Addr"}, {"name": "RS", "desc": "Source General Purpose Register containing the LPID or PID"}, {"name": "RIC", "desc": "Radix Invalidate Control bits"}, {"name": "PRS", "desc": "Partition Scope bit"}, {"name": "effR", "desc": "Effective Radix bit"}, {"name": "R", "desc": "Effective Register bit, indicates if the operation affects effective registers"}], "extension": "Privileged", "description": "Invalidates a TLB entry on the current processor without affecting other processors. The operation is controlled by RIC (Radix Invalidate Control), PRS (Partition Scope), and R (Effective Radix) bits; RS contains the LPID or PID, and RB provides the address to invalidate. This is a privileged instruction requiring Hypervisor mode.", "pseudocode": "// Invalidate TLB entry based on address, LPID/PID, and control fields\nif R = 0 then\n  // Page Table (PT) invalidation\n  tlb_invalidate_pt(RB, RS, PRS, RIC)\nelse\n  // Radix Table (RT) invalidation\n  tlb_invalidate_rt(RB, RS, PRS, RIC)", "page_found": "Page 1210 - 1211", "special_registers": "MSR", "programming_notes": "The tlbiel instruction is used to locally invalidate Translation Lookaside Buffer (TLB) entries based on various criteria specified by the RB, RS, RIC, PRS, and R fields. It is important to ensure that the correct values are set in these fields to achieve the desired TLB invalidation. This instruction operates at a privilege level that requires supervisor or higher authority, and it should be used carefully to avoid unintended side effects on system performance.", "example": "tlbiel r3, 0, 0, effr"}
{"mnemonic": "msgsync", "architecture": "PowerISA", "full_name": "Message Synchronize", "summary": "Provides an ordering function for stores relative to data accesses by other threads after a Directed Ultravisor Doorbell or Directed Hypervisor Doorbell interrupt.", "syntax": "msgsync", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | / | 894 | /", "hex_opcode": "0x7C0006EC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "894", "clean": "894"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [], "extension": "Privileged", "description": "Provides memory ordering semantics for stores relative to data accesses by other threads following a Directed Ultravisor Doorbell or Directed Hypervisor Doorbell interrupt. This privileged instruction acts as a synchronization point with no operands.", "programming_notes": "When used in conjunction with msgsndu or msgsnd, Synchronize with L = 0 or 2 is executed on the thread that will execute the msgsndu or msgsnd, and msgsync is executed on another thread, typically the thread that is the target of the msgsndu or msgsnd, but possibly any other thread (partly because the software that services the Directed Ultravisor Doorbell or Directed Hypervisor Doorbell interrupt may ultimately run on a thread other than that which received the exception). The Synchronize precedes the msgsndu or msgsnd; the msgsync is executed after the Directed Ultravisor Doorbell or Directed Hypervisor Doorbell interrupt occurs, and precedes all instructions that need to 'see' the values stored by the stores that are in set A of the memory barrier created by the Synchronize.", "page_found": "Page 1312 - 1313", "pseudocode": "// Memory synchronization point for message-based interrupts\nMemory_Synchronize()", "example": "msgsync"}
{"mnemonic": "msgslp", "architecture": "PowerISA", "full_name": "Message Sleep", "summary": "Transitions the processor to a sleep state via message.", "syntax": "msgslp RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | RB | 118 | /", "hex_opcode": "0x7C0000EC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "118", "clean": "118"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RB", "desc": "Msg"}], "extension": "Privileged", "description": "Transitions the processor to a sleep state via a message-based mechanism. The message content is provided in register RB. This is a privileged instruction that may put the processor into a low-power state pending an interrupt.", "pseudocode": "message ← RB\nenter_sleep_state(message)", "example": "msgslp r5"}
{"mnemonic": "vnegw", "architecture": "PowerISA", "full_name": "Vector Negate Word", "summary": "Negates the contents of each word element in a vector register.", "syntax": "vnegw vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "000100 | vD | 00110 | vB | 11000 | 000010", "hex_opcode": "0x10060602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1540", "clean": "1540"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VX", "desc": "Destination Vector Register"}, {"name": "VS", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vnegw, the one's-complement of each signed integer in word elements of VSR[VRB+32] is added to 1 and placed into corresponding word elements of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src ←EXTS(VSR[VRB+32].word[i])\n    VSR[VRT+32].word[i] ←CHOP32(¬src + 1)\nend", "page_found": "Page 396 - 397", "special_registers": "MSR", "programming_notes": "The vnegw instruction negates each signed integer in the word elements of a vector register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates on 32-bit words, so input data must be properly aligned. Be cautious of overflow conditions when negating large positive numbers.", "example": "vnegw vd, vb"}
{"mnemonic": "vnegd", "architecture": "PowerISA", "full_name": "Vector Negate Doubleword", "summary": "Negates each doubleword integer.", "syntax": "vnegd vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vB | 1604", "hex_opcode": "0x10070602", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1604", "clean": "1604"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VMX (AltiVec)", "description": "Computes the two's complement negation (0 - value) of each doubleword (64-bit) element in the source vector and writes the result to the target vector. No status register updates occur.", "pseudocode": "for i in 0 to 1:\n  dword ← (VRB[i*64:(i+1)*64])\n  VRT[i*64:(i+1)*64] ← -dword", "page_found": "Page 397", "special_registers": "MSR", "programming_notes": "The vnegd instruction is used to negate each doubleword element in a vector. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. This operation is performed on 64-bit elements, so ensure proper alignment and size of the vectors involved.", "example": "vnegd vd, vb"}
{"mnemonic": "mtocrf", "architecture": "PowerISA", "full_name": "Move To One Condition Register Field", "summary": "Moves a GPR field to a single CR field.", "syntax": "mtocrf FXM, RS", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RS | FXM | 144 | /", "hex_opcode": "0x7C100120", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "FXM", "clean": "FXM"}, {"raw": "144", "clean": "144"}], "bit_positions": "0:5 | 6:10 | 11:18 | 19:30 | 31", "length": "32"}, "operands": [{"name": "FXM", "desc": "Mask"}, {"name": "RS", "desc": "Source"}], "extension": "Base", "description": "Moves a single condition register field from a GPR to the condition register, using FXM as a mask to select which CR field (CR0-CR7) receives the update. The FXM field must have only one bit set to specify a single CR field; CR bits outside the selected field are unchanged.", "pseudocode": "// Move GPR bits [0:31] to CR field selected by FXM\nfor i in 0 to 7:\n  if FXM[i] = 1 then\n    CR[i*4:(i+1)*4] ← RS[i*4:(i+1)*4]", "special_registers": "CR", "programming_notes": "The mtocrf instruction is used to transfer a specific field from the Condition Register (CR) to a general-purpose register. Ensure that exactly one bit in the FXM field is set to avoid undefined behavior of the Condition Register. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "mtocrf 0xFF, r3"}
{"mnemonic": "mfocrf", "architecture": "PowerISA", "full_name": "Move From One Condition Register Field", "summary": "Moves a single CR field to a GPR.", "syntax": "mfocrf RT, FXM", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RT | FXM | 19 | /", "hex_opcode": "0x7C100026", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "FXM", "clean": "FXM"}, {"raw": "19", "clean": "19"}], "bit_positions": "0:5 | 6:10 | 11:18 | 19:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "FXM", "desc": "Mask"}], "extension": "Base", "description": "Moves a single condition register field to a GPR, using FXM as a mask to select which CR field (CR0-CR7) is read. The FXM field must have only one bit set; the selected 4-bit CR field is placed in bits [0:3] of RT, with all other GPR bits zeroed.", "pseudocode": "// Move CR field selected by FXM to GPR bits [0:31]\nRT ← 0\nfor i in 0 to 7:\n  if FXM[i] = 1 then\n    RT[i*4:(i+1)*4] ← CR[i*4:(i+1)*4]", "page_found": "Page 166", "special_registers": "CR", "programming_notes": "The mfocrf instruction is used to extract a specific condition register field into a general-purpose register. Ensure that exactly one bit in the FXM field is set to avoid undefined behavior. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "mfocrf r3, 0xFF"}
{"mnemonic": "neg", "architecture": "PowerISA", "full_name": "Negate", "summary": "Computes the two's complement negation of a register (0 - RT).", "syntax": "neg RT, RA", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | 00000 | OE | 104 | Rc", "hex_opcode": "0x7C0000D0", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "00000", "clean": "00000"}, {"raw": "OE", "clean": "OE"}, {"raw": "104", "clean": "104"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register"}], "pseudocode": "result ← -(RA)\nRT ← result\nif OE = 1 then\n  if RA = 0x8000_0000_0000_0000 then\n    XER[OV] ← 1; XER[SO] ← 1\n  else\n    XER[OV] ← 0\nif Rc = 1 then\n  CR0 ← record_result(result)", "example": "neg r3, r4", "example_note": "r3 = -r4", "extension": "Base", "description": "Computes the two's complement negation (0 - RA) of the source register and stores the result in RT. If OE=1, sets OV and SO in XER on signed overflow (when RA=0x8000_0000_0000_0000). When Rc=1, updates CR0 based on the result.", "page_found": "Page 114", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "or", "architecture": "PowerISA", "full_name": "OR Logical Operation", "summary": "Performs a bitwise OR operation on the contents of two registers and places the result in a third register.", "syntax": "or RT,RA,RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 444 | Rc", "hex_opcode": "0x7C000378", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "444", "clean": "444"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}, {"name": "RT", "desc": "Target General Purpose Register"}], "pseudocode": "RA ← RS | RB\nif Rc = 1 then CR0 ← (RA = 0, RA < 0, RA > 0, SO)", "example": "or r3, r4, r5", "example_note": "r3 = r4 | r5", "extension": "Base", "description": "Performs a bitwise OR operation on two general-purpose registers and stores the result in a third register. This is a base category instruction that operates on the full 64-bit register width. If Rc=1, the instruction updates CR0 based on the result.", "programming_notes": "Warning: Other forms of or Rx,Rx,Rx that are not described in this section and in Section 4.3.3 may also cause program priority to change. Use of these forms should be avoided except when software explicitly intends to alter program priority. If a no-op is needed, the preferred no-op (ori 0,0,0) should be used.", "page_found": "Page 1022 - 1023", "special_registers": "CR0, XER", "extended_mnemonics": [{"mnemonic": "miso", "equivalent": "or 26,26,26"}]}
{"mnemonic": "ori", "architecture": "PowerISA", "full_name": "OR Immediate", "summary": "Performs a bitwise OR operation between the contents of a register and an immediate value, placing the result in another register.", "syntax": "ori RT,RS,SImm", "encoding": {"format": "D-form", "binary_pattern": "24 | RS | RA | UI", "hex_opcode": "0x60000000", "visual_parts": [{"raw": "24", "clean": "24"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "UI", "clean": "UI"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "UI", "desc": "Unsigned 16-bit Immediate"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "SImm", "desc": "Sign-Extended 16-bit Immediate Value"}], "pseudocode": "RA ← RS | (0x0000 || UI)", "example": "ori r3, r4, 0x1", "example_note": "Set bit 0.", "extension": "Base", "description": "Performs a bitwise OR between a general-purpose register and a 16-bit unsigned immediate value, storing the result in another register. This is a base category instruction with no condition register or status updates.", "programming_notes": "Warning: Other forms of ori Rx,Rx,0 that are not described in this section may also have micro-architectural effects on program execution. Use of these forms should be avoided except when software needs the associated micro-architectural effects.\n\nProgramming Note: This no-op is intended to be used by software for providing protection against the Spectre class of transient execution attacks by restricting eventually discarded out-of-order execution effects with transient register values, which may compromise confidential data via other covert channels.", "extended_mnemonics": [{"mnemonic": "nop", "equivalent_to": "ori 0,0,0"}, "exser"], "page_found": "Page 133 - 134"}
{"mnemonic": "oris", "architecture": "PowerISA", "full_name": "OR Immediate Shifted", "summary": "Performs a bitwise OR with a 16-bit immediate shifted left by 16 bits.", "syntax": "oris RA, RS, UI", "encoding": {"format": "D-form", "binary_pattern": "25 | RS | RA | UI", "hex_opcode": "0x64000000", "visual_parts": [{"raw": "25", "clean": "25"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "UI", "clean": "UI"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "UI", "desc": "Unsigned 16-bit Immediate"}], "pseudocode": "RA ← RS | (UI || 0x0000)", "example": "oris r3, r4, 0xFFFF", "example_note": "Set upper 16 bits.", "extension": "Base", "description": "Performs a bitwise OR between a general-purpose register and a 16-bit unsigned immediate value shifted left by 16 bits, storing the result in another register. This is a base category instruction used to set high-order bits with no condition register updates.", "page_found": "Page 134", "programming_notes": "The oris instruction is commonly used to set specific bits in a register by ORing it with an immediate value. Be cautious of overflow if UI exceeds the upper limit, as it will be truncated. This instruction operates at user privilege level and does not generate exceptions under normal circumstances."}
{"mnemonic": "popcntd", "architecture": "PowerISA", "full_name": "Population Count Doubleword", "summary": "Counts the number of set bits (1s) in a 64-bit register.", "syntax": "popcntd RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 00000 | 506 | /", "hex_opcode": "0x7C0003F4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "00000", "clean": "00000"}, {"raw": "506", "clean": "506"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}], "pseudocode": "RA ← popcount(RS[0:63])", "example": "popcntd r3, r4", "example_note": "Hamming weight of r4.", "extension": "Base", "description": "Counts the number of set bits (population count) in a 64-bit general-purpose register and stores the count in another register. This is a base category instruction that produces the count of 1-bits across the entire doubleword with no condition register or status updates.", "page_found": "Page 139", "programming_notes": "The popcntd instruction is useful for counting the number of set bits (1s) in a 64-bit value. It operates on each doubleword independently, so if you're working with 128-bit values, ensure that both halves are processed separately. This instruction does not require any special alignment and can be executed at user privilege level. Be cautious when using this instruction in performance-critical sections, as it may have varying execution times depending on the input data."}
{"mnemonic": "popcntw", "architecture": "PowerISA", "full_name": "Population Count Word", "summary": "Counts the number of set bits (1s) in the lower 32 bits of a register.", "syntax": "popcntw RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 00000 | 378 | /", "hex_opcode": "0x7C0002F4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "00000", "clean": "00000"}, {"raw": "378", "clean": "378"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}], "pseudocode": "RA ← popcount(RS[32:63])", "example": "popcntw r3, r4", "example_note": "Hamming weight of 32-bit word.", "extension": "Base", "description": "Counts the number of set bits in the lower 32 bits of a general-purpose register and stores the count in another register. This is a base category instruction that produces the count of 1-bits in the word, with the upper 32 bits of the result cleared and no condition register or status updates.", "programming_notes": "The popcntw instruction is useful for counting the number of set bits (1s) in a 32-bit word. It operates on each 32-bit segment of the source register, making it ideal for bit manipulation tasks where population count is needed. Ensure that the source and destination registers are properly aligned to avoid unexpected behavior. This instruction does not require any special privileges and will execute without exceptions if the operands are valid."}
{"mnemonic": "tlbilx", "architecture": "PowerISA", "full_name": "TLB Invalidate Local Extended", "summary": "Invalidates TLB entries on the local processor based on Process ID (PID).", "syntax": "tlbilx T, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | T | RA | RB | 18 | /", "hex_opcode": "0x7C000024", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "T", "clean": "T"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "18", "clean": "18"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "T", "desc": "Type"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Invalidates TLB entries on the local processor based on Process ID and address criteria specified by the T field. This is an embedded category, privileged instruction that performs no condition register updates but modifies TLB state; behavior depends on the processor's memory management architecture.", "pseudocode": "Invalidate TLB entries matching: T field type, EA = (RA), PID = MMUPID, based on processor implementation", "example": "tlbilx 0, r4, r5"}
{"mnemonic": "lwdi", "architecture": "PowerISA", "full_name": "Load Word with Decoration Indexed", "summary": "Loads a word and sends decoration sideband signals to the bus.", "syntax": "lwdi RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 788 | /", "hex_opcode": "0x7C000628", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "788", "clean": "788"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Loads a 32-bit word from memory at an address computed from two general-purpose registers and transmits sideband decoration signals. This is an embedded category instruction used in specialized memory systems with no condition register or status updates.", "pseudocode": "EA ← RA + RB\nRT ← [EA][32:63]\nSend decoration signals on memory bus", "example": "lwdi r3, r4, r5"}
{"mnemonic": "stdi", "architecture": "PowerISA", "full_name": "Store Word with Decoration Indexed", "summary": "Stores a word and sends decoration sideband signals.", "syntax": "stdi RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 916 | /", "hex_opcode": "0x7C000728", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "916", "clean": "916"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Embedded", "description": "Stores a 32-bit word from a general-purpose register to memory at an address computed from two other registers and transmits sideband decoration signals. This is an embedded category instruction used in specialized memory systems with no condition register or status updates.", "pseudocode": "EA ← RA + RB\n[EA][32:63] ← RS\nSend decoration signals on memory bus", "example": "stdi r3, r4, r5"}
{"mnemonic": "ehpriv", "architecture": "PowerISA", "full_name": "Embedded Hypervisor Privilege", "summary": "Enters embedded hypervisor privileged state.", "syntax": "ehpriv OC", "encoding": {"format": "X-form", "binary_pattern": "31 | 0 | 0 | OC | 270 | /", "hex_opcode": "0x7C00021E", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "OC", "clean": "OC"}, {"raw": "270", "clean": "270"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "OC", "desc": "Opcode"}], "extension": "Embedded", "description": "Enters embedded hypervisor privileged state, allowing execution of hypervisor-privileged instructions. This instruction is only available in embedded processor implementations and requires hypervisor privilege level. No condition registers or status fields are affected by this instruction.", "pseudocode": "if not in hypervisor mode then\n  raise Hypervisor Privilege exception\nelse\n  enter hypervisor privileged state based on OC field", "example": "ehpriv 0"}
{"mnemonic": "msync", "architecture": "PowerISA", "full_name": "Memory Synchronize", "summary": "Synchronizes memory accesses (Alias for sync).", "syntax": "msync", "encoding": {"format": "X-form", "binary_pattern": "31 | 0 | 0 | 0 | 598 | /", "hex_opcode": "0x7C0004AC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "598", "clean": "598"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Embedded", "description": "Provides full memory synchronization for embedded processors, equivalent to sync with no operands. This instruction ensures all prior loads and stores are globally visible before any subsequent memory accesses are initiated. No condition registers or status fields are affected.", "pseudocode": "wait until all prior memory accesses complete\nwait until all prior memory accesses are globally visible", "example": "msync"}
{"mnemonic": "add", "architecture": "PowerISA", "full_name": "Add", "summary": "Adds the contents of two registers and places the result in a third register.", "syntax": "add RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 266 | Rc", "hex_opcode": "0x7C000214", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "266", "clean": "266"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}, {"name": "rPX", "desc": "Destination General Purpose Register"}, {"name": "rPS", "desc": "Source General Purpose Register"}, {"name": "rNS", "desc": "Source General Purpose Register"}], "pseudocode": "RT ← RA + RB\nif OE = 1 then\n  if overflow then XER[OV] ← 1; XER[SO] ← 1\nif Rc = 1 then\n  CR0 ← (RT < 0) || (RT > 0) || (RT = 0) || XER[SO]", "example": "add r3, r4, r5", "example_note": "r3 = r4 + r5", "extension": "Base", "description": "Adds the values in registers RA and RB and places the result in RT. If OE=1, sets XER[SO] and XER[OV] on signed overflow. If Rc=1, updates CR0 to reflect the result (LT, GT, EQ, SO). No exception is raised on overflow unless OE=1.", "special_registers": "CR0, XER", "page_found": "Page 624 - 625", "programming_notes": "add, add., and subf are the preferred instructions..."}
{"mnemonic": "addc", "architecture": "PowerISA", "full_name": "Add Carrying", "summary": "Adds the contents of two registers and a carry bit, placing the result in a target register.", "syntax": "addc RT,RA,RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 10 | Rc", "hex_opcode": "0x7C000014", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "10", "clean": "10"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}], "pseudocode": "if 'addc' then\n    RT <- (RA) + (RB)\nelse if 'addc.' then\n    RT <- (RA) + (RB)\n    if Rc=1 then update CR0\nelse if 'addco' then\n    RT <- (RA) + (RB)\n    if OE=1 then update XER[SO], XER[OV]\nelse if 'addco.' then\n    RT <- (RA) + (RB)\n    if Rc=1 then update CR0\n    if OE=1 then update XER[SO], XER[OV]", "example": "addc r3, r4, r5", "example_note": "r3 = r4 + r5 (Updates Carry)", "extension": "Base", "description": "The sum (RA) + (RB) is placed into register RT.", "special_registers": "CR0, XER", "page_found": "Page 111 - 112", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "adde", "architecture": "PowerISA", "full_name": "Add Extended", "summary": "Adds two registers plus the current Carry bit.", "syntax": "adde RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 138 | Rc", "hex_opcode": "0x7C000114", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "138", "clean": "138"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}], "pseudocode": "RT ← RA + RB + XER[CA]\nif OE = 1 then\n  if overflow then XER[OV] ← 1; XER[SO] ← 1\nif result > 2^64-1 or result < -2^64 then XER[CA] ← 1 else XER[CA] ← 0\nif Rc = 1 then\n  CR0 ← (RT < 0) || (RT > 0) || (RT = 0) || XER[SO]", "example": "adde r3, r4, r5", "example_note": "r3 = r4 + r5 + CA", "extension": "Base", "description": "Adds the values in registers RA and RB plus the Carry bit from XER and places the result in RT. If OE=1, sets XER[SO] and XER[OV] on signed overflow. If Rc=1, updates CR0 based on the result. This instruction is used for multi-precision arithmetic.", "page_found": "Page 112", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "addi", "architecture": "PowerISA", "full_name": "Add Immediate", "summary": "Adds a signed immediate value to the contents of a register and places the result in another register.", "syntax": "addi RT, RA, SI", "encoding": {"format": "D-form", "binary_pattern": "14 | RT | RA | SI", "hex_opcode": "0x38000000", "visual_parts": [{"raw": "14", "clean": "14"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "SI", "clean": "SI"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register (0 means 0)"}, {"name": "SI", "desc": "Signed 16-bit Immediate"}, {"name": "SIMM", "desc": "16-bit Signed Immediate Value"}], "pseudocode": "RT ← (RA | 0) + sign_extend(SI)", "example": "addi r3, r4, 10", "example_note": "r3 = r4 + 10", "extension": "Base", "description": "Adds the signed 16-bit immediate value SI to the contents of register RA (or 0 if RA=0) and stores the result in RT. This instruction does not affect any condition registers or XER flags, and no overflow checking is performed.", "programming_notes": "addi, addis, add, and subf are the preferred instructions for addition and subtraction, because they set few status bits.", "extended_mnemonics": [{"mnemonic": "la", "equivalent_to": "addi RT,RA,SI"}, {"mnemonic": "li", "equivalent_to": "addi RT,0,SI"}, {"mnemonic": "subi", "equivalent_to": "addi RT,RA,-si"}], "page_found": "Page 108 - 110"}
{"mnemonic": "addic", "architecture": "PowerISA", "full_name": "Add Immediate Carrying", "summary": "Adds an immediate to a register and updates the Carry bit.", "syntax": "addic RT,RA,SI", "encoding": {"format": "D-form", "binary_pattern": "12 | RT | RA | SI", "hex_opcode": "0x30000000", "visual_parts": [{"raw": "12", "clean": "12"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "SI", "clean": "SI"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register"}, {"name": "SI", "desc": "Signed 16-bit Immediate"}], "pseudocode": "RT <- (RA) + EXTS(SI); CA <- Carry", "example": "addic r3, r4, 10", "example_note": "r3 = r4 + 10 (Updates CA)", "extension": "Base", "description": "The sum (RA) + SI is placed into register RT.", "special_registers": "XER, CR0", "extended_mnemonics": [{"mnemonic": "subic", "equivalent_to": "addic RT,RA,-si"}], "page_found": "Page 110 - 112", "programming_notes": "The `addic` instruction adds an immediate value to a register and sets the carry bit in the XER. It's commonly used for arithmetic operations where overflow detection is needed. Ensure that the immediate value fits within 16 bits, as it is sign-extended before addition. This instruction operates at user privilege level."}
{"mnemonic": "addic.", "architecture": "PowerISA", "full_name": "Add Immediate Carrying and Record", "summary": "Adds an immediate, updates Carry, and updates Condition Register Field 0 (CR0).", "syntax": "addic. RT, RA, SI", "encoding": {"format": "D-form", "binary_pattern": "13 | RT | RA | SI", "hex_opcode": "0x34000000", "visual_parts": [{"raw": "13", "clean": "13"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "SI", "clean": "SI"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register"}, {"name": "SI", "desc": "Signed 16-bit Immediate"}], "pseudocode": "RT ← RA + sign_extend(SI)\nif RT > 2^64-1 or RT < -2^64 then XER[CA] ← 1 else XER[CA] ← 0\nCR0 ← (RT < 0) || (RT > 0) || (RT = 0) || XER[SO]", "example": "addic. r3, r4, -5", "example_note": "r3 = r4 - 5 (Updates CA and CR0)", "extension": "Base", "description": "Adds the signed 16-bit immediate SI to register RA and stores the result in RT, updating the Carry bit in XER and CR0. The '.' suffix indicates that CR0 is updated based on the result (LT, GT, EQ, SO). The Carry flag reflects whether the addition produced a result greater than 2^64-1.", "page_found": "Page 111", "special_registers": "CR0", "programming_notes": "The addic instruction is useful for adding an immediate value to a register while also handling potential overflow by setting the carry flag. Be cautious of overflow conditions that may affect subsequent operations. The result and comparison are recorded in separate registers, so ensure proper register management to avoid unintended data loss."}
{"mnemonic": "addis", "architecture": "PowerISA", "full_name": "Add Immediate Shifted", "summary": "Adds an immediate value shifted left by 16 bits to the contents of a register and places the result in another register.", "syntax": "addis RT, RA, SI", "encoding": {"format": "D-form", "binary_pattern": "001111 | RT | RA | SIMM", "hex_opcode": "0x3C000000", "visual_parts": [{"raw": "15", "clean": "15"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "SI", "clean": "SI"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register (0 means 0)"}, {"name": "SI", "desc": "Signed 16-bit Immediate"}, {"name": "SIMM", "desc": "16-bit signed immediate value shifted left by 16 bits"}], "pseudocode": "RT ← (RA | 0) + (sign_extend(SI) << 16)", "example": "addis r3, r4, 1", "example_note": "r3 = r4 + 65536 (0x10000)", "extension": "Base", "description": "Adds the signed 16-bit immediate SI shifted left by 16 bits to register RA (or 0 if RA=0) and stores the result in RT. This is commonly used to load the high-order 16 bits of a 32-bit constant. No condition registers or XER flags are affected.", "extended_mnemonics": [{"mnemonic": "lis", "equivalent_to": "addis RT,0,SI"}, {"mnemonic": "subis", "equivalent_to": "addis RT,RA,-si"}], "page_found": "Page 109 - 110", "programming_notes": "The addis instruction is commonly used for loading large immediate values into a register by shifting the 16-bit immediate value left by 16 bits and adding it to the contents of another register. If RA is zero, the instruction effectively sign-extends the immediate value and places it in RT. This instruction does not require any special privileges and can be used at any privilege level. However, developers should ensure that the immediate value does not cause overflow when shifted and added, as this could lead to unexpected results."}
{"mnemonic": "addme", "architecture": "PowerISA", "full_name": "Add to Minus One Extended", "summary": "Adds the contents of a register and a constant minus one, with optional overflow exception.", "syntax": "addme RT,RA", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | 00000 | OE | 234 | Rc", "hex_opcode": "0x7C0001D4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "00000", "clean": "00000"}, {"raw": "OE", "clean": "OE"}, {"raw": "234", "clean": "234"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register"}], "pseudocode": "if 'addme' then\n    RT <- (RA) + CA - 1", "example": "addme r3, r4", "example_note": "r3 = r4 + CA - 1", "extension": "Base", "description": "The sum (RA) + CA - 1 is placed into register RT. The carry bit (CA) is used in the calculation.", "special_registers": "CR0, XER", "extended_mnemonics": ["addme.", "addmeo", "addmeo."], "page_found": "Page 112 - 114", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "addze", "architecture": "PowerISA", "full_name": "Add to Zero Extended", "summary": "Adds a register, 0, and the Carry bit.", "syntax": "addze RT, RA", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | 00000 | OE | 202 | Rc", "hex_opcode": "0x7C000194", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "00000", "clean": "00000"}, {"raw": "OE", "clean": "OE"}, {"raw": "202", "clean": "202"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register"}], "pseudocode": "RT ← RA + 0 + XER[CA]\nif OE = 1 then\n  (OV, CA) ← overflow and carry results\nif Rc = 1 then\n  CR0 ← (RT == 0, RT < 0, RT > 0, XER[SO])", "example": "addze r3, r4", "example_note": "r3 = r4 + CA", "extension": "Base", "description": "Adds the value in RA, zero, and the Carry bit (XER[CA]), storing the result in RT. This instruction is commonly used to propagate a carry or decrement by one when combined with other arithmetic operations. Condition register CR0 is updated if Rc=1; overflow is recorded in XER[OV] if OE=1.", "page_found": "Page 113", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "and", "architecture": "PowerISA", "full_name": "AND", "summary": "Performs a bitwise AND operation on the contents of two registers and places the result into another register.", "syntax": "and RT,RS,RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 28 | Rc", "hex_opcode": "0x7C000038", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "28", "clean": "28"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}, {"name": "RT", "desc": "Target General Purpose Register"}], "pseudocode": "if 'and' then\n    RT <- (RS) & (RB)\nelse if 'and.' then\n    RT <- (RS) & (RB)", "example": "and r3, r4, r5", "example_note": "r3 = r4 & r5", "extension": "Base", "description": "The contents of register RS are ANDed with the contents of register RB and the result is placed into register RA.", "special_registers": "CR0", "programming_notes": "Some forms of and Rx, Rx, Rx provide special functions; see Section 11.3 of Book III.", "page_found": "Page 134 - 136"}
{"mnemonic": "andc", "architecture": "PowerISA", "full_name": "AND with Complement", "summary": "Performs a bitwise AND between RS and the one's complement of RB.", "syntax": "andc RA, RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 60 | Rc", "hex_opcode": "0x7C000078", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "60", "clean": "60"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}], "pseudocode": "RA ← RS & ~RB\nif Rc = 1 then\n  CR0 ← (RA == 0, RA < 0, RA > 0, XER[SO])", "example": "andc r3, r4, r5", "example_note": "r3 = r4 & ~r5", "extension": "Base", "description": "Performs a bitwise AND between RS and the one's complement (bitwise NOT) of RB, storing the result in RA. This is equivalent to RS AND (NOT RB). Condition register CR0 is updated if Rc=1.", "page_found": "Page 136", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "andi.", "architecture": "PowerISA", "full_name": "AND Immediate D-form with Record Update", "summary": "Performs a bitwise AND operation between the contents of a register and an immediate value, and updates the condition register.", "syntax": "andi. RA, RS, UI", "encoding": {"format": "D-form", "binary_pattern": "28 | RS | RA | UI", "hex_opcode": "0x70000000", "visual_parts": [{"raw": "28", "clean": "28"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "UI", "clean": "UI"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "UI", "desc": "Unsigned 16-bit Immediate"}, {"name": "RT", "desc": "Target General Purpose Register"}], "pseudocode": "RA <- (RS) & (0x0000 || UI); CR0 <- Compare(RA, 0)", "example": "andi. r3, r4, 0xF", "example_note": "r3 = r4 & 0xF", "extension": "Base", "description": "The contents of register RS are ANDed with 480 || UI and the result is placed into register RA. The first three bits of CR Field 0 are set as described in Section 3.3.8.", "special_registers": "CR0", "page_found": "Page 132 - 134", "programming_notes": "The andi. instruction performs a bitwise AND operation between the contents of register RS and an immediate value UI, storing the result in RA. It also updates CR0 to reflect if the result is zero or not. Ensure that the immediate value fits within 16 bits as it is zero-extended to 32 bits before the operation."}
{"mnemonic": "andis.", "architecture": "PowerISA", "full_name": "AND Immediate Shifted", "summary": "Performs a bitwise AND between a register and a 16-bit immediate shifted left by 16 bits. Always updates CR0.", "syntax": "andis. RA, RS, UI", "encoding": {"format": "D-form", "binary_pattern": "29 | RS | RA | UI", "hex_opcode": "0x74000000", "visual_parts": [{"raw": "29", "clean": "29"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "UI", "clean": "UI"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "UI", "desc": "Unsigned 16-bit Immediate"}], "pseudocode": "RA ← RS & (UI << 16)\nCR0 ← (RA == 0, RA < 0, RA > 0, XER[SO])", "example": "andis. r3, r4, 0x1234", "example_note": "r3 = r4 & 0x12340000", "extension": "Base", "description": "Performs a bitwise AND between RS and UI shifted left by 16 bits, storing the result in RA. The immediate operand is treated as unsigned and positioned in bits 16-31 of a 32-bit value with bits 0-15 cleared. Condition register CR0 is always updated regardless of the Rc bit (the dot indicates this behavior).", "page_found": "Page 133", "special_registers": "CR0", "programming_notes": "The andis. instruction is useful for masking or clearing specific bits in a register by shifting an immediate value left by 5 bits before performing the AND operation. Be cautious with alignment as it affects performance; ensure that the immediate value does not exceed 31 to avoid unexpected results. This instruction operates at user privilege level and can generate exceptions if RA is an invalid register. The result of the operation sets CR0, which can be used for conditional branching."}
{"mnemonic": "paddi", "architecture": "PowerISA", "full_name": "Prefixed Add Immediate", "summary": "Adds 34-bit immediate.", "syntax": "paddi RT, RA, SI, R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 14 | RT | RA | D1", "hex_opcode": "0x0600000038000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "...", "clean": "..."}, {"raw": "14", "clean": "14"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src"}, {"name": "SI", "desc": "Imm"}, {"name": "R", "desc": "PC-Rel"}], "extension": "Prefixed", "description": "Adds a 34-bit sign-extended immediate to RA (or 0 if RA=0) and stores the result in RT. The immediate is formed by concatenating prefix and suffix fields across a 64-bit prefixed instruction pair. When R=0, the offset is absolute; when R=1, it is PC-relative. This is a privileged Base extension instruction for 64-bit processors.", "pseudocode": "if R = 1 then\n  RT ← (RA | 0 if RA=0) + sign_extend(SI, 34) + CIA\nelse\n  RT ← (RA | 0 if RA=0) + sign_extend(SI, 34)", "page_found": "Page 109", "programming_notes": "The paddi instruction is commonly used for loading addresses or small immediate values into registers. Be cautious with alignment; ensure that the immediate value does not cause overflow, which could lead to unexpected results. This instruction operates at user privilege level and does not generate exceptions under normal circumstances.", "example": "paddi r3, r4, 16, 0"}
{"mnemonic": "pla", "architecture": "PowerISA", "full_name": "Prefixed Load Address (Pseudo)", "summary": "Pseudo-instruction for paddi with R=1. Loads the address of a label.", "syntax": "pla RT, label", "encoding": {"format": "Pseudo", "binary_pattern": "1 | 2 | R | 0 | D0 | 14 | RT | 0 | D1", "hex_opcode": "0x0600000038000000", "visual_parts": [{"raw": "paddi RT, 0, label, 1", "clean": "paddi RT, 0, label, 1"}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "label", "desc": "Symbol Name"}], "pseudocode": "RT ← CIA + sign_extend(label_offset, 34)", "example": "pla r3, my_var", "example_note": "Get address of my_var without TOC.", "extension": "Prefixed", "description": "Pseudo-instruction that loads the address of a label into RT. It is an assembly-time alias for 'paddi RT, 0, label, 1', where R=1 selects PC-relative addressing. This is a 64-bit prefixed instruction available only on compatible processors.", "page_found": "Page 109", "special_registers": "PC", "programming_notes": "The pla instruction is used to load the address of a label into a register, effectively calculating the absolute address of the target. This is useful for setting up pointers or addresses dynamically. Ensure that the label is correctly defined and accessible in your code. The instruction operates at the same privilege level as the current execution context."}
{"mnemonic": "pld", "architecture": "PowerISA", "full_name": "Prefixed Load Doubleword", "summary": "Loads a 64-bit value from memory using a 34-bit immediate offset (PC-relative or absolute).", "syntax": "pld RT, D34(RA), R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 57 | RT | RA | D1", "hex_opcode": "0x04000000E4000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "0", "clean": "0"}, {"raw": "00000", "clean": "00000"}, {"raw": "...", "clean": "..."}, {"raw": "57", "clean": "57"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "D34", "clean": "D34"}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "D34", "desc": "34-bit Displacement"}, {"name": "RA", "desc": "Base Register"}, {"name": "R", "desc": "PC-Relative Flag"}], "pseudocode": "if R = 1 then\n  EA ← (RA | 0 if RA=0) + sign_extend(D34, 34) + CIA\nelse\n  EA ← (RA | 0 if RA=0) + sign_extend(D34, 34)\nRT ← [EA]", "example": "pld r3, label@pcrel(0), 1", "example_note": "Load value from label.", "extension": "Prefixed", "description": "Loads a 64-bit doubleword from memory at the address calculated from RA plus a 34-bit immediate displacement, storing the result in RT. When R=1, the displacement is PC-relative; when R=0, it is treated as absolute. This is a 64-bit prefixed instruction from the Prefixed extension.", "page_found": "Page 91", "programming_notes": "The pld instruction is commonly used for loading doubleword data from memory into a register. Ensure the base address and offset are correctly calculated to avoid accessing invalid memory locations. This instruction operates at user privilege level unless specified otherwise."}
{"mnemonic": "pststd", "architecture": "PowerISA", "full_name": "Prefixed Store Doubleword", "summary": "Stores a 64-bit value to memory using a 34-bit immediate offset.", "syntax": "pststd RS, D34(RA), R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 61 | RS | RA | D1", "hex_opcode": "0x04000000F4000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "0", "clean": "0"}, {"raw": "00000", "clean": "00000"}, {"raw": "...", "clean": "..."}, {"raw": "61", "clean": "61"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "D34", "clean": "D34"}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RS", "desc": "Source Register"}, {"name": "D34", "desc": "34-bit Displacement"}, {"name": "RA", "desc": "Base Register"}, {"name": "R", "desc": "PC-Relative Flag"}], "pseudocode": "if R = 1 then\n  EA ← (RA | 0 if RA=0) + sign_extend(D34, 34) + CIA\nelse\n  EA ← (RA | 0 if RA=0) + sign_extend(D34, 34)\n[EA] ← RS", "example": "pststd r3, label@pcrel(0), 1", "example_note": "Store value to label.", "extension": "Prefixed", "special_registers": "PC", "programming_notes": "The pststd instruction stores a doubleword from the source register to memory. It uses the Program Counter (PC) or an effective address calculated from the base register and displacement. Ensure proper alignment for optimal performance; unaligned accesses may incur penalties. This instruction operates at user privilege level.", "description": "Stores a 64-bit doubleword from RS to memory at the address calculated from RA plus a 34-bit immediate displacement. When R=1, the displacement is PC-relative; when R=0, it is treated as absolute. This is a 64-bit prefixed instruction from the Prefixed extension."}
{"mnemonic": "plwz", "architecture": "PowerISA", "full_name": "Prefixed Load Word and Zero", "summary": "Loads a 32-bit word and zero-extends it to 64 bits, using a 34-bit offset.", "syntax": "plwz RT, D34(RA), R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 34 | RT | RA | D1", "hex_opcode": "0x0600000080000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "0", "clean": "0"}, {"raw": "00000", "clean": "00000"}, {"raw": "...", "clean": "..."}, {"raw": "34", "clean": "34"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "D34", "clean": "D34"}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "D34", "desc": "34-bit Displacement"}, {"name": "RA", "desc": "Base Register"}], "pseudocode": "if R = 1 then\n  EA ← (RA | 0 if RA=0) + sign_extend(D34, 34) + CIA\nelse\n  EA ← (RA | 0 if RA=0) + sign_extend(D34, 34)\nRT ← zero_extend([EA]0:31, 64)", "example": "plwz r3, 0(r4), 0", "example_note": "Load word with large offset.", "extension": "Prefixed", "description": "Loads a 32-bit word from memory at the address calculated from RA plus a 34-bit immediate displacement, zero-extends it to 64 bits, and stores the result in RT. When R=1, the displacement is PC-relative; when R=0, it is treated as absolute. This is a 64-bit prefixed instruction from the Prefixed extension.", "page_found": "Page 89", "programming_notes": "Use plwz when loading a word from memory into a 64-bit register with zero extension. Ensure the EA (Effective Address) is correctly calculated using the prefix and suffix fields. This instruction operates at user privilege level."}
{"mnemonic": "plbz", "architecture": "PowerISA", "full_name": "Prefixed Load Byte and Zero", "summary": "Loads a byte and zero-extends it, using a 34-bit offset.", "syntax": "plbz RT, D34(RA), R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 35 | RT | RA | D1", "hex_opcode": "0x0600000088000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "0", "clean": "0"}, {"raw": "00000", "clean": "00000"}, {"raw": "...", "clean": "..."}, {"raw": "35", "clean": "35"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "D34", "clean": "D34"}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "D34", "desc": "34-bit Displacement"}, {"name": "RA", "desc": "Base Register"}], "pseudocode": "EA ← (RA) + D34\nRT ← (0)56 || ([EA])", "example": "plbz r3, 0x12345678(0), 0", "example_note": "Load byte from absolute address.", "extension": "Prefixed", "description": "Loads a single byte from memory at the address formed by adding the 34-bit signed displacement D34 to the base register RA, zero-extends it to 64 bits, and stores the result in RT. This is a prefixed instruction using the MLS:D-form encoding with a 34-bit effective address offset. No condition flags are affected.", "page_found": "Page 84", "programming_notes": "The plbz instruction is used to load a single byte from memory and zero-extend it to fill the entire register. Ensure that the effective address (EA) is properly aligned for optimal performance, although misalignment does not cause an exception. This instruction operates at user privilege level."}
{"mnemonic": "pmxvbf16ger2", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector BFloat16 Ger (Rank-2 Update)", "summary": "Matrix Multiply Assist (MMA) instruction. Computes ACC <- ACC + (A * B) using BF16 inputs.", "syntax": "pmxvbf16ger2 AT, XA, XB, XMSK, YMSK", "encoding": {"format": "MMIRR-form", "binary_pattern": "1 | 3 | PMSK | XMSK | YMSK | 0 | 59 | AT | / | XA | XB | XO | AX | BX | /", "hex_opcode": "0x07900000EC000198", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "11", "clean": "11"}, {"raw": "...", "clean": "..."}, {"raw": "59", "clean": "59"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0 | 6 | 8 | 9 | 14 | 32 | 38 | 41 | 43 | 48 | 53 | 56 | 57 | 58 | "}, "operands": [{"name": "AT", "desc": "Accumulator (0-7)"}, {"name": "XA", "desc": "Vector A"}, {"name": "XB", "desc": "Vector B"}, {"name": "XMSK", "desc": "Mask for A"}, {"name": "YMSK", "desc": "Mask for B"}], "pseudocode": "acc ← ACC[AT]\nfor i in 0..1 do\n  for j in 0..3 do\n    if XMSK[i] = 1 ∧ YMSK[j] = 1 then\n      acc[i,j] ← acc[i,j] + (BF16(XA[i]) × BF16(XB[j]))\nACC[AT] ← acc\nCR6 ← saturation_status(acc)", "example": "pmxvbf16ger2 0, 1, 2, 0, 0", "example_note": "AI Tensor Core operation.", "extension": "Prefixed", "description": "Prefixed MMA instruction that performs a masked rank-2 generalized matrix multiply using BFloat16 inputs. Computes ACC(AT) ← ACC(AT) + (A × B) with element-wise masking via XMSK (for rows of A) and YMSK (for columns of B). Requires MMA support and VSX category. Updates CR6 to reflect accumulator saturation status.", "page_found": "Page 925", "programming_notes": "The pmxvbf16ger2 instruction is useful for performing matrix operations on bfloat16 data types with masking, allowing selective computation based on a mask. Ensure that the input vectors and accumulator are properly aligned to avoid performance penalties. This instruction operates at the user privilege level and will raise an exception if the result exceeds the 32-bit signed integer range, requiring saturation handling."}
{"mnemonic": "xxeval", "architecture": "PowerISA", "full_name": "VSX Vector Evaluation", "summary": "Performs an arbitrary 3-input boolean logic function (LUT3) on vectors. The 8-bit immediate 'IMM' defines the truth table.", "syntax": "xxeval XT, XA, XB, XC, IMM", "encoding": {"format": "8RR:XX4-form", "binary_pattern": "1 | 1 | 0 | / | 60 | XT | XA | XB | XC | IMM", "hex_opcode": "0x0500000088000010", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "01", "clean": "01"}, {"raw": "...", "clean": "..."}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "XC", "clean": "XC"}, {"raw": "IMM", "clean": "IMM"}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:31 | 32:37 | 38:42 | 43:47 | 48:52 | 53:55 | 56:63"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Source A"}, {"name": "XB", "desc": "Source B"}, {"name": "XC", "desc": "Source C"}, {"name": "IMM", "desc": "Truth Table (8-bits)"}, {"name": "RT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source Vector Register A"}, {"name": "RB", "desc": "Source Vector Register B"}, {"name": "RC", "desc": "Source Vector Register C"}], "pseudocode": "for i in 0..127 do\n  selector ← (XC[i] || XB[i] || XA[i])\n  XT[i] ← IMM[selector]\nend for", "example": "xxeval 0, 1, 2, 3, 0x96", "example_note": "Custom logic function (e.g., A^B^C).", "extension": "VSX", "description": "VSX instruction that performs a three-input lookup-table (LUT3) boolean operation on 128-bit vectors. The 8-bit immediate IMM encodes a truth table; for each bit position, the corresponding bit is determined by treating the three input bits (from XA, XB, XC) as a 3-bit selector into IMM. Requires VSX support; no condition flags are affected.", "page_found": "Page 945 - 946", "programming_notes": "The xxeval instruction is used to perform complex logical operations on vector registers.", "special_registers": "MSR"}
{"mnemonic": "divw", "architecture": "PowerISA", "full_name": "Divide Word", "summary": "Divides the contents of two registers and places the quotient into a target register.", "syntax": "divw RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 491 | Rc", "hex_opcode": "0x7C0003D6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "491", "clean": "491"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register (Quotient)"}, {"name": "RA", "desc": "Dividend"}, {"name": "RB", "desc": "Divisor"}], "pseudocode": "if 'divw' then\n    RT32:63 <- (RA)32:63 ÷ (RB)32:63\n    RT0:31 <- undefined", "example": "divw r3, r4, r5", "example_note": "r3 = r4 / r5 (32-bit Signed).", "extension": "Base", "description": "For divw, the 32-bit dividend is (RA)32:63. The 32-bit divisor is (RB)32:63. The 32-bit quotient is placed into RT32:63. The contents of RT0:31 are undefined.", "special_registers": "CR0, XER", "page_found": "Page 115 - 116", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "divwu", "architecture": "PowerISA", "full_name": "Divide Word Unsigned", "summary": "Divides the lower 32 bits of RA by the lower 32 bits of RB (Unsigned).", "syntax": "divwu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 459 | Rc", "hex_opcode": "0x7C000396", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "459", "clean": "459"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target Register (Quotient)"}, {"name": "RA", "desc": "Dividend"}, {"name": "RB", "desc": "Divisor"}], "pseudocode": "dividend ← (RA)[32:63]\ndivisor ← (RB)[32:63]\nif divisor = 0 then\n  quotient ← undefined\nelse\n  quotient ← dividend ÷ divisor\nRT ← (0)32 || quotient\nif Rc = 1 then\n  CR0 ← (quotient = 0) || (quotient < 0) || (quotient > 0) || SO", "example": "divwu r3, r4, r5", "example_note": "r3 = r4 / r5 (32-bit Unsigned).", "extension": "Base", "description": "Divides the lower 32 bits of RA (treated as unsigned) by the lower 32 bits of RB (treated as unsigned) and places the 32-bit quotient in RT with the upper 32 bits of RT set to zero. If RB is zero, RT is undefined and no exception is raised (wrap-on-overflow behavior). When Rc=1, CR0 is updated based on the result; OE is reserved and must be 0.", "page_found": "Page 118", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "divd", "architecture": "PowerISA", "full_name": "Divide Doubleword", "summary": "Divides the contents of two registers and places the quotient into a target register.", "syntax": "divd RT,RA,RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 489 | Rc", "hex_opcode": "0x7C0003D2", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "489", "clean": "489"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register (Quotient)"}, {"name": "RA", "desc": "Dividend"}, {"name": "RB", "desc": "Divisor"}], "pseudocode": "dividend0:63 ←(RA)\ndivisor0:63 ←(RB)\nRT ←dividend ÷ divisor", "example": "divd r3, r4, r5", "example_note": "r3 = r4 / r5 (64-bit Signed).", "extension": "Base", "description": "For divd, the 64-bit dividend is (RA) and the 64-bit divisor is (RB). The 64-bit quotient is placed into register RT. Both operands and the quotient are interpreted as signed integers.", "special_registers": "CR0, XER", "page_found": "Page 122 - 124", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "divdu", "architecture": "PowerISA", "full_name": "Divide Doubleword Unsigned", "summary": "Divides the 64-bit value in RA by the 64-bit value in RB (Unsigned).", "syntax": "divdu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 457 | Rc", "hex_opcode": "0x7C000392", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "457", "clean": "457"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target Register (Quotient)"}, {"name": "RA", "desc": "Dividend"}, {"name": "RB", "desc": "Divisor"}], "pseudocode": "dividend ← (RA)\ndivisor ← (RB)\nif divisor = 0 then\n  quotient ← undefined\nelse\n  quotient ← dividend ÷ divisor\nRT ← quotient\nif Rc = 1 then\n  CR0 ← (quotient = 0) || (quotient < 0) || (quotient > 0) || SO", "example": "divdu r3, r4, r5", "example_note": "r3 = r4 / r5 (64-bit Unsigned).", "extension": "Base", "description": "Divides the full 64-bit value in RA (treated as unsigned) by the full 64-bit value in RB (treated as unsigned) and places the 64-bit quotient in RT. If RB is zero, RT is undefined and no exception is raised. When Rc=1, CR0 is updated based on the result; OE is reserved and must be 0.", "page_found": "Page 123", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "dcbz", "architecture": "PowerISA", "full_name": "Data Cache Block Set to Zero", "summary": "Zeros out an entire cache block (usually 128 bytes) in memory. Critical for optimizing memory clears (memset).", "syntax": "dcbz RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 1014 | /", "hex_opcode": "0x7C0007EC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "1014", "clean": "1014"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Base Address"}, {"name": "RB", "desc": "Index Address"}], "pseudocode": "EA ← (RA) + (RB)\nblock_start ← EA & ~(cache_block_size - 1)\nfor addr in block_start to block_start + cache_block_size - 1 step word_size do\n  [addr] ← 0\nend for", "example": "dcbz 0, r3", "example_note": "Zero the cache line at address in r3.", "extension": "Base", "description": "Data cache instruction that writes zeros to an entire cache block (typically 128 bytes) in memory at the effective address formed by RA + RB. The block is zero-filled and typically written back or marked clean in the cache. This is a memory hint instruction; no general-purpose registers are modified and no condition flags are affected.", "programming_notes": "dcbz does not cause the block to exist in the data cache if the block is in storage that is Caching Inhibited. For storage that is neither Write Through Required nor Caching Inhibited, dcbz provides an efficient means of setting blocks of storage to zero. It can be used to initialize large areas of such storage, in a manner that is likely to consume less memory bandwidth than an equivalent sequence of Store instructions. For storage that is either Write Through Required or Caching Inhibited, dcbz is likely to take significantly longer to execute than an equivalent sequence of Store instructions.", "page_found": "Page 1036 - 1037"}
{"mnemonic": "dcbt", "architecture": "PowerISA", "full_name": "Data Cache Block Touch", "summary": "Hints to the hardware to prefetch the cache block at the specified address into the cache.", "syntax": "dcbt RA,RB,TH", "encoding": {"format": "X-form", "binary_pattern": "0 | GO | S | DEP | UNITCNT | T | U | ID", "hex_opcode": "0x7C00022C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "TH", "clean": "TH"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "278", "clean": "278"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "TH", "desc": "Touch Hint (Stream ID)"}, {"name": "RA", "desc": "Base Address"}, {"name": "RB", "desc": "Index Address"}, {"name": "EA", "desc": "Effective Address"}], "pseudocode": "EA ← (RA) + (RB)\nPrefetch_cache_block(EA, touch_hint=TH)", "example": "dcbt 0, 0, r3", "example_note": "Prefetch data at r3.", "extension": "Base", "description": "Data cache prefetch hint that loads the cache block at effective address RA + RB into the data cache with streaming characteristics controlled by the TH field. Variants (dcbtt, dcbna, dcbtds) provide transient, non-allocating, and data stream hints. This is a memory hint with no side effects on registers or condition flags; the prefetch is advisory and may be ignored.", "programming_notes": "To maximize the utility of the Depth control mechanism, the architecture provides a hierarchy of three ways to program it. The DPFD field in the LPCR is used by the provisory/firmware to set a safe or appropriate default depth for unaware operating systems and applications. The DPFD field in the DSCR may be initialized by the aware OS and overwritten by an application via the OS-provided service when per stream control is unnecessary or unaffordable.", "page_found": "Page 1028 - 1029", "extended_mnemonics": [{"mnemonic": "dcbt RA,RB", "equivalent": "dcbt RA,RB,0b00000"}, {"mnemonic": "dcbtt RA,RB", "equivalent": "dcbt RA,RB,0b10000"}, {"mnemonic": "dcbna RA,RB", "equivalent": "dcbt RA,RB,0b10001"}, {"mnemonic": "dcbtds RA,RB,TH", "equivalent": "dcbt RA,RB,TH (TH=0b00000 or 0b01000-0b01111)"}]}
{"mnemonic": "dcbf", "architecture": "PowerISA", "full_name": "Data Cache Block Flush", "summary": "Flushes the cache block from the data cache to main memory and invalidates it. Used for DMA coherency.", "syntax": "dcbf RA,RB,L", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 86 | /", "hex_opcode": "0x7C0000AC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "86", "clean": "86"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Base Address"}, {"name": "RB", "desc": "Index Address"}, {"name": "L", "desc": "Level of cache flush (0, 1, 3, 4, 6)"}, {"name": "RT", "desc": "Target General Purpose Register"}], "pseudocode": "EA ← (RA) + (RB)\nblock_start ← EA & ~(cache_block_size - 1)\nFlush_and_invalidate_cache_block(block_start, level=L)", "example": "dcbf 0, r3", "example_note": "Flush cache line at r3 to RAM.", "extension": "Base", "description": "Data cache flush instruction that writes back and invalidates the cache block at effective address RA + RB to ensure coherency with main memory. Variants (dcbfl, dcbflp, dcbfps, dcbstps) control the level and scope of the flush operation. The L field (if present) selects the cache level. No general-purpose registers are modified and no condition flags are affected.", "programming_notes": "dcbf serves as both a basic and an extended mnemonic. The Assembler will recognize a dcbf mnemonic with three operands as the basic form, and a dcbf mnemonic with two operands as the extended form. In the extended form the L operand is omitted and assumed to be 0.\ndcbf with L=1 can be used to provide a hint that a block in this processor’s data cache will not be reused soon.\ndcbf with L=3 can be used to flush a block from the processor’s primary data cache but reduce the latency of a subsequent access. For example, the block may be evicted from the primary data cache but a copy retained in a lower level of the cache hierarchy.", "extended_mnemonics": [{"mnemonic": "dcbf RA,RB", "equivalent": "dcbf RA,RB,0"}, {"mnemonic": "dcbfl RA,RB", "equivalent": "dcbf RA,RB,1"}, {"mnemonic": "dcbflp RA,RB", "equivalent": "dcbf RA,RB,3"}, {"mnemonic": "dcbfps RA,RB", "equivalent": "dcbf RA,RB,4"}, {"mnemonic": "dcbstps RA,RB", "equivalent": "dcbf RA,RB,6"}], "page_found": "Page 1038 - 1039"}
{"mnemonic": "dcbst", "architecture": "PowerISA", "full_name": "Data Cache Block Store", "summary": "Writes the cache block to main memory if it is modified (Clean), but keeps it in the cache.", "syntax": "dcbst RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 54 | /", "hex_opcode": "0x7C00006C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "54", "clean": "54"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Base Address"}, {"name": "RB", "desc": "Index Address"}], "pseudocode": "EA ← (RA) + (RB)\nCacheBlock ← CacheBlock at EA\nif CacheBlock.Modified then\n  WriteToMemory(CacheBlock)\n  CacheBlock.Modified ← 0\nend if", "example": "dcbst 0, r3", "example_note": "Ensure RAM has latest data for r3.", "extension": "Base", "description": "Writes a cache block containing the byte addressed by RA+RB to main memory if the block is modified, then keeps the block in the cache in a clean state. This instruction is used to synchronize cache contents with memory without invalidating the cache line. No condition registers or status fields are affected.", "programming_notes": "Data Cache Block Store to Persistent Storage is encoded as a variant of Data Cache Block Flush. The extended mnemonic (dcbstps) indicates the intended function.", "extended_mnemonics": ["dcbstps"], "page_found": "Page 1037 - 1038"}
{"mnemonic": "xxsetaccz", "architecture": "PowerISA", "full_name": "VSX Set Accumulator to Zero", "summary": "Clears a 512-bit Accumulator register (composed of 4 VSRs) to zero.", "syntax": "xxsetaccz AT", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | AT | 185 | /", "hex_opcode": "0x7C030162", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "AT", "clean": "AT"}, {"raw": "185", "clean": "185"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "AT", "desc": "Accumulator (0-7)"}], "extension": "MMA", "description": "Clears the 512-bit accumulator register AT (which consists of four 128-bit VSRs) to all zeros. This instruction is part of the MMA (Matrix Multiply Assist) extension and provides a fast way to initialize an accumulator before a sequence of matrix operations. No condition registers or status fields are affected.", "pseudocode": "ACC[AT] ← 0x0000...0000 (512 bits of zeros)", "page_found": "Page 913", "special_registers": "MSR", "programming_notes": "This instruction zeroes out all elements of the specified VSX accumulator. Ensure that VSX is enabled in the MSR register before using this instruction; otherwise, a VSX_Unavailable exception will be raised. This operation is useful for initializing accumulators or resetting them between operations.", "example": "xxsetaccz acc0"}
{"mnemonic": "xxmtacc", "architecture": "PowerISA", "full_name": "VSX Move to Accumulator", "summary": "Copies data from 4 adjacent VSRs into an Accumulator.", "syntax": "xxmtacc AT", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | AT | 153 | /", "hex_opcode": "0x7C010162", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "AT", "clean": "AT"}, {"raw": "153", "clean": "153"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "AT", "desc": "Target ACC"}], "extension": "MMA", "description": "Copies data from four consecutive VSRs (VSR[4×AT], VSR[4×AT+1], VSR[4×AT+2], VSR[4×AT+3]) into the 512-bit accumulator AT. This instruction transfers vector data from the VSR file into MMA accumulator state. This instruction requires MMA support and does not affect any condition registers or status fields.", "pseudocode": "ACC[AT][0:127] ← VSR[4×AT]\nACC[AT][128:255] ← VSR[4×AT+1]\nACC[AT][256:383] ← VSR[4×AT+2]\nACC[AT][384:511] ← VSR[4×AT+3]", "page_found": "Page 912 - 913", "special_registers": "MSR", "programming_notes": "Ensure VSX is enabled in the MSR before using xxmtacc; otherwise, a VSX_Unavailable exception will occur. This instruction moves data from four consecutive vector scalar registers into the accumulator, so verify register allocation to avoid unintended data movement.", "example": "xxmtacc acc0"}
{"mnemonic": "xxmfacc", "architecture": "PowerISA", "full_name": "VSX Move from Accumulator", "summary": "Copies data from an Accumulator back to 4 adjacent VSRs.", "syntax": "xxmfacc AT", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | AT | 185 | /", "hex_opcode": "0x7C000162", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "AT", "clean": "AT"}, {"raw": "185", "clean": "185"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "AT", "desc": "Source ACC"}, {"name": "AS", "desc": "Accumulator Select"}], "extension": "MMA", "description": "For xxmfacc, the contents of row i of ACC[AS] are placed into VSR[4×AS+i]. The contents of ACC[0] will be undefined after the first execution, which can degrade performance on subsequent executions.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nfor each integer value i from 0 to 3 do\n    VSR[4×AS+i] ← ACC[AS][i]", "programming_notes": "During extended periods of execution when there isn't any active use of the accumulators and VSX Vector GER instructions, hardware may deactivate these facilities for power savings. Once deactivated, while any attempted execution of any xxmfacc, xxmtacc, xxsetaccz, or VSX Vector GER instruction will cause these facilities to become reactivated, this reactivation causes significant delay beyond the normal execution of these instructions. This delay can be avoided by periodically issuing an xxmfacc with AS=0 instruction during extended times that the facilities are not being used to keep the facilities activated. Since the contents of ACC[0] will be undefined after the first execution, performance on subsequent executions of xxmfacc 0 can be expected to be degraded compared to performance when the contents of ACC[0] are defined. As such, to keep the facilities activated, xxmfacc 0 should be used with attention to performance implications.", "page_found": "Page 911 - 912", "special_registers": "MSR", "example": "xxmfacc acc0"}
{"mnemonic": "xvi8ger4", "architecture": "PowerISA", "full_name": "VSX Vector 8-bit Signed/Unsigned Integer GER (rank-4 update)", "summary": "Performs an 8-bit integer outer product (GER) and accumulates into a 512-bit register.", "syntax": "xvi8ger4 AT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "0 | AT | XA | XB | 3 | AXBX", "hex_opcode": "0xEC000018", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "AT", "clean": "AT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "34", "clean": "34"}], "length": "32", "bit_positions": "0:5 | 6:9 | 10:13 | 14:17 | 18:20 | 21:31"}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Vector A (8-bit)"}, {"name": "XB", "desc": "Vector B (8-bit)"}], "extension": "MMA", "description": "Performs a rank-4 outer product of two 8-bit signed/unsigned integer vectors, accumulating the result into the 512-bit accumulator AT. The operation treats elements of XA and XB as 8-bit integers, computes pairwise products, and accumulates them into 32-bit or 64-bit result lanes within the accumulator. This MMA instruction does not affect condition registers or status fields.", "pseudocode": "for i = 0 to 15 do\n  for j = 0 to 15 do\n    ACC[AT][4×(i×16+j)] ← ACC[AT][4×(i×16+j)] + (int8)XA[8×i:8×i+7] × (int8)XB[8×j:8×j+7]\n  end for\nend for", "page_found": "Page 920 - 921", "special_registers": "MSR", "programming_notes": "The xvi8ger4 instruction requires the VSX facility to be enabled in the MSR register. It performs a rank-4 update on VSX vector elements, multiplying and accumulating 8-bit signed/unsigned integers based on specified masks. Ensure that the VSX feature is available and properly configured before using this instruction.", "example": "xvi8ger4 acc0, vs2, vs3"}
{"mnemonic": "xvi8ger4pp", "architecture": "PowerISA", "full_name": "VSX Vector Integer 8-bit GER (Rank-4 Update) Plus/Plus", "summary": "Signed/Unsigned variations of 8-bit matrix multiply accumulate.", "syntax": "xvi8ger4pp AT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | AT | XA | XB | 35", "hex_opcode": "0xEC000010", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "AT", "clean": "AT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "35", "clean": "35"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "MMA", "description": "Performs a rank-4 outer product accumulation of two 8-bit integer vectors, with sign/unsignedness controlled by inline suffix bits. The accumulate step uses saturating or wrapping semantics depending on configuration. This MMA instruction does not affect condition registers or status fields.", "pseudocode": "for i = 0 to 15 do\n  for j = 0 to 15 do\n    prod ← (int8)XA[8×i:8×i+7] × (int8)XB[8×j:8×j+7]\n    ACC[AT][4×(i×16+j)] ← ACC[AT][4×(i×16+j)] + prod\n  end for\nend for", "page_found": "Page 921", "special_registers": "ACC", "programming_notes": "This instruction is commonly used in matrix operations where rank-4 updates are required. Ensure that the input vectors VSR[XA] and VSR[XB] are properly aligned to avoid performance penalties. The result is automatically chopped to fit into a 32-bit signed integer, so be cautious of overflow if intermediate results exceed this range.", "example": "xvi8ger4pp acc0, vs2, vs3"}
{"mnemonic": "xvi16ger2", "architecture": "PowerISA", "full_name": "VSX Vector Integer 16-bit GER (Rank-2 Update)", "summary": "Performs a rank-2 update of the contents of two registers and updates the condition register.", "syntax": "xvi16ger2 AT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "0 | AT | XA | XB | 75 | AXBX", "hex_opcode": "0xEC000258", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "AT", "clean": "AT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "75", "clean": "75"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:28 | 29:31"}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A (16-bit)"}, {"name": "XB", "desc": "Src B (16-bit)"}], "extension": "MMA", "description": "For xvi16ger2, the sum of the contents of register RA and RB is placed into register RT.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nPMSK ←0b11\nXMSK ←0b1111\nYMSK ←0b1111\n\ndo i = 0 to 3\n   do j = 0 to 3\n      if XMSK.bit[i] & YMSK.bit[j] then do\n         prod0 ←(PMSK.bit[0]=0) ? 0 : EXTS(VSR[32×AX+A].word[i].hword[0]) *\n                                       EXTS(VSR[32×BX+B].word[j].hword[0])\n         prod1 ←(PMSK.bit[1]=0) ? 0 : EXTS(VSR[32×AX+A].word[i].hword[1]) *\n                                       EXTS(VSR[32×BX+B].word[j].hword[1])\n\n         psum ←prod0 + prod1\n\n         ACC[AT][i].word[j] ←CHOP32(psum)\n      end\n      else\n         ACC[AT][i][j] ←0x0000_0000\n   end\nend", "page_found": "Page 913 - 914", "special_registers": "MSR", "programming_notes": "The xvi16ger2 instruction performs a 16-bit integer GER (Rank-2 Update) operation on VSX registers. Ensure that the VSX facility is enabled by checking and setting the MSR.VSX bit. The instruction processes 4x4 matrices of halfwords, multiplying corresponding elements and accumulating the results. Be cautious with overflow conditions as the products are summed without intermediate overflow checks. This instruction operates at the user privilege level and will raise an exception if VSX is unavailable.", "example": "xvi16ger2 acc0, vs2, vs3"}
{"mnemonic": "xvi16ger2s", "architecture": "PowerISA", "full_name": "VSX Vector Integer 16-bit GER (Rank-2 Update) Saturate", "summary": "Performs a vectorized signed integer multiply and accumulate operation with saturation.", "syntax": "xvi16ger2s AT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "0 | AT | XA | XB | AXBX", "hex_opcode": "0xEC000158", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "AT", "clean": "AT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "43", "clean": "43"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "MMA", "description": "The instruction performs a vectorized signed integer multiply and accumulate operation with saturation. It multiplies the elements of two vectors and accumulates the results into a destination vector, saturating any overflow values.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nPMSK ←0b11\nXMSK ←0b1111\nYMSK ←0b1111\nsat_flag ←0\n\ndo i = 0 to 3\ndo j = 0 to 3\n   if XMSK.bit[i] & YMSK.bit[j] then do\n      prod0 ←(PMSK.bit[0]=0) ? 0 : EXTS(VSR[32×AX+A].word[i].hword[0]) * EXTS(VSR[32×BX+B].word[j].hword[0])\n      prod1 ←(PMSK.bit[1]=0) ? 0 : EXTS(VSR[32×AX+A].word[i].hword[1]) * EXTS(VSR[32×BX+B].word[j].hword[1])\n\n      psum ←prod0 + prod1\n\n      ACC[AT][i].word[j] ←si32_CLAMP( psum )\n\n      if sat_flag=1 then VSCR.SAT ←1\n   end\n   else\n      ACC[AT][i][j] ←0x0000_0000\nend\nend", "special_registers": "VSCR, VSX registers", "page_found": "Page 915 - 916", "programming_notes": "This instruction is commonly used for vectorized operations involving 16-bit integer multiplication and accumulation with saturation. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. Be cautious of overflow conditions, as they will be saturated, which might affect the precision of your results. The instruction operates on 128-bit vectors, so ensure proper alignment for optimal performance.", "example": "xvi16ger2s acc0, vs2, vs3"}
{"mnemonic": "xvf16ger2", "architecture": "PowerISA", "full_name": "VSX Vector Float16 GER (Rank-2 Update)", "summary": "Performs a vector floating-point general element-wise rank-2 update operation.", "syntax": "xvf16ger2 AT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "59 | AT | // | A | B | 19 | AX | BX | /", "hex_opcode": "0xEC000098", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "AT", "clean": "AT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "19", "clean": "19"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A (FP16)"}, {"name": "XB", "desc": "Src B (FP16)"}], "extension": "MMA", "page_found": "Page 929 - 930", "description": "Performs a rank-2 outer product of two FP16 (half-precision floating-point) vectors, accumulating the result into the 512-bit accumulator AT. Each element of XA is multiplied by each element of XB, and products are summed across appropriate lanes. This MMA instruction requires floating-point support and does not modify condition registers or status fields.", "pseudocode": "for i = 0 to 31 do\n  for j = 0 to 31 do\n    ACC[AT][result_lane] ← ACC[AT][result_lane] + (fp16)XA[16×i:16×i+15] × (fp16)XB[16×j:16×j+15]\n  end for\nend for", "programming_notes": "The xvf16ger2 instruction is useful for performing matrix operations in VSX registers, specifically for rank-2 update accumulations. Ensure that the input matrices are correctly aligned and that the destination accumulator register is properly initialized to avoid incorrect results. This instruction operates at a high privilege level and may raise exceptions if the operands are not valid bfloat16 values.", "example": "xvf16ger2 acc0, vs2, vs3"}
{"mnemonic": "xvbf16ger2", "architecture": "PowerISA", "full_name": "VSX Vector BFloat16 GER (Rank-2 Update)", "summary": "Performs BFloat16 (Brain Float) matrix multiply accumulate.", "syntax": "xvbf16ger2 AT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | AT | XA | XB | 51", "hex_opcode": "0xEC000198", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "AT", "clean": "AT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "51", "clean": "51"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A (BF16)"}, {"name": "XB", "desc": "Src B (BF16)"}], "extension": "MMA", "page_found": "Page 924 - 925", "description": "Performs a rank-2 outer product of two BFloat16 (Brain Float) vectors, accumulating results into the 512-bit accumulator AT. BFloat16 is a truncated 32-bit floating-point format used in machine-learning workloads. This MMA instruction does not affect condition registers or status fields.", "special_registers": "ACC", "programming_notes": "The xvbf16ger2 instruction is used for performing a rank-2 update on the accumulator using bfloat16 values from two VSX registers. Ensure that the input registers are properly aligned and that the operation does not exceed the bounds of the accumulator to avoid saturation issues. This instruction operates at privilege level 0.", "pseudocode": "for i = 0 to 31 do\n  for j = 0 to 31 do\n    ACC[AT][result_lane] ← ACC[AT][result_lane] + (bf16)XA[16×i:16×i+15] × (bf16)XB[16×j:16×j+15]\n  end for\nend for", "example": "xvbf16ger2 acc0, vs2, vs3"}
{"mnemonic": "xvf32ger", "architecture": "PowerISA", "full_name": "VSX Vector Float32 GER (Rank-1 Update)", "summary": "Performs a vector floating-point general element-wise reduction with rank-1 update.", "syntax": "xvf32ger AT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "0 | 6 | 9 | 11 | 16 | 21 | 27 | AXBX", "hex_opcode": "0xEC0000D8", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "AT", "clean": "AT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "27", "clean": "27"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:26 | 27:30 | 31"}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A (FP32)"}, {"name": "XB", "desc": "Src B (FP32)"}], "extension": "MMA", "page_found": "Page 934 - 935", "description": "Performs a rank-1 outer product of two FP32 (single-precision floating-point) vectors, accumulating the result into the 512-bit accumulator AT. This reduction-style MMA operation multiplies corresponding FP32 elements and accumulates the products with appropriate rounding and exception behavior. No condition registers or status fields are modified.", "pseudocode": "for i = 0 to 15 do\n  for j = 0 to 15 do\n    prod ← (fp32)XA[32×i:32×i+31] × (fp32)XB[32×j:32×j+31]\n    ACC[AT][result_lane] ← ACC[AT][result_lane] + prod\n  end for\nend for", "special_registers": "ACC", "programming_notes": "The xvf32ger instruction is commonly used for matrix operations, specifically rank-1 updates. Ensure that the input matrices in VSR[XA] and VSR[XB] are correctly aligned and formatted as 4x2 matrices to avoid incorrect results. This operation requires floating-point precision and may raise exceptions if inputs are out of range or if there are NaNs or infinities involved.", "example": "xvf32ger acc0, vs2, vs3"}
{"mnemonic": "xvf64ger", "architecture": "PowerISA", "full_name": "VSX Vector Float64 GER (Rank-1 Update)", "summary": "Performs a vector floating-point general element-wise reduction on 64-bit elements.", "syntax": "xvf64ger AT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "59 | AT | // | Ap | B | 59 | AX | BX | /", "hex_opcode": "0xEC0001D8", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "AT", "clean": "AT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "59", "clean": "59"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A (FP64)"}, {"name": "XB", "desc": "Src B (FP64)"}, {"name": "XAp", "desc": "Source Vector Register"}], "extension": "MMA", "page_found": "Page 938 - 939", "description": "Performs a rank-1 update of a 4×4 matrix accumulator using 64-bit floating-point elements from two VSX source registers. This MMA instruction computes the outer product of two vectors (each with 2 double-precision elements, implicitly extended) and accumulates the result into the 512-bit accumulator AT. No condition register or status flags are affected.", "pseudocode": "AT ← AT + (XA[0] * XB[0] || XA[0] * XB[1] || XA[1] * XB[0] || XA[1] * XB[1]) (as 4×4 FP64 matrix)", "programming_notes": "The xvf64ger instruction is commonly used for performing matrix operations in scientific computing and linear algebra. Ensure that the input vectors X and Y are properly aligned to avoid performance penalties. This instruction operates at user privilege level, but improper use can lead to undefined behavior if the accumulator register is not correctly initialized.", "example": "xvf64ger acc0, vs2, vs3"}
{"mnemonic": "pmxvi8ger4", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector Integer 8-bit GER", "summary": "Masked version of 8-bit integer MMA.", "syntax": "pmxvi8ger4 AT, XA, XB, XMSK, YMSK", "encoding": {"format": "MMIRR-form", "binary_pattern": "1 | 3 | PMSK | XMSK | YMSK | 0 | 59 | AT | / | XA | XB | 35 | AX | BX | /", "hex_opcode": "0x07900000EC000018", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "11", "clean": "11"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0 | 6 | 8 | 9 | 14 | 32 | 38 | 41 | 43 | 48 | 53 | 56 | 57 | 58 | "}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "XMSK", "desc": "Mask A"}, {"name": "YMSK", "desc": "Mask B"}], "extension": "Prefixed", "description": "Prefixed masked version of the 8-bit integer matrix multiply-accumulate (MMA) instruction. Performs a rank-1 update of a 4×4 matrix accumulator using masked 8-bit integer elements, where XMSK controls which columns of XA participate and YMSK controls which rows of XB participate. No condition register or status flags are affected; this is a privileged MMA extension instruction.", "pseudocode": "for i in 0..3:\n  for j in 0..3:\n    if (XMSK[i] == 1) & (YMSK[j] == 1):\n      AT[i][j] ← AT[i][j] + (XA[i] × XB[j]) (8-bit signed × 8-bit signed → 32-bit result)", "page_found": "Page 921", "programming_notes": "This instruction is useful for performing efficient matrix multiplication on 8-bit signed integers with masking. Ensure that the mask registers (XMSK, YMSK, PMSK) are correctly set to control which elements participate in the accumulation. The operation requires VSX registers, so ensure they are properly aligned and accessible at the privilege level required by your application. Be cautious of potential overflow when accumulating products, as the result is chopped to 32 bits.", "example": "pmxvi8ger4 acc0, vs2, vs3, 15, 15"}
{"mnemonic": "pmxvf64ger", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector Float64 GER", "summary": "Masked version of Double-Precision MMA.", "syntax": "pmxvf64ger AT, XA, XB, XMSK, YMSK", "encoding": {"format": "MMIRR-form", "binary_pattern": "1 | 3 | PMSK | XMSK | YMSK | 0 | 59 | AT | / | XA | XB | 19 | AX | BX | /", "hex_opcode": "0x07900000EC0001D8", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "11", "clean": "11"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0 | 6 | 8 | 9 | 14 | 32 | 38 | 41 | 43 | 48 | 53 | 56 | 57 | 58 | "}, "operands": [{"name": "AT", "desc": "Accumulator"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "XMSK", "desc": "Mask A"}, {"name": "YMSK", "desc": "Mask B"}], "extension": "Prefixed", "description": "Prefixed masked version of the 64-bit floating-point matrix multiply-accumulate (MMA) instruction. Performs a rank-1 update of a 4×4 matrix accumulator using masked 64-bit floating-point elements, where XMSK controls which columns of XA participate and YMSK controls which rows of XB participate. No condition register or status flags are affected; this is a privileged MMA extension instruction.", "pseudocode": "for i in 0..1:\n  for j in 0..1:\n    if (XMSK[i] == 1) & (YMSK[j] == 1):\n      AT[i][j] ← AT[i][j] + (XA[i] × XB[j]) (FP64 × FP64 → FP64)", "page_found": "Page 939", "programming_notes": "The pmxvf64ger instruction is useful for performing masked outer product accumulation on floating-point vectors. Ensure that the mask registers XMSK and YMSK are correctly set to control which elements of the input vectors XAp and XB participate in the computation. This instruction operates at a privilege level that allows access to VSX (Vector Scalar Extensions) and requires proper alignment of the input and accumulator vectors for optimal performance.", "example": "pmxvf64ger acc0, vs2, vs3, 15, 15"}
{"mnemonic": "cnttzw", "architecture": "PowerISA", "full_name": "Count Trailing Zeros Word", "summary": "Counts the number of trailing zeros in the low 32-bits.", "syntax": "cnttzw RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | / | 538 | /", "hex_opcode": "0x7C000434", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "/", "clean": "/"}, {"raw": "538", "clean": "538"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}], "extension": "Base", "description": "Counts the number of trailing zero bits in the low 32 bits of general-purpose register RS and stores the count in RA. The count ranges from 0 to 32; if all 32 bits are zero, the result is 32. No condition register or status flags are affected.", "pseudocode": "count ← 0\nfor i in 0..31:\n  if RS[32+i] == 0 then count ← count + 1\n  else break\nRA ← count", "page_found": "Page 137", "special_registers": "CR0", "programming_notes": "The cnttzw instruction is useful for quickly determining the number of trailing zeros in a word, which can be helpful in bit manipulation tasks. Be cautious with Rc=1 as it modifies CR0 based on the result, affecting subsequent conditional operations. Ensure that the input register (RS) is correctly aligned and contains valid data to avoid unexpected results.", "example": "cnttzw r4, r3"}
{"mnemonic": "cnttzd", "architecture": "PowerISA", "full_name": "Count Trailing Zeros Doubleword", "summary": "Counts the number of trailing zeros in 64-bits.", "syntax": "cnttzd RA, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | / | 570 | /", "hex_opcode": "0x7C000474", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "/", "clean": "/"}, {"raw": "570", "clean": "570"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}], "extension": "Base", "description": "Counts the number of trailing zero bits in the full 64-bit general-purpose register RS and stores the count in RA. The count ranges from 0 to 64; if all 64 bits are zero, the result is 64. No condition register or status flags are affected.", "pseudocode": "count ← 0\nfor i in 0..63:\n  if RS[i] == 0 then count ← count + 1\n  else break\nRA ← count", "page_found": "Page 140", "programming_notes": "The cnttzd instruction is useful for quickly determining the position of the least significant set bit in a 64-bit value. It operates efficiently on any aligned doubleword, but be cautious with unaligned data as it may lead to unexpected results or exceptions. This instruction can be executed at user privilege level without requiring special permissions.", "example": "cnttzd r4, r3"}
{"mnemonic": "bctar", "architecture": "PowerISA", "full_name": "Branch Conditional to Target Address Register", "summary": "Conditional branch based on the contents of the Condition Register and the Count Register.", "syntax": "bctar BO,BI,BH                    (LK=0)", "encoding": {"format": "XL-form", "binary_pattern": "19 | BO | BI | / | BH | 560 | /", "hex_opcode": "0x4C000460", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "BO", "clean": "BO"}, {"raw": "BI", "clean": "BI"}, {"raw": "/", "clean": "/"}, {"raw": "BH", "clean": "BH"}, {"raw": "560", "clean": "560"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:18 | 19:20 | 21:30 | 31"}, "operands": [{"name": "BO", "desc": "Options"}, {"name": "BI", "desc": "CR Bit"}, {"name": "BH", "desc": "Hint"}], "extension": "Base", "description": "Performs a conditional branch to the target address held in the Target Address Register (TAR). The branch condition is determined by the values of the Branch Options (BO) field and the Condition Register bit (BI). The Count Register may also influence the branch condition depending on BO. No status flags are updated; the instruction may update the Link Register if suffixed with LK=1.", "pseudocode": "if condition(BO, BI, CTR) then\n  NIA ← TAR\nelse\n  NIA ← CIA + 4", "special_registers": "CTR, LR", "programming_notes": "In some systems, the system software will restrict usage of the bctar[l] instruction to only selected programs. If an attempt is made to execute the instruction when it is not available, the system error handler will be invoked.", "page_found": "Page 77 - 78", "example": "bctar 20, 0, BH                    (LK=0)"}
{"mnemonic": "mttar", "architecture": "PowerISA", "full_name": "Move To Target Address Register", "summary": "Moves a GPR value to the TAR.", "syntax": "mttar RS", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RS | 129 | 467 | /", "hex_opcode": "0x7C0FCBA6", "visual_parts": [{"raw": "mtspr 129, RS", "clean": "mtspr 129, RS"}], "bit_positions": "0:5 | 6:10 | 11:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}], "extension": "Base", "description": "Move To Target Address Register. Extended mnemonic for MTSPR (mtspr 815,RS). Copies register RS into the Target Address Register (TAR).", "pseudocode": "TAR ← RS", "special_registers": "TAR", "programming_notes": "The mttar instruction is used to copy a value from a general-purpose register (RS) into the Target Address Register (TAR). This register is typically used in conjunction with address translation operations. Ensure that the source register contains the correct address value before executing this instruction, as incorrect values can lead to unpredictable behavior or exceptions. This operation requires supervisor privilege level.", "example": "mttar r3"}
{"mnemonic": "mftar", "architecture": "PowerISA", "full_name": "Move From Target Address Register", "summary": "Reads the TAR into a GPR.", "syntax": "mftar RT", "encoding": {"format": "XFX-form", "binary_pattern": "31 | RT | 129 | 339 | /", "hex_opcode": "0x7C0FCAA6", "visual_parts": [{"raw": "mfspr RT, 129", "clean": "mfspr RT, 129"}], "bit_positions": "0:5 | 6:10 | 11:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}], "extension": "Base", "description": "Move From Target Address Register. Extended mnemonic for MFSPR (mfspr RT,815). Copies the Target Address Register (TAR) into register RT.", "pseudocode": "RT ← TAR", "special_registers": "TAR", "programming_notes": "The mftar instruction is used to copy the value of the Target Address Register (TAR) into a general-purpose register. This is typically done in contexts where precise control over branch targets or speculative execution is required. Ensure that the destination register RT is properly aligned and accessible at the privilege level executing the instruction, as accessing certain registers may require supervisor or hypervisor privileges.", "example": "mftar r3"}
{"mnemonic": "cmprb", "architecture": "PowerISA", "full_name": "Compare Ranged Byte", "summary": "Compares a byte value in one register to see if it falls within a range defined by another register.", "syntax": "cmprb BF, L, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | BF | / | L | RA | RB | 192 | Rc", "hex_opcode": "0x7C000180", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "BF", "clean": "BF"}, {"raw": "L", "clean": "L"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "192", "clean": "192"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9 | 10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "L", "desc": "Mode"}, {"name": "RA", "desc": "Byte"}, {"name": "RB", "desc": "Range"}, {"name": "RT", "desc": "Target General Purpose Register"}], "extension": "Base", "description": "Compares a byte value from RA against a range defined by two bytes in RB, setting the Condition Register field BF with the comparison result. The L field controls whether the comparison is unsigned (L=0) or signed (L=1). The instruction writes only the specified CR field; CR0 is not affected unless BF designates CR0.", "pseudocode": "byte_val ← RA[56:63]\nrange_low ← RB[56:63]\nrange_high ← RB[48:55]\nif L == 0 then\n  // unsigned comparison\n  result ← (byte_val >= range_low) & (byte_val <= range_high)\nelse\n  // signed comparison\n  result ← (byte_val[signed] >= range_low[signed]) & (byte_val[signed] <= range_high[signed])\nCR[BF] ← (result, 0, 0, 0)", "special_registers": "CR, CR0", "programming_notes": "cmprb is useful for implementing character typing functions such as isalpha(), isdigit(), isupper(), and islower() that are implemented using one or two range compares of the character. A single-range compare can be implemented with an addi to load the upper and lower bounds in the range, such as isdigit(). A combination of addi-addis can be used to set up 2 ranges, such as for isalpha().", "page_found": "Page 127 - 128", "example": "cmprb cr0, 0, r4, r5"}
{"mnemonic": "paste.", "architecture": "PowerISA", "full_name": "Paste and Record", "summary": "Paste operation that updates CR0 to indicate success/fail.", "syntax": "paste. RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 770 | 1", "hex_opcode": "0x7C00070C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "770", "clean": "770"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Dest"}, {"name": "RB", "desc": "Control"}], "extension": "Privileged", "description": "A privileged operation that pastes data into a target addressed by RA, with control information from RB. The record form (Rc=1) updates CR0 to reflect the success or failure of the paste operation. This instruction is used in conjunction with copy-paste semantics for atomic data movement and synchronization in a multithreaded environment.", "pseudocode": "status ← paste_operation(RA, RB)\nif Rc == 1 then\n  CR0[LT] ← 0\n  CR0[GT] ← 0\n  CR0[EQ] ← (status == success)\n  CR0[SO] ← 0", "page_found": "Page 1044", "special_registers": "CR0", "programming_notes": "The paste instruction is used to transfer data from the copy buffer to memory. Ensure that RA and RB are correctly set to calculate the effective address (EA). If L=1, metadata in the copy buffer will be cleared before posting. Handle errors by checking CR0 for error codes.", "example": "paste. r4, r5"}
{"mnemonic": "stqcx.", "architecture": "PowerISA", "full_name": "Store Quadword Conditional Indexed", "summary": "Stores a quadword from a register to memory if a reservation exists and the conditions are met.", "syntax": "stqcx. RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 182 | 1", "hex_opcode": "0x7C00016D", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "182", "clean": "182"}, {"raw": "1", "clean": "1"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RS", "desc": "Src Pair (Even/Odd)"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}, {"name": "RSp", "desc": "Source General Purpose Register containing the data to be stored"}], "extension": "Base", "description": "The stqcx. instruction stores a quadword from RSp to memory at the effective address (EA) calculated as RA + RB, but only if a reservation exists for that location and the reservation length is 16 bytes. If the reservation does not exist or the conditions are not met, no store is performed.", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + (RB)\nif RESERVE then\n    if RESERVE_LENGTH = 16 and RESERVE_ADDR = real_addr(EA) then\n        MEM(EA, 16) ← (RSp)\n        undefined_case ← 0\n        store_performed ← 1\n    else\n        z ← smallest real page size supported by implementation\n        if RESERVE_ADDR ÷ z = real_addr(EA) ÷ z then\n            undefined_case ← 1\n        else\n            undefined_case ← 0\n            store_performed ← 0\nelse\n    undefined_case ← 0\n    store_performed ← 0\nif undefined_case then\n    u1 ← undefined 1-bit value\n    if u1 then\n        MEM(EA, 16) ← (RSp)\n    u2 ← undefined 1-bit value\n    CR0 ← 0b00 || u2 || XERSO\nelse\n    CR0 ← 0b00 || store_performed || XERSO\nRESERVE ← 0", "special_registers": "CR0, XER", "page_found": "Page 1059 - 1060", "programming_notes": "Succeeds only if a valid reservation exists on the target address. Sets CR0[EQ] to 1 on success, 0 on failure. Must always be used in a retry loop that re-executes the load-reserve instruction on failure.", "example": "stqcx. r3, r4, r5"}
{"mnemonic": "lq", "architecture": "PowerISA", "full_name": "Load Quadword", "summary": "Loads 128 bits into two adjacent GPRs (Even/Odd pair).", "syntax": "lq RTp, DQ(RA)", "encoding": {"format": "DQ-form", "binary_pattern": "56 | RTp | RA | DQ | /", "hex_opcode": "0xE0000000", "visual_parts": [{"raw": "56", "clean": "56"}, {"raw": "RTp", "clean": "RTp"}, {"raw": "RA", "clean": "RA"}, {"raw": "DQ", "clean": "DQ"}, {"raw": "0", "clean": "0"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:27 | 28:31"}, "operands": [{"name": "RTp", "desc": "Target Pair"}, {"name": "DQ", "desc": "Disp"}, {"name": "RA", "desc": "Base"}, {"name": "disp", "desc": "Displacement value"}, {"name": "EA", "desc": "Effective Address"}], "extension": "Base", "description": "For lq, the quadword in storage addressed by EA is loaded into an even-odd pair of GPRs. In Big-Endian mode, the even-numbered GPR is loaded with the doubleword from storage addressed by EA and the odd-numbered GPR is loaded with the doubleword addressed by EA+8. In Little-Endian mode, the even-numbered GPR is loaded with the byte-reversed doubleword from storage addressed by EA+8 and the odd-numbered GPR is loaded with the byte-reversed doubleword addressed by EA.", "pseudocode": "if 'lq' then\n    EA ← (RA|0) + EXTS64(DQ||0b0000)\n    if Big-Endian byte ordering then\n        RTp||RTp+1 ← MEM(EA,16)\n    if Little-Endian byte ordering then\n        RTp||RTp+1 ← MEM(EA,16)", "programming_notes": "The lq and stq instructions exist primarily to permit software to access quadwords in storage “atomically”.", "page_found": "Page 98 - 100", "example": "lq r4, 0(r4)"}
{"mnemonic": "stq", "architecture": "PowerISA", "full_name": "Store Quadword", "summary": "Stores a quadword from two general-purpose registers into memory.", "syntax": "stq RSp, DQ(RA)", "encoding": {"format": "DQ-form", "binary_pattern": "1 | RSp | RA | DS | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0", "hex_opcode": "0xF8000002", "visual_parts": [{"raw": "62", "clean": "62"}, {"raw": "RSp", "clean": "RSp"}, {"raw": "RA", "clean": "RA"}, {"raw": "DQ", "clean": "DQ"}, {"raw": "2", "clean": "2"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "RSp", "desc": "Src Pair"}, {"name": "DQ", "desc": "Disp"}, {"name": "RA", "desc": "Base"}, {"name": "disp", "desc": "Displacement value"}], "extension": "Base", "description": "Stores a 128-bit quadword from two consecutive general-purpose registers (RSp and RSp+1) into memory at the address formed by adding the base register (RA) and a 16-byte-aligned displacement. The displacement is a signed 12-bit value left-shifted by 4 bits, providing a range of ±2048 bytes on a 16-byte boundary. This instruction does not modify the condition register or status flags.", "pseudocode": "EA ← if RA = 0 then 0 else GPR[RA]\nEA ← EA + EXTS(DQ || 0b0000)\nMEM(EA, 16) ← GPR[RSp] || GPR[RSp+1]", "programming_notes": "In versions of the architecture prior to V. 2.07, this instruction was privileged.", "page_found": "Page 99 - 100", "example": "stq r4, 0(r4)"}
{"mnemonic": "plh", "architecture": "PowerISA", "full_name": "Prefixed Load Halfword", "summary": "Loads 16-bit halfword using 34-bit offset.", "syntax": "plh RT, D(RA), R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 40 | RT | RA | D1", "hex_opcode": "0x04000000A0000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "...", "clean": "..."}, {"raw": "40", "clean": "40"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "D", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "R", "desc": "PC-Rel"}], "extension": "Prefixed", "description": "Loads a 16-bit halfword from memory using a 34-bit signed offset (split between prefix and suffix) and zero-extends the loaded value into the target register. The effective address is computed from a base register or the program counter (determined by the R bit), and both absolute and PC-relative modes are supported. This is a two-instruction prefixed load with no condition register or status flag effects.", "pseudocode": "D ← EXTS(D0 || D1)\nEA ← if R = 0 then (if RA = 0 then 0 else GPR[RA]) + D else CIA + D\nRT ← (0)^48 || MEM(EA, 2)", "example": "plh r3, 0(r4), 0"}
{"mnemonic": "plha", "architecture": "PowerISA", "full_name": "Prefixed Load Halfword Algebraic", "summary": "Loads 16-bit halfword (Sign Extended) using 34-bit offset.", "syntax": "plha RT, D(RA), R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 42 | RT | RA | D1", "hex_opcode": "0x06000000A8000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "...", "clean": "..."}, {"raw": "42", "clean": "42"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "D", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "R", "desc": "PC-Rel"}], "extension": "Prefixed", "description": "Loads a 16-bit halfword from memory using a 34-bit signed offset (split between prefix and suffix), sign-extends the loaded value to 64 bits, and stores the result in the target register. The effective address is computed from a base register or the program counter (determined by the R bit), supporting both absolute and PC-relative addressing modes. This is a two-instruction prefixed load with no condition register or status flag effects.", "pseudocode": "D ← EXTS(D0 || D1)\nEA ← if R = 0 then (if RA = 0 then 0 else GPR[RA]) + D else CIA + D\nRT ← EXTS(MEM(EA, 2))", "page_found": "Page 87", "programming_notes": "The plha instruction is commonly used for loading a halfword from memory into the upper half of a register while zeroing out the lower half. Ensure that the base and index registers are correctly set to avoid incorrect memory access. This instruction operates at user privilege level and may raise an exception if the effective address is invalid or if there's a protection fault.", "example": "plha r3, 0(r4), 0"}
{"mnemonic": "plwa", "architecture": "PowerISA", "full_name": "Prefixed Load Word Algebraic", "summary": "Loads 32-bit word (Sign Extended) using 34-bit offset.", "syntax": "plwa RT, D(RA), R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 41 | RT | RA | D1", "hex_opcode": "0x04000000A4000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "...", "clean": "..."}, {"raw": "41", "clean": "41"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "D", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "R", "desc": "PC-Rel"}], "extension": "Prefixed", "description": "Loads a 32-bit word from memory using a 34-bit signed offset (split between prefix and suffix), sign-extends the loaded value to 64 bits, and stores the result in the target register. The effective address is computed from a base register or the program counter (determined by the R bit), supporting both absolute and PC-relative addressing modes. This is a two-instruction prefixed load with no condition register or status flag effects.", "pseudocode": "D ← EXTS(D0 || D1)\nEA ← if R = 0 then (if RA = 0 then 0 else GPR[RA]) + D else CIA + D\nRT ← EXTS(MEM(EA, 4))", "page_found": "Page 90", "programming_notes": "The plwa instruction is commonly used for loading a word from memory into a register while ensuring the upper 32 bits are zeroed. Ensure that the base address in RA and the offset in RB are correctly set to avoid incorrect memory access. This instruction operates at user privilege level and will raise an exception if the effective address is out of bounds or if there is a protection fault.", "example": "plwa r3, 0(r4), 0"}
{"mnemonic": "pstb", "architecture": "PowerISA", "full_name": "Prefixed Store Byte", "summary": "Stores byte using 34-bit offset.", "syntax": "pstb RS, D(RA), R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 38 | RS | RA | D1", "hex_opcode": "0x0600000098000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "...", "clean": "..."}, {"raw": "38", "clean": "38"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "D", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "R", "desc": "PC-Rel"}], "extension": "Prefixed", "description": "Stores the least significant byte of the source register to memory using a 34-bit signed offset (split between prefix and suffix). The effective address is computed from a base register or the program counter (determined by the R bit), supporting both absolute and PC-relative addressing modes. This is a two-instruction prefixed store with no condition register or status flag effects.", "pseudocode": "D ← EXTS(D0 || D1)\nEA ← if R = 0 then (if RA = 0 then 0 else GPR[RA]) + D else CIA + D\nMEM(EA, 1) ← GPR[RS][56:63]", "page_found": "Page 93", "programming_notes": "The pstb instruction is useful for storing a single byte from the uppermost byte of a register into memory. Ensure that RA and RB are correctly set to avoid incorrect memory addresses. This instruction operates at user privilege level and can raise an exception if the EA is out of bounds or if there's a protection fault.", "example": "pstb r3, 0(r4), 0"}
{"mnemonic": "psth", "architecture": "PowerISA", "full_name": "Prefixed Store Halfword", "summary": "Stores halfword using 34-bit offset.", "syntax": "psth RS, D(RA), R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 44 | RS | RA | D1", "hex_opcode": "0x06000000B0000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "...", "clean": "..."}, {"raw": "44", "clean": "44"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "D", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "R", "desc": "PC-Rel"}], "extension": "Prefixed", "description": "Stores the least significant 16 bits of the source register to memory using a 34-bit signed offset (split between prefix and suffix). The effective address is computed from a base register or the program counter (determined by the R bit), supporting both absolute and PC-relative addressing modes. This is a two-instruction prefixed store with no condition register or status flag effects.", "pseudocode": "D ← EXTS(D0 || D1)\nEA ← if R = 0 then (if RA = 0 then 0 else GPR[RA]) + D else CIA + D\nMEM(EA, 2) ← GPR[RS][48:63]", "page_found": "Page 94", "programming_notes": "The psth instruction is used to store the lower half of a doubleword from register RS into memory. It's important to ensure that RA and RB are correctly set to calculate the effective address. If RA is zero, the base address is considered as zero. This instruction operates at user privilege level and can raise an exception if there's a memory access violation.", "example": "psth r3, 0(r4), 0"}
{"mnemonic": "pstw", "architecture": "PowerISA", "full_name": "Prefixed Store Word", "summary": "Stores word using 34-bit offset.", "syntax": "pstw RS, D(RA), R", "encoding": {"format": "MLS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 36 | RS | RA | D1", "hex_opcode": "0x0600000090000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "...", "clean": "..."}, {"raw": "36", "clean": "36"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "D", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "R", "desc": "PC-Rel"}], "extension": "Prefixed", "description": "Stores the least significant 32 bits of the source register to memory using a 34-bit signed offset (split between prefix and suffix). The effective address is computed from a base register or the program counter (determined by the R bit), supporting both absolute and PC-relative addressing modes. This is a two-instruction prefixed store with no condition register or status flag effects.", "pseudocode": "D ← EXTS(D0 || D1)\nEA ← if R = 0 then (if RA = 0 then 0 else GPR[RA]) + D else CIA + D\nMEM(EA, 4) ← GPR[RS][32:63]", "programming_notes": "The pstw instruction is used to store a word from a source register into memory. It supports different addressing modes based on the prefix field and privilege level. Ensure that the base address in RA is properly aligned for optimal performance, and be cautious of potential exceptions if the EA calculation results in an invalid address.", "example": "pstw r3, 0(r4), 0"}
{"mnemonic": "xscvudqp", "architecture": "PowerISA", "full_name": "VSX Scalar Convert Unsigned Doubleword to Quad-Precision", "summary": "Converts 64-bit Unsigned Integer to 128-bit Float.", "syntax": "xscvudqp vD, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | / | vB | 724 | /", "hex_opcode": "0xFC020688", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "/", "clean": "/"}, {"raw": "vB", "clean": "vB"}, {"raw": "724", "clean": "724"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VSX", "description": "Converts an unsigned 64-bit doubleword value from the source VSR into a 128-bit IEEE 754 quadruple-precision (quad) floating-point value and stores the result in the target VSR. This VSX scalar operation uses the default rounding mode from FPSCR and updates the floating-point status and control register (FPSCR) with exception flags if applicable. The instruction requires VSX facility enablement.", "pseudocode": "FRT ← ConvertUnsignedIntegerToQuadPrecision(FRB[0:63], FPSCR[RN])\nFPSCR ← UpdateFlags(FPSCR)", "page_found": "Page 888", "special_registers": "FPSCR, MSR", "programming_notes": "This instruction is used to convert an unsigned doubleword integer into a quad-precision floating-point format. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting the MSR.VSX bit. The conversion may alter the FPSCR register fields, so be aware of potential precision flags. This operation does not raise exceptions for normal input ranges.", "example": "xscvudqp vd, vb"}
{"mnemonic": "xscvsdqp", "architecture": "PowerISA", "full_name": "VSX Scalar Convert Signed Doubleword to Quad-Precision", "summary": "Converts a signed doubleword integer from VSR[VRB+32] to quad-precision floating-point in VSR[VRT+32].", "syntax": "xscvsdqp vD, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | / | vB | 756 | /", "hex_opcode": "0xFC0A0688", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "/", "clean": "/"}, {"raw": "vB", "clean": "vB"}, {"raw": "756", "clean": "756"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector-Scalar Register"}, {"name": "VRB", "desc": "Source Vector-Scalar Register"}], "extension": "VSX", "description": "The instruction converts the signed integer value in doubleword element 0 of VSR[VRB+32] to quad-precision floating-point format and stores it in VSR[VRT+32]. The FPSCR.FPRF, FPSCR.FR, and FPSCR.FI fields are updated accordingly.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nsrc ← bfp_CONVERT_FROM_SI64(VSR[VRB+32].dword[0])\nresult ← bfp128_CONVERT_FROM_BFP(src)\nVSR[VRT+32] ← result\nFPSCR.FPRF ← fprf_CLASS_BFP128(result)\nFPSCR.FR ← 0\nFPSCR.FI ← 0", "special_registers": "FPSCR (FPRF, FR, FI)", "page_found": "Page 887 - 888", "programming_notes": "This instruction is commonly used for converting signed integers to quad-precision floating-point numbers in VSX registers. Ensure that the VSX facility is enabled (MSR.VSX=1) to avoid exceptions. The conversion respects standard rounding rules, and the FPSCR flags are updated accordingly. Be cautious of potential overflow or underflow conditions when dealing with very large or small integers.", "example": "xscvsdqp vd, vb"}
{"mnemonic": "xscvqpdp", "architecture": "PowerISA", "full_name": "VSX Scalar Convert Quad-Precision to Double", "summary": "Converts a quad-precision floating-point value to a double-precision floating-point value with round-to-even rounding.", "syntax": "xscvqpdp vD, vB", "encoding": {"format": "X-form", "binary_pattern": "1 | VRT | 0 | VRB | RO | 0 | 0 | 0", "hex_opcode": "0xFC140688", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "/", "clean": "/"}, {"raw": "vB", "clean": "vB"}, {"raw": "836", "clean": "836"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9 | 10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VSX", "description": "Converts a 128-bit quad-precision floating-point value in VSR vB to a 64-bit double-precision floating-point value, placing the result in the low 64 bits of VSR vD using round-to-even rounding. FPSCR exception flags (XX, ZX, OX, UX) are updated based on the conversion result. Requires VSX support.", "pseudocode": "vD[0:63] ← ConvertQuadPrecisionToDoublePrecision(vB[0:127])\nFPSCR[XX,ZX,OX,UX] ← updated based on conversion result", "special_registers": "FPSCR, FPRF, FR, FI, VXSNAN, OX, UX, XX", "page_found": "Page 826 - 827", "programming_notes": "This instruction is used to convert a quad-precision floating-point number to a double-precision floating-point number. Ensure that the VSX facility is enabled in the MSR register, as attempting to use this instruction when VSX is unavailable will result in an exception. The conversion respects the rounding mode specified in the FPSCR register, and any exceptions such as invalid operation (VXSNAN), overflow (OX), underflow (UX), or inexact (XX) are recorded in the FPSCR. The result is stored in the first doubleword of the destination vector register, with the second doubleword set to zero.", "example": "xscvqpdp vd, vb"}
{"mnemonic": "xsaddqpo", "architecture": "PowerISA", "full_name": "VSX Scalar Add Quad-Precision Odd", "summary": "Used for Quad-Precision arithmetic on hardware that splits quads.", "syntax": "xsaddqpo vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | vA | vB | 4 | /", "hex_opcode": "0xFC000008", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "4", "clean": "4"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VSX", "description": "Adds the odd (high-order) portions of two 128-bit quad-precision floating-point values in VSRs vA and vB, placing the result in VSR vD. This instruction is used on systems that split quad-precision operands into even/odd register pairs. FPSCR exception flags are updated based on the operation result. Requires VSX support.", "pseudocode": "vD ← (vA + vB) as quad-precision (odd portion operation)\nFPSCR[XX,ZX,OX,UX,VXISI] ← updated based on operation result", "page_found": "Page 656", "special_registers": "FPSCR", "programming_notes": "The xsaddqpo instruction is used for adding two quad-precision floating-point numbers using the round-to-odd rounding mode. Ensure that the input operands are correctly aligned and that the VSX registers are properly set up. This instruction operates at a privilege level that allows access to floating-point operations, and it may raise exceptions if invalid operations occur, such as signaling NaNs or infinities. Performance can be impacted by the precision of the operation and the current rounding mode settings in the FPSCR register.", "example": "xsaddqpo vd, va, vb"}
{"mnemonic": "xssubqpo", "architecture": "PowerISA", "full_name": "VSX Scalar Subtract Quad-Precision Odd", "summary": "Used for Quad-Precision arithmetic on hardware that splits quads.", "syntax": "xssubqpo VRT,VRA,VRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | FRA | FRB | 514 | Rc", "hex_opcode": "0xFC000408", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "516", "clean": "516"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector-Scalar Register"}, {"name": "VRA", "desc": "Source Vector-Scalar Register"}, {"name": "VRB", "desc": "Source Vector-Scalar Register"}], "extension": "VSX", "description": "Subtracts the odd (high-order) portion of a 128-bit quad-precision floating-point value in VSR vB from the odd portion in VSR vA, placing the result in VSR vD. This instruction is used on systems that split quad-precision operands into even/odd register pairs. FPSCR exception flags are updated based on the operation result. Requires VSX support.", "pseudocode": "vD ← (vA - vB) as quad-precision (odd portion operation)\nFPSCR[XX,ZX,OX,UX,VXISI] ← updated based on operation result", "page_found": "Page 679 - 680", "special_registers": "FPSCR", "programming_notes": "This instruction is commonly used for precise floating-point arithmetic operations in scientific computing. Be cautious of NaN handling; if src2 is a Quiet NaN, it will propagate as the result without performing any subtraction. Ensure that inputs are properly aligned to avoid alignment faults. This operation requires FPSCR for exception flags and rounding modes.", "example": "xssubqpo vd, va, vb"}
{"mnemonic": "xsdivqpo", "architecture": "PowerISA", "full_name": "VSX Scalar Divide Quad-Precision Odd", "summary": "Used for Quad-Precision arithmetic on hardware that splits quads.", "syntax": "xsdivqpo vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | vA | vB | 548 | /", "hex_opcode": "0xFC000448", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "548", "clean": "548"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VSX", "description": "Divides the odd (high-order) portion of a 128-bit quad-precision floating-point value in VSR vA by the odd portion in VSR vB, placing the result in VSR vD. This instruction is used on systems that split quad-precision operands into even/odd register pairs. FPSCR exception flags are updated, including division-by-zero detection (ZX). Requires VSX support.", "pseudocode": "vD ← (vA / vB) as quad-precision (odd portion operation)\nFPSCR[XX,ZX,OX,UX,VXIDI,VXISI] ← updated based on operation result", "page_found": "Page 662", "special_registers": "FPSCR, MSR", "programming_notes": "The xsdivqpo instruction performs a scalar divide operation on two quad-precision floating-point values, rounding the result to the nearest odd integer when there is a tie. Ensure that VSX is enabled in the MSR register; otherwise, an exception will be raised. Be cautious with division by zero, as it results in infinity or NaN depending on the sign of the dividend.", "example": "xsdivqpo vd, va, vb"}
{"mnemonic": "xssqrtqpo", "architecture": "PowerISA", "full_name": "VSX Scalar Square Root Quad-Precision Odd", "summary": "Used for Quad-Precision arithmetic on hardware that splits quads.", "syntax": "xssqrtqpo vD, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | 0 | vB | 676 | /", "hex_opcode": "0xFC1B0648", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "676", "clean": "676"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VSX", "description": "Computes the square root of the odd (high-order) portion of a 128-bit quad-precision floating-point value in VSR vB, placing the result in VSR vD. This instruction is used on systems that split quad-precision operands into even/odd register pairs. FPSCR exception flags are updated based on the operation result. Requires VSX support.", "pseudocode": "vD ← sqrt(vB) as quad-precision (odd portion operation)\nFPSCR[XX,ZX,OX,UX,VXSQRT] ← updated based on operation result", "page_found": "Page 674", "special_registers": "FPSCR", "programming_notes": "The xssqrtqpo instruction is used to compute the square root of a quad-precision floating-point value using the Round to Odd rounding mode. It handles signaling NaNs by raising an Invalid Operation exception and setting VXSNAN in the FPSCR. Ensure that the input is properly aligned and check the FPSCR for exceptions after execution.", "example": "xssqrtqpo vd, vb"}
{"mnemonic": "xsrqpi", "architecture": "PowerISA", "full_name": "VSX Scalar Round Quad-Precision to Integer", "summary": "Rounds a quad-precision floating-point value in VRB to an integer and places the result in VRT.", "syntax": "xsrqpi vD, vB, R", "encoding": {"format": "Z23-form", "binary_pattern": "63 | VRT | /// | R | VRB | RMC | 5 | EX", "hex_opcode": "0xFC00000A", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "/", "clean": "/"}, {"raw": "vB", "clean": "vB"}, {"raw": "R", "clean": "R"}, {"raw": "5", "clean": "5"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:14 | 15 | 16:20 | 21:22 | 23:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "R", "desc": "Mode"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "RMC", "desc": "Rounding Mode Control"}], "extension": "VSX", "description": "Rounds a 128-bit quad-precision floating-point value in VSR vB to an integer value using rounding mode R, placing the result back in VSR vD as a quad-precision value. The rounding mode R is encoded in bit 31 (0=round-to-nearest-even, 1=round-toward-zero). FPSCR exception flags (XX, ZX) are updated based on the rounding operation. Requires VSX support.", "pseudocode": "rmode ← (R == 0) ? RoundToNearestEven : RoundTowardZero\nvD ← RoundToInteger(vB, rmode) as quad-precision\nFPSCR[XX,ZX] ← updated based on rounding result", "special_registers": "FPSCR, VXSNAN, FX", "page_found": "Page 841 - 842", "programming_notes": "The xsrqpi instruction is used to round a quad-precision floating-point value to an integer. Ensure that the VSX feature is enabled in the MSR register. Be cautious with NaN values, as they can trigger exceptions and set specific flags. The rounding mode is determined by the RMC field and the FPSCR.RN setting when R=0.", "example": "xsrqpi vd, vb, 0"}
{"mnemonic": "xsrqpix", "architecture": "PowerISA", "full_name": "VSX Scalar Round Quad-Precision to Integer Extended", "summary": "Rounds a Quad float to a Quad integer (Exact).", "syntax": "xsrqpix vD, vB, R", "encoding": {"format": "Z23-form", "binary_pattern": "63 | VRT | /// | R | VRB | RMC | 5 | EX", "hex_opcode": "0xFC00000B", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "/", "clean": "/"}, {"raw": "vB", "clean": "vB"}, {"raw": "R", "clean": "R"}, {"raw": "37", "clean": "37"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:14 | 15 | 16:20 | 21:22 | 23:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "R", "desc": "Mode"}], "extension": "VSX", "description": "Rounds a quad-precision floating-point value in FRB to a quad-precision integer, placing the result in FRT. The rounding mode is specified by the R operand. FPSCR is updated with exceptions; this is a VSX instruction requiring VSX support.", "pseudocode": "let temp ← RoundToQuadInt(FRB, R)\nFRT ← temp\nFPSCR[FPRF, XX, ZX, UX, OX] ← updated based on operation", "page_found": "Page 842", "special_registers": "FPSCR, MSR", "programming_notes": "The xsrqpix instruction is used to round a quad-precision floating-point number to an integer. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register, as attempting to use this instruction when VSX is unavailable will result in an exception. The rounding mode is determined by the FPSCR register, and the instruction handles special cases like NaNs by setting appropriate flags in the FPSCR.", "example": "xsrqpix vd, vb, 0"}
{"mnemonic": "fmr", "architecture": "PowerISA", "full_name": "Floating Move Register", "summary": "Copies a float register (Pseudo: for FRB).", "syntax": "fmr FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | 0 | FRB | 72 | /", "hex_opcode": "0xFC000090", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "72", "clean": "72"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "The contents of register FRB are placed into register FRT.", "pseudocode": "FRT <- FRB", "special_registers": "CR1, (if, Rc=1), FPSCR", "page_found": "Page 195 - 196", "programming_notes": "The fmr instruction is used to copy the contents of one floating-point register (FRB) to another (FRT). It does not alter any special registers unless Rc=1, in which case it updates CR1. Ensure that both source and destination registers are properly aligned for optimal performance.", "example": "fmr f1, f3"}
{"mnemonic": "fabs", "architecture": "PowerISA", "full_name": "Floating Absolute Value", "summary": "Computes absolute value of a float.", "syntax": "fabs FRT, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | 0 | FRB | 264 | /", "hex_opcode": "0xFC000210", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "264", "clean": "264"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "Computes the absolute value of a double-precision floating-point number in FRB and places the result in FRT. The sign bit is cleared while all other bits remain unchanged. No exception flags are set.", "pseudocode": "FRT ← abs(FRB)", "page_found": "Page 196", "special_registers": "FPSCR", "programming_notes": "The fabs instruction is commonly used when you need to ensure that a floating-point number is positive without altering its magnitude. Be cautious with NaN (Not-a-Number) values, as fabs will return a quiet NaN if the input is a signaling NaN. This instruction operates at user privilege level and does not raise exceptions for normal inputs; however, it respects the rounding mode set in the FPSCR register.", "example": "fabs f1, f3"}
{"mnemonic": "fneg", "architecture": "PowerISA", "full_name": "Floating Negate", "summary": "Negates a float.", "syntax": "fneg FRT, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | 0 | FRB | 40 | /", "hex_opcode": "0xFC000050", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "40", "clean": "40"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "Negates a double-precision floating-point number in FRB by flipping the sign bit and places the result in FRT. No exception flags are set.", "pseudocode": "FRT ← -FRB", "special_registers": "FPSCR", "programming_notes": "The fneg instruction is commonly used to change the sign of a floating-point number. Ensure that the source register (FRA) contains a valid floating-point value before executing this instruction. The result is stored in the target register (FRT), which must be distinct from FRA. This operation does not affect any special registers like FPSCR unless there are exceptions such as invalid operations or overflow.", "example": "fneg f1, f3"}
{"mnemonic": "fnabs", "architecture": "PowerISA", "full_name": "Floating Negative Absolute Value", "summary": "Computes negative absolute value of a float.", "syntax": "fnabs FRT, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | 0 | FRB | 136 | /", "hex_opcode": "0xFC000110", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "136", "clean": "136"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "Computes the negative absolute value of a double-precision floating-point number in FRB and places the result in FRT. The sign bit is set to 1 while all other bits are taken from the absolute value. No exception flags are set.", "pseudocode": "FRT ← -abs(FRB)", "page_found": "Page 196", "special_registers": "FPSCR", "programming_notes": "The fnabs instruction is useful for converting a positive floating-point number to its negative counterpart while maintaining its magnitude. Ensure that the input register (FRB) contains a valid floating-point value; otherwise, the result may be undefined. This operation does not affect the FPSCR register, so no exception flags are set based on the input value.", "example": "fnabs f1, f3"}
{"mnemonic": "fcpsgn", "architecture": "PowerISA", "full_name": "Floating Copy Sign", "summary": "Copies sign from FRB to FRA.", "syntax": "fcpsgn FRT, FRA, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | FRA | FRB | 8 | /", "hex_opcode": "0xFC000010", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "8", "clean": "8"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Source"}, {"name": "FRB", "desc": "Sign Source"}], "extension": "Floating-Point", "description": "Copies the sign bit from FRB to FRA, placing the result in FRT. The magnitude of FRA is preserved while the sign is replaced by that of FRB. No exception flags are set.", "pseudocode": "FRT ← (abs(FRA) with sign bit from FRB)", "page_found": "Page 196", "special_registers": "FPSCR", "programming_notes": "Use fcpsgn to change the sign of a floating-point number without altering its magnitude. Ensure both source and target registers are properly aligned and accessible. This instruction operates at user privilege level but may raise exceptions if operands are invalid or if there are precision issues.", "example": "fcpsgn f1, f2, f3"}
{"mnemonic": "fsel", "architecture": "PowerISA", "full_name": "Floating Select", "summary": "Selects FRA if FRC >= 0, else FRB (Optional).", "syntax": "fsel FRT,FRA,FRC,FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | FRA | FRB | FRC | 23 | /", "hex_opcode": "0xFC00002E", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "FRC", "clean": "FRC"}, {"raw": "23", "clean": "23"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "True"}, {"name": "FRC", "desc": "Cond"}, {"name": "FRB", "desc": "False"}], "extension": "Floating-Point", "description": "Selects between FRA and FRB based on the sign of FRC: if FRC ≥ 0, the result is FRA; otherwise, the result is FRB. The optional dot (.) form sets CR1 based on the result's FPRF. This is an optional category instruction.", "pseudocode": "if FRC ≥ 0.0 then\n  FRT ← FRA\nelse\n  FRT ← FRB\nif Rc = 1 then CR1 ← FPRF(FRT)", "special_registers": "CR1, FPSCR", "programming_notes": "Warning: Care must be taken in using fsel if IEEE compatibility is required, or if the values being tested can be NaNs or infinities.", "page_found": "Page 215 - 216", "example": "fsel f1, f2, f4, f3"}
{"mnemonic": "fsqrt", "architecture": "PowerISA", "full_name": "Floating Square Root", "summary": "Computes the square root of a floating-point number.", "syntax": "fsqrt FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | 0 | FRB | 22 | /", "hex_opcode": "0xFC00002C", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "22", "clean": "22"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "The square root of the floating-point operand in register FRB is placed into register FRT. If the most significant bit of the resultant significand is not 1, the result is normalized. The result is rounded to the target precision under control of RN and placed into register FRT.", "special_registers": "FPSCR, CR1", "page_found": "Page 199 - 200", "pseudocode": "if FRB < 0 then\n    FRT ← QNaN\n    if VE = 1 then raise VXSQRT exception\nelse\n    FRT ← sqrt(FRB)\n    if most significant bit of FRT's significand is not 1 then normalize FRT\n    round FRT to target precision under control of RN\nend if\nFPSCR.FPRF ← class and sign of FRT\nif VE = 1 and result is invalid operation exception then raise VXSQRT exception", "programming_notes": "The fsqrt instruction computes the square root of a floating-point number. It handles negative inputs by returning a quiet NaN (QNaN) and may raise an exception if enabled. Ensure the input is non-negative to avoid unexpected results. The result is normalized and rounded according to the current rounding mode, which can affect precision.", "example": "fsqrt f1, f3"}
{"mnemonic": "fsqrts", "architecture": "PowerISA", "full_name": "Floating Square Root Single", "summary": "Computes square root (Single).", "syntax": "fsqrts FRT, FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | 0 | FRB | 22 | /", "hex_opcode": "0xEC00002C", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "22", "clean": "22"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "Computes the square root of a single-precision floating-point value in FRB and places the double-precision result in FRT. FPSCR exception flags (XX, ZX, UX, OX, VXSQRT) are updated appropriately.", "pseudocode": "FRT ← sqrt(FRB)\nFPSCR[FPRF, XX, ZX, UX, OX, VXSQRT] ← updated based on operation", "page_found": "Page 200", "special_registers": "FPSCR", "programming_notes": "The fsqrts instruction is commonly used for calculating the square root of single-precision floating-point numbers. Ensure that the input register FRB contains a valid single-precision float; otherwise, the result may be undefined or trigger an exception. The instruction operates at user privilege level and does not require any specific ordering or alignment of data. Be aware of rounding modes controlled by RN, as they can affect the precision of the result.", "example": "fsqrts f1, f3"}
{"mnemonic": "fmsub", "architecture": "PowerISA", "full_name": "Floating Multiply-Subtract", "summary": "Multiplies two floating-point values and subtracts a third.", "syntax": "fmsub FRT, FRA, FRC, FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | FRA | FRB | FRC | 28 | /", "hex_opcode": "0xFC000038", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "FRC", "clean": "FRC"}, {"raw": "28", "clean": "28"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "A"}, {"name": "FRC", "desc": "C"}, {"name": "FRB", "desc": "B"}], "extension": "Floating-Point", "description": "Performs a fused multiply-subtract operation: (FRA × FRC) - FRB in extended precision, then rounds to double-precision and places the result in FRT. FPSCR exception flags and FPRF are updated; this provides higher precision than separate multiply and subtract instructions.", "pseudocode": "FRT ← Round((FRA × FRC) - FRB)\nFPSCR[FPRF, XX, ZX, UX, OX, VXISI] ← updated based on operation", "special_registers": "FPSCR", "programming_notes": "The fmsub instruction is useful for performing fused multiply-subtract operations, which can help reduce rounding errors. Ensure that the input registers are properly aligned and contain valid floating-point numbers to avoid exceptions. This operation requires FPSCR to manage precision and exception flags.", "example": "fmsub f1, f2, f4, f3"}
{"mnemonic": "fnmadd", "architecture": "PowerISA", "full_name": "Floating Negative Multiply-Add", "summary": "Performs a floating-point negative multiply-add operation.", "syntax": "fnmadd FRT,FRA,FRC,FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | FRA | FRB | FRC | 31 | /", "hex_opcode": "0xFC00003E", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "FRC", "clean": "FRC"}, {"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "A"}, {"name": "FRC", "desc": "C"}, {"name": "FRB", "desc": "B"}], "extension": "Floating-Point", "description": "The operation FRT ←- ( [(FRA)×(FRC)] + (FRB) ) is performed. The result is negated and placed into register FRT.", "pseudocode": "FRT ←- ( [(FRA)×(FRC)] + (FRB) )\nif 'fnmadd.' then\n    update CR1 and FPSCR fields", "special_registers": "FPSCR, CR1", "page_found": "Page 204 - 206", "programming_notes": "The fnmadd instruction is useful for performing a negated multiply-add operation on floating-point numbers. Ensure that the input registers FRA, FRC, and FRB are correctly aligned and contain valid floating-point values to avoid exceptions. If using the 'fnmadd.' form, be aware that it updates CR1 and FPSCR, which can affect subsequent conditional operations or exception handling.", "example": "fnmadd f1, f2, f4, f3"}
{"mnemonic": "fnmsub", "architecture": "PowerISA", "full_name": "Floating Negative Multiply-Subtract", "summary": "-(A*C - B)", "syntax": "fnmsub FRT, FRA, FRC, FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | FRA | FRB | FRC | 30 | /", "hex_opcode": "0xFC00003C", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "FRC", "clean": "FRC"}, {"raw": "30", "clean": "30"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "A"}, {"name": "FRC", "desc": "C"}, {"name": "FRB", "desc": "B"}], "extension": "Floating-Point", "description": "Floating Negative Multiply-Subtract computes -(A*C - B) using fused multiply-subtract, where the intermediate product is not rounded. The result is rounded to the target precision according to the current rounding mode in FPSCR. FPSCR is updated with FPRF, FR, FI, and exception flags based on the result.", "pseudocode": "FRT ← -((FRA × FRC) - FRB)\nUpdate FPSCR[FPRF, FR, FI, exception flags]", "page_found": "Page 205", "special_registers": "FPSCR", "programming_notes": "The fnmsub instruction is commonly used in scenarios requiring efficient floating-point arithmetic operations, such as in scientific computations or graphics processing. Ensure that the input registers FRA, FRC, and FRB are properly aligned to avoid precision loss. Be aware of potential exceptions like underflow or overflow, which can be managed by checking the FPSCR register after execution.", "example": "fnmsub f1, f2, f4, f3"}
{"mnemonic": "frsp", "architecture": "PowerISA", "full_name": "Floating Round to Single-Precision", "summary": "Rounds the contents of a floating-point register to single-precision.", "syntax": "frsp FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | / | FRB | 12 | Rc", "hex_opcode": "0xFC000018", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "12", "clean": "12"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "The floating-point operand in register FRB is rounded to single-precision using the rounding mode specified by RN and placed into register FRT.", "pseudocode": "if (FRB)1:11 < 897 and (FRB)1:63 > 0 then\n    if FPSCRUE = 0 then goto Disabled Exponent Underflow\n    if FPSCRUE = 1 then goto Enabled Exponent Underflow\nend\n\nif (FRB)1:11 > 1150 and (FRB)1:11 < 2047 then\n    if FPSCROE = 0 then goto Disabled Exponent Overflow\n    if FPSCROE = 1 then goto Enabled Exponent Overflow\nend\n\nif (FRB)1:11 > 896 and (FRB)1:11 < 1151 then goto Normal Operand\n\nif (FRB)1:63 = 0 then goto Zero Operand\n\nif (FRB)1:11 = 2047 then\n    if (FRB)12:63 = 0 then goto Infinity Operand\n    if (FRB)12 = 1 then goto QNaN Operand\n    if (FRB)12 = 0 and (FRB)13:63 > 0 then goto SNaN Operand\nend\n\nDisabled Exponent Underflow:\n    sign ←(FRB)0\n    if (FRB)1:11 = 0 then\n        exp ←-1022\n        frac0:52 ←0b0 || (FRB)12:63\n    end\n    if (FRB)1:11 > 0 then\n        exp ←(FRB)1:11 -1023\n        frac0:52 ←0b1 || (FRB)12:63\n    end\n    Denormalize operand:\n        G || R || X ←0b000\n        do while exp < -126\n            exp ←exp + 1\n            frac0:52 || G || R || X ←0b0 || frac0:52 || G || (R | X)\n        end\n    FPSCRUX ←(frac24:52 || G || R || X) > 0\n    Round Single(sign,exp,frac0:52,G,R,X)\n    FPSCRXX ←FPSCRXX | FPSCRFI", "special_registers": "FPSCR (FPRF FR FI FX OX UX XX VXSNAN), CR1", "page_found": "Page 205 - 206", "programming_notes": "The frsp instruction rounds a double-precision floating-point number to single precision. It handles various cases like underflow, overflow, and NaNs, setting appropriate flags in the FPSCR register. Ensure that the input register FRB is correctly set before calling this instruction.", "example": "frsp f1, f3"}
{"mnemonic": "fctid", "architecture": "PowerISA", "full_name": "Floating Convert with round Double-Precision To Signed Doubleword format X-form (Rc=0)", "summary": "Converts a double-precision floating-point value to a signed 64-bit integer using rounding.", "syntax": "fctid FRT, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | / | FRB | 814 | Rc", "hex_opcode": "0xFC00065C", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "814", "clean": "814"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "Let src be the double-precision floating-point value in FRB. If src is a NaN, then the result is 0x8000_0000_0000_0000, VXCVI is set to 1, and if src is an SNaN, VXSNAN is set to 1. Otherwise, src is rounded to a floating-point integer using the rounding mode specified by RN. If the rounded value is greater than 263-1, then the result is 0x7FFF_FFFF_FFFF_FFFF and VXCVI is set to 1. Otherwise, if the rounded value is less than -263, then the result is 0x8000_0000_0000_0000 and VXCVI is set to 1. Otherwise, the result is the rounded value converted to 64-bit signed-integer format, and XX is set to 1 if the result is inexact. If an enabled Invalid Operation Exception does not occur, then the result is placed into FRT.", "pseudocode": "if src is a NaN then\n    FRT <- 0x8000_0000_0000_0000\n    VXCVI <- 1\n    if src is an SNaN then VXSNAN <- 1\nelse\n    rounded_value <- round(src, RN)\n    if rounded_value > 263-1 then\n        FRT <- 0x7FFF_FFFF_FFFF_FFFF\n        VXCVI <- 1\n    else if rounded_value < -263 then\n        FRT <- 0x8000_0000_0000_0000\n        VXCVI <- 1\n    else\n        FRT <- convert_to_signed_integer(rounded_value)\n        XX <- is_inexact(FRT)\nif not enabled Invalid Operation Exception then\n    place result into FRT", "special_registers": "FPSCR, (FR, FI, FX, XX, VXSNAN, VXCVI), CR1, (if, Rc=1), CR0", "page_found": "Page 206 - 208", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "fctid f1, f3"}
{"mnemonic": "fctidz", "architecture": "PowerISA", "full_name": "Floating Convert to Integer Doubleword with Round to Zero", "summary": "Converts Double to 64-bit Int (Truncate).", "syntax": "fctidz FRT, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | 0 | FRB | 815 | /", "hex_opcode": "0xFC00065E", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "815", "clean": "815"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "Floating Convert to Integer Doubleword with Round to Zero converts the double-precision floating-point value in FRB to a signed 64-bit integer, truncating toward zero (round-to-zero), and places the result in FRT as a floating-point representation. FPSCR is updated with FPRF, FR, and FI flags; exception flags (XX, ZX) are set if applicable.", "pseudocode": "FRT ← (int64_t)truncate(FRB)\nUpdate FPSCR[FPRF, FR, FI, XX, ZX]", "page_found": "Page 207", "special_registers": "FPSCR", "programming_notes": "The fctidz instruction converts a double-precision floating-point value to a signed 64-bit integer, rounding towards zero. If the source value is NaN, it returns 0x8000_0000_0000_0000 and sets VXCVI to 1. If the rounded value exceeds the range of a 64-bit signed integer, it saturates to either 0x7FFF_FFFF_FFFF_FFFF or 0x8000_0000_0000_0000.", "example": "fctidz f1, f3"}
{"mnemonic": "fctiwz", "architecture": "PowerISA", "full_name": "Floating Convert to Integer Word with Round to Zero", "summary": "Converts Double to 32-bit Int (Truncate).", "syntax": "fctiwz FRT, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | 0 | FRB | 15 | /", "hex_opcode": "0xFC00001E", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "15", "clean": "15"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "Floating Convert to Integer Word with Round to Zero converts the double-precision floating-point value in FRB to a signed 32-bit integer, truncating toward zero, and places the result in FRT as a floating-point representation. FPSCR is updated with FPRF, FR, and FI flags; exception flags (XX, ZX) are set if applicable.", "pseudocode": "FRT ← (int32_t)truncate(FRB)\nUpdate FPSCR[FPRF, FR, FI, XX, ZX]", "page_found": "Page 209", "special_registers": "FPSCR", "programming_notes": "The fctiwz instruction is commonly used for converting floating-point numbers to integers with truncation. Be cautious of NaN inputs, which will result in zero and set VXCVI; SNaNs also set VXSNAN. Ensure the input is within the 32-bit signed integer range to avoid saturation. This instruction operates at user privilege level.", "example": "fctiwz f1, f3"}
{"mnemonic": "fcfid", "architecture": "PowerISA", "full_name": "Floating Convert with round Signed Doubleword to Double-Precision format", "summary": "Converts a signed doubleword integer to a double-precision floating-point number.", "syntax": "fcfid FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | 0 | FRB | 846 | /", "hex_opcode": "0xFC00069C", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "846", "clean": "846"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "The 64-bit signed fixed-point operand in register FRB is converted to an infinitely precise floating-point integer. The result of the conversion is rounded to double-precision, using the rounding mode specified by RN, and placed into register FRT.", "pseudocode": "if 'fcfid' then\n    FRT <- (FRB) converted to double-precision floating-point integer\n    round result using RN\n    if Rc=1 then update CR1", "special_registers": "FPSCR, CR1 (if Rc=1)", "programming_notes": "Converting a signed integer word to double-precision floating-point can be accomplished by loading the word from storage using Load Float Word Algebraic Indexed and then using fcfid.", "page_found": "Page 210 - 212", "example": "fcfid f1, f3"}
{"mnemonic": "fcfids", "architecture": "PowerISA", "full_name": "Floating Convert with round Signed Doubleword to Single-Precision format", "summary": "Converts a 64-bit signed fixed-point operand in register FRB to single-precision floating-point.", "syntax": "fcfids FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | 0 | FRB | 846 | /", "hex_opcode": "0xEC00069C", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "846", "clean": "846"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "The 64-bit signed fixed-point operand in register FRB is converted to an infinitely precise floating-point integer. The result of the conversion is rounded to single-precision, using the rounding mode specified by RN, and placed into register FRT.", "special_registers": "FPSCR (FPRF, FR, FI, FX, XX), CR1 (if Rc=1)", "programming_notes": "Converting a signed integer word to single-precision floating-point can be accomplished by loading the word from storage using Load Float Word Algebraic and then using fcfids.", "page_found": "Page 211 - 212", "pseudocode": "FRT ← ConvertToFloat(FRB, RN)\nSetFlags(FPRF, FR, FI)", "example": "fcfids f1, f3"}
{"mnemonic": "fcfidu", "architecture": "PowerISA", "full_name": "Floating Convert from Unsigned Integer Doubleword", "summary": "Converts 64-bit Unsigned Int to Double.", "syntax": "fcfidu FRT, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | 0 | FRB | 974 | /", "hex_opcode": "0xFC00079C", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "974", "clean": "974"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "Floating Convert from Unsigned Integer Doubleword converts the unsigned 64-bit integer held in FRB to a double-precision floating-point value and places the result in FRT. The conversion uses the current rounding mode in FPSCR. FPSCR is updated with FPRF, FR, and FI flags.", "pseudocode": "FRT ← (double)(uint64_t)FRB\nUpdate FPSCR[FPRF, FR, FI]", "page_found": "Page 211", "special_registers": "FPSCR", "programming_notes": "The fcfidu instruction converts a 64-bit unsigned integer to a double-precision floating-point value. Be cautious of NaN inputs, which will result in zero with VXCVI set. Ensure the source register contains valid data; otherwise, unexpected results may occur. This instruction operates at user privilege level.", "example": "fcfidu f1, f3"}
{"mnemonic": "fcfidus", "architecture": "PowerISA", "full_name": "Floating Convert from Unsigned Integer Doubleword Single", "summary": "Converts 64-bit Unsigned Int to Single.", "syntax": "fcfidus FRT, FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | 0 | FRB | 974 | /", "hex_opcode": "0xEC00079C", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "974", "clean": "974"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "Floating Convert from Unsigned Integer Doubleword Single converts the unsigned 64-bit integer held in FRB to a single-precision floating-point value and places the result in FRT. The conversion uses the current rounding mode in FPSCR. FPSCR is updated with FPRF, FR, and FI flags.", "pseudocode": "FRT ← (float)(uint64_t)FRB\nUpdate FPSCR[FPRF, FR, FI]", "page_found": "Page 212", "special_registers": "FPSCR", "programming_notes": "The fcfidus instruction is used to convert a 64-bit unsigned integer from one register to a single-precision floating-point number in another register. Ensure the source register contains a valid unsigned integer and that the rounding mode specified by RN is appropriate for your application. This instruction alters several fields in the FPSCR, so be aware of potential flag changes that may affect subsequent operations.", "example": "fcfidus f1, f3"}
{"mnemonic": "lvx", "architecture": "PowerISA", "full_name": "Load Vector Indexed", "summary": "Loads a 128-bit vector from memory into a Vector Register. Address must be 16-byte aligned (bits 60-63 of effective address are ignored).", "syntax": "lvx vD, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | VRT | RA | RB | 103 | /", "hex_opcode": "0x7C0000CE", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "vD", "clean": "vD"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "7", "clean": "7"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vD", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Base Register"}, {"name": "RB", "desc": "Index Register"}, {"name": "Vt", "desc": "Target Vector Register"}, {"name": "Rb", "desc": "Base General Purpose Register"}, {"name": "VRT", "desc": "Target Vector Register"}], "pseudocode": "EA ← (RA + RB) & 0xFFF...FF0\nVRT ← [EA]", "example": "lvx v1, r3, r4", "example_note": "Load aligned vector.", "extension": "VMX (AltiVec)", "description": "Load Vector Indexed loads a 128-bit vector from memory at the address computed from RA and RB, placing the result in VRT. The effective address must be 16-byte aligned; the low 4 bits of the computed address are ignored. This is a VMX/AltiVec instruction requiring the Vector facility to be enabled.", "page_found": "Page 288 - 290", "programming_notes": "The Load Vector Element instructions load the specified element into the same location in the target register as the location into which it would be loaded using the Load Vector instruction.", "special_registers": "MSR"}
{"mnemonic": "stvx", "architecture": "PowerISA", "full_name": "Store Vector Indexed", "summary": "Stores a quadword from a vector register to memory at an address formed by adding two general-purpose registers.", "syntax": "stvx vS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | vS | RA | RB | 231 | /", "hex_opcode": "0x7C0001CE", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "vS", "clean": "vS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "231", "clean": "231"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vS", "desc": "Source Vector Register"}, {"name": "RA", "desc": "Base Register"}, {"name": "RB", "desc": "Index Register"}, {"name": "VRS", "desc": "Vector Register"}], "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nEA ←((RA=0) ? 0 : GPR[RA]) + GPR[RB]\nEA ←EA & 0xFFFF_FFFF_FFFF_FFF0\nMEM(EA, 16) ←VSR[VRS+32]", "example": "stvx v1, r3, r4", "example_note": "Store aligned vector.", "extension": "VMX (AltiVec)", "description": "The contents of VSR[VRS+32] are placed into the quad-word in storage at address EA, which is the result of ANDing 0xFFFF_FFFF_FFFF_FFF0 with the sum (RA|0) + (RB).", "page_found": "Page 300 - 302", "special_registers": "MSR", "programming_notes": "The stvx instruction stores a vector register into memory. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register if necessary. The effective address (EA) must be aligned to a 16-byte boundary, as indicated by the AND operation with 0xFFFF_FFFF_FFFF_FFF0. This instruction operates at user privilege level but will raise an exception if the Vector Facility is not available."}
{"mnemonic": "vsubuwm", "architecture": "PowerISA", "full_name": "Vector Subtract Unsigned Word Modulo", "summary": "Subtracts the contents of two vector registers and updates the result in another vector register.", "syntax": "vsubuwm vD, vA, vB", "encoding": {"format": "VA-form", "binary_pattern": "4 | VRT | VRA | VRB | 1152", "hex_opcode": "0x10000480", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1152", "clean": "1152"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source A"}, {"name": "vB", "desc": "Source B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ←EXTZ(VSR[VRA+32].word[i])\n    src2 ←EXTZ(VSR[VRB+32].word[i])\n    VSR[VRT+32].word[i] ←CHOP32(src1 + ¬src2 + 1)\nend", "example": "vsubuwm v1, v2, v3", "example_note": "4 parallel word subtractions.", "extension": "VMX (AltiVec)", "description": "For vsubuwm, each word element in VSR[VRB+32] is subtracted from the corresponding word element in VSR[VRA+32]. The low-order 32 bits of the result are placed into the corresponding word element in VSR[VRT+32].", "page_found": "Page 359 - 360", "special_registers": "MSR", "programming_notes": "This instruction performs unsigned word modulo subtraction on vector registers. Ensure that the Vector Facility is enabled by checking and setting the appropriate bit in the MSR register. Be cautious of potential overflow conditions, as this operation does not handle carry-out explicitly. The operation is performed on 32-bit words, so ensure proper alignment if dealing with larger data types."}
{"mnemonic": "vspltw", "architecture": "PowerISA", "full_name": "Vector Splat Word", "summary": "Copies a single word element from the source vector into all four word elements of the destination.", "syntax": "vspltw vD, vB, UIM", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | UIM | vB | 652", "hex_opcode": "0x1000028C", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "vB", "clean": "vB"}, {"raw": "652", "clean": "652"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "UIM", "desc": "Element Index (0-3)"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "pseudocode": "word ← VRB[4×UIM : 4×UIM+31]\nVRT[0:31] ← word\nVRT[32:63] ← word\nVRT[64:95] ← word\nVRT[96:127] ← word", "example": "vspltw v1, v2, 0", "example_note": "Broadcast word 0 to all lanes.", "extension": "VMX (AltiVec)", "description": "Vector Splat Word copies a single word element (32 bits) from the source vector VRB at position UIM into all four word elements of the destination vector VRT. UIM selects one of the four words (0-3) in the source. This is a VMX/AltiVec instruction.", "page_found": "Page 319 - 320", "special_registers": "MSR", "programming_notes": "The vspltw instruction is used to replicate a selected word from one vector register into all words of another vector register. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. The index 'b' is derived by concatenating the UIM field with four zeros, and it specifies which 32-bit word to replicate. This instruction operates at the user privilege level."}
{"mnemonic": "vperm", "architecture": "PowerISA", "full_name": "Vector Permute", "summary": "The signature AltiVec instruction. Constructs a new vector by selecting bytes from two source vectors based on a permute control vector.", "syntax": "vperm vD, vA, vB, vC", "encoding": {"format": "VA-form", "binary_pattern": "4 | vD | vA | vB | vC | 43", "hex_opcode": "0x1000002B", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "vC", "clean": "vC"}, {"raw": "43", "clean": "43"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source 1 (Bytes 0-15)"}, {"name": "vB", "desc": "Source 2 (Bytes 16-31)"}, {"name": "vC", "desc": "Control Vector"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Permute Control Vector Register"}], "pseudocode": "for i ← 0 to 15\n  control ← VRC[8×i : 8×i+4]\n  if control < 16 then\n    VRT[8×i : 8×i+7] ← VRA[8×control : 8×control+7]\n  else\n    VRT[8×i : 8×i+7] ← VRB[8×(control-16) : 8×(control-16)+7]", "example": "vperm v1, v2, v3, v4", "example_note": "Arbitrary byte shuffle/merge.", "extension": "VMX (AltiVec)", "description": "Vector Permute constructs a new 128-bit vector in VRT by selecting bytes from two source vectors (VRA and VRB) using a permute control vector VRC. Bytes 0-15 of the result come from VRA, bytes 16-31 from VRB; the low 5 bits of each byte in VRC index into the 32-byte concatenated source. This is the signature VMX/AltiVec instruction and requires the Vector facility.", "programming_notes": "See the Programming Notes with the Load Vector for Shift Left and Load Vector for Shift Right instructions on page 266 for examples of uses of vperm.", "page_found": "Page 321 - 322", "special_registers": "MSR"}
{"mnemonic": "vslw", "architecture": "PowerISA", "full_name": "Vector Shift Left Word", "summary": "Shifts each of the four words in vA left by the number of bits specified in the corresponding word of vB.", "syntax": "vslw vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 388", "hex_opcode": "0x10000184", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "388", "clean": "388"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source Data"}, {"name": "vB", "desc": "Shift Amounts"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ← VSR[VRA+32].word[i]\n    src2 ← VSR[VRB+32].word[i].bit[27:31]\n    VSR[VRT+32].word[i] ← src1 << src2", "example": "vslw v1, v2, v3", "example_note": "Parallel shift.", "extension": "VMX (AltiVec)", "description": "For vslw, each word element of VSR[VRA+32] is shifted left by the number of bits specified in the low-order 5 bits of the corresponding word element of VSR[VRB+32].", "page_found": "Page 438 - 439", "special_registers": "MSR", "programming_notes": "The vslw instruction shifts each word element of the source vector left by a specified number of bits. Ensure that the shift amount is within the range 0-31 to avoid undefined behavior. This operation requires the Vector Facility to be enabled in the MSR register; otherwise, it will raise an exception."}
{"mnemonic": "vcmpequw", "architecture": "PowerISA", "full_name": "Vector Compare Equal Word", "summary": "Compares each word of two vector registers and sets the corresponding word in the target register to all 1s if they are equal, otherwise all 0s.", "syntax": "vcmpequw VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "0 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000086", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "134", "clean": "134"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target (Mask)"}, {"name": "vA", "desc": "Source A"}, {"name": "vB", "desc": "Source B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\n\nall_true ←1\nall_false ←1\ndo i = 0 to 3\n   src1 ←VSR[VRA+32].word[i]\n   src2 ←VSR[VRB+32].word[i]\n   if src1 = src2 then do\n      VSR[VRT+32].word[i] ←0xFFFF_FFFF\n      all_false ←0\n   end\n   else do\n      VSR[VRT+32].word[i] ←0x0000_0000\n      all_true ←0\n   end\nend\ndo i = 0 to 3\n   src1 ←VSR[VRA+32].word[i]\n   src2 ←VSR[VRB+32].word[i]\n   if src1 = src2 then do\n      VSR[VRT+32].word[i] ←0xFFFF_FFFF\n      all_false ←0\n   end\n   else do\n      VSR[VRT+32].word[i] ←0x0000_0000\n      all_true ←0\n   end\nend\nif Rc=1 then\n   CR.field[6] ←all_true || 0b0 || all_false || 0b0", "example": "vcmpequw v1, v2, v3", "example_note": "Generate mask for equality.", "extension": "VMX (AltiVec)", "description": "For vcmpequw, each word of VSR[VRA+32] is compared with the corresponding word of VSR[VRB+32]. If they are equal, the corresponding word in VSR[VRT+32] is set to 0xFFFF_FFFF; otherwise, it is set to 0x0000_0000.", "special_registers": "CR6", "page_found": "Page 415 - 416", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes."}
{"mnemonic": "vsel", "architecture": "PowerISA", "full_name": "Vector Select", "summary": "Bitwise selection. copies bits from vA if the corresponding bit in vC is 0, or from vB if vC is 1. (Like 'mux').", "syntax": "vsel vD, vA, vB, vC", "encoding": {"format": "VA-form", "binary_pattern": "0 | VRT | VRA | VRB | VRC | 42", "hex_opcode": "0x1000002A", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "vC", "clean": "vC"}, {"raw": "42", "clean": "42"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source 0"}, {"name": "vB", "desc": "Source 1"}, {"name": "vC", "desc": "Control (Selector)"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Mask Vector Register"}], "pseudocode": "for i in 0 to 127:\n  if vC[i] = 0 then vD[i] ← vA[i]\n  else vD[i] ← vB[i]", "example": "vsel v1, v2, v3, v4", "example_note": "Bitwise MUX.", "extension": "VMX (AltiVec)", "description": "Performs bitwise selection from two source vectors based on a control vector. For each bit position, copies the bit from vA if the corresponding bit in vC is 0, or from vB if vC is 1. This is a three-operand mux operation. No condition registers or status flags are affected.", "page_found": "Page 322 - 324", "special_registers": "MSR", "programming_notes": "The vsel instruction requires the Vector Facility to be enabled in the MSR. Ensure that VRA, VRB, and VRC are properly aligned and contain valid data. The result is stored in VRT, so ensure it is not being used elsewhere in your computation until the operation completes."}
{"mnemonic": "lxvd2x", "architecture": "PowerISA", "full_name": "Load VSX Vector Doubleword*2 Indexed", "summary": "Loads a 128-bit vector from memory into a VSX register. Does NOT require 16-byte alignment (unlike lvx).", "syntax": "lxvd2x XT, RA, RB", "encoding": {"format": "XX1-form", "binary_pattern": "31 | XT | RA | RB | 844 | 1", "hex_opcode": "0x7C000698", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "844", "clean": "844"}, {"raw": "1", "clean": "1"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "XT", "desc": "Target VSR (0-63)"}, {"name": "RA", "desc": "Base Register"}, {"name": "RB", "desc": "Index Register"}], "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nEA ←((RA=0) ? 0 : GPR[RA]) + GPR[RB]\nfor i from 0 to 1 do\n    VSR[32×TX+T].dword[i] ←MEM(EA+8×i, 8)", "example": "lxvd2x 32, r3, r4", "example_note": "Unaligned 128-bit load to vs32 (v0).", "extension": "VSX", "description": "The contents of the byte in storage at address EA+8×i+7 are placed into byte element 7 of load_data. When Little-Endian byte ordering is employed, the contents of the doubleword in storage at address EA+8×i are placed into load_data in such an order that; the contents of the byte in storage at address EA+8×i are placed into byte element 7 of load_data, and so forth until the contents of the byte in storage at address EA+8×i+7 are placed into byte element 0 of load_data. For each integer value i from 0 to 1, do the following.", "programming_notes": "lxvd2x, lxvw4x, lxvh8x, lxvb16x, and lxvx exhibit identical behavior in Big-Endian mode.", "page_found": "Page 612 - 613", "special_registers": "MSR"}
{"mnemonic": "stxvd2x", "architecture": "PowerISA", "full_name": "Store VSX Vector Doubleword*2 Indexed", "summary": "Stores a 128-bit VSX register to memory. Does NOT require alignment.", "syntax": "stxvd2x XS, RA, RB", "encoding": {"format": "XX1-form", "binary_pattern": "31 | XS | RA | RB | 972 | 1", "hex_opcode": "0x7C000798", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XS", "clean": "XS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "972", "clean": "972"}, {"raw": "1", "clean": "1"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "XS", "desc": "Source VSR"}, {"name": "RA", "desc": "Base Register"}, {"name": "RB", "desc": "Index Register"}], "pseudocode": "EA ← (RA = 0) ? RB : (RA + RB)\n[EA : EA+15] ← XS[0:127]", "example": "stxvd2x 32, r3, r4", "example_note": "Unaligned 128-bit store.", "extension": "VSX", "description": "Stores a 128-bit VSX register to memory at the address computed from the base and index registers. The address is the sum of RA and RB (or 0 if RA = 0). Unlike some VSX store instructions, this instruction does not require natural alignment. No condition registers or status flags are affected.", "programming_notes": "stxvd2x, stxvw4x, stxvh8x, stxvb16x, and stxvx exhibit identical behavior in Big-Endian mode.", "page_found": "Page 628 - 629", "special_registers": "MSR"}
{"mnemonic": "xvadddp", "architecture": "PowerISA", "full_name": "VSX Vector Add Double-Precision", "summary": "Adds the contents of two double-precision floating-point elements from two vector registers and places the result into a target vector register.", "syntax": "xvadddp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | AX | BX | TX", "hex_opcode": "0xF0000300", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "96", "clean": "96"}], "length": "32", "bit_positions": "0:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Source A"}, {"name": "XB", "desc": "Source B"}], "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\ndo i = 0 to 1\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[i])\n    src2 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    v    ←bfp_ADD(src1,src2)\n    rnd  ←bfp_ROUND_TO_BFP64(0b0,FPSCR.RN,v)\n    vresult.dword[i] ←bfp64_CONVERT_FROM_BFP(rnd)\n\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vxisi_flag=1 then SetFX(FPSCR.VXISI)\n    if ox_flag=1 then SetFX(FPSCR.OX)\n    if ux_flag=1 then SetFX(FPSCR.UX)\n    if xx_flag=1 then SetFX(FPSCR.XX)\n\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vxisi_flag) | (FPSCR.OE & ox_flag) | (FPSCR.UE & ux_flag) | (FPSCR.XE & xx_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "example": "xvadddp 0, 1, 2", "example_note": "2-way parallel double add.", "extension": "VSX", "description": "For xvadddp, the sum of the contents of doubleword element i of VSR[XA] and VSR[XB] is placed into doubleword element i of VSR[XT].", "special_registers": "FPSCR", "page_found": "Page 726 - 727", "programming_notes": "This instruction is commonly used for adding two double-precision floating-point numbers stored in VSX registers. Ensure that the VSX facility is enabled by checking and setting the MSR.VSX bit. Be aware of potential exceptions such as NaNs or infinities, which can set flags in the FPSCR register. The operation respects the rounding mode specified in FPSCR.RN."}
{"mnemonic": "xvmaddadp", "architecture": "PowerISA", "full_name": "VSX Vector Multiply-Add Double-Precision", "summary": "Performs a double-precision floating-point multiply-add operation on vector elements.", "syntax": "xvmaddadp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "1000 | XA | XB | XT | 0000 | 0000 | 0000 | 0000", "hex_opcode": "0xF0000308", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "104", "clean": "104"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target/Addend (Accumulator)"}, {"name": "XA", "desc": "Multiplier"}, {"name": "XB", "desc": "Multiplicand"}], "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nex_flag ←0b0\ndo i = 0 to 1\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[i])\n    src2 ←bfp_CONVERT_FROM_BFP64(VSR[32×TX+T].dword[i])\n    src3 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    v   ←bfp_MULTIPLY_ADD(src1,src3,src2)\n    rnd ←bfp_ROUND_TO_BFP64(0b0,FPSCR.RN,v)\n    vresult.dword[i] ←bfp64_CONVERT_FROM_BFP(rnd)\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vximz_flag=1 then SetFX(FPSCR.VXIMZ)\n    if vxisi_flag=1 then SetFX(FPSCR.VXISI)\n    if ox_flag=1 then SetFX(FPSCR.OX)\n    if ux_flag=1 then SetFX(FPSCR.UX)\n    if xx_flag=1 then SetFX(FPSCR.XX)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vximz_flag) | (FPSCR.VE & vxisi_flag) | (FPSCR.OE & ox_flag) | (FPSCR.UE & ux_flag) | (FPSCR.XE & xx_flag)\nend\nif ex_flag=0 then VSR[32×TX+T] ←result", "example": "xvmaddadp 0, 1, 2", "example_note": "Vector FMA.", "extension": "VSX", "description": "For xvmaddadp, the double-precision floating-point operand in doubleword element i of VSR[XA] is multiplied by the double-precision floating-point operand in doubleword element i of VSR[XB], and then added to the double-precision floating-point operand in doubleword element i of VSR[XT]. The result is normalized and rounded to double precision.", "special_registers": "FPSCR", "page_found": "Page 745 - 746", "programming_notes": "This instruction is commonly used for performing vectorized floating-point operations in parallel, which can significantly speed up computations involving large datasets. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting the appropriate bits in the MSR register. Be cautious of potential exceptions such as NaNs or infinities, which can trigger flags in the FPSCR register. The instruction operates on double-precision floating-point numbers, so ensure proper alignment and data types to avoid undefined behavior."}
{"mnemonic": "xxpermdi", "architecture": "PowerISA", "full_name": "VSX Permute Doubleword Immediate", "summary": "Selects two doublewords from the four available in source registers XA and XB based on a 2-bit selector.", "syntax": "xxpermdi XT, XA, XB, DM", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | 0 | DM | 10 | AX | BX | TX", "hex_opcode": "0xF0000050", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "10", "clean": "10"}, {"raw": "DM", "clean": "DM"}], "length": "32", "bit_positions": "0:4 | 5:9 | 10:14 | 15 | 16:20 | 21 | 22:26 | 27:30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Source A"}, {"name": "XB", "desc": "Source B"}, {"name": "DM", "desc": "Selector (2 bits)"}], "pseudocode": "case DM[1:0]:\n  0: XT[0:63] ← XA[0:63]\n  1: XT[0:63] ← XA[64:127]\n  otherwise: XT[0:63] ← ?\ncase DM[3:2]:\n  0: XT[64:127] ← XB[0:63]\n  1: XT[64:127] ← XB[64:127]\n  otherwise: XT[64:127] ← ?", "example": "xxpermdi 0, 1, 1, 2", "example_note": "Swap high/low doublewords of vs1.", "extension": "VSX", "description": "Selects two 64-bit doublewords from source registers XA and XB and places them in target register XT. The 2-bit selector DM controls which doubleword is chosen: bits [1:0] of DM select from XA for the high half of XT, and bits [3:2] select from XB for the low half. No condition registers or status flags are affected.", "extended_mnemonics": [{"mnemonic": "xxspltd", "equivalent_to": "xxpermdi XT,XA,XA,0b00"}, {"mnemonic": "xxmrghd", "equivalent_to": "xxpermdi XT,XA,XB,0b00"}, {"mnemonic": "xxmrgld", "equivalent_to": "xxpermdi XT,XA,XB,0b11"}, {"mnemonic": "xxswapd", "equivalent_to": "xxpermdi XT,XA,XA,0b10"}], "page_found": "Page 957 - 958", "special_registers": "MSR", "programming_notes": "The xxpermdi instruction is used to permute doublewords from two VSX registers into a third register based on an immediate value. Ensure that the VSX facility is enabled in the MSR register; otherwise, a VSX_Unavailable exception will be raised. The immediate value DM controls which doubleword elements are selected from VSR[XB] for placement in VSR[XT]."}
{"mnemonic": "xsadddp", "architecture": "PowerISA", "full_name": "VSX Scalar Add Double-Precision", "summary": "Adds two double-precision floating-point values from vector scalar registers and stores the result in a target vector scalar register.", "syntax": "xsadddp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | 32 | AX | BX | TX", "hex_opcode": "0xF0000100", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "32", "clean": "32"}], "length": "32", "bit_positions": "6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Source A"}, {"name": "XB", "desc": "Source B"}], "pseudocode": "XT[0:63] ← unchanged\nXT[64:127] ← XA[64:127] + XB[64:127]\nFPSCR ← updated based on operation and rounding", "example": "xsadddp 0, 1, 2", "example_note": "Scalar float add using Vector unit.", "extension": "VSX", "special_registers": "FPSCR, VXSNAN, VXISI, OX, UX", "page_found": "Page 558 - 559", "description": "Adds two double-precision floating-point scalar values held in the least-significant 64 bits of VSX registers XA and XB. The result is placed in the least-significant 64 bits of XT; the high 64 bits of XT are unchanged. Floating-point exceptions and FPSCR flags (VX, OX, UX, etc.) are updated according to the result and rounding mode.", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture."}
{"mnemonic": "dsub", "architecture": "PowerISA", "full_name": "Decimal Subtract", "summary": "Subtracts the contents of two DFP registers and places the result in another DFP register.", "syntax": "dsub FRT,FRA,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | FRA | FRB | 514 | /", "hex_opcode": "0xEC000404", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "514", "clean": "514"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Src A"}, {"name": "FRB", "desc": "Src B"}], "extension": "Decimal Floating-Point", "description": "The DFP operand in FRB[p] is subtracted from the DFP operand in FRA[p]. The result is rounded to the target-format precision under control of DRN (bits 29:31 of the FPSCR). An appropriate form of the rounded result is selected based on the ideal exponent and is placed in FRT[p]. The ideal exponent is the smaller exponent of the two source operands.", "pseudocode": "if 'dsub' then\n    FRT[p] <- (FRA[p]) - (FRB[p])", "special_registers": "FPSCR, FPRF, FR, FI, FX, OX, UX, XX, VXSNAN, VXISI, CR1", "page_found": "Page 240 - 242", "programming_notes": "The dsub instruction performs a decimal subtraction between two DFP operands. Ensure that both operands are properly aligned and formatted according to the target precision specified in the FPSCR register. Be aware of potential rounding errors based on the current rounding mode set in DRN, and check for any exceptions or flags (like VXSNAN) that may indicate invalid operations or special results.", "example": "dsub f1, f2, f3"}
{"mnemonic": "ddiv", "architecture": "PowerISA", "full_name": "Decimal Divide", "summary": "Divides the contents of two decimal floating-point registers and places the result in a target register.", "syntax": "ddiv FRT,FRA,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | FRA | FRB | 546 | /", "hex_opcode": "0xEC000444", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "546", "clean": "546"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Src A"}, {"name": "FRB", "desc": "Src B"}], "extension": "Decimal Floating-Point", "description": "The DFP operand in FRA is divided by the DFP operand in FRB. The result is rounded to the target-format precision under control of the DRN (bits 29:31 of the FPSCR). An appropriate form of the rounded result is selected based on the ideal exponent and is placed in FRT.", "pseudocode": "if 'ddiv' then\n    FRT <- (FRA) / (FRB)\n    if Rc=1 then\n        CR1 <- result of comparison", "special_registers": "FPSCR, CR1", "page_found": "Page 242 - 244", "programming_notes": "The ddiv instruction performs a decimal division, rounding the result according to the precision control bits in FPSCR. Ensure that operands are properly aligned and check for division by zero or overflow conditions, which may trigger exceptions. The result can be compared if Rc is set, updating CR1 accordingly.", "example": "ddiv f1, f2, f3"}
{"mnemonic": "dcmpu", "architecture": "PowerISA", "full_name": "Decimal Compare Unordered", "summary": "Compares two DFP operands and sets the CR field to indicate the result.", "syntax": "dcmpu BF, FRA, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | FRA | FRB | 0 | 0 | 0 | 0", "hex_opcode": "0xEC000504", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "642", "clean": "642"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:29 | 30 | 31"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "FRA", "desc": "Src A"}, {"name": "FRB", "desc": "Src B"}], "extension": "Decimal Floating-Point", "description": "Compares two decimal floating-point numbers and updates the specified condition register field. The comparison treats quiet NaNs as unordered (unlike ordered compare). The result sets the Less Than, Greater Than, Equal, or Unordered bits in the target CR field. No other status flags are affected.", "pseudocode": "if FRA is NaN or FRB is NaN then\n  CR[BF] ← 0b0001  (Unordered)\nelse if FRA < FRB then\n  CR[BF] ← 0b1000  (Less Than)\nelse if FRA > FRB then\n  CR[BF] ← 0b0100  (Greater Than)\nelse\n  CR[BF] ← 0b0010  (Equal)", "special_registers": "CR, FPSCR", "page_found": "Page 243 - 244", "programming_notes": "The dcmpu instruction is used to compare two decimal floating-point numbers. It sets the condition register field BF based on the comparison result, which can be less than (FL), greater than (FG), equal to (FE), or unordered (FU) if either operand is NaN. Ensure that both operands are properly aligned and valid DFP values to avoid undefined behavior.", "example": "dcmpu cr0, f2, f3"}
{"mnemonic": "dcmpo", "architecture": "PowerISA", "full_name": "Decimal Compare Ordered", "summary": "Compares two decimal floating-point operands and updates the condition register.", "syntax": "dcmpo BF, FRA, FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | BF | / | FRA | FRB | 130 | /", "hex_opcode": "0xEC000104", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "130", "clean": "130"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "FRA", "desc": "Src A"}, {"name": "FRB", "desc": "Src B"}], "extension": "Decimal Floating-Point", "description": "The DFP operand in FRA is compared to the DFP operand in FRB. The result of the compare is placed into CR field BF and the FPCC.", "special_registers": "CR, FPSCR", "programming_notes": "dcmpo[q] are treated as Floating-Point instructions in terms of resource availability.", "page_found": "Page 244 - 246", "pseudocode": "f1 <- DFP_operation(f2, f3)", "example": "dcmpo cr0, f2, f3"}
{"mnemonic": "dctdp", "architecture": "PowerISA", "full_name": "Decimal Convert To DFP Long", "summary": "Converts DFP Short (32-bit compressed) to DFP Long (64-bit).", "syntax": "dctdp FRT, FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | / | FRB | 258 | Rc", "hex_opcode": "0xEC000204", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "258", "clean": "258"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Decimal Floating-Point", "description": "The DFP short operand in bits 32:63 of FRB is converted to DFP long format and the converted result is placed into FRT. The sign of the result is the same as the sign of the source operand. The ideal exponent is the exponent of the source operand.", "special_registers": "FPSCR (FPRF, FR, FI), CR (CR1)", "programming_notes": "Note that DFP short format is a storage-only format. Therefore, conversion of a short SNaN to long format will not cause an exception and the SNaN is preserved. Subsequent operation on that SNaN in long format will cause an exception.", "page_found": "Page 260 - 262", "pseudocode": "FRT <- ConvertToDFPLong(FRB)", "example": "dctdp f1, f3"}
{"mnemonic": "drsp", "architecture": "PowerISA", "full_name": "Decimal Round To DFP Short", "summary": "Rounds DFP Long (64-bit) to DFP Short (32-bit compressed).", "syntax": "drsp FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | 0 | FRB | 770 | /", "hex_opcode": "0xEC000604", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "770", "clean": "770"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Decimal Floating-Point", "description": "The DFP long operand in FRB is converted and rounded to DFP short format. The DFP short value is extended on the left with zeros to form a 64-bit entity and placed into FRT. The sign of the result is the same as the sign of the source operand.", "pseudocode": "if 'drsp' then\n    FRT <- (FRB) rounded to DFP short format\n    if Rc=1 then\n        CR0, CR1 <- updated based on result", "special_registers": "FPSCR, CR0, CR1", "programming_notes": "Note that DFP short format is a storage-only format. Therefore, conversion of a long SNaN to short for mat will not cause an exception.", "page_found": "Page 261 - 262", "example": "drsp f1, f3"}
{"mnemonic": "dcffix", "architecture": "PowerISA", "full_name": "Decimal Convert From Fixed", "summary": "Converts a 64-bit integer to DFP.", "syntax": "dcffix FRT, FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | 0 | FRB | 802 | /", "hex_opcode": "0xEC000644", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "802", "clean": "802"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "extension": "Decimal Floating-Point", "page_found": "Page 1463 - 1464", "special_registers": "FPSCR", "description": "Converts a 64-bit signed integer from FRB to a decimal floating-point value and places it in FRT. The integer is interpreted as a two's-complement 64-bit value. The result is an exact representation in the decimal floating-point format. FPSCR is updated if the integer is out of range for DFP.", "pseudocode": "integer_value ← FRB[0:63] (signed)\nFRT ← convert_to_DFP(integer_value)\nFPSCR ← updated based on conversion result", "example": "dcffix f1, f3"}
{"mnemonic": "dctfix", "architecture": "PowerISA", "full_name": "Decimal Convert To Fixed", "summary": "Converts a decimal floating-point number to a fixed-point integer.", "syntax": "dctfix FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | / | FRB | 290 | Rc", "hex_opcode": "0xEC000244", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "290", "clean": "290"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Decimal Floating-Point", "description": "The DFP operand in FRB is rounded to an integer value and placed into FRT in the 64-bit signed binary integer format. The sign of the result is the same as the sign of the source operand, except when the source operand is a NaN or a zero.", "pseudocode": "if 'dctfix' then\n    FRT <- round(FRB)\nelse if 'dctfix.' then\n    FRT <- round(FRB)\n    CR1 <- result of comparison", "special_registers": "FPSCR (FPRF, FR, FI, FX, VXSNAN, VXCVI, XX), CR1 (if Rc=1)", "page_found": "Page 270 - 272", "programming_notes": "It is recommended that software pre-round the operand to a floating-point integral using drintx[q] or drintn[q] if a rounding mode other than the current rounding mode specified by DRN is needed.", "example": "dctfix f1, f3"}
{"mnemonic": "denbcd", "architecture": "PowerISA", "full_name": "Decimal Encode BCD", "summary": "Encodes a DFP number into BCD format.", "syntax": "denbcd FRT, FRB, S", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | S | FRB | 834 | /", "hex_opcode": "0xEC000684", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "S", "clean": "S"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "834", "clean": "834"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}, {"name": "S", "desc": "Sign Control"}], "extension": "Decimal Floating-Point", "description": "Encodes a decimal floating-point number in FRB into Binary Coded Decimal (BCD) format and places the result in FRT. The sign control field S determines how the sign is encoded. This instruction handles conversion of the coefficient and exponent into BCD representation. FPSCR is updated based on invalid operations.", "pseudocode": "dfp_value ← FRB\nsign ← extract_sign(dfp_value)\ncoefficient ← extract_coefficient(dfp_value)\nexponent ← extract_exponent(dfp_value)\nbcd_result ← encode_to_bcd(sign, coefficient, exponent, S)\nFRT ← bcd_result\nFPSCR ← updated based on encoding result", "special_registers": "FPSCR", "programming_notes": "The denbcd instruction is used to convert a Binary-Coded Decimal (BCD) value into Data-Packed Decimal (DPD) format. Ensure that the input BCD value in FRB is correctly formatted and aligned as required by the instruction. This operation does not raise exceptions for valid inputs but may require careful handling of special cases like overflow or invalid data.", "example": "denbcd f1, f3, 0"}
{"mnemonic": "ddedpd", "architecture": "PowerISA", "full_name": "Decode DPD To BCD (Single Precision)", "summary": "Converts a portion of the significand of a DFP operand to a signed or unsigned BCD number.", "syntax": "ddedpd SP,FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | SP | / | FRB | 322 | Rc", "hex_opcode": "0xEC000284", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "SP", "clean": "SP"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "322", "clean": "322"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:12 | 13:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}, {"name": "SP", "desc": "Sign Control"}], "extension": "Decimal Floating-Point", "description": "The rightmost 16 digits of the significand (32 digits for ddedpdq) is converted to an unsigned BCD number and the result is placed into FRT[p].", "pseudocode": "if 'ddedpd' then\n    if SP = 0 then\n        FRT <- unsigned BCD conversion of rightmost 16 digits of FRB[p]\n    else if SP = 1 then\n        FRT <- signed BCD conversion of rightmost 15 digits of FRB[p] with the same sign as FRB[p]\n    end if", "special_registers": "FPSCR, (FPRF, FX, VXCVI), FPSCR, (FR, set, to, 0), CR1, (if, Rc=1), CR0", "page_found": "Page 264 - 266", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "ddedpd 0, f1, f3"}
{"mnemonic": "diex", "architecture": "PowerISA", "full_name": "Decimal Insert Exponent", "summary": "Combines a sign/coefficient from FRA and exponent from FRB.", "syntax": "diex FRT, FRA, FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | FRA | FRB | 866 | /", "hex_opcode": "0xEC0006C4", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "866", "clean": "866"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Coeff Source"}, {"name": "FRB", "desc": "Exp Source"}], "extension": "Decimal Floating-Point", "description": "Combines a sign and coefficient from FRA with an exponent from FRB to form a decimal floating-point result in FRT. FRA provides the mantissa/coefficient; FRB provides the exponent. The instruction reconstructs a DFP value from its components. FPSCR is updated if the result is invalid or out of range.", "pseudocode": "coefficient ← extract_mantissa(FRA)\nSign ← extract_sign(FRA)\nexponent ← extract_exponent_field(FRB)\nFRT ← compose_DFP(Sign, coefficient, exponent)\nFPSCR ← updated based on composition result", "page_found": "Page 255", "special_registers": "FPSCR", "programming_notes": "The diex instruction is used to adjust the exponent of a decimal floating-point number by inserting the exponent from one operand (FRA) into another (FRB). Ensure that both operands are properly aligned and in the correct format to avoid exceptions. This operation requires FPSCR to manage rounding modes and exception flags.", "example": "diex f1, f2, f3"}
{"mnemonic": "dxex", "architecture": "PowerISA", "full_name": "Decimal Extract Exponent", "summary": "Extracts the biased exponent of a DFP operand in FRB and places it into FRT.", "syntax": "dxex FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | 0 | FRB | 354 | /", "hex_opcode": "0xEC0002C4", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "354", "clean": "354"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Decimal Floating-Point", "description": "The biased exponent of the operand in FRB is extracted and placed into FRT in the 64-bit signed binary integer format. Special codes are returned for infinity, QNaN, or SNaN operands.", "pseudocode": "if 'dxex' then\n    a <- biased exponent of FRB[p]\n    if a > MBE1 then\n        FRT[p] <- QNaNSNaN\n    else if 0 ≤a ≤MBE then\n        FRT[p] <- Finite number with biased exponent a\n    else if a = -1 then\n        FRT[p] <- Infinity\n    else if a = -2 then\n        FRT[p] <- QNaN\n    else if a = -3 then\n        FRT[p] <- SNaN\n    else if a < -3 then\n        FRT[p] <- QNaN", "special_registers": "CR1, (if, Rc=1), FPSCR", "programming_notes": "The exponent bias value is 101 for DFP Short, 398 for DFP Long, and 6176 for DFP Extended.", "page_found": "Page 266 - 268", "example": "dxex f1, f3"}
{"mnemonic": "dscli", "architecture": "PowerISA", "full_name": "Decimal Shift Coefficient Left Immediate", "summary": "Shifts the significand of a DFP operand left by a specified number of digits.", "syntax": "dscli FRT,FRA,SH", "encoding": {"format": "Z23-form", "binary_pattern": "59 | FRT | FRA | SH | 66 | /", "hex_opcode": "0xEC000084", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "SH", "clean": "SH"}, {"raw": "66", "clean": "66"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Source"}, {"name": "SH", "desc": "Shift Amount"}], "extension": "Decimal Floating-Point", "description": "The significand of the DFP operand in FRA is shifted left SH digits. For NaN or infinity, all significand digits are in the trailing significand field. SH is a 6-bit unsigned binary integer. Digits shifted out of the leftmost digit are lost. Zeros are supplied to the vacated positions on the right. The result is placed into FRT. The sign of the result is the same as the sign of the source operand in FRA.", "pseudocode": "if 'dscli' then\n    FRT <- (FRA) << SH", "special_registers": "CR1, (if, Rc=1), FPSCR", "page_found": "Page 268 - 270", "programming_notes": "The dscli instruction shifts the significand of a decimal floating-point number to the left by a specified number of digits. Ensure that the shift amount (SH) is within the 0-63 range, as it's a 6-bit unsigned integer. This operation does not affect the sign or exponent of the operand. If SH is greater than the precision of the significand, leading zeros will be introduced to fill the vacated positions on the right.", "example": "dscli f1, f2, 3"}
{"mnemonic": "dsri", "architecture": "PowerISA", "full_name": "Decimal Shift Coefficient Right Immediate", "summary": "Shifts the coefficient of a DFP number right.", "syntax": "dsri FRT, FRA, SH", "encoding": {"format": "Z23-form", "binary_pattern": "59 | FRT | FRA | SH | 98 | Rc", "hex_opcode": "0xEC0000C4", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "SH", "clean": "SH"}, {"raw": "98", "clean": "98"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Source"}, {"name": "SH", "desc": "Shift Amount"}], "extension": "Decimal Floating-Point", "special_registers": "FPSCR", "description": "Shifts the coefficient of a 64-bit Decimal Floating-Point number right by an immediate amount (0-63 places), with zeros shifted in from the left. The exponent remains unchanged. This instruction is part of the Decimal Floating-Point extension and does not affect condition registers unless Rc=1.", "pseudocode": "coefficient ← coefficient >> SH\nFRT ← DFP_construct(sign, exponent, coefficient)", "example": "dsri f1, f2, 3"}
{"mnemonic": "xssubqp", "architecture": "PowerISA", "full_name": "VSX Scalar Subtract Quad-Precision", "summary": "Subtracts the contents of two quad-precision floating-point registers and handles special cases like NaNs.", "syntax": "xssubqp VRT,VRA,VRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | FRA | FRB | 514 | Rc", "hex_opcode": "0xFC000408", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "516", "clean": "516"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector-Scalar Register"}, {"name": "VRA", "desc": "Source Vector-Scalar Register"}, {"name": "VRB", "desc": "Source Vector-Scalar Register"}], "extension": "VSX", "description": "Subtracts the quad-precision floating-point operand in VSR VRB from VSR VRA and stores the result in VSR VRT, handling infinities, NaNs, and denormalised numbers according to IEEE 754 semantics. This VSX instruction may update FPSCR exception flags and the result sign. The 'o' suffix variant enables underflow/overflow exception.", "pseudocode": "FRT ← FRA - FRB\nFPSCR ← updated with exception flags (XX, ZX, UX, OX, VXISI, VXSNAN, etc.)", "special_registers": "FPSCR FPRF FR FI FX VXSNAN VXISI OX UX XX", "page_found": "Page 679 - 680", "programming_notes": "The xssubqp instruction is used for subtracting quad-precision floating-point numbers. Ensure that the VSX feature is enabled in the MSR register to avoid exceptions. Handle special cases like NaNs and infinities by checking the FPSCR flags after execution. The result is rounded according to the rounding mode specified in FPSCR.RN.", "example": "xssubqp v1, v2, v3"}
{"mnemonic": "xsdivqp", "architecture": "PowerISA", "full_name": "VSX Scalar Divide Quad-Precision", "summary": "Divides the contents of two quad-precision floating-point registers and places the result in another register.", "syntax": "xsdivqp vD, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | FRA | FRB | 546 | Rc", "hex_opcode": "0xFC000448", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "548", "clean": "548"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector-Specific Register"}, {"name": "VRA", "desc": "Source Vector-Specific Register"}, {"name": "VRB", "desc": "Source Vector-Specific Register"}], "extension": "VSX", "description": "Divides the quad-precision floating-point operand in VSR vA by the quad-precision operand in VSR vB, placing the quotient in VSR vD, with IEEE 754 rounding and exception handling. This VSX instruction updates FPSCR flags including division-by-zero, invalid operation, and underflow/overflow conditions.", "pseudocode": "vD ← vA ÷ vB\nFPSCR ← updated with exception flags (ZX, XX, UX, OX, VXSNAN, VXIDI, VXDZ, etc.)", "special_registers": "FPSCR, VXSNAN, VXIDI, VXZDZ, OX, UX, ZX, XX", "page_found": "Page 661 - 662", "programming_notes": "The xsdivqp instruction is used for dividing two quad-precision floating-point numbers. Be cautious of division by zero, which results in infinity or quiet NaN, and set appropriate flags. Handle infinities and zeros carefully as they can lead to special cases like zero or infinity in the result. Ensure that operands are correctly aligned and consider performance implications when using this instruction in loops.", "example": "xsdivqp vd, va, vb"}
{"mnemonic": "xssqrtqp", "architecture": "PowerISA", "full_name": "VSX Scalar Square Root Quad-Precision", "summary": "Computes the square root of a quad-precision floating-point value with unbounded significand precision and exponent range.", "syntax": "xssqrtqp vD, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | / | FRB | 674 | Rc", "hex_opcode": "0xFC1B0648", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "676", "clean": "676"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector-Specific Register"}, {"name": "VRB", "desc": "Source Vector-Specific Register"}, {"name": "VRA", "desc": "Target Vector-Specific Register"}], "extension": "VSX", "description": "The normalized square root of src is produced with unbounded significand precision and exponent range. If RO=1, the rounding mode is Round to Odd; otherwise, it is specified by RN.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_BFP128(VSR[VRB+32])\nv ← bfp_SQUARE_ROOT(src)\nrnd ← bfp_ROUND_TO_BFP128(RO, FPSCR.RN, v)\nresult ← bfp128_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxsqrt_flag=1 then SetFX(FPSCR.VXSQRT)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvx_flag ← vxsnan_flag | vxsqrt_flag\nvex_flag ← FPSCR.VE & vx_flag\nif vex_flag=0 then do\n  VSR[VRT+32] ← result\n  FPSCR.FPRF ← fprf_CLASS_BFP128(result)\nend\nFPSCR.FR ← (vx_flag=0) & inc_flag\nFPSCR.FI ← (vx_flag=0) & xx_flag", "special_registers": "FPSCR, VSR[VRT+32]", "page_found": "Page 673 - 674", "programming_notes": "The xssqrtqp instruction computes the square root of a quad-precision floating-point number. Ensure that VSX is enabled in the MSR register to avoid exceptions. Be cautious with rounding modes; setting RO=1 enables Round to Odd, which may differ from standard rounding behaviors. This instruction handles special cases like NaNs and infinities, updating the FPSCR accordingly.", "example": "xssqrtqp vd, vb"}
{"mnemonic": "xscmpuqp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Unordered Quad-Precision", "summary": "Compares two quad-precision floating-point values and updates the condition register.", "syntax": "xscmpuqp BF, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | / | vA | vB | 644 | /", "hex_opcode": "0xFC000508", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "644", "clean": "644"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRA", "desc": "Vector Register A"}, {"name": "VRB", "desc": "Vector Register B"}], "extension": "VSX", "description": "The instruction compares the contents of VSR[VRA+32] (src1) and VSR[VRB+32] (src2) in quad-precision format. It sets bits in the CR field BF to indicate the result of the comparison.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc1 ←bfp_CONVERT_FROM_BFP128(VSR[VRA+32])\nsrc2 ←bfp_CONVERT_FROM_BFP128(VSR[VRB+32])\nvxsnan_flag ←src1.class.SNaN | src2.class.SNaN\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nCR.bit[4×BF+32] ←FPSCR.FL ←src1 < src2\nCR.bit[4×BF+33] ←FPSCR.FG ←src1 > src2\nCR.bit[4×BF+34] ←FPSCR.FE ←src1 = src2\nCR.bit[4×BF+35] ←FPSCR.FU ←src1.class.SNaN | src1.class.QNaN | src2.class.SNaN | src2.class.QNaN", "special_registers": "CR, FPSCR", "page_found": "Page 783 - 784", "programming_notes": "This instruction is used for comparing two quad-precision floating-point numbers. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. Be cautious with NaN values, as they can trigger VXSNAN and FU flags in the FPSCR register. The comparison results are stored in the CR register bits corresponding to BF.", "example": "xscmpuqp cr0, va, vb"}
{"mnemonic": "xscmpopoqp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Ordered Quad-Precision", "summary": "Compares Quad floats (Signaling on NaN).", "syntax": "xscmpopoqp BF, vA, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | BF | / | vA | vB | 132 | /", "hex_opcode": "0xFC000108", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "132", "clean": "132"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}], "extension": "VSX", "description": "Compares two quad-precision floating-point values in VSRs vA and vB, signaling (raising exception) if either operand is a quiet NaN, and stores the comparison result (Less Than, Greater Than, Equal, or Unordered) in condition register field BF. The FPSCR VE flag may be set on NaN detection.", "pseudocode": "if (vA is NaN) or (vB is NaN) then FPSCR[VXSNAN] ← 1\nif vA < vB then CR[BF] ← 0b100\nelse if vA > vB then CR[BF] ← 0b010\nelse if vA = vB then CR[BF] ← 0b001\nelse CR[BF] ← 0b011 (unordered)", "example": "xscmpopoqp cr0, va, vb"}
{"mnemonic": "xsnegqp", "architecture": "PowerISA", "full_name": "VSX Scalar Negate Quad-Precision", "summary": "Negates a 128-bit Quad float.", "syntax": "xsnegqp vD, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | 0 | vB | 804 | /", "hex_opcode": "0xFC100648", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "804", "clean": "804"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VSX", "description": "Negates the sign bit of a 128-bit quad-precision floating-point value in VSR vB and stores the result in VSR vD. This is a simple bit-flip operation that does not affect FPSCR exception flags or condition registers.", "pseudocode": "vD ← vB with sign bit flipped", "page_found": "Page 646", "special_registers": "MSR", "programming_notes": "This instruction is used to negate a quad-precision floating-point value. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting the appropriate bit in the MSR register. The operation affects two consecutive doublewords, so ensure proper alignment of the source register.", "example": "xsnegqp vd, vb"}
{"mnemonic": "xsabsqp", "architecture": "PowerISA", "full_name": "VSX Scalar Absolute Quad-Precision", "summary": "Computes the absolute value of a quad-precision floating-point number.", "syntax": "xsabsqp vD, vB", "encoding": {"format": "X-form", "binary_pattern": "111111 | vD | 00000 | vB | 11001 | 00100 | Rc", "hex_opcode": "0xFC000648", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "772", "clean": "772"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "RT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source Vector Register"}], "extension": "VSX", "pseudocode": "vD ← vB with sign bit cleared", "page_found": "Page 1393 - 1394", "description": "Computes the absolute value of a 128-bit quad-precision floating-point number in VSR vB by clearing the sign bit and stores the result in VSR vD. This VSX instruction does not modify FPSCR exception flags or condition registers.", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xsabsqp vd, vb"}
{"mnemonic": "xxinsertw", "architecture": "PowerISA", "full_name": "VSX Vector Insert Word", "summary": "Inserts a 32-bit word from a GPR into a specific element of a VSR.", "syntax": "xxinsertw XT, RB, UIM", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | UIM | RB | 181", "hex_opcode": "0xF00002D4", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "RB", "clean": "RB"}, {"raw": "181", "clean": "181"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target VSR"}, {"name": "RB", "desc": "Source GPR"}, {"name": "UIM", "desc": "Element Index"}], "extension": "VSX", "description": "Inserts a 32-bit word from GPR RB into a specified 32-bit element of VSR XT, with the element index selected by UIM[2:0]. This is a VSX instruction that operates on vector data and does not affect condition registers or status fields.", "pseudocode": "element_index ← UIM[2:0]\nXT[32*element_index : 32*element_index+31] ← RB[32:63]", "page_found": "Page 953", "special_registers": "MSR", "programming_notes": "The xxinsertw instruction is used to insert a word from one vector register into another at a specified byte offset. Ensure that the UIM (Upper Immediate) field does not exceed 12 to avoid undefined behavior. This instruction requires VSX (Vector Scalar Extensions) to be enabled in the MSR.VSX bit; otherwise, it will raise an exception.", "example": "xxinsertw vs1, r5, uim"}
{"mnemonic": "xxextractuw", "architecture": "PowerISA", "full_name": "VSX Vector Extract Unsigned Word", "summary": "Extracts an unsigned word from a vector register and places it into another vector register.", "syntax": "xxextractuw RT, XS, UIM", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XS | UIM | RT | 165", "hex_opcode": "0xF0000294", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XS", "clean": "XS"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "RT", "clean": "RT"}, {"raw": "165", "clean": "165"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RT", "desc": "Target GPR"}, {"name": "XS", "desc": "Source VSR"}, {"name": "UIM", "desc": "Element Index"}, {"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "extension": "VSX", "description": "The instruction extracts the contents of byte elements UIM:UIM+3 from VSR[XB] and places them into word element 1 of VSR[XT]. The remaining byte elements of VSR[XT] are not modified, and the remaining word elements of VSR[XT] are set to 0.", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\nsrc ←VSR[32×BX+B].byte[UIM:UIM+3]\nVSR[32×TX+T].dword[0] ←EXTZ64(src)\nVSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000", "page_found": "Page 952 - 953", "special_registers": "MSR", "programming_notes": "This instruction is useful for extracting a specific 4-byte segment from one vector register and placing it into another, while zeroing out the rest of the destination register. Ensure that VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. Be cautious with byte alignment; UIM must be a multiple of 4 to correctly extract a word. This instruction operates at the user privilege level and does not generate any exceptions beyond those related to VSX availability.", "example": "xxextractuw r3, vs1, uim"}
{"mnemonic": "xxspltw", "architecture": "PowerISA", "full_name": "VSX Vector Splat Word", "summary": "Replicates a word element from one vector register into all elements of another vector register.", "syntax": "xxspltw XT, XS, UIM", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | UIM | XS | 164", "hex_opcode": "0xF0000290", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "UIM", "clean": "UIM"}, {"raw": "XS", "clean": "XS"}, {"raw": "164", "clean": "164"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XS", "desc": "Source"}, {"name": "UIM", "desc": "Index"}, {"name": "XB", "desc": "Source Vector Register"}], "extension": "VSX", "description": "The contents of the specified word element UIM in VSR[XB] are replicated into each word element of VSR[XT].", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nXT <- XB.word[UIM]\nVSR[32×TX+T].word[0] ← XT\nVSR[32×TX+T].word[1] ← XT\nVSR[32×TX+T].word[2] ← XT\nVSR[32×TX+T].word[3] ← XT", "page_found": "Page 956 - 957", "special_registers": "MSR", "programming_notes": "The xxspltw instruction is commonly used to replicate a word element from one vector register into all elements of another vector register. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register; otherwise, an exception will be raised. This instruction does not have specific alignment requirements and operates at user privilege level.", "example": "xxspltw vs1, vs1, uim"}
{"mnemonic": "lmw", "architecture": "PowerISA", "full_name": "Load Multiple Word", "summary": "Loads words from memory into registers RT through R31 (Context Switch).", "syntax": "lmw RT, D(RA)", "encoding": {"format": "D-form", "binary_pattern": "46 | RT | RA | D", "hex_opcode": "0xB8000000", "visual_parts": [{"raw": "46", "clean": "46"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "D", "clean": "D"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "operands": [{"name": "RT", "desc": "Start Register"}, {"name": "D", "desc": "Displacement"}, {"name": "RA", "desc": "Base"}], "extension": "Base", "description": "Loads a sequence of words from memory starting at address (RA + D) into GPRs RT through R31, incrementing the address by 4 bytes for each register. This instruction is part of the Base ISA and does not update condition registers; it may be used for context switching.", "pseudocode": "if RA = 0 then EA ← 0 + D else EA ← RA + D\nfor i ← 0 to (31 - RT) do\n  GPRC[RT+i] ← MEM[EA+4*i : EA+4*i+31]\nend for", "programming_notes": "This instruction is not supported in Little-Endian mode. If it is executed in Little-Endian mode, the system alignment error handler is invoked.", "page_found": "Page 103 - 104", "example": "lmw r3, 0(r4)"}
{"mnemonic": "stmw", "architecture": "PowerISA", "full_name": "Store Multiple Word", "summary": "Stores words from registers RT through R31 to memory (Context Switch).", "syntax": "stmw RT, D(RA)", "encoding": {"format": "D-form", "binary_pattern": "47 | RT | RA | D", "hex_opcode": "0xBC000000", "visual_parts": [{"raw": "47", "clean": "47"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "D", "clean": "D"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:31", "length": "32"}, "operands": [{"name": "RT", "desc": "Start Register"}, {"name": "D", "desc": "Displacement"}, {"name": "RA", "desc": "Base"}], "extension": "Base", "description": "Stores a sequence of words from GPRs RT through R31 to memory starting at address (RA + D), incrementing the address by 4 bytes for each register. This instruction is part of the Base ISA and does not update condition registers; it is commonly used for context switching.", "pseudocode": "if RA = 0 then EA ← 0 + D else EA ← RA + D\nfor i ← 0 to (31 - RT) do\n  MEM[EA+4*i : EA+4*i+31] ← GPRC[RT+i]\nend for", "page_found": "Page 104", "programming_notes": "Loads (or stores) a sequence of GPRs from consecutive word-aligned memory locations. Not pipelined on most implementations; for bulk data movement consider using vector or floating-point load/store multiples instead.", "example": "stmw r3, 0(r4)"}
{"mnemonic": "lswi", "architecture": "PowerISA", "full_name": "Load String Word Immediate", "summary": "Loads a sequence of bytes from memory into general-purpose registers.", "syntax": "lswi RT, RA, NB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | NB | 597 | /", "hex_opcode": "0x7C0004AA", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "NB", "clean": "NB"}, {"raw": "597", "clean": "597"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Start Register"}, {"name": "RA", "desc": "Base"}, {"name": "NB", "desc": "Byte Count"}], "extension": "Base", "description": "Loads NB bytes from memory starting at address RA into a sequence of GPRs beginning at RT, filling registers left-to-right and wrapping from R31 back to R0 if necessary. This Base ISA instruction does not affect condition registers and provides a byte-oriented string load capability.", "pseudocode": "EA ← RA\nreg ← RT\nbyte_index ← 0\nfor i ← 0 to (NB - 1) do\n  GPRC[reg][(32 - 8*(byte_index+1)) : (31 - 8*byte_index)] ← MEM[EA+i : EA+i+7]\n  byte_index ← byte_index + 1\n  if byte_index = 4 then\n    byte_index ← 0\n    reg ← (reg + 1) mod 32\n  end if\nend for", "programming_notes": "This instruction is not supported in Little-Endian mode. If it is executed in Little-Endian mode, the system alignment error handler is invoked.", "page_found": "Page 104 - 106", "example": "lswi r3, r4, 4"}
{"mnemonic": "stswi", "architecture": "PowerISA", "full_name": "Store String Word Immediate", "summary": "Stores a string of words from general-purpose registers to memory, starting at the address in RA and using an immediate byte count.", "syntax": "stswi RT, RA, NB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | NB | 725 | /", "hex_opcode": "0x7C0005AA", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "NB", "clean": "NB"}, {"raw": "725", "clean": "725"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Start Register"}, {"name": "RA", "desc": "Base"}, {"name": "NB", "desc": "Byte Count"}, {"name": "RS", "desc": "Source General Purpose Register"}], "extension": "Base", "description": "Stores NB bytes from a sequence of GPRs beginning at RS to memory starting at address RA, extracting bytes left-to-right and wrapping from R31 back to R0 if necessary. This Base ISA instruction does not affect condition registers and provides a byte-oriented string store capability.", "pseudocode": "EA ← RA\nreg ← RS\nbyte_index ← 0\nfor i ← 0 to (NB - 1) do\n  MEM[EA+i : EA+i+7] ← GPRC[reg][(32 - 8*(byte_index+1)) : (31 - 8*byte_index)]\n  byte_index ← byte_index + 1\n  if byte_index = 4 then\n    byte_index ← 0\n    reg ← (reg + 1) mod 32\n  end if\nend for", "programming_notes": "This instruction is not supported in Little-Endian mode. If it is executed in Little-Endian mode and NB > 0, the system alignment error handler is invoked.", "page_found": "Page 106 - 108", "example": "stswi r3, r4, 4"}
{"mnemonic": "slbia", "architecture": "PowerISA", "full_name": "Segment Lookaside Buffer Invalidate All", "summary": "Invalidates all Segment Lookaside Buffer entries (OS Management).", "syntax": "slbia IH", "encoding": {"format": "X-form", "binary_pattern": "111111 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000", "hex_opcode": "0x7C0003E4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "IH", "clean": "IH"}, {"raw": "498", "clean": "498"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9 | 10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "IH", "desc": "Hint"}], "extension": "Privileged", "description": "Invalidates all Segment Lookaside Buffer (SLB) entries, optionally using an invalidation hint. This is a privileged instruction that flushes virtual-to-real address translation caches and is typically used during context switches or address-space changes.", "pseudocode": "for each SLB entry do\n  invalidate entry\nend for", "programming_notes": "slbia does not affect SLBs on other threads.\nIf slbia is executed when instruction address translation is enabled, software can ensure that attempting to fetch the instruction following the slbia does not cause an Instruction Segment interrupt by placing the slbia and the subsequent instruction in the effective segment mapped by SLB entry 0.", "extended_mnemonics": [{"mnemonic": "slbia", "equivalent_to": "slbia 0"}], "page_found": "Page 1199 - 1200", "special_registers": "MSR", "example": "slbia"}
{"mnemonic": "slbmte", "architecture": "PowerISA", "full_name": "SLB Move To Entry", "summary": "Writes an SLB entry (Mapping effective to virtual address).", "syntax": "slbmte RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | / | RB | 402 | /", "hex_opcode": "0x7C000324", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "402", "clean": "402"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source VSID"}, {"name": "RB", "desc": "Effective Addr"}], "extension": "Privileged", "description": "Writes an entry to the Segment Lookaside Buffer, mapping an effective segment address (from RB) to a virtual segment ID and protection bits (from RS). This is a privileged 64-bit instruction that modifies virtual address translation state.", "special_registers": "MSR", "programming_notes": "The slbmte instruction is used to install temporary ESID-to-VSID translations in the SLB for a specific hardware thread. These entries are thread-specific and can be made permanent (bolted) if LPCRUPRT=1, allowing up to four bolted entries per thread. Ensure that the MSR[PR] bit is clear when executing this instruction, as it requires supervisor privilege level. Be cautious of alignment requirements for the SLB entry data.", "pseudocode": "SLB[RB[36:63]] ← RS", "example": "slbmte r3, r5"}
{"mnemonic": "msgclr", "architecture": "PowerISA", "full_name": "Message Clear", "summary": "Clears a pending doorbell interrupt (Inter-processor comms).", "syntax": "msgclr RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | RB | 118 | /", "hex_opcode": "0x7C0001DC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "118", "clean": "118"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RB", "desc": "Message Type"}], "extension": "Privileged", "description": "Clears a pending doorbell or message interrupt from another processor, based on the message type specified in RB. This is a privileged instruction used for inter-processor communication and does not affect condition registers.", "pseudocode": "clear_pending_message(RB[62:63])", "page_found": "Page 1311", "programming_notes": "Use msgclr to clear messages accepted by the current thread. If clearing a message of type 0x05, it also clears any associated Directed Ultravisor Doorbell exception. This instruction is typically used in hypervisor environments where message handling and doorbell management are required.", "example": "msgclr r5"}
{"mnemonic": "msgsnd", "architecture": "PowerISA", "full_name": "Message Send", "summary": "Sends a doorbell interrupt to another processor.", "syntax": "msgsnd RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | RB | 206 | /", "hex_opcode": "0x7C00019C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "206", "clean": "206"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RB", "desc": "Message Type"}], "extension": "Privileged", "description": "The instruction sends a message to other threads based on the contents of register RB. The message type and destination thread(s) are specified in RB.", "pseudocode": "msgtype ← GPR(RB)32:36\npayload ← GPR(RB)37:63\nif (msgtype = 0x05)\nthen\n    send_msg(msgtype, payload)", "programming_notes": "If msgsnd is used to notify the receiver that updates have been made to storage, a sync should be placed between the stores and the msgsnd. See Section 6.9.2.", "page_found": "Page 1310 - 1311", "example": "msgsnd r5"}
{"mnemonic": "attn", "architecture": "PowerISA", "full_name": "Attention", "summary": "Stops execution and alerts the hardware debugger.", "syntax": "attn", "encoding": {"format": "X-form", "binary_pattern": "000000 | 00000 | 00000 | 00000 | 256 | /", "hex_opcode": "0x00000200", "visual_parts": [{"raw": "000000", "clean": "000000"}, {"raw": "00000", "clean": "00000"}, {"raw": "00000", "clean": "00000"}, {"raw": "00000", "clean": "00000"}, {"raw": "256", "clean": "256"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Privileged", "description": "Stops execution and signals the hardware debugger, allowing entry into debug mode. This is a privileged instruction that halts the processor and alerts external debugging hardware. No condition registers or status fields are affected by the instruction itself; the processor state is frozen pending debugger intervention.", "pseudocode": "SignalDebugger()", "example": "attn"}
{"mnemonic": "clrbhrb", "architecture": "PowerISA", "full_name": "Clear Branch History Rolling Buffer", "summary": "Clear Branch History Rolling Buffer. Clears all entries in the Branch History Rolling Buffer (BHRB) to zero. Used to flush branch prediction history, for example when switching execution contexts to prevent information leakage between security domains.", "syntax": "clrbhrb", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | / | 894 | /", "hex_opcode": "0x7C00035C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "894", "clean": "894"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [], "extension": "Base", "description": "Sets all BHRB entries to 0s.", "pseudocode": "for n = 0 to (number_of_BHRBEs implemented - 1)\n    BHRB(n) ←0", "page_found": "Page 1076 - 1077", "programming_notes": "The clrbhrb instruction is used to clear the Branch History Rolling Buffer, resetting all its entries to zero. This can be useful for ensuring a predictable state before branch prediction analysis or when isolating performance tests. However, it should be used with caution as it affects speculative execution paths, potentially impacting performance if not necessary.", "example": "clrbhrb"}
{"mnemonic": "tabortwc", "architecture": "PowerISA", "full_name": "Transaction Abort Word Conditional", "summary": "Aborts a transaction if the condition is met (Word comparison).", "syntax": "tabortwc TO, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | TO | RA | RB | 782 | 1", "hex_opcode": "0x7C00061D", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "TO", "clean": "TO"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "782", "clean": "782"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "TO", "desc": "Options"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Transactional Memory", "description": "Transaction Abort Word Conditional. Aborts the current transaction if the condition formed by TO and the comparison of RA and RB is true. Records the abort cause in TEXASR.", "pseudocode": "if Transactional() then\n  if TO_condition(TO, RA, RB) then\n    Abort_Transaction(cause=Explicit)", "special_registers": "CR, CR0, CR1, CR6, MSR, TAR", "programming_notes": "Use tabortwc to conditionally abort a transaction based on a comparison between two registers. Ensure that the transaction is active when using this instruction; otherwise, it will have no effect. The TO field specifies the type of comparison (e.g., equal, less than). Be cautious with the privilege level and ensure the MSR[TS] bit is set to enable transactions.", "example": "tabortwc 4, r4, r5"}
{"mnemonic": "tabortdc", "architecture": "PowerISA", "full_name": "Transaction Abort Doubleword Conditional", "summary": "Aborts a transaction if the condition is met (Doubleword comparison).", "syntax": "tabortdc TO, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | TO | RA | RB | 814 | 1", "hex_opcode": "0x7C00065D", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "TO", "clean": "TO"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "814", "clean": "814"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "TO", "desc": "Options"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Transactional Memory", "description": "Transaction Abort Doubleword Conditional. Aborts the current transaction if the condition formed by TO and the 64-bit comparison of RA and RB is true. Records the abort cause in TEXASR.", "pseudocode": "if Transactional() then\n  if TO_condition_64(TO, RA, RB) then\n    Abort_Transaction(cause=Explicit)", "special_registers": "CR, CR0, CR1, CR6, MSR, TAR", "programming_notes": "Use tabortdc to conditionally abort a transaction based on a 64-bit comparison. Ensure that the transaction is active when using this instruction; otherwise, it has no effect. The TO field specifies the condition for the comparison, and RA and RB are the registers holding the values to compare. This instruction operates at the problem state privilege level.", "example": "tabortdc 4, r4, r5"}
{"mnemonic": "trechkpt", "architecture": "PowerISA", "full_name": "Transaction Recheckpoint", "summary": "Updates the transaction checkpoint.", "syntax": "trechkpt", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | / | 1006 | /", "hex_opcode": "0x7C0007DD", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "1006", "clean": "1006"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Transactional Memory", "description": "Transaction Recheckpoint. Restores the transactional register state from the checkpoint saved by a prior tbegin. Used to restart a transaction after a non-transactional abort.", "pseudocode": "if Suspended() then\n  Restore_Checkpoint()\n  Resume_Transaction()", "special_registers": "LR, CTR, CR, FPSCR, XER, MSR, SRR0, SRR1, TAR", "programming_notes": "The trechkpt instruction is used to restore the transactional register state from a previous checkpoint, allowing a transaction to be restarted after a non-transactional abort. It should only be used within a transactional region and requires that the transaction was previously suspended. Ensure proper ordering of instructions to maintain consistency and avoid data corruption.", "example": "trechkpt"}
{"mnemonic": "lxvl", "architecture": "PowerISA", "full_name": "Load VSX Vector Length", "summary": "Loads N bytes into a vector, where N is specified in a GPR.", "syntax": "lxvl XT, RA, RB", "encoding": {"format": "XX1-form", "binary_pattern": "0 | T | RA | RB | TX | 0 | 0 | 0", "hex_opcode": "0x7C00021A", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "269", "clean": "269"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Length Reg"}], "extension": "VSX", "description": "Loads up to 16 bytes from memory into a VSX register, with the byte count specified by bits 0-4 of RB. Bytes from address RA|0 (or RA + RB if RA is non-zero) are loaded left-aligned into XT; unloaded bytes are zeroed. This is a VSX category instruction with no effect on condition registers.", "pseudocode": "N ← RB[0:4]\nif N > 16 then N ← 16\naddr ← RA + 0 (if RA != 0 else address from context)\nfor i ← 0 to N-1\n  XT[8*i:8*i+7] ← [addr + i]\nfor i ← N to 15\n  XT[8*i:8*i+7] ← 0", "programming_notes": "Loading less than 16 bytes of data using lxvl in BE mode results in data being loaded into the target VSR left-to-right, placing the first byte in the leftmost byte of the target VSR, and padded on the right with 0s. Loading less than 16 bytes of data using lxvl in LE mode results in data being loaded into the target VSR right-to-left, placing the first byte in the rightmost byte of the target VSR, and padded on the left with 0s.", "page_found": "Page 623 - 624", "special_registers": "MSR", "example": "lxvl vs1, r4, r5"}
{"mnemonic": "stxvl", "architecture": "PowerISA", "full_name": "Store VSX Vector Length", "summary": "Stores a specified number of bytes from a VSX vector register to memory.", "syntax": "stxvl XS, RA, RB", "encoding": {"format": "XX1-form", "binary_pattern": "31 | XS | RA | RB | 397", "hex_opcode": "0x7C00031A", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "XS", "clean": "XS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "397", "clean": "397"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Length Reg"}], "extension": "VSX", "description": "Stores up to 16 bytes from a VSX register to memory, with the byte count specified by bits 0-4 of RB. Bytes are stored from XS starting at address RA|0 (or RA + RB if RA is non-zero). This is a VSX category instruction with no effect on condition registers.", "pseudocode": "N ← RB[0:4]\nif N > 16 then N ← 16\naddr ← RA + 0 (if RA != 0 else address from context)\nfor i ← 0 to N-1\n  [addr + i] ← XS[8*i:8*i+7]", "programming_notes": "Storing N bytes of data from the source VSR using stxvl in BE mode, results in the leftmost N bytes in the source VSR being placed in storage, starting with the leftmost byte of the source VSR.\n\nStoring N bytes of data from the source VSR using stxvl in LE mode, results in the rightmost N bytes in the source VSR being placed in storage, starting with the rightmost byte of the source VSR.", "page_found": "Page 635 - 636", "special_registers": "MSR", "example": "stxvl vs1, r4, r5"}
{"mnemonic": "xxperm", "architecture": "PowerISA", "full_name": "VSX Vector Permute", "summary": "Performs a vector permute operation on the contents of three VSX registers.", "syntax": "xxperm XT, XA, XB, XC", "encoding": {"format": "XX4-form", "binary_pattern": "18 | T | A | B | AX | BX | TX", "hex_opcode": "0xF00000D0", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "XC", "clean": "XC"}, {"raw": "26", "clean": "26"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "XC", "desc": "Control"}], "extension": "VSX", "description": "Permutes bytes from two 128-bit VSX registers (XA and XB) using a control vector in XC to produce a 128-bit result in XT. Each byte in the control vector specifies which byte from the 32-byte concatenation of XA and XB is selected into the corresponding output byte. This is a VSX category instruction with no effect on condition registers.", "pseudocode": "concat ← XA || XB\nfor i ← 0 to 15\n  control_byte ← XC[8*i:8*i+7]\n  idx ← control_byte[1:4]\n  XT[8*i:8*i+7] ← concat[8*idx:8*idx+7]", "page_found": "Page 958 - 959", "special_registers": "MSR", "programming_notes": "The xxperm instruction requires VSX (Vector Scalar Extensions) to be enabled in the MSR register. Ensure that the control vector register is correctly set up, as it defines how the source bytes are permuted. This instruction operates on 32-byte vectors and can be used for tasks like data reordering or encryption. Be cautious of alignment requirements; the VSX registers must be properly aligned to avoid exceptions.", "example": "xxperm vs1, vs2, vs3, vs4"}
{"mnemonic": "xxpermr", "architecture": "PowerISA", "full_name": "VSX Vector Permute Right", "summary": "Little-endian optimized permute.", "syntax": "xxpermr XT, XA, XB, XC", "encoding": {"format": "XX4-form", "binary_pattern": "60 | XT | XA | XB | XC | 58", "hex_opcode": "0xF00001D0", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "XC", "clean": "XC"}, {"raw": "58", "clean": "58"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31", "length": "32"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "XC", "desc": "Control"}], "extension": "VSX", "description": "Permutes bytes from two 128-bit VSX registers (XA and XB) using a control vector in XC, optimized for little-endian byte ordering. Each byte in the control vector specifies which byte from the concatenation of XB and XA is selected into the corresponding output byte in XT. This is a VSX category instruction with no effect on condition registers.", "pseudocode": "concat ← XB || XA\nfor i ← 0 to 15\n  control_byte ← XC[8*i:8*i+7]\n  idx ← control_byte[1:4]\n  XT[8*i:8*i+7] ← concat[8*idx:8*idx+7]", "page_found": "Page 959", "programming_notes": "The xxpermr instruction is useful for complex byte-level data manipulation, especially when merging and reordering bytes from two source vectors. Ensure that the control vector (second source) correctly specifies the desired permutation indices to avoid unexpected results. This instruction operates at a privilege level that allows it in user mode, but developers should be cautious of potential performance overhead due to its complexity.", "example": "xxpermr vs1, vs2, vs3, vs4"}
{"mnemonic": "lswx", "architecture": "PowerISA", "full_name": "Load String Word Indexed", "summary": "Loads N bytes from memory (N in XER).", "syntax": "lswx RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 533 | /", "hex_opcode": "0x7C00042A", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "533", "clean": "533"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Start Reg"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Loads a variable number of bytes from memory into a sequence of GPRs starting at RT, where the byte count is stored in XER[25:31]. Bytes are loaded from address RA|0 (or RA + RB if RA is non-zero) into consecutive 32-bit words. This is a Base category instruction that does not affect condition registers.", "pseudocode": "N ← XER[25:31]\naddr ← (RA == 0) ? 0 : RA + RB\nreg ← RT\nfor i ← 0 to N-1\n  byte_offset ← i mod 4\n  if byte_offset == 0 and i > 0 then\n    reg ← (reg + 1) mod 32\n  reg[8*byte_offset:8*byte_offset+7] ← [addr + i]", "page_found": "Page 106", "special_registers": "XER", "programming_notes": "String instructions are not pipelined on most implementations and can be very slow for large counts. Consider using byte loops or vector instructions for performance-critical paths. NB: these instructions are optional in Power ISA 3.0+ and may trap on some implementations.", "example": "lswx r3, r4, r5"}
{"mnemonic": "stswx", "architecture": "PowerISA", "full_name": "Store String Word Indexed", "summary": "Stores N bytes to memory (N in XER).", "syntax": "stswx RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 661 | /", "hex_opcode": "0x7C00052A", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "661", "clean": "661"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Start Reg"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Stores a variable number of bytes from a sequence of GPRs starting at RT to memory, where the byte count is stored in XER[25:31]. Bytes are stored from consecutive 32-bit words to address RA|0 (or RA + RB if RA is non-zero). This is a Base category instruction that does not affect condition registers.", "pseudocode": "N ← XER[25:31]\naddr ← (RA == 0) ? 0 : RA + RB\nreg ← RT\nfor i ← 0 to N-1\n  byte_offset ← i mod 4\n  if byte_offset == 0 and i > 0 then\n    reg ← (reg + 1) mod 32\n  [addr + i] ← reg[8*byte_offset:8*byte_offset+7]", "page_found": "Page 107", "special_registers": "XER", "programming_notes": "String instructions are not pipelined on most implementations and can be very slow for large counts. Consider using byte loops or vector instructions for performance-critical paths. NB: these instructions are optional in Power ISA 3.0+ and may trap on some implementations.", "example": "stswx r3, r4, r5"}
{"mnemonic": "wait", "architecture": "PowerISA", "full_name": "Wait for Interrupt", "summary": "Stops instruction execution and places the processor in a lower power state until an interrupt occurs.", "syntax": "wait WC,PL", "encoding": {"format": "X-form", "binary_pattern": "31 | / | WC | / | 62 | /", "hex_opcode": "0x7C00003C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "WC", "clean": "WC"}, {"raw": "/", "clean": "/"}, {"raw": "62", "clean": "62"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "WC", "desc": "Wait Condition (0=Interrupt, 1=Resume)"}, {"name": "PL", "desc": "Programmable Length Field"}], "pseudocode": "if WC == 0 then\n  WaitForInterrupt()\nelse if WC == 1 then\n  WaitForResume()", "example": "wait 0", "example_note": "Idle CPU.", "extension": "Base", "description": "Suspends instruction execution and places the processor in a low-power idle state until an interrupt is pending. The WC field selects the wait condition (interrupt vs. resume), and the PL field optionally specifies a programmable length timeout. This is a Base/privileged instruction with no effect on condition registers; execution resumes after the specified event.", "programming_notes": "Because the waiting begins when the instruction completes, if the waiting is ended by an exception that causes a change of control flow (interrupt, event-based branch), the SPR that is set to reflect the point in the instruction stream at which the change of control flow occurred (e.g., SRR0 for Decrementer interrupt) will contain the EA of the instruction following the wait instruction. Bits 6 and 7 of the wait instruction may be used in some implementations for an implementation-dependent field. Unless the intention is to use the implementation-dependent field, these bits must be coded zero. wait serves as both a basic and an extended mnemonic. The Assembler will recognize a wait mnemonic with two operands as the basic form and a wait mnemonic with one operand or with no operand as an extended form. In the extended form with one operand the PL operand is omitted and assumed to be 0. In the extended form with no operand the WC and PL operands are omitted and assumed to be 0. The wait instruction frees computational resources which might be allocated to another program or converted into power savings.", "extended_mnemonics": [{"mnemonic": "waitrsv", "equivalent_to": "wait 1,0"}, {"mnemonic": "pause_short", "equivalent_to": "wait 2,0"}], "page_found": "Page 1064 - 1065"}
{"mnemonic": "dcbzl", "architecture": "PowerISA", "full_name": "Data Cache Block Zero Long", "summary": "Zeros a cache block (implementation defined size).", "syntax": "dcbzl RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | RB | 1014 | /", "hex_opcode": "0x7C0007EC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "1014", "clean": "1014"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Zeros a cache block of implementation-defined size (typically larger than the standard dcbz 128-byte block) specified by the address computed as RA + RB. This instruction operates on the data cache and may affect cache coherency on multiprocessor systems. No condition or status registers are modified; cache operations are weakly ordered.", "pseudocode": "EA ← (RA) + (RB)\nZero cache block at EA with implementation-defined block size", "example": "dcbzl r4, r5"}
{"mnemonic": "slbmfee", "architecture": "PowerISA", "full_name": "SLB Move From Entry ESID", "summary": "Reads the ESID part of an SLB entry.", "syntax": "slbmfee RT, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | / | RB | 366 | /", "hex_opcode": "0x7C000726", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "366", "clean": "366"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RB", "desc": "Index"}], "extension": "Privileged", "description": "Reads the ESID (Effective Segment ID) portion of a Segment Lookaside Buffer entry. The SLB entry is selected by the index in RB. This privileged instruction is used in 64-bit mode for TLB management. No condition or status registers are modified.", "pseudocode": "RT ← SLB[RB].ESID", "special_registers": "LPCRUPRT", "programming_notes": "The slbmfee instruction is used to read software-loaded SLB entries, placing the ESID and V fields into register RT. If the entry is valid and LPCRUPRT is set, it also places the BO field into RT. Ensure that the index calculation respects the LPCRUPRT setting to avoid accessing invalid SLB entries.", "example": "slbmfee r3, r5"}
{"mnemonic": "slbmfev", "architecture": "PowerISA", "full_name": "SLB Move From Entry VSID", "summary": "Reads software-loaded SLB entries and places the contents of the B, VSID, Ks, Kp, N, L, C, and LP fields into register RT.", "syntax": "slbmfev RT, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | / | RB | 851 | /", "hex_opcode": "0x7C0006A6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "334", "clean": "334"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RB", "desc": "Index"}, {"name": "RS", "desc": "Source General Purpose Register"}], "extension": "Privileged", "description": "This instruction is used to read software-loaded SLB entries. When LPCRUPRT=0, the entry is specified by bits 52:63 of register RB. When LPCRUPRT=1, only the first four entries can be read, so bits 52:61 of register RB are ignored. If the specified entry is valid (V=1), the contents of the B, VSID, Ks, Kp, N, L, C, and LP fields of the entry are placed into register RT.", "pseudocode": "if 'slbmfev' then\n    if LPCRUPRT=0 then\n        entry_index <- (RB)[52:63]\n    else\n        entry_index <- (RB)[52:61] & 0xF\n    end if\n    if SLB[entry_index].V=1 then\n        RT[0:1] <- SLB[entry_index].B\n        RT[2:51] <- SLB[entry_index].VSID\n        RT[52] <- SLB[entry_index].Ks\n        RT[53] <- SLB[entry_index].Kp\n        RT[54] <- SLB[entry_index].N\n        RT[55] <- SLB[entry_index].L\n        RT[56] <- SLB[entry_index].C\n        RT[57] <- 0b0\n        RT[58:59] <- SLB[entry_index].LP\n        RT[60:63] <- 0b0000\n    else\n        RT <- 0\n    end if", "programming_notes": "This instruction is privileged. The use of the L field is implementation specific.", "page_found": "Page 1204 - 1205", "special_registers": "LPCRUPRT", "example": "slbmfev r3, r5"}
{"mnemonic": "msgclrp", "architecture": "PowerISA", "full_name": "Message Clear Privileged", "summary": "Clears a privileged doorbell interrupt.", "syntax": "msgclrp RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | RB | 150 | /", "hex_opcode": "0x7C00015C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "150", "clean": "150"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RB", "desc": "Type"}], "extension": "Privileged", "description": "Clears a privileged doorbell interrupt message matching the type specified in RB. This privileged instruction is used for inter-processor communication and interrupt management. Clearing a message may affect pending interrupts. No explicit status registers are modified, but interrupt state is affected.", "pseudocode": "Clear privileged doorbell message of type (RB)", "page_found": "Page 1312", "programming_notes": "The msgclrp instruction is used to clear messages accepted by the current thread, specifically handling Directed Hypervisor Doorbell exceptions when the message type is 0x05. It operates at a privileged level and should be used carefully to avoid unintended side effects on exception handling.", "example": "msgclrp r5"}
{"mnemonic": "msgsndp", "architecture": "PowerISA", "full_name": "Message Send Privileged", "summary": "Sends a message to other threads on the same processor or sub-processor.", "syntax": "msgsndp RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | RB | 142 | /", "hex_opcode": "0x7C00011C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "142", "clean": "142"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RB", "desc": "Type"}], "extension": "Privileged", "description": "The instruction sends a message to other threads based on the contents of RB. The message type and destination thread(s) are specified in RB.", "pseudocode": "msgtype ← (RB)32:36\npayload ← (RB)37:63\nt ← (RB)57:63\nif msgtype = 5 and t ≤ maximum privileged thread number on processor or sub-processor then\n    DPDES63-t ← 1\n    send_msg(msgtype, payload, t)", "special_registers": "DPDES", "programming_notes": "If msgsndp is used to notify the receiver that updates have been made to storage, a lwsync or sync should be placed between the stores and the msgsndp. See Section 6.9.2.", "page_found": "Page 1311 - 1312", "example": "msgsndp r5"}
{"mnemonic": "mfsr", "architecture": "PowerISA", "full_name": "Move From Segment Register", "summary": "Legacy 32-bit segment register read.", "syntax": "mfsr RT, SR", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | SR | / | 595 | /", "hex_opcode": "0x7C0004A6", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "SR", "clean": "SR"}, {"raw": "/", "clean": "/"}, {"raw": "595", "clean": "595"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "SR", "desc": "Segment Reg"}], "extension": "Base", "description": "Reads a 32-bit Segment Register (legacy 32-bit PowerPC mode) and stores the value in RT. This instruction is used only in 32-bit addressing mode and is deprecated in 64-bit architecture. No condition or status registers are modified.", "pseudocode": "RT ← SR[SR number from instruction]", "example": "mfsr r3, 0"}
{"mnemonic": "mtsr", "architecture": "PowerISA", "full_name": "Move To Segment Register", "summary": "Legacy 32-bit segment register write.", "syntax": "mtsr SR, RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | SR | / | 210 | /", "hex_opcode": "0x7C0001A4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "SR", "clean": "SR"}, {"raw": "/", "clean": "/"}, {"raw": "210", "clean": "210"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "SR", "desc": "Segment Reg"}, {"name": "RS", "desc": "Source"}], "extension": "Base", "description": "Move the contents of GPR RS into the specified 32-bit segment register SR. This is a legacy instruction used in 32-bit PowerPC address translation and is not available in 64-bit mode. No status fields are affected.", "pseudocode": "SR ← RS[32:63]", "example": "mtsr 0, r3"}
{"mnemonic": "mfsrin", "architecture": "PowerISA", "full_name": "Move From Segment Register Indirect", "summary": "Indirect read of segment register using RB.", "syntax": "mfsrin RT, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | / | RB | 659 | /", "hex_opcode": "0x7C000526", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "659", "clean": "659"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RB", "desc": "Effective Addr"}], "extension": "Base", "description": "Move the contents of the segment register selected by bits 0-3 of GPR RB into GPR RT. This is an indirect read of the 32-bit segment register and is not available in 64-bit mode. No status fields are affected.", "pseudocode": "SR_index ← RB[0:3]\nRT ← SR[SR_index]", "example": "mfsrin r3, r5"}
{"mnemonic": "mtsrin", "architecture": "PowerISA", "full_name": "Move To Segment Register Indirect", "summary": "Indirect write of segment register using RB.", "syntax": "mtsrin RS, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | / | RB | 242 | /", "hex_opcode": "0x7C0001E4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "242", "clean": "242"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RB", "desc": "Effective Addr"}], "extension": "Base", "description": "Move the contents of GPR RS into the segment register selected by bits 0-3 of GPR RB. This is an indirect write of the 32-bit segment register and is not available in 64-bit mode. No status fields are affected.", "pseudocode": "SR_index ← RB[0:3]\nSR[SR_index] ← RS[32:63]", "example": "mtsrin r3, r5"}
{"mnemonic": "mfbhrbe", "architecture": "PowerISA", "full_name": "Move From Branch History Rolling Buffer Entry", "summary": "Reads a specific entry from the BHRB.", "syntax": "mfbhrbe RT, BHRBE", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | BHRBE | / | 302 | /", "hex_opcode": "0x7C00025C", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "BHRBE", "clean": "BHRBE"}, {"raw": "/", "clean": "/"}, {"raw": "302", "clean": "302"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "BHRBE", "desc": "Entry Index"}], "extension": "Base", "description": "Move the contents of a Branch History Rolling Buffer (BHRB) entry, indexed by BHRBE, into GPR RT. The BHRB records branch addresses and is used for performance monitoring. This is a hypervisor-privileged or performance-monitoring register operation. No architected status fields are affected.", "pseudocode": "RT ← BHRB[BHRBE]", "page_found": "Page 1077", "special_registers": "BHRBE0:9", "programming_notes": "The mfbhrbe instruction is used to access entries in the Branch History Rolling Buffer (BHRB). Ensure that the specified entry index is within the range of implemented entries to avoid placing zero in the target register. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "mfbhrbe r3, 0"}
{"mnemonic": "tsr", "architecture": "PowerISA", "full_name": "Transaction Suspend or Resume", "summary": "Suspends or resumes a transaction based on L.", "syntax": "tsr L", "encoding": {"format": "X-form", "binary_pattern": "31 | L | / | / | 750 | /", "hex_opcode": "0x7C0005DE", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "L", "clean": "L"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "750", "clean": "750"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "L", "desc": "1=Suspend"}], "extension": "Transactional Memory", "description": "Transaction Suspend or Resume. Suspends an active transaction (L=0) or resumes a suspended transaction (L=1). The transactional state is preserved across the suspend/resume boundary.", "pseudocode": "if L = 0 then\n  Suspend_Transaction()\nelse\n  Resume_Transaction()", "special_registers": "MSR", "programming_notes": "The tsr instruction is used to either suspend or resume a transaction based on the value of the L bit. Ensure that the transactional state is properly managed to avoid data corruption. This instruction operates at the privilege level of the executing context and may raise exceptions if used incorrectly, such as attempting to resume a non-existent suspended transaction.", "example": "tsr 0"}
{"mnemonic": "tabortwci", "architecture": "PowerISA", "full_name": "Transaction Abort Word Conditional Immediate", "summary": "Aborts transaction if word condition (Immediate) is met.", "syntax": "tabortwci TO, RA, SI", "encoding": {"format": "X-form", "binary_pattern": "31 | TO | RA | SI | 782 | 1", "hex_opcode": "0x7C00061D", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "TO", "clean": "TO"}, {"raw": "RA", "clean": "RA"}, {"raw": "SI", "clean": "SI"}, {"raw": "782", "clean": "782"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "TO", "desc": "Options"}, {"name": "RA", "desc": "Src"}, {"name": "SI", "desc": "Immediate"}], "extension": "Transactional Memory", "description": "Transaction Abort Word Conditional Immediate. Aborts the current transaction if the condition formed by TO and the comparison of RA with the sign-extended immediate SI is true.", "pseudocode": "if Transactional() then\n  if TO_condition(TO, RA, EXTS(SI)) then\n    Abort_Transaction(cause=Explicit)", "special_registers": "CR, MSR", "programming_notes": "Use tabortwci to conditionally abort a transaction based on the comparison of a register with an immediate value. Ensure that the transactional state is active; otherwise, the instruction has no effect. Be cautious with the TO condition and immediate sign extension to avoid unintended aborts.", "example": "tabortwci 4, r4, 16"}
{"mnemonic": "tabortdci", "architecture": "PowerISA", "full_name": "Transaction Abort Doubleword Conditional Immediate", "summary": "Aborts transaction if doubleword condition (Immediate) is met.", "syntax": "tabortdci TO, RA, SI", "encoding": {"format": "X-form", "binary_pattern": "31 | TO | RA | SI | 814 | 1", "hex_opcode": "0x7C00065D", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "TO", "clean": "TO"}, {"raw": "RA", "clean": "RA"}, {"raw": "SI", "clean": "SI"}, {"raw": "814", "clean": "814"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "TO", "desc": "Options"}, {"name": "RA", "desc": "Src"}, {"name": "SI", "desc": "Immediate"}], "extension": "Transactional Memory", "description": "Transaction Abort Doubleword Conditional Immediate. Aborts the current transaction if the condition formed by TO and the 64-bit comparison of RA with the sign-extended immediate SI is true.", "pseudocode": "if Transactional() then\n  if TO_condition_64(TO, RA, EXTS(SI)) then\n    Abort_Transaction(cause=Explicit)", "special_registers": "CR, MSR", "programming_notes": "Use tabortdci to conditionally abort a transaction based on a comparison between a register and an immediate value. Ensure the transaction is active; otherwise, the instruction has no effect. Be cautious with TO conditions to avoid unintended transaction aborts.", "example": "tabortdci 4, r4, 16"}
{"mnemonic": "xsrintqp", "architecture": "PowerISA", "full_name": "VSX Scalar Round to Integer Quad-Precision", "summary": "Rounds Quad float to nearest Integer.", "syntax": "xsrintqp vD, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | / | vB | 484 | /", "hex_opcode": "0xFC0003C4", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "/", "clean": "/"}, {"raw": "vB", "clean": "vB"}, {"raw": "484", "clean": "484"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}], "extension": "VSX", "description": "Round the quad-precision floating-point value in VSR vB to the nearest integer, using the rounding mode specified in FPSCR[RN], and store the result in VSR vD. This is a VSX instruction. FPSCR is read for rounding mode and may have status flags updated (XX, ZX, etc.) depending on the rounding operation.", "pseudocode": "vD ← round_to_integer_qp(vB, FPSCR[RN])\nFPSCR[FPCC, VXCVI, XX, ZX, ...] ← updated as per rounding", "example": "xsrintqp vd, vb"}
{"mnemonic": "dctqpq", "architecture": "PowerISA", "full_name": "Decimal Convert To Quad-Precision DFP", "summary": "Converts DFP Long (64-bit) to DFP Quad (128-bit).", "syntax": "dctqpq vD, FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | vD | / | FRB | 258 | /", "hex_opcode": "0xFC000204", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "vD", "clean": "vD"}, {"raw": "/", "clean": "/"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "258", "clean": "258"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target Quad"}, {"name": "FRB", "desc": "Source Long"}], "extension": "Decimal Floating-Point", "description": "Convert a DFP long (64-bit) value from FPR FRB into a DFP quad (128-bit) value and store it in VSR vD. This is a Decimal Floating-Point (DFP) instruction. FPSCR status fields may be updated to indicate conversion results.", "pseudocode": "quad_value ← convert_dfp_long_to_quad(FRB)\nvD ← quad_value\nFPSCR[...] ← updated as per conversion", "special_registers": "FPSCR", "programming_notes": "The dctqpq instruction is used to convert a DFP number from long format to extended format. Ensure that the source register (FRAp) contains a valid DFP value in long format, and the target register (FRTp) is properly aligned for storing an extended format DFP number. This operation does not alter the FPSCR register.", "example": "dctqpq vd, f3"}
{"mnemonic": "drdpq", "architecture": "PowerISA", "full_name": "Decimal Round To DFP Quad-Precision", "summary": "Rounds DFP Quad (128-bit) to DFP Long (64-bit).", "syntax": "drdpq FRT, vB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | / | vB | 770 | /", "hex_opcode": "0xFC000604", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "/", "clean": "/"}, {"raw": "vB", "clean": "vB"}, {"raw": "770", "clean": "770"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "FRT", "desc": "Target Long"}, {"name": "vB", "desc": "Source Quad"}], "extension": "Decimal Floating-Point", "description": "Round a DFP quad (128-bit) value from VSR vB to DFP long (64-bit) precision using the rounding mode in FPSCR[RN], and store the result in FPR FRT. This is a Decimal Floating-Point (DFP) instruction. FPSCR status fields are updated to reflect rounding or conversion results.", "special_registers": "FPSCR", "programming_notes": "The drdpq instruction is used for rounding decimal floating-point numbers to quad-precision. Ensure that the input number in FRA[p] is within the valid range for quad-precision format to avoid overflow or underflow exceptions. The rounding mode is controlled by the FPSCR register, so make sure it's set according to your application's requirements before executing drdpq.", "pseudocode": "long_value ← round_dfp_quad_to_long(vB, FPSCR[RN])\nFRT ← long_value\nFPSCR[...] ← updated as per rounding", "example": "drdpq f1, vb"}
{"mnemonic": "vcipherlast", "architecture": "PowerISA", "full_name": "Vector Cipher Last", "summary": "Performs the final round of AES encryption (SubBytes, ShiftRows, AddRoundKey). No MixColumns.", "syntax": "vcipherlast vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1289", "hex_opcode": "0x10000509", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1289", "clean": "1289"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "State"}, {"name": "vB", "desc": "Round Key"}], "extension": "Vector Crypto", "description": "Perform the final round of AES encryption on 128-bit blocks. Applies SubBytes, ShiftRows, and AddRoundKey transformations (but not MixColumns, which is done in prior rounds). Operates on one or more 128-bit AES blocks. No status flags are affected.", "pseudocode": "vD ← AES_SubBytes(vA)\nvD ← AES_ShiftRows(vD)\nvD ← AES_AddRoundKey(vD, vB)", "page_found": "Page 460", "special_registers": "MSR", "programming_notes": "The vcipherlast instruction is used to perform the final round of AES encryption on a vector of data. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. This instruction processes each 32-bit word of the input data with the corresponding round key from the VRA register to produce the encrypted output in the VRT register.", "example": "vcipherlast vd, va, vb"}
{"mnemonic": "vncipherlast", "architecture": "PowerISA", "full_name": "Vector Inverse Cipher Last", "summary": "Performs the final round of AES decryption.", "syntax": "vncipherlast vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1353", "hex_opcode": "0x10000549", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1353", "clean": "1353"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "State"}, {"name": "vB", "desc": "Round Key"}], "extension": "Vector Crypto", "description": "Performs the final round of AES decryption on a 128-bit block, applying the inverse MixColumns and InvSubBytes operations followed by AddRoundKey with the provided round key. This instruction is part of the Vector Crypto extension and operates on 128-bit values held in vector registers. No status flags are affected.", "pseudocode": "vD ← InvCipherLast(vA, vB)", "page_found": "Page 461", "special_registers": "MSR", "programming_notes": "The vncipherlast instruction is used to complete the AES inverse cipher process by applying the final transformations. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The input State and RoundKey must be correctly loaded into VSR registers VRA+32 and VRB+32, respectively, to avoid incorrect results.", "example": "vncipherlast vd, va, vb"}
{"mnemonic": "vsbox", "architecture": "PowerISA", "full_name": "Vector S-Box", "summary": "Performs the SubBytes operation (S-Box lookup) on a vector.", "syntax": "vsbox vD, vA", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 0 | vA | 1480", "hex_opcode": "0x100005C8", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vA", "clean": "vA"}, {"raw": "1480", "clean": "1480"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}], "extension": "Vector Crypto", "description": "Performs the SubBytes operation (S-Box lookup) on all 16 bytes of a 128-bit vector, applying the AES S-box transformation to each byte independently. This instruction is part of the Vector Crypto extension and is used during AES encryption and decryption. No status flags are affected.", "pseudocode": "for i = 0 to 15 do vD[8*i:8*i+7] ← AES_SBOX[vA[8*i:8*i+7]]", "page_found": "Page 461 - 462", "special_registers": "MSR", "programming_notes": "The vsbox instruction applies the AES SubBytes transformation to a vector register, requiring the Vector Facility to be enabled (MSR.VEC=1). Ensure that the input vector is correctly aligned and that the destination register is properly set to avoid data corruption. This instruction operates at user privilege level but will raise an exception if the Vector Facility is not available.", "example": "vsbox vd, va"}
{"mnemonic": "vshasigmad", "architecture": "PowerISA", "full_name": "Vector SHA-512 Sigma Doubleword", "summary": "Performs the SHA-512 σ0, σ1, Σ0, or Σ1 functions on doubleword elements of vector registers.", "syntax": "vshasigmad vD, vA, ST, SIX", "encoding": {"format": "VX-form", "binary_pattern": "1730 | VRT | VRA | ST | SIX", "hex_opcode": "0x100006C2", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "ST", "clean": "ST"}, {"raw": "1730", "clean": "1730"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source"}, {"name": "ST", "desc": "Type"}, {"name": "SIX", "desc": "Shift"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}], "extension": "Vector Crypto", "description": "For vshasigmad, the instruction performs either a SHA-512 σ0, σ1, Σ0, or Σ1 function on each doubleword element of VSR[VRA+32] based on the values in ST and SIX. The result is placed into corresponding elements of VSR[VRT+32].", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    src ← VSR[VRA+32].dword[i]\n    if ST=0 & SIX.bit[2×i]=0 then\n        // SHA-512 σ0 function\n        VSR[VRT+32].dword[i] ← (src >>> 1) ⊕ (src >>> 8) ⊕ (src >> 7)\n    if ST=0 & SIX.bit[2×i]=1 then\n        // SHA-512 σ1 function\n        VSR[VRT+32].dword[i] ← (src >>> 19) ⊕ (src >>> 61) ⊕ (src >> 6)\n    if ST=1 & SIX.bit[2×i]=0 then\n        // SHA-512 Σ0 function\n        VSR[VRT+32].dword[i] ← (src >>> 28) ⊕ (src >>> 34) ⊕ (src >>> 39)\n    if ST=1 & SIX.bit[2×i]=1 then\n        // SHA-512 Σ1 function\n        VSR[VRT+32].dword[i] ← (src >>> 14) ⊕ (src >>> 18) ⊕ (src >>> 41)\nend", "programming_notes": "Bits 1 and 3 of SIX are reserved.", "page_found": "Page 462 - 463", "special_registers": "MSR", "example": "vshasigmad vd, va, r4, 0"}
{"mnemonic": "vpermxor", "architecture": "PowerISA", "full_name": "Vector Permute and Exclusive-OR", "summary": "Permutes bytes from vA and vB, then XORs with vC. Used for finite field arithmetic.", "syntax": "vpermxor vD, vA, vB, vC", "encoding": {"format": "VA-form", "binary_pattern": "0 | VRT | VRA | VRB | VRC | 45", "hex_opcode": "0x1000002D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "vC", "clean": "vC"}, {"raw": "45", "clean": "45"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "vC", "desc": "Permute"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Control Vector Register"}], "extension": "Vector Crypto", "description": "Permutes bytes from vA and vB according to the permutation control vector vC, then XORs the result with vC. This instruction is used for finite field arithmetic operations in cryptographic algorithms within the Vector Crypto extension. No status flags are affected.", "pseudocode": "temp ← Permute(vA || vB, vC); vD ← temp XOR vC", "page_found": "Page 467 - 468", "special_registers": "MSR", "programming_notes": "The vpermxor instruction requires the Vector Facility to be enabled in the MSR. Ensure that the index values in VRC do not exceed 15 to avoid undefined behavior. This instruction operates on byte-level data and is useful for complex data transformations involving permutation and bitwise operations.", "example": "vpermxor vd, va, vb, vc"}
{"mnemonic": "bcdcfn.", "architecture": "PowerISA", "full_name": "Decimal Convert from National", "summary": "Converts a national decimal value to packed decimal format and stores it in the target vector register.", "syntax": "bcdcfn. vD, vB, PS", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | 7 | VRB | 1 | PS | 385", "hex_opcode": "0x10070581", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "1", "clean": "1"}, {"raw": "vB", "clean": "vB"}, {"raw": "1473", "clean": "1473"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:29 | 30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "PS", "desc": "Sign"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "Vector BCD", "description": "The instruction checks if the source vector register contains a valid national decimal value. If valid, it converts it to packed decimal format and stores it in the target vector register. The condition register is updated based on the comparison of the source with zero.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsrc_sign ←(VSR[VRB+32].hword[7] = 0x002D)\neq_flag ←1\ninv_flag ←(VSR[VRB+32].hword[7] != 0x002B) & (VSR[VRB+32].hword[7] != 0x002D)\ndo i = 0 to 6\neq_flag  ←eq_flag & (VSR[VRB+32].hword[i] = 0x0030)\ninv_flag ←inv_flag | (VSR[VRB+32].hword[i] < 0x0030) | (VSR[VRB+32].hword[i] > 0x0039)\nend\nlt_flag ←(eq_flag=0) & (src_sign=1)\ngt_flag ←(eq_flag=0) & (src_sign=0)\ndo i = 0 to 23\nresult.nibble[i] ←0x0\nend\ndo i = 0 to 6\nresult.nibble[i+24] ← VSR[VRB+32].hword[i].nibble[3]\nend\nresult.nibble[31] ← (src_sign=0) ? ((PS=0) ? 0xC : 0xF) : 0xD\nVSR[VRT+32] ←inv_flag ? undefined : result\nCR.bit[56] ←inv_flag ? 0b0 : lt_flag\nCR.bit[57] ←inv_flag ? 0b0 : gt_flag\nCR.bit[58] ←inv_flag ? 0b0 : eq_flag\nCR.bit[59] ←inv_flag", "special_registers": "CR6, VSR[VRT+32], VSR[VRB+32]", "page_found": "Page 503 - 504", "programming_notes": "The bcdcfn. instruction is used to convert a national decimal value in a vector register to packed decimal format, updating the condition register based on comparison with zero. Ensure the source vector contains valid national decimal values; otherwise, the result is undefined and flags are set accordingly. This instruction requires the Vector Facility (MSR.VEC) enabled.", "example": "bcdcfn. vd, vb, 0"}
{"mnemonic": "bcdctn.", "architecture": "PowerISA", "full_name": "Decimal Convert to National", "summary": "Converts a packed decimal value to national decimal format and stores it in a vector register.", "syntax": "bcdctn. vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | 5 | VRB | 1 | / | 385", "hex_opcode": "0x10050581", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "1473", "clean": "1473"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:29 | 30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "Vector BCD", "description": "The instruction converts the packed decimal value from VSR[VRB+32] into national decimal format and places it into VSR[VRT+32]. It also updates the condition register CR6 based on the validity of the input and its comparison to zero.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nend\nsrc_sign ←(VSR[VRB+32].nibble[31] = 0xB) | (VSR[VRB+32].nibble[31] = 0xD)\neq_flag ←(VSR[VRB+32].nibble[0:30] = 0)\nlt_flag ←(eq_flag=0) & (src_sign=1)\ngt_flag ←(eq_flag=0) & (src_sign=0)\ninv_flag ←false\nox_flag ←false\ndo i = 0 to 23\n    ox_flag ←ox_flag | (VSR[VRB+32].nibble[i] != 0x0)\nend\ndo i = 0 to 30\n    inv_flag ←inv_flag | (VSR[VRB+32].nibble[i] > 0x9)\nend\nif inv_flag then\n    VSR[VRT+32] ←undefined\nelse\n    do i = 0 to 6\n        result.hword[i].nibble[0:2] ←0x003\n        result.hword[i].nibble[3] ←VSR[VRB+32].nibble[i+24]\n    end\n    result.hword[7] ←(src_sign=1) ? 0x002D : 0x002B\n    VSR[VRT+32] ←result\nend\nCR.bit[56] ←inv_flag ? 0b0 : lt_flag\nCR.bit[57] ←inv_flag ? 0b0 : gt_flag\nCR.bit[58] ←inv_flag ? 0b0 : eq_flag\nCR.bit[59] ←inv_flag | ox_flag", "special_registers": "CR6", "page_found": "Page 505 - 506", "programming_notes": "The bcdctn. instruction is used to convert packed decimal values into national decimal format, updating CR6 with flags indicating the result's validity and sign. Ensure VSR[VRB+32] contains valid packed decimal data; otherwise, VSR[VRT+32] will be undefined. This instruction requires vector mode enabled (MSR.VEC=1) and operates at user privilege level.", "example": "bcdctn. vd, vb"}
{"mnemonic": "bcdcfz.", "architecture": "PowerISA", "full_name": "Decimal Convert from Zoned", "summary": "Converts BCD Zoned format to Signed Packed BCD.", "syntax": "bcdcfz. vD, vB, PS", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | 6 | VRB | 1 | PS | 385", "hex_opcode": "0x10060581", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "1", "clean": "1"}, {"raw": "vB", "clean": "vB"}, {"raw": "1217", "clean": "1217"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:29 | 30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "PS", "desc": "Sign"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "Vector BCD", "description": "The bcdcfz. instruction converts a zoned decimal value in VSR[VRB+32] to a packed decimal format and stores the result in VSR[VRT+32]. The conversion is based on the sign code and digit values of the source operand.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ninv_flag ← ((VSR[VRB+32].byte[15].nibble[0] < 0xA) & (PS=1)) | (VSR[VRB+32].byte[15].nibble[1] > 0x9)\nMIN ← (PS=0) ? 0x30 : 0xF0\nMAX ← (PS=0) ? 0x39 : 0xF9\ndo i = 0 to 14\n    inv_flag ← inv_flag | (VSR[VRB+32].byte[i] < MIN) | (VSR[VRB+32].byte[i] > MAX)\nend\nif PS=0 then\n    src_sign ← VSR[VRB+32].nibble[30].bit[1]\nelse\n    src_sign ← (VSR[VRB+32].nibble[30] = 0b1011) | (VSR[VRB+32].nibble[30] = 0b1101)\neq_flag ← 1\ndo i = 0 to 14\n    result.nibble[i] ← 0x0\nend\ndo i = 0 to 15\n    result.nibble[i+15] ← VSR[VRB+32].byte[i].nibble[1]\n    eq_flag ← eq_flag & (VSR[VRB+32].byte[i].nibble[1]=0x0)\nend\nlt_flag ← (eq_flag=0) & (src_sign=1)\ngt_flag ← (eq_flag=0) & (src_sign=0)\nresult.nibble[31] ← (src_sign=0) ? 0xC : 0xD\nCR.bit[56] ← inv_flag ? 0b0 : lt_flag\nCR.bit[57] ← inv_flag ? 0b0 : gt_flag\nCR.bit[58] ← inv_flag ? 0b0 : eq_flag\nCR.bit[59] ← inv_flag\nVSR[VRT+32] ← inv_flag ? undefined : result", "special_registers": "CR6", "page_found": "Page 504 - 505", "programming_notes": "The bcdcfz. instruction is used to convert zoned decimal values to packed decimal format. Ensure that the source vector register (VRB) contains valid zoned decimal data, as invalid input can lead to undefined results and set the CR6 flags accordingly. This instruction operates at the user privilege level and requires the Vector Facility to be enabled; otherwise, a Vector_Unavailable exception is raised.", "example": "bcdcfz. vd, vb, 0"}
{"mnemonic": "bcdctz.", "architecture": "PowerISA", "full_name": "Decimal Convert to Zoned", "summary": "Converts Signed Packed BCD to Zoned format.", "syntax": "bcdctz. vD, vB, PS", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 1 | vB | 1217", "hex_opcode": "0x10040581", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "1", "clean": "1"}, {"raw": "vB", "clean": "vB"}, {"raw": "1217", "clean": "1217"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "PS", "desc": "Sign"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "Vector BCD", "description": "The contents of each nibble 0-30 must be a value in the range 0x0 to 0x9. Packed decimal values with sign codes of 0xA, 0xC, 0xE, or 0xF are interpreted as positive values. Packed decimal values with sign codes of 0xB or 0xD are interpreted as negative values.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ninv_flag ←(VSR[VRB+32].nibble[31] < 0xA)\ndo i = 0 to 30\n    inv_flag ←inv_flag | (VSR[VRB+32].nibble[i] > 0x9)\nox_flag ←0\ndo i = 0 to 15\n    ox_flag ←ox_flag | (VSR[VRB+32].nibble[i] != 0x0)\nsrc_sign ←(VSR[VRB+32].nibble[31] = 0xB) | (VSR[VRB+32].nibble[31] = 0xD)\neq_flag ←(VSR[VRB+32].nibble[0:30] = 0)\nlt_flag ←(eq_flag=0) & (src_sign=1)\ngt_flag ←(eq_flag=0) & (src_sign=0)\ndo i = 0 to 14\n    result.byte[i].nibble[0] ←(PS=0) ? 0x3 : 0xF\n    result.byte[i].nibble[1] ←VSR[VRB+32].nibble[i+15]\nend\nif src.sign=0 then\n    result.byte[15].nibble[0] ←(PS=0) ? 0x3 : 0xC\nelse\n    result.byte[15].nibble[0] ←(PS=0) ? 0x7 : 0xD\nend\nresult.byte[15].nibble[1] ←VSR[VRB+32].nibble[30]\nVSR[VRT+32] ←inv_flag ? undefined : result\nCR.bit[56] ←inv_flag ? 0b0 : lt_flag\nCR.bit[57] ←inv_flag ? 0b0 : gt_flag\nCR.bit[58] ←inv_flag ? 0b0 : eq_flag\nCR.bit[59] ←inv_flag | ox_flag", "special_registers": "CR6", "page_found": "Page 506 - 507", "programming_notes": "The bcdctz. instruction converts packed decimal values to zoned format, interpreting sign codes and handling invalid nibble values. Ensure that the input data is correctly formatted with valid nibbles (0x0-0x9) and appropriate sign codes. The instruction operates on vector registers and requires the Vector Facility to be enabled; otherwise, it raises a Vector Unavailable exception. Check the condition register bits for flags indicating invalid input, less than, greater than, or equal conditions.", "example": "bcdctz. vd, vb, 0"}
{"mnemonic": "bcdcfsq.", "architecture": "PowerISA", "full_name": "Decimal Convert from Signed Quadword", "summary": "Converts a signed quadword integer to packed decimal format and updates the condition register.", "syntax": "bcdcfsq. vD, vB, PS", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | 1 | vB | 193", "hex_opcode": "0x10020581", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "1", "clean": "1"}, {"raw": "vB", "clean": "vB"}, {"raw": "193", "clean": "193"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "PS", "desc": "Sign"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "Vector BCD", "description": "The bcdcfsq. instruction converts a signed quadword integer from VSR[VRB+32] to packed decimal format and stores it in VSR[VRT+32]. It also updates the condition register CR6 based on the conversion result.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\n\nox_flag ←(EXTS(VSR[VRB+32]) > 1031-1) |\n           (EXTS(VSR[VRB+32]) < -(1031-1))\nlt_flag ←(EXTS(VSR[VRB+32]) < 0)\ngt_flag ←(EXTS(VSR[VRB+32]) > 0)\neq_flag ←(EXTS(VSR[VRB+32]) = 0)\n\nif ox_flag=0 then\n   result ←bcd_CONVERT_FROM_SI128(EXTS(VSR[VRB+32]),PS)\nelse\n   result ←0xUUUU_UUUU_UUUU_UUUU_UUUU_UUUU_UUUU_UUUU\n\nVSR[VRT+32] ←ox_flag ? undefined : result\n\nCR.bit[56] ←lt_flag\nCR.bit[57] ←gt_flag\nCR.bit[58] ←eq_flag\nCR.bit[59] ←ox_flag", "special_registers": "CR0, CR1-CR7, XER, LR, CTR", "page_found": "Page 507 - 508", "programming_notes": "The bcdcfsq. instruction is used to convert a signed quadword integer to packed decimal format, storing the result in VSR[VRT+32]. It updates CR6 with flags indicating overflow (OX), less than (LT), greater than (GT), and equal (EQ) conditions. Ensure that the Vector Facility is enabled by checking MSR.VEC before using this instruction. Be cautious of overflow conditions, as they result in an undefined value being stored.", "example": "bcdcfsq. vd, vb, 0"}
{"mnemonic": "bcdctsq.", "architecture": "PowerISA", "full_name": "Binary Coded Decimal Compare and Test Sign Quadword", "summary": "Compares two binary coded decimal (BCD) numbers in a quadword format and tests the sign.", "syntax": "bcdctsq. vD, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | 0 | VRB | 1 | / | 385", "hex_opcode": "0x10000581", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "193", "clean": "193"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:29 | 30 | 31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "extension": "Vector BCD", "description": "The instruction converts the packed decimal value in VSR[VRB+32] to a signed integer and places it into VSR[VRT+32]. The sign code must be within the range 0xA to 0xF, with specific interpretations for positive and negative values. If the input is invalid, the result is undefined.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ninv_flag ←(VSR[VRB+32].nibble[31] < 0xA)\ndo i = 0 to 30\n    inv_flag ←inv_flag | (VSR[VRB+32].nibble[i] > 0x9)\nsrc_sign ←(VSR[VRB+32].nibble[31] = 0xB) | (VSR[VRB+32].nibble[31] = 0xD)\neq_flag ←(VSR[VRB+32].nibble[0:30] = 0)\nlt_flag ←(eq_flag=0) & (src_sign=1)\ngt_flag ←(eq_flag=0) & (src_sign=0)\nresult ←si128_CONVERT_FROM_BCD(VSR[VRB+32])\nVSR[VRT+32] ←inv_flag ? undefined : result\nCR.bit[56] ←inv_flag ? 0b0 : lt_flag\nCR.bit[57] ←inv_flag ? 0b0 : gt_flag\nCR.bit[58] ←inv_flag ? 0b0 : eq_flag\nCR.bit[59] ←inv_flag", "special_registers": "CR6", "page_found": "Page 508 - 509", "programming_notes": "The bcdctsq. instruction is used to convert a packed decimal value to a signed integer, storing the result in VSR[VRT+32]. Ensure the input sign code is within 0xA to 0xF; otherwise, the result is undefined. The instruction sets condition register bits CR6 based on comparison results, but these are only valid if the input is not invalid.", "example": "bcdctsq. vd, vb"}
{"mnemonic": "mulhd", "architecture": "PowerISA", "full_name": "Multiply High Doubleword", "summary": "Multiplies two 64-bit integers and returns the upper 64 bits of the 128-bit result (Signed).", "syntax": "mulhd RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 73 | Rc", "hex_opcode": "0x7C000092", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "73", "clean": "73"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Base", "description": "Multiplies two 64-bit signed integers (RA and RB) and stores the upper 64 bits of the 128-bit signed result in RT. The overflow flag (OE) is not typically set by this instruction as it returns the mathematically correct upper bits. If Rc=1, CR0 is updated based on the result.", "pseudocode": "prod ← (RA) *s (RB); RT ← prod[64:127]; if Rc then CR0 ← (RT < 0, RT > 0, RT = 0, SO)", "page_found": "Page 121", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "example": "mulhd r3, r4, r5"}
{"mnemonic": "mulhdu", "architecture": "PowerISA", "full_name": "Multiply High Doubleword Unsigned", "summary": "Multiplies two 64-bit integers and returns the upper 64 bits of the 128-bit result (Unsigned).", "syntax": "mulhdu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 9 | Rc", "hex_opcode": "0x7C000012", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "9", "clean": "9"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Base", "description": "Multiplies two 64-bit unsigned integers (RA and RB) and stores the upper 64 bits of the 128-bit unsigned result in RT. The overflow flag is not set as the full 128-bit product is well-defined for unsigned multiplication. If Rc=1, CR0 is updated based on the result.", "pseudocode": "prod ← (RA) *u (RB); RT ← prod[64:127]; if Rc then CR0 ← (RT < 0, RT > 0, RT = 0, SO)", "page_found": "Page 121", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "example": "mulhdu r3, r4, r5"}
{"mnemonic": "mulhw", "architecture": "PowerISA", "full_name": "Multiply High Word", "summary": "Multiplies two 32-bit integers and returns the upper 32 bits (Signed).", "syntax": "mulhw RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 75 | Rc", "hex_opcode": "0x7C000096", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "75", "clean": "75"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Base", "description": "Multiplies two 32-bit signed integers (RA[32:63] and RB[32:63]) and stores the upper 32 bits of the 64-bit signed result in RT[32:63], with RT[0:31] undefined. If Rc=1, CR0 is updated based on the result. No overflow is recorded.", "pseudocode": "prod ← (RA[32:63]) *s (RB[32:63]); RT[32:63] ← prod[32:63]; if Rc then CR0 ← (RT[32:63] < 0, RT[32:63] > 0, RT[32:63] = 0, SO)", "page_found": "Page 115", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "example": "mulhw r3, r4, r5"}
{"mnemonic": "mulhwu", "architecture": "PowerISA", "full_name": "Multiply High Word Unsigned", "summary": "Multiplies two 32-bit integers and returns the upper 32 bits (Unsigned).", "syntax": "mulhwu RT, RA, RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 11 | Rc", "hex_opcode": "0x7C000016", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "11", "clean": "11"}, {"raw": "Rc", "clean": "Rc"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Base", "description": "Multiplies two 32-bit unsigned integers (RA[32:63] and RB[32:63]) and stores the upper 32 bits of the 64-bit unsigned result in RT[32:63], with RT[0:31] undefined. If Rc=1, CR0 is updated based on the result.", "pseudocode": "prod ← (RA[32:63]) *u (RB[32:63]); RT[32:63] ← prod[32:63]; if Rc then CR0 ← (RT[32:63] < 0, RT[32:63] > 0, RT[32:63] = 0, SO)", "page_found": "Page 115", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "example": "mulhwu r3, r4, r5"}
{"mnemonic": "divsq", "architecture": "PowerISA", "full_name": "Divide Signed Quadword", "summary": "Divides a 128-bit signed integer by a 128-bit signed integer (using VSX pairs).", "syntax": "divsq vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 265", "hex_opcode": "0x10000109", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "265", "clean": "265"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Dividend"}, {"name": "vB", "desc": "Divisor"}], "extension": "Base", "description": "Divides a 128-bit signed integer dividend (vA) by a 128-bit signed integer divisor (vB) and stores the 128-bit signed quotient in vD. This instruction operates on VSX vector register pairs and is part of the Base category with extended integer support. Division by zero results in undefined behavior; no overflow exception is generated.", "pseudocode": "vD ← (vA) /s (vB)", "example": "divsq vd, va, vb"}
{"mnemonic": "divuq", "architecture": "PowerISA", "full_name": "Divide Unsigned Quadword", "summary": "Divides a 128-bit unsigned integer by a 128-bit unsigned integer.", "syntax": "divuq vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 9", "hex_opcode": "0x10000009", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "9", "clean": "9"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Dividend"}, {"name": "vB", "desc": "Divisor"}], "extension": "Base", "description": "Divides a 128-bit unsigned integer (vA) by a 128-bit unsigned integer (vB), storing the 128-bit unsigned quotient in vD. This is a VSX or MMA category instruction that performs quadword division. If division by zero is attempted, the result is undefined.", "pseudocode": "vD ← vA ÷ vB (128-bit unsigned integer division)", "example": "divuq vd, va, vb"}
{"mnemonic": "modsq", "architecture": "PowerISA", "full_name": "Modulo Signed Quadword", "summary": "Computes remainder of 128-bit signed division.", "syntax": "modsq vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 267", "hex_opcode": "0x1000070B", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "267", "clean": "267"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Dividend"}, {"name": "vB", "desc": "Divisor"}], "extension": "Base", "description": "Computes the remainder of a 128-bit signed integer division, storing the 128-bit signed remainder in vD. This is a VSX or MMA category instruction. The operation uses the dividend (vA) and divisor (vB) to compute the modulo result, with sign following the dividend.", "pseudocode": "vD ← vA mod vB (128-bit signed integer modulo)", "example": "modsq vd, va, vb"}
{"mnemonic": "moduq", "architecture": "PowerISA", "full_name": "Modulo Unsigned Quadword", "summary": "Computes remainder of 128-bit unsigned division.", "syntax": "moduq vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 11", "hex_opcode": "0x1000000B", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "11", "clean": "11"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31", "length": "32"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Dividend"}, {"name": "vB", "desc": "Divisor"}], "extension": "Base", "description": "Computes the remainder of a 128-bit unsigned integer division, storing the 128-bit unsigned remainder in vD. This is a VSX or MMA category instruction. The operation uses the dividend (vA) and divisor (vB) to compute the modulo result.", "pseudocode": "vD ← vA mod vB (128-bit unsigned integer modulo)", "example": "moduq vd, va, vb"}
{"mnemonic": "lhzci", "architecture": "PowerISA", "full_name": "Load Halfword and Zero Caching Inhibited", "summary": "Loads a halfword bypassing the cache.", "syntax": "lhzci RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 886 | /", "hex_opcode": "0x7C0006EA", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "886", "clean": "886"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Loads an unsigned halfword (16 bits) from memory at address (RA + RB) with caching inhibited, zero-extending the result to 64 bits in RT. This instruction bypasses the cache and is used for memory-mapped I/O. No condition registers are affected.", "pseudocode": "EA ← (RA) + (RB); RT ← 0x000000000000ZZZZ where ZZZZ = [EA]", "example": "lhzci r3, r4, r5"}
{"mnemonic": "lwzci", "architecture": "PowerISA", "full_name": "Load Word and Zero Caching Inhibited", "summary": "Loads a word bypassing the cache.", "syntax": "lwzci RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 855 | /", "hex_opcode": "0x7C0006AB", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "855", "clean": "855"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Loads an unsigned word (32 bits) from memory at address (RA + RB) with caching inhibited, zero-extending the result to 64 bits in RT. This instruction bypasses the cache and is commonly used for memory-mapped I/O device access. No condition registers are affected.", "pseudocode": "EA ← (RA) + (RB); RT ← 0x00000000ZZZZZZZZ where ZZZZZZZZ = [EA]", "example": "lwzci r3, r4, r5"}
{"mnemonic": "ldci", "architecture": "PowerISA", "full_name": "Load Doubleword Caching Inhibited", "summary": "Loads a doubleword bypassing the cache.", "syntax": "ldci RT, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | RA | RB | 887 | /", "hex_opcode": "0x7C0006EB", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "887", "clean": "887"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Loads a doubleword (64 bits) from memory at address (RA + RB) with caching inhibited, storing the result in RT. This instruction bypasses the cache hierarchy and is used for memory-mapped I/O operations in 64-bit mode. No condition registers are affected.", "pseudocode": "EA ← (RA) + (RB); RT ← [EA]", "example": "ldci r3, r4, r5"}
{"mnemonic": "stbci", "architecture": "PowerISA", "full_name": "Store Byte Caching Inhibited", "summary": "Stores a byte bypassing the cache.", "syntax": "stbci RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 982 | /", "hex_opcode": "0x7C0007AE", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "982", "clean": "982"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Stores the low-order byte from RS to memory at address (RA + RB) with caching inhibited. This instruction bypasses the cache hierarchy and is typically used for memory-mapped I/O operations. No condition registers are affected.", "pseudocode": "EA ← (RA) + (RB); [EA] ← (RS)[56:63]", "example": "stbci r3, r4, r5"}
{"mnemonic": "sthci", "architecture": "PowerISA", "full_name": "Store Halfword Caching Inhibited", "summary": "Stores a halfword bypassing the cache.", "syntax": "sthci RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 1014 | /", "hex_opcode": "0x7C0007EE", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "1014", "clean": "1014"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Store a halfword from register RS to memory at address (RA + RB), with cache inhibit semantics to bypass the L1 data cache. The halfword is written directly to L2 or memory depending on cache hierarchy. This instruction requires cache-inhibited access and is typically used for memory-mapped I/O or special memory regions.", "pseudocode": "addr ← (RA) + (RB)\n[(addr)] ← (RS)[48:63]\nMemory write with cache inhibit attribute", "example": "sthci r3, r4, r5"}
{"mnemonic": "stwci", "architecture": "PowerISA", "full_name": "Store Word Caching Inhibited", "summary": "Stores a word bypassing the cache.", "syntax": "stwci RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 983 | /", "hex_opcode": "0x7C0007AF", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "983", "clean": "983"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Store a word from register RS to memory at address (RA + RB), with cache inhibit semantics to bypass the L1 data cache. The word is written directly to L2 or memory. This instruction is used for memory-mapped I/O or device registers where cache bypass is required.", "pseudocode": "addr ← (RA) + (RB)\n[(addr)] ← (RS)[32:63]\nMemory write with cache inhibit attribute", "example": "stwci r3, r4, r5"}
{"mnemonic": "stdci", "architecture": "PowerISA", "full_name": "Store Doubleword Caching Inhibited", "summary": "Stores a doubleword bypassing the cache.", "syntax": "stdci RS, RA, RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 1015 | /", "hex_opcode": "0x7C0007EF", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "1015", "clean": "1015"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RS", "desc": "Source"}, {"name": "RA", "desc": "Base"}, {"name": "RB", "desc": "Index"}], "extension": "Base", "description": "Store a doubleword from register RS to memory at address (RA + RB), with cache inhibit semantics to bypass the L1 data cache. The doubleword is written directly to L2 or memory. This instruction is used for memory-mapped I/O operations requiring full 64-bit cache-bypassed writes.", "pseudocode": "addr ← (RA) + (RB)\n[(addr)] ← (RS)[0:63]\nMemory write with cache inhibit attribute", "example": "stdci r3, r4, r5"}
{"mnemonic": "cp_abort", "architecture": "PowerISA", "full_name": "Copy-Paste Abort", "summary": "Aborts a hardware accelerator copy-paste sequence.", "syntax": "cp_abort", "encoding": {"format": "X-form", "binary_pattern": "31 | 0 | 0 | 0 | 450 | /", "hex_opcode": "0x7C000382", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "450", "clean": "450"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Privileged", "description": "Abort an ongoing copy-paste sequence initiated by a prior COPY instruction. This privileged instruction clears the copy-paste state, terminating any in-flight hardware accelerator operation. It is typically used in exception handlers or during context switches to ensure no stale copy-paste state persists.", "pseudocode": "Copy-paste buffer state ← cleared\nAny pending copy-paste operation ← aborted", "example": "cp_abort"}
{"mnemonic": "mcrxrx", "architecture": "PowerISA", "full_name": "Move to Condition Register from XER Extended", "summary": "Copies the contents of the XER register fields OV, OV32, CA, and CA32 to the specified condition register field.", "syntax": "mcrxrx BF", "encoding": {"format": "X-form", "binary_pattern": "0 | BF | // | RS | FXM | //", "hex_opcode": "0x7C000480", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "BF", "clean": "BF"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "512", "clean": "512"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "Target CR Field"}, {"name": "RS", "desc": "Source General Purpose Register"}], "extension": "Base", "description": "The contents of the OV, OV32, CA, and CA32 are copied to Condition Register field BF. The contents of bits 32:63 of register RS are placed into the Condition Register under control of the field mask specified by FXM.", "pseudocode": "mask ←4(FXM0) || 4(FXM1) || ... 4(FXM7)\nCR ←((RS)32:63 & mask) | (CR & ¬mask)", "special_registers": "CR, XER", "page_found": "Page 164 - 166", "programming_notes": "The mcrxrx instruction is used to transfer specific bits from the XER register into the Condition Register. Ensure that the FXM field correctly specifies which bits of RS should be moved to CR, as incorrect masking can lead to unexpected results. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "mcrxrx cr0"}
{"mnemonic": "scv", "architecture": "PowerISA", "full_name": "System Call Vectored", "summary": "Performs a system call to a fixed vector address (Faster than 'sc').", "syntax": "scv LEV", "encoding": {"format": "SC-form", "binary_pattern": "0 | 6 | 11 | 16 | 20 | 27 | 30 | 31", "hex_opcode": "0x44000001", "visual_parts": [{"raw": "17", "clean": "17"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "LEV", "clean": "LEV"}, {"raw": "/", "clean": "/"}, {"raw": "1", "clean": "1"}], "length": "32", "bit_positions": "0 | 6 | 11 | 16 | 20 | 27 | 30 | 31"}, "operands": [{"name": "LEV", "desc": "Level"}], "extension": "Base", "description": "Perform a system call with a vectored trap to a fixed address determined by the LEV (level) field, providing faster dispatch than the traditional sc instruction. The instruction saves SRR0 and SRR1, sets MSR[PR]=0 to enter privileged mode, and jumps to the system call vector. LEV is a 7-bit field (bits 20-26) that selects among up to 128 vector addresses.", "pseudocode": "SRR0 ← CIA + 4\nSRR1 ← MSR\nMSR[PR] ← 0\nMSR[EE] ← 0\nMSR[IR] ← 0\nMSR[DR] ← 0\nPC ← Interrupt Vector Base + (LEV << 7) + System Call Vectored Offset", "special_registers": "LR, CTR, MSR", "programming_notes": "If this instruction sets MSRPR to 1, it also sets MSREE, MSRIR, and MSRDR to 1. If this instruction results in MSRS HV PR being equal to 0b110, it also sets MSRIR and MSRDR to 0.\n\nThis instruction does not alter MSRHV, MSRS, or MSRME.", "page_found": "Page 1120 - 1121", "example": "scv 0"}
{"mnemonic": "rfscv", "architecture": "PowerISA", "full_name": "Return from System Call Vectored", "summary": "Returns from a vectored system call.", "syntax": "rfscv", "encoding": {"format": "XL-form", "binary_pattern": "19 | / | / | / | 82 | /", "hex_opcode": "0x4C0000A4", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "82", "clean": "82"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [], "extension": "Privileged", "description": "Return from a vectored system call by restoring the processor state from SRR0 and SRR1. This privileged instruction restores PC from SRR0 and MSR from SRR1, typically returning to user mode if MSR[PR] was set in the saved state. It is the inverse of scv.", "pseudocode": "PC ← SRR0\nMSR ← SRR1", "page_found": "Page 1121", "special_registers": "SRR0, SRR1, MSR", "programming_notes": "The rfscv instruction is used to return from a system call vectored, restoring the program's execution context by setting the CIA to the value in SRR0 and the MSR from SRR1. Ensure that this instruction is executed at the appropriate privilege level and be aware of any potential exceptions or performance implications related to restoring the machine state.", "example": "rfscv"}
{"mnemonic": "stop", "architecture": "PowerISA", "full_name": "Stop", "summary": "Stops instruction execution and enters a power-saving state (replaces nap/doze on P9+).", "syntax": "stop", "encoding": {"format": "X-form", "binary_pattern": "19 | / | / | / | 722 | /", "hex_opcode": "0x4C0002E4", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "722", "clean": "722"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [], "extension": "Privileged", "description": "The thread is placed into power-saving mode and execution is stopped. The power-saving level that is entered is determined by the contents of the PSSCR. The thread remains in power-saving mode until either a System Reset exception or certain other events occur.", "programming_notes": "This instruction should not be executed in ultravisor state because that scenario may not be thoroughly verified. This instruction is privileged and context synchronizing.", "page_found": "Page 1124 - 1125", "pseudocode": "PSSCR ← (PSSCR & ~0x3F) | power-saving-level\nstop", "special_registers": "PSSCR", "example": "stop"}
{"mnemonic": "urfid", "architecture": "PowerISA", "full_name": "Ultravisor Return from Interrupt Doubleword", "summary": "Returns from an ultravisor interrupt.", "syntax": "urfid", "encoding": {"format": "XL-form", "binary_pattern": "19 | / | / | / | 274 | /", "hex_opcode": "0x4C000264", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "274", "clean": "274"}, {"raw": "/", "clean": "/"}], "length": "64", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31:63"}, "operands": [], "extension": "Privileged", "description": "The 'urfid' instruction is used to return from an interrupt in the ultravisor context. It updates the Machine State Register (MSR) and sets the next instruction address based on the values in USRR0 and USRR1.", "pseudocode": "MSR48 ← USRR148 | USRR149\nMSR58 ← (USRR158 | USRR149) & ¬(USRR141 & USRR13 & (¬USRR149))\nMSR59 ← (USRR159 | USRR149) & ¬(USRR141 & USRR13 & (¬USRR149))\nMSR0:32 37:41 49:57 60:63 ← USRR10:32 37:41 49:57 60:63\nNIA ← iea USRR00:61 || 0b00", "special_registers": "MSR, SRR0, SRR1", "programming_notes": "If this instruction sets MSRPR to 1, it also sets MSREE, MSRIR, and MSRDR to 1. If this instruction sets MSRS HV PR to 0b110, it also sets MSRIR and MSRDR to 0.", "page_found": "Page 1122 - 1123", "example": "urfid"}
{"mnemonic": "setbc", "architecture": "PowerISA", "full_name": "Set Boolean Condition", "summary": "Sets RT to 1 if CR bit is set, else 0. (Branchless logic).", "syntax": "setbc RT, BI", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | BI | / | 384 | /", "hex_opcode": "0x7C000300", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "BI", "clean": "BI"}, {"raw": "/", "clean": "/"}, {"raw": "384", "clean": "384"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "BI", "desc": "CR Bit"}], "extension": "Base", "description": "Set register RT to 1 if the condition register bit identified by BI is set, else set RT to 0. This instruction provides a branchless way to materialize a boolean value from a condition register bit, useful for conditional assignment without branching.", "pseudocode": "if CR[BI] = 1 then\n  RT ← 1\nelse\n  RT ← 0", "page_found": "Page 167", "special_registers": "CR", "programming_notes": "The setbc instruction is useful for conditionally setting a register based on the state of a specific bit in the Condition Register. Ensure that the correct bit index BI is specified to avoid unintended behavior. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "setbc r3, 0"}
{"mnemonic": "setbcr", "architecture": "PowerISA", "full_name": "Set Boolean Condition Reverse", "summary": "Sets RT to 1 if CR bit is clear, else 0.", "syntax": "setbcr RT, BI", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | BI | / | 416 | /", "hex_opcode": "0x7C000340", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "BI", "clean": "BI"}, {"raw": "/", "clean": "/"}, {"raw": "416", "clean": "416"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "BI", "desc": "CR Bit"}], "extension": "Base", "description": "Set register RT to 1 if the condition register bit identified by BI is clear (0), else set RT to 0. This is the logical inverse of setbc, allowing branchless negation of a condition register bit test.", "pseudocode": "if CR[BI] = 0 then\n  RT ← 1\nelse\n  RT ← 0", "page_found": "Page 167", "special_registers": "CR", "programming_notes": "The setbcr instruction is useful for setting a register based on the state of a specific bit in the Condition Register. Ensure that the correct bit index BI is specified to avoid unintended behavior. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "setbcr r3, 0"}
{"mnemonic": "setnbc", "architecture": "PowerISA", "full_name": "Set Negative Boolean Condition", "summary": "Sets RT to -1 if CR bit is set, else 0.", "syntax": "setnbc RT, BI", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | BI | / | 448 | /", "hex_opcode": "0x7C000380", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "BI", "clean": "BI"}, {"raw": "/", "clean": "/"}, {"raw": "448", "clean": "448"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "BI", "desc": "CR Bit"}], "extension": "Base", "description": "Sets the target GPR to -1 (all bits set) if the specified condition register bit is set, otherwise sets it to 0. This instruction operates entirely on the CR and target register, with no side effects on other status fields.", "pseudocode": "if CR[BI] = 1 then RT ← -1 else RT ← 0", "page_found": "Page 167", "special_registers": "CR", "programming_notes": "Use setnbc to conditionally set a register based on a specific bit in the Condition Register. Ensure CRBI is within valid range; otherwise, results are undefined. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "setnbc r3, 0"}
{"mnemonic": "setnbcr", "architecture": "PowerISA", "full_name": "Set Negative Boolean Condition Reverse", "summary": "Sets RT to -1 if CR bit is clear, else 0.", "syntax": "setnbcr RT, BI", "encoding": {"format": "X-form", "binary_pattern": "31 | RT | BI | / | 480 | /", "hex_opcode": "0x7C0003C0", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "BI", "clean": "BI"}, {"raw": "/", "clean": "/"}, {"raw": "480", "clean": "480"}, {"raw": "/", "clean": "/"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "BI", "desc": "CR Bit"}], "extension": "Base", "description": "Sets the target GPR to -1 (all bits set) if the specified condition register bit is clear, otherwise sets it to 0. This is the logical inverse of setnbc, with no side effects on other status fields.", "pseudocode": "if CR[BI] = 0 then RT ← -1 else RT ← 0", "page_found": "Page 167", "special_registers": "CR", "programming_notes": "Use setnbcr when you need to invert a condition bit in the Condition Register into a boolean value. Ensure that the target register RT is properly aligned and accessible. This instruction operates at user privilege level, so no special permissions are required. Be cautious of potential performance impacts if used in tight loops.", "example": "setnbcr r3, 0"}
{"mnemonic": "xscmpexpdp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Exponents Double-Precision", "summary": "Compares the exponents of two double-precision floating-point values in VSX registers and updates the condition register.", "syntax": "xscmpexpdp BF, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | BF | / | XA | XB | 59", "hex_opcode": "0xF00001D8", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "59", "clean": "59"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "The exponent of src1 is compared with the exponent of src2. The result of the compare is placed into FPCC and CR field BF.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nsrc1 ←VSR[32×AX+A].dword[0]\nsrc2 ←VSR[32×BX+B].dword[0]\nsrc1.exponent ←EXTZ(src1.bit[1:11])\nsrc1.fraction ←EXTZ(src1.bit[12:63])\nsrc2.exponent ←EXTZ(src2.bit[1:11])\nsrc2.fraction ←EXTZ(src2.bit[12:63])\nsrc1.class.NaN ←(src1.exponent = 2047) & (src1.fraction != 0)\nsrc2.class.NaN ←(src2.exponent = 2047) & (src2.fraction != 0)\nlt_flag ←(src1.exponent < src2.exponent)\ngt_flag ←(src1.exponent > src2.exponent)\neq_flag ←(src1.exponent = src2.exponent)\nuo_flag ←src1.class.NaN | src2.class.NaN\nCR.bit[4×BF+32] ←FPSCR.FL ←!uo_flag & lt_flag\nCR.bit[4×BF+33] ←FPSCR.FG ←!uo_flag & gt_flag\nCR.bit[4×BF+34] ←FPSCR.FE ←!uo_flag & eq_flag\nCR.bit[4×BF+35] ←FPSCR.FU ←uo_flag", "special_registers": "CR, FPSCR", "programming_notes": "This instruction can be used to operate on single-precision source operands.", "page_found": "Page 897 - 898", "example": "xscmpexpdp cr0, vs2, vs3"}
{"mnemonic": "xsiexpdp", "architecture": "PowerISA", "full_name": "VSX Scalar Insert Exponent Double-Precision", "summary": "Inserts exponent from one double into another.", "syntax": "xsiexpdp XT, XA, XB", "encoding": {"format": "XX3-form", "binary_pattern": "60 | XT | XA | XB | 219", "hex_opcode": "0xF000072C", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "219", "clean": "219"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Significand"}, {"name": "XB", "desc": "Exponent"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "extension": "VSX", "description": "Inserts the exponent bits from XB (bits 0-10) into the exponent field of the significand in XA, placing the result in XT. This operation constructs a double-precision floating-point value by combining a significand with a new exponent. Requires VSX support.", "pseudocode": "XT ← (XA[0:51] || XB[0:10])", "special_registers": "VSR[XT]", "programming_notes": "This instruction can be used to produce a single-precision result. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 899 - 900", "example": "xsiexpdp vs1, vs2, vs3"}
{"mnemonic": "xsxexpdp", "architecture": "PowerISA", "full_name": "VSX Scalar Extract Exponent Double-Precision", "summary": "Extracts the exponent from a double-precision floating-point value in VSR and places it into GPR.", "syntax": "xsxexpdp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 27", "hex_opcode": "0xF000056C", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "27", "clean": "27"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}, {"name": "RT", "desc": "Target General Purpose Register"}], "extension": "VSX", "description": "The instruction extracts the exponent field of a double-precision floating-point value located in the specified VSX register and stores it in a general-purpose register.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nsrc ←VSR[32×BX+B].dword[0]\nGPR[RT] ←EXTZ64(src.bit[1:11])", "programming_notes": "This instruction can be used to operate on a single-precision source operand.", "page_found": "Page 904 - 905", "special_registers": "MSR", "example": "xsxexpdp vs1, vs3"}
{"mnemonic": "xsxsigdp", "architecture": "PowerISA", "full_name": "VSX Scalar Extract Significand Double-Precision", "summary": "Extracts the significand of a double-precision floating-point value from a VSX register and places it into a general-purpose register.", "syntax": "xsxsigdp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | / | XB | 347 | BX | TX", "hex_opcode": "0xF001056C", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "11", "clean": "11"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "VS32", "desc": "Target Vector Register"}, {"name": "VS31", "desc": "Source Vector Register"}], "extension": "VSX", "description": "Extracts the significand (mantissa) from a double-precision floating-point value in XB and places it as a 52-bit value into the lower half of XT, sign-extended. This instruction isolates the fractional part of the floating-point representation. Requires VSX support.", "pseudocode": "XT ← (0x0000000000000000 || significand(XB[32:63]))", "programming_notes": "This instruction can be used to operate on a single-precision source operand.", "page_found": "Page 905 - 906", "special_registers": "MSR", "example": "xsxsigdp vs1, vs3"}
{"mnemonic": "xststdcdp", "architecture": "PowerISA", "full_name": "VSX Scalar Test Data Class Double-Precision", "summary": "Tests the data class of a double-precision floating-point value in VSR[XB] and sets bits in CR field BF and FPCC accordingly.", "syntax": "xststdcdp BF, XB, DCM", "encoding": {"format": "XX2-form", "binary_pattern": "60 | BF | / | DCM | XB | 362", "hex_opcode": "0xF00005A8", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "BF", "clean": "BF"}, {"raw": "/", "clean": "/"}, {"raw": "DCM", "clean": "DCM"}, {"raw": "XB", "clean": "XB"}, {"raw": "362", "clean": "362"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "BF", "desc": "CR Field"}, {"name": "XB", "desc": "Source"}, {"name": "DCM", "desc": "Data Class Mask"}, {"name": "DCMX", "desc": "Data Class Mask"}], "extension": "VSX", "description": "The instruction tests the data class of the double-precision floating-point value in VSR[XB].dword[0] and sets bits in CR field BF and FPCC based on the result.", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\nsrc ← VSR[32×BX+B].dword[0]\nexponent ← src.bit[1:11]\nfraction ← src.bit[12:63]\nclass.NaN ← (exponent = 0x7FF) & (fraction != 0)\nclass.Infinity ← (exponent = 0x7FF) & (fraction = 0)\nclass.Zero ← (exponent = 0x000) & (fraction = 0)\nclass.Denormal ← (exponent = 0x000) & (fraction != 0)\nmatch ←\n    (DCMX.bit[0] & class.NaN) |\n    (DCMX.bit[2] & class.Infinity & sign) |\n    (DCMX.bit[3] & class.Zero & !sign) |\n    (DCMX.bit[4] & class.Zero & sign) |\n    (DCMX.bit[5] & class.Denormal & !sign) |\n    (DCMX.bit[6] & class.Denormal & sign)\nCR.bit[4×BF+32] ← FPSCR.FL ← src.sign\nCR.bit[4×BF+33] ← FPSCR.FG ← 0b0\nCR.bit[4×BF+34] ← FPSCR.FE ← match\nCR.bit[4×BF+35] ← FPSCR.FU ← 0b0", "special_registers": "CR, FPSCR", "page_found": "Page 901 - 902", "programming_notes": "This instruction is used to test the data class of a double-precision floating-point value. Ensure that VSX (Vector Scalar Extensions) is enabled in the MSR register, otherwise, an exception will be raised. The result updates both the CR and FPSCR registers, so check these for further processing. Be cautious with alignment; the source vector register must be properly aligned to avoid undefined behavior.", "example": "xststdcdp cr0, vs3, 0"}
{"mnemonic": "lxvp", "architecture": "PowerISA", "full_name": "Load VSX Vector Pair", "summary": "Loads a double quadword from memory into two VSX registers.", "syntax": "lxvp XT, DQ(RA)", "encoding": {"format": "DQ-form", "binary_pattern": "6 | Tp | TX | RA | DQ | 0", "hex_opcode": "0x18000000", "visual_parts": [{"raw": "61", "clean": "61"}, {"raw": "XT", "clean": "XT"}, {"raw": "RA", "clean": "RA"}, {"raw": "DQ", "clean": "DQ"}, {"raw": "0", "clean": "0"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target Even VSR"}, {"name": "DQ", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "XTp", "desc": "Target Vector-Specific Register"}, {"name": "disp", "desc": "Displacement field"}, {"name": "VRT", "desc": "Target Vector-Specific Register"}, {"name": "EA", "desc": "Effective Address"}], "extension": "VSX", "description": "Loads a 256-bit (32-byte) aligned vector pair from memory at the effective address (RA + DQ), storing the first 128 bits into XT and the second 128 bits into XT+1. DQ is a 4-bit field that specifies the offset in units of 16 bytes, requiring 16-byte alignment. Requires VSX support.", "pseudocode": "EA ← (RA) + (DQ << 4); XT ← [EA]; (XT+1) ← [EA+16]", "programming_notes": "For best performance, EA should be word-aligned.", "page_found": "Page 638 - 639", "special_registers": "MSR", "example": "lxvp vs1, 0(r4)"}
{"mnemonic": "stxvp", "architecture": "PowerISA", "full_name": "Store VSX Vector Pair", "summary": "Stores a pair of VSX vector registers to memory.", "syntax": "stxvp XS, DQ(RA)", "encoding": {"format": "DQ-form", "binary_pattern": "61 | XS | RA | DQ | 4", "hex_opcode": "0x18000001", "visual_parts": [{"raw": "61", "clean": "61"}, {"raw": "XS", "clean": "XS"}, {"raw": "RA", "clean": "RA"}, {"raw": "DQ", "clean": "DQ"}, {"raw": "4", "clean": "4"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:27 | 28:31"}, "operands": [{"name": "XS", "desc": "Source Even VSR"}, {"name": "DQ", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "XSp", "desc": "VSX Vector Register Pair"}, {"name": "disp", "desc": "Displacement Value"}], "extension": "VSX", "description": "For stxvp, the effective address (EA) is the sum of the integer value in GPR[RA] or 0 if RA=0 and the value DQ||0b0000, sign-extended to 64 bits. The contents of VSR[XSp] concatenated with VSR[XSp+1] are stored into memory at address EA.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nEAbase ←(RA=0) ? 0 : GPR[RA]\nEAdisp ←EXTS64(DQ || 0b0000)\nEA ←EAbase + EAdisp\nstore_data.bit[128:255] ←VSR[32×SX+2×Sp+1]\nMEM(EA,32) ←store_data", "programming_notes": "For best performance, EA should be word-aligned.", "page_found": "Page 640 - 641", "special_registers": "MSR", "example": "stxvp vs1, 0(r4)"}
{"mnemonic": "plxvp", "architecture": "PowerISA", "full_name": "Prefixed Load VSX Vector Pair", "summary": "Loads a 256-bit vector pair with 34-bit offset.", "syntax": "plxvp XT, D(RA), R", "encoding": {"format": "8LS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 58 | XT | RA | D1", "hex_opcode": "0x04000000E8000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "0", "clean": "0"}, {"raw": "...", "clean": "..."}, {"raw": "58", "clean": "58"}, {"raw": "XT", "clean": "XT"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "D", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "R", "desc": "PC-Rel"}], "extension": "Prefixed", "description": "Loads a 256-bit (32-byte) vector pair from memory using a 34-bit signed offset encoded as a 8-byte prefix + suffix. When R=0, the offset is relative to RA; when R=1, the offset is relative to the current instruction address. Requires VSX and Prefixed instruction support.", "pseudocode": "D ← EXTS(D0 || D1); EA ← (R=0 ? (RA) : NIA) + D; XT ← [EA]; (XT+1) ← [EA+16]", "page_found": "Page 639", "special_registers": "MSR", "programming_notes": "The plxvp instruction is used to load a pair of VSX vectors from memory into the VSRs. Ensure that the number of bytes specified in GPR[RB] does not exceed 16, as it will be clamped if it does. This instruction requires the VSX or Vector facility to be enabled in the MSR register, depending on the SX bit setting.", "example": "plxvp vs1, 0(r4), 0"}
{"mnemonic": "pstxvp", "architecture": "PowerISA", "full_name": "Prefixed Store VSX Vector Pair", "summary": "Stores a 256-bit vector pair with 34-bit offset.", "syntax": "pstxvp XS, D(RA), R", "encoding": {"format": "8LS:D-form", "binary_pattern": "1 | 2 | R | 0 | D0 | 62 | XS | RA | D1", "hex_opcode": "0x04000000F8000000", "visual_parts": [{"raw": "000001", "clean": "000001"}, {"raw": "10", "clean": "10"}, {"raw": "0", "clean": "0"}, {"raw": "...", "clean": "..."}, {"raw": "62", "clean": "62"}, {"raw": "XS", "clean": "XS"}, {"raw": "...", "clean": "..."}], "length": "64", "bit_positions": "0:5 | 6:7 | 8 | 9:13 | 14:31 | 32:37 | 38:42 | 43:47 | 48:63"}, "operands": [{"name": "XS", "desc": "Source"}, {"name": "D", "desc": "Offset"}, {"name": "RA", "desc": "Base"}, {"name": "R", "desc": "PC-Rel"}], "extension": "Prefixed", "description": "Stores a 256-bit (32-byte) vector pair from XS and XS+1 to memory using a 34-bit signed offset encoded as a 8-byte prefix + suffix. When R=0, the offset is relative to RA; when R=1, the offset is relative to the current instruction address. Requires VSX and Prefixed instruction support.", "pseudocode": "D ← EXTS(D0 || D1); EA ← (R=0 ? (RA) : NIA) + D; [EA] ← XS; [EA+16] ← (XS+1)", "page_found": "Page 641", "special_registers": "PC", "programming_notes": "The pstxvp instruction is used to store a VSX vector pair from the VSR registers to memory. It supports both prefixed and non-prefixed addressing modes. Ensure that the destination address is properly aligned for optimal performance. This instruction operates at privilege level 0.", "example": "pstxvp vs1, 0(r4), 0"}
{"mnemonic": "xscvhpdp", "architecture": "PowerISA", "full_name": "VSX Scalar Convert Half-Precision to Double-Precision format XX2-form", "summary": "Converts a half-precision floating-point value to a double-precision floating-point value.", "syntax": "xscvhpdp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "T | 16 | B | 347 | BX TX", "hex_opcode": "0xF010056C", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "344", "clean": "344"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "The instruction converts the half-precision floating-point value in the rightmost halfword of doubleword element 0 of VSR[XB] to a double-precision floating-point value and places it into doubleword element 0 of VSR[XT]. Doubleword element 1 of VSR[XT] is set to 0.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_flags()\nsrc ←bfp_CONVERT_FROM_BFP16(VSR[BX×32+B].hword[3])\nif src.class.SNaN=1 then\n    result ←bfp64_CONVERT_FROM_BFP(bfp_QUIET(src))\nelse\n    result ←bfp64_CONVERT_FROM_BFP(src)\nvxsnan_flag ←src.class.SNaN\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nvex_flag ←FPSCR.VE & vxsnan_flag\nif vex_flag=0 then do\n    VSR[TX×32+T].dword[0] ←result\n    VSR[TX×32+T].dword[1] ←0x0000_0000_0000_0000\n    FPSCR.FPRF ←fprf_CLASS_BFP64(result)\nend\nFPSCR.FR ←0\nFPSCR.FI ←0", "special_registers": "FPSCR, FPRF, FX, VXSNAN", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 831 - 832", "example": "xscvhpdp vs1, vs3"}
{"mnemonic": "xscvdphp", "architecture": "PowerISA", "full_name": "VSX Scalar Convert Double to Half-Precision", "summary": "Converts a double-precision floating-point value to a half-precision floating-point value with rounding.", "syntax": "xscvdphp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | T | 17 | B | 347 | BX TX", "hex_opcode": "0xF011056C", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "376", "clean": "376"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "Converts the double-precision floating-point value in XB to a half-precision floating-point value, placing the result in the lower half of XT. The conversion applies rounding according to the current floating-point rounding mode in FPSCR. Requires VSX support.", "pseudocode": "XT ← convert_to_half_precision(XB, round_mode=FPSCR[RN])", "special_registers": "FPSCR, VSR[TX×32+T].hword[3]", "programming_notes": "This instruction can be used to operate on a single-precision source operand. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "page_found": "Page 823 - 824", "example": "xscvdphp vs1, vs3"}
{"mnemonic": "xvcvhpsp", "architecture": "PowerISA", "full_name": "VSX Vector Convert Half-Precision to Single", "summary": "Converts half-precision floating-point values in a vector register to single-precision floating-point values.", "syntax": "xvcvhpsp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "60 | XT | 0 | XB | 409", "hex_opcode": "0xF018076C", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "409", "clean": "409"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "For xvcvhpsp, each half-precision floating-point value in the rightmost halfword of word element i of VSR[XB] is converted to a single-precision floating-point value and placed into word element i of VSR[XT].", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_flags()\nex_flag ← 0\nfor i from 0 to 3 do\n    src ← bfp_CONVERT_FROM_BFP16(VSR[BX×32+B].word[i].hword[1])\n    if src.class.SNaN = 1 then\n        vresult.word[i] ← bfp32_CONVERT_FROM_BFP(bfp_QUIET(src))\n        vxsnan_flag ← src.class.SNaN\n        if vxsnan_flag = 1 then SetFX(FPSCR.VXSNAN)\n        ex_flag ← ex_flag | (FPSCR.VE & vxsnan_flag)\n    else\n        vresult.word[i] ← bfp32_CONVERT_FROM_BFP(src)\n    end\nend\nif ex_flag = 0 then VSR[32×TX+T] ← vresult", "special_registers": "FPSCR (FX, VXSNAN)", "page_found": "Page 834 - 835", "programming_notes": "This instruction is used to convert half-precision floating-point values to single-precision. Ensure that the VSX feature is enabled in the MSR register. Handle exceptions by checking the FPSCR for VXSNAN and VE flags. The conversion respects NaN handling, converting signaling NaNs to quiet NaNs.", "example": "xvcvhpsp vs1, vs3"}
{"mnemonic": "xvcvsphp", "architecture": "PowerISA", "full_name": "Vector Convert Single-Precision to Half-Precision format XX2-form", "summary": "Converts each single-precision floating-point value in a vector register to half-precision and stores the result in another vector register.", "syntax": "xvcvsphp XT, XB", "encoding": {"format": "XX2-form", "binary_pattern": "T | 25 | B | 475 | BX | TX", "hex_opcode": "0xF019076C", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "0", "clean": "0"}, {"raw": "XB", "clean": "XB"}, {"raw": "441", "clean": "441"}], "length": "32", "bit_positions": "0 | 6 | 11 | 16 | 21 | 30 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XB", "desc": "Source"}], "extension": "VSX", "description": "For xvcvsphp, each integer value i from 0 to 3, do the following. Let src be the single-precision floating-point value in word element i of VSR[XB]. If src is an SNaN, the result is the half-precision representation of that SNaN converted to a QNaN. Otherwise, if src is a QNaN, the result is the half-precision representation of that QNaN. Otherwise, if src is an Infinity, the result is the half-precision representation of Infinity with the same sign as src. Otherwise, if src is a Zero, the result is the half-precision representation of Zero with the same sign as src. Otherwise, the result is the half-precision representation of src rounded to half-precision using the rounding mode specified by RN. The result is zero-extended and placed into word element i of VSR[XT]. If a trap-enabled exception occurs, VSR[XT] is not modified.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_flags()\ndo i = 0 to 3\n    src ←bfp_CONVERT_FROM_BFP32(VSR[BX×32+B].word[i])\n    rnd ←bfp_ROUND_TO_BFP16(FPSCR.RN,src)\n    vresult.word[i].hword[0] ←0x0000\n    vresult.word[i].hword[1] ← bfp16_CONVERT_FROM_BFP(rnd)\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if ox_flag=1 then SetFX(FPSCR.OX)\n    if ux_flag=1 then SetFX(FPSCR.UX)\n    if xx_flag=1 then SetFX(FPSCR.XX)\nex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.OE & ox_flag) | (FPSCR.UE & ux_flag) | (FPSCR.XE & xx_flag)\nend\nLet XT be the value 32×TX + T.\nLet XB be the value 32×BX + B.", "special_registers": "FPSCR", "page_found": "Page 829 - 830", "programming_notes": "This instruction converts single-precision floating-point values to half-precision format, handling special cases like NaNs and infinities. Ensure VSX is enabled; otherwise, a VSX_Unavailable exception occurs. The result is zero-extended into the destination vector register. Be cautious of rounding modes specified by FPSCR.RN and exceptions that may set flags in FPSCR.", "example": "xvcvsphp vs1, vs3"}
{"mnemonic": "sync", "architecture": "PowerISA", "full_name": "Synchronize", "summary": "Ensures that all instructions preceding the sync instruction have completed before the sync instruction completes, and no subsequent instructions are initiated until after the sync instruction completes.", "syntax": "sync L,SC", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | L | 598 | /", "hex_opcode": "0x7C0004AC", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "L", "clean": "L"}, {"raw": "598", "clean": "598"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "L", "desc": "Level (0=Heavy, 1=Light)"}, {"name": "SC", "desc": "Store Caching Inhibited Sync Control"}], "pseudocode": "Synchronize memory operations as specified by L and SC fields; ensure prior instructions complete before this instruction completes; ensure subsequent instructions do not begin until this instruction completes.", "example": "sync 0", "example_note": "Full hardware fence.", "extension": "Base", "description": "Synchronizes memory operations by ensuring all instructions preceding the sync complete before the sync completes, and no subsequent instructions are initiated until after sync completes. The L field specifies the synchronization scope: L=0 (hwsync) enforces a heavy-weight synchronization across all storage types, while L=1 (lwsync) provides a lighter-weight barrier suitable for most memory ordering. The SC field (bits 9-10) controls store-caching-inhibited synchronization for specific storage classes. No condition or status registers are affected.", "programming_notes": "sync serves as both a basic and an extended mnemonic. The Assembler will recognize a sync mnemonic with two operands as the basic form, and a sync mnemonic with one operand or with no operand as an extended form.", "page_found": "Page 1060 - 1061", "extended_mnemonics": [{"mnemonic": "hwsync", "equivalent": "sync L=0,SC=0"}, {"mnemonic": "lwsync", "equivalent": "sync L=1,SC=0"}, {"mnemonic": "ptesync", "equivalent": "sync L=2,SC=0"}, {"mnemonic": "phwsync", "equivalent": "sync L=4,SC=0"}, {"mnemonic": "plwsync", "equivalent": "sync L=5,SC=0"}, {"mnemonic": "stncisync", "equivalent": "sync SC=1"}, {"mnemonic": "stcisync", "equivalent": "sync SC=2"}, {"mnemonic": "stsync", "equivalent": "sync SC=3"}]}
{"mnemonic": "lwsync", "architecture": "PowerISA", "full_name": "Lightweight Synchronize (Pseudo)", "summary": "Orders loads with loads, stores with stores, and loads with stores. Does NOT order stores with loads. (Encoded as sync 1).", "syntax": "lwsync", "encoding": {"format": "Pseudo", "binary_pattern": "31 | 0 | 1 | 0 | 598 | /", "hex_opcode": "0x7C2004AC", "visual_parts": [{"raw": "sync 1", "clean": "sync 1"}], "bit_positions": "0:5 | 6:7 | 8:10 | 11:20 | 21:30 | 31", "length": "32"}, "operands": [], "pseudocode": "MemoryBarrier(Light)", "example": "lwsync", "example_note": "Standard multicore barrier.", "extension": "Base", "description": "Lightweight Sync. Extended mnemonic for SYNC (sync 1). Provides a lightweight memory synchronization barrier for ordering loads and stores without full heavyweight sync semantics.", "programming_notes": "Lightweight sync. Orders loads and stores before the barrier against loads and stores after it, but does not guarantee store-to-load ordering. Sufficient for producer-consumer patterns without data-dependent stores."}
{"mnemonic": "rfid", "architecture": "PowerISA", "full_name": "Return From Interrupt Doubleword", "summary": "Returns from an interrupt handler. Restores PC from SRR0 and MSR from SRR1.", "syntax": "rfid", "encoding": {"format": "XL-form", "binary_pattern": "19 | / | / | / | 18 | /", "hex_opcode": "0x4C000024", "visual_parts": [{"raw": "19", "clean": "19"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "18", "clean": "18"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [], "pseudocode": "CIA ← SRR0; MSR ← SRR1; context is fully restored", "example": "rfid", "example_note": "Exit Kernel Mode.", "extension": "Privileged", "description": "Returns from an interrupt handler by restoring the Program Counter from SRR0 and the Machine State Register from SRR1. This is a privileged instruction that must be executed in Hypervisor or privileged state. Execution continues at the address loaded from SRR0 with the MSR value from SRR1, enabling recovery from exceptions and context restoration. No condition or status registers are affected; the entire processor state is restored from the saved registers.", "special_registers": "MSR, SRR0, SRR1, HSRR0, HSRR1, USRR0", "programming_notes": "If this instruction sets MSRPR to 1, it also sets MSREE, MSRIR, and MSRDR to 1. If this instruction results in MSRS HV PR being equal to 0b110, it also sets MSRIR and MSRDR to 0.", "page_found": "Page 1121 - 1122"}
{"mnemonic": "tlbie", "architecture": "PowerISA", "full_name": "Translation Lookaside Buffer Invalidate Entry", "summary": "Invalidates a TLB entry corresponding to the address in RB.", "syntax": "tlbie RB, RS", "encoding": {"format": "X-form", "binary_pattern": "0 | RS | 6 | 11 | RIC | PRS | R | RB", "hex_opcode": "0x7C000264", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "306", "clean": "306"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:8 | 9 | 10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RB", "desc": "Effective Address"}, {"name": "RS", "desc": "Process ID (PID)"}, {"name": "RIC", "desc": "Radix Invalidation Control"}, {"name": "PRS", "desc": "Process Scoped"}, {"name": "eﬀR", "desc": "Effective R"}, {"name": "R", "desc": "Effective R bit indicating whether to use the effective address or segment/page size information."}], "pseudocode": "Invalidate TLB entry(ies) corresponding to address in RB, process ID in RS, controlled by RIC, PRS, and R fields; synchronization semantics depend on the radix MMU configuration.", "example": "tlbie r3, r4", "example_note": "Flush page translation.", "extension": "Privileged", "description": "Invalidates a translation lookaside buffer (TLB) entry corresponding to the effective address in RB. This privileged instruction allows selective invalidation controlled by the RIC (Radix Invalidation Control), PRS (Process Scoped), and R fields. The RS operand may contain a Process ID for process-scoped invalidations in radix MMU implementations. This instruction affects only the TLB state and does not modify condition or status registers.", "programming_notes": "The use of eﬀR in the RTL and verbal descriptions of tlbie[l] beginning in Version 3.1B of the architecture is a clarification of earlier architecture, not a functional change.", "page_found": "Page 1207 - 1208", "special_registers": "MSR"}
{"mnemonic": "slbie", "architecture": "PowerISA", "full_name": "Segment Lookaside Buffer Invalidate Entry", "summary": "Invalidates an SLB entry. Critical for memory management on Power systems.", "syntax": "slbie RB", "encoding": {"format": "X-form", "binary_pattern": "31 | / | / | RB | 434 | /", "hex_opcode": "0x7C000364", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "/", "clean": "/"}, {"raw": "RB", "clean": "RB"}, {"raw": "434", "clean": "434"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RB", "desc": "Effective Address"}], "pseudocode": "if 'slbie' then\n    RB0:35 ← (RB)0:35\n    if, for SLB entry that translates or most recently translated ea,\n        entry_class = (RB)36 and entry_seg_size = size specified in (RB)37:38,\n        then for SLB entry (if any) that translates ea\n            SLBEV ←0\n            all other fields of SLBE ←undefined\n    else\n        s ←log_base_2(entry_seg_size)\n        esid ←(RB)0:63-s\n        u ←undefined 1-bit value\n        if u then\n            if an SLB entry translates esid\n                SLBEV ←0\n                all other fields of SLBE ←undefined", "example": "slbie r3", "example_note": "Flush segment translation.", "extension": "Privileged", "description": "The instruction terminates any Segment Table walks being performed on behalf of the thread that executes it. The hardware ignores the contents of RB listed below, and software must set them to 0s.", "programming_notes": "slbie does not affect SLBs on other threads.\nThe class value specified by slbie must be the same as the Class value that is or was in the relevant SLB entry. The reason for this is that the hardware may use these values to optimize invalidation of implementation-specific lookaside information used in address translation. If the value specified by slbie differs from the value that is or was in the relevant SLB entry, these optimizations may produce incorrect results.\nWhen switching tasks in certain cases, it may be advantageous to preserve some implementation-specific lookaside entries while invalidating others. The slbia instruction specifying IH value 0b001 or 0b011 can be used for this purpose if SLB class values are appropriately assigned.", "page_found": "Page 1195 - 1196", "special_registers": "RB"}
{"mnemonic": "tbegin.", "architecture": "PowerISA", "full_name": "Transaction Begin", "summary": "Initiates a hardware transaction. If the transaction fails, execution rolls back to this point. Sets CR0 based on success/failure.", "syntax": "tbegin. R", "encoding": {"format": "X-form", "binary_pattern": "31 | / | R | / | 654 | 1", "hex_opcode": "0x7C00051D", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "R", "clean": "R"}, {"raw": "/", "clean": "/"}, {"raw": "654", "clean": "654"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "R", "desc": "Rollback Handler (0=External, 1=Internal)"}], "pseudocode": "if transaction initiated successfully then CR0[EQ] ← 1 else CR0[EQ] ← 0; CR0[LT,GT,SO] set based on abort cause; transaction state is active", "example": "tbegin. 0", "example_note": "Start atomic hardware transaction.", "extension": "Transactional Memory", "description": "Initiates a hardware transaction, setting the transaction active state and recording checkpoint information. If execution completes successfully within the transaction, tbegin. sets CR0[EQ] = 1; if the transaction is aborted, execution rolls back to this instruction and CR0[EQ] = 0, with CR0[SO] indicating the abort cause. The R field determines whether a transaction failure causes an external rollback (R=0) or an internal retry (R=1). Requires Transactional Memory (TM) facility support.", "page_found": "Page 1321", "special_registers": "CR0", "programming_notes": "In synthetic TM mode, transactions initiated by tbegin will fail immediately, invoking the failure handler. Ensure that your application logic correctly handles transaction failures to maintain data integrity."}
{"mnemonic": "tend.", "architecture": "PowerISA", "full_name": "Transaction End", "summary": "Commits the current hardware transaction. If successful, memory changes become visible atomically.", "syntax": "tend. A", "encoding": {"format": "X-form", "binary_pattern": "31 | / | A | / | 686 | 1", "hex_opcode": "0x7C00055D", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "A", "clean": "A"}, {"raw": "/", "clean": "/"}, {"raw": "686", "clean": "686"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "A", "desc": "Abort Control"}], "pseudocode": "CommitTransaction()", "example": "tend. 0", "example_note": "Commit transaction.", "extension": "Transactional Memory", "description": "Transaction End. Ends the current transaction. If A=1 (All), ends all nested transactions. On success the memory updates made in the transaction become visible. On failure a non-transactional abort occurs.", "special_registers": "CR0", "programming_notes": "Use `tend` to end a transaction, making its changes permanent if successful. If an error occurs, it triggers a non-transactional abort. Ensure all nested transactions are properly managed when using the A=1 option."}
{"mnemonic": "tabort.", "architecture": "PowerISA", "full_name": "Transaction Abort", "summary": "Forces a transaction failure and rollback.", "syntax": "tabort. RA", "encoding": {"format": "X-form", "binary_pattern": "31 | / | RA | / | 910 | 1", "hex_opcode": "0x7C00071D", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}, {"raw": "RA", "clean": "RA"}, {"raw": "/", "clean": "/"}, {"raw": "910", "clean": "910"}, {"raw": "1", "clean": "1"}], "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31", "length": "32"}, "operands": [{"name": "RA", "desc": "Abort Code"}], "pseudocode": "Abort transaction; rollback to most recent tbegin.; CR0[EQ] ← 0; CR0[SO] ← 1; TEXASR abort code ← RA", "example": "tabort. r3", "example_note": "Force rollback.", "extension": "Transactional Memory", "description": "Forces an abort of the current hardware transaction, rolling back all transactional state and returning control to the point of the most recent tbegin. The RA operand contains the abort code (or a register holding the code) that is reflected in TEXASR. CR0 is set to indicate transaction failure, with CR0[SO] holding abort status. This instruction requires Transactional Memory facility support and can only be executed within a transaction.", "special_registers": "CR0", "programming_notes": "Use tabort to explicitly abort a transaction and discard all changes. Ensure this is called within a transactional region; otherwise, it will raise an exception. Check CR0 for transaction status before or after calling tabort."}
{"mnemonic": "vcipher", "architecture": "PowerISA", "full_name": "Vector Cipher (AES)", "summary": "Performs one round of AES encryption (SubBytes, ShiftRows, MixColumns, AddRoundKey).", "syntax": "vcipher vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1288", "hex_opcode": "0x10000508", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1288", "clean": "1288"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target State"}, {"name": "vA", "desc": "Current State"}, {"name": "vB", "desc": "Round Key"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register containing the intermediate state array"}, {"name": "VRB", "desc": "Source Vector Register containing the round key"}], "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nState ←VSR[VRA+32]\nRoundKey ←VSR[VRB+32]\nvtemp1 ←SubBytes(State)\nvtemp2 ←ShiftRows(vtemp1)\nvtemp3 ←MixColumns(vtemp2)\nVSR[VRT+32] ←vtemp3 ⊕ RoundKey", "example": "vcipher v1, v2, v3", "example_note": "Hardware AES Encrypt.", "extension": "Vector Crypto", "description": "The instruction performs one round of the AES cipher operation on the intermediate State array, sequentially applying the transforms SubBytes(), ShiftRows(), MixColumns(), and AddRoundKey() as defined in FIPS-197. The result is placed into VSR[VRT+32], representing the new intermediate state of the cipher operation.", "page_found": "Page 459 - 460", "special_registers": "MSR", "programming_notes": "The vcipher instruction performs a single AES cipher round, requiring the Vector Facility to be enabled. Ensure that the VRA and VRB registers point to the correct intermediate state and round key in vector storage registers. The result is stored in VSR[VRT+32]. This instruction operates at the user privilege level and will raise an exception if the Vector Facility is not available."}
{"mnemonic": "vncipher", "architecture": "PowerISA", "full_name": "Vector Inverse Cipher (AES)", "summary": "Performs one round of an AES inverse cipher operation on the intermediate state array.", "syntax": "vncipher vD, vA, vB", "encoding": {"format": "VX-form", "binary_pattern": "4 | vD | vA | vB | 1352", "hex_opcode": "0x10000548", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "1352", "clean": "1352"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target State"}, {"name": "vA", "desc": "Current State"}, {"name": "vB", "desc": "Round Key"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register containing the intermediate state array"}, {"name": "VRB", "desc": "Source Vector Register containing the round key"}], "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nState ← VSR[VRA+32]\nRoundKey ← VSR[VRB+32]\nvtemp1 ← InvShiftRows(State)\nvtemp2 ← InvSubBytes(vtemp1)\nvtemp3 ← vtemp2 ⊕ RoundKey\nVSR[VRT+32] ← InvMixColumns(vtemp3)", "example": "vncipher v1, v2, v3", "example_note": "Hardware AES Decrypt.", "extension": "Vector Crypto", "description": "The instruction performs one round of an AES inverse cipher operation, sequentially applying the transforms InvShiftRows(), InvSubBytes(), AddRoundKey(), and InvMixColumns() to the intermediate State array.", "page_found": "Page 460 - 461", "special_registers": "MSR", "programming_notes": "This instruction is used to perform a single round of the AES inverse cipher, which includes operations like InvShiftRows, InvSubBytes, AddRoundKey, and InvMixColumns. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The input state and round key must be correctly loaded into the appropriate vector registers (VRA+32 and VRB+32), respectively, and the result will be stored in VRT+32. This operation is typically used in cryptographic algorithms that require AES decryption."}
{"mnemonic": "vshasigmaw", "architecture": "PowerISA", "full_name": "Vector SHA-256 Sigma Word", "summary": "Performs the Sigma0/Sigma1/sigma0/sigma1 functions for SHA-256.", "syntax": "vshasigmaw vD, vA, ST, SIX", "encoding": {"format": "VX-form", "binary_pattern": "4 | VRT | VRA | ST | SIX", "hex_opcode": "0x10000682", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "ST", "clean": "ST"}, {"raw": "1666", "clean": "1666"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16 | 17:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Source"}, {"name": "ST", "desc": "Sigma Type (0/1)"}, {"name": "SIX", "desc": "Shift Index (Immediate)"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}], "pseudocode": "for i = 0 to 3: vD[32i:32i+31] ← SHA256_sigma(vA[32i:32i+31], ST, SIX)", "example": "vshasigmaw v1, v2, 0, 0", "example_note": "SHA-256 Acceleration.", "extension": "Vector Crypto", "description": "Performs one of the four SHA-256 sigma functions (Sigma0, Sigma1, sigma0, or sigma1) on each 32-bit word in the source vector and stores the result in the destination vector. The ST field selects between Sigma-type and sigma-type operations, and SIX selects the specific operation. This is a Vector Crypto instruction that operates on four 32-bit elements in parallel within a 128-bit vector register. No condition or status registers are affected.", "page_found": "Page 463 - 464", "special_registers": "MSR", "programming_notes": "The vshasigmaw instruction is used to perform SHA-256 sigma or sigma-like functions on vector register elements. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. The instruction operates on each 32-bit word of the source vector, applying different bitwise rotations and XORs based on the ST and SIX fields. This instruction requires supervisor privilege level to execute."}
{"mnemonic": "lbzu", "architecture": "PowerISA", "full_name": "Load Byte and Zero with Update D-form", "summary": "Loads a byte from memory into a register, zeroing the upper bits of the target register, and updates the base address register.", "description": "The effective address (EA) is calculated as the sum of the contents of register RA and the sign-extended displacement D. The byte at EA is loaded into RT56:63, with RT0:55 set to zero. The EA is then stored back into RA.", "syntax": "lbzu RT,D(RA)", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Base Address General Purpose Register"}, {"name": "D", "desc": "Displacement"}], "encoding": {"format": "D-form", "hex_opcode": "0x8C000000", "length": "32", "binary_pattern": "0 | RT | RA | D", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Base", "pseudocode": "EA ← (RA) + EXTS(D)\nRT ← 560 || MEM(EA, 1)\nRA ← EA", "special_registers": "", "programming_notes": "The base register (RA) is updated with the effective address after the memory access. RA must not be 0 and must differ from the destination register; violating this constraint produces undefined results.", "extended_mnemonics": [], "page_found": "Page 84 - 86", "example": "lbzu r3, 0(r4)"}
{"mnemonic": "lhzu", "architecture": "PowerISA", "full_name": "Load Halfword and Zero with Update D-form", "summary": "Loads a halfword from memory into a register, zero-extends it to 64 bits, and updates the base address.", "description": "The effective address (EA) is calculated as the sum of the contents of register RA and the sign-extended displacement D. The halfword at EA is loaded into RT48:63, with RT0:47 set to zero. The EA is then placed back into RA.", "syntax": "lhzu RT,D(RA)", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Base General Purpose Register"}, {"name": "D", "desc": "Displacement"}], "encoding": {"format": "D-form", "hex_opcode": "0xA4000000", "length": "32", "binary_pattern": "0 | RT | RA | D", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Base", "pseudocode": "EA ← (RA) + EXTS(D)\nRT ← 480 || MEM(EA, 2)\nRA ← EA", "special_registers": "", "programming_notes": "The base register (RA) is updated with the effective address after the memory access. RA must not be 0 and must differ from the destination register; violating this constraint produces undefined results.", "extended_mnemonics": [], "page_found": "Page 86 - 88", "example": "lhzu r3, 0(r4)"}
{"mnemonic": "stdu", "architecture": "PowerISA", "full_name": "Store Doubleword with Update DS-form", "summary": "Stores a doubleword from a register to memory and updates the base address register.", "description": "Stores a 64-bit doubleword from register RS to memory at the address computed from RA plus the sign-extended displacement, then updates RA with the effective address. The displacement is a 14-bit signed value (DS field), scaled by 8 to form a byte offset. This instruction is commonly used in prologue/epilogue code to allocate/deallocate stack space while storing values. No condition or status registers are affected.", "syntax": "stdu RS,disp(RA)", "operands": [{"name": "RS", "desc": "Source General Purpose Register"}, {"name": "RA", "desc": "Base Address General Purpose Register"}, {"name": "disp", "desc": "Displacement value"}], "encoding": {"format": "DS-form", "hex_opcode": "0xF8000001", "length": "32", "binary_pattern": "0 | RS | RA | DS | 1", "bit_positions": "0:5 | 6:10 | 11:15 | 16:30 | 31"}, "extension": "Base", "pseudocode": "EA ← (RA) + EXTS(DS || 0b00); M[EA:EA+7] ← (RS); RA ← EA", "special_registers": "", "programming_notes": "The base register (RA) is updated with the effective address after the memory access. RA must not be 0 and must differ from the destination register; violating this constraint produces undefined results.", "extended_mnemonics": [], "page_found": "Page 96 - 98", "example": "stdu r3, disp(RA)"}
{"mnemonic": "mulli", "architecture": "PowerISA", "full_name": "Multiply Low Immediate", "summary": "Multiplies the contents of a register by an immediate value and places the low-order 32 bits of the product into another register.", "description": "The 64-bit first operand is (RA). The 64-bit second operand is the sign-extended value of the SI field. The low-order 32 bits of the 128-bit product of the operands are placed into register RT.", "syntax": "mulli RT,RA,SI", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "SI", "desc": "16-bit Immediate Value"}], "encoding": {"format": "D-form", "hex_opcode": "0x1C000000", "length": "32", "binary_pattern": "0 | RT | RA | SI", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Base", "pseudocode": "prod0:127 ← (RA) × EXTS(SI)\nRT ← prod64:127", "special_registers": "N/A", "programming_notes": "For mulli and mullw, the low-order 32 bits of the product are the correct 32-bit product for 32-bit mode.", "extended_mnemonics": [], "page_found": "Page 114 - 116", "example": "mulli r3, r4, 16"}
{"mnemonic": "addg6s", "architecture": "PowerISA", "full_name": "Add and Generate Sixes", "summary": "Adds the contents of two registers and generates sixes based on carry bits.", "description": "Adds the values in registers RA and RB, then replaces each nibble (4-bit group) of the result with 0x6 if a carry was generated from that nibble, otherwise the low 4 bits of the sum are preserved. This instruction is used in decimal arithmetic for BCD (Binary Coded Decimal) addition to generate correction factors. No condition or status registers are affected, and the Rc bit is not available (non-dot form only).", "syntax": "addg6s RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "XO-form", "hex_opcode": "0x7C000094", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Base", "pseudocode": "sum ← (RA) + (RB); for i = 0 to 15: if carry_from_nibble(i) then RT[4i:4i+3] ← 0x6 else RT[4i:4i+3] ← sum[4i:4i+3]", "special_registers": "", "programming_notes": "addg6s can be used to add or subtract two BCD operands. In these examples it is assumed that r0 contains 0x666...666. (BCD data formats are described in Section 5.3.)", "extended_mnemonics": [], "page_found": "Page 152 - 154", "example": "addg6s r3, r4, r5"}
{"mnemonic": "lfs", "architecture": "PowerISA", "full_name": "Load Floating-Point Single D-form", "summary": "Loads a single-precision floating-point value from memory into a floating-point register and converts it to double precision.", "description": "Loads a single-precision floating-point value from memory at address RA+D, converts it to double precision, and stores the result in FRT. This instruction is part of the Floating-Point category and does not affect condition registers or the XER.", "syntax": "lfs FRT,D(RA)", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "RA", "desc": "Base General Purpose Register"}, {"name": "D", "desc": "Displacement"}, {"name": "offset", "desc": "Immediate Offset"}], "encoding": {"format": "D-form", "hex_opcode": "0xC0000000", "length": "32", "binary_pattern": "48 | FRT | RA | D", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Floating-Point", "pseudocode": "EA ← (RA = 0 ? 0 : GPR(RA)) + EXTS(D)\nFPR(FRT) ← ConvertSingleToDouble([EA])", "special_registers": "None, FPSCR", "programming_notes": "The lfs extended mnemonic permits computing an effective address as a Load or Store instruction would, but loads the address itself into a GPR rather than loading the value that is in storage at that address.", "extended_mnemonics": [], "page_found": "Page 184 - 186", "example": "lfs f1, 0(r4)"}
{"mnemonic": "lfsu", "architecture": "PowerISA", "full_name": "Load Floating-Point Single with Update Indexed", "summary": "Loads a floating-point single-precision operand from memory into a register and updates the base address.", "description": "The word in storage addressed by EA is interpreted as a floating-point single-precision operand. This word is converted to floating-point double format (see page 149) and placed into register FRT. The effective address (EA) is the sum of RA and D, and EA is placed into register RA.", "syntax": "lfsu FRT,D(RA)", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "RA", "desc": "Base General Purpose Register"}, {"name": "D", "desc": "Displacement"}], "encoding": {"format": "X-form", "hex_opcode": "0xC4000000", "length": "32", "binary_pattern": "0 | FRT | RA | D", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Floating-Point", "pseudocode": "EA ← (RA) + EXTS(D)\nFRT ← DOUBLE(MEM(EA, 4))\nRA ← EA\nif RA=0 then\n    the instruction form is invalid", "special_registers": "FPSCR", "programming_notes": "The base register (RA) is updated with the effective address after the memory access. RA must not be 0 and must differ from the destination register; violating this constraint produces undefined results.", "extended_mnemonics": [], "page_found": "Page 186 - 188", "example": "lfsu f1, 0(r4)"}
{"mnemonic": "lfdu", "architecture": "PowerISA", "full_name": "Load Floating-Point Double with Update", "summary": "Loads a doubleword from memory into a floating-point register and updates the base address register.", "description": "The doubleword in storage addressed by EA is loaded into register FRT. The effective address (EA) is the sum of the contents of register RA, or the value 0 if RA=0, and the value D, sign-extended to 64 bits. If RA=0, the instruction form is invalid.", "syntax": "lfdu FRT,D(RA)", "operands": [{"name": "FRT", "desc": "Target Floating Point Register"}, {"name": "RA", "desc": "Base General Purpose Register"}, {"name": "D", "desc": "Displacement"}], "encoding": {"format": "D-form", "hex_opcode": "0xCC000000", "length": "32", "binary_pattern": "0 | FRT | RA | D", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Floating-Point", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + EXTS(D)\nFRT ← MEM(EA, 8)\nRA ← EA", "special_registers": "FPSCR", "programming_notes": "The base register (RA) is updated with the effective address after the memory access. RA must not be 0 and must differ from the destination register; violating this constraint produces undefined results.", "extended_mnemonics": [], "page_found": "Page 188 - 190", "example": "lfdu f1, 0(r4)"}
{"mnemonic": "stfsx", "architecture": "PowerISA", "full_name": "Store Floating-Point Single Indexed X-form", "summary": "Stores a single-precision floating-point value from a register to memory using an indexed address.", "description": "The contents of register FRS are converted to single format and stored into the word in storage addressed by EA, which is the sum of RA (or RA|0) and RB. If RA is not zero, it is used directly; otherwise, b is set to zero.", "syntax": "stfsx FRS,RA,RB", "operands": [{"name": "FRS", "desc": "Floating-Point Register Source"}, {"name": "RA", "desc": "General Purpose Register (Base Address)"}, {"name": "RB", "desc": "General Purpose Register (Index)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00052E", "length": "32", "binary_pattern": "0 | FRS | RA | RB", "bit_positions": ""}, "extension": "Floating-Point", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + (RB)\nMEM(EA, 4) ← SINGLE((FRS))", "special_registers": "FPSCR", "programming_notes": "The stfsx instruction stores a single-precision floating-point value from register FRS to memory. Ensure that the base address (RA or RA|0) and offset (RB) are correctly aligned for optimal performance. If RA is zero, the effective address is solely determined by RB; otherwise, it's the sum of RA and RB. This instruction operates at user privilege level.", "extended_mnemonics": [], "page_found": "Page 190 - 192", "example": "stfsx f1, r4, r5"}
{"mnemonic": "stfdux", "architecture": "PowerISA", "full_name": "Store Floating-Point Double with Update Indexed", "summary": "Stores the contents of a floating-point register into memory and updates the base address register.", "description": "The contents of register FRS are stored into the double-word in storage addressed by EA. The effective address (EA) is the sum of the contents of registers RA and RB. If RA=0, the instruction form is invalid. EA is placed back into register RA.", "syntax": "stfdux FRS,RA,RB", "operands": [{"name": "FRS", "desc": "Floating-Point Register Source"}, {"name": "RA", "desc": "General Purpose Register Address"}, {"name": "RB", "desc": "General Purpose Register Index"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0005EE", "length": "32", "binary_pattern": "0 | FRS | RA | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Floating-Point", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + (RB)\nMEM(EA, 8) ← (FRS)\nRA ← EA", "special_registers": "FPSCR", "programming_notes": "The base register (RA) is updated with the effective address after the memory access. RA must not be 0 and must differ from the destination register; violating this constraint produces undefined results.", "extended_mnemonics": [], "page_found": "Page 192 - 194", "example": "stfdux f1, r4, r5"}
{"mnemonic": "stfdp", "architecture": "PowerISA", "full_name": "Store Floating-Point Double Pair", "summary": "Stores the contents of two floating-point registers into memory as a doubleword pair.", "description": "The instruction stores the contents of the even-numbered register of FRSp into the doubleword in storage addressed by EA, and the contents of the odd-numbered register of FRSp into the doubleword in storage addressed by EA+8.", "syntax": "stfdp FRSp,disp(RA)", "operands": [{"name": "FRSp", "desc": "Floating-Point Register Pair"}, {"name": "disp", "desc": "Displacement"}, {"name": "RA", "desc": "Base General Purpose Register"}], "encoding": {"format": "DS-form", "hex_opcode": "0xF4000000", "length": "32", "binary_pattern": "0 | FRSp | RA | DS | 0b00", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "Floating-Point", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + EXTS(DS || 0b00)\nMEM(EA, 8) ← FRSpeven\nMEM(EA+8, 8) ← FRSpodd", "special_registers": "FPSCR", "programming_notes": "The stfdp instruction is commonly used to store two consecutive double-precision floating-point numbers from the FPSCR into memory. Ensure that the base address (EA) is properly aligned to an 8-byte boundary to avoid alignment exceptions. This instruction operates at user privilege level and will raise a program interrupt if attempting to access protected memory.", "extended_mnemonics": [], "page_found": "Page 194 - 196", "example": "stfdp f2, disp(RA)"}
{"mnemonic": "fmrgew", "architecture": "PowerISA", "full_name": "Floating Merge Even Word", "summary": "Merges the even words from two floating-point registers into a third.", "description": "The contents of word element 0 of FPR[FRA] are placed into word element 0 of FPR[FRT], and the contents of word element 0 of FPR[FRB] are placed into word element 1 of FPR[FRT].", "syntax": "fmrgew FRT,FRA,FRB", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRA", "desc": "Source Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC00078C", "length": "32", "binary_pattern": "0 | FRT | FRA | FRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Floating-Point", "pseudocode": "if MSR.FP=0 then\n    FP_Unavailable()\nFPR[FRT].word[0] ← FPR[FRA].word[0]\nFPR[FRT].word[1] ← FPR[FRB].word[0]", "special_registers": "FPSCR", "programming_notes": "fmrgew and fmrgow are provided to support direct move operations in 32-bit mode.", "extended_mnemonics": [], "page_found": "Page 196 - 198", "example": "fmrgew f1, f2, f3"}
{"mnemonic": "frin", "architecture": "PowerISA", "full_name": "Floating Round to Integer Nearest", "summary": "Rounds the floating-point operand in register FRB to an integral value using the rounding mode round to nearest.", "description": "The floating-point operand in register FRB is rounded to an integral value as follows, with the result placed into register FRT. If the sign of the operand is positive, (FRB) + 0.5 is truncated to an integral value, otherwise (FRB) - 0.5 is truncated to an integral value.", "syntax": "frin FRT,FRB", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000310", "length": "32", "binary_pattern": "18 | FRT | FRB | Rc", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Floating-Point", "pseudocode": "if 'frin' then\n    if (FRB) >= 0 then\n        FRT <- truncate((FRB) + 0.5)\n    else\n        FRT <- truncate((FRB) - 0.5)", "special_registers": "FPSCR, (FPRF, FX, VXSNAN), FPSCR, (FR, FI), CR1, (if, Rc=1), CR0", "programming_notes": "These instructions set FR and FI to 0b00 regardless of whether the result is inexact or rounded because there is a desire to preserve the value of XX.", "extended_mnemonics": [], "page_found": "Page 212 - 214", "example": "frin f1, f3"}
{"mnemonic": "mffscdrn", "architecture": "PowerISA", "full_name": "Move From FPSCR Control & Set DRN", "summary": "Moves control bits from FPSCR to a register and sets the DRN field.", "description": "The contents of the control bits in the FPSCR, that is, bits 29:31 (DRN) and bits 56:63 (VE, OE, UE, ZE, XE, NI, RN), are placed into the corresponding bits in register FRT. All other bits in register FRT are set to 0. The contents of bits 29:31 of the FPSCR (DRN) are set to the value of FRB.", "syntax": "mffscdrn FRT,FRB", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC14048E", "length": "32", "binary_pattern": "0 | FRT | FRB | 583", "bit_positions": "0:5 | 6:10 | 11:20 | 21:31"}, "extension": "Floating-Point", "pseudocode": "FRT <- FPSCR[29:31] & FPSCR[56:63]\nFPSCR[DRN] <- FRB[29:31]", "special_registers": "FPSCR", "programming_notes": "mffscdrn permits software to simultaneously read control bits in the FPSCR and set the DRN field without the higher latency typically associated with accessing the status bits.", "extended_mnemonics": [], "page_found": "Page 218 - 220", "example": "mffscdrn f1, f3"}
{"mnemonic": "dtstex", "architecture": "PowerISA", "full_name": "DFP Test Exponent X-form", "summary": "Compares the exponent values of two DFP operands and updates CR field BF and FPCC.", "description": "The exponent value (Ea) of the DFP operand in FRA is compared to the exponent value (Eb) of the DFP operand in FRB. The result of the compare is placed into CR field BF and the FPCC.", "syntax": "dtstex BF,FRA,FRB", "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "FRA", "desc": "First Source DFP Floating-Point Register"}, {"name": "FRB", "desc": "Second Source DFP Floating-Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xEC000144", "length": "32", "binary_pattern": "0 | BF | FRA | FRB | 162", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:31"}, "extension": "Decimal Floating-Point", "pseudocode": "Ea ← exponent of DFP operand in FRA\nEb ← exponent of DFP operand in FRB\nif (FRA is F) and (FRB is F) then\n    if Ea < Eb then CR_BF || FPCC ← 0b1000\n    else if Ea > Eb then CR_BF || FPCC ← 0b0100\n    else CR_BF || FPCC ← 0b0010\nelse if (FRA is ∞) and (FRB is ∞) then CR_BF || FPCC ← 0b0010\nelse if (FRA is QNaN or SNaN) and (FRB is QNaN or SNaN) then CR_BF || FPCC ← 0b0010\nelse CR_BF || FPCC ← 0b0001", "special_registers": "CR field BF, FPSCR FPCC", "programming_notes": "The dtstex instruction compares the exponents of two DFP operands and sets the condition register field BF and floating-point status and control register (FPSCR) FPCC based on the comparison. Ensure that both operands are properly aligned and valid; otherwise, the instruction may raise exceptions. This instruction is useful for sorting or filtering operations where exponent values need to be compared.", "extended_mnemonics": [], "page_found": "Page 246 - 248", "example": "dtstex cr0, f2, f3"}
{"mnemonic": "drrnd", "architecture": "PowerISA", "full_name": "Decimal Floating-Point Reround", "summary": "Rounds a decimal floating-point value to the specified number of significant digits.", "description": "Rounds a decimal floating-point value in FRB to the number of significant digits specified in FRA, using the rounding mode in RMC, and stores the result in FRT. This instruction is part of the Decimal Floating-Point category. The Rc bit controls whether the condition register CR1 is updated with FPCC and exception flags.", "syntax": "drrnd FRT,FRA,FRB,RMC", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRA", "desc": "Source Floating-Point Register containing the reference significance"}, {"name": "FRB", "desc": "Source Floating-Point Register containing the value to be rounded"}, {"name": "RMC", "desc": "Rounding Mode Control"}, {"name": "k", "desc": "Number of significant digits"}], "encoding": {"format": "Z23-form", "hex_opcode": "0xEC000046", "length": "32", "binary_pattern": "0 | FRT | FRA | FRB | RMC | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Decimal Floating-Point", "pseudocode": "k ← DecimalSignificance(FRA)\nFPR(FRT) ← RoundDecimal(FRB, k, RMC)\nif Rc = 1 then CR1 ← FPCC || FPSCR[OX,UX,ZX,XX]", "special_registers": "FPSCR, (FPRF, FR, FI, FX, XX), VXSNAN, VXCVI, CR0", "programming_notes": "DFP Reround can be used to adjust a DFP value to have no more than a specified number of significant digits. The result is right-justified and rounded as specified by RMC.", "extended_mnemonics": [], "page_found": "Page 252 - 254", "example": "drrnd f1, f2, f3, 0"}
{"mnemonic": "drintx", "architecture": "PowerISA", "full_name": "Decimal Floating-Point Round To FP Integer With Inexact", "summary": "Rounds a decimal floating-point number to the nearest integer and places it into a floating-point register.", "description": "The DFP operand in FRB is rounded to a floating-point integer and placed into FRT. The sign of the result is the same as the sign of the operand in FRB. The ideal exponent is the larger value of zero and the exponent of the operand in FRB. The rounding mode used is specified by RMC.", "syntax": "drintx R,FRT,FRB,RMC", "operands": [{"name": "R", "desc": "Rounding mode control bit"}, {"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}, {"name": "RMC", "desc": "Rounding mode control field"}], "encoding": {"format": "Z23-form", "hex_opcode": "0xEC0000C6", "length": "32", "binary_pattern": "0 | R | FRT | FRB | RMC | Rc", "bit_positions": "0:5 | 6:10 | 11:14 | 15 | 16:20 | 21:31"}, "extension": "Decimal Floating-Point", "pseudocode": "if 'drintx' then\n    FRT <- round(FRB, RMC)\n    if result differs from FRB then\n        raise inexact exception", "special_registers": "FPSCR, (FPRF, FR, FI, FX, XX), VXSNAN, CR1, (if, Rc=1), CR0", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": ["drintx."], "page_found": "Page 254 - 256", "example": "drintx 0, f1, f3, 0"}
{"mnemonic": "drintn", "architecture": "PowerISA", "full_name": "Decimal Floating-Point Round To FP Integer Without Inexact", "summary": "Rounds a decimal floating-point number to an integer without recognizing an inexact exception.", "description": "This operation rounds the value in FRB to an integer using the specified rounding mode (RMC) and places the result in FRT. It does not recognize an inexact exception.", "syntax": "drintn R,FRT,FRB,RMC", "operands": [{"name": "R", "desc": "Rounding mode control"}, {"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}, {"name": "RMC", "desc": "Rounding Mode Control"}], "encoding": {"format": "Z23-form", "hex_opcode": "0xEC0001C6", "length": "32", "binary_pattern": "0 | FRT | R | FRB | RMC | Rc", "bit_positions": "0:5 | 6:10 | 11:14 | 15 | 16:20 | 21:31"}, "extension": "Decimal Floating-Point", "pseudocode": "if 'drintn' then\n    FRT <- Round(FRB, RMC)\n    FI <- 0\n    FR <- 0\n    VXSNAN <- 0\n    if Rc=1 then\n        CR1 <- ClassAndSign(FRT)\nelse if 'drintn.' then\n    FRT <- Round(FRB, RMC)\n    FI <- 0\n    FR <- 0\n    VXSNAN <- 0\n    CR1 <- ClassAndSign(FRT)", "special_registers": "FPSCR, (FPRF, FX, VXSNAN), FPSCR, (FR, FI), CR1, CR0", "programming_notes": "The DFP Round To FP Integer Without Inexact and DFP Round To FP Integer Without Inexact Quad instructions can be used to implement decimal equivalents of several C99 rounding functions by specifying the appropriate R and RMC field values.", "extended_mnemonics": [], "page_found": "Page 256 - 258", "example": "drintn 0, f1, f3, 0"}
{"mnemonic": "lvebx", "architecture": "PowerISA", "full_name": "Load Vector Element Byte Indexed", "summary": "Loads a byte from memory into a vector register element.", "description": "Loads a single byte from memory at address RA+RB and stores it in the rightmost byte of a vector register element in VRT, with zero padding in remaining bytes. This instruction is part of the VMX (AltiVec) category and does not update condition registers.", "syntax": "lvebx VRT,RA,RB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Index General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00000E", "length": "32", "binary_pattern": "0 | VRT | RA | RB | 7", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "EA ← (RA = 0 ? 0 : GPR(RA)) + GPR(RB)\nbyte_index ← EA[28:31]\nVRT ← (0x00000000000000 || [EA & ~0x3])\nVRT[byte_index] ← [EA]", "special_registers": "MSR", "programming_notes": "The Load Vector Element instructions load the specified element into the same location in the target register as the location into which it would be loaded using the Load Vector instruction.", "extended_mnemonics": [], "page_found": "Page 294 - 296", "example": "lvebx v1, r4, r5"}
{"mnemonic": "lvewx", "architecture": "PowerISA", "full_name": "Load Vector Element Word Indexed", "summary": "Loads a word from memory into a vector register element.", "description": "Loads a word (32 bits) from memory at address RA+RB (aligned to 4-byte boundary) and stores it in a vector register element in VRT, with zero padding in remaining doublewords. This instruction is part of the VMX (AltiVec) category and does not update condition registers.", "syntax": "lvewx VRT,RA,RB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00008E", "length": "32", "binary_pattern": "0 | VRT | RA | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "EA ← (RA = 0 ? 0 : GPR(RA)) + GPR(RB)\nword_index ← EA[30:31]\nVRT ← (0x00000000000000000000000000000000 || [EA & ~0x3])\nVRT[word_index] ← [EA & ~0x3]", "special_registers": "MSR", "programming_notes": "The lvewx instruction loads a word from memory into a vector register element. Ensure the effective address is aligned to a 4-byte boundary by ANDing with 0xFFFF_FFFF_FFFF_FFFC. This instruction requires the VEC bit in the MSR to be set; otherwise, it raises a Vector_Unavailable exception. Be aware of endianness when placing the byte into the vector register.", "extended_mnemonics": [], "page_found": "Page 296 - 298", "example": "lvewx v1, r4, r5"}
{"mnemonic": "stvebx", "architecture": "PowerISA", "full_name": "Store Vector Element Byte Indexed", "summary": "Stores a byte element from a vector register into memory.", "description": "Stores the byte element from vector register VRS at the position determined by the effective address RA+RB into memory. This instruction is part of the VMX (AltiVec) category and does not update condition registers.", "syntax": "stvebx VRS,RA,RB", "operands": [{"name": "VRS", "desc": "Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00010E", "length": "32", "binary_pattern": "0 | VRS | RA | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "EA ← (RA = 0 ? 0 : GPR(RA)) + GPR(RB)\nbyte_index ← EA[28:31]\n[EA] ← VRS[byte_index]", "special_registers": "MSR", "programming_notes": "Unless bits 60:63 of the address are known to match the byte offset of the subject byte element in VSR[VRS+32], software should use Vector Splat to splat the subject byte element before performing the store.", "extended_mnemonics": [], "page_found": "Page 298 - 300", "example": "stvebx v1, r4, r5"}
{"mnemonic": "lvsl", "architecture": "PowerISA", "full_name": "Load Vector for Shift Left Indexed", "summary": "Loads a vector pattern suitable for shifting left indexed.", "description": "Creates a shift-left permutation pattern based on the effective address (RA+RB) modulo 16 and loads it into VRT. This instruction is part of the VMX (AltiVec) category and is typically used to set up permutation vectors for unaligned vector loads. It does not update condition registers.", "syntax": "lvsl VRT,RA,RB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00000C", "length": "32", "binary_pattern": "31 | VRT | RA | RB | 6 | /", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VMX (AltiVec)", "pseudocode": "EA ← (RA = 0 ? 0 : GPR(RA)) + GPR(RB)\nshift_amount ← EA[28:31]\nVRT ← PermutationPattern(shift_amount, \"shift_left\")", "special_registers": "MSR", "programming_notes": "The lvsl instruction can be used to create a permute control vector for vperm instructions. It is useful for loading and storing unaligned data, as well as rotating or shifting the contents of a VSR.", "extended_mnemonics": [], "page_found": "Page 302 - 304", "example": "lvsl v1, r4, r5"}
{"mnemonic": "vpksdss", "architecture": "PowerISA", "full_name": "Vector Pack Signed Doubleword Signed Saturate", "summary": "Packs signed doublewords from two vector registers into a single vector register with signed saturation.", "description": "The instruction packs the contents of VSR[VRA+32] and VSR[VRB+32] into VSR[VRT+32], saturating signed values if they exceed the range of a 32-bit integer.", "syntax": "vpksdss VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100005CE", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | 1486", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nfor i from 0 to 3 do\n    VSR[VRT+32].word[i] ← si32_CLAMP(EXTS(VSR[VRA+32].dword[i]))\n    if value > 2^31 - 1 then\n        SAT is set to 1\n    else if value < -(2^31) then\n        SAT is set to 1", "special_registers": "VSCR (SAT)", "programming_notes": "This instruction is useful for packing two 64-bit signed integers into a single 128-bit vector, with saturation applied to handle overflow. Ensure that the input vectors are correctly aligned and that the VSCR.SAT flag is checked after execution to determine if any values were saturated. This operation requires vector processing privileges.", "extended_mnemonics": [], "page_found": "Page 306 - 308", "example": "vpksdss v1, v2, v3"}
{"mnemonic": "vupkhsw", "architecture": "PowerISA", "full_name": "Vector Unpack High Signed Word", "summary": "Unpacks the high signed words from a vector register into a doubleword format.", "description": "Unpacks the two high-order signed 32-bit words from vector register VRB into two signed 64-bit doublewords in VRT, sign-extending each word. This instruction is part of the VMX (AltiVec) category and does not update condition registers.", "syntax": "vupkhsw VRT,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000064E", "length": "32", "binary_pattern": "0 | VRT | VRB | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0", "bit_positions": ""}, "extension": "VMX (AltiVec)", "pseudocode": "VRT[0:63] ← EXTS(VRB[0:31])\nVRT[64:127] ← EXTS(VRB[32:63])", "special_registers": null, "programming_notes": "This instruction is used to extract the high signed word from each vector element of VRB and store it in the corresponding doubleword element of VRT. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector Unavailable exception will be raised. The operation is performed on 32-bit elements, so alignment requirements are based on these boundaries.", "extended_mnemonics": [], "page_found": "Page 312 - 314", "example": "vupkhsw v1, v3"}
{"mnemonic": "vsldbi", "architecture": "PowerISA", "full_name": "Vector Shift Left Double by Bit Immediate", "summary": "Shifts the contents of two vector registers left by a specified number of bits and places the result into another vector register.", "description": "The contents of VSR[VRA+32] concatenated with the contents of VSR[VRB+32] are shifted left by SH bits. The result is placed into VSR[VRT+32].", "syntax": "vsldbi VRT,VRA,VRB,SH", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "SH", "desc": "Shift Amount (0-7)"}], "encoding": {"format": "VN-form", "hex_opcode": "0x10000016", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | 0 | SH | 22", "bit_positions": ""}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nvsrc.qword[0] ← VSR[VRA+32]\nvsrc.qword[1] ← VSR[VRB+32]\nVSR[VRT+32] ← vsrc.bit[SH:SH+127]", "special_registers": null, "programming_notes": "This instruction is used to perform a left shift on the concatenated contents of two vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The shift amount (SH) must be within the range of 0 to 127 bits. Be cautious with alignment as the operation involves concatenating and shifting double quadword values.", "extended_mnemonics": [], "page_found": "Page 324 - 326", "example": "vsldbi v1, v2, v3, 3"}
{"mnemonic": "vextuhlx", "architecture": "PowerISA", "full_name": "Vector Extract Unsigned Halfword to GPR using GPR-specified Left-Index", "summary": "Extracts an unsigned halfword from a vector register and places it into a general-purpose register using the left index specified in another general-purpose register.", "description": "The instruction extracts an unsigned halfword from VSR[VRB+32] based on the left index specified in bits 60:63 of GPR[RA]. The extracted halfword is placed into bits 48:63 of GPR[RT], and bits 0:47 of GPR[RT] are set to zero. If the index is greater than 14, the results are undefined.", "syntax": "vextuhlx RT,RA,VRB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "VRB", "desc": "Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000064D", "length": "32", "binary_pattern": "4 | RT | RA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RA].bit[60:63]\nGPR[RT] ← EXTZ64(VSR[VRB+32].byte[index:index+1])\nif index > 14 then\n    undefined", "special_registers": "MSR", "programming_notes": "This instruction is used to extract an unsigned halfword from a vector register into a general-purpose register. Ensure the left index specified in bits 60:63 of GPR[RA] does not exceed 14 to avoid undefined behavior. The result is zero-extended to 64 bits, so only the upper 16 bits of GPR[RT] will contain valid data.", "extended_mnemonics": [], "page_found": "Page 332 - 334", "example": "vextuhlx r3, r4, v3"}
{"mnemonic": "vextdubvlx", "architecture": "PowerISA", "full_name": "Vector Extract Double Unsigned Byte to VSR Using GPR-specified Left-Index VA-form", "summary": "Extracts a double unsigned byte from two vector registers using a left-index specified by a general-purpose register and places it into another vector register.", "description": "The instruction extracts a double unsigned byte from the concatenation of two vector registers (VRA+32 and VRB+32) based on an index derived from bits 59:63 of GPR[RC]. The extracted byte is zero-extended and placed into the first doubleword of VSR[VRT+32], while the second doubleword is set to zero.", "syntax": "vextdubvlx VRT,VRA,VRB,RC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "RC", "desc": "General Purpose Register containing the index"}, {"name": "VD", "desc": "Destination Vector Register"}, {"name": "VS", "desc": "Source Vector Register"}, {"name": "VSRA", "desc": "Index Source Vector Register"}], "encoding": {"format": "VA-form", "hex_opcode": "0x10000018", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | RC", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RC].bit[59:63]\nvsrc.qword[0] ← VSR[VRA+32]\nvsrc.qword[1] ← VSR[VRB+32]\nVSR[VRT+32].dword[0] ← EXTZ64(vsrc.byte[index])\nVSR[VRT+32].dword[1] ← 0x0000_0000_0000_0000", "special_registers": "N/A", "programming_notes": "This instruction is useful for extracting a specific byte from two concatenated vector registers and placing it into the first doubleword of another VSR, with the second doubleword zeroed. Ensure that the index derived from GPR[RC] bits 59:63 is within bounds to avoid undefined behavior. The instruction requires the Vector Facility to be enabled; otherwise, a Vector_Unavailable exception will be raised.", "extended_mnemonics": [], "page_found": "Page 334 - 336", "example": "vextdubvlx v1, v2, v3, r6"}
{"mnemonic": "crnor", "architecture": "PowerISA", "full_name": "Condition Register NOR XL-form", "summary": "Performs a bitwise NOR operation on the specified bits of the Condition Registers and stores the result in another bit of the Condition Register.", "description": "The bit in the Condition Register specified by BA+32 is ORed with the bit in the Condition Register specified by BB+32, and the complemented result is placed into the bit in the Condition Register specified by BT+32.", "syntax": "crnor BT,BA,BB", "operands": [{"name": "BT", "desc": "Target Condition Register Bit"}, {"name": "BA", "desc": "Source Condition Register Bit"}, {"name": "BB", "desc": "Source Condition Register Bit"}], "encoding": {"format": "XL-form", "hex_opcode": "0x4C000042", "length": "32", "binary_pattern": "0 | BT | BA | BB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Base", "pseudocode": "CRBT+32 ←¬(CRBA+32 | CRBB+32)", "special_registers": "CR", "programming_notes": "The crnor instruction performs a bitwise OR operation on two condition register bits, then complements the result and stores it in another condition register bit. Ensure that the BA, BB, and BT fields are correctly set to avoid unintended behavior. This instruction operates at user privilege level.", "extended_mnemonics": [{"mnemonic": "crnot", "equivalent_to": "crnor Bx,By,By"}, {"mnemonic": "crset", "equivalent_to": "creqv Bx,Bx,Bx"}], "page_found": "Page 79 - 80", "example": "crnor 0, 1, 2"}
{"mnemonic": "lhax", "architecture": "PowerISA", "full_name": "Load Halfword Algebraic Indexed X-form", "summary": "Loads a halfword from memory into a register and extends it to a full word, with indexed addressing.", "description": "The effective address (EA) is the sum of the contents of registers RA and RB. The halfword in storage addressed by EA is loaded into RT48:63, and RT0:47 are filled with a copy of bit 0 of the loaded halfword.", "syntax": "lhax RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Base General Purpose Register"}, {"name": "RB", "desc": "Index General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0002AE", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Base", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + (RB)\nRT ← EXTS(MEM(EA, 2))", "special_registers": "", "programming_notes": "The lhax instruction is commonly used for loading a signed halfword from memory into the upper half of a register. Ensure that RA and RB are correctly set to avoid incorrect effective address calculation. This instruction requires the operands to be properly aligned; accessing unaligned data can lead to exceptions. The result is sign-extended, so be cautious when interpreting the value in RT.", "extended_mnemonics": [], "page_found": "Page 87 - 88", "example": "lhax r3, r4, r5"}
{"mnemonic": "lwax", "architecture": "PowerISA", "full_name": "Load Word Algebraic Indexed X-form", "summary": "Loads a word from memory into a register using an indexed address.", "description": "Loads a 32-bit signed word from memory at address RA+RB, sign-extends it to 64 bits, and stores the result in GPR RT. This instruction is part of the Base category and does not update condition registers or the XER.", "syntax": "lwax RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register (base address)"}, {"name": "RB", "desc": "Source General Purpose Register (offset)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0002AA", "length": "32", "binary_pattern": "0 | RT | RA | DS | 2", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "Base", "pseudocode": "EA ← (RA = 0 ? 0 : GPR(RA)) + GPR(RB)\nGPR(RT) ← EXTS([EA])", "special_registers": "", "programming_notes": "The lwax instruction is commonly used for loading a word from memory into a register using an indexed addressing mode. Ensure that the base address in RA is properly aligned to avoid misaligned access exceptions. This instruction operates at user privilege level and can raise an exception if the EA is out of bounds or if there are memory protection violations.", "extended_mnemonics": [], "page_found": "Page 89 - 90", "example": "lwax r3, r4, r5"}
{"mnemonic": "stdx", "architecture": "PowerISA", "full_name": "Store Doubleword Indexed X-form", "summary": "Stores a doubleword from a register to memory using an indexed address.", "description": "Stores a doubleword (64 bits) from register RS to memory at the address formed by adding the contents of RA and RB. The effective address is calculated as (RA|0) + RB. No condition registers or status fields are modified by this instruction.", "syntax": "stdx RS,RA,RB", "operands": [{"name": "RS", "desc": "Source General Purpose Register"}, {"name": "RA", "desc": "Base Address General Purpose Register"}, {"name": "RB", "desc": "Index General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00012A", "length": "32", "binary_pattern": "62 | RS | RA | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Base", "pseudocode": "EA ← (RA|0) + RB\n[EA] ← RS[0:63]", "special_registers": "", "programming_notes": "The stdx instruction is commonly used for storing a doubleword from a register into memory at an address derived from the sum of two registers. Ensure that RA and RB are correctly set to avoid incorrect memory addresses. This instruction operates in user mode and can raise exceptions if there's a protection fault or alignment error.", "extended_mnemonics": [], "page_found": "Page 95 - 96", "example": "stdx r3, r4, r5"}
{"mnemonic": "addex", "architecture": "PowerISA", "full_name": "Add Extended using alternate carry bit", "summary": "Adds the contents of two registers and an alternate carry bit, updating the condition register.", "description": "For addex, the sum of the contents of register RA, RB, and CY is placed into register RT. If CY=0, the sum (RA) + (RB) + OV is placed into register RT. For CY=0, OV is set to 1 if there is a carry out of bit 0 of the sum in 64-bit mode or there is a carry out of bit 32 of the sum in 32-bit mode, and set to 0 otherwise. OV32 is set to 1 if there is a carry out of bit 32 of the sum.", "syntax": "addex RT,RA,RB,CY", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}, {"name": "CY", "desc": "Alternate Carry Bit"}], "encoding": {"format": "XO-form", "hex_opcode": "0x7C000154", "length": "32", "binary_pattern": "31 | RT | RA | RB | CY | 170", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:22 | 23:31"}, "extension": "Base", "pseudocode": "if CY=0 then\n    RT ← (RA) + (RB) + OV", "special_registers": "CR0, XER", "programming_notes": "An addc-equivalent instruction using OV is not provided. An equivalent capability can be emulated by first initializing OV to 0, then using addex. OV can be initialized to 0 using subfo, subtracting any operand from itself.", "extended_mnemonics": [], "page_found": "Page 113 - 114", "example": "addex r3, r4, r5, 1"}
{"mnemonic": "maddhd", "architecture": "PowerISA", "full_name": "Multiply-Add High Doubleword", "summary": "Multiplies two 64-bit operands and adds the result to a third 64-bit operand, placing the high-order 64 bits of the sum into a target register.", "description": "The 64-bit operands (RA) and (RB) are multiplied to produce a 128-bit product. This product is then added to the 64-bit operand (RC). The high-order 64 bits of the resulting sum are placed into register RT.", "syntax": "maddhd RT,RA,RB,RC", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}, {"name": "RC", "desc": "Source General Purpose Register"}], "encoding": {"format": "VA-form", "hex_opcode": "0x10000030", "length": "32", "binary_pattern": "0 | RT | RA | RB | RC", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "Base", "pseudocode": "prod0:127 ← (RA) × (RB)\nsum0:127 ← prod + EXTS(RC)\nRT ← sum0:63", "special_registers": "N/A", "programming_notes": "The maddhd instruction is useful for performing high-precision arithmetic operations where the product of two 64-bit numbers needs to be added to another 64-bit number, and only the high-order bits of the result are required. Ensure that the operands are correctly aligned and consider the potential for overflow in the intermediate product before adding RC. This instruction operates at a privilege level that allows it to be used in both user and supervisor modes.", "extended_mnemonics": [], "page_found": "Page 121 - 122", "example": "maddhd r3, r4, r5, r6"}
{"mnemonic": "popcntb", "architecture": "PowerISA", "full_name": "Population Count Bytes", "summary": "Counts the number of one bits in each byte of a register.", "description": "A count of the number of one bits in each byte of register RS is placed into the corresponding byte of register RA. This number ranges from 0 to 8, inclusive.", "syntax": "popcntb RA,RS", "operands": [{"name": "RA", "desc": "Target General Purpose Register"}, {"name": "RS", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0000F4", "length": "32", "binary_pattern": "31 | RS | RA | /// | 122 | /", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Base", "pseudocode": "for i = 0 to 7\n    n ← 0\n    for j = 0 to 7\n        if (RS)(i×8)+j = 1 then\n            n ← n+1\n    RA(i×8):(i×8)+7 ← n", "special_registers": "N/A", "extended_mnemonics": [], "page_found": "Page 137 - 138", "example": "popcntb r4, r3"}
{"mnemonic": "rldcr", "architecture": "PowerISA", "full_name": "Rotate Left Doubleword then Clear Right", "summary": "Rotates the contents of register RS left by a variable number of bits specified by (RB)58:63, and clears the rightmost bits.", "description": "The contents of register RS are rotated 64 bits to the left by the number of bits specified by (RB)58:63. A mask is generated having 1-bits from bit 0 through bit ME and 0-bits elsewhere. The rotated data are ANDed with the generated mask, and the result is placed into register RA.", "syntax": "rldcr RT,RS,RB,ME", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RS", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}, {"name": "ME", "desc": "Mask End bit position"}], "encoding": {"format": "MDS-form", "hex_opcode": "0x78000012", "length": "32", "binary_pattern": "0 | RS | RA | RB | ME | 9 | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:26 | 27:30 | 31"}, "extension": "Base", "pseudocode": "if 'rldcr' then\n    n ← (RB)58:63\n    r ← ROTL64((RS), n)\n    ME ← me5 || me0:4\n    m ← MASK(0, ME)\n    RA ← r & m\nif 'rldcr.' then\n    CR0 <- updated based on result", "special_registers": "CR0 (if Rc=1)", "programming_notes": "rldcr can be used to extract an n-bit field that starts at variable bit position b in register RS, left-justified RA), by setting RB58:63=b and ME=n-1. It can also be used to rotate the contents of a register left (right) by variable n bits, by setting RB58:63=n (64-n) and ME=63.", "extended_mnemonics": ["insrdi RA,RS,b,n"], "page_found": "Page 147 - 148", "example": "rldcr r3, r3, r5, 31"}
{"mnemonic": "extswsli", "architecture": "PowerISA", "full_name": "Extend Sign Word and Shift Left Immediate", "summary": "Sign-extends the low-order 32 bits of a register, shifts it left by SH bits, and places the result in another register.", "description": "The contents of the low order 32 bits of RS are sign-extended to 64 bits and then shifted left SH bits. Bits shifted out of bit 0 are lost. Zeros are supplied to vacated bits on the right. The result is placed in register RA.", "syntax": "extswsli RA,RS,SH", "operands": [{"name": "RA", "desc": "Target General Purpose Register"}, {"name": "RS", "desc": "Source General Purpose Register"}, {"name": "SH", "desc": "Shift Amount (0-31)"}], "encoding": {"format": "XS-form", "hex_opcode": "0x7C0006F4", "length": "32", "binary_pattern": "RS | RA | SH | 445 | Rc", "bit_positions": "6:10 | 11:15 | 16:20 | 21:29 | 30:31"}, "extension": "Base", "pseudocode": "SH ← sh5 || sh0:4\nr  ← ROTL64(EXTS64(RS32:63), SH)\nm  ← MASK(0, 63-SH)\nRA ← r & m", "special_registers": "CR0", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "extended_mnemonics": [], "page_found": "Page 151 - 152", "example": "extswsli r4, r3, 3"}
{"mnemonic": "brh", "architecture": "PowerISA", "full_name": "Byte-Reverse Halfword", "summary": "Reverses the byte order of a halfword in a register.", "description": "The contents of bits 0:15 of register RS are placed into bits 0:15 of register RA in byte-reversed order. The contents of bits 16:31 of register RS are placed into bits 16:31 of register RA in byte-reversed order.", "syntax": "brh RA,RS", "operands": [{"name": "RA", "desc": "Target General Purpose Register"}, {"name": "RS", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0001B6", "length": "32", "binary_pattern": "0 | RS | RA | 6 | 11 | 16 | 21", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "extension": "Base", "pseudocode": "RA ← (RS)8:15 || (RS)0:7\n         (RS)24:31 || (RS)16:23", "special_registers": null, "programming_notes": "The brh instruction is useful for reversing the byte order of 16-bit halves within a 32-bit register. Ensure that the source and destination registers are correctly specified to avoid data corruption. This operation does not require any special privileges or alignment considerations.", "extended_mnemonics": [], "page_found": "Page 153 - 154", "example": "brh r4, r3"}
{"mnemonic": "pnop", "architecture": "PowerISA", "full_name": "Prefixed No-Operation Instruction", "summary": "No operation is performed.", "description": "A prefixed 64-bit no-operation instruction that performs no operation and has no side effects. This instruction is available in the Prefixed instruction set extension and occupies 64 bits in memory.", "syntax": "pnop", "operands": [], "encoding": {"format": "*-form", "hex_opcode": "0x07000000", "length": "64", "binary_pattern": "1 | 3 | 0 | /// | 0", "bit_positions": ""}, "extension": "Prefixed", "pseudocode": "No operation is performed.", "special_registers": null, "programming_notes": "The pnop instruction behaves as a b $+8 instruction regardless of its suffix. However, it does not cause any side effects such as modification of the Come From Address Register. If the value in the suffix of a pnop instruction corresponds to a Branch instruction, an rfebb instruction, a context synchronizing instruction other than isync, or a “Service Processor Attention” instruction, the instruction form is invalid.", "extended_mnemonics": [], "page_found": "Page 167 - 168", "example": "pnop"}
{"mnemonic": "lfd", "architecture": "PowerISA", "full_name": "Load Floating-Point Double D-form", "summary": "Loads a double-precision floating-point value from memory into a floating-point register.", "description": "The instruction loads the doubleword in storage addressed by EA into register FRT. The effective address (EA) is the sum of the contents of register RA, or the value 0 if RA=0, and the value D, sign-extended to 64 bits.", "syntax": "lfd FRT,D(RA)", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "D", "desc": "16-bit signed displacement"}], "encoding": {"format": "D-form", "hex_opcode": "0xC8000000", "length": "32", "binary_pattern": "0 | FRT | RA | D", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Floating-Point", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + EXTS64(D)\nFRT ← MEM(EA, 8)", "special_registers": "N/A", "programming_notes": "The lfd instruction is commonly used to load double-precision floating-point numbers from memory into a floating-point register. Ensure that the address specified by RA and D is properly aligned on an 8-byte boundary to avoid alignment exceptions. This instruction operates at user privilege level, so no special privileges are required.", "extended_mnemonics": [], "page_found": "Page 187 - 188", "example": "lfd f1, 0(r4)"}
{"mnemonic": "stfs", "architecture": "PowerISA", "full_name": "Store Floating-Point Single D-form", "summary": "Stores a single-precision floating-point value from an FPR to memory.", "description": "The contents of register FRS are converted to single format and stored into the word in storage addressed by EA. The effective address (EA) is the sum of the contents of register RA, or the value 0 if RA=0, and the value D, sign-extended to 64 bits.", "syntax": "stfs FRS,D(RA)", "operands": [{"name": "FRS", "desc": "Source Floating-Point Register"}, {"name": "D", "desc": "Displacement field"}, {"name": "RA", "desc": "Base General Purpose Register"}], "encoding": {"format": "DS-form", "hex_opcode": "0xD0000000", "length": "32", "binary_pattern": "101000 | FRS | D | RA", "bit_positions": ""}, "extension": "Floating-Point", "pseudocode": "EA ← (RA|0) + EXTS64(D)\nMEM(EA, 4) ← SINGLE((FRS))", "special_registers": "FPSCR", "programming_notes": "The stfs instruction stores a single-precision floating-point value from FRS into memory. Ensure that the destination address is properly aligned to avoid alignment faults. The instruction operates at user privilege level and may raise an exception if the EA exceeds the storage limits or if there are access violations.", "extended_mnemonics": [], "page_found": "Page 189 - 190", "example": "stfs f1, 0(r4)"}
{"mnemonic": "stfd", "architecture": "PowerISA", "full_name": "Store Floating-Point Double D-form", "summary": "Stores a double-precision floating-point value from a register to memory.", "description": "The contents of the specified floating-point register (FRS) are stored into the double-word in storage addressed by the effective address (EA). The EA is calculated as the sum of the contents of register RA or 0 if RA=0, and the sign-extended value D.", "syntax": "stfd FRS,D(RA)", "operands": [{"name": "FRS", "desc": "Floating-point Source Register"}, {"name": "D", "desc": "16-bit signed displacement"}, {"name": "RA", "desc": "Base General Purpose Register"}], "encoding": {"format": "D-form", "hex_opcode": "0xD8000000", "length": "32", "binary_pattern": "0 | FRS | RA | D", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Floating-Point", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + EXTS64(D)\nMEM(EA, 8) ← (FRS)", "special_registers": "FPSCR", "programming_notes": "The stfd instruction stores a double-precision floating-point value from a specified register into memory. Ensure the destination address is properly aligned to avoid alignment faults. The effective address is calculated by adding the base address in RA (or zero if RA is 0) and the sign-extended displacement D. This instruction operates at user privilege level.", "extended_mnemonics": [], "page_found": "Page 191 - 192", "example": "stfd f1, 0(r4)"}
{"mnemonic": "lfdp", "architecture": "PowerISA", "full_name": "Load Floating-Point Double Pair", "summary": "Loads a doubleword-pair from storage into an even-odd pair of FPRs.", "description": "For lfdp, the doubleword-pair in storage addressed by EA is loaded into an even-odd pair of FPRs with the even-numbered FPR being loaded with the leftmost doubleword from storage and the odd-numbered FPR being loaded with the rightmost doubleword.", "syntax": "lfdp FRTp,disp(RA)", "operands": [{"name": "FRTp", "desc": "Target Floating-Point Register Pair"}, {"name": "RA", "desc": "Base General Purpose Register"}, {"name": "disp", "desc": "Displacement"}], "encoding": {"format": "DS-form", "hex_opcode": "0xE4000000", "length": "32", "binary_pattern": "0 | FRTp | RA | DS | 0", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "Floating-Point", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + EXTS(DS || 0b00)\nFRTpeven ← MEM(EA, 8)\nFRTpodd ← MEM(EA + 8, 8)", "special_registers": "N/A", "programming_notes": "The instructions described in this section should not be used to access an operand in DFP Extended format when the processor is in Little-Endian mode.", "extended_mnemonics": [], "page_found": "Page 193 - 194", "example": "lfdp f2, disp(RA)"}
{"mnemonic": "fctidu", "architecture": "PowerISA", "full_name": "Floating Convert with round Double-Precision To Unsigned Doubleword format", "summary": "Converts a double-precision floating-point value to an unsigned 64-bit integer using rounding.", "description": "Let src be the double-precision floating-point value in FRB. If src is a NaN, then the result is 0x0000_0000_0000_0000, VXCVI is set to 1, and if src is an SNaN, VXSNAN is set to 1. Otherwise, src is rounded to a floating-point integer using the rounding mode specified by RN. If the rounded value is greater than 264-1, then the result is 0xFFFF_FFFF_FFFF_FFFF, and VXCVI is set to 1. Otherwise, if the rounded value is less than 0, then the result is 0x0000_0000_0000_0000, and VXCVI is set to 1. Otherwise, the result is the rounded value converted to 64-bit unsigned-integer format, and XX is set to 1 if the result is inexact.", "syntax": "fctidu FRT,FRB", "operands": [{"name": "FRT", "desc": "Target Floating Point Register"}, {"name": "FRB", "desc": "Source Floating Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC00075C", "length": "32", "binary_pattern": "63 | FRT | / | FRB | 942 | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Floating-Point", "pseudocode": "if src is a NaN then\n    FRT <- 0x0000_0000_0000_0000\n    VXCVI <- 1\n    if src is an SNaN then VXSNAN <- 1\nelse\n    rounded_value <- round(src, RN)\n    if rounded_value > 264-1 then\n        FRT <- 0xFFFF_FFFF_FFFF_FFFF\n        VXCVI <- 1\n    else if rounded_value < 0 then\n        FRT <- 0x0000_0000_0000_0000\n        VXCVI <- 1\n    else\n        FRT <- convert_to_unsigned_integer(rounded_value)\n        XX <- is_inexact(FRT)\nif not enabled Invalid Operation Exception then\n    place result into FRT", "special_registers": "FPSCR, (FR, FI, FX, XX, VXSNAN, VXCVI), CR1, (if, Rc=1), CR0", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": [], "page_found": "Page 207 - 208", "example": "fctidu f1, f3"}
{"mnemonic": "fctiwu", "architecture": "PowerISA", "full_name": "Floating Convert with round Double-Precision To Unsigned Word format", "summary": "Converts a double-precision floating-point value to an unsigned integer using rounding.", "description": "The instruction converts the double-precision floating-point value in FRB to an unsigned integer using the rounding mode specified by RN. If the result is out of range, it sets VXCVI and returns 0xFFFF_FFFF or 0x0000_0000. The result is placed into FRT32:63 and FRT0:31 is undefined.", "syntax": "fctiwu FRT,FRB", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC00011C", "length": "32", "binary_pattern": "0 | FRT | FRB | Rc", "bit_positions": "0:5 | 6:10 | 11:30 | 31"}, "extension": "Floating-Point", "pseudocode": "if src is NaN then\n    result <- 0x0000_0000\n    VXCVI <- 1\n    if src is SNaN then VXSNAN <- 1\nelse\n    rounded_value <- round(src, RN)\n    if rounded_value > 2^32 - 1 then\n        result <- 0xFFFF_FFFF\n        VXCVI <- 1\n    else if rounded_value < 0 then\n        result <- 0x0000_0000\n        VXCVI <- 1\n    else\n        result <- convert_to_unsigned_int(rounded_value)\n        XX <- is_inexact(result)\nFRT32:63 <- result\nFRT0:31 is undefined", "special_registers": "FPSCR, (FR, FI, FX, XX, VXSNAN, VXCVI), CR1, (if, Rc=1), CR0", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": [], "page_found": "Page 209 - 210", "example": "fctiwu f1, f3"}
{"mnemonic": "frip", "architecture": "PowerISA", "full_name": "Floating Round to Integer Plus", "summary": "Rounds a floating-point operand towards +infinity and places the result into a register.", "description": "The floating-point operand in register FRB is rounded to an integral value using the rounding mode round toward +infinity, and the result is placed into register FRT. FPRF is set to the class and sign of the result, except for Invalid Operation Exceptions when VE=1.", "syntax": "frip FRT,FRB", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000390", "length": "32", "binary_pattern": "0 | FRT | FRB | Rc", "bit_positions": "0:5 | 6:10 | 11:30 | 31"}, "extension": "Floating-Point", "pseudocode": "if 'frip' then\n    FRT <- round_towards_plus_infinity(FRB)\nelse if 'frip.' then\n    FRT <- round_towards_plus_infinity(FRB)\n    update_CR1_based_on_result(FRT)", "special_registers": "FPSCR, CR, CR0", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": [], "page_found": "Page 213 - 214", "example": "frip f1, f3"}
{"mnemonic": "mffsl", "architecture": "PowerISA", "full_name": "Move From FPSCR Lightweight", "summary": "Moves the control and non-sticky status bits from the FPSCR to a general-purpose register.", "description": "The contents of the control bits in the FPSCR (bits 29:31) and the non-sticky status bits (bits 45:51) are placed into the corresponding bits in register FRT. All other bits in register FRT are set to 0.", "syntax": "mffsl FRT", "operands": [{"name": "FRT", "desc": "Target General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC00048E", "length": "32", "binary_pattern": "63 | FRT | /// | 0", "bit_positions": "0:5 | 6:10 | 11:30 | 31"}, "extension": "Floating-Point", "pseudocode": "FRT <- (FPSCR[29:31] || FPSCR[45:51])", "special_registers": "FPSCR", "programming_notes": "mffsl permits software to read the control and non-sticky status bits in the FPSCR without the higher latency typically associated with accessing the sticky status bits.", "extended_mnemonics": [], "page_found": "Page 219 - 220", "example": "mffsl f1"}
{"mnemonic": "dtstdc", "architecture": "PowerISA", "full_name": "Test Data Class", "summary": "Tests the data class of a DFP operand and sets the CR field.", "description": "Tests the data class of the DFP operand in FRA against the data class mask DCM and stores the test result in condition register field BF. The instruction sets CR field BF based on whether FRA belongs to any of the classes specified by the 8-bit mask DCM. This is a Decimal Floating-Point instruction that requires the DFP category.", "syntax": "dtstdc BF,FRA,DCM", "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "FRA", "desc": "Floating-Point Register A"}, {"name": "DCM", "desc": "Data Class Mask"}], "encoding": {"format": "Z22-form", "hex_opcode": "0xEC000184", "length": "32", "binary_pattern": "0 | BF | FRA | DCM | 194", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:31"}, "extension": "Decimal Floating-Point", "pseudocode": "if (FRA matches any data class in DCM) then\n  CR[BF] ← 0b0010\nelse\n  CR[BF] ← 0b0000", "special_registers": "CR, FPSCR", "programming_notes": "The dtstdc instruction is used to test the data class of a decimal floating-point operand against a specified mask. Ensure that the DFP operand is correctly aligned and that the DCM mask accurately reflects the desired data classes for testing. The instruction updates the CR field BF and FPSCR FPCC based on the sign and data class match, which can be used in conditional logic within your program.", "extended_mnemonics": [], "page_found": "Page 245 - 246", "example": "dtstdc cr0, f2, 0"}
{"mnemonic": "dtstsf", "architecture": "PowerISA", "full_name": "Decimal Floating-Point Test Significance Single", "summary": "Tests the significance of a DFP value in FPR[FRB] against a reference significance.", "description": "Compares the number of significant digits (NSDb) of the DFP value in FPR[FRB] with the reference significance specified by bits 58:63 of FPR[FRA]. The result is placed into CR field BF and FPCC.", "syntax": "dtstsf BF,FRA,FRB", "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "FRA", "desc": "Floating-Point Register A"}, {"name": "FRB", "desc": "Floating-Point Register B"}], "encoding": {"format": "X-form", "hex_opcode": "0xEC000544", "length": "32", "binary_pattern": "0 | BF | FRA | FRB", "bit_positions": "0:5 | 6:8 | 9:10 | 11:31"}, "extension": "Decimal Floating-Point", "pseudocode": "let k be the contents of bits 58:63 of FPR[FRA]\nlet NSDb be the number of significant digits of the DFP value in FPR[FRB]\nif k != 0 and k < NSDb then\n    CR field BF <- 0b0010\n    FPCC <- 0b0010\nelse if k != 0 and k > NSDb, or k = 0 then\n    CR field BF <- 0b0100\n    FPCC <- 0b0100\nelse if k != 0 and k = NSDb then\n    CR field BF <- 0b1000\n    FPCC <- 0b1000\nelse\n    CR field BF <- 0b0001\n    FPCC <- 0b0001", "special_registers": "CR, FPSCR", "programming_notes": "The dtstsf instruction is used to compare the number of significant digits in a decimal floating-point value with a reference significance. Ensure that the FPR registers are correctly aligned and initialized before use. The instruction modifies both CR and FPSCR, so check these registers after execution for the comparison result. This instruction operates at user privilege level but may raise exceptions if the input values are invalid or out of range.", "extended_mnemonics": [], "page_found": "Page 247 - 248", "example": "dtstsf cr0, f2, f3"}
{"mnemonic": "dquai", "architecture": "PowerISA", "full_name": "DFP Quantize Immediate", "summary": "Adjusts the value to a form having the specified exponent in the range -16 to 15.", "description": "The DFP operand in FRB is converted and rounded to the form with the exponent specified by TE based on the rounding mode specified in the RMC field. The result of that form is placed in FRT. The sign of the result is the same as the sign of the operand in FRB.", "syntax": "dquai TE,FRT,FRB,RMC", "operands": [{"name": "TE", "desc": "Target Exponent"}, {"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}, {"name": "RMC", "desc": "Rounding Mode Control"}], "encoding": {"format": "Z23-form", "hex_opcode": "0xEC000086", "length": "32", "binary_pattern": "0 | FRT | TE | FRB | RMC | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Decimal Floating-Point", "pseudocode": "if 'dquai' then\n    FRT <- (FRB) adjusted to exponent TE with rounding based on RMC\n    if result would cause overflow from the most significant digit, then\n        FRT <- default QNaN\n    else\n        FRT <- adjusted value (left shifted with matching exponent)\nif 'dquai.' then\n    FRT <- (FRB) adjusted to exponent TE with rounding based on RMC\n    if result would cause overflow from the most significant digit, then\n        FRT <- default QNaN\n    else\n        FRT <- adjusted value (left shifted with matching exponent)\n    CR1 <- updated", "special_registers": "FPSCR(FPRF, FR, FI, FX, XX, VXSNAN, VXCVI), CR(CR1), CR0", "programming_notes": "DFP Quantize Immediate can be used to adjust values to a form having the specified exponent in the range -16 to 15. If the adjustment requires the significand to be shifted left, then: if the result would cause overflow from the most significant digit, the result is a default QNaN; otherwise the result is the adjusted value (left shifted with matching exponent). If the adjustment requires the significand to be shifted right, the result is rounded based on the value of the RMC field.", "extended_mnemonics": ["dquai", "dquai."], "page_found": "Page 249 - 250", "example": "dquai te, f1, f3, 0"}
{"mnemonic": "ctfix", "architecture": "PowerISA", "full_name": "Convert To Fixed", "summary": "Converts a decimal floating-point value to a fixed-point integer.", "description": "Converts a Decimal Floating-Point value in FRA to a fixed-point integer representation and stores the result in FRT. This instruction requires the Decimal Floating-Point category and may set exception flags in FPSCR if conversion fails or overflow/underflow occurs.", "syntax": "ctfix FRT,FRA", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRA", "desc": "Source Floating-Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xEC000000", "length": "32", "binary_pattern": "10011000 | FRT | FRA | 0000000000000000", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Decimal Floating-Point", "pseudocode": "FRT ← convert_dfp_to_fixed(FRA)\n# FPSCR exception flags updated as needed", "special_registers": "FI, FR, VXCVI, VXSNAN, XX, FPSCR", "programming_notes": "The ctfix instruction is used to convert floating-point numbers to fixed-point integers. Ensure the source operand is properly aligned and within valid range to avoid exceptions. Be cautious of rounding modes as they can affect the result significantly. This instruction operates at user privilege level but may trigger exceptions like inexact conversion or invalid operations, which need to be handled appropriately.", "extended_mnemonics": [], "page_found": "Page 264 - 265", "example": "ctfix f1, f2"}
{"mnemonic": "stvehx", "architecture": "PowerISA", "full_name": "Store Vector Element Halfword Indexed X-form", "summary": "Stores a halfword element from a vector register to memory.", "description": "Stores a halfword (16 bits) element from vector register VRS to memory at the indexed address (RA|0) + RB. The element is selected based on the least significant bits of the effective address to determine alignment. This is a VMX/AltiVec instruction that accesses memory with vector element granularity.", "syntax": "stvehx VRS,RA,RB", "operands": [{"name": "VRS", "desc": "Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00014E", "length": "32", "binary_pattern": "011111 | VRS | RA | RB | 00101 | 00111 | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "extension": "VMX (AltiVec)", "pseudocode": "EA ← (RA|0) + RB\nelement_index ← EA[61:62]\n[EA & ~0x1] ← VRS[element_index * 16 : element_index * 16 + 15]", "special_registers": "N/A", "programming_notes": "Unless bits 60:62 of the address are known to match the halfword offset of the subject halfword element in VSR[VRS+32], software should use Vector Splat to splat the subject halfword element before performing the store.", "extended_mnemonics": [], "page_found": "Page 299 - 300", "example": "stvehx v1, r4, r5"}
{"mnemonic": "vpkudum", "architecture": "PowerISA", "full_name": "Vector Pack Unsigned Doubleword Modulo", "summary": "Packs the upper halves of doublewords from two source vectors into a destination vector.", "description": "Packs unsigned doubleword elements from source vectors VRA and VRB into a destination vector VRT by selecting the upper halves of each doubleword and concatenating them in pack order. This VMX/AltiVec instruction performs modulo packing without saturation and operates on 64-bit elements.", "syntax": "vpkudum VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000044E", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB | 1102", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "VRT[0:63] ← VRA[0:63]\nVRT[64:127] ← VRB[0:63]", "special_registers": "MSR", "programming_notes": "This instruction is used for packing the upper halves of doublewords from two source vectors into a destination vector. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set; otherwise, a Vector Unavailable exception will be raised. The operation processes each element independently, so there are no ordering requirements between elements, but alignment of input vectors to doubleword boundaries is recommended for optimal performance.", "extended_mnemonics": [], "page_found": "Page 309 - 310", "example": "vpkudum v1, v2, v3"}
{"mnemonic": "vslv", "architecture": "PowerISA", "full_name": "Vector Shift Left Variable", "summary": "Shifts the contents of vector elements left by a variable amount.", "description": "Shifts each element of the source vector left by a variable amount specified in the corresponding element of the shift amount vector. The shift amount for each element is taken from the least significant bits of the corresponding element in VRB. No status flags are affected.", "syntax": "vslv VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Shift Amount Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000744", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB | 1860", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "for i in 0 to 15 do\n  shamt ← (VRB[i*8:(i+1)*8-1]) & 0x7\n  VRT[i*8:(i+1)*8-1] ← VRA[i*8:(i+1)*8-1] << shamt\nend for", "special_registers": "N/A", "programming_notes": "The vslv instruction is used to perform variable left shifts on each byte of a vector register. Ensure that the shift amounts in VSR[VRB+32] are within the valid range (0-7) to avoid unexpected results. This instruction operates at user privilege level and will raise an exception if the Vector Facility is not enabled.", "extended_mnemonics": [], "page_found": "Page 327 - 328", "example": "vslv v1, v2, v3"}
{"mnemonic": "vsrv", "architecture": "PowerISA", "full_name": "Vector Shift Right Variable", "summary": "Shifts each element of the source vector right by a variable amount specified in another vector.", "description": "Shifts each element of the source vector right by a variable amount specified in the corresponding element of the shift count vector. The shift amount for each element is taken from the least significant bits of the corresponding element in VRB. No status flags are affected.", "syntax": "vsrv vTMP1, vSRC, vSHCT1", "operands": [{"name": "vTMP1", "desc": "Destination Vector Register"}, {"name": "vSRC", "desc": "Source Vector Register"}, {"name": "vSHCT1", "desc": "Shift Count Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x10000704", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB | 1796", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "for i in 0 to 15 do\n  shamt ← (VRB[i*8:(i+1)*8-1]) & 0x7\n  VRT[i*8:(i+1)*8-1] ← VRA[i*8:(i+1)*8-1] >> shamt\nend for", "special_registers": "N/A", "programming_notes": "The vsrv instruction shifts each element of the source vector right by a variable amount specified in another vector. Ensure that the shift amounts are within the range of 0 to 127 to avoid undefined behavior. This instruction operates at user privilege level and does not generate exceptions for normal operation.", "extended_mnemonics": [], "page_found": "Page 328 - 329", "example": "vsrv vtmp1, vsrc, vshct1"}
{"mnemonic": "vextublx", "architecture": "PowerISA", "full_name": "Vector Extract Unsigned Byte to GPR using GPR-specified Left-Index VX-form", "summary": "Extracts an unsigned byte from a vector register and places it into a general-purpose register using the left-index specified in another general-purpose register.", "description": "The contents of byte element index of VSR[VRB+32] are placed into bits 56:63 of GPR[RT], where index is the contents of bits 60:63 of GPR[RA]. The contents of bits 0:55 of GPR[RT] are set to 0.", "syntax": "vextublx RT,RA,VRB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register containing the index"}, {"name": "VRB", "desc": "Vector Register B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "RB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000060D", "length": "32", "binary_pattern": "0 | RT | RA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RA].bit[60:63]\nGPR[RT] ← EXTZ64(VSR[VRB+32].byte[index])\n// The contents of bits 0:55 of GPR[RT] are set to 0.", "special_registers": "N/A", "programming_notes": "This instruction extracts an unsigned byte from a vector register and places it into the upper 8 bits of a general-purpose register, zeroing out the lower 56 bits. Ensure that the index in GPR[RA] is within bounds (0-15) to avoid undefined behavior. This operation requires the Vector Facility to be enabled; otherwise, a Vector Unavailable exception will occur.", "extended_mnemonics": [], "page_found": "Page 331 - 332", "example": "vextublx r3, r4, v3"}
{"mnemonic": "vextuwlx", "architecture": "PowerISA", "full_name": "Vector Extract Unsigned Word to GPR using GPR-specified Left-Index VX-form", "summary": "Extracts an unsigned word from a vector register and places it into a general-purpose register.", "description": "The instruction extracts an unsigned word from the specified byte index in VSR[VRB+32] and places it into bits 32:63 of GPR[RT]. The contents of bits 0:31 of GPR[RT] are set to 0. If MSR.VEC=0, a Vector_Unavailable() exception is raised.", "syntax": "vextuwlx RT,RA,VRB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register (contains the index)"}, {"name": "VRB", "desc": "Vector Register B"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000068D", "length": "32", "binary_pattern": "0 | RT | RA | VRB", "bit_positions": ""}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RA].bit[60:63]\nGPR[RT] ← EXTZ64(VSR[VRB+32].byte[index:index+3])\nif index > 12 then\n    undefined", "special_registers": "MSR", "programming_notes": "This instruction is used to extract an unsigned word from a vector register and place it into the upper half of a general-purpose register. Ensure that the MSR.VEC bit is set to avoid a Vector_Unavailable exception. The index for extraction is derived from the top 4 bits of the RA register, so be cautious with the value in RA to prevent undefined behavior when the index exceeds 12.", "extended_mnemonics": [], "page_found": "Page 333 - 334", "example": "vextuwlx r3, r4, v3"}
{"mnemonic": "vextduhvlx", "architecture": "PowerISA", "full_name": "Vector Extract Double Unsigned Halfword to VSR using GPR-specified Left-Index VA-form", "summary": "Extracts a double unsigned halfword from two vector registers and places it into another vector register based on the index specified in a general-purpose register.", "description": "The instruction extracts a double unsigned halfword from the concatenation of VSR[VRA+32] and VSR[VRB+32] using the index specified in bits 59:63 of GPR[RC]. The extracted byte elements are zero-extended and placed into doubleword 0 of VSR[VRT+32], while doubleword 1 is set to zero.", "syntax": "vextduhvlx VRT,VRA,VRB,RC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "RC", "desc": "General Purpose Register specifying the index"}], "encoding": {"format": "VA-form", "hex_opcode": "0x1000001A", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | RC | 26", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RC].bit[59:63]\nvsrc.qword[0] ← VSR[VRA+32]\nvsrc.qword[1] ← VSR[VRB+32]\nVSR[VRT+32].dword[0] ← EXTZ64(vsrc.byte[index:index+1])\nVSR[VRT+32].dword[1] ← 0x0000_0000_0000_0000", "special_registers": null, "programming_notes": "This instruction is used to extract a double unsigned halfword from two vector registers and place it into another vector register. Ensure that the index specified in GPR[RC] is within bounds to avoid undefined behavior. The operation requires the VEC bit in the MSR to be set; otherwise, a Vector Unavailable exception will occur.", "extended_mnemonics": [], "page_found": "Page 335 - 336", "example": "vextduhvlx v1, v2, v3, r6"}
{"mnemonic": "vextduwvlx", "architecture": "PowerISA", "full_name": "Vector Extract Double Unsigned Word to VSR using GPR-specified Left-Index VA-form", "summary": "Extracts a doubleword from the concatenation of two vector registers based on an index specified in a general-purpose register.", "description": "The instruction extracts a doubleword from the concatenation of the contents of VSR[VRA+32] and VSR[VRB+32] based on the index derived from bits 59:63 of GPR[RC]. The extracted bytes are zero-extended into the first doubleword of VSR[VRT+32], and the second doubleword is set to zero.", "syntax": "vextduwvlx VRT,VRA,VRB,RC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "RC", "desc": "General Purpose Register containing the index"}], "encoding": {"format": "VA-form", "hex_opcode": "0x1000001C", "length": "32", "binary_pattern": "000100 | VRT | VRA | VRB | RC | 011100", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RC].bit[59:63]\nsrc.qword[0] ← VSR[VRA+32]\nsrc.qword[1] ← VSR[VRB+32]\nVSR[VRT+32].dword[0] ← EXTZ64(src.byte[index:index+3])\nVSR[VRT+32].dword[1] ← 0x0000_0000_0000_0000\nif index > 28 then\n    undefined result", "special_registers": "N/A", "programming_notes": "This instruction is used to extract a doubleword from the concatenation of two vector registers based on an index specified in a general-purpose register. Ensure that the index does not exceed 28 to avoid undefined results. The operation requires the VEC bit in the Machine State Register (MSR) to be set; otherwise, a Vector Unavailable exception will occur.", "extended_mnemonics": [], "page_found": "Page 336 - 337", "example": "vextduwvlx v1, v2, v3, r6"}
{"mnemonic": "vextddvlx", "architecture": "PowerISA", "full_name": "Vector Extract Double Doubleword to VSR using GPR-specified Left-Index VA-form", "summary": "Extracts a doubleword from the concatenation of two vector registers based on an index specified in a general-purpose register.", "description": "The instruction extracts a doubleword from the concatenation of the contents of VSR[VRA+32] and VSR[VRB+32] using an index derived from bits 59:63 of GPR[RC]. The extracted byte elements are placed into doubleword 0 of VSR[VRT+32], while doubleword 1 is set to zero.", "syntax": "vextddvlx VRT,VRA,VRB,RC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "RC", "desc": "General Purpose Register containing the index"}], "encoding": {"format": "VA-form", "hex_opcode": "0x1000001E", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | RC", "bit_positions": ""}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RC].bit[59:63]\nsrc.qword[0] ← VSR[VRA+32]\nsrc.qword[1] ← VSR[VRB+32]\nVSR[VRT+32].dword[0] ← src.byte[index:index+7]\nVSR[VRT+32].dword[1] ← 0x0000_0000_0000_0000", "special_registers": "N/A", "programming_notes": "This instruction is useful for extracting a specific doubleword from two VSX registers based on an index specified in a GPR. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise a Vector Unavailable exception. The index is derived from bits 59:63 of the GPR, so ensure these bits are correctly set to access the desired doubleword. Note that the upper doubleword of the destination register is always zeroed.", "extended_mnemonics": [], "page_found": "Page 337 - 338", "example": "vextddvlx v1, v2, v3, r6"}
{"mnemonic": "vinsblx", "architecture": "PowerISA", "full_name": "Vector Insert Byte from GPR using GPR-specified Left-Index VX-form", "summary": "Inserts a byte from a general-purpose register into a vector register at an index specified by another general-purpose register.", "description": "The contents of bits 56:63 of GPR[RB] are placed into byte element index of VSR[VRT+32], where index is the contents of bits 60:63 of GPR[RA]. All other byte elements of VSR[VRT+32] remain unchanged.", "syntax": "vinsblx VRT,RA,RB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register (index)"}, {"name": "RB", "desc": "Source General Purpose Register (data)"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000020F", "length": "32", "binary_pattern": "18 | VRT | RA | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RA].bit[60:63]\nsrc.byte[0:15] ← 0\nVSR[VRT+32].byte[index] ← GPR[RB].bit[56:63]", "special_registers": null, "programming_notes": "The vinsblx instruction is used to insert a byte from a general-purpose register (GPR) into a vector register, using another GPR to specify the index. Ensure that the MSR.VEC bit is set to 1; otherwise, a Vector_Unavailable exception will be raised. The index must be within the range of 0-15, as it specifies which byte element in the vector register to update. This instruction does not require any special alignment and operates at privilege level 0.", "extended_mnemonics": [], "page_found": "Page 340 - 341", "example": "vinsblx v1, r4, r5"}
{"mnemonic": "vinshlx", "architecture": "PowerISA", "full_name": "Vector Insert Halfword from GPR using GPR-specified Left-Index VX-form", "summary": "Inserts the high halfword of a general-purpose register into a vector register at a position specified by another general-purpose register.", "description": "The contents of bits 48:63 of GPR[RB] are placed into byte elements index:index+1 of VSR[VRT+32], where index is the contents of bits 60:63 of GPR[RA].", "syntax": "vinshlx VRT,RA,RB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register (index)"}, {"name": "RB", "desc": "Source General Purpose Register (data)"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000024F", "length": "32", "binary_pattern": "4 | VRT | RA | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RA].bit[60:63]\nsrc.byte[0:15] ← 0\nVSR[VRT+32].byte[index:index+1] ← GPR[RB].bit[48:63]", "special_registers": null, "programming_notes": "The vinshlx instruction is used to insert the upper halfword of a general-purpose register (GPR) into specific byte elements of a vector register. Ensure that the index specified in bits 60-63 of RA is within valid bounds to avoid undefined behavior. This instruction requires the Vector Facility to be enabled; otherwise, it will raise an exception.", "extended_mnemonics": [], "page_found": "Page 341 - 342", "example": "vinshlx v1, r4, r5"}
{"mnemonic": "vinswlx", "architecture": "PowerISA", "full_name": "Vector Insert Word from GPR using GPR-specified Left-Index VX-form", "summary": "Inserts the contents of bits 32:63 of a general-purpose register into byte elements of a vector register based on an index specified in another general-purpose register.", "description": "The instruction inserts the contents of bits 32:63 of GPR[RB] into byte elements index:index+3 of VSR[VRT+32], where index is the value of bits 60:63 of GPR[RA].", "syntax": "vinswlx VRT,RA,RB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register containing the index"}, {"name": "RB", "desc": "Source General Purpose Register containing the data to insert"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000028F", "length": "32", "binary_pattern": "4 | VRT | RA | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RA].bit[60:63]\nVSR[VRT+32].byte[index:index+3] ← GPR[RB].bit[32:63]", "special_registers": null, "programming_notes": "This instruction is used to insert the upper 32 bits of a general-purpose register (GPR) into specific byte elements of a vector register. Ensure that the index specified by the top 4 bits of GPR[RA] is within the valid range for the target vector register. This operation requires the Vector Facility to be enabled; otherwise, it will raise an exception.", "extended_mnemonics": [], "page_found": "Page 342 - 343", "example": "vinswlx v1, r4, r5"}
{"mnemonic": "vinsdlx", "architecture": "PowerISA", "full_name": "Vector Insert Doubleword from GPR using GPR-specified Left-Index VX-form", "summary": "Inserts a doubleword from a general-purpose register into a vector register at a position specified by another general-purpose register.", "description": "The contents of GPR[RB] are placed into byte elements index:index+7 of VSR[VRT+32], where index is the contents of bits 60:63 of GPR[RA]. All other byte elements of VSR[VRT+32] remain unchanged.", "syntax": "vinsdlx VRT,RA,RB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register (contains index)"}, {"name": "RB", "desc": "Source General Purpose Register (contains data to insert)"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100002CF", "length": "32", "binary_pattern": "0 | VRT | RA | RB", "bit_positions": ""}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RA].bit[60:63]\nVSR[VRT+32].byte[index:index+7] ← GPR[RB]", "special_registers": "N/A", "programming_notes": "The vinsdlx instruction is used to insert the contents of a general-purpose register (GPR) into a specific byte range within a vector register. Ensure that the index specified in bits 60:63 of the RA register is within the valid range (0-15) to avoid undefined behavior. This instruction requires the Vector Facility to be enabled; otherwise, it will raise an exception.", "extended_mnemonics": [], "page_found": "Page 343 - 344", "example": "vinsdlx v1, r4, r5"}
{"mnemonic": "vinsw", "architecture": "PowerISA", "full_name": "Vector Insert Word from GPR using Immediate-specified Index", "summary": "Inserts the contents of a word from a general-purpose register into a vector register at an immediate-specified index.", "description": "The contents of bits 32:63 of GPR[RB] are placed into byte elements UIM:UIM+3 of VSR[VRT+32]. All other byte elements of VSR[VRT+32] are not modified. If UIM is greater than 12, the result is undefined.", "syntax": "vinsw VRT,RB,UIM", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "RB", "desc": "Source General Purpose Register"}, {"name": "UIM", "desc": "Immediate-specified Index"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100000CF", "length": "32", "binary_pattern": "4 | VRT | UIM | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nVSR[VRT+32].byte[UIM:UIM+3] ← GPR[RB].bit[32:63]", "special_registers": "N/A", "programming_notes": "The vinsw instruction is used to insert the upper 32 bits of a general-purpose register (GPR) into a specific byte range within a vector register. Ensure that the immediate index (UIM) does not exceed 12 to avoid undefined behavior. This instruction operates at user privilege level and will raise an exception if the Vector Facility is unavailable.", "extended_mnemonics": [], "page_found": "Page 344 - 345", "example": "vinsw v1, r5, uim"}
{"mnemonic": "vinsbvlx", "architecture": "PowerISA", "full_name": "Vector Insert Byte from VSR using GPR-specified Left-Index VX-form", "summary": "Inserts a byte from one vector register into another based on an index specified in a general-purpose register.", "description": "The instruction inserts the contents of bits 56:63 of VSR[VRB+32] into byte element 'index' of VSR[VRT+32], where 'index' is the value of bits 60:63 of GPR[RA].", "syntax": "vinsbvlx VRT,RA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register containing the index"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000000F", "length": "32", "binary_pattern": "000100 | VRT | RA | VRB | 00000 | 001111", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RA].bit[60:63]\nVSR[VRT+32].byte[index] ← VSR[VRB+32].bit[56:63]", "special_registers": "N/A", "programming_notes": "This instruction is used to insert a byte from one vector register into another, with the target index specified by bits 60-63 of a general-purpose register. Ensure that the MSR.VEC bit is set to enable vector operations; otherwise, a Vector_Unavailable exception will be raised. The index must be within the valid range for vector elements to avoid undefined behavior.", "extended_mnemonics": [], "page_found": "Page 345 - 346", "example": "vinsbvlx v1, r4, v3"}
{"mnemonic": "vinshvlx", "architecture": "PowerISA", "full_name": "Vector Insert Halfword from VSR using GPR - specified Left-Index VX-form", "summary": "Inserts halfword from a vector register into another vector register at a position specified by a general-purpose register.", "description": "The instruction inserts the contents of bits 48:63 of VSR[VRB+32] into byte elements index:index+1 of VSR[VRT+32], where index is the contents of bits 60:63 of GPR[RA].", "syntax": "vinshvlx VRT,RA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VSRT", "desc": "Target Vector Register"}, {"name": "VSRC1", "desc": "Source Vector Register"}, {"name": "VSRC2", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000004F", "length": "32", "binary_pattern": "0 | VRT | RA | VRB", "bit_positions": ""}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RA].bit[60:63]\nsrc.byte[0:15] ← 0\nVSR[VRT+32].byte[index:index+1] ← VSR[VRB+32].bit[48:63]", "special_registers": "MSR", "programming_notes": "This instruction is used to insert the upper halfword of a vector register into specific byte elements of another vector register, based on an index derived from a general-purpose register. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. The index must be within the valid range for vector operations to avoid undefined behavior.", "extended_mnemonics": [], "page_found": "Page 346 - 347", "example": "vinshvlx v1, r4, v3"}
{"mnemonic": "vinswvlx", "architecture": "PowerISA", "full_name": "Vector Insert Word from VSR using GPR-specified Left-Index VX-form", "summary": "Inserts a word from a vector register into another vector register at a position specified by a general-purpose register.", "description": "The contents of bits 32:63 of VSR[VRB+32] are placed into byte elements index:index+3 of VSR[VRT+32], where index is the contents of bits 60:63 of GPR[RA].", "syntax": "vinswvlx VRT,RA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000008F", "length": "32", "binary_pattern": "0 | VRT | RA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nindex ← GPR[RA].bit[60:63]\nVSR[VRT+32].byte[index:index+3] ← VSR[VRB+32].bit[32:63]", "special_registers": "N/A", "programming_notes": "This instruction is used to insert a 4-byte word from one vector register into another, with the destination index specified by the upper 4 bits of a general-purpose register. Ensure that the MSR.VEC bit is set to enable vector operations; otherwise, a Vector_Unavailable exception will be raised. The source and destination registers must be in the range V32-V63. Be cautious of alignment issues if the index does not align with byte boundaries.", "extended_mnemonics": [], "page_found": "Page 347 - 348", "example": "vinswvlx v1, r4, v3"}
{"mnemonic": "vmuleud", "architecture": "PowerISA", "full_name": "Vector Multiply Even Unsigned Doubleword", "summary": "Multiplies the even doublewords of two vector registers and places the result in another vector register.", "description": "The instruction multiplies the unsigned integer values in the even doublewords of VSR[VRA+32] and VSR[VRB+32], and stores the 128-bit product in VSR[VRT+32].", "syntax": "vmuleud VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100002C8", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsrc1 ←EXTZ(VSR[VRA+32].dword[0])\nsrc2 ←EXTZ(VSR[VRB+32].dword[0])\nVSR[VRT+32] ←CHOP128(src1 × src2)", "special_registers": "MSR", "programming_notes": "This instruction is used for multiplying unsigned integers in the even doublewords of two vector registers and storing the 128-bit product. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. The operation is performed on the least significant doubleword of each input register, and the result is truncated to 128 bits before being stored.", "extended_mnemonics": [], "page_found": "Page 370 - 371", "example": "vmuleud v1, v2, v3"}
{"mnemonic": "vmulesd", "architecture": "PowerISA", "full_name": "Vector Multiply Even Signed Doubleword", "summary": "Multiplies the even doublewords of two vector registers and places the result in another vector register.", "description": "The instruction multiplies the signed integer values in the even doublewords of VSR[VRA+32] and VSR[VRB+32], and stores the 128-bit product in VSR[VRT+32].", "syntax": "vmulesd VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100003C8", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsrc1 ←EXTS(VSR[VRA+32].dword[0])\nsrc2 ←EXTS(VSR[VRB+32].dword[0])\nVSR[VRT+32] ←CHOP128(src1 × src2)", "special_registers": "MSR", "programming_notes": "This instruction is used for multiplying signed integers in the even doublewords of two vector registers and storing the 128-bit product. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. The operation is performed on the first doubleword of each input register, and the result is truncated to 128 bits before being stored in the destination register.", "extended_mnemonics": [], "page_found": "Page 371 - 372", "example": "vmulesd v1, v2, v3"}
{"mnemonic": "vmuluwm", "architecture": "PowerISA", "full_name": "Vector Multiply Unsigned Word Modulo", "summary": "Multiplies the contents of two vector registers and places the low-order 32 bits of each product into a target vector register.", "description": "For vmuluwm, each word element in VSR[VRA+32] is multiplied by the corresponding word element in VSR[VRB+32]. The low-order 32 bits of each product are placed into the corresponding word element in VSR[VRT+32].", "syntax": "vmuluwm VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000089", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ←EXTZ(VSR[VRA+32].word[i])\n    src2 ←EXTZ(VSR[VRB+32].word[i])\n    VSR[VRT+32].word[i] ←CHOP32(src1 × src2)\nend", "special_registers": "N/A", "programming_notes": "vmuluwm can be used for unsigned or signed integers.", "extended_mnemonics": [], "page_found": "Page 372 - 373", "example": "vmuluwm v1, v2, v3"}
{"mnemonic": "vmulld", "architecture": "PowerISA", "full_name": "Vector Multiply Low Doubleword", "summary": "Multiplies the contents of two vector registers and places the low-order 64 bits of each product into a target vector register.", "description": "For vmulld, the integer values in doubleword elements of VSR[VRA+32] are multiplied by the corresponding integer values in doubleword elements of VSR[VRB+32]. The low-order 64 bits of each product are placed into doubleword elements of VSR[VRT+32].", "syntax": "vmulld VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100001C9", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    src1 ←EXTS(VSR[VRA+32].dword[i])\n    src2 ←EXTS(VSR[VRB+32].dword[i])\n    VSR[VRT+32].dword[i] ←CHOP64(src1 × src2)\nend", "special_registers": "MSR", "programming_notes": "This instruction multiplies the integer values in doubleword elements of two vector registers and stores the low-order 64 bits of each product into another vector register. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. The operation processes two doublewords per iteration, so be cautious with loop bounds if using this in a larger computation.", "extended_mnemonics": [], "page_found": "Page 375 - 376", "example": "vmulld v1, v2, v3"}
{"mnemonic": "vmhaddshs", "architecture": "PowerISA", "full_name": "Vector Multiply-High-Add Signed Halfword Saturate", "summary": "Performs a vector multiply-high-add signed halfword operation with saturation.", "description": "For each integer value i from 0 to 7, the signed integer value in halfword element i of VSR[VRA+32] is multiplied by the signed integer value in halfword element i of VSR[VRB+32], producing a 32-bit signed integer product. Bits 0:16 of the product are added to the signed integer value in halfword element i of VSR[VRC+32]. The low-order 16 bits of the result are placed into halfword element i of VSR[VRT+32]. If the intermediate result is greater than 2^15-1, the result saturates to 2^15 -1 and SAT is set to 1. If the intermediate result is less than -2^15, the result saturates to -2^15 and SAT is set to 1.", "syntax": "vmhaddshs VRT,VRA,VRB,VRC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Source Vector Register"}], "encoding": {"format": "VA-form", "hex_opcode": "0x10000020", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | VRC | 32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 7\n    src1 ←EXTS(VSR[VRA+32].hword[i])\n    src2 ←EXTS(VSR[VRB+32].hword[i])\n    src3 ←EXTS(VSR[VRC+32].hword[i])\n    result ←((src1 × src2) >> 15) + src3\n    VSR[VRT+32].hword[i] ←si16_CLAMP(result)\n    VSCR.SAT ←sat_flag", "special_registers": "VSCR.SAT", "programming_notes": "This instruction is commonly used in applications requiring vectorized operations on signed halfwords, such as audio processing or graphics rendering. Ensure that the input vectors are properly aligned to avoid performance penalties. Be aware of saturation conditions; if any result exceeds the 16-bit signed integer range, it will be clamped and the VSCR.SAT flag will be set. This instruction operates at user privilege level.", "extended_mnemonics": [], "page_found": "Page 376 - 377", "example": "vmhaddshs v1, v2, v3, v4"}
{"mnemonic": "vmladduhm", "architecture": "PowerISA", "full_name": "Vector Multiply-Low-Add Unsigned Halfword Modulo", "summary": "Performs a vector multiply-low-add unsigned halfword modulo operation.", "description": "For each integer value i from 0 to 7, the unsigned integer value in halfword element i of VSR[VRA+32] is multiplied by the unsigned integer value in halfword element i in VSR[VRB+32]. The product is added to the unsigned integer value in halfword element i of VSR[VRC+32]. The low-order 16 bits of the sum are placed into halfword element i of VSR[VRT+32].", "syntax": "vmladduhm VRT,VRA,VRB,VRC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Source Vector Register"}], "encoding": {"format": "VA-form", "hex_opcode": "0x10000022", "length": "32", "binary_pattern": "1 | VRT | VRA | VRB | VRC | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0", "bit_positions": ""}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\ndo i = 0 to 7\n    src1 ←EXTZ(VSR[VRA+32].hword[i])\n    src2 ←EXTZ(VSR[VRB+32].hword[i])\n    src3 ←EXTZ(VSR[VRC+32].hword[i])\n    VSR[VRT+32].hword[i] ← CHOP16((src1 × src2) + src3)\nend", "special_registers": null, "programming_notes": "vmladduhm can be used for unsigned or signed integers.", "extended_mnemonics": [], "page_found": "Page 377 - 378", "example": "vmladduhm v1, v2, v3, v4"}
{"mnemonic": "vmsummbm", "architecture": "PowerISA", "full_name": "Vector Multiply-Sum Mixed Byte Modulo", "summary": "Performs a vector multiply-sum operation with mixed byte elements.", "description": "For each integer value i from 0 to 3, do the following. For each integer value j from 0 to 3, do the following. The signed integer value in byte element j of word element i of VSR[VRA+32] is multiplied by the unsigned integer value in byte element j of word element i of VSR[VRB+32]. The sum of the four products is added to the signed integer value in word element i of VSR[VRC+32]. The low-order 32 bits of the result are placed into word element i of VSR[VRT+32].", "syntax": "vmsummbm VRT,VRA,VRB,VRC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x10000025", "length": "32", "binary_pattern": "18 | VRT | VRA | VRB | VRC", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    temp ←EXTS(VSR[VRC+32].word[i])\n    do j = 0 to 3\n        src1 ←EXTS(VSR[VRA+32].word[i].byte[j])\n        src2 ←EXTZ(VSR[VRB+32].word[i].byte[j])\n        temp ←temp + (src1 × src2)\n    end\n    VSR[VRT+32].word[i] ←CHOP32(temp)\nend", "special_registers": "N/A", "programming_notes": "This instruction is useful for performing vectorized multiply-sum operations on byte elements. Ensure that the vector registers are properly aligned and that the Vector Facility (MSR.VEC) is enabled to avoid exceptions. The result is truncated to 32 bits, so be cautious of overflow if the sum exceeds this range.", "extended_mnemonics": [], "page_found": "Page 378 - 379", "example": "vmsummbm v1, v2, v3, v4"}
{"mnemonic": "vmsumuhs", "architecture": "PowerISA", "full_name": "Vector Multiply-Sum Unsigned Halfword Saturate", "summary": "Performs a vector multiply-sum operation on unsigned halfwords and saturates the result.", "description": "Computes the sum of products of unsigned halfword elements from VRA and VRB, adds the result to the corresponding word element in VRC, and saturates the final result to unsigned 32-bit range. This instruction requires VMX support and no condition flags are affected.", "syntax": "vmsumuhs VRT,VRA,VRB,VRC", "operands": [{"name": "VRT", "desc": "Destination Vector Register"}, {"name": "VRA", "desc": "Source Vector Register A"}, {"name": "VRB", "desc": "Source Vector Register B"}, {"name": "VRC", "desc": "Source Vector Register C"}], "encoding": {"format": "VA-form", "hex_opcode": "0x10000027", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB | VRC", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "for i in 0 to 3 do\n  product0 ← (u16)VRA[i*32:(i*32+15)] * (u16)VRB[i*32:(i*32+15)]\n  product1 ← (u16)VRA[i*32+16:(i*32+31)] * (u16)VRB[i*32+16:(i*32+31)]\n  sum ← product0 + product1 + (u32)VRC[i*32:(i*32+31)]\n  VRT[i*32:(i*32+31)] ← Saturate_U32(sum)\nend for", "special_registers": "VSCR", "programming_notes": "The vmsumuhs instruction is commonly used for performing vectorized multiply-sum operations on unsigned halfwords, which can be particularly useful in graphics and signal processing applications. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will occur. The operation saturates results to prevent overflow, setting the VSCR.SAT flag if saturation occurs. This instruction operates on 128-bit vectors, so ensure proper alignment of vector registers for optimal performance.", "extended_mnemonics": [], "page_found": "Page 380 - 381", "example": "vmsumuhs v1, v2, v3, v4"}
{"mnemonic": "vmsumudm", "architecture": "PowerISA", "full_name": "Vector Multiply-Sum Unsigned Doubleword Modulo", "summary": "Performs a horizontal add of the doubleword elements in VSR[VRA+32] using vmsumudm.", "description": "The instruction performs a horizontal add of the doubleword elements in VSR[VRA+32]. It can also be used for horizontal subtract, multiply even unsigned doubleword, and multiply odd unsigned doubleword operations by setting specific values in VSR[VRB+32] and VSR[VRC+32].", "syntax": "vmsumudm VRT,VRA,VRB,VRC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Source Vector Register"}, {"name": "VA", "desc": "Source Vector Register"}, {"name": "VB", "desc": "Source Vector Register"}, {"name": "VC", "desc": "Source Vector Register"}], "encoding": {"format": "VA-form", "hex_opcode": "0x10000023", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | VRC | 35", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ntemp ←EXTZ(VSR[VRC+32])\ndo i = 0 to 1\n    src1  ←EXTZ(VSR[VRA+32].dword[i])\n    src2  ←EXTZ(VSR[VRB+32].dword[i])\n    temp ←temp + (src1 × src2)\nend\nVSR[VRT+32] ←CHOP128(temp)", "special_registers": "MSR", "programming_notes": "A horizontal add of the doubleword elements in VSR[VRA+32] can be performed using vmsumudm when VSR[VRB+32] contains the doubleword integer values {1,1} and VSR[VRC+32] contains the quad-word integer value 0. A horizontal subtract of the doubleword elements in VSR[VRA+32] can be performed using vmsumudm when VSR[VRB+32] contains the doubleword integer values {1,-1} and VSR[VRC+32] contains the quad-word integer value 0. A multiply even unsigned doubleword operation can be performed using vmsumudm when the contents of doubleword element 1 of VSR[VRA+32] or VSR[VRB+32] are 0 and the contents of VSR[VRC+32] to 0. A multiply odd unsigned doubleword operation can be performed using vmsumudm when the contents of doubleword element 0 of VSR[VRA+32] or VSR[VRB+32] are 0 and the contents of VSR[VRC+32] to 0.", "extended_mnemonics": [], "page_found": "Page 381 - 382", "example": "vmsumudm v1, v2, v3, v4"}
{"mnemonic": "vmsumcud", "architecture": "PowerISA", "full_name": "Vector Multiply-Sum & write Carry-out Unsigned Doubleword", "summary": "Performs vector multiply-sum and writes the carry-out of the low-order 128 bits to a destination register.", "description": "The instruction performs two unsigned doubleword multiplications, sums the results along with an additional source register, and writes the carry-out of the low-order 128 bits to the destination register.", "syntax": "vmsumcud VRT,VRA,VRB,VRC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Source Vector Register"}], "encoding": {"format": "VA-form", "hex_opcode": "0x10000017", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB | VRC | 23", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\n\ntemp ←EXTZ(VSR[VRC+32])\ndo i = 0 to 1\n    src1  ←EXTZ(VSR[VRA+32].dword[i])\n    src2  ←EXTZ(VSR[VRB+32].dword[i])\n    temp ←temp + (src1 × src2)\nend\n\nVSR[VRT+32] ←CHOP128(temp >> 128)", "special_registers": "N/A", "programming_notes": "This instruction is useful for performing high-precision arithmetic operations involving unsigned doublewords. Ensure that the vector facility is enabled by checking and setting the appropriate bits in the Machine State Register (MSR). Be cautious of overflow conditions, as the carry-out from the low-order 128 bits is written to the destination register. The instruction operates on 64-bit elements, so ensure proper alignment for optimal performance.", "extended_mnemonics": [], "page_found": "Page 382 - 383", "example": "vmsumcud v1, v2, v3, v4"}
{"mnemonic": "vdivsw", "architecture": "PowerISA", "full_name": "Vector Divide Signed Word", "summary": "Divides the contents of two vector registers and updates the result in another vector register.", "description": "For vdivsw, each word element of VSR[VRA+32] is divided by the corresponding word element of VSR[VRB+32]. The quotient is placed into the corresponding word element of VSR[VRT+32].", "syntax": "vdivsw VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000018B", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    dividend ←EXTS(VSR[VRA+32].word[i])\n    divisor  ←EXTS(VSR[VRB+32].word[i])\n    VSR[VRT+32].word[i] ←CHOP32(dividend ÷ divisor)\nend", "special_registers": null, "programming_notes": "vdivsw performs element-wise signed word division. Ensure that the vector facility is enabled (MSR.VEC=1) to avoid a Vector_Unavailable exception. Handle potential division by zero and overflow conditions in your application logic.", "extended_mnemonics": [], "page_found": "Page 383 - 384", "example": "vdivsw v1, v2, v3"}
{"mnemonic": "vdivesw", "architecture": "PowerISA", "full_name": "Vector Divide Extended Signed Word", "summary": "Divides the contents of two vector registers and updates the result in another vector register.", "description": "For vdivesw, each word element of VSR[VRA+32] is treated as a signed integer, shifted left by 32 bits, and divided by the corresponding word element of VSR[VRB+32], which is also treated as a signed integer. The quotient is placed into the corresponding word element of VSR[VRT+32].", "syntax": "vdivesw VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000038B", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    dividend ←EXTS(VSR[VRA+32].word[i]) << 32\n    divisor  ←EXTS(VSR[VRB+32].word[i])\n    VSR[VRT+32].word[i] ←CHOP32(dividend ÷ divisor)\nend", "special_registers": null, "programming_notes": "The vdivesw instruction performs a signed division on each word element of the input vectors, shifting the dividend left by 32 bits before dividing. Ensure that the vector facility is enabled (MSR.VEC=1) to avoid exceptions. Be cautious of division by zero, which may result in undefined behavior or exceptions. The operation is performed at the user privilege level unless otherwise specified.", "extended_mnemonics": [], "page_found": "Page 384 - 385", "example": "vdivesw v1, v2, v3"}
{"mnemonic": "vdivsd", "architecture": "PowerISA", "full_name": "Vector Divide Signed Doubleword", "summary": "Divides the contents of two vector registers and updates the result in another vector register.", "description": "For vdivsd, each doubleword element in VSR[VRA+32] is divided by the corresponding doubleword element in VSR[VRB+32]. The quotient is placed into the corresponding doubleword element in VSR[VRT+32].", "syntax": "vdivsd VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100001CB", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    dividend ←EXTS(VSR[VRA+32].dword[i])\n    divisor  ←EXTS(VSR[VRB+32].dword[i])\n    VSR[VRT+32].dword[i] ←CHOP64(dividend ÷ divisor)\nend", "special_registers": null, "programming_notes": "This instruction performs element-wise division of signed doublewords. Ensure that the vector facility is enabled (MSR.VEC=1) to avoid exceptions. Handle potential division by zero and overflow conditions in your application logic.", "extended_mnemonics": [], "page_found": "Page 385 - 386", "example": "vdivsd v1, v2, v3"}
{"mnemonic": "vdivesd", "architecture": "PowerISA", "full_name": "Vector Divide Extended Signed Doubleword", "summary": "Performs extended signed doubleword division on vector elements.", "description": "For vdivesd, each element of the source vectors VRA and VRB is treated as a signed doubleword. The dividend is shifted left by 64 bits, then divided by the divisor. The quotient is placed into the corresponding element of the destination vector VRT.", "syntax": "vdivesd VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Destination Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100003CB", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    dividend ←EXTS(VSR[VRA+32].dword[i]) << 64\n    divisor  ←EXTS(VSR[VRB+32].dword[i])\n    VSR[VRT+32].dword[i] ←CHOP64(dividend ÷ divisor)\nend", "special_registers": "MSR", "programming_notes": "This instruction is used for performing extended signed doubleword division on vector elements. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation involves shifting each dividend left by 64 bits and then dividing it by the corresponding divisor, with the quotient being stored in the destination vector. Be cautious of potential division by zero errors, which may result in undefined behavior or exceptions.", "extended_mnemonics": [], "page_found": "Page 386 - 387", "example": "vdivesd v1, v2, v3"}
{"mnemonic": "vdivsq", "architecture": "PowerISA", "full_name": "Vector Divide Signed Quadword", "summary": "Divides the contents of two vector registers and updates the destination register with the quotient.", "description": "For vdivsq, the signed integer value in VSR[VRA+32] is divided by the signed integer value in VSR[VRB+32], and the result is placed into VSR[VRT+32].", "syntax": "vdivsq VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000010B", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB", "bit_positions": ""}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\n\ndividend ← EXTS(VSR[VRA+32])\ndivisor ← EXTS(VSR[VRB+32])\nVSR[VRT+32] ← CHOP128(dividend ÷ divisor)\n\nLet src1 be the signed integer value in VSR[VRA+32].\nLet src2 be the signed integer value in VSR[VRB+32].\nThe quotient of src1 divided by src2 is placed into VSR[VRT+32].\nThe quotient is the unique signed integer that satisfies dividend = (quotient × divisor) + r where 0 ≤ remainder < |divisor| if the dividend is nonnegative, and -|divisor| < remainder ≤ 0 if the dividend is negative.\n\nIf an attempt is made to perform any of the divisions <anything> ÷ 0 or 0x8000_0000_0000_0000_0000_0000_0000_0000 ÷ -1 then the contents of VSR[VRT+32] are undefined.", "special_registers": null, "programming_notes": "The vdivsq instruction performs a signed division of two 64-bit integers stored in vector registers. Ensure that the divisor is not zero to avoid undefined results. The operation requires the Vector Facility (MSR.VEC) to be enabled; otherwise, a Vector_Unavailable exception will occur. Be cautious with edge cases like dividing the smallest possible negative number by -1, which results in an undefined quotient.", "extended_mnemonics": [], "page_found": "Page 387 - 388", "example": "vdivsq v1, v2, v3"}
{"mnemonic": "vdivesq", "architecture": "PowerISA", "full_name": "Vector Divide Extended Signed Quadword", "summary": "Divides the contents of two vector registers and updates the destination register with the quotient.", "description": "For vdivesq, the signed integer value in VSR[VRA+32] concatenated with 128 0s is divided by the signed integer value in VSR[VRB+32]. The quotient is placed into VSR[VRT+32].", "syntax": "vdivesq VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000030B", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB", "bit_positions": ""}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\n\ndividend ← EXTS(VSR[VRA+32]) << 128\ndivisor ← EXTS(VSR[VRB+32])\nVSR[VRT+32] ← CHOP128(dividend ÷ divisor)", "special_registers": null, "programming_notes": "This instruction is used for dividing a signed quadword value by another signed quadword value. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The operation involves extending the sign of the operands and handling division with potential overflow or zero divisor scenarios carefully.", "extended_mnemonics": [], "page_found": "Page 388 - 389", "example": "vdivesq v1, v2, v3"}
{"mnemonic": "vmodsw", "architecture": "PowerISA", "full_name": "Vector Modulo Signed Word", "summary": "Performs modulo operation on signed integers in vector registers.", "description": "For vmodsw, the signed integer in word element i of VSR[VRA+32] is divided by the signed integer in word element i of VSR[VRB+32]. The remainder is placed into word element i of VSR[VRT+32].", "syntax": "vmodsw VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000078B", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB | 1931", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    dividend ←EXTS(VSR[VRA+32].word[i])\n    divisor  ←EXTS(VSR[VRB+32].word[i])\n    VSR[VRT+32].word[i] ←CHOP32(dividend % divisor)\nend", "special_registers": null, "programming_notes": "The vmodsw instruction performs element-wise signed modulo division on vectors. Ensure that the vector registers are properly aligned and that the Vector Facility is enabled (MSR.VEC=1). Be cautious of division by zero, which may result in undefined behavior or exceptions. This operation is typically used in scenarios requiring periodic or cyclic calculations with signed integers.", "extended_mnemonics": [], "page_found": "Page 389 - 390", "example": "vmodsw v1, v2, v3"}
{"mnemonic": "vmodsd", "architecture": "PowerISA", "full_name": "Vector Modulo Signed Doubleword", "summary": "Performs vector modulo signed doubleword operation.", "description": "For vmodsd, each integer value i from 0 to 1, the signed integer in doubleword element i of VSR[VRA+32] is divided by the signed integer in doubleword element i of VSR[VRB+32]. The remainder is placed into doubleword element i of VSR[VRT+32].", "syntax": "vmodsd VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100007CB", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    dividend ←EXTS(VSR[VRA+32].dword[i])\n    divisor  ←EXTS(VSR[VRB+32].dword[i])\n    VSR[VRT+32].dword[i] ←CHOP64(dividend % divisor)\nend", "special_registers": null, "programming_notes": "The vmodsd instruction performs element-wise signed modulo division on doublewords. Ensure that the vector facility is enabled (MSR.VEC=1) to avoid a Vector_Unavailable exception. Handle potential division by zero, as it will result in an undefined remainder. The operation is performed on elements 0 and 1 of the specified vector registers.", "extended_mnemonics": [], "page_found": "Page 390 - 391", "example": "vmodsd v1, v2, v3"}
{"mnemonic": "vmodsq", "architecture": "PowerISA", "full_name": "Vector Modulo Signed Quadword", "summary": "Performs signed modulo operation on quadword elements of two vector registers and stores the result in another vector register.", "description": "Computes the signed modulo operation on quadword elements: each quadword element of VRA is divided by the corresponding quadword element of VRB and the remainder is stored in VRT. Division by zero results in undefined behavior. No condition flags are affected.", "syntax": "vmodsq VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000070B", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "for i in 0 to 1 do\n  dividend ← (s128)VRA[i*128:(i+1)*128-1]\n  divisor ← (s128)VRB[i*128:(i+1)*128-1]\n  VRT[i*128:(i+1)*128-1] ← dividend mod divisor\nend for", "special_registers": null, "programming_notes": "The vmodsq instruction performs a signed modulo operation on quadword elements. Ensure that the vector facility is enabled (MSR.VEC=1) to avoid exceptions. Be cautious with division by zero and handle cases where the dividend is 0x8000_0000_0000_0000_0000_0000_0000_0000 and the divisor is -1, as the result is undefined.", "extended_mnemonics": [], "page_found": "Page 391 - 392", "example": "vmodsq v1, v2, v3"}
{"mnemonic": "vmaxsd", "architecture": "PowerISA", "full_name": "Vector Maximum Signed Doubleword", "summary": "Compares the signed doublewords of two vector registers and stores the maximum value in a third vector register.", "description": "For vmaxsd, each pair of corresponding doublewords from VSR[VRA+32] and VSR[VRB+32] are compared. The larger value is stored in the corresponding position in VSR[VRT+32].", "syntax": "vmaxsd VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100001C2", "length": "32", "binary_pattern": "18 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    src1 ← VSR[VRA+32].dword[i]\n    src2 ← VSR[VRB+32].dword[i]\n    gt_flag ← EXTS(src1) > EXTS(src2)\n    VSR[VRT+32].dword[i] ← gt_flag=1 ? src1 : src2\nend", "special_registers": "N/A", "programming_notes": "The vmaxsd instruction is used to perform element-wise maximum operations on signed doublewords from two vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation compares each pair of corresponding elements and stores the larger value in the destination register. This instruction operates at the user privilege level.", "extended_mnemonics": [], "page_found": "Page 408 - 409", "example": "vmaxsd v1, v2, v3"}
{"mnemonic": "vminsd", "architecture": "PowerISA", "full_name": "Vector Minimum Signed Doubleword", "summary": "Compares the signed doublewords of two vector registers and stores the minimum values in a third vector register.", "description": "For vminsd, each pair of corresponding doublewords from VSR[VRA+32] and VSR[VRB+32] is compared. The smaller value is stored in the corresponding position in VSR[VRT+32].", "syntax": "vminsd VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100003C2", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB", "bit_positions": ""}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 1\n    src1 ← VSR[VRA+32].dword[i]\n    src2 ← VSR[VRB+32].dword[i]\n    lt_flag ← EXTS(src1) < EXTS(src2)\n    VSR[VRT+32].dword[i] ← lt_flag=1 ? src1 : src2\nend", "special_registers": null, "programming_notes": "This instruction is used to perform element-wise minimum comparison on signed doublewords from two vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation respects the sign of the operands, so negative numbers are correctly handled. There are no specific alignment requirements for the data in the vector registers.", "extended_mnemonics": [], "page_found": "Page 412 - 413", "example": "vminsd v1, v2, v3"}
{"mnemonic": "vcmpequq", "architecture": "PowerISA", "full_name": "Vector Compare Equal Quadword", "summary": "Compares two quadwords and sets the result to all ones if they are equal, otherwise all zeros.", "description": "Compares each quadword element of VRA with the corresponding quadword element of VRB for equality; the result for each quadword is all ones if equal or all zeros if not equal. If the Rc bit is set, CR6 is updated with summary information. Requires VMX support.", "syntax": "vcmpequq VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VC-form", "hex_opcode": "0x100001C7", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "for i in 0 to 1 do\n  if VRA[i*128:(i+1)*128-1] = VRB[i*128:(i+1)*128-1] then\n    VRT[i*128:(i+1)*128-1] ← 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n  else\n    VRT[i*128:(i+1)*128-1] ← 0x00000000000000000000000000000000\n  end if\nend for\nif Rc then\n  CR6 ← summary of results\nend if", "special_registers": "CR6", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": [], "page_found": "Page 417 - 418", "example": "vcmpequq v1, v2, v3"}
{"mnemonic": "vcmpgtsq", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Signed Quadword", "summary": "Compares two signed quadwords and sets the result based on whether the first is greater than the second.", "description": "For vcmpgtsq, the contents of VSR[VRA+32] (src1) are compared to the contents of VSR[VRB+32] (src2). If src1 > src2, VSR[VRT+32] is set to all 1s; otherwise, it is set to all 0s. If Rc=1, CR field 6 is updated.", "syntax": "vcmpgtsq VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VC-form", "hex_opcode": "0x10000387", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\nsrc1 ←EXTS(VSR[VRA+32])\nsrc2 ←EXTS(VSR[VRB+32])\nif src1 > src2 then do\n    VSR[VRT+32] ← 0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF\n    all_false ←0\nend else do\n    VSR[VRT+32] ← 0x0000_0000_0000_0000_0000_0000_0000_0000\n    all_true ←0\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6 (if Rc=1)", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": [], "page_found": "Page 422 - 423", "example": "vcmpgtsq v1, v2, v3"}
{"mnemonic": "vcmpsq", "architecture": "PowerISA", "full_name": "Vector Compare Signed Quadword", "summary": "Compares the signed integer values in two vector registers and updates the condition register.", "description": "For vcmpsq, the signed integer value in VSR[VRA+32] is compared with the signed integer value in VSR[VRB+32]. The comparison flags are placed into CR field BF.", "syntax": "vcmpsq BF,VRA,VRB", "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "VRA", "desc": "Vector Register A"}, {"name": "VRB", "desc": "Vector Register B"}, {"name": "VRT", "desc": "Target Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000141", "length": "32", "binary_pattern": "18 | BF | VRA | VRB", "bit_positions": "0:5 | 6:8 | 9:10 | 11:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsrc1 ←EXTS(VSR[VRA+32])\nsrc2 ←EXTS(VSR[VRB+32])\nlt_flag ←src1 < src2\ngt_flag ←src1 > src2\neq_flag ←src1 = src2\nCR.field[BF] ←lt_flag<<3 | gt_flag<<2 | eq_flag<<1", "special_registers": "CR", "programming_notes": "The vcmpsq instruction compares two signed quadword values from vector registers and sets the condition register (CR) field BF based on the comparison results. Ensure that the Vector Facility is enabled by checking and setting MSR.VEC before using this instruction. Be cautious of potential exceptions if the Vector Facility is not available.", "extended_mnemonics": [], "page_found": "Page 426 - 427", "example": "vcmpsq cr0, v2, v3"}
{"mnemonic": "veqv", "architecture": "PowerISA", "full_name": "Vector Logical Equivalence", "summary": "Performs a logical equivalence operation on the contents of two vector registers and stores the result in another vector register.", "description": "The contents of VSR[VRA+32] are XORed with the contents of VSR[VRB+32] and the complemented result is placed into VSR[VRT+32].", "syntax": "veqv VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000684", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | 1412", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nelse\n    VSR[VRT+32] ← ¬(VSR[VRA+32] ≡ VSR[VRB+32])", "special_registers": null, "programming_notes": "The veqv instruction performs a logical equivalence operation between two vector registers, followed by a bitwise NOT on the result. This is useful for comparing vectors and determining where they differ. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised.", "extended_mnemonics": [], "page_found": "Page 428 - 429", "example": "veqv v1, v2, v3"}
{"mnemonic": "vrlwnm", "architecture": "PowerISA", "full_name": "Vector Rotate Left Word then AND with Mask", "summary": "Rotates each word element of the source vector left by a specified number of bits and then performs a bitwise AND operation with a mask.", "description": "For vrlwnm, each word element of VSR[VRA+32] is rotated left by the number of bits specified in the corresponding word element of VSR[VRB+32]. The result is then ANDed with a mask generated from bits 11:15 and 19:23 of the same source vector element. The final result is stored in VSR[VRT+32].", "syntax": "vrlwnm VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000185", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\ndo i = 0 to 3\n    src1.word[0] ← VSR[VRA+32].word[i]\n    src1.word[1] ← VSR[VRA+32].word[i]\n    src2 ← VSR[VRB+32].word[i]\n    b ← src2.bit[11:15]\n    e ← src2.bit[19:23]\n    n ← src2.bit[27:31]\n    r ← src1.bit[n:n+31]\n    m ← MASK(b, e)\n    VSR[VRT+32].word[i] ← r & m", "special_registers": null, "programming_notes": "The vrlwnm instruction is useful for performing bitwise operations on vector elements. Ensure that the mask bits (11:15 and 19:23) are set correctly to achieve the desired AND operation. This instruction operates at the user privilege level and does not generate exceptions under normal conditions, but it requires the vector facility to be enabled in the MSR register.", "extended_mnemonics": [], "page_found": "Page 433 - 434", "example": "vrlwnm v1, v2, v3"}
{"mnemonic": "vrlqnm", "architecture": "PowerISA", "full_name": "Vector Rotate Left Quadword then AND with Mask VX-form", "summary": "Rotates the contents of a vector register left by a specified number of bits and performs a bitwise AND operation with a mask derived from another vector register.", "description": "Rotates the quadword element in VRA left by a number of bits specified in VRB, then performs a bitwise AND with a mask derived from the lower bits of VRB to produce the result in VRT. No condition flags are affected.", "syntax": "vrlqnm VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000145", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "shamt ← (VRB[120:127]) & 0x7F\nmask_bits ← (VRB[120:127]) & 0x3F\nrotated ← (VRA << shamt) | (VRA >> (128 - shamt))\nmask ← Generate_Mask(mask_bits)\nVRT ← rotated & mask", "special_registers": "MSR", "programming_notes": "The vrlqnm instruction is used for vectorized operations involving rotation and masking of quadword data. Ensure that the Vector Facility (VEC) bit in the Machine State Register (MSR) is set to 1, otherwise a Vector_Unavailable exception will be raised. The mask generation from bits 41:47 and 49:55 of VSR[VRB+32] should be carefully managed to achieve the desired bitwise AND operation result.", "extended_mnemonics": [], "page_found": "Page 434 - 435", "example": "vrlqnm v1, v2, v3"}
{"mnemonic": "vrlwmi", "architecture": "PowerISA", "full_name": "Vector Rotate Left Word then Mask Insert VX-form", "summary": "Rotates the contents of each word element in a vector left by a specified number of bits and inserts the result into another vector under control of a mask.", "description": "Rotates each word element of VRA left by the number of bits specified in VRB, then inserts the rotated result into VRT under control of a mask generated from VRB. No condition flags are affected.", "syntax": "vrlwmi VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000085", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "for i in 0 to 3 do\n  shamt ← (VRB[i*32+27:i*32+31]) & 0x1F\n  word ← (u32)VRA[i*32:(i*32+31)]\n  rotated ← (word << shamt) | (word >> (32 - shamt))\n  mask ← Generate_Mask_From_VRB(i)\n  VRT[i*32:(i*32+31)] ← (VRT[i*32:(i*32+31)] & ~mask) | (rotated & mask)\nend for", "special_registers": "N/A", "programming_notes": "The vrlwmi instruction is useful for performing masked insertions after rotating word elements. Ensure that the mask bits (11:15 and 19:23) are set correctly to achieve the desired insertion pattern. This instruction operates on vector registers, so ensure that the Vector Facility is enabled in the Machine State Register (MSR).", "extended_mnemonics": [], "page_found": "Page 435 - 436", "example": "vrlwmi v1, v2, v3"}
{"mnemonic": "vrldmi", "architecture": "PowerISA", "full_name": "Vector Rotate Left Doubleword then Mask Insert", "summary": "Rotates the contents of a vector register left by a specified number of bits and inserts the result into another vector register under control of a mask.", "description": "Rotates each doubleword element of VRA left by the number of bits specified in VRB, then inserts the rotated result into VRT under control of a mask derived from corresponding bits in VRB. No condition flags are affected.", "syntax": "vrldmi VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VX", "desc": "Target Vector Register"}, {"name": "VY", "desc": "Source Vector Register"}, {"name": "VB", "desc": "Mask Vector Register"}, {"name": "SH", "desc": "Shift Amount"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100000C5", "length": "32", "binary_pattern": "00011 | SH[5:0] | VX[4:0] | VY[4:0] | VB[4:0]", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "for i in 0 to 1 do\n  shamt ← (VRB[i*64+58:i*64+63]) & 0x3F\n  dword ← (u64)VRA[i*64:(i*64+63)]\n  rotated ← (dword << shamt) | (dword >> (64 - shamt))\n  mask ← Generate_Mask_From_VRB(i)\n  VRT[i*64:(i*64+63)] ← (VRT[i*64:(i*64+63)] & ~mask) | (rotated & mask)\nend for", "special_registers": "MSR", "programming_notes": "The vrldmi instruction is used for rotating doubleword elements and performing masked insertions. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. Be cautious with the alignment of source and target vectors to avoid unexpected results. This operation requires supervisor privilege level.", "extended_mnemonics": [], "page_found": "Page 436 - 437", "example": "vrldmi v1, v2, v3"}
{"mnemonic": "vmaddfp", "architecture": "PowerISA", "full_name": "Vector Multiply-Add Floating-Point", "summary": "Performs a multiply-add operation on vector elements.", "description": "For vmaddfp, the instruction multiplies each element of VSR[VRA+32] by the corresponding element of VSR[VRC+32], adds the result to the corresponding element of VSR[VRB+32], and stores the final result in VSR[VRT+32].", "syntax": "vmaddfp VRT,VRA,VRB,VRC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Source Vector Register"}], "encoding": {"format": "VA-form", "hex_opcode": "0x1000002E", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | VRC", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ← VSR[VRA+32].word[i]\n    src2 ← VSR[VRB+32].word[i]\n    src3 ← VSR[VRC+32].word[i]\n    result ← bfp32_MULTIPLY_ADD(src1,src3,src2)\n    VSR[VRT+32].word[i] ← result\nend", "special_registers": "MSR", "programming_notes": "To use a multiply-add to perform an IEEE or Java compliant multiply, the addend must be -0.0.", "extended_mnemonics": [], "page_found": "Page 447 - 448", "example": "vmaddfp v1, v2, v3, v4"}
{"mnemonic": "vmaxfp", "architecture": "PowerISA", "full_name": "Vector Maximum Floating-Point", "summary": "Performs element-wise maximum of two vector registers and stores the result in a third vector register.", "description": "For vmaxfp, for each integer value i from 0 to 3, the single-precision floating-point values in word elements i of VSR[VRA+32] and VSR[VRB+32] are compared. The larger of the two values is placed into word element i of VSR[VRT+32].", "syntax": "vmaxfp VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000040A", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src1 ← VSR[VRA+32].word[i]\n    src2 ← VSR[VRB+32].word[i]\n    VSR[VRT+32].word[i] ← bfp32_MAXIMUM(src1,src2)\nend", "special_registers": "N/A", "programming_notes": "The vmaxfp instruction is used to perform element-wise maximum comparison of single-precision floating-point values in vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. This instruction operates on 4 elements per vector register and requires proper alignment of the input vectors for accurate results.", "extended_mnemonics": [], "page_found": "Page 448 - 449", "example": "vmaxfp v1, v2, v3"}
{"mnemonic": "vexptefp", "architecture": "PowerISA", "full_name": "Vector Exponentiate Estimate Floating Point", "summary": "Estimates the result of raising 2 to the power of each element in a vector.", "description": "For vexptefp, the single-precision floating-point estimate of 2 raised to the power of each element in VSR[VRB+32] is placed into corresponding elements in VSR[VRT+32].", "syntax": "vexptefp VRT, VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000018A", "length": "32", "binary_pattern": "0 | VRT | VRB | 0", "bit_positions": "0:5 | 6:10 | 11:30 | 31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src ← VSR[VRB+32].word[i]\n    VSR[VRT+32].word[i] ← bfp32_POWER2_ESTIMATE(src)\nend", "special_registers": "MSR", "programming_notes": "The result for various special cases of the source value is given below.\n\nValue          Result\n-Infinity         +0\n-0           +1\n+0           +1\n+Infinity          +Infinity\nNaN         QNaN", "extended_mnemonics": [], "page_found": "Page 456 - 457", "example": "vexptefp v1, v3"}
{"mnemonic": "vlogefp", "architecture": "PowerISA", "full_name": "Vector Log Base 2 Estimate Floating-Point", "summary": "Estimates the base 2 logarithm of single-precision floating-point elements in a vector register.", "description": "For vlogefp, the single-precision floating-point estimate of the base 2 logarithm of each element in VSR[VRB+32] is placed into the corresponding element in VSR[VRT+32].", "syntax": "vlogefp VRT,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100001CA", "length": "32", "binary_pattern": "0 | VRT | VRB | 11000000000000000000000000000000", "bit_positions": "0:5 | 6:10 | 11:30 | 31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src ← VSR[VRB+32].word[i]\n    VSR[VRT+32].word[i] ← bfp32_LOG_BASE2_ESTIMATE(src)\nend", "special_registers": "MSR", "programming_notes": "This instruction is used for estimating the base 2 logarithm of single-precision floating-point numbers in vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. The operation processes four elements at a time, so ensure proper alignment and data handling to avoid unexpected results.", "extended_mnemonics": [], "page_found": "Page 457 - 458", "example": "vlogefp v1, v3"}
{"mnemonic": "vrefp", "architecture": "PowerISA", "full_name": "Vector Reciprocal Estimate Floating-Point VX-form", "summary": "Estimates the reciprocal of single-precision floating-point elements in a vector.", "description": "For vrefp, the single-precision floating-point estimate of the reciprocal of each element in VSR[VRB+32] is placed into corresponding elements in VSR[VRT+32].", "syntax": "vrefp VRT,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000010A", "length": "32", "binary_pattern": "4 | VRT | VRB", "bit_positions": "0:5 | 6:10 | 11:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    src ← VSR[VRB+32].word[i]\n    VSR[VRT+32].word[i] ← bfp32_RECIPROCAL_ESTIMATE(src)\nend", "special_registers": "MSR", "programming_notes": "The vrefp instruction estimates the reciprocal of each single-precision floating-point element in the source vector and stores it in the destination vector. Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the MSR register. This instruction operates on vectors containing 32-bit floating-point numbers, and it does not raise exceptions for invalid operations like division by zero; instead, it returns a NaN or infinity as appropriate.", "extended_mnemonics": [], "page_found": "Page 458 - 459", "example": "vrefp v1, v3"}
{"mnemonic": "vbpermd", "architecture": "PowerISA", "full_name": "Vector Bit Permute Doubleword", "summary": "Performs a bit permute operation on doublewords of two vector registers and stores the result in another vector register.", "description": "Performs a bit permutation on doubleword elements of two vector registers. For each of the two doubleword elements in VRA, the bits are rearranged according to indices specified in the corresponding doubleword of VRB, with the result stored in VRT. No condition registers or status fields are affected.", "syntax": "vbpermd VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Index Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100005CC", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "for i in 0 to 1:\n  for j in 0 to 63:\n    bit_index ← VRB[i].doubleword[j][0:5]\n    VRT[i].doubleword[j] ← VRA[i].doubleword[bit_index]", "special_registers": "MSR", "programming_notes": "The vbpermd instruction is used to perform bit-level permutation on doublewords of two source vectors. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, a Vector_Unavailable exception will be raised. Each byte in VRB acts as an index to select bits from VRA; if the index exceeds 63, the corresponding bit in the result is set to zero. This operation is useful for tasks requiring precise control over bit manipulation within vector registers.", "extended_mnemonics": [], "page_found": "Page 484 - 485", "example": "vbpermd v1, v2, v3"}
{"mnemonic": "vbpermq", "architecture": "PowerISA", "full_name": "Vector Bit Permute Quadword", "summary": "Performs a bit permutation on two vector registers and stores the result in another vector register.", "description": "Performs a bit permutation on the 128-bit quadword formed by concatenating two vector registers. The bits of the concatenated source are rearranged according to indices in VRB, with the 64-bit result placed in the left doubleword of VRT and the right doubleword cleared. No condition registers or status fields are affected.", "syntax": "vbpermq VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Index Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000054C", "length": "32", "binary_pattern": "1001 | VRT | VRA | VRB | 10000000000000000000000000000000", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "source ← VRA || VRB\nresult ← 0\nfor i in 0 to 63:\n  bit_index ← VRB.doubleword[i][0:6]\n  result[i] ← source[bit_index]\nVRT[0].doubleword ← result\nVRT[1].doubleword ← 0", "special_registers": "MSR", "programming_notes": "The fact that the permuted bit is 0 if the corresponding index value exceeds 127 permits the permuted bits to be selected from a 256-bit quantity, using a single index register.", "extended_mnemonics": [], "page_found": "Page 485 - 486", "example": "vbpermq v1, v2, v3"}
{"mnemonic": "mtvsrbm", "architecture": "PowerISA", "full_name": "Move to VSR Byte Mask", "summary": "Moves a byte mask from a GPR to a VSR.", "description": "The contents of bits 48:63 of GPR[RB] are used to create a field mask in VSR[VRT+32]. Each bit in the GPR determines whether the corresponding byte in the VSR is set to all 0s or all 1s.", "syntax": "mtvsrbm VRT,RB", "operands": [{"name": "VRT", "desc": "Target Vector-Specific Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10100642", "length": "32", "binary_pattern": "4 | VRT | 16 | RB | 17", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 15\n    if GPR[RB].bit[48+i]=0 then\n        VSR[VRT+32].byte[i] ←0x00\n    else\n        VSR[VRT+32].byte[i] ←0xFF\nend", "special_registers": "N/A", "programming_notes": "This instruction is used to set each byte in a vector register to either all zeros or all ones based on the bits in a general-purpose register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The instruction processes 16 bytes, so ensure that the GPR contains valid bit values for positions 48 to 63.", "extended_mnemonics": [], "page_found": "Page 486 - 487", "example": "mtvsrbm v1, r5"}
{"mnemonic": "mtvsrwm", "architecture": "PowerISA", "full_name": "Move to VSR Word Mask", "summary": "Moves a word mask from a general-purpose register to a vector scalar register.", "description": "The contents of bits 60-63 of GPR[RB] are used to set the corresponding word elements in VSR[VRT+32] to either all 0s or all 1s based on the bit value.", "syntax": "mtvsrwm VRT,RB", "operands": [{"name": "VRT", "desc": "Target Vector Scalar Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10120642", "length": "32", "binary_pattern": "4 | VRT | 18 | RB | 1602", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ndo i = 0 to 3\n    if GPR[RB].bit[60+i]=0 then\n        VSR[VRT+32].word[i] ←0x0000_0000\n    else\n        VSR[VRT+32].word[i] ←0xFFFF_FFFF\nend", "special_registers": "MSR", "programming_notes": "This instruction is used to set each word in a vector register to either all zeros or all ones based on the corresponding bits in a general-purpose register. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The instruction operates on 32-bit words and requires the source general-purpose register to be properly aligned for bit manipulation.", "extended_mnemonics": [], "page_found": "Page 487 - 488", "example": "mtvsrwm v1, r5"}
{"mnemonic": "mtvsrqm", "architecture": "PowerISA", "full_name": "Move to VSR Quadword Mask VX-form", "summary": "Moves a quadword mask from a general-purpose register to a vector scalar register.", "description": "The contents of GPR[RB] are used to determine the mask for VSR[VRT+32]. If bit 63 of GPR[RB] is 0, VSR[VRT+32] is set to all zeros. If bit 63 is 1, VSR[VRT+32] is set to all ones.", "syntax": "mtvsrqm VRT,RB", "operands": [{"name": "VRT", "desc": "Target Vector Scalar Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10140642", "length": "32", "binary_pattern": "18 | VRT | RB | 1602", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nelse if GPR[RB].bit[63]=0 then\n    VSR[VRT+32] ← 0x0000_0000_0000_0000_0000_0000_0000_0000\nelse\n    VSR[VRT+32] ← 0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF\nend", "special_registers": "MSR, VSR[VRT+32]", "programming_notes": "This instruction sets the mask for a vector register based on the most significant bit of a general-purpose register. Ensure that the Vector Facility is enabled in the Machine State Register (MSR) before using this instruction; otherwise, it will raise an exception. The instruction does not require any specific alignment or ordering of operations.", "extended_mnemonics": [], "page_found": "Page 488 - 489", "example": "mtvsrqm v1, r5"}
{"mnemonic": "vcntmbb", "architecture": "PowerISA", "full_name": "Vector Count Mask Bits Byte", "summary": "Counts the number of true (or false) mask bits in a VSR and places the count in the leftmost byte of a GPR.", "description": "Counts the number of byte elements in VRB that have bit 0 set to the value specified by MP (0 or 1), and places the count in the leftmost byte of the target GPR RT. This instruction is part of the VMX category and does not affect condition registers or status fields.", "syntax": "vcntmbb RT,VRB,MP", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "MP", "desc": "Mask Bit (0 or 1)"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10180642", "length": "32", "binary_pattern": "0 | RT | MP | VRB | 1602", "bit_positions": "0:5 | 6:10 | 11:14 | 15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "count ← 0\nfor i in 0 to 15:\n  if (VRB.byte[i][0] == MP) then\n    count ← count + 1\nRT[56:63] ← count\nRT[0:55] ← 0", "special_registers": null, "programming_notes": "This instruction is useful for counting the number of bytes in a vector register where the least significant bit matches a specified mask value (MP). Ensure that the Vector Facility is enabled by checking and setting the VEC bit in the Machine State Register (MSR) before using this instruction. The result is left-shifted 56 bits, so only the lower byte of GPR[RT] contains the count. This instruction operates at the problem state privilege level.", "extended_mnemonics": [], "page_found": "Page 492 - 493", "example": "vcntmbb r3, v3, 0"}
{"mnemonic": "vcntmbw", "architecture": "PowerISA", "full_name": "Vector Count Mask Bits Word", "summary": "Counts the number of word elements in a vector register that have bit 0 set to a specified value.", "description": "Counts the number of word elements in VRB that have bit 0 set to the value specified by MP (0 or 1), and places the count in the leftmost byte of the target GPR RT. This instruction is part of the VMX category and does not affect condition registers or status fields.", "syntax": "vcntmbw RT,VRB,MP", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "MP", "desc": "Mask Bit Value"}], "encoding": {"format": "VX-form", "hex_opcode": "0x101C0642", "length": "32", "binary_pattern": "4 | RT | 14 | MP | VRB", "bit_positions": "0:5 | 6:10 | 11:14 | 15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "count ← 0\nfor i in 0 to 3:\n  if (VRB.word[i][0] == MP) then\n    count ← count + 1\nRT[56:63] ← count\nRT[0:55] ← 0", "special_registers": null, "programming_notes": "The vcntmbw instruction is useful for counting the number of word elements in a vector register that have their least significant bit set to a specified value. Ensure that the Vector Facility (MSR.VEC) is enabled before using this instruction; otherwise, it will raise an exception. The result is stored in the upper bits of the target GPR, so be cautious when interpreting the output.", "extended_mnemonics": [], "page_found": "Page 493 - 494", "example": "vcntmbw r3, v3, 0"}
{"mnemonic": "vstrihr", "architecture": "PowerISA", "full_name": "Vector String Isolate Halfword Right-justified", "summary": "Isolates the rightmost non-zero halfword in a vector string.", "description": "From right to left, the contents of each halfword element of VSR[VRB+32] are placed into the corresponding halfword element in VSR[VRT+32]. If a halfword element in VSR[VRB+32] is found to contain 0, the corresponding halfword element and all halfword elements to the left of that halfword element in VSR[VRT+32] are set to 0.", "syntax": "vstrihr VRT,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VC-form", "hex_opcode": "0x1003000D", "length": "32", "binary_pattern": "0 | VRT | VRB | Rc | 13", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nnull_found ← 0\nwhile (!null_found) do i = 0 to 7\n    null_found ← (VSR[VRB+32].hword[7-i] = 0)\n    VSR[VRT+32].hword[7-i] ← VSR[VRB+32].hword[7-i]\nend\ndo j = i to 7\n    VSR[VRT+32].hword[7-j] ← 0\nend\nif Rc=1 then\n    CR.field[6] ← 0b00 || null_found || 0b0", "special_registers": "CR6 (if Rc=1)", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": [], "page_found": "Page 498 - 499", "example": "vstrihr v1, v3"}
{"mnemonic": "bcdadd.", "architecture": "PowerISA", "full_name": "Binary Coded Decimal Add Record", "summary": "Adds two packed decimal integers and updates the condition register.", "description": "The bcdadd. instruction adds two binary coded decimal numbers stored in vector registers VRA and VRB, and stores the result in vector register VRT. The PS field specifies whether to set the sign code to 0b1100 or 0b1111 if the unbounded result is zero.", "syntax": "bcdadd. VRT,RA,RB", "operands": [{"name": "VRT", "desc": "Target Vector Storage Register"}, {"name": "RA", "desc": "Source General Purpose Register containing the first packed decimal integer"}, {"name": "RB", "desc": "Source General Purpose Register containing the second packed decimal integer"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "PS", "desc": "Programmable Sign Code"}, {"name": "vTmp", "desc": "Target Vector-Scalar Register"}, {"name": "vA", "desc": "Source Vector-Scalar Register"}, {"name": "vB", "desc": "Source Vector-Scalar Register"}, {"name": "RT", "desc": "Target General Purpose Register"}], "encoding": {"format": "XO-form", "hex_opcode": "0x10000401", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | PS", "bit_positions": ""}, "extension": "Decimal Floating-Point", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nVRT[32] ← bcd_ADD(VRA[32], VRB[32], PS)\nCR.bit[56] ← inv_flag ? 0b0 : lt_flag\nCR.bit[57] ← inv_flag ? 0b0 : gt_flag\nCR.bit[58] ← inv_flag ? 0b0 : eq_flag\nCR.bit[59] ← ox_flag | inv_flag", "special_registers": "CR0, XER, FPSCR", "programming_notes": "When bit 3 of CR field 6 is set to 1 by bcdadd. or bcdsub., either an overflow occurred or one or both operands are not valid encodings of decimal values.", "extended_mnemonics": [], "page_found": "Page 500 - 501", "example": "bcdadd. v1, r4, r5"}
{"mnemonic": "vmul10uq", "architecture": "PowerISA", "full_name": "Vector Multiply-by-10 Unsigned Quadword", "summary": "Multiplies the contents of a vector register by 10 and places the result in another vector register.", "description": "The rightmost 128 bits of the product of src multiplied by the value 10 are placed into VSR[VRT+32]. Let src be the unsigned integer value in VSR[VRA+32].", "syntax": "vmul10uq VRT,VRA", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000201", "length": "32", "binary_pattern": "0 | VRT | VRA | 0", "bit_positions": "0:5 | 6:10 | 11:30 | 31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsrc ←EXTZ(VSR[VRA+32])\nprod ←(src << 3) + (src << 1)\nVSR[VRT+32] ←CHOP128(prod)", "special_registers": "MSR", "programming_notes": "This instruction multiplies the upper 64 bits of a vector register by 10 and stores the result in another vector register. Ensure that the Vector Facility is enabled (MSR.VEC=1); otherwise, a Vector_Unavailable exception will be raised. The operation involves shifting and adding to achieve multiplication by 10, so be cautious with overflow if the input value is close to the maximum unsigned 64-bit integer.", "extended_mnemonics": [], "page_found": "Page 509 - 510", "example": "vmul10uq v1, v2"}
{"mnemonic": "vmul10euq", "architecture": "PowerISA", "full_name": "Vector Multiply-by-10 Extended Unsigned Quadword", "summary": "Multiplies the contents of two vector registers by 10 and extends the result.", "description": "The instruction multiplies the unsigned integer value in VSR[VRA+32] by 10, adds the unsigned packed decimal value from bits 124:127 of VSR[VRB+32], and places the rightmost 128 bits of the result into VSR[VRT+32].", "syntax": "vmul10euq VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000241", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nsrc ← EXTZ(VSR[VRA+32])\ncin ← EXTZ(VSR[VRB+32].bit[124:127])\nprod ← (src << 3) + (src << 1) + cin\nVSR[VRT+32] ← CHOP128(prod)", "special_registers": "MSR", "programming_notes": "This instruction is used for multiplying an unsigned integer by 10 and adding a packed decimal value. Ensure that the Vector Facility is enabled in the MSR register to avoid exceptions. The operation requires proper alignment of input values, specifically focusing on bits 124:127 of the second source vector. Be cautious with overflow conditions as the result is truncated to 128 bits.", "extended_mnemonics": [], "page_found": "Page 510 - 511", "example": "vmul10euq v1, v2, v3"}
{"mnemonic": "bcdcpsgn.", "architecture": "PowerISA", "full_name": "Decimal Copy Sign VX-form", "summary": "Copies the sign of a decimal value from one register to another while preserving the magnitude.", "description": "The bcdcpsgn. instruction copies the sign of the decimal value in VSR[VRB+32] to the decimal value in VSR[VRA+32], placing the result into VSR[VRT+32]. If either input is an invalid encoding, the result is undefined.", "syntax": "bcdcpsgn. VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000341", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Decimal Floating-Point", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ninv_flag ←(VSR[VRA+32].nibble[31] < 0xA) |\n            (VSR[VRB+32].nibble[31] < 0xA)\ndo i = 0 to 30\n    inv_flag ←inv_flag |\n                (VSR[VRA+32].nibble[i] > 0x9) |\n                (VSR[VRB+32].nibble[i] > 0x9)\nend\nsrc_sign ←(VSR[VRB+32].nibble[31] = 0xB) |\n            (VSR[VRB+32].nibble[31] = 0xD)\neq_flag  ←(VSR[VRA+32].nibble[0:30] = 0)\nlt_flag  ←(eq_flag=0) & (src_sign=1)\ngt_flag  ←(eq_flag=0) & (src_sign=0)\nresult.nibble[0:30] ←VSR[VRA+32].nibble[0:30]\nresult.nibble[31]   ←VSR[VRB+32].nibble[31]\nVSR[VRT+32] ←inv_flag ? undefined : result\nCR.bit[56]  ←inv_flag ? 0b0 : lt_flag\nCR.bit[57]  ←inv_flag ? 0b0 : gt_flag\nCR.bit[58]  ←inv_flag ? 0b0 : eq_flag\nCR.bit[59]  ←inv_flag", "special_registers": "CR6, FPSCR", "programming_notes": "The bcdcpsgn. instruction is used to copy the sign of a decimal value from one vector register to another, while preserving the magnitude. Ensure that both input vectors are valid decimal encodings; otherwise, the result is undefined. This instruction operates at the user privilege level and does not raise exceptions for invalid inputs, instead setting CR6 bits accordingly.", "extended_mnemonics": [], "page_found": "Page 511 - 512", "example": "bcdcpsgn. v1, v2, v3"}
{"mnemonic": "bcdsetsgn.", "architecture": "PowerISA", "full_name": "Set Sign for Packed Decimal", "summary": "Sets the sign of a packed decimal value in a vector register based on the specified conditions.", "description": "The bcdsetsgn. instruction sets the sign of a packed decimal value in VSR[VRT+32] based on the contents of VSR[VRB+32] and the PS flag.", "syntax": "bcdsetsgn. VRT,VRB,PS", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "PS", "desc": "Packed Sign Flag"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x101F0581", "length": "32", "binary_pattern": "4 | VRT | VRB | PS", "bit_positions": "0:5 | 6:10 | 11:20 | 21:31"}, "extension": "Decimal Floating-Point", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\n\ninv_flag ←(VSR[VRB+32].nibble[31] < 0xA)\ndo i = 0 to 30\n    inv_flag ←inv_flag |\n               (VSR[VRB+32].nibble[i] > 0x9)\nend\n\nsrc_sign ←(VSR[VRB+32].nibble[31] = 0xB) |\n           (VSR[VRB+32].nibble[31] = 0xD)\n\neq_flag  ←(VSR[VRB+32].nibble[0:30] = 0)\nlt_flag  ←(eq_flag=0) & (src_sign=1)\ngt_flag  ←(eq_flag=0) & (src_sign=0)\n\nresult.nibble[0:30] ←VSR[VRB+32].nibble[0:30]\nresult.nibble[31] ←\n   (src_sign=0) ? ((PS=0) ? 0xC:0xF) : 0xD\n\nVSR[VRT+32] ←inv_flag ? undefined : result\n\nCR.bit[56]  ←inv_flag ? 0b0 : lt_flag\nCR.bit[57]  ←inv_flag ? 0b0 : gt_flag\nCR.bit[58]  ←inv_flag ? 0b0 : eq_flag\nCR.bit[59]  ←inv_flag", "special_registers": "CR6, FPSCR", "programming_notes": "The bcdsetsgn. instruction is used to set the sign of a packed decimal value in VSR[VRT+32] based on the contents of VSR[VRB+32]. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will be raised. The instruction checks for invalid characters in the input and sets the sign accordingly, updating condition register bits CR[56-59] to reflect the result's status.", "extended_mnemonics": [], "page_found": "Page 512 - 513", "example": "bcdsetsgn. v1, v3, 0"}
{"mnemonic": "bcds.", "architecture": "PowerISA", "full_name": "Decimal Shift VX-form", "summary": "Shifts a signed packed decimal value by a specified number of digits and rounds the result.", "description": "The bcds. instruction shifts a signed packed decimal value in VSR[VRB+32] by a number of digits specified in byte element 7 of VSR[VRA+32]. The result is placed into VSR[VRT+32].", "syntax": "bcds. VRT,VRA,VRB,PS", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register containing the shift count"}, {"name": "VRB", "desc": "Source Vector Register containing the packed decimal value to be shifted"}, {"name": "PS", "desc": "Packed Decimal Sign Control"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100004C1", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB | PS | 0 | 0 | 0", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22 | 23:30 | 31"}, "extension": "Decimal Floating-Point", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\nn ← EXTS(VSR[VRA+32].byte[7])\ninv_flag ← (VSR[VRB+32].nibble[31] < 0xA)\ndo i = 0 to 30\n    inv_flag ← inv_flag | (VSR[VRB+32].nibble[i] > 0x9)\nend\nsrc_sign ← (VSR[VRB+32].nibble[31] = 0xB) | (VSR[VRB+32].nibble[31] = 0xD)\neq_flag ← (VSR[VRB+32].nibble[0:30] = 0)\nlt_flag ← (eq_flag=0) & (src_sign=1)\ngt_flag ← (eq_flag=0) & (src_sign=0)\nif n > 0 then do     // shift left\n    shcnt ← (n<32) ? n : 31\n    src.nibble[0:30] ← VSR[VRB+32].nibble[0:30]\n    src.nibble[31:61] ← 0\n    ox_flag ← (shcnt > 0) & (src.nibble[0:shcnt-1] != 0)\nend else do              // shift right\n    shcnt ← ((¬n+1)<32) ? (¬n+1) : 31\n    src.nibble[0:30] ← 0\n    src.nibble[31:61] ← VSR[VRB+32].nibble[0:30]\n    result.nibble[0:30] ← src.nibble[31-shcnt:61-shcnt]\n    ox_flag ← 0b0\nend\nresult.nibble[31] ← (src_sign=0) ? ((PS=0) ? 0xC : 0xF) : 0xD\nVSR[VRT+32] ← inv_flag ? undefined : result\nCR.bit[56] ← inv_flag ? 0b0 : lt_flag\nCR.bit[57] ← inv_flag ? 0b0 : gt_flag\nCR.bit[58] ← inv_flag ? 0b0 : eq_flag\nCR.bit[59] ← inv_flag | ox_flag", "special_registers": "CR6, VSR, FPSCR", "programming_notes": "The bcds. instruction is used for shifting signed packed decimal values in vector registers. Ensure that the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will occur. The shift amount is determined by byte element 7 of the source register, and the result is stored in the target register. Be cautious with negative shifts as they are treated as right shifts. The instruction updates condition registers for comparison purposes.", "extended_mnemonics": [], "page_found": "Page 513 - 514", "example": "bcds. v1, v2, v3, 0"}
{"mnemonic": "bcdus.", "architecture": "PowerISA", "full_name": "Binary Coded Decimal Unsigned Shift", "summary": "Performs an unsigned shift on packed decimal values in vector registers.", "description": "The bcdus. instruction shifts the contents of VSR[VRB+32] by a number of digits specified by the signed integer value in byte element 7 of VSR[VRA+32]. The result is placed into VSR[VRT+32].", "syntax": "bcdus. VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register containing the shift count"}, {"name": "VRB", "desc": "Source Vector Register containing the packed decimal value to be shifted"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000481", "length": "32", "binary_pattern": "0 | 6 | 11 | 16 | 21 | 22 | 23 | 31", "bit_positions": "0 | 6 | 11 | 16 | 21 | 22 | 23 | 31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\n\ninv_flag ←0\ndo i = 0 to 31\n    inv_flag ←inv_flag | (VSR[VRB+32].nibble[i] > 0x9)\nend\neq_flag  ←(VSR[VRB+32].nibble[0:31] = 0)\ngt_flag  ←(eq_flag=0)\n\nif n > 0 then do     // shift left\n    shcnt ←(n<33) ? n : 32\n    src.nibble[0:31] ←VSR[VRB+32]\n    src.nibble[32:63] ←0\n    ox_flag ←(shcnt > 0) & (src.nibble[0:shcnt-1] != 0)\nend else do              // shift right\n    shcnt ←((¬n+1)<33) ? (¬n+1) : 32\n    src.nibble[0:31] ←0\n    src.nibble[32:63] ←VSR[VRB+32]\n    result ←src.nibble[32-shcnt:63-shcnt]\n    ox_flag ←0\nend\n\nVSR[VRT+32] ←inv_flag ? undefined : result\n\nCR.bit[56] ←0b0\nCR.bit[57] ←inv_flag ? 0b0 : gt_flag\nCR.bit[58] ←inv_flag ? 0b0 : eq_flag\nCR.bit[59] ←inv_flag | ox_flag", "special_registers": "CR, XER", "programming_notes": "The bcdus. instruction is used for shifting Binary Coded Decimal (BCD) values within vector registers. Ensure that the shift count in byte element 7 of VSR[VRA+32] is valid; otherwise, the result is undefined. This instruction operates at the user privilege level and may raise an exception if vector processing is unavailable. Be cautious with alignment as it affects the interpretation of BCD digits.", "extended_mnemonics": [], "page_found": "Page 514 - 515", "example": "bcdus. v1, v2, v3"}
{"mnemonic": "bcdsr.", "architecture": "PowerISA", "full_name": "Binary Coded Decimal Shift and Round", "summary": "Shifts a binary coded decimal value by a specified number of digits and rounds the result.", "description": "The bcdsr. instruction shifts a signed packed decimal value in VSR[VRB+32] by a number of digits specified by the signed integer value in byte element 7 of VSR[VRA+32]. The result is rounded and placed into VSR[VRT+32].", "syntax": "bcdsr. VRT,VRA,VRB,PS", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register containing the shift count"}, {"name": "VRB", "desc": "Source Vector Register containing the packed decimal value to be shifted and rounded"}, {"name": "PS", "desc": "Packed Sign field"}], "encoding": {"format": "VX-form", "hex_opcode": "0x100005C1", "length": "32", "binary_pattern": "000100 | VRT | VRA | VRB | 1.111 | 000001", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ninv_flag ←(VSR[VRB+32].nibble[31] < 0xA)\ndo i = 0 to 30\n    inv_flag ←inv_flag | (VSR[VRB+32].nibble[i] > 0x9)\nend\nsrc_sign ←(VSR[VRB+32].nibble[31] = 0xB) | (VSR[VRB+32].nibble[31] = 0xD)\neq_flag  ←(VSR[VRB+32].nibble[0:30] = 0)\ngt_flag  ←(eq_flag=0) & (src_sign=0)\nlt_flag  ←(eq_flag=0) & (src_sign=1)\nn ←EXTS(VSR[VRA+32].byte[7])\nif n > 0 then do     // shift left\n    shcnt ←Clamp(n, 0, 31)\n    src.nibble[0:30] ←VSR[VRB+32].nibble[0:30]\n    src.nibble[31:61] ←0\n    result.nibble[0:30] ←src.nibble[shcnt:shcnt+30]\n    ox_flag ←(shcnt > 0) & (src.nibble[0:shcnt-1] != 0)\n    g_flag ←0\nend else do              // shift right\n    shcnt ←Clamp(¬n + 1, 0, 31)\n    src.nibble[31:61] ←VSR[VRB+32].nibble[0:30]\n    ox_flag ←0\ng_flag  ←(shcnt > 0) & (EXTZ(src.nibble[62-shcnt]) >= 5)\nend\nresult.nibble[31] ← (src_sign=0) ? ((PS=0) ? 0xC : 0xF) : 0xD\nresult ←(g_flag=0) ? result : bcd_INCREMENT(result)\nVSR[VRT+32] ←inv_flag ? undefined : result\nCR.bit[56] ←inv_flag ? 0b0 : lt_flag\nCR.bit[57] ←inv_flag ? 0b0 : gt_flag\nCR.bit[58] ←inv_flag ? 0b0 : eq_flag\nCR.bit[59] ←inv_flag | ox_flag", "special_registers": "CR6, VSR", "programming_notes": "The bcdsr. instruction is used for shifting and rounding packed decimal values in vector registers. Ensure the Vector Facility (MSR.VEC) is enabled; otherwise, a Vector_Unavailable exception will occur. The instruction handles both left and right shifts based on the sign of the shift count in byte element 7 of the source register. Be cautious with invalid input detection, as any nibble outside the range 0x0 to 0x9 or special nibbles (0xB, 0xD) will set the CR6[3] bit and result in undefined output.", "extended_mnemonics": [], "page_found": "Page 515 - 516", "example": "bcdsr. v1, v2, v3, 0"}
{"mnemonic": "bcdtrunc.", "architecture": "PowerISA", "full_name": "Decimal Truncate VX-form", "summary": "Truncates a decimal value to a specified length and updates the condition register.", "description": "The bcdtrunc. instruction truncates a packed decimal value in VSR[VRB+32] to a specified length and stores the result in VSR[VRT+32]. The length is determined by bits 48:63 of VSR[VRA+32].", "syntax": "bcdtrunc. VRT,VRA,VRB,PS", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register containing the length"}, {"name": "VRB", "desc": "Source Vector Register containing the packed decimal value"}, {"name": "PS", "desc": "Packed Sign flag"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000501", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB | PS | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0", "bit_positions": ""}, "extension": "Decimal Floating-Point", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ninv_flag ←(VSR[VRB+32].nibble[31] < 0xA)\ndo i = 0 to 30\n    inv_flag ←inv_flag |\n                (VSR[VRB+32].nibble[i] > 0x9)\nend\nlength  ←VSR[VRA+32].bit[48:63]\nox_flag ←0\nsrc_sign ←(VSR[VRB+32].nibble[31] = 0xB) |\n            (VSR[VRB+32].nibble[31] = 0xD)\neq_flag  ←(VSR[VRB+32].nibble[0:30] = 0)\nlt_flag ←  src_sign & ¬eq_flag\ngt_flag  ←¬src_sign & ¬eq_flag\nif length < 31 then do\ndo i = 0 to 30-length\n    if VSR[VRB+32].nibble[i]!=0b0000 then\n       ox_flag ←1\n    result.nibble[i] ←0b0000\nend\nif length > 0 then do\ndo i = 31-length to 30\n    result.nibble[i] ←VSR[VRB+32].nibble[i]\nend\nend\nelse\n    result.nibble[0:30] ←VSR[VRB+32].nibble[0:30]\nresult.nibble[31] ←\n    (src_sign=0) ? ((PS=0) ? 0xC : 0xF) : 0xD\nVSR[VRT+32] ←inv_flag ? undefined : result\nCR.bit[56] ←inv_flag ? 0b0 : lt_flag\nCR.bit[57] ←inv_flag ? 0b0 : gt_flag\nCR.bit[58] ←inv_flag ? 0b0 : eq_flag\nCR.bit[59] ←inv_flag | ox_flag", "special_registers": "CR6, FPSCR", "programming_notes": "The bcdtrunc. instruction is used to truncate a packed decimal value in VSR[VRB+32] to a specified length, determined by bits 48:63 of VSR[VRA+32]. Ensure that the vector facility (MSR.VEC) is enabled before using this instruction. The instruction checks for invalid nibbles and sets flags accordingly. Be cautious with alignment and ensure proper handling of special cases like overflow and sign preservation.", "extended_mnemonics": [], "page_found": "Page 516 - 517", "example": "bcdtrunc. v1, v2, v3, 0"}
{"mnemonic": "bcdutrunc.", "architecture": "PowerISA", "full_name": "Binary Coded Decimal Unsigned Truncate", "summary": "Truncates the unsigned decimal value in VRB to a specified length and places it into VRT.", "description": "The instruction truncates the unsigned decimal value in VSR[VRB+32] to the length specified by the integer value in bits 48:63 of VSR[VRA+32]. The result is placed into VSR[VRT+32].", "syntax": "bcdutrunc. VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register containing the length"}, {"name": "VRB", "desc": "Source Vector Register containing the unsigned decimal value"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000541", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB | 1 | / | 321", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:29 | 30 | 31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\ninv_flag ←0\ndo i = 0 to 31\n    inv_flag ←inv_flag |\n                (VSR[VRB+32].nibble[i] > 0x9)\nend\nlength ←VSR[VRA+32].bit[48:63]\nox_flag ←0\neq_flag  ←(VSR[VRB+32].nibble[0:31] = 0)\ngt_flag  ←(VSR[VRB+32].nibble[0:31] != 0)\nif length < 32 then do\n    do i = 0 to 31-length\n        ox_flag ←1\n        result.nibble[i] ←0b0000\n    end\n    if length > 0 then do\n        do i = 32-length to 31\n            result.nibble[i] ←VSR[VRB+32].nibble[i]\n        end\n    end\nend\nelse result ←VSR[VRB+32]\nVSR[VRT+32] ←inv_flag ? undefined : result\nCR.bit[56] ←0b0\nCR.bit[57] ←inv_flag ? 0b0 : gt_flag\nCR.bit[58] ←inv_flag ? 0b0 : eq_flag\nCR.bit[59] ←inv_flag | ox_flag", "special_registers": "CR6, CR", "programming_notes": "The bcdutrunc. instruction is used to truncate an unsigned decimal value stored in a vector register. Ensure that the length specified in VSR[VRA+32] does not exceed 32 nibbles, as truncating beyond this will result in undefined behavior. The instruction sets various condition register bits (CR6) based on the operation's outcome, such as overflow and equality flags. Be cautious of invalid nibble values greater than 0x9, which can lead to incorrect results.", "extended_mnemonics": [], "page_found": "Page 517 - 518", "example": "bcdutrunc. v1, v2, v3"}
{"mnemonic": "mtvscr", "architecture": "PowerISA", "full_name": "Move To Vector Status and Control Register", "summary": "Moves the contents of a vector register word into the VSCR.", "description": "The contents of word element 3 of VSR[VRB+32] are placed into the VSCR.", "syntax": "mtvscr VRB", "operands": [{"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000644", "length": "32", "binary_pattern": "16 | VRB | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0", "bit_positions": ""}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nVSCR ← VSR[VRB+32].word[3]", "special_registers": "MSR, VSCR", "programming_notes": "The mtvscr instruction is used to transfer a value from a vector register to the VSCR. Ensure that the Vector Facility (MSR.VEC) is enabled before executing this instruction; otherwise, a Vector_Unavailable exception will be raised. This instruction requires proper alignment of the source vector register and operates at user privilege level.", "extended_mnemonics": [], "page_found": "Page 518 - 519", "example": "mtvscr v3"}
{"mnemonic": "lxssp", "architecture": "PowerISA", "full_name": "Load VSX Scalar Single-Precision", "summary": "Accesses a floating-point operand in single-precision format from storage, converts it to double-precision format, and loads it into a VSR.", "description": "When Big-Endian byte ordering is employed, the contents of the word in storage at address EA are placed into load_data in such an order that; the contents of the byte in storage at address EA are placed into byte 0 of load_data, the contents of the byte in storage at address EA+1 are placed into byte 1 of load_data, the contents of the byte in storage at address EA+2 are placed into byte 2 of load_data, and the contents of the byte in storage at address EA+3 are placed into byte 3 of load_data. When Little-Endian byte ordering is employed, the contents of the word in storage at address EA are placed into load_data in such an order that; the contents of the byte in storage at address EA are placed into byte 3 of load_data, the contents of the byte in storage at address EA+1 are placed into byte 2 of load_data, the contents of the byte in storage at address EA+2 are placed into byte 1 of load_data, and the contents of the byte in storage at address EA+3 are placed into byte 0 of load_data. The contents of doubleword element 1 of VSR[VRT+32] are set to 0.", "syntax": "lxssp RT,RA,RB", "operands": [{"name": "RT", "desc": "Target Vector-Specific Register"}, {"name": "RA", "desc": "Base Address General Purpose Register"}, {"name": "RB", "desc": "Offset General Purpose Register"}, {"name": "VRT", "desc": "Target VSX Register"}, {"name": "disp", "desc": "Displacement"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xE4000003", "length": "32", "binary_pattern": "0 | VRT | RA | DS | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 | 31", "bit_positions": ""}, "extension": "VSX", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\nEA ← (RA|0) + EXTS64(DS||0b00)\nload_data ← MEM(EA,4)\nresult ← bfp_CONVERT_FROM_BFP32(MEM(EA,4))\nVSR[VRT+32].dword[0] ← bfp64_CONVERT_FROM_BFP(result)\nVSR[VRT+32].dword[1] ← 0x0000_0000_0000_0000", "special_registers": "N/A", "programming_notes": "The lxssp instruction loads a single-precision floating-point value from memory into the VSX register, ensuring proper byte ordering based on the system's endianness. It is commonly used for loading scalar floating-point data into VSX registers for further processing. Ensure that the address (EA) is properly aligned to avoid potential performance penalties or exceptions. This instruction operates at user privilege level and will raise a Vector_Unavailable exception if the VEC bit in the MSR register is not set.", "extended_mnemonics": [], "page_found": "Page 532 - 533", "example": "lxssp r3, r4, r5"}
{"mnemonic": "xsrdpi", "architecture": "PowerISA", "full_name": "Round to Floating-Point Integer (Double-Precision)", "summary": "Rounds a double-precision floating-point value to an integer using the specified rounding mode.", "description": "The result is placed into doubleword element 0 of VSR[XT] in double-precision format. The contents of doubleword element 1 of VSR[XT] are set to 0.", "syntax": "xsrdpi VRT, VRA", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xF0000124", "length": "32", "binary_pattern": "60 | T | B | 11 | 16 | BX | TX", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_BFP64(VSR[VRB+32].dword[0])\nrnd ← bfp_ROUND_TO_INTEGER(0b100, src)\nresult ← bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nvex_flag ← FPSCR.VE & vxsnan_flag\nif vex_flag=0 then do\n    VSR[32×TX+T].dword[0] ← result\n    VSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\n    FPSCR.FPRF ← fprf_CLASS_BFP64(result)\nend\nFPSCR.FR ← 0b0\nFPSCR.FI ← 0b0", "special_registers": "FPSCR (FPRF, FX, VXSNAN, FR, FI)", "programming_notes": "This instruction can be used to operate on a single-precision source operand. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 534 - 535", "example": "xsrdpi v1, v2"}
{"mnemonic": "xscvdpsxw", "architecture": "PowerISA", "full_name": "VSX Scalar Convert with round to zero Double-Precision to Signed Word", "summary": "Converts a double-precision floating-point number to a signed word, rounding towards zero.", "description": "This instruction converts the double-precision floating-point number in VSR[XB] to a signed word and places it into word elements 0 and 1 of VSR[XT]. If the operand is positive or +Infinity, 0x7FFF_FFFF is placed. If negative, -Infinity, or NaN, 0x8000_0000 is placed.", "syntax": "xscvdpsxw XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xF0000160", "length": "32", "binary_pattern": "60 | XT | / | XB | 352", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if (VSR[XB][0] is positive or +Infinity) then\n    VSR[XT][0:31] <- 0x7FFF_FFFF\nelse if (VSR[XB][0] is negative, -Infinity, or NaN) then\n    VSR[XT][0:31] <- 0x8000_0000\nVSR[XT][32:63] <- 0", "special_registers": "FR, FI, VXSNAN, VXCVI", "programming_notes": "This instruction is useful for converting double-precision floating-point numbers to a signed word format, with specific handling for edge cases like infinity and NaN. Ensure that the input register contains valid double-precision values to avoid unexpected results. The instruction operates at user privilege level and does not generate exceptions under normal conditions.", "extended_mnemonics": [], "page_found": "Page 548 - 549", "example": "xscvdpsxw vs1, vs3"}
{"mnemonic": "xscvsxddp", "architecture": "PowerISA", "full_name": "VSX Scalar Convert with round Signed Doubleword to Double-Precision format", "summary": "Converts a signed doubleword integer from VSX register XB to a double-precision floating-point number in VSX register XT, rounding according to the FPSCR.RN setting.", "description": "The instruction converts the signed integer value in doubleword element 0 of VSR[XB] to an unbounded-precision floating-point value and rounds it to double-precision format using the rounding mode specified by RN. The result is placed into doubleword element 0 of VSR[XT], with doubleword element 1 set to zero.", "syntax": "xscvsxddp XT,RB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "RB", "desc": "Source Vector-Scalar Register"}, {"name": "XB", "desc": "Source VSX Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xF00005E0", "length": "32", "binary_pattern": "60 | XT | / | XB | 752", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_SI64(VSR[32×BX+B].dword[0])\nrnd ← bfp_ROUND_TO_BFP64(0b0, FPSCR.RN, v)\nresult ← bfp64_CONVERT_FROM_BFP(rnd)\nif xx_flag=1 then SetFX(FPSCR.XX)\nVSR[32×TX+T].dword[0] ← result\nVSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\nFPSCR.FPRF ← fprf_CLASS_BFP64(result)\nFPSCR.FR ← inc_flag\nFPSCR.FI ← xx_flag", "special_registers": "XX, FPRF", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 562 - 563", "example": "xscvsxddp vs1, r5"}
{"mnemonic": "lxsd", "architecture": "PowerISA", "full_name": "Load VSX Scalar Doubleword", "summary": "Loads a doubleword from memory into a VSX scalar register.", "description": "When Big-Endian byte ordering is employed, the contents of the doubleword in storage at address EA are placed into load_data in such an order that; the contents of the byte in storage at address EA are placed into byte 0 of load_data, and so forth until the contents of the byte in storage at address EA+7 are placed into byte 7 of load_data. When Little-Endian byte ordering is employed, let load_data be the contents of the doubleword in storage at address EA such that; the contents of the byte in storage at address EA are placed into byte 7 of load_data, and so forth until the contents of the byte in storage at address EA+7 are placed into byte 0 of load_data.", "syntax": "lxsd VRT,disp(RA)", "operands": [{"name": "VRT", "desc": "Target VSX Scalar Register"}, {"name": "RA", "desc": "Base General Purpose Register"}, {"name": "disp", "desc": "Displacement"}], "encoding": {"format": "DS-form", "hex_opcode": "0xE4000002", "length": "32", "binary_pattern": "0 | VRT | RA | DS | 16 | 2", "bit_positions": "0:5 | 6:10 | 11:15 | 16:28 | 29:30 | 31"}, "extension": "VSX", "pseudocode": "if 'lxsd' then\n    EA ← (RA|0) + EXTS64(DS||0b00)\n    VSR[VRT+32].dword[0] ← MEM(EA,8)\n    VSR[VRT+32].dword[1] ← 0x0000_0000_0000_0000", "special_registers": "N/A", "programming_notes": "The lxsd instruction loads a doubleword from memory into the VSX register, handling both Big-Endian and Little-Endian byte orderings. Ensure that the address is properly aligned to avoid potential performance penalties or exceptions. This instruction operates at user privilege level.", "extended_mnemonics": [], "page_found": "Page 597 - 598", "example": "lxsd v1, disp(RA)"}
{"mnemonic": "lxsdx", "architecture": "PowerISA", "full_name": "Load VSX Scalar Doubleword Indexed", "summary": "Loads a doubleword from memory into a VSX scalar register.", "description": "Loads a doubleword from memory at the address computed as (RA) + (RB) and places it into the specified VSX scalar register XT. The upper 64 bits of the VSX register remain unchanged. This is a VSX instruction and does not affect condition registers or status fields.", "syntax": "lxsdx XT,RA,RB", "operands": [{"name": "XT", "desc": "Target VSX Scalar Register"}, {"name": "RA", "desc": "Source General Purpose Register (Base Address)"}, {"name": "RB", "desc": "Source General Purpose Register (Index)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C000498", "length": "32", "binary_pattern": "0 | T | RA | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "ea ← (RA) + (RB)\nXT.doubleword[1] ← [ea]", "special_registers": "MSR", "programming_notes": "The lxsdx instruction is commonly used to load a doubleword from memory into a VSX scalar register. Ensure that the VSX facility is enabled by checking and setting the appropriate bit in the MSR register. Be cautious of alignment requirements; while the instruction can handle unaligned accesses, performance may be improved with aligned data. This instruction operates at user privilege level but will raise an exception if the VSX facility is not available.", "extended_mnemonics": [], "page_found": "Page 598 - 599", "example": "lxsdx vs1, r4, r5"}
{"mnemonic": "lxsibzx", "architecture": "PowerISA", "full_name": "Load VSX Scalar as Integer Byte & Zero Indexed X-form", "summary": "Loads a byte from memory and places it into the specified VSX register, zeroing the upper half.", "description": "Loads a signed byte from memory at address (RA) + (RB), converts it to a 64-bit integer, and places the result into the right element of VSX register XT. The left element of XT is cleared. This is a VSX instruction and does not affect condition registers or status fields.", "syntax": "lxsibzx XT,RA,RB", "operands": [{"name": "XT", "desc": "Target VSX Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}, {"name": "VRT", "desc": "Target VSX Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00061A", "length": "32", "binary_pattern": "31 | XT | RA | RB | 781 | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "ea ← (RA) + (RB)\nbyte_value ← [ea] (sign-extended to 64 bits)\nXT.doubleword[1] ← byte_value\nXT.doubleword[0] ← 0", "special_registers": "N/A", "programming_notes": "The lxsibzx instruction is commonly used to load an unsigned byte from memory into a VSX register, with the upper 64 bits set to zero. Ensure that the effective address (EA) is properly aligned and within bounds to avoid exceptions. This instruction requires VSX or Vector facility enabled in the MSR register, depending on the transactional execution context.", "extended_mnemonics": [], "page_found": "Page 599 - 600", "example": "lxsibzx vs1, r4, r5"}
{"mnemonic": "lxsspx", "architecture": "PowerISA", "full_name": "Load VSX Scalar Single-Precision Indexed X-form", "summary": "Loads a single-precision floating-point value from memory and converts it to double-precision format in a VSX register.", "description": "Loads a single-precision floating-point value from memory at address (RA) + (RB), converts it to double-precision format, and places the result into the right doubleword of VSX register XT. The left doubleword is cleared. This is a VSX instruction and does not affect condition registers or status fields.", "syntax": "lxsspx XT,RA,RB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "RA", "desc": "Source General Purpose Register (Base Address)"}, {"name": "RB", "desc": "Source General Purpose Register (Index)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C000418", "length": "32", "binary_pattern": "0 | T | RA | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "ea ← (RA) + (RB)\nsp_value ← [ea] (single-precision)\ndp_value ← convert_sp_to_dp(sp_value)\nXT.doubleword[1] ← dp_value\nXT.doubleword[0] ← 0", "special_registers": "MSR", "programming_notes": "The lxsspx instruction is used to load a single-precision floating-point value from memory into a VSX register, converting it to double-precision format. Ensure that the VSX facility is enabled by checking and setting the MSR.VSX bit. The instruction requires 4-byte alignment for the source data in memory to avoid potential exceptions. This instruction operates at user privilege level.", "extended_mnemonics": [], "page_found": "Page 603 - 604", "example": "lxsspx vs1, r4, r5"}
{"mnemonic": "stxsd", "architecture": "PowerISA", "full_name": "Store VSX Scalar Doubleword", "summary": "Stores the contents of doubleword element 0 of VSR[XS] to memory.", "description": "The instruction stores the contents of doubleword element 0 of VSR[XS] to memory at the effective address (EA) calculated from RA and DS.", "syntax": "stxsd VRS,disp(RA)", "operands": [{"name": "VRS", "desc": "Vector-Scalar Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "disp", "desc": "Displacement value"}], "encoding": {"format": "DS-form", "hex_opcode": "0xF4000002", "length": "32", "binary_pattern": "0 | VRS | RA | DS | 2", "bit_positions": "0:5 | 6:10 | 11:15 | 16:29 | 30:31"}, "extension": "VSX", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\nEA ← (RA|0) + EXTS64(DS||0b00)\nMEM(EA,8) ← VSR[VRS+32].dword[0]", "special_registers": "MSR", "programming_notes": "The stxsd instruction stores the first doubleword of a VSX register to memory. Ensure that the Vector Facility is enabled by checking and setting MSR.VEC if necessary. The EA must be 8-byte aligned for optimal performance, though unaligned accesses are supported with potential performance penalties.", "extended_mnemonics": [], "page_found": "Page 604 - 605", "example": "stxsd v1, disp(RA)"}
{"mnemonic": "stxsdx", "architecture": "PowerISA", "full_name": "Store VSX Scalar Doubleword Indexed X-form", "summary": "Stores a doubleword from a VSX scalar register to memory.", "description": "The instruction stores the contents of the specified doubleword element of a VSX scalar register into memory at an address calculated from two general-purpose registers.", "syntax": "stxsdx XS,RA,RB", "operands": [{"name": "XS", "desc": "VSX Scalar Register"}, {"name": "RA", "desc": "Source General Purpose Register (Base Address)"}, {"name": "RB", "desc": "Source General Purpose Register (Index)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C000598", "length": "32", "binary_pattern": "0 | S | RA | RB | SX", "bit_positions": ""}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\nEA ←((RA=0) ? 0 : GPR[RA]) + GPR[RB]\nMEM(EA,8)    ←VSR[XS].dword[0]", "special_registers": "MSR", "programming_notes": "The stxsdx instruction stores a doubleword from a VSX scalar register into memory. Ensure the VSX facility is enabled by checking and setting the MSR.VSX bit. The effective address (EA) is calculated by adding the contents of two general-purpose registers, RA and RB. This instruction requires 8-byte alignment for the memory address to avoid exceptions.", "extended_mnemonics": [], "page_found": "Page 605 - 606", "example": "stxsdx vs1, r4, r5"}
{"mnemonic": "stxsibx", "architecture": "PowerISA", "full_name": "Store VSX Scalar as Integer Byte Indexed X-form", "summary": "Stores a byte from a VSX scalar register into memory at an address formed by adding two general-purpose registers.", "description": "The instruction stores the byte element 7 of VSR[XS] into the memory location specified by the effective address (EA), which is the sum of GPR[RA] and GPR[RB]. If RA is zero, EA is simply GPR[RB].", "syntax": "stxsibx XS,RA,RB", "operands": [{"name": "XS", "desc": "VSX Scalar Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00071A", "length": "32", "binary_pattern": "18 | S | RA | RB | SX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if SX=0 & MSR.VSX=0 then\n    VSX_Unavailable()\nif SX=1 & MSR.VEC=0 then\n    Vector_Unavailable()\nEA ←((RA=0) ? 0 : GPR[RA]) + GPR[RB]\nMEM(EA,1) ←VSR[32×SX+S].byte[7]", "special_registers": "MSR", "programming_notes": "This instruction is used to store a specific byte from a VSX register into memory. Ensure that the appropriate privilege level and MSR bits (VSX or VEC) are set before using this instruction, as it may raise exceptions if not. The effective address is calculated based on GPR[RA] and GPR[RB], with special handling if RA is zero. Be cautious of alignment requirements to avoid potential performance penalties or exceptions.", "extended_mnemonics": [], "page_found": "Page 606 - 607", "example": "stxsibx vs1, r4, r5"}
{"mnemonic": "stxssp", "architecture": "PowerISA", "full_name": "Store VSX Scalar Single-Precision DS-form", "summary": "Stores a single-precision floating-point value from a VSX register to memory.", "description": "The instruction stores the double-precision floating-point value in doubleword element 0 of VSR[XS] converted to single-precision format into memory at the effective address (EA). The EA is calculated as the sum of the contents of register RA and the sign-extended DS field. If MSR.VEC=0, a Vector_Unavailable() exception is raised.", "syntax": "stxssp VRS,disp(RA)", "operands": [{"name": "VRS", "desc": "VSX Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "disp", "desc": "Displacement Field"}], "encoding": {"format": "DS-form", "hex_opcode": "0xF4000003", "length": "32", "binary_pattern": "0 | VRS | RA | DS", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nelse if 'stxssp' then\n    EA ← (RA|0) + EXTS64(DS||0b00)\n    MEM(EA,4) ← bfp32_CONVERT_FROM_BFP64(VSR[VRS+32].dword[0])", "special_registers": "N/A", "programming_notes": "The stxssp instruction stores a single-precision floating-point value from the VSX register into memory. Ensure that the Vector Facility is enabled (MSR.VEC=1) to avoid exceptions. The effective address is calculated by adding the contents of RA and the sign-extended DS field. This instruction requires 4-byte alignment for the memory address.", "extended_mnemonics": [], "page_found": "Page 608 - 609", "example": "stxssp v1, disp(RA)"}
{"mnemonic": "stxsspx", "architecture": "PowerISA", "full_name": "Store VSX Scalar Single-Precision Indexed X-form", "summary": "Stores a single-precision floating-point value from a VSX register to memory.", "description": "Converts the value in the right doubleword of VSX register XS from double-precision to single-precision floating-point format and stores it to memory at address (RA) + (RB). This is a VSX instruction and does not affect condition registers or status fields.", "syntax": "stxsspx XS,RA,RB", "operands": [{"name": "XS", "desc": "VSX Scalar Register Index"}, {"name": "RA", "desc": "Source General Purpose Register (Base Address)"}, {"name": "RB", "desc": "Source General Purpose Register (Index)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C000518", "length": "32", "binary_pattern": "0 | S | RA | RB | 18 | SX", "bit_positions": ""}, "extension": "VSX", "pseudocode": "ea ← (RA) + (RB)\ndp_value ← XS.doubleword[1]\nsp_value ← convert_dp_to_sp(dp_value)\n[ea] ← sp_value", "special_registers": "MSR", "programming_notes": "The stxsspx instruction is used to store a single-precision floating-point value from the VSX register into memory. Ensure that the VSX facility is enabled by checking and setting the MSR.VSX bit. Be cautious of alignment requirements; the EA must be 4-byte aligned for optimal performance. If RA is zero, the effective address (EA) will be set to zero, which might lead to unexpected behavior if not intended.", "extended_mnemonics": [], "page_found": "Page 609 - 610", "example": "stxsspx vs1, r4, r5"}
{"mnemonic": "lxvb16x", "architecture": "PowerISA", "full_name": "Load VSX Vector Byte*16 Indexed", "summary": "Loads a vector of 16 byte elements from memory into a VSX register.", "description": "Loads a 128-bit vector containing 16 byte elements from memory into a VSX register. The effective address is computed as RA|0 + RB. No status fields are modified by this instruction.", "syntax": "lxvb16x XT,RA,RB", "operands": [{"name": "XT", "desc": "Target VSX Register"}, {"name": "RA", "desc": "Source General Purpose Register (Base Address)"}, {"name": "RB", "desc": "Source General Purpose Register (Index)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0006D8", "length": "32", "binary_pattern": "1000 | 0111 | 0110 | TX | T | RA | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "extension": "VSX", "pseudocode": "EA ← (RA=0 ? 0 : GPR[RA]) + GPR[RB]\nVSR[XT] ← MEM(EA, 16)", "special_registers": "MSR", "programming_notes": "Exhibits identical behavior in Big-Endian mode.", "extended_mnemonics": [], "page_found": "Page 611 - 612", "example": "lxvb16x vs1, r4, r5"}
{"mnemonic": "lxvh8x", "architecture": "PowerISA", "full_name": "Load VSX Vector Halfword*8 Indexed", "summary": "Loads a vector of 8 halfwords from memory into a VSX register.", "description": "Loads a 128-bit vector containing 8 halfword elements from memory into a VSX register. The effective address is computed as RA|0 + RB. No status fields are modified by this instruction.", "syntax": "lxvh8x XT,RA,RB", "operands": [{"name": "XT", "desc": "Target VSX Register"}, {"name": "RA", "desc": "Source General Purpose Register (Base Address)"}, {"name": "RB", "desc": "Source General Purpose Register (Index)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C000658", "length": "32", "binary_pattern": "0 | T | RA | RB | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "EA ← (RA=0 ? 0 : GPR[RA]) + GPR[RB]\nVSR[XT] ← MEM(EA, 16)", "special_registers": "MSR", "programming_notes": "lxvh8x, lxvd2x, lxvw4x, lxvb16x, and lxvx exhibit identical behavior in Big-Endian mode.", "extended_mnemonics": [], "page_found": "Page 613 - 614", "example": "lxvh8x vs1, r4, r5"}
{"mnemonic": "lxvx", "architecture": "PowerISA", "full_name": "Load VSX Vector Indexed X-form", "summary": "Loads a quadword from memory into a VSX register.", "description": "Loads a 128-bit quadword from memory into a VSX register using indexed addressing. The effective address is computed as RA|0 + RB. No status fields are modified by this instruction.", "syntax": "lxvx XT,RA,RB", "operands": [{"name": "XT", "desc": "Target VSX Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}, {"name": "xT", "desc": "Target Vector-Scalar Register"}, {"name": "rA", "desc": "Index General Purpose Register"}, {"name": "rB", "desc": "Base Address General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C000218", "length": "32", "binary_pattern": "31 | XT | RA | RB | 268 | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "EA ← (RA=0 ? 0 : GPR[RA]) + GPR[RB]\nVSR[XT] ← MEM(EA, 16)", "special_registers": "MSR", "programming_notes": "The lxvx instruction is used to load vector data from memory into VSX registers.", "extended_mnemonics": [], "page_found": "Page 615 - 616", "example": "lxvx vs1, r4, r5"}
{"mnemonic": "lxvrbx", "architecture": "PowerISA", "full_name": "Load VSX Vector Rightmost Byte Indexed X-form", "summary": "Loads a byte from memory into the rightmost byte of a VSX vector register.", "description": "Loads a single byte from memory and places it in the rightmost (least significant) byte position of a VSX register, with all other bytes set to 0. The effective address is computed as RA|0 + RB. No status fields are modified by this instruction.", "syntax": "lxvrbx XT,RA,RB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00001A", "length": "32", "binary_pattern": "0 | T | RA | RB | 13 | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VSX", "pseudocode": "EA ← (RA=0 ? 0 : GPR[RA]) + GPR[RB]\nVSR[XT] ← (0x00000000000000000000000000 || MEM(EA, 1))", "special_registers": "MSR", "programming_notes": "The lxvrbx instruction is used to load a single byte from memory into the rightmost byte of a VSX vector register. Ensure that the VSX facility is enabled in the MSR register; otherwise, an exception will be raised. The address calculation involves adding two general-purpose registers, RA and RB, where RA can be zero. This instruction zeroes out all other bytes in the target vector register except for the rightmost byte.", "extended_mnemonics": [], "page_found": "Page 619 - 620", "example": "lxvrbx vs1, r4, r5"}
{"mnemonic": "lxvrdx", "architecture": "PowerISA", "full_name": "Load VSX Vector Rightmost Doubleword Indexed X-form", "summary": "Loads a doubleword from memory into the rightmost element of a VSX vector register.", "description": "Loads a 64-bit doubleword from memory and places it in the rightmost (least significant) doubleword element of a VSX register, with the left doubleword set to 0. The effective address is computed as RA|0 + RB. No status fields are modified by this instruction.", "syntax": "lxvrdx XT,RA,RB", "operands": [{"name": "XT", "desc": "Target VSX Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register (address base)"}, {"name": "RB", "desc": "Source General Purpose Register (offset)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0000DA", "length": "32", "binary_pattern": "0 | T | RA | RB | 109 | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VSX", "pseudocode": "EA ← (RA=0 ? 0 : GPR[RA]) + GPR[RB]\nVSR[XT] ← (0x0000000000000000 || MEM(EA, 8))", "special_registers": "MSR", "programming_notes": "The lxvrdx instruction is used to load a doubleword from memory into the rightmost element of a VSX vector register. Ensure that the VSX facility is enabled in the MSR register; otherwise, a VSX_Unavailable exception will be raised. The address calculation uses two general-purpose registers, RA and RB, where RA can be zero. Be cautious of alignment requirements for optimal performance and to avoid potential exceptions.", "extended_mnemonics": [], "page_found": "Page 620 - 621", "example": "lxvrdx vs1, r4, r5"}
{"mnemonic": "lxvrhx", "architecture": "PowerISA", "full_name": "Load VSX Vector Rightmost Halfword Indexed", "summary": "Loads a halfword from memory into the rightmost element of a VSX vector register.", "description": "Loads a 16-bit halfword from memory and places it in the rightmost (least significant) halfword position of a VSX register, with all other bits set to 0. The effective address is computed as RA|0 + RB. No status fields are modified by this instruction.", "syntax": "lxvrhx XT,RA,RB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "RA", "desc": "Source General Purpose Register (Base Address)"}, {"name": "RB", "desc": "Source General Purpose Register (Index)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00005A", "length": "32", "binary_pattern": "0 | T | RA | RB | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "EA ← (RA=0 ? 0 : GPR[RA]) + GPR[RB]\nVSR[XT] ← (0x000000000000000000000000 || MEM(EA, 2))", "special_registers": "MSR", "programming_notes": "The lxvrhx instruction is used to load a halfword from memory into the rightmost element of a VSX vector register. Ensure that the VSX facility is enabled in the MSR register; otherwise, an exception will be raised. The address calculation uses two general-purpose registers, RA and RB, where RA can be zero. The loaded halfword is placed in the rightmost halfword element (element 7) of the specified VSX vector register, with all other elements set to zero. Endianness affects how the halfword is stored in the vector register; ensure proper handling for both big-endian and little-endian systems.", "extended_mnemonics": [], "page_found": "Page 621 - 622", "example": "lxvrhx vs1, r4, r5"}
{"mnemonic": "lxvrwx", "architecture": "PowerISA", "full_name": "Load VSX Vector Rightmost Word Indexed X-form", "summary": "Loads a word from memory into the rightmost word of a VSX vector register.", "description": "Loads a 32-bit word from memory and places it in the rightmost (least significant) word position of a VSX register, with all other bits set to 0. The effective address is computed as RA|0 + RB. No status fields are modified by this instruction.", "syntax": "lxvrwx XT,RA,RB", "operands": [{"name": "XT", "desc": "Target VSX Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register (Base Address)"}, {"name": "RB", "desc": "Source General Purpose Register (Offset)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00009A", "length": "32", "binary_pattern": "0 | T | RA | RB | 77 | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VSX", "pseudocode": "EA ← (RA=0 ? 0 : GPR[RA]) + GPR[RB]\nVSR[XT] ← (0x00000000000000000000000 || MEM(EA, 4))", "special_registers": "MSR", "programming_notes": "The lxvrwx instruction is used to load a word from memory into the rightmost word of a VSX vector register. Ensure that the VSX facility is enabled in the MSR register; otherwise, an exception will be raised. The address calculation involves adding two general-purpose registers, RA and RB, with a special case where if RA is zero, the base address defaults to zero. This instruction zeroes out the first three words of the target vector register before placing the loaded word into the rightmost position.", "extended_mnemonics": [], "page_found": "Page 622 - 623", "example": "lxvrwx vs1, r4, r5"}
{"mnemonic": "lxvll", "architecture": "PowerISA", "full_name": "Load VSX Vector with Length Left-justified X-form", "summary": "Loads a variable-length vector from memory into a VSX register, left-justifying the data.", "description": "Loads a variable-length data element from memory into a VSX register, left-justifying the loaded bytes within the 128-bit register. The effective address is RA|0, and the length in bytes is taken from bits 0-6 of RB (capped at 16). Remaining bytes in the register are zeroed. No status fields are modified by this instruction.", "syntax": "lxvll XT,RA,RB", "operands": [{"name": "XT", "desc": "Target VSX Register"}, {"name": "RA", "desc": "Source General Purpose Register (Effective Address)"}, {"name": "RB", "desc": "Source General Purpose Register (Length and Data)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00025A", "length": "32", "binary_pattern": "0 | T | RA | RB | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:29 | 30:31"}, "extension": "VSX", "pseudocode": "EA ← (RA=0 ? 0 : GPR[RA])\nlen ← GPR[RB][0:6] & 0xF\nfor i ← 0 to (len - 1) do\n  VSR[XT][i*8:(i*8)+7] ← MEM(EA + i, 1)\nfor i ← len to 15 do\n  VSR[XT][i*8:(i*8)+7] ← 0", "special_registers": "MSR", "programming_notes": "lxvll always performs storage accesses using Big-Endian byte-ordering. As such, care must be taken when using these instructions in Little-Endian systems.", "extended_mnemonics": [], "page_found": "Page 625 - 626", "example": "lxvll vs1, r4, r5"}
{"mnemonic": "stxvb16x", "architecture": "PowerISA", "full_name": "Store VSX Vector Byte*16 Indexed", "summary": "Stores a vector of 16 byte elements from VSR[XS] into Big-Endian storage using stxvb16x, retaining left-to-right element ordering.", "description": "The instruction stores a vector of 16 byte elements from VSR[XS] into Big-Endian storage using stxvb16x, retaining left-to-right element ordering.", "syntax": "stxvb16x XS,RA,RB", "operands": [{"name": "XS", "desc": "Vector-Specific Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0007D8", "length": "32", "binary_pattern": "S | RA | RB | SX", "bit_positions": "6:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "if SX=0 & MSR.VSX=0 then VSX_Unavailable()\nif SX=1 & MSR.VEC=0 then Vector_Unavailable()\nEA ←((RA=0) ? 0 : GPR[RA]) + GPR[RB]\ndo i = 0 to 15\n    MEM(EA+i,1) ←VSR[32×SX+S].byte[i]\nend", "special_registers": "MSR", "programming_notes": "stxvd2x, stxvw4x, stxvh8x, stxvb16x, and stxvx exhibit identical behavior in Big-Endian mode.", "extended_mnemonics": [], "page_found": "Page 627 - 628", "example": "stxvb16x vs1, r4, r5"}
{"mnemonic": "stxvh8x", "architecture": "PowerISA", "full_name": "Store VSX Vector Halfword*8 Indexed", "summary": "Stores a vector of 8 halfword elements from VSR[X] into memory using indexed addressing.", "description": "Stores a 128-bit VSX vector containing 8 halfword elements to memory using indexed addressing. The effective address is computed as (RA|0) + RB. This is a VSX extension instruction that does not affect condition registers or status flags.", "syntax": "stxvh8x XS,RA,RB", "operands": [{"name": "XS", "desc": "VSX Register Index"}, {"name": "RA", "desc": "Source General Purpose Register (Base Address)"}, {"name": "RB", "desc": "Source General Purpose Register (Index)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C000758", "length": "32", "binary_pattern": "0 | S | RA | RB | SX", "bit_positions": ""}, "extension": "VSX", "pseudocode": "EA ← (RA|0) + RB\n[EA] ← VSR[XS]", "special_registers": "MSR", "programming_notes": "stxvd2x, stxvw4x, stxvh8x, stxvb16x, and stxvx exhibit identical behavior in Big-Endian mode.", "extended_mnemonics": [], "page_found": "Page 629 - 630", "example": "stxvh8x vs1, r4, r5"}
{"mnemonic": "stxvx", "architecture": "PowerISA", "full_name": "Store VSX Vector Indexed X-form", "summary": "Stores a vector element from the VSX register file to memory.", "description": "Stores a 128-bit VSX vector element to memory using indexed addressing in X-form. The effective address is computed as (RA|0) + RB, and the vector is stored with element size determined by the instruction form. This VSX instruction does not affect condition registers or status flags.", "syntax": "stxvx   xW,r0,rPW", "operands": [{"name": "XS", "desc": "VSX Register Index"}, {"name": "RA", "desc": "Source General Purpose Register for Base Address"}, {"name": "RB", "desc": "Source General Purpose Register for Offset"}, {"name": "xW", "desc": "VSX Register containing the vector to store"}, {"name": "r0", "desc": "General Purpose Register (typically used as zero register)"}, {"name": "rPW", "desc": "Base address General Purpose Register for W"}, {"name": "rPX", "desc": "Base address General Purpose Register for X"}, {"name": "rPY", "desc": "Base address General Purpose Register for Y"}, {"name": "rPZ", "desc": "Base address General Purpose Register for Z"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C000318", "length": "32", "binary_pattern": "101100 | XS | 00000 | rA | rB | 00000 | 00000 | 00000", "bit_positions": "0:5 | 6:8 | 9 | 10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "EA ← (RA|0) + RB\n[EA] ← VSR[XS]", "special_registers": "MSR", "programming_notes": "The stxvx instruction is used for storing VSX vectors to memory. The index value in XS is multiplied by 16 bytes.", "extended_mnemonics": [], "page_found": "Page 631 - 632", "example": "stxvx xw, r0, rpw"}
{"mnemonic": "stxvrbx", "architecture": "PowerISA", "full_name": "Store VSX Vector Rightmost Byte Indexed X-form", "summary": "Stores the rightmost byte of a VSX vector element to memory.", "description": "The contents of byte element 15 of VSR[XS] are placed into storage at address EA, which is the sum of GPR[RA] and GPR[RB]. If RA=0, EA is just GPR[RB].", "syntax": "stxvrbx XS,RA,RB", "operands": [{"name": "XS", "desc": "VSX Vector Register"}, {"name": "RA", "desc": "General Purpose Register (Base Address)"}, {"name": "RB", "desc": "General Purpose Register (Index)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00011A", "length": "32", "binary_pattern": "31 | S | RA | RB | 141 | SX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nEA = ((RA=0) ? 0 : GPR[RA]) + GPR[RB];\nMEM(EA,1) = VSR[32×SX+S].byte[15];", "special_registers": "N/A", "programming_notes": "This instruction stores the rightmost byte of a VSX vector register into memory. Ensure that the VSX facility is enabled (MSR.VSX=1) to avoid an exception. The effective address (EA) is calculated by adding GPR[RA] and GPR[RB], unless RA is 0, in which case EA is just GPR[RB]. Be cautious of alignment; while not strictly required for a single byte, proper alignment can improve performance.", "extended_mnemonics": [], "page_found": "Page 633 - 634", "example": "stxvrbx vs1, r4, r5"}
{"mnemonic": "stxvrhx", "architecture": "PowerISA", "full_name": "Store VSX Vector Rightmost Halfword Indexed X-form", "summary": "Stores the rightmost halfword of a VSX vector element to memory.", "description": "Stores the rightmost halfword (least significant 16 bits) of the first double-precision element in a VSX vector to memory using indexed addressing. The effective address is computed as (RA|0) + RB. This VSX instruction does not affect condition registers or status flags.", "syntax": "stxvrhx XS,RA,RB", "operands": [{"name": "XS", "desc": "VSX Vector Register"}, {"name": "RA", "desc": "General Purpose Register (Base Address)"}, {"name": "RB", "desc": "General Purpose Register (Index)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00015A", "length": "32", "binary_pattern": "0 | S | RA | RB | 16 | SX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "EA ← (RA|0) + RB\n[EA:EA+1] ← VSR[XS][48:63]", "special_registers": "N/A", "programming_notes": "The stxvrhx instruction stores the rightmost halfword of a VSX vector element into memory. Ensure that the VSX facility is enabled (MSR.VSX=1); otherwise, a VSX_Unavailable exception will occur. The effective address is calculated by adding GPR[RA] and GPR[RB], so ensure these registers contain valid addresses. This instruction operates at user privilege level.", "extended_mnemonics": [], "page_found": "Page 634 - 635", "example": "stxvrhx vs1, r4, r5"}
{"mnemonic": "stxvll", "architecture": "PowerISA", "full_name": "Store VSX Vector with Length Left-justified", "summary": "Stores a left-justified vector from a VSX register to memory.", "description": "Stores a variable-length left-justified portion of a VSX vector to memory. The number of bytes to store (0-16) is specified in the low-order 4 bits of RB; bytes are stored starting at the effective address (RA|0). This VSX instruction does not affect condition registers or status flags.", "syntax": "stxvll XS,RA,RB", "operands": [{"name": "XS", "desc": "VSX Register"}, {"name": "RA", "desc": "Source General Purpose Register (Effective Address)"}, {"name": "RB", "desc": "General Purpose Register containing the number of bytes to store"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00035A", "length": "32", "binary_pattern": "0 | S | RA | RB | SX", "bit_positions": ""}, "extension": "VSX", "pseudocode": "EA ← (RA|0)\nlength ← RB[60:63]\nfor i ← 0 to length-1 do\n  [EA+i] ← VSR[XS][8*i:8*i+7]\nend for", "special_registers": "MSR", "programming_notes": "stxvll always performs storage accesses using Big-Endian byte-ordering. As such, care must be taken when using these instructions in Little-Endian systems.", "extended_mnemonics": [], "page_found": "Page 637 - 638", "example": "stxvll vs1, r4, r5"}
{"mnemonic": "lxvpx", "architecture": "PowerISA", "full_name": "Load VSX Vector Paired Indexed X-form", "summary": "Loads a vector from memory into two VSR registers.", "description": "The contents of the octword in storage at address EA are placed into load_data. The order of bytes in load_data depends on the byte ordering (Little-Endian or Big-Endian). Bits 0-127 of load_data are placed into VSR[XTp], and bits 128-255 of load_data are placed into VSR[XTp+1].", "syntax": "lxvpx XTp,RA,RB", "operands": [{"name": "XTp", "desc": "Target Vector-Specific Register (VSR) index"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00029A", "length": "32", "binary_pattern": "10011000 | Tp | TX | RA | RB", "bit_positions": "0:5 | 6:9 | 10:14 | 15:19 | 20:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\nEA ←((RA=0) ? 0 : GPR[RA]) + GPR[RB]\nload_data ←MEM(EA,32)\nVSR[32×TX+2×Tp]   ←load_data.bit[  0:127]\nVSR[32×TX+2×Tp+1] ←load_data.bit[128:255]", "special_registers": "N/A", "programming_notes": "For best performance, EA should be word-aligned.", "extended_mnemonics": [], "page_found": "Page 639 - 640", "example": "lxvpx vs2, r4, r5"}
{"mnemonic": "stxvpx", "architecture": "PowerISA", "full_name": "Store VSX Vector Paired Indexed X-form", "summary": "Stores a vector from two VSR registers into memory at the effective address.", "description": "The instruction stores an octword (128 bits) of data from two VSR registers into memory. The data is stored in big-endian order if the system is configured for big-endian byte ordering, and little-endian order if the system is configured for little-endian byte ordering.", "syntax": "stxvpx XSp,RA,RB", "operands": [{"name": "XSp", "desc": "Index into VSR registers"}, {"name": "RA", "desc": "Base address register (GPR)"}, {"name": "RB", "desc": "Offset address register (GPR)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00039A", "length": "32", "binary_pattern": "0 | Sp | SX | RA | RB | 461", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\nEA ←((RA=0) ? 0 : GPR[RA]) + GPR[RB]\nstore_data.bit[0:127] ← VSR[32×SX+2×Sp]\nstore_data.bit[128:255] ← VSR[32×SX+2×Sp+1]\nMEM(EA,32) ← store_data", "special_registers": "N/A", "programming_notes": "For best performance, EA should be word-aligned.", "extended_mnemonics": [], "page_found": "Page 641 - 642", "example": "stxvpx vs2, r4, r5"}
{"mnemonic": "xscpsgndp", "architecture": "PowerISA", "full_name": "VSX Scalar Copy Sign Double-Precision", "summary": "Copies the sign of a double-precision floating-point value from one register to another.", "description": "Copies the sign bit from the double-precision floating-point value in VSR[XA] to the double-precision value in VSR[XB], placing the result in VSR[XT]. The magnitude of the result comes from XB and the sign comes from XA. FPSCR is not affected; this instruction operates on the scalar element of the VSX register.", "syntax": "xscpsgndp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XA", "desc": "Source Vector-Scalar Register for Sign Bit"}, {"name": "XB", "desc": "Source Vector-Scalar Register for Magnitude"}], "encoding": {"format": "X-form", "hex_opcode": "0xF0000580", "length": "32", "binary_pattern": "176 | AX | BX | TX | T | A | B", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:28 | 29 | 30:31"}, "extension": "VSX", "pseudocode": "XT[0] ← XA[0]\nXT[1:63] ← XB[1:63]", "special_registers": "MSR", "programming_notes": "This instruction can be used to operate on single-precision source operands.\nPrevious versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 643 - 644", "example": "xscpsgndp vs1, vs2, vs3"}
{"mnemonic": "xsnabsdp", "architecture": "PowerISA", "full_name": "VSX Scalar Negative Absolute Double-Precision", "summary": "Computes the negative absolute value of a double-precision floating-point number.", "description": "The instruction computes the negative absolute value of the double-precision floating-point number in VSR[XB] and stores it in VSR[XT]. The result is zeroed out for the second doubleword.", "syntax": "xsnabsdp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00005A4", "length": "32", "binary_pattern": "T | B | BX | TX", "bit_positions": "6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\nsrc ←VSR[32×BX+B].dword[0]\nVSR[32×TX+T].dword[0] ←bfp64_NEGATIVE_ABSOLUTE(src)\nVSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000", "special_registers": null, "programming_notes": "This instruction can be used to operate on a single-precision source operand. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register.", "extended_mnemonics": [], "page_found": "Page 644 - 645", "example": "xsnabsdp vs1, vs3"}
{"mnemonic": "xvcpsgndp", "architecture": "PowerISA", "full_name": "VSX Vector Copy Sign Double-Precision", "summary": "Copies the sign bit from one double-precision vector element to another.", "description": "For xvcpsgndp, the sign bit of each doubleword element in VSR[XB] is copied to the corresponding doubleword element in VSR[XT], while the magnitude bits remain unchanged.", "syntax": "xvcpsgndp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XA", "desc": "Source Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000780", "length": "32", "binary_pattern": "T | A | B | AX | BX | TX", "bit_positions": "0:10 | 11:15 | 16:20 | 21:28 | 29 | 30:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\ndo i = 0 to 1\n    src1 ←VSR[32×AX+A].dword[i] & 0x8000_0000_0000_0000\n    src2 ←VSR[32×BX+B].dword[i] & 0x7FFF_FFFF_FFFF_FFFF\n    VSR[32×TX+T].dword[i] ←src1 | src2\nend", "special_registers": "N/A", "programming_notes": "This instruction is useful for copying the sign of double-precision floating-point numbers while preserving their magnitude. Ensure that VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. The operation is performed on each doubleword element independently, so alignment requirements are per-element rather than per-vector.", "extended_mnemonics": [{"mnemonic": "xvmovdp", "equivalent_to": "xvcpsgndp XT,XB,XB"}], "page_found": "Page 647 - 648", "example": "xvcpsgndp vs1, vs2, vs3"}
{"mnemonic": "xvnabsdp", "architecture": "PowerISA", "full_name": "Vector Negative Absolute Double-Precision", "summary": "Computes the negative absolute value of each double-precision floating-point element in a vector.", "description": "For xvnabsdp, the negative absolute value of each double-precision floating-point element in VSR[XB] is computed and stored in VSR[XT].", "syntax": "xvnabsdp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00007A4", "length": "32", "binary_pattern": "T | B | BX | TX", "bit_positions": "0:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\ndo i = 0 to 1\n    src ←VSR[32×BX+B].dword[i]\n    VSR[32×TX+T].dword[i] ←bfp64_NEGATIVE_ABSOLUTE(src)\nend", "special_registers": null, "programming_notes": "This instruction computes the negative absolute value of each double-precision floating-point element in a vector. Ensure that VSX (Vector Scalar Extensions) is enabled by checking and setting the appropriate bit in the Machine State Register (MSR). The operation processes two elements per vector register, so ensure proper alignment if manipulating individual elements.", "extended_mnemonics": [], "page_found": "Page 648 - 649", "example": "xvnabsdp vs1, vs3"}
{"mnemonic": "xsdivdp", "architecture": "PowerISA", "full_name": "VSX Scalar Divide Double-Precision", "summary": "Divides the double-precision floating-point value in VSR[XA] by the double-precision floating-point value in VSR[XB].", "description": "Divides the scalar double-precision floating-point value in VSR[XA] by the scalar double-precision floating-point value in VSR[XB], storing the result in VSR[XT]. The operation follows IEEE 754 semantics; FPSCR is updated with exception flags and the result sign/exponent. This VSX instruction requires the VSX extension.", "syntax": "xsdivdp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XA", "desc": "Source Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF00001C0", "length": "32", "binary_pattern": "111100 | XA | XB | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000", "bit_positions": ""}, "extension": "VSX", "pseudocode": "XT ← VSR[XA] ÷ VSR[XB]\nFPSCR ← updated with exception flags and rounding", "special_registers": "FPSCR FPRF FR FI FX OX UX ZX XX VXSNAN VXIDI VXZDZ", "programming_notes": "The xsdivdp instruction is used for dividing double-precision floating-point numbers. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. Handle special cases like NaNs and infinities by checking the FPSCR flags after execution. The result is rounded according to the rounding mode set in FPSCR.RN.", "extended_mnemonics": [], "page_found": "Page 659 - 660", "example": "xsdivdp vs1, vs2, vs3"}
{"mnemonic": "xsmuldp", "architecture": "PowerISA", "full_name": "VSX Scalar Multiply Double-Precision", "summary": "Multiplies two double-precision floating-point numbers and places the result in a vector register.", "description": "Multiplies the scalar double-precision floating-point value in VSR[XA] by the scalar double-precision floating-point value in VSR[XB], storing the result in VSR[XT]. The operation follows IEEE 754 semantics; FPSCR is updated with exception flags and rounding control. This VSX instruction requires the VSX extension.", "syntax": "xsmuldp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XA", "desc": "Source Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000180", "length": "32", "binary_pattern": "111100 | XA | XB | XT | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000", "bit_positions": ""}, "extension": "VSX", "pseudocode": "XT ← VSR[XA] × VSR[XB]\nFPSCR ← updated with exception flags and rounding", "special_registers": "FPSCR.FPRF, FPSCR.FR, FPSCR.FI, FPSCR.FX, FPSCR.OX, FPSCR.UX, XX, VXSNAN, VXIMZ", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 665 - 666", "example": "xsmuldp vs1, vs2, vs3"}
{"mnemonic": "xssqrtsp", "architecture": "PowerISA", "full_name": "VSX Scalar Square Root Single-Precision", "summary": "Computes the square root of a single-precision floating-point number in VSX.", "description": "The unbounded-precision square root of src is produced. The intermediate result is rounded to single-precision using the rounding mode specified by RN. The result is placed into doubleword element 0 of VSR[XT] in double-precision format. The contents of doubleword element 1 of VSR[XT] are set to 0.", "syntax": "xssqrtsp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}, {"name": "VX", "desc": "Target Vector Register"}, {"name": "VB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF000002C", "length": "32", "binary_pattern": "1111 | 0001 | 0000 | 0000 | 0000 | 0000 | 0000 | 1000", "bit_positions": ""}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nv ←bfp_SQUARE_ROOT(src)\nrnd ←bfp_ROUND_TO_BFP32(FPSCR.RN,v)\nresult32 ←bfp32_CONVERT_FROM_BFP(rnd)\nresult64 ←bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxsqrt_flag=1 then SetFX(FPSCR.VXSQRT)\nif ox_flag=1 then SetFX(FPSCR.OX)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvx_flag ←vxsnan_flag | vxsqrt_flag\nvex_flag ←FPSCR.VE & vx_flag\nif vex_flag=0 then do\n    VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n    FPSCR.FPRF ←fprf_CLASS_BFP32(result32)\n    FPSCR.FR  ←inc_flag\n    FPSCR.FI  ←xx_flag\nend else do\n    FPSCR.FR  ←0b0\n    FPSCR.FI  ←0b0\nend", "special_registers": "FPSCR, VSR[XT], FPRF, FR, FI, FX, OX, UX, VXSNAN, VXSQRT", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 675 - 676", "example": "xssqrtsp vs1, vs3"}
{"mnemonic": "xssubdp", "architecture": "PowerISA", "full_name": "VSX Scalar Subtract Double-Precision", "summary": "Subtracts the contents of two double-precision floating-point registers and places the result in another register.", "description": "The instruction subtracts the value of src2 (negated) from src1, producing a sum with unbounded range and precision. The sum is normalized and rounded to double-precision using the rounding mode specified by RN. The result is placed into doubleword element 0 of VSR[XT], and doubleword element 1 of VSR[XT] is set to 0.", "syntax": "xssubdp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XA", "desc": "Source Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000140", "length": "32", "binary_pattern": "111100 | XA | XB | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000", "bit_positions": ""}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc1 ← bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[0])\nsrc2 ← bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nv ← bfp_ADD(src1, bfp_NEGATE(src2))\nrnd ← bfp_ROUND_TO_BFP64(0b0, FPSCR.RN, v)\nresult ← bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxisi_flag=1 then SetFX(FPSCR.VXISI)\nif ox_flag=1 then SetFX(FPSCR.OX)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvx_flag ← vxsnan_flag | vxisi_flag\nvex_flag ← FPSCR.VE & vx_flag\nif vex_flag=0 then do\n    VSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\n    FPSCR.FR ← inc_flag\n    FPSCR.FI ← xx_flag\nelse do\n    FPSCR.FR ← 0b0\n    FPSCR.FI ← 0b0\nend\nVSR[32×TX+T].dword[0] ← result\nFPSCR.FPRF ← fprf_CLASS_BFP64(result)", "special_registers": "vxsnan_flag, vxisi_flag", "programming_notes": "Let XT be the value 32×TX + T. Let XA be the value 32×AX + A. Let XB be the value 32×BX + B. Let src1 be the double-precision floating-point value in doubleword element 0 of VSR[XA]. Let src2 be the double-precision floating-point value in doubleword element 0 of VSR[XB].", "extended_mnemonics": [], "page_found": "Page 677 - 678", "example": "xssubdp vs1, vs2, vs3"}
{"mnemonic": "xsmaddadp", "architecture": "PowerISA", "full_name": "VSX Scalar Multiply-Add Type-A Double-Precision", "summary": "Performs a double-precision floating-point multiply-add operation.", "description": "For xsmaddadp, do the following. Let src1 be the double-precision floating-point value in doubleword element 0 of VSR[XA]. Let src2 be the double-precision floating-point value in doubleword element 0 of VSR[XT]. Let src3 be the double-precision floating-point value in doubleword element 0 of VSR[XB].", "syntax": "xsmaddadp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XA", "desc": "Source Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000108", "length": "32", "binary_pattern": "111100 | XA | XB | XT | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000 | 000000", "bit_positions": ""}, "extension": "VSX", "pseudocode": "if 'xsmaddadp' then do\n    src1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[0])\n    src2 ←bfp_CONVERT_FROM_BFP64(VSR[32×TX+T].dword[0])\n    src3 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\n    v ←bfp_MULTIPLY_ADD(src1, src3, src2)\n    rnd ←bfp_ROUND_TO_BFP64(0b0, FPSCR.RN, v)\n    result ←bfp64_CONVERT_FROM_BFP(rnd)\n\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vximz_flag=1 then SetFX(FPSCR.VXIMZ)\n    if vxisi_flag=1 then SetFX(FPSCR.VXISI)\n    if ox_flag=1 then SetFX(FPSCR.OX)\n    if ux_flag=1 then SetFX(FPSCR.UX)\n    if xx_flag=1 then SetFX(FPSCR.XX)\n\n    vx_flag ←vxsnan_flag | vximz_flag | vxisi_flag\n    vex_flag ←FPSCR.VE & vx_flag\n\n    if vex_flag=0 then do\n        VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n        FPSCR.FPRF ←fprf_CLASS_BFP64(result)\n        FPSCR.FR  ←inc_flag\n        FPSCR.FI  ←xx_flag\n    end else do\n        FPSCR.FR  ←0b0\n        FPSCR.FI  ←0b0\n    end\nend", "special_registers": "FPSCR, VSR[XT], VSR[XA], VSR[XB]", "programming_notes": "This instruction performs a scalar multiply-add operation on double-precision floating-point values. Ensure that the VSX registers are properly aligned and initialized before use. The result is rounded according to the rounding mode specified in the FPSCR register. Be aware of potential exceptions such as NaNs, infinities, or underflows, which can set flags in the FPSCR.", "extended_mnemonics": [], "page_found": "Page 683 - 684", "example": "xsmaddadp vs1, vs2, vs3"}
{"mnemonic": "xsmaddasp", "architecture": "PowerISA", "full_name": "VSX Scalar Multiply-Add Type-A Single-Precision", "summary": "Performs a single-precision floating-point multiply-add operation.", "description": "For xsmaddasp, the double-precision floating-point value in doubleword element 0 of VSR[XA] is multiplied by the double-precision floating-point value in doubleword element 0 of VSR[XT], and then the result is added to the double-precision floating-point value in doubleword element 0 of VSR[XB]. The final result is normalized and rounded to single-precision format.", "syntax": "xsmaddasp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XA", "desc": "Source Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000008", "length": "32", "binary_pattern": "60 | XT | XA | XB | 8", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[0])\nsrc2 ←bfp_CONVERT_FROM_BFP64(VSR[32×TX+T].dword[0])\nsrc3 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nv ←bfp_MULTIPLY_ADD(src1, src3, src2)\nrnd ←bfp_ROUND_TO_BFP32(FPSCR.RN, v)\nresult32 ←bfp32_CONVERT_FROM_BFP(rnd)\nresult64 ←bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vximz_flag=1 then SetFX(FPSCR.VXIMZ)\nif vxisi_flag=1 then SetFX(FPSCR.VXISI)\nif ox_flag=1 then SetFX(FPSCR.OX)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvx_flag ←vxsnan_flag | vximz_flag | vxisi_flag\nvex_flag ←FPSCR.VE & vx_flag\nif vex_flag=0 then do\n  VSR[32×TX+T].dword[0] ←result64\n  VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n  FPSCR.FPRF ←fprf_CLASS_BFP32(result32)\n  FPSCR.FR ←inc_flag\n  FPSCR.FI ←xx_flag\nelse do\n  FPSCR.FI ←0b0", "special_registers": "FPSCR, VSR[XT]", "programming_notes": "See Table 7.10, “VSX Scalar Floating-Point Final Result,” on page 618.", "extended_mnemonics": [], "page_found": "Page 686 - 687", "example": "xsmaddasp vs1, vs2, vs3"}
{"mnemonic": "xsmaddqp", "architecture": "PowerISA", "full_name": "VSX Scalar Multiply-Add Quad-Precision", "summary": "Performs a quad-precision floating-point multiply-add operation with rounding to even.", "description": "This instruction multiplies two quad-precision floating-point numbers and adds the third number, rounding the result according to the specified mode.", "syntax": "xsmaddqp VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000308", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | RO | 18", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc1 ← bfp_CONVERT_FROM_BFP128(VSR[VRA+32])\nsrc2 ← bfp_CONVERT_FROM_BFP128(VSR[VRT+32])\nsrc3 ← bfp_CONVERT_FROM_BFP128(VSR[VRB+32])\nv ← bfp_MULTIPLY_ADD(src1, src3, src2)\nrnd ← bfp_ROUND_TO_BFP128(RO, FPSCR.RN, v)\nresult ← bfp128_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vximz_flag=1 then SetFX(FPSCR.VXIMZ)\nif vxisi_flag=1 then SetFX(FPSCR.VXISI)\nif ox_flag=1 then SetFX(FPSCR.OX)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvx_flag ← vxsnan_flag | vximz_flag | vxisi_flag\nex_flag ← FPSCR.VE & vx_flag\nif ex_flag=0 then do\n    VSR[VRT+32] ← result\n    FPSCR.FPRF ← fprf_CLASS_BFP128(result)\nend\nFPSCR.FR ← (vx_flag=0) & inc_flag\nFPSCR.FI ← (vx_flag=0) & xx_flag", "special_registers": "FPSCR", "programming_notes": "This instruction is used for performing a multiply-add operation on quad-precision floating-point numbers. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. Be aware of rounding modes specified by FPSCR.RN and handle potential exceptions like VXSNAN, VXIMZ, Vxisi, OX, UX, and XX appropriately. The result is stored back into the destination register if no exceptions occur.", "extended_mnemonics": [], "page_found": "Page 689 - 690", "example": "xsmaddqp v1, v2, v3"}
{"mnemonic": "xsmsubadp", "architecture": "PowerISA", "full_name": "VSX Scalar Multiply-Subtract Type-A Double-Precision", "summary": "Performs a double-precision floating-point multiply-subtract operation.", "description": "For xsmsubadp, the value in VSR[XA] is multiplied by the value in VSR[XT], and then the result is subtracted from the value in VSR[XB].", "syntax": "xsmsubadp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XA", "desc": "Source Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000188", "length": "32", "binary_pattern": "18 | T | A | B | AX | BX | TX", "bit_positions": ""}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[0])\nsrc2 ←bfp_CONVERT_FROM_BFP64(VSR[32×TX+T].dword[0])\nsrc3 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nv ←bfp_MULTIPLY_ADD(src1, src3, bfp_NEGATE(src2))\nrnd ←bfp_ROUND_TO_BFP64(0b0, FPSCR.RN, v)\nresult ←bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vximz_flag=1 then SetFX(FPSCR.VXIMZ)\nif vxisi_flag=1 then SetFX(FPSCR.VXISI)\nif ox_flag=1 then SetFX(FPSCR.OX)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvx_flag ←vxsnan_flag | vximz_flag | vxisi_flag\nvex_flag ←FPSCR.VE & vx_flag\nif vex_flag=0 then do\n  VSR[32×TX+T].dword[0] ←result\n  VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n  FPSCR.FPRF ←fprf_CLASS_BFP64(result)\n  FPSCR.FR ←inc_flag\n  FPSCR.FI ←xx_flag\nend else do\n  FPSCR.FI ←0b0\nend", "special_registers": "FPSCR, VSR[XT]", "programming_notes": "This instruction is commonly used for performing complex floating-point arithmetic operations involving multiplication and subtraction. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. Be cautious of potential overflow or underflow conditions, as indicated by the FPSCR flags. The operation requires proper alignment of the input values, specifically 64-bit double-precision floating-point numbers.", "extended_mnemonics": [], "page_found": "Page 692 - 693", "example": "xsmsubadp vs1, vs2, vs3"}
{"mnemonic": "xmsubasp", "architecture": "PowerISA", "full_name": "VSX Scalar Multiply-Subtract Type-A Single-Precision", "summary": "Performs a multiply-subtract operation on single-precision floating-point values.", "description": "For xmsubasp, the double-precision floating-point value in doubleword element 0 of VSR[XA] is multiplied by the double-precision floating-point value in doubleword element 0 of VSR[XB], and the result is subtracted from the double-precision floating-point value in doubleword element 0 of VSR[XT]. The result is then rounded to single-precision format and placed into doubleword element 0 of VSR[XT] in double-precision format.", "syntax": "xmsubasp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XA", "desc": "Source Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000088", "length": "32", "binary_pattern": "18 | T | A | B | AX | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[0])\nsrc2 ←bfp_CONVERT_FROM_BFP64(VSR[32×TX+T].dword[0])\nsrc3 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nv ←bfp_MULTIPLY_ADD(src1, src3, bfp_NEGATE(src2))\nrnd ←bfp_ROUND_TO_BFP32(FPSCR.RN, v)\nresult32 ←bfp32_CONVERT_FROM_BFP(rnd)\nresult64 ←bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vximz_flag=1 then SetFX(FPSCR.VXIMZ)\nif vxisi_flag=1 then SetFX(FPSCR.VXISI)\nif ox_flag=1 then SetFX(FPSCR.OX)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvx_flag  ←vxsnan_flag | vximz_flag | vxisi_flag\nvex_flag ←FPSCR.VE & vx_flag\nif vex_flag=0 then do\n    VSR[32×TX+T].dword[0] ←result64\n    VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n    FPSCR.FPRF ←fprf_CLASS_BFP32(result32)\n    FPSCR.FR  ←inc_flag\n    FPSCR.FI  ←xx_flag\nelse do\n    FPSCR.FR  ←0b0\n    FPSCR.FI  ←0b0", "special_registers": "FPSCR, VSR[XT], FPRF", "programming_notes": "This instruction is commonly used for performing complex floating-point arithmetic operations in single-precision format while maintaining double-precision intermediate results. Ensure that the VSX (Vector Scalar Extensions) are enabled, as attempting to use this instruction without them will result in an unavailable exception. Be cautious of rounding modes and exceptions; check the FPSCR register for flags indicating overflow, underflow, or invalid operations. The instruction requires proper alignment of input values in VSR registers, specifically targeting doubleword elements.", "extended_mnemonics": [], "page_found": "Page 695 - 696", "example": "xmsubasp vs1, vs2, vs3"}
{"mnemonic": "xsmsubasp", "architecture": "PowerISA", "full_name": "VSX Scalar Multiply Subtract Add Pair Single Precision", "summary": "Performs a multiply-subtract-add operation on single-precision floating-point values.", "description": "Performs a fused multiply-subtract-add operation on scalar single-precision floating-point values. The operation computes (XA × XB) - XT + implicit_addend and stores the result in XT. This MMA/VSX fusion instruction updates FPSCR with exception flags and follows IEEE 754 rounding semantics.", "syntax": "xsmsubasp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XA", "desc": "Source Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}, {"name": "FRT", "desc": "Target Floating Point Register"}, {"name": "FRB", "desc": "Source Floating Point Register"}, {"name": "FRA", "desc": "Source Floating Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xF0000088", "length": "32", "binary_pattern": "60 | XT | XA | XB | 136", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "XT ← (XA × XB) - XT + (addend)\nFPSCR ← updated with exception flags and rounding", "special_registers": "FPSCR", "programming_notes": "See Table 7.10, “VSX Scalar Floating-Point Final Result,” on page 618.", "extended_mnemonics": [], "page_found": "Page 696 - 697", "example": "xsmsubasp vs1, vs2, vs3"}
{"mnemonic": "xsmsubqp", "architecture": "PowerISA", "full_name": "VSX Scalar Multiply-Subtract Quad-Precision", "summary": "Performs a multiply-subtract operation on quad-precision floating-point values.", "description": "Performs a scalar multiply-subtract operation on quad-precision floating-point values, computing VRT = VRT - (VRA × VRB). The result is rounded according to the current rounding mode in FPSCR. This instruction requires VSX support and updates FPSCR exception flags based on the operation result.", "syntax": "xsmsubqp VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000348", "length": "32", "binary_pattern": "18 | VRT | VRA | VRB | RO", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "VRT[0:127] ← VRT[0:127] - (VRA[0:127] × VRB[0:127])\nFPSCR ← update_exception_flags(FPSCR, result)", "special_registers": "FPSCR", "programming_notes": "The xsmsubqp instruction is used for performing a multiply-subtract operation on quad-precision floating-point numbers. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid an exception. Be cautious of rounding modes and exceptions, as they can affect the result and set flags in the FPSCR register. This instruction operates on 128-bit aligned data in vector registers VSR[VRA+32], VSR[VRT+32], and VSR[VRB+32].", "extended_mnemonics": [], "page_found": "Page 698 - 699", "example": "xsmsubqp v1, v2, v3"}
{"mnemonic": "xsnmaddadp", "architecture": "PowerISA", "full_name": "VSX Scalar Negative Multiply-Add Double-Precision Type-A", "summary": "Performs a negative multiply-add operation on double-precision floating-point values.", "description": "For xsnmaddadp, the value in VSR[XA] is multiplied by the value in VSR[XB], and then the result is added to the value in VSR[XT]. The final result is negated and stored back into VSR[XT].", "syntax": "xsnmaddadp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XA", "desc": "Source Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000508", "length": "32", "binary_pattern": "60 | XT | XA | XB | 1288", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[0])\nsrc2 ←bfp_CONVERT_FROM_BFP64(VSR[32×TX+T].dword[0])\nsrc3 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nv ←bfp_MULTIPLY_ADD(src1, src3, src2)\nrnd ←bfp_NEGATE(bfp_ROUND_TO_BFP64(0b0, FPSCR.RN, v))\nresult ←bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vximz_flag=1 then SetFX(FPSCR.VXIMZ)\nif vxisi_flag=1 then SetFX(FPSCR.VXISI)\nif ox_flag=1 then SetFX(FPSCR.OX)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvx_flag ←vxsnan_flag | vximz_flag | vxisi_flag\nvex_flag ←FPSCR.VE & vx_flag\nif vex_flag=0 then do\n  VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n  FPSCR.FPRF ←fprf_CLASS_BFP32(result)\n  FPSCR.FI ←xx_flag\nelse do\n  FPSCR.FR ←0b0\n  FPSCR.FI ←0b0\nend\nVSR[32×TX+T].dword[0] ←result", "special_registers": "FPSCR, VSR[XT]", "programming_notes": "This instruction is commonly used in applications requiring precise floating-point arithmetic, such as scientific computations and financial calculations. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking the MSR.VSX bit; otherwise, handle the VSX_Unavailable exception. Be cautious of potential exceptions like VXSNAN, VXIMZ, Vxisi, OX, UX, and XX, which can alter the FPSCR flags and affect program flow. The instruction operates on double-precision floating-point numbers and requires proper alignment of the input registers.", "extended_mnemonics": [], "page_found": "Page 701 - 702", "example": "xsnmaddadp vs1, vs2, vs3"}
{"mnemonic": "xsnmaddasp", "architecture": "PowerISA", "full_name": "VSX Scalar Negative Multiply-Add Single-Precision Type-A", "summary": "Performs a negative multiply-add operation on single-precision floating-point values.", "description": "For xsnmaddasp, the double-precision floating-point value in doubleword element 0 of VSR[XA] is multiplied by the double-precision floating-point value in doubleword element 0 of VSR[XB], and then added to the double-precision floating-point value in doubleword element 0 of VSR[XT]. The result is negated, rounded to single-precision format, and placed into doubleword element 0 of VSR[XT] in double-precision format.", "syntax": "xsnmaddasp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XA", "desc": "Source Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000408", "length": "32", "binary_pattern": "1111 | 0001 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000", "bit_positions": ""}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[0])\nsrc2 ←bfp_CONVERT_FROM_BFP64(VSR[32×TX+T].dword[0])\nsrc3 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nv ←bfp_MULTIPLY_ADD(src1, src3, src2)\nrnd ←bfp_NEGATE(bfp_ROUND_TO_BFP32(FPSCR.RN, v))\nresult32 ←bfp32_CONVERT_FROM_BFP(rnd)\nresult64 ←bfp64_CONVERT_FROM_BFP(rnd)\nvxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nvximz_flag=1 then SetFX(FPSCR.VXIMZ)\nvxisi_flag=1 then SetFX(FPSCR.VXISI)\nox_flag=1 then SetFX(FPSCR.OX)\nux_flag=1 then SetFX(FPSCR.UX)\nxx_flag=1 then SetFX(FPSCR.XX)\nvx_flag  ←vxsnan_flag | vximz_flag | vxisi_flag\nvex_flag ←FPSCR.VE & vx_flag\nif vex_flag=0 then do\n    VSR[32×TX+T].dword[0] ←result64\n    VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n    FPSCR.FPRF ←fprf_CLASS_BFP32(result32)\n    FPSCR.FR  ←inc_flag\n    FPSCR.FI  ←xx_flag\nelse do\n    FPSCR.FR  ←0b0\n    FPSCR.FI  ←0b0\nend", "special_registers": "FPSCR, VSR[XT], VSR[XA], VSR[XB]", "programming_notes": "See Table 7.32, “Scalar Floating-Point Final Result with Negation,” on page 669.", "extended_mnemonics": [], "page_found": "Page 705 - 706", "example": "xsnmaddasp vs1, vs2, vs3"}
{"mnemonic": "xsnmaddqp", "architecture": "PowerISA", "full_name": "VSX Scalar Negative Multiply-Add Quad-Precision", "summary": "Performs a negative multiply-add operation on quad-precision floating-point values.", "description": "Performs a scalar negative multiply-add operation on quad-precision floating-point values, computing VRT = -(VRA × VRB) + VRT. The result is rounded according to the current rounding mode in FPSCR. This instruction requires VSX support and updates FPSCR exception flags based on the operation result.", "syntax": "xsnmaddqp VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000388", "length": "32", "binary_pattern": "11110001 | 00000000 | 00000000 | 1000", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "VRT[0:127] ← -(VRA[0:127] × VRB[0:127]) + VRT[0:127]\nFPSCR ← update_exception_flags(FPSCR, result)", "special_registers": "FPSCR FPRF FR FI FX VXSNAN VXIMZ VXISI OX UX XX", "programming_notes": "This instruction is used for performing a scalar negative multiply-add operation on quad-precision floating-point numbers. Ensure that the VSX feature is enabled in the MSR register to avoid exceptions. Be cautious of potential overflow and underflow conditions, as indicated by the OX and UX flags in the FPSCR register. The result is rounded according to the rounding mode specified in FPSCR.RN.", "extended_mnemonics": ["xsnmaddqp[o]"], "page_found": "Page 708 - 709", "example": "xsnmaddqp v1, v2, v3"}
{"mnemonic": "xsnmsubadp", "architecture": "PowerISA", "full_name": "VSX Scalar Negative Multiply-Subtract Type-A Double-Precision", "summary": "Performs a negative multiply-subtract operation on double-precision floating-point values.", "description": "For xsnmsubadp, the double-precision floating-point value in doubleword element 0 of VSR[XA] is multiplied by the double-precision floating-point value in doubleword element 0 of VSR[XT], and the result is added to the negated double-precision floating-point value in doubleword element 0 of VSR[XB]. The final result is normalized, rounded to double-precision using the rounding mode specified by RN, and placed into doubleword element 0 of VSR[XT] in double-precision format. Doubleword element 1 of VSR[XT] is set to 0.", "syntax": "xsnmsubadp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XA", "desc": "Source Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000588", "length": "32", "binary_pattern": "0 | 6 | 11 | 16 | 21 | 29 | 30 | 31", "bit_positions": "0 | 6 | 11 | 16 | 21 | 29 | 30 | 31"}, "extension": "VSX", "pseudocode": "if 'xsnmsubadp' then do\n    src1 ← bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[0])\n    src2 ← bfp_CONVERT_FROM_BFP64(VSR[32×TX+T].dword[0])\n    src3 ← bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nend\nv ← bfp_MULTIPLY_ADD(src1, src3, bfp_NEGATE(src2))\nrnd ← bfp_NEGATE(bfp_ROUND_TO_BFP64(0b0, FPSCR.RN, v))\nresult ← bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxisi_flag=1 then SetFX(FPSCR.VXISI)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvx_flag ← vxsnan_flag | vximz_flag | vxisi_flag\nvex_flag ← FPSCR.VE & vx_flag\nif vex_flag=0 then do\n    VSR[32×TX+T].dword[0] ← result\n    VSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\n    FPSCR.FPRF ← fprf_CLASS_BFP64(result)\n    FPSCR.FR ← inc_flag\n    FPSCR.FI ← xx_flag\nend else do\n    FPSCR.FR ← 0b0\n    FPSCR.FI ← 0b0\nend", "special_registers": "FPSCR, VSR[XT]", "programming_notes": "This instruction is commonly used in applications requiring complex floating-point arithmetic, such as scientific computations and simulations. Ensure that the input values are properly aligned to avoid precision loss. The instruction operates at the user privilege level and may raise exceptions if invalid operations occur, such as division by zero or overflow. Performance can be optimized by ensuring that the VSX registers are preloaded with the necessary data.", "extended_mnemonics": [], "page_found": "Page 711 - 712", "example": "xsnmsubadp vs1, vs2, vs3"}
{"mnemonic": "xsnmsubasp", "architecture": "PowerISA", "full_name": "VSX Scalar Negative Multiply-Subtract Type-A Single-Precision", "summary": "Performs a negative multiply-subtract operation on single-precision floating-point values.", "description": "For xsnmsubasp, the double-precision floating-point value in doubleword element 0 of VSR[XA] is multiplied by the double-precision floating-point value in doubleword element 0 of VSR[XT], and then the result is negated and added to the double-precision floating-point value in doubleword element 0 of VSR[XB]. The final result is normalized, rounded to single-precision using the rounding mode specified by RN, negated, and placed into doubleword element 0 of VSR[XT] in double-precision format. Doubleword element 1 of VSR[XT] is set to 0.", "syntax": "xsnmsubasp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XA", "desc": "Source Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000488", "length": "32", "binary_pattern": "60 | XT | XA | XB | 1160", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[0])\nsrc2 ←bfp_CONVERT_FROM_BFP64(VSR[32×TX+T].dword[0])\nsrc3 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nv ←bfp_MULTIPLY_ADD(src1, src3, bfp_NEGATE(src2))\nrnd ←bfp_NEGATE(bfp_ROUND_TO_BFP32(FPSCR.RN, v))\nresult32 ←bfp32_CONVERT_FROM_BFP(rnd)\nresult64 ←bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vximz_flag=1 then SetFX(FPSCR.VXIMZ)\nif vxisi_flag=1 then SetFX(FPSCR.VXISI)\nif ox_flag=1 then SetFX(FPSCR.OX)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvx_flag ←vxsnan_flag | vximz_flag | vxisi_flag\nvex_flag ←FPSCR.VE & vx_flag\nif vex_flag=0 then do\n    VSR[32×TX+T].dword[0] ←result64\n    VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n    FPSCR.FPRF ←fprf_CLASS_BFP32(result32)\n    FPSCR.FR  ←inc_flag\n    FPSCR.FI  ←xx_flag\nelse do\n    FPSCR.FI  ←0b0\nend", "special_registers": "FPSCR, VSR[XT]", "programming_notes": "This instruction is commonly used in applications requiring complex floating-point arithmetic, such as scientific computations and graphics processing. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking the MSR.VSX bit; otherwise, handle the VSX_Unavailable exception. Be cautious of potential exceptions like VXSNAN, VXIMZ, Vxisi, OX, UX, and XX, which can alter the FPSCR flags and affect program flow. The instruction operates on double-precision values but rounds the result to single-precision, so consider precision implications in your application.", "extended_mnemonics": [], "page_found": "Page 714 - 715", "example": "xsnmsubasp vs1, vs2, vs3"}
{"mnemonic": "xsnmsubqp", "architecture": "PowerISA", "full_name": "VSX Scalar Negative Multiply-Subtract Quad-Precision", "summary": "Performs a negative multiply-subtract operation on quad-precision floating-point values.", "description": "Performs a scalar negative multiply-subtract operation on quad-precision floating-point values, computing VRT = -(VRA × VRB) - VRT. The result is rounded according to the current rounding mode in FPSCR. This instruction requires VSX support and updates FPSCR exception flags based on the operation result.", "syntax": "xsnmsubqp VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC0003C8", "length": "32", "binary_pattern": "64 | VRT | VRA | VRB | RO", "bit_positions": ""}, "extension": "VSX", "pseudocode": "VRT[0:127] ← -(VRA[0:127] × VRB[0:127]) - VRT[0:127]\nFPSCR ← update_exception_flags(FPSCR, result)", "special_registers": "FPSCR, VXSNAN, VXIMZ, Vxisi, OX, UX, XX, FPRF, FR, FI", "programming_notes": "The xsnmsubqp instruction is used for performing a scalar negative multiply-subtract operation on quad-precision floating-point numbers. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. Be cautious of potential overflow and underflow conditions, as indicated by the exception flags in FPSCR. The result is rounded using round-to-nearest mode by default.", "extended_mnemonics": [], "page_found": "Page 717 - 718", "example": "xsnmsubqp v1, v2, v3"}
{"mnemonic": "xsredp", "architecture": "PowerISA", "full_name": "Vector Scalar Reciprocal Estimate Double Precision", "summary": "Estimates the reciprocal of a double-precision floating-point value.", "description": "Computes an estimate of the reciprocal (1/XB) for a double-precision floating-point scalar value, placing the result in XT. The estimate is accurate to about 15 bits of precision. This instruction requires VSX support and may update FPSCR exception flags if the source is invalid or zero.", "syntax": "xsredp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000168", "length": "32", "binary_pattern": "18 | T | B | 90", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "XT[0:63] ← reciprocal_estimate(XB[0:63])\nFPSCR ← update_exception_flags(FPSCR, result)", "special_registers": "FPSCR.FR, FPSCR.FPRF, FPSCR.FI, FPSCR.VXSNAN, FPSCR.OX, FPSCR.UX, FPSCR.ZX", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 720 - 721", "example": "xsredp vs1, vs3"}
{"mnemonic": "xsresp", "architecture": "PowerISA", "full_name": "VSX Scalar Reciprocal Estimate Single-Precision", "summary": "Estimates the reciprocal of a single-precision floating-point value.", "description": "Computes an estimate of the reciprocal (1/XB) for a single-precision floating-point scalar value, placing the result in XT. The estimate is accurate to about 7 bits of precision. This instruction requires VSX support and may update FPSCR exception flags if the source is invalid or zero.", "syntax": "xsresp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000068", "length": "32", "binary_pattern": "T | B | 26 | BX | TX", "bit_positions": "6:10 | 11:15 | 16:20 | 21:29 | 30:31"}, "extension": "VSX", "pseudocode": "XT[32:63] ← reciprocal_estimate(XB[32:63])\nFPSCR ← update_exception_flags(FPSCR, result)", "special_registers": "FPSCR, VXSNAN", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register.", "extended_mnemonics": [], "page_found": "Page 721 - 722", "example": "xsresp vs1, vs3"}
{"mnemonic": "xsrsqrtedp", "architecture": "PowerISA", "full_name": "Double-Precision XX2-form Scalar Reciprocal Square Root Estimate", "summary": "Estimates the reciprocal square root of a double-precision floating-point value.", "description": "The instruction estimates the reciprocal square root of the double-precision floating-point value in doubleword element 0 of VSR[XB] and places the result into doubleword element 0 of VSR[XT]. Doubleword element 1 of VSR[XT] is set to 0.", "syntax": "xsrsqrtedp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000128", "length": "32", "binary_pattern": "18 | T | B | 74", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nv ← bfp_RECIPROCAL_SQUARE_ROOT_ESTIMATE(src)\nrnd ← bfp_ROUND_TO_BFP64(0b0, FPSCR.RN, v)\nresult ← bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxsqrt_flag=1 then SetFX(FPSCR.VXSQRT)\nif zx_flag=1 then SetFX(FPSCR.ZX)\nvx_flag ← vxsnan_flag | vxsqrt_flag\nvex_flag ← FPSCR.VE & vx_flag\nzex_flag ← FPSCR.ZE & zx_flag\nif vex_flag=0 & zex_flag=0 then do\n    VSR[32×TX+T].dword[0] ← result\n    VSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\n    FPSCR.FPRF ← fprf_CLASS_BFP64(result)\n    FPSCR.FR ← 0bU\n    FPSCR.FI ← 0bU\nend", "special_registers": "FPSCR (FPRF, FX, VXSNAN, FR, FI)", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register.", "extended_mnemonics": [], "page_found": "Page 722 - 723", "example": "xsrsqrtedp vs1, vs3"}
{"mnemonic": "xsrsqrtesp", "architecture": "PowerISA", "full_name": "VSX Scalar Reciprocal Square Root Estimate (Single-Precision)", "summary": "Estimates the reciprocal square root of a single-precision floating-point value.", "description": "The instruction estimates the reciprocal square root of a single-precision floating-point value in doubleword element 0 of VSR[XB] and places the result into doubleword element 0 of VSR[XT]. Doubleword element 1 of VSR[XT] is set to 0.", "syntax": "xsrsqrtesp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}, {"name": "FRT", "desc": "Target Floating Point Register"}, {"name": "FRB", "desc": "Source Floating Point Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000028", "length": "32", "binary_pattern": "T | B | 10 | BX | TX", "bit_positions": "6 | 11 | 16 | 21 | 30 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nv ← bfp_RECIPROCAL_SQUARE_ROOT_ESTIMATE(src)\nrnd ← bfp_ROUND_TO_BFP32(FPSCR.RN, v)\nresult32 ← bfp32_CONVERT_FROM_BFP(rnd)\nresult64 ← bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxsqrt_flag=1 then SetFX(FPSCR.VXSQRT)\nif ox_flag=1 then SetFX(FPSCR.OX)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif 0bU then SetFX(FPSCR.XX)\nif zx_flag=1 then SetFX(FPSCR.ZX)\nvx_flag ← vxsnan_flag | vxsqrt_flag\nvex_flag ← FPSCR.VE & vx_flag\nzex_flag ← FPSCR.ZE & zx_flag\nif vex_flag=0 & zex_flag=0 then do\n    VSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\n    FPSCR.FPRF ← fprf_CLASS_BFP32(result32)\n    FPSCR.FR ← 0bU\n    FPSCR.FI ← 0bU\nelse do\n    FPSCR.FR ← 0b0\n    FPSCR.FI ← 0b0\nend", "special_registers": "FPSCR (FPRF, FX, OX, UX, ZX, VXSNAN, VXSQRT, FR, FI, XX)", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 723 - 724", "example": "xsrsqrtesp vs1, vs3"}
{"mnemonic": "xstdivdp", "architecture": "PowerISA", "full_name": "VSX Scalar Test for software Divide Double-Precision", "summary": "Performs a double-precision floating-point division and sets condition flags based on the result.", "description": "Tests for special cases in double-precision floating-point division (such as division by zero or invalid operands) and sets a condition register field with the result. No actual division is performed; instead, the instruction is used to check operand validity before software performs the division. This instruction requires VSX support.", "syntax": "xstdivdp BF,XA,XB", "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "XA", "desc": "Index for Source Vector Register (src1)"}, {"name": "XB", "desc": "Index for Source Vector Register (src2)"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF00001E8", "length": "32", "binary_pattern": "18 | BF | XA | XB", "bit_positions": "0:5 | 6:8 | 9:10 | 11:31"}, "extension": "VSX", "pseudocode": "BF ← test_division(XA[0:63], XB[0:63])\nCR[BF:BF+3] ← BF", "special_registers": "CR (field BF)", "programming_notes": "The xstdivdp instruction is used for performing double-precision floating-point division and setting condition flags based on various error conditions or special cases. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking the MSR.VSX bit; otherwise, a VSX_Unavailable exception will be raised. Be cautious of division by zero, overflow, underflow, and NaN/Infinity values, as these can set specific condition flags in the CR register.", "extended_mnemonics": [], "page_found": "Page 724 - 725", "example": "xstdivdp cr0, vs2, vs3"}
{"mnemonic": "xstsqrtdp", "architecture": "PowerISA", "full_name": "VSX Scalar Test for software Square Root, Double-Precision", "summary": "Tests the double-precision floating-point value in VSR[XB] and sets condition register field BF based on various flags.", "description": "The instruction tests the double-precision floating-point value in VSR[XB].dword[0] and sets CR.field[BF] based on flags fe_flag, fg_flag, and fl_flag.", "syntax": "xstsqrtdp BF,XB", "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "XB", "desc": "Vector-Scalar Register Index"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00001A8", "length": "32", "binary_pattern": "18 | BF | XB", "bit_positions": "0:5 | 6:8 | 9:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\nsrc ← VSR[32×XB+B].dword[0]\ne_b ← src.bit[1:11] - 1023\nfe_flag ← IsNaN(src) | IsInf(src) | IsZero(src) |\n           IsNeg(src) | (e_b <= -970)\nfg_flag ← IsInf(src) | IsZero(src) | IsDen(src)\nfl_flag ← xsrsqrtedp_error() <= 2-14\nCR.field[BF] ← 0b1 || fg_flag || fe_flag || 0b0", "special_registers": "CR", "programming_notes": "This instruction is used to test a double-precision floating-point value for special conditions like NaN, infinity, zero, and denormal numbers. It sets the condition register field based on these flags. Ensure VSX is enabled in the MSR; otherwise, an exception will be raised. The instruction does not require any specific alignment or privilege level.", "extended_mnemonics": [], "page_found": "Page 725 - 726", "example": "xstsqrtdp cr0, vs3"}
{"mnemonic": "xvmaddasp", "architecture": "PowerISA", "full_name": "Vector Multiply-Add Single-Precision Type-A", "summary": "Performs a single-precision floating-point multiply-add operation on vector elements.", "description": "Performs a vector multiply-add operation on single-precision floating-point elements, computing XT = XT + (XA × XB) for each element. The operation is fused, rounding only once at the end. This instruction requires VSX support and updates FPSCR exception flags based on the operation results.", "syntax": "xvmaddasp XT,XA,XB", "operands": [{"name": "XT", "desc": "Destination Vector Register"}, {"name": "XA", "desc": "Source Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000208", "length": "32", "binary_pattern": "6 | T | A | B | AX | BX | TX", "bit_positions": ""}, "extension": "VSX", "pseudocode": "for i ∈ {0, 1, 2, 3}\n  XT[i*32:(i+1)*32] ← XT[i*32:(i+1)*32] + (XA[i*32:(i+1)*32] × XB[i*32:(i+1)*32])\nFPSCR ← update_exception_flags(FPSCR, results)", "special_registers": "FPSCR, VXSNAN, VXIMZ, Vxisi, OX, UX, XX", "programming_notes": "The xvmaddasp instruction is commonly used for performing vectorized single-precision floating-point multiply-add operations. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid a VSX_Unavailable exception. Be cautious of potential exceptions such as VXSNAN, VXIMZ, Vxisi, OX, UX, and XX, which can be set based on the operation's result and FPSCR settings. The instruction operates on 128-bit vectors, so ensure proper alignment for optimal performance.", "extended_mnemonics": [], "page_found": "Page 748 - 749", "example": "xvmaddasp vs1, vs2, vs3"}
{"mnemonic": "xvmsubadp", "architecture": "PowerISA", "full_name": "VSX Vector Multiply-Subtract Type-A Double-Precision", "summary": "Performs a double-precision floating-point multiply-subtract operation on vector elements.", "description": "Performs a vector multiply-subtract operation on double-precision floating-point elements, computing XT = XT - (XA × XB) for each element. The operation is fused, rounding only once at the end. This instruction requires VSX support and updates FPSCR exception flags based on the operation results.", "syntax": "xvmsubadp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XA", "desc": "Source Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000388", "length": "32", "binary_pattern": "1000 | XA | XB | XT | 000000 | 000000 | 000000 | 000000", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "extension": "VSX", "pseudocode": "for i ∈ {0, 1}\n  XT[i*64:(i+1)*64] ← XT[i*64:(i+1)*64] - (XA[i*64:(i+1)*64] × XB[i*64:(i+1)*64])\nFPSCR ← update_exception_flags(FPSCR, results)", "special_registers": "FPSCR", "programming_notes": "The xvmsubadp instruction is commonly used for complex floating-point arithmetic operations involving multiplication, subtraction, and addition. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid a VSX_Unavailable exception. Be cautious of potential exceptions such as VXSNAN, VXIMZ, VXISI, OX, UX, and XX, which can be triggered by invalid operations or overflow conditions. The instruction operates on double-precision floating-point numbers and requires proper alignment of the input vectors.", "extended_mnemonics": [], "page_found": "Page 751 - 752", "example": "xvmsubadp vs1, vs2, vs3"}
{"mnemonic": "xvmsubasp", "architecture": "PowerISA", "full_name": "VSX Vector Multiply-Subtract Type-A Single-Precision", "summary": "Performs a vector multiply-subtract operation on single-precision floating-point values.", "description": "Performs a single-precision floating-point multiply-subtract operation (XT ← (XA × XB) - XT) on vector elements using the Type-A fused operation. This VSX instruction operates on two 128-bit vector registers, each containing four single-precision floating-point elements. The instruction does not affect condition registers or status flags; rounding behavior follows the FPSCR settings.", "syntax": "xvmsubasp XT,XA,XB", "operands": [{"name": "XT", "desc": "Destination Vector Register"}, {"name": "XA", "desc": "Source Vector Register A"}, {"name": "XB", "desc": "Source Vector Register B"}, {"name": "VX", "desc": "Target Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000288", "length": "32", "binary_pattern": "111100 | XA | XT | XB | VX | 000000 | 000000 | 000000", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "extension": "VSX", "pseudocode": "XT ← (XA × XB) - XT", "special_registers": "FPSCR", "programming_notes": "The xvmsubasp instruction is commonly used for vectorized floating-point operations, particularly in scientific computing and graphics processing. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking the MSR.VSX bit; otherwise, a VSX_Unavailable exception will be raised. Be cautious of alignment requirements for vector registers to avoid performance penalties or exceptions. This instruction operates at user privilege level but can generate various floating-point exceptions based on the FPSCR settings, which should be handled appropriately in error-checking code.", "extended_mnemonics": [], "page_found": "Page 754 - 755", "example": "xvmsubasp vs1, vs2, vs3"}
{"mnemonic": "xvnmaddadp", "architecture": "PowerISA", "full_name": "Vector Negative Multiply-Add Type-A Double-Precision", "summary": "Performs a negative multiply-add operation on double-precision floating-point elements.", "description": "For xvnmaddadp, for each integer value i from 0 to 1, the following operations are performed: src1 is multiplied by src3, then src2 is added to the product. The result is normalized and rounded to double precision using the rounding mode specified by RN. The final result is negated and placed into VSR[XT].", "syntax": "xvnmaddadp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XA", "desc": "Source Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000708", "length": "32", "binary_pattern": "60 | XT | XA | XB | 1800", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\ndo i = 0 to 1\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[i])\n    src2 ←bfp_CONVERT_FROM_BFP64(VSR[32×TX+T].dword[i])\n    src3 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n\n    v   ←bfp_MULTIPLY_ADD(src1,src3,src2)\n    rnd ←bfp_NEGATE(bfp_ROUND_TO_BFP64(FPSCR.RN,v))\n    vresult.dword[i] ←bfp64_CONVERT_FROM_BFP(rnd)\n\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vximz_flag=1 then SetFX(FPSCR.VXIMZ)\n    if vxisi_flag=1 then SetFX(FPSCR.VXISI)\n    if ox_flag=1 then SetFX(FPSCR.OX)\n    if ux_flag=1 then SetFX(FPSCR.UX)\n    if xx_flag=1 then SetFX(FPSCR.XX)\n\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vximz_flag) | (FPSCR.VE & vxisi_flag) | (FPSCR.OE & ox_flag) | (FPSCR.UE & ux_flag) | (FPSCR.XE & xx_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR, VXSNAN, VXIMZ, Vxisi, OX, UX, XX", "programming_notes": "This instruction performs vectorized negative multiply-add operations on double-precision floating-point numbers. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. Be cautious with rounding modes specified by FPSCR.RN, as they can affect precision and performance. Handle exceptions properly by checking the VXSNAN, VXIMZ, Vxisi, OX, UX, and XX flags after execution.", "extended_mnemonics": [], "page_found": "Page 757 - 758", "example": "xvnmaddadp vs1, vs2, vs3"}
{"mnemonic": "xvnmaddasp", "architecture": "PowerISA", "full_name": "Vector Negative Multiply-Add Single-Precision Type-A", "summary": "Performs a negative multiply-add operation on single-precision floating-point elements.", "description": "Performs a negative multiply-add operation on single-precision floating-point vector elements (XT ← -(XA × XB) + XT) using Type-A fused arithmetic. This VSX instruction operates on 128-bit vector registers each containing four single-precision values. The operation does not affect condition registers; rounding and exception behavior follows FPSCR settings.", "syntax": "xvnmaddasp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XA", "desc": "Source Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000608", "length": "32", "binary_pattern": "60 | XT | XA | XB | 1544", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "XT ← -(XA × XB) + XT", "special_registers": "FPSCR, VXSNAN, VXIMZ, Vxisi, OX, UX, XX", "programming_notes": "This instruction is commonly used in vectorized floating-point computations where negative multiplication and addition are required. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking MSR.VSX before using this instruction. Be aware of potential exceptions such as NaNs, infinities, or underflows, which can set flags in FPSCR and may trigger exceptions based on the current settings.", "extended_mnemonics": [], "page_found": "Page 761 - 762", "example": "xvnmaddasp vs1, vs2, vs3"}
{"mnemonic": "xvnmsubadp", "architecture": "PowerISA", "full_name": "VSX Vector Negative Multiply-Subtract Type-A Double-Precision", "summary": "Performs a negative multiply-subtract operation on double-precision floating-point elements.", "description": "For each integer value i from 0 to 1, the instruction performs the following operations: multiplies src1 by src3, negates src2, adds the result to the product, normalizes the sum, rounds it to double precision, and places the final result into VSR[XT].", "syntax": "xvnmsubadp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XA", "desc": "Source Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000788", "length": "32", "binary_pattern": "60 | XT | XA | XB | 1928", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\ndo i = 0 to 1\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[i])\n    src2 ←bfp_CONVERT_FROM_BFP64(VSR[32×TX+T].dword[i])\n    src3 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n\n    v   ←bfp_MULTIPLY_ADD(src1,src3,bfp_NEGATE(src2))\n    rnd ←bfp_NEGATE(bfp_ROUND_TO_BFP64(FPSCR.RN,v))\n    vresult.dword[i] ←bfp64_CONVERT_FROM_BFP(rnd)\n\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vximz_flag=1 then SetFX(FPSCR.VXIMZ)\n    if vxisi_flag=1 then SetFX(FPSCR.VXISI)\n    if ox_flag=1 then SetFX(FPSCR.OX)\n    if ux_flag=1 then SetFX(FPSCR.UX)\n    if xx_flag=1 then SetFX(FPSCR.XX)\n\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vximz_flag) | (FPSCR.VE & vxisi_flag) | (FPSCR.OE & ox_flag) | (FPSCR.UE & ux_flag) | (FPSCR.XE & xx_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR, VXSNAN, VXIMZ, Vxisi, OX, UX, XX", "programming_notes": "This instruction is used for performing vectorized negative multiply-subtract operations on double-precision floating-point numbers. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. Be cautious of potential overflow and underflow conditions, as indicated by the exception flags. The operation processes two elements at a time, so ensure your data is correctly aligned for optimal performance.", "extended_mnemonics": [], "page_found": "Page 764 - 765", "example": "xvnmsubadp vs1, vs2, vs3"}
{"mnemonic": "xvnmsubasp", "architecture": "PowerISA", "full_name": "VSX Vector Negative Multiply-Subtract Type-A Single-Precision", "summary": "Performs a negative multiply-subtract operation on single-precision floating-point elements.", "description": "For xvnmsubasp, for each integer value i from 0 to 3, the following operations are performed: src1 is multiplied by src3, producing a product having unbounded range and precision. src2 is negated and added to the product, producing a sum having unbounded range and precision. The sum is normalized. The intermediate result is rounded to single-precision using the rounding mode specified by RN. The result is negated and placed into word element i of VSR[XT] in single-precision format.", "syntax": "xvnmsubasp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XA", "desc": "Source Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000688", "length": "32", "binary_pattern": "60 | XT | XA | XB | 1672", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nex_flag ←0b0\ndo i = 0 to 3\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP32(VSR[32×AX+A].word[i])\n    src2 ←bfp_CONVERT_FROM_BFP32(VSR[32×TX+T].word[i])\n    src3 ←bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n    v   ←bfp_MULTIPLY_ADD(src1,src3,bfp_NEGATE(src2))\n    rnd ←bfp_NEGATE(bfp_ROUND_TO_BFP32(FPSCR.RN,v))\n    vresult.word[i] ←bfp32_CONVERT_FROM_BFP(rnd)\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vximz_flag=1 then SetFX(FPSCR.VXIMZ)\n    if vxisi_flag=1 then SetFX(FPSCR.VXISI)\n    if ox_flag=1 then SetFX(FPSCR.OX)\n    if ux_flag=1 then SetFX(FPSCR.UX)\n    if xx_flag=1 then SetFX(FPSCR.XX)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vximz_flag) | (FPSCR.VE & vxisi_flag) | (FPSCR.OE & ox_flag) | (FPSCR.UE & ux_flag) | (FPSCR.XE & xx_flag)\nend\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR, VXSNAN, VXIMZ, Vxisi, OX, UX, XX", "programming_notes": "This instruction performs a vectorized negative multiply-subtract operation on single-precision floating-point numbers. Ensure that the VSX feature is enabled in the MSR register to avoid exceptions. Be cautious with rounding modes specified by FPSCR.RN, as they can affect precision and performance. Handle exceptions properly by checking the VXSNAN, VXIMZ, Vxisi, OX, UX, and XX flags after execution.", "extended_mnemonics": [], "page_found": "Page 767 - 768", "example": "xvnmsubasp vs1, vs2, vs3"}
{"mnemonic": "xvredp", "architecture": "PowerISA", "full_name": "Vector Reciprocal Estimate Double-Precision", "summary": "A double-precision floating-point estimate of the reciprocal of src is placed into doubleword element i of VSR[XT] in double-precision format.", "description": "Unless the reciprocal of src would be a zero, an infinity, or a QNaN, the estimate has a relative error in precision no greater than one part in 16384 of the reciprocal of src.", "syntax": "xvredp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000368", "length": "32", "binary_pattern": "0 | 6 | 11 | 16 | 21 | 26 | 30 | 31", "bit_positions": "0 | 6 | 11 | 16 | 21 | 26 | 30 | 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nreset_xflags()\nvresult = bfp_RECIPROCAL_ESTIMATE(VSR[32×BX+B].dword[i])\nrnd = bfp_ROUND_TO_BFP64(0b0, FPSCR.RN, vresult)\nvresult.word[i] = bfp64_CONVERT_FROM_BFP(rnd)\n\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif ox_flag=1 then SetFX(FPSCR.OX)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif zx_flag=1 then SetFX(FPSCR.ZX)\nex_flag = ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.OE & ox_flag) | (FPSCR.UE & ux_flag) | (FPSCR.ZE & zx_flag)\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR FX OX UX ZX VXSNAN", "programming_notes": "The xvredp instruction is used to estimate the reciprocal of a double-precision floating-point number with high precision. It's important to ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register, otherwise, an exception will be raised. Developers should also handle exceptions by checking the FPSCR flags for overflow (OX), underflow (UX), zero divide (ZX), and invalid operation (VXSNAN).", "extended_mnemonics": [], "page_found": "Page 770 - 771", "example": "xvredp vs1, vs3"}
{"mnemonic": "xvresp", "architecture": "PowerISA", "full_name": "Vector Reciprocal Estimate Single-Precision", "summary": "Estimates the reciprocal of single-precision floating-point values in a vector.", "description": "A single-precision floating-point estimate of the reciprocal of src is placed into word element i of VSR[XT] in single-precision format. Unless the reciprocal of src would be a zero, an infinity, or a QNaN, the estimate has a relative error in precision no greater than one part in 16384 of the reciprocal of src.", "syntax": "xvresp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000268", "length": "32", "binary_pattern": "T | B | BX | TX", "bit_positions": "0:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nex_flag ←0b0\nreset_xflags()\ndo i = 0 to 3\n    src ←bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n    rnd ←bfp_ROUND_TO_BFP32(FPSCR.RN,v)\n    vresult.word[i] ←bfp32_CONVERT_FROM_BFP(rnd)\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if ox_flag=1 then SetFX(FPSCR.OX)\n    if ux_flag=1 then SetFX(FPSCR.UX)\n    if zx_flag=1 then SetFX(FPSCR.ZX)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.OE & ox_flag) | (FPSCR.UE & ux_flag) | (FPSCR.ZE & zx_flag)\nend\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR FX OX UX ZX VXSNAN", "programming_notes": "The xvresp instruction is used to estimate the reciprocal of single-precision floating-point numbers in vector registers. It's important to ensure that the VSX (Vector Scalar Extensions) are enabled, as attempting to use this instruction when they are not will result in an exception. The instruction handles NaNs and infinities by setting appropriate flags in the FPSCR register, but developers should be cautious of potential precision loss due to the estimation process.", "extended_mnemonics": [], "page_found": "Page 771 - 772", "example": "xvresp vs1, vs3"}
{"mnemonic": "xvrsqrtedp", "architecture": "PowerISA", "full_name": "Vector Reciprocal Square Root Estimate Double-Precision", "summary": "Estimates the reciprocal square root of double-precision floating-point values in vector registers.", "description": "This instruction estimates the reciprocal square root of each element in a double-precision floating-point vector and stores the result in another vector register. The estimate has a relative error no greater than one part in 16384 of the reciprocal of the square root of the source value.", "syntax": "xvrsqrtedp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000328", "length": "32", "binary_pattern": "T | B | 202 | BX | TX", "bit_positions": "6 | 11 | 16 | 21 | 30 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\n\ndo i = 0 to 1\n    reset_xflags()\n    src ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    v   ←bfp_RECIPROCAL_SQUARE_ROOT_ESTIMATE(src)\n    rnd ←bfp_ROUND_TO_BFP64(0b0,FPSCR.RN,v)\n    vresult.dword[i] ←bfp64_CONVERT_FROM_BFP(rnd)\n    if vxsqrt_flag=1 then SetFX(FPSCR.VXSQRT)\n    if zx_flag=1 then SetFX(FPSCR.ZX)\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN) if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR (FX, ZX, VXSNAN, VXSQRT)", "programming_notes": "The xvrsqrtedp instruction is used to estimate the reciprocal square root of each element in a double-precision floating-point vector. It requires VSX (Vector Scalar Extensions) to be enabled, otherwise, it will raise an exception. The result has a relative error no greater than one part in 16384. Be cautious with special values like NaNs or zeros, as they can trigger exceptions and set specific flags in the FPSCR register.", "extended_mnemonics": [], "page_found": "Page 772 - 773", "example": "xvrsqrtedp vs1, vs3"}
{"mnemonic": "xvrsqrtesp", "architecture": "PowerISA", "full_name": "VSX Vector Reciprocal Square Root Estimate Single-Precision", "summary": "Estimates the reciprocal square root of single-precision floating-point values in a vector.", "description": "The instruction estimates the reciprocal square root of each element in the source vector and stores the result in the target vector. The estimate has a relative error no greater than one part in 16384 of the reciprocal of the square root of the source value.", "syntax": "xvrsqrtesp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000228", "length": "32", "binary_pattern": "18 | T | B | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\n\ndo i = 0 to 3\n    reset_xflags()\n    src ←bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n    v   ←bfp_RECIPROCAL_SQUARE_ROOT_ESTIMATE(src)\n    rnd ←bfp_ROUND_TO_BFP32(FPSCR.RN,v)\n    vresult.word[i] ←bfp32_CONVERT_FROM_BFP(rnd)\n    if vxsqrt_flag=1 then SetFX(FPSCR.VXSQRT)\n    if zx_flag=1 then SetFX(FPSCR.ZX)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR (FX, ZX, VXSNAN, VXSQRT)", "programming_notes": "The xvrsqrtesp instruction is commonly used for fast reciprocal square root estimation in single-precision floating-point operations. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting the MSR.VSX bit. Be aware of potential exceptions such as VXSNAN or VXSQRT, which can be handled by examining the FPSCR register flags. The instruction operates on 4-element vectors, so ensure proper alignment and ordering of data for accurate results.", "extended_mnemonics": [], "page_found": "Page 773 - 774", "example": "xvrsqrtesp vs1, vs3"}
{"mnemonic": "xvtdivdp", "architecture": "PowerISA", "full_name": "Vector Test for software Divide Double-Precision", "summary": "Performs a double-precision floating-point division on vector elements and sets condition flags based on the results.", "description": "Tests whether a double-precision floating-point divide operation would be valid for each vector element and sets bits in the specified condition register field accordingly. This VSX instruction compares operands in XA and XB (two double-precision values per 128-bit register) against division validity conditions (divide-by-zero, invalid operands, etc.). The condition register field BF is set to reflect the test results; no other registers are modified.", "syntax": "xvtdivdp BF,XA,XB", "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "XA", "desc": "Index for Source Vector Register A"}, {"name": "XB", "desc": "Index for Source Vector Register B"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF00003E8", "length": "32", "binary_pattern": "18 | BF | XA | XB", "bit_positions": "0:5 | 6:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "for i in 0 to 1 do\n  quotient_valid ← test_divide_conditions(XA[i], XB[i])\n  CR[BF] ← (quotient_valid, 0, 0, 0)\nend for", "special_registers": "CR field BF", "programming_notes": "The xvtdivdp instruction is used for performing double-precision floating-point division on vector elements. It sets condition flags based on the results, which can be useful for error checking and conditional operations. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. Be cautious of division by zero and other special cases like NaNs or infinities, as these will set specific condition flags.", "extended_mnemonics": [], "page_found": "Page 774 - 775", "example": "xvtdivdp cr0, vs2, vs3"}
{"mnemonic": "xvtdivsp", "architecture": "PowerISA", "full_name": "VSX Vector Test for software Divide Single-Precision XX3-form", "summary": "Performs a vectorized single-precision floating-point division test.", "description": "Tests whether a single-precision floating-point divide operation would be valid for each vector element and sets the specified condition register field based on the results. This VSX instruction examines operands in XA and XB (four single-precision values per 128-bit register) for division validity conditions such as divide-by-zero or invalid operands. The condition register field BF is updated to reflect test outcomes; no other state is modified.", "syntax": "xvtdivsp BF,XA,XB", "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "XA", "desc": "Index for Source VSX Register A"}, {"name": "XB", "desc": "Index for Source VSX Register B"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF00002E8", "length": "32", "binary_pattern": "18 | BF | XA | XB", "bit_positions": "0:5 | 6:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "for i in 0 to 3 do\n  quotient_valid ← test_divide_conditions(XA[i], XB[i])\n  CR[BF] ← (quotient_valid, 0, 0, 0)\nend for", "special_registers": "CR field BF", "programming_notes": "The xvtdivsp instruction is used for vectorized single-precision floating-point division testing. It sets condition register flags based on the results of dividing elements from two VSX registers. Ensure that the VSX facility is enabled (MSR.VSX=1) before using this instruction. Be cautious with NaNs, infinities, and zero values in the operands, as they can trigger special flag conditions. The instruction operates on 4-element vectors, so ensure proper alignment of data in the VSX registers.", "extended_mnemonics": [], "page_found": "Page 775 - 776", "example": "xvtdivsp cr0, vs2, vs3"}
{"mnemonic": "xvtsqrtdp", "architecture": "PowerISA", "full_name": "Vector Test for software Square Root, Double-Precision", "summary": "Tests the double-precision floating-point operands in VSR[XB] and sets condition register field BF based on certain conditions.", "description": "This instruction tests each of the two double-precision floating-point elements in VSR[XB] and updates the condition register field BF accordingly. It checks for NaN, infinity, zero, negative values, and denormalized values, setting flags fe_flag and fg_flag based on these conditions.", "syntax": "xvtsqrtdp BF,XB", "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "XB", "desc": "Vector-Scalar Register Index"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00003A8", "length": "32", "binary_pattern": "18 | BF | XB", "bit_positions": "0:5 | 6:8 | 9:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\n\nfe_flag ←0b0\nfg_flag ←0b0\n\ndo i = 0 to 1\n    src    ←VSR[32×BX+B].dword[i]\n    e_b    ←src.bit[1:11] - 1023\n    fe_flag ←fe_flag |\n               IsNaN(src) | IsInf(src)  |\n               IsZero(src) | IsNeg(src) |\n               (e_a <= -970)\n    fg_flag ←fg_flag |\n               IsInf(src) | IsZero(src) | IsDen(src)\nend\n\nfl_flag ←xvrsqrtedp_error() <= 2-14\nCR.field[BF] ←0b1 || fg_flag || fe_flag || 0b0", "special_registers": "CR", "programming_notes": "The xvtsqrtdp instruction is used to test double-precision floating-point elements for various conditions like NaN, infinity, zero, negative values, and denormalized values. It updates the condition register (CR) with flags indicating these conditions. Ensure that VSX is enabled in the MSR before using this instruction; otherwise, a VSX_Unavailable exception will occur. The instruction does not require specific alignment for its operands.", "extended_mnemonics": [], "page_found": "Page 776 - 777", "example": "xvtsqrtdp cr0, vs3"}
{"mnemonic": "xvtsqrtsp", "architecture": "PowerISA", "full_name": "VSX Vector Test for software Square Root, Single-Precision", "summary": "Tests each element of a vector for conditions related to square root operations.", "description": "Tests whether a square root operation would be valid for each single-precision floating-point vector element and sets the specified condition register field accordingly. This VSX instruction examines the four single-precision values in XB against square root validity conditions (e.g., negative operands). The condition register field BF is set to reflect the test outcome; no other registers are modified.", "syntax": "xvtsqrtsp BF,XB", "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "XB", "desc": "Vector-Scalar Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00002A8", "length": "32", "binary_pattern": "18 | BF | XB", "bit_positions": "0:5 | 6:8 | 9:31"}, "extension": "VSX", "pseudocode": "for i in 0 to 3 do\n  sqrt_valid ← test_sqrt_conditions(XB[i])\n  CR[BF] ← (sqrt_valid, 0, 0, 0)\nend for", "special_registers": "CR", "programming_notes": "The xvtsqrtsp instruction is used to test each element of a vector for NaN, infinity, zero, negative values, and underflow conditions. It sets the condition register based on these tests. Ensure that VSX is enabled in the MSR before using this instruction; otherwise, it will raise an exception. The instruction does not require specific alignment but must be executed at a privilege level where VSX is available.", "extended_mnemonics": [], "page_found": "Page 777 - 778", "example": "xvtsqrtsp cr0, vs3"}
{"mnemonic": "xscmpoqp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Ordered Quad-Precision", "summary": "Compares two quad-precision floating-point values and updates the condition register.", "description": "The instruction compares the contents of VSR[VRA+32] (src1) and VSR[VRB+32] (src2) represented in quad-precision format. The comparison results are stored in the CR field BF and FPSCR fields FL, FG, FE, and FU.", "syntax": "xscmpoqp BF,VRA,VRB", "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "VRA", "desc": "Vector Register A"}, {"name": "VRB", "desc": "Vector Register B"}, {"name": "VRT", "desc": "Target Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000108", "length": "32", "binary_pattern": "63 | BF | / | FRA | FRB | 132 | Rc", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc1 ←bfp_CONVERT_FROM_BFP128(VSR[VRA+32])\nsrc2 ←bfp_CONVERT_FROM_BFP128(VSR[VRB+32])\nif src1.class.SNaN=1 | src2.class.SNaN=1 then do\n    vxsnan_flag ←0b1\n    if FPSCR.VE=0 then vxvc_flag ←0b1\nend else\n    vxvc_flag ←src1.class.QNaN | src2.class.QNaN\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxvc_flag=1   then SetFX(FPSCR.VXVC)\nCR.bit[4×BF+32] ←FPSCR.FL ←src1 < src2\nCR.bit[4×BF+33] ←FPSCR.FG ←src1 > src2\nCR.bit[4×BF+34] ←FPSCR.FE ←src1 = src2\nCR.bit[4×BF+35] ←FPSCR.FU ←src1.class.SNaN | src1.class.QNaN | src2.class.SNaN | src2.class.QNaN", "special_registers": "CR, FPSCR, VXVC", "programming_notes": "This instruction is used for comparing two quad-precision floating-point numbers. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid an exception. Be cautious with NaN values, as they can trigger exceptions and set specific flags in FPSCR. The comparison results update both the CR field and FPSCR fields, so always check these registers after execution for proper handling of unordered comparisons or exceptions.", "extended_mnemonics": [], "page_found": "Page 780 - 781", "example": "xscmpoqp cr0, v2, v3"}
{"mnemonic": "xscmpeqdp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Equal Double-Precision", "summary": "Compares two double-precision floating-point values and sets the target vector register based on equality.", "description": "The instruction compares the double-precision floating-point values in the specified source vector registers. If either value is a SNaN, an Invalid Operation exception occurs. The result of the comparison is stored in the target vector register.", "syntax": "xscmpeqdp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XA", "desc": "Source Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000018", "length": "32", "binary_pattern": "T | A | B | 3 | AX | BX | TX", "bit_positions": "6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nsrc1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[0])\nsrc2 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nvxsnan_flag ←src1.class.SNaN | src2.class.SNaN\nvex_flag ←FPSCR.VE & vxsnan_flag\nif vxsnan_flag=1 SetFX(FPSCR.VXSNAN)\nif vex_flag=0 then do\n    if src1=src2 then\n        VSR[32×TX+T].dword[0] ←0xFFFF_FFFF_FFFF_FFFF\n        VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n    else do\n        VSR[32×TX+T].dword[0] ←0x0000_0000_0000_0000\n        VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n    end\nend", "special_registers": "FPSCR (FX, VXSNAN)", "programming_notes": "xscmpeqdp can be used to implement the C/C++/Java conditional operation, RESULT = (x=y) ? a:b.\nxscmpeqdp   fEQ,fX,fY\nxxsel       fRESULT,fA,fB,fEQ", "extended_mnemonics": [], "page_found": "Page 784 - 785", "example": "xscmpeqdp vs1, vs2, vs3"}
{"mnemonic": "xscmpeqqp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Equal Quad-Precision X-form", "summary": "Compares two quad-precision floating-point values and sets the target vector register to all 1s if they are equal, otherwise all 0s.", "description": "The instruction compares the quad-precision floating-point values in VSR[VRA+32] and VSR[VRB+32]. If either value is a SNaN, an Invalid Operation exception occurs. The contents of VSR[VRT+32] are set to all 1s if the values are equal, otherwise all 0s.", "syntax": "xscmpeqqp VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000088", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB", "bit_positions": ""}, "extension": "VSX", "pseudocode": "src1 ← bfp_CONVERT_FROM_BFP128(VSR[VRA+32])\nsrc2 ← bfp_CONVERT_FROM_BFP128(VSR[VRB+32])\nvxsnan_flag ← src1.class.SNaN | src2.class.SNaN\nvex_flag ← FPSCR.VE & vxsnan_flag\nif vxsnan_flag=1 SetFX(FPSCR.VXSNAN)\nif vex_flag=0 then do\n   if bfp_COMPARE_EQ(src1, src2)=1 then\n      VSR[VRT+32] ← 0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF\n   else\n      VSR[VRT+32] ← 0x0000_0000_0000_0000_0000_0000_0000_0000", "special_registers": "FPSCR", "programming_notes": "xscmpeqqp can be used to implement the C/C++ conditional operation, RESULT = (x=y) ? a : b.\nxscmpeqqp   vEQ,vX,vY\nxxsel       vRESULT,vA,vB,vEQ", "extended_mnemonics": [], "page_found": "Page 785 - 786", "example": "xscmpeqqp v1, v2, v3"}
{"mnemonic": "xscmpgedp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Greater Than or Equal (Double-Precision)", "summary": "Compares two double-precision floating-point values and sets the target vector register based on the comparison result.", "description": "The instruction compares the double-precision floating-point value in doubleword 0 of VSR[XA] with the double-precision floating-point value in doubleword 0 of VSR[XB]. If the first value is greater than or equal to the second, it sets the target vector register's doubleword 0 to 0xFFFF_FFFF_FFFF_FFFF and doubleword 1 to 0x0000_0000_0000_0000. Otherwise, both doublewords are set to 0x0000_0000_0000_0000.", "syntax": "xscmpgedp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XA", "desc": "Source Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000098", "length": "32", "binary_pattern": "19 | T | A | B | AX | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nsrc1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[0])\nsrc2 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\n\nif src1.class.SNaN=1 | src2.class.SNaN=1 then do\n   vxsnan_flag ←0b1\n   if FPSCR.VE=0 then vxvc_flag ←0b1\nend else\n   vxvc_flag ←src1.class.QNaN | src2.class.QNaN\nvex_flag ←FPSCR.VE & (vxsnan_flag | vxvc_flag)\n\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxvc_flag=1   then SetFX(FPSCR.VXVC)\n\nif vex_flag=0 then do\n   if src1 >= src2 then\n      VSR[32×TX+T].dword[0] ←0xFFFF_FFFF_FFFF_FFFF\n      VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n   end else do\n      VSR[32×TX+T].dword[0] ←0x0000_0000_0000_0000\n      VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n   end\nend", "special_registers": "FPSCR (FX, VXSNAN, VXVC)", "programming_notes": "xscmpgedp can be used to implement the C/C++/Java conditional operation, RESULT = (x>=y) ? a : b.\nxscmpgedp   fGE,fX,fY\nxxsel       fRESULT,fA,fB,fGE\n\nxscmpgedp can also be used to implement the C/C++/Java conditional operation, RESULT = (x<=y) ? a : b.\nxscmpgedp   fLE,fY,fX\nxxsel       fRESULT,fA,fB,fLE", "extended_mnemonics": [], "page_found": "Page 786 - 787", "example": "xscmpgedp vs1, vs2, vs3"}
{"mnemonic": "xscmpgeqp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Greater Than or Equal Quad-Precision", "summary": "Compares two quad-precision floating-point values and sets the target register based on the comparison.", "description": "The instruction compares the quad-precision floating-point value in VSR[VRA+32] with the value in VSR[VRB+32]. If the first value is greater than or equal to the second, VSR[VRT+32] is set to all 1s; otherwise, it is set to all 0s. Special handling is provided for NaN and QNaN values.", "syntax": "xscmpgeqp VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector-Scalar Register"}, {"name": "VRA", "desc": "Source Vector-Scalar Register"}, {"name": "VRB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000188", "length": "32", "binary_pattern": "18 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nsrc1 ←bfp_CONVERT_FROM_BFP128(VSR[VRA+32])\nsrc2 ←bfp_CONVERT_FROM_BFP128(VSR[VRB+32])\nif src1.class.SNaN=1 | src2.class.SNaN=1 then do\n   vxsnan_flag ←0b1\n   if FPSCR.VE=0 then vxvc_flag ←0b1\nend\nelse\n   vxvc_flag ←src1.class.QNaN | src2.class.QNaN\nvex_flag ←FPSCR.VE & (vxsnan_flag | vxvc_flag)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxvc_flag=1   then SetFX(FPSCR.VXVC)\nif vex_flag=0 then do\n   if bfp_COMPARE_GE(src1, src2)=1 then\n      VSR[VRT+32] ← 0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF\n   else\n      VSR[VRT+32] ← 0x0000_0000_0000_0000_0000_0000_0000_0000\nend", "special_registers": "FPSCR", "programming_notes": "xscmpgeqp can be used to implement the C/C++ conditional operation, RESULT = (x>=y) ? a : b.\nxscmpgeqp   vGE,vX,vY\nxxsel       vRESULT,vA,vB,vGE\nxscmpgeqp can also be used to implement the C/C++ conditional operation, RESULT = (x<=y) ? a : b.\nxscmpgeqp   vLE,vY,vX\nxxsel       vRESULT,vA,vB,vLE", "extended_mnemonics": [], "page_found": "Page 787 - 788", "example": "xscmpgeqp v1, v2, v3"}
{"mnemonic": "xscmpgtdp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Greater Than Double-Precision", "summary": "Compares two double-precision floating-point values and sets the target vector register based on the comparison.", "description": "Compares the double-precision floating-point value in the scalar portion of XA with that in XB and sets the corresponding elements in XT to all 1s (true) or all 0s (false) based on whether XA > XB. This VSX scalar instruction operates on the preferred slot (upper doubleword) of the registers. The comparison does not set condition registers but produces a vector result; quiet NaN operands compare as false without signaling.", "syntax": "xscmpgtdp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XA", "desc": "Source Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000058", "length": "32", "binary_pattern": "T | A | B | AX | BX | TX", "bit_positions": "11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "extension": "VSX", "pseudocode": "if XA[0] > XB[0] then\n  XT[0] ← 0xFFFFFFFFFFFFFFFF\nelse\n  XT[0] ← 0x0000000000000000\nend if\nXT[1] ← undefined", "special_registers": "FPSCR (FX, VXSNAN, VXVC)", "programming_notes": "xscmpgtdp can be used to implement the C/C++/Java conditional operation, RESULT = (x>y) ? a : b.\nxscmpgtdp   fGT,fX,fY\nxxsel       fRESULT,fA,fB,fGT\nxscmpgtdp can also be used to implement the C/C++/Java conditional operation, RESULT = (x<y) ? a : b.\nxscmpgtdp   fLT,fY,fX\nxxsel       fRESULT,fA,fB,fLT", "extended_mnemonics": [], "page_found": "Page 788 - 789", "example": "xscmpgtdp vs1, vs2, vs3"}
{"mnemonic": "xscmpgtqp", "architecture": "PowerISA", "full_name": "VSX Scalar Compare Greater Than Quad-Precision X-form", "summary": "Compares two quad-precision floating-point values and sets the target vector register to all 1s if the first value is greater than the second, otherwise all 0s.", "description": "The instruction compares the contents of VSR[VRA+32] (src1) with the contents of VSR[VRB+32] (src2). If src1 is greater than src2, VSR[VRT+32] is set to all 1s; otherwise, it is set to all 0s. NaN comparisons result in false for the predicate.", "syntax": "xscmpgtqp VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC0001C8", "length": "32", "binary_pattern": "18 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nsrc1 ←bfp_CONVERT_FROM_BFP128(VSR[VRA+32])\nsrc2 ←bfp_CONVERT_FROM_BFP128(VSR[VRB+32])\nvxsnan_flag ←0b0\nvxvc_flag ←src1.class.QNaN | src2.class.QNaN\nvex_flag ←FPSCR.VE & (vxsnan_flag | vxvc_flag)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxvc_flag=1   then SetFX(FPSCR.VXVC)\nif vex_flag=0 then do\n    if bfp_COMPARE_GT(src1, src2)=1 then\n        VSR[VRT+32] ← 0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF\n    else\n        VSR[VRT+32] ← 0x0000_0000_0000_0000_0000_0000_0000_0000\nend", "special_registers": "FPSCR, VXSNAN, VXVC", "programming_notes": "xscmpgtqp can be used to implement the C/C++ conditional operation, RESULT = (x>y) ? a : b.\nxscmpgtqp   vGT,vX,vY\nxxsel       vRESULT,vA,vB,vGT\nxscmpgtqp can also be used to implement the C/C++ conditional operation, RESULT = (x<y) ? a : b.\nxscmpgtqp   vLT,vY,vX\nxxsel       vRESULT,vA,vB,vLT", "extended_mnemonics": [], "page_found": "Page 789 - 790", "example": "xscmpgtqp v1, v2, v3"}
{"mnemonic": "xsrqpxp", "architecture": "PowerISA", "full_name": "VSX Scalar Round Quad-Precision to Extended-Precision", "summary": "Rounds a quad-precision floating-point value to extended-precision.", "description": "Rounds a quad-precision floating-point value to extended-precision format, placing the result in the upper half of the target VSX register. This VSX instruction requires the quad-precision operand in the upper half of VRB and uses the rounding mode specified by RMC. The operation affects FPSCR status flags (inexact, underflow, overflow, invalid) and the R bit controls whether the result is placed in the target (R=0) or returned for testing (R=1).", "syntax": "xsrqpxp R, VRT, VRB, RMC", "operands": [{"name": "R", "desc": "Rounding Mode Control"}, {"name": "VRT", "desc": "Target Vector Register (upper half)"}, {"name": "VRB", "desc": "Source Vector Register (upper half)"}, {"name": "RMC", "desc": "Rounding Mode Control"}], "encoding": {"format": "Z23-form", "hex_opcode": "0xFC00004A", "length": "32", "binary_pattern": "63 | VRT | VRB | RMC | 0 | 16 | 23 | 31", "bit_positions": "0:5 | 6:10 | 11:14 | 15 | 16:20 | 21:22 | 23:30 | 31"}, "extension": "VSX", "pseudocode": "rounding_mode ← (RMC == 0) ? FPSCR[RN] : RMC\nVRT[0] ← round_quad_to_extended(VRB[0], rounding_mode)\nif R == 1 then\n  return VRT[0] for condition register testing\nend if", "special_registers": "FPSCR", "programming_notes": "The xsrqpxp instruction is used to round a quad-precision floating-point number to extended-precision format. Ensure that the VSX facility is enabled by checking MSR.VSX before using this instruction. The rounding mode is determined by the RMC field and can be overridden by the FPSCR.RN setting when R=0. Be aware of potential exceptions such as VXSNAN, OX, UX, and XX, which may set corresponding flags in the FPSCR register.", "extended_mnemonics": [], "page_found": "Page 820 - 821", "example": "xsrqpxp 0, v1, v3, 0"}
{"mnemonic": "xsrsp", "architecture": "PowerISA", "full_name": "VSX Scalar Round to Single-Precision", "summary": "Rounds a double-precision floating-point value in VSR[XB] to single-precision and stores the result in VSR[XT].", "description": "The instruction rounds the double-precision floating-point value in doubleword element 0 of VSR[XB] to single-precision using the rounding mode specified by RN. The result is placed into doubleword element 0 of VSR[XT] in double-precision format, and doubleword element 1 of VSR[XT] is set to 0.", "syntax": "xsrsp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xF0000464", "length": "32", "binary_pattern": "18 | T | B | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nrnd ← bfp_ROUND_TO_BFP32(FPSCR.RN, src)\nresult32 ← bfp32_CONVERT_FROM_BFP(rnd)\nresult64 ← bfp64_CONVERT_FROM_BFP(rnd)\n\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif ux_flag=1 then SetFX(FPSCR.UX)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvex_flag ← FPSCR.VE & vxsnan_flag\n\nif vex_flag=0 then do\n    VSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\n    FPSCR.FPRF ← fprf_CLASS_BFP32(result32)\n    FPSCR.FR ← inc_flag\n    FPSCR.FI ← xx_flag\nend else do\n    FPSCR.FR ← 0b0\n    FPSCR.FI ← 0b0\nend", "special_registers": "FPSCR, VSR[32×TX+T].dword[0], VSR[32×TX+T].dword[1]", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 822 - 823", "example": "xsrsp vs1, vs3"}
{"mnemonic": "xscvdpspn", "architecture": "PowerISA", "full_name": "VSX Scalar Convert Scalar Single-Precision to Vector Single-Precision format Non-signalling", "summary": "Converts a scalar single-precision floating-point value to vector single-precision format without raising exceptions for inexact results.", "description": "The instruction converts the contents of doubleword element 0 of VSR[XB] represented in double-precision format to single-precision format and places it into word elements 0 and 1 of VSR[XT]. Word elements 2 and 3 of VSR[XT] are set to 0.", "syntax": "xscvdpspn XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF000042C", "length": "32", "binary_pattern": "60 | T | B | 267 | BX | TX", "bit_positions": ""}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[0])\nresult ← bfp32_CONVERT_FROM_BFP(src)\nVSR[32×TX+T].word[0] ← result\nVSR[32×TX+T].word[1] ← result\nVSR[32×TX+T].word[2] ← 0x0000_0000\nVSR[32×TX+T].word[3] ← 0x0000_0000", "special_registers": null, "programming_notes": "If x is not representable in single-precision, some exponent and/or significand bits will be discarded, likely producing undesirable results. The low-order 29 bits of the significand of x are discarded, more if the unbiased exponent of x is less than -126 (i.e., denormal). Finite values of x having an unbiased exponent less than -150 will return a result of Zero. Finite values of x having an unbiased exponent greater than +127 will result in discarding significant bits of the exponent. SNaN inputs having no significant bits in the upper 23 bits of the significand will return Infinity as the result. No status is set for any of these cases. xscvdpsp should be used to convert a scalar double-precision value to vector single-precision format. xscvdpspn should be used to convert a scalar single-precision value to vector single-precision format for non-signalling conversion.", "extended_mnemonics": [], "page_found": "Page 825 - 826", "example": "xscvdpspn vs1, vs3"}
{"mnemonic": "xvcvspbf16", "architecture": "PowerISA", "full_name": "Vector Convert Single-Precision to bfloat16 Format", "summary": "Converts single-precision floating-point values in a vector register to bfloat16 format and stores them in another vector register.", "description": "Converts four single-precision floating-point values in the source VSX register XB to bfloat16 (16-bit brain float) format and stores the results in the destination VSX register XT. This VSX instruction performs element-wise truncation and rounding of the single-precision mantissa to 7 bits, preserving the sign and 8-bit exponent. Rounding behavior follows FPSCR settings; the upper 64 bits of XT are packed with converted values.", "syntax": "xvcvspbf16 XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF011076C", "length": "32", "binary_pattern": "T | BX | TX", "bit_positions": "6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "for i in 0 to 3 do\n  XT[(i % 2)] ← convert_sp_to_bfloat16(XB[i])\nend for", "special_registers": "FPSCR (FX, VXSNAN, OX, UX, XX)", "programming_notes": "This instruction is used to convert four single-precision floating-point values to bfloat16 format. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register, otherwise, a VSX_Unavailable exception will occur. The conversion handles various special cases like NaNs and infinities according to the rounding mode set in FPSCR.RN. Be aware of potential exceptions indicated by flags such as VXSNAN, UX, XX, which can be checked in the FPSCR register.", "extended_mnemonics": [], "page_found": "Page 827 - 828", "example": "xvcvspbf16 vs1, vs3"}
{"mnemonic": "xvcvbf16spn", "architecture": "PowerISA", "full_name": "VSX Vector Convert bfloat16 to Single-Precision format Non-signaling", "summary": "Converts a vector of bfloat16 values to single-precision floating-point format.", "description": "Converts each bfloat16 value in the source VSR to single-precision (32-bit) floating-point format and stores the results in the target VSR. This is a non-signaling variant that does not raise exceptions for invalid operations. The instruction operates on two elements per 128-bit register in VSX mode.", "syntax": "xvcvbf16spn XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF010076C", "length": "32", "binary_pattern": "T | BX | TX", "bit_positions": "6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "XT[0:31] ← ConvertBF16toSP(XB[0:15])\nXT[32:63] ← ConvertBF16toSP(XB[16:31])\nXT[64:95] ← ConvertBF16toSP(XB[32:47])\nXT[96:127] ← ConvertBF16toSP(XB[48:63])", "special_registers": "MSR", "programming_notes": "This instruction is used to convert bfloat16 values in a vector to single-precision floating-point format. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting the MSR.VSX bit. The operation processes four elements per iteration, converting the high 16 bits of each source element to the corresponding target element while zeroing out the lower 16 bits. This instruction does not raise exceptions for invalid operations.", "extended_mnemonics": [], "page_found": "Page 835 - 836", "example": "xvcvbf16spn vs1, vs3"}
{"mnemonic": "xsrdpic", "architecture": "PowerISA", "full_name": "VSX Scalar Round to Double-Precision Integer Exact using Current rounding mode", "summary": "Rounds a double-precision floating-point value to an integer using the current rounding mode.", "description": "The instruction rounds the double-precision floating-point value in doubleword element 0 of VSR[XB] to an integer using the rounding mode specified by RN. The result is placed into doubleword element 0 of VSR[XT] in double-precision format, and doubleword element 1 of VSR[XT] is set to 0.", "syntax": "xsrdpic XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00001AC", "length": "32", "binary_pattern": "18 | T | B | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nsrc ←bfp_CONVERT_FROM_BFP64(VSR[VRB+32].dword[0])\nif FPSCR.RN=0b00 then rnd ←bfp_ROUND_TO_INTEGER(0b000, src)\nif FPSCR.RN=0b01 then rnd ←bfp_ROUND_TO_INTEGER(0b001, src)\nif FPSCR.RN=0b10 then rnd ←bfp_ROUND_TO_INTEGER(0b010, src)\nif FPSCR.RN=0b11 then rnd ←bfp_ROUND_TO_INTEGER(0b011, src)\nresult ←bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif xx_flag=1 then SetFX(FPSCR.XX)\nvex_flag ←FPSCR.VE & vxsnan_flag\nif vex_flag=0 then do\n    VSR[32×TX+T].dword[0] ←result\n    VSR[32×TX+T].dword[1] ←0x0000_0000_0000_0000\n    FPSCR.FPRF ←fprf_CLASS_BFP64(result)\n    FPSCR.FR  ←inc_flag\n    FPSCR.FI  ←xx_flag\nelse do\n    FPSCR.FR  ←0b0\n    FPSCR.FI  ←0b0\nend", "special_registers": "FPSCR, VXSNAN", "programming_notes": "This instruction can be used to operate on a single-precision source operand. Previous versions of the architecture allowed the end contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 837 - 838", "example": "xsrdpic vs1, vs3"}
{"mnemonic": "xsrdpim", "architecture": "PowerISA", "full_name": "VSX Scalar Round to Double-Precision Integer using round toward -Infinity", "summary": "Rounds a double-precision floating-point value in VSR[XB] towards negative infinity and places the result into VSR[XT].", "description": "The instruction rounds the double-precision floating-point value in VSR[XB] towards negative infinity. The result is placed into doubleword element 0 of VSR[XT], and doubleword element 1 of VSR[XT] is set to 0. FPRF is set to the class and sign of the result, while FR and FI are set to 0.", "syntax": "xsrdpim XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00001E4", "length": "32", "binary_pattern": "T | B | 121 | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_BFP64(VSR[VRB+32].dword[0])\nrnd ← bfp_ROUND_TO_INTEGER(0b011, src)\nresult ← bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nvex_flag ← FPSCR.VE & vxsnan_flag\nif vex_flag=0 then\ndo\n    VSR[32×TX+T].dword[0] ← result\n    VSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\n    FPSCR.FPRF ← fprf_CLASS_BFP64(result)\nend\nFPSCR.FR ← 0b0\nFPSCR.FI ← 0b0", "special_registers": "FPSCR (FPRF, FX, VXSNAN, FR, FI)", "programming_notes": "This instruction can be used to operate on a single-precision source operand. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 838 - 839", "example": "xsrdpim vs1, vs3"}
{"mnemonic": "xsrdpip", "architecture": "PowerISA", "full_name": "VSX Scalar Round to Double-Precision Integer using round toward +Infinity", "summary": "Rounds a double-precision floating-point value towards positive infinity and stores the result in a vector scalar register.", "description": "The instruction rounds the contents of doubleword element 0 of VSR[XB] towards positive infinity. The result is placed into doubleword element 0 of VSR[XT], with doubleword element 1 set to zero. FPRF is updated based on the class and sign of the result, while FR and FI are reset to zero.", "syntax": "xsrdpip XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Scalar Register"}, {"name": "XB", "desc": "Source Vector Scalar Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00001A4", "length": "32", "binary_pattern": "T | B | 105 | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_BFP64(VSR[VRB+32].dword[0])\nrnd ← bfp_ROUND_TO_INTEGER(0b010, src)\nresult ← bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nvex_flag ← FPSCR.VE & vxsnan_flag\nif vex_flag=0 then\ndo\n    VSR[32×TX+T].dword[0] ← result\n    VSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\n    FPSCR.FPRF ← fprf_CLASS_BFP64(result)\nend\nFPSCR.FR ← 0b0\nFPSCR.FI ← 0b0", "special_registers": "FPSCR, FPRF, VXSNAN, FR, FI", "programming_notes": "This instruction can be used to operate on a single-precision source operand. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 839 - 840", "example": "xsrdpip vs1, vs3"}
{"mnemonic": "xsrdpiz", "architecture": "PowerISA", "full_name": "VSX Scalar Round to Double-Precision Integer", "summary": "Rounds a double-precision floating-point value toward zero and places the result into a vector-scalar register.", "description": "The instruction rounds the contents of doubleword element 0 of VSR[XB] toward zero and stores the result in doubleword element 0 of VSR[XT]. Doubleword element 1 of VSR[XT] is set to 0. The FPRF, FR, and FI fields are updated accordingly.", "syntax": "xsrdpiz XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000164", "length": "32", "binary_pattern": "18 | T | B | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_BFP64(VSR[XB+32].dword[0])\nrnd ← bfp_ROUND_TO_INTEGER(0b001, src)\nresult ← bfp64_CONVERT_FROM_BFP(rnd)\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nvex_flag ← FPSCR.VE & vxsnan_flag\nif vex_flag=0 then do\n    VSR[32×TX+T].dword[0] ← result\n    VSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\n    FPSCR.FPRF ← fprf_CLASS_BFP64(result)\nend\nFPSCR.FR ← 0b0\nFPSCR.FI ← 0b0", "special_registers": "FPSCR (FPRF, FX, VXSNAN, FR, FI)", "programming_notes": "This instruction can be used to operate on a single-precision source operand. Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 840 - 841", "example": "xsrdpiz vs1, vs3"}
{"mnemonic": "xvrdpi", "architecture": "PowerISA", "full_name": "VSX Vector Round to Double-Precision Integer using round to Nearest Away", "summary": "Rounds each element of a double-precision floating-point vector to the nearest integer away from zero.", "description": "For xvrdpi, each element in the source vector VSR[XB] is rounded to an integer using the rounding mode Round to Nearest Away. The result is placed into the target vector VSR[XT]. If a Signalling NaN is encountered, it is converted to a Quiet NaN and VXSNAN is set to 1.", "syntax": "xvrdpi XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000324", "length": "32", "binary_pattern": "T | B | 201 | BX | TX", "bit_positions": "6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\ndo i = 0 to 1\n    reset_xflags()\n    src ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    rnd ←bfp_ROUND_TO_INTEGER(0b100, src)\n    vresult.dword[i] ←bfp64_CONVERT_FROM_BFP(rnd)\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag)\nend\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR, VXSNAN", "programming_notes": "This instruction is commonly used for converting floating-point numbers to integers with rounding towards the nearest integer away from zero. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register; otherwise, an exception will be raised. Be cautious of Signalling NaNs, as they are converted to Quiet NaNs and VXSNAN is set, which might affect subsequent operations if not handled properly.", "extended_mnemonics": [], "page_found": "Page 843 - 844", "example": "xvrdpi vs1, vs3"}
{"mnemonic": "xvrdpic", "architecture": "PowerISA", "full_name": "VSX Vector Round to Double-Precision Integer", "summary": "Rounds each double-precision floating-point element of a vector to an integer using the current rounding mode.", "description": "For xvrdpic, each double-precision floating-point element in VSR[XB] is rounded to an integer using the rounding mode specified by FPSCR.RN. The result is placed into VSR[XT]. If any element results in a Signalling NaN, it is converted to a Quiet NaN and VXSNAN is set.", "syntax": "xvrdpic XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00003AC", "length": "32", "binary_pattern": "18 | T | B | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\ndo i = 0 to 1\n    reset_xflags()\n    src ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    if FPSCR.RN=0b00 then rnd ←bfp_ROUND_TO_INTEGER(0b000, src)\n    if FPSCR.RN=0b01 then rnd ←bfp_ROUND_TO_INTEGER(0b001, src)\n    if FPSCR.RN=0b10 then rnd ←bfp_ROUND_TO_INTEGER(0b010, src)\n    if FPSCR.RN=0b11 then rnd ←bfp_ROUND_TO_INTEGER(0b011, src)\n\n    vresult.dword[i] ←bfp64_CONVERT_FROM_BFP(rnd)\n\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if xx_flag=1 then SetFX(FPSCR.XX)\n\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag)\n    ex_flag ←ex_flag | (FPSCR.XE & xx_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR, VXSNAN, XX", "programming_notes": "This instruction rounds each double-precision floating-point element in the source vector to an integer using the rounding mode specified by FPSCR.RN. Ensure that VSX is enabled; otherwise, a VSX_Unavailable exception will occur. Be cautious of NaN values, as they are converted to Quiet NaNs and VXSNAN is set. The instruction respects the rounding modes defined in FPSCR.RN, so ensure this register is correctly configured for your needs.", "extended_mnemonics": [], "page_found": "Page 844 - 845", "example": "xvrdpic vs1, vs3"}
{"mnemonic": "xvrdpim", "architecture": "PowerISA", "full_name": "VSX Vector Round to Double-Precision Integer using round toward -Infinity", "summary": "Rounds the contents of a vector register towards negative infinity and stores the result in another vector register.", "description": "Rounds each double-precision floating-point element in the source VSR towards negative infinity (-∞) and stores the result in the target VSR. The rounding mode is floor, affecting the FPSCR rounding control. This operation is performed on the two double-precision elements in each 128-bit VSR.", "syntax": "xvrdpim XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00003E4", "length": "32", "binary_pattern": "T | B | 249 | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "XT[0:63] ← RoundTowardMinusInfinity(XB[0:63])\nXT[64:127] ← RoundTowardMinusInfinity(XB[64:127])", "special_registers": "FPSCR.FX, FPSCR.VXSNAN", "programming_notes": "The xvrdpim instruction is commonly used for rounding double-precision floating-point numbers towards negative infinity in vector operations. Ensure that the VSX (Vector Scalar Extensions) are enabled, as attempting to use this instruction when they are not will result in an unavailable exception. Be cautious with signaling NaNs, as they are converted to quiet NaNs and VXSNAN is set in the FPSCR register.", "extended_mnemonics": [], "page_found": "Page 845 - 846", "example": "xvrdpim vs1, vs3"}
{"mnemonic": "xvrdpiz", "architecture": "PowerISA", "full_name": "Vector Round to Double-Precision Integer using round toward Zero", "summary": "Rounds each double-precision floating-point element in a vector towards zero and stores the result as an integer.", "description": "The instruction rounds each double-precision floating-point element in VSR[XB] towards zero and stores the result in VSR[XT]. If any element is a Signalling NaN, it is converted to a Quiet NaN and VXSNAN is set. If a trap-enabled exception occurs, no results are written to VSR[XT].", "syntax": "xvrdpiz XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000364", "length": "32", "binary_pattern": "18 | T | B | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\ndo i = 0 to 1\n    reset_xflags()\n    src ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    rnd ←bfp_ROUND_TO_INTEGER(0b001, src)\n    vresult.dword[i] ←bfp64_CONVERT_FROM_BFP(rnd)\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR, VXSNAN", "programming_notes": "This instruction is commonly used for converting double-precision floating-point numbers to integers by rounding towards zero. Be cautious with Signalling NaNs, as they are converted to Quiet NaNs and VXSNAN is set. Ensure that the VSX facility is enabled; otherwise, a VSX_Unavailable exception will occur. The instruction does not write results if any trap-enabled exceptions happen.", "extended_mnemonics": [], "page_found": "Page 846 - 847", "example": "xvrdpiz vs1, vs3"}
{"mnemonic": "xvrspi", "architecture": "PowerISA", "full_name": "VSX Vector Round to Single-Precision Integer", "summary": "Rounds each element of a vector from single-precision floating-point format to an integer using round to Nearest Away.", "description": "For xvrspi, each element of the source vector VSR[XB] is rounded to an integer using the rounding mode Round to Nearest Away. The result is placed into the corresponding element of the target vector VSR[XT]. If a Signalling NaN is encountered, it is converted to a Quiet NaN and VXSNAN is set to 1.", "syntax": "xvrspi XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000224", "length": "32", "binary_pattern": "T | B | BX | TX", "bit_positions": "6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\n\ndo i = 0 to 3\n    reset_xflags()\n    src ←bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n    rnd ←bfp_ROUND_TO_INTEGER(0b100, src)\n    vresult.word[i] ←bfp32_CONVERT_FROM_BFP(rnd)\n\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR, VXSNAN", "programming_notes": "The xvrspi instruction rounds each element of the source vector to an integer using the Round to Nearest Away mode. It handles Signalling NaNs by converting them to Quiet NaNs and setting VXSNAN in the FPSCR register. Ensure that VSX is enabled (MSR.VSX=1) before using this instruction, as attempting to use it when VSX is unavailable will result in an exception.", "extended_mnemonics": [], "page_found": "Page 847 - 848", "example": "xvrspi vs1, vs3"}
{"mnemonic": "xvrspic", "architecture": "PowerISA", "full_name": "VSX Vector Round to Single-Precision Integer", "summary": "Rounds each single-precision floating-point element of a vector to an integer using the current rounding mode.", "description": "For xvrspic, each single-precision floating-point operand in word elements i (0 to 3) of VSR[XB] is rounded to an integer value using the rounding mode specified by RN. The result is placed into word element i of VSR[XT]. If a trap-enabled exception occurs, no results are written to VSR[XT].", "syntax": "xvrspic XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00002AC", "length": "32", "binary_pattern": "18 | T | B | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\ndo i = 0 to 3\n    reset_xflags()\n    src ←bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n    if FPSCR.RN=0b00 then rnd ←bfp_ROUND_TO_INTEGER(0b000, src)\n    if FPSCR.RN=0b01 then rnd ←bfp_ROUND_TO_INTEGER(0b001, src)\n    if FPSCR.RN=0b10 then rnd ←bfp_ROUND_TO_INTEGER(0b010, src)\n    if FPSCR.RN=0b11 then rnd ←bfp_ROUND_TO_INTEGER(0b011, src)\n\n    vresult.word[i] ←bfp32_CONVERT_FROM_BFP(rnd)\n\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if xx_flag=1     then SetFX(FPSCR.XX)\n\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag)\n                   | (FPSCR.XE & xx_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR, VXSNAN, XX", "programming_notes": "This instruction rounds each single-precision floating-point element in the source vector to an integer using the rounding mode specified by FPSCR.RN. Ensure that VSX is enabled (MSR.VSX=1) before use. Be cautious of exceptions; if any occur, no results are written to the destination vector. Check the VXSNAN and XX flags for specific exception conditions.", "extended_mnemonics": [], "page_found": "Page 848 - 849", "example": "xvrspic vs1, vs3"}
{"mnemonic": "xvrspim", "architecture": "PowerISA", "full_name": "VSX Vector Round to Single-Precision Integer using round toward -Infinity", "summary": "Rounds each element of a vector from single-precision floating-point format to integer format, rounding towards negative infinity.", "description": "Rounds each single-precision floating-point element in the source VSR towards negative infinity (-∞) and stores the result in the target VSR using floor rounding semantics. This operates on four single-precision elements per 128-bit VSR in VSX mode.", "syntax": "xvrspim XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00002E4", "length": "32", "binary_pattern": "0 | 6 | 11 | 16 | 21 | 30 | 31", "bit_positions": "0 | 6 | 11 | 16 | 21 | 30 | 31"}, "extension": "VSX", "pseudocode": "XT[0:31] ← RoundTowardMinusInfinity(XB[0:31])\nXT[32:63] ← RoundTowardMinusInfinity(XB[32:63])\nXT[64:95] ← RoundTowardMinusInfinity(XB[64:95])\nXT[96:127] ← RoundTowardMinusInfinity(XB[96:127])", "special_registers": "FPSCR.FX, FPSCR.VXSNAN", "programming_notes": "The xvrspim instruction is commonly used for converting single-precision floating-point numbers to integers with rounding towards negative infinity. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register; otherwise, a VSX_Unavailable exception will be raised. Be cautious of NaN values, as they can set the VXSNAN flag in the FPSCR register and trigger an exception if VE is also set.", "extended_mnemonics": [], "page_found": "Page 849 - 850", "example": "xvrspim vs1, vs3"}
{"mnemonic": "xvrspiz", "architecture": "PowerISA", "full_name": "VSX Vector Round to Single-Precision Integer using round toward Zero", "summary": "Rounds each single-precision floating-point element of a vector towards zero and stores the result in another vector.", "description": "For xvrspiz, each single-precision floating-point operand in word elements of VSR[XB] is rounded to an integer using the rounding mode Round toward Zero. The results are placed into corresponding word elements of VSR[XT]. If a Signalling NaN is encountered, it is converted to a Quiet NaN and VXSNAN is set.", "syntax": "xvrspiz XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000264", "length": "32", "binary_pattern": "111100 | XT | // | XB | 01001 | 1001", "bit_positions": ""}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\n\ndo i = 0 to 3\n    reset_xflags()\n\n    src ←bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n    rnd ←bfp_ROUND_TO_INTEGER(0b001, src)\n\n    vresult.word[i] ←bfp32_CONVERT_FROM_BFP(rnd)\n\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR, VXSNAN", "programming_notes": "This instruction is commonly used for converting single-precision floating-point numbers to integers by truncating towards zero. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register; otherwise, an exception will be raised. Be cautious with Signalling NaNs, as they are converted to Quiet NaNs and VXSNAN is set in the FPSCR register. The instruction processes four elements at a time, so ensure proper alignment of input vectors.", "extended_mnemonics": [], "page_found": "Page 850 - 851", "example": "xvrspiz vs1, vs3"}
{"mnemonic": "xscvdpsxws", "architecture": "PowerISA", "full_name": "VSX Scalar Convert Double-Precision to Signed Word format with round to zero", "summary": "Converts a double-precision floating-point value to a signed word format using round towards zero.", "description": "Converts a double-precision floating-point value from the source VSR to a signed 32-bit word integer using round-toward-zero mode and stores the result in the target VSR. Only the scalar (leftmost) element is processed. Invalid conversions produce a saturated value; the FPSCR is updated with status flags.", "syntax": "xscvdpsxws XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xF0000160", "length": "32", "binary_pattern": "60 | XT | / | XB | 352", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "XT[0:31] ← ConvertToSignedWord_RoundTowardZero(XB[0:63])\nXT[32:127] ← 0", "special_registers": "FPSCR, VXSNAN, VXCVI, XX", "programming_notes": "Previous versions of the architecture allowed the contents of word 0 of the result register to be undefined. However, all processors that support this instruction write the result into words 0 and 1 of the result register, as is required by this version of the architecture. This instruction can be used to operate on a single-precision source operand. xscvdpsxws rounds using Round towards Zero rounding mode. For other rounding modes, software must use a Round to Double-Precision Integer instruction that corresponds to the desired rounding mode, including xsrdpic which uses the rounding mode specified by RN.", "extended_mnemonics": [], "page_found": "Page 853 - 854", "example": "xscvdpsxws vs1, vs3"}
{"mnemonic": "xscvdpuxws", "architecture": "PowerISA", "full_name": "VSX Scalar Convert Double-Precision to Unsigned Word format with round to zero", "summary": "Converts a double-precision floating-point value to an unsigned 32-bit integer, rounding towards zero.", "description": "The instruction converts the double-precision floating-point value in VSR[XB] to an unsigned 32-bit integer and places the result into word elements 0 and 1 of VSR[XT]. The contents of word elements 2 and 3 of VSR[XT] are set to 0. If the source is a NaN, the result is 0x0000_0000 and VXCVI is set to 1. If the source is an SNaN, VXSNAN is also set to 1.", "syntax": "xscvdpuxws XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Scalar Register"}, {"name": "XB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000120", "length": "32", "binary_pattern": "60 | XT | / | XB | 288", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if src ≤ Nmin-1 then\n    T(Nmin)\n    fr(0)\n    fi(0)\n    fx(VXCVI)\n    if error() then invoke system error handler\nelse if Nmin-1 < src < Nmin then\n    T(Nmin)\n    fr(0)\n    fi(1)\n    fx(XX)\n    if error() then invoke system error handler\nelse if src = Nmin then\n    T(Nmin)\n    fr(0)\n    fi(0)\nelse if Nmin < src < Nmax then\n    T(f2i(trunc(src)))\n    fr(0)\n    fi(1)\n    fx(XX)\n    if error() then invoke system error handler\nelse if src = Nmax then\n    T(Nmax)\n    fr(0)\n    fi(0)\nelse if Nmax < src < Nmax+1 then\n    T(Nmax)\n    fr(0)\n    fi(1)\n    fx(XX)\n    if error() then invoke system error handler\nelse if src ≥ Nmax+1 then\n    T(Nmin)\n    fr(0)\n    fi(0)\n    fx(VXCVI)\n    if error() then invoke system error handler\nelse if src is a QNaN then\n    T(Nmin)\n    fr(0)\n    fi(0)\n    fx(VXCVI)\n    if error() then invoke system error handler\nelse if src is a SNaN then\n    T(Nmin)\n    fr(0)\n    fi(0)\n    fx(VXCVI)\n    fx(VXSNAN)\n    if error() then invoke system error handler", "special_registers": "FPSCR, VXSNAN, VXCVI, XX", "programming_notes": "Previous versions of the architecture allowed the contents of word 0 of the result register to be undefined. However, all processors that support this instruction write the result into words 0 and 1 of the result register, as is required by this version of the architecture. This instruction can be used to operate on a single-precision source operand. xscvdpuxws rounds using Round towards Zero rounding mode. For other rounding modes, software must use a Round to Double-Precision Integer instruction that corresponds to the desired rounding mode, including xsrdpic which uses the rounding mode specified by RN.", "extended_mnemonics": [], "page_found": "Page 857 - 858", "example": "xscvdpuxws vs1, vs3"}
{"mnemonic": "xscvqpsdz", "architecture": "PowerISA", "full_name": "VSX Scalar Convert with round to zero Quad-Precision to Signed Doubleword format X-form", "summary": "Converts a quad-precision floating-point value to a signed doubleword integer, rounding towards zero.", "description": "Converts a quad-precision floating-point value from the source VSR to a signed 64-bit doubleword integer using round-toward-zero mode and stores the result in the target VSR. Only the scalar element is processed. Invalid conversions saturate to the appropriate signed limit; FPSCR status is updated.", "syntax": "xscvqpsdz VRT,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC190688", "length": "32", "binary_pattern": "0 | VRT | VRB | 11000000000000000000000000000000", "bit_positions": "0:5 | 6:10 | 11:20 | 21:31"}, "extension": "VSX", "pseudocode": "VRT[0:63] ← ConvertToSignedDoubleword_RoundTowardZero(VRB[0:127])\nVRT[64:127] ← 0", "special_registers": "FPSCR.FPRF, FPSCR.FR, FPSCR.FI, FPSCR.VXSNAN, FPSCR.VXCVI, FPSCR.XX", "programming_notes": "The xscvqpsdz instruction is used to convert a quad-precision floating-point value to a signed doubleword integer, rounding towards zero. Ensure that the VSX facility is enabled (MSR.VSX=1) before using this instruction; otherwise, it will raise an exception. Be cautious of NaN and infinity values, as they result in specific outputs and set flags indicating exceptions. The instruction handles overflow by saturating to the maximum or minimum signed doubleword value.", "extended_mnemonics": [], "page_found": "Page 859 - 860", "example": "xscvqpsdz v1, v3"}
{"mnemonic": "xscvqpsqz", "architecture": "PowerISA", "full_name": "VSX Scalar Convert with round to zero Quad-Precision to Signed Quadword", "summary": "Converts a quad-precision floating-point value to a signed quadword integer, rounding towards zero.", "description": "Converts a quad-precision floating-point value from the source VSR to a signed 128-bit quadword integer using round-toward-zero mode and stores the result in the target VSR. Only the scalar element is processed. Out-of-range conversions saturate; FPSCR status flags are set appropriately.", "syntax": "xscvqpsqz VRT,VRB", "operands": [{"name": "VRT", "desc": "Target Vector-Scalar Register"}, {"name": "VRB", "desc": "Source Vector-Scalar Register"}, {"name": "VT", "desc": "Target Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC080688", "length": "32", "binary_pattern": "63 | FRT | 8 | FRB | 836 | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "VRT[0:127] ← ConvertToSignedQuadword_RoundTowardZero(VRB[0:127])", "special_registers": "FPSCR (FPRF, FR, FI, VXSNAN, VXCVI)", "programming_notes": "The xscvqpsqz instruction converts a quad-precision floating-point value to a signed quadword integer, rounding towards zero. It handles NaNs and infinities by setting VXSNAN or VXCVI flags and raising an exception. Ensure the source register contains a valid quad-precision float; otherwise, handle exceptions appropriately.", "extended_mnemonics": [], "page_found": "Page 861 - 862", "example": "xscvqpsqz v1, v3"}
{"mnemonic": "xscvqpswz", "architecture": "PowerISA", "full_name": "VSX Scalar Convert with round to zero Quad-Precision to Signed Word format", "summary": "Converts a quad-precision floating-point value to a signed word format.", "description": "Converts a quad-precision floating-point value from the source VSR to a signed 32-bit word integer using round-toward-zero mode and stores the result in the target VSR. Only the scalar element is processed. Out-of-range values saturate to the limits of signed 32-bit representation; FPSCR is updated.", "syntax": "xscvqpswz VRT,VRB", "operands": [{"name": "VRT", "desc": "Target Vector-Scalar Register"}, {"name": "VRB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC090688", "length": "32", "binary_pattern": "0 | VRT | VRB | 11 | 9 | 6 | 0", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "extension": "VSX", "pseudocode": "VRT[0:31] ← ConvertToSignedWord_RoundTowardZero(VRB[0:127])\nVRT[32:127] ← 0", "special_registers": "FPSCR, VXSNAN, VXCVI, XX", "programming_notes": "The xscvqpswz instruction converts a quad-precision floating-point value to a signed word, rounding towards zero. It handles NaNs by setting the result to 0xFFFF_FFFF_8000_0000 and flags VXSNAN and VXCVI accordingly. For infinities, it sets the result to the maximum or minimum signed word value based on the sign of the infinity. Ensure that VSX is enabled (MSR.VSX=1) before using this instruction; otherwise, a VSX_Unavailable exception will be raised.", "extended_mnemonics": [], "page_found": "Page 863 - 864", "example": "xscvqpswz v1, v3"}
{"mnemonic": "xscvqpuqz", "architecture": "PowerISA", "full_name": "VSX Scalar Convert with round to zero Quad-Precision to Unsigned Quadword", "summary": "Converts a quad-precision floating-point value to an unsigned quadword integer, rounding towards zero.", "description": "The instruction converts the quad-precision floating-point value in VSR[VRB+32] to an unsigned quadword integer and places the result into VSR[VRT+32]. The conversion rounds towards zero. If the source is a NaN or Infinity, an Invalid Operation exception occurs.", "syntax": "xscvqpuqz VRT,VRB", "operands": [{"name": "VRT", "desc": "Target Vector-Scalar Register"}, {"name": "VRB", "desc": "Source Vector-Scalar Register"}, {"name": "VT", "desc": "Target Vector-Scalar Register"}, {"name": "VS32", "desc": "Target Vector Register"}, {"name": "VS31", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000688", "length": "32", "binary_pattern": "63 | FRT | 0 | FRB | 836 | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then\n    VSypX_Unavailable()\nelse if src.class.QNaN=1 | src.class.SNaN=1 then do\n    vxsnan_flag ←src.class.SNaN\n    vxcvi_flag ←1\n    result ←0x0000_0000_0000_0000_0000_0000_0000_0000\nend\nelse if src.class.Infinity=1 then do\n    vxcvi_flag ←1\n    if src.sign=0 then\n        result ←0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF\n    else\n        result ←0x0000_0000_0000_0000_0000_0000_0000_0000\nend\nelse if src.class.Zero=1 then\n    result ←0x0000_0000_0000_0000_0000_0000_0000_0000\nelse do\n    rnd ←bfp_ROUND_TO_INTEGER(0b001,src)\n    if bfp_COMPARE_GT(rnd, +2128-1) then do\n        result ←0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF\n        vxcvi_flag ←1\n    end\n    else if bfp_COMPARE_LT(rnd, 0) then do\n        result ←0x0000_0000_0000_0000_0000_0000_0000_0000\n        vxcvi_flag ←1\n    end\n    else do\n        result ←si128_CONVERT_FROM_BFP(rnd)\n        if xx_flag=1 then SetFX(FPSCR.XX)\n    end\nend\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxcvi_flag=1  then SetFX(FPSCR.VXCVI)\nvx_flag ←vxsnan_flag | vxcvi_flag\nex_flag ←FPSCR.VE & vx_flag\nif ex_flag=0 then do\n    VSR[VRT+32] ←result\n    FPSCR.FPRF ←0bUUUUU\nend\nFPSCR.FR ←(vx_flag=0) & inc_flag\nFPSCR.FI ←(vx_flag=0) & xx_flag", "special_registers": "FPSCR.FR, FPSCR.FI, FPSCR.FPRF, FPSCR.FX", "programming_notes": "This instruction is used to convert a quad-precision floating-point number to an unsigned quadword integer, rounding towards zero. Be cautious with NaNs and infinities, as they will trigger exceptions. Ensure VSX is enabled in the MSR register before using this instruction.", "extended_mnemonics": [], "page_found": "Page 867 - 868", "example": "xscvqpuqz v1, v3"}
{"mnemonic": "xscvqpuwz", "architecture": "PowerISA", "full_name": "VSX Scalar Convert with round to zero Quad-Precision to Unsigned Word format", "summary": "Converts a quad-precision floating-point value to an unsigned word format.", "description": "Converts a quad-precision floating-point value from the source VSR to an unsigned 32-bit word integer using round-toward-zero mode and stores the result in the target VSR. Only the scalar element is processed. Out-of-range or negative values saturate; FPSCR status is updated with conversion exception flags.", "syntax": "xscvqpuwz VRT,VRB", "operands": [{"name": "VRT", "desc": "Target Vector-Scalar Register"}, {"name": "VRB", "desc": "Source Vector-Scalar Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC010688", "length": "32", "binary_pattern": "63 | FRT | 1 | FRB | 836 | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "VRT[0:31] ← ConvertToUnsignedWord_RoundTowardZero(VRB[0:127])\nVRT[32:127] ← 0", "special_registers": "FPSCR.FR, FPSCR.FI, FPSCR.FPRF, FPSCR.FX", "programming_notes": "This instruction is used to convert a quad-precision floating-point number to an unsigned 32-bit integer, rounding towards zero. Be cautious with NaN and out-of-range values, as they can trigger exceptions and set specific flags in the FPSCR register. Ensure that the source vector register (VRB+32) contains a valid quad-precision value to avoid unexpected behavior.", "extended_mnemonics": [], "page_found": "Page 869 - 870", "example": "xscvqpuwz v1, v3"}
{"mnemonic": "xvcvdpsxws", "architecture": "PowerISA", "full_name": "Vector Convert Double-Precision to Signed Word format with round to zero", "summary": "Converts double-precision floating-point values in a vector to signed 32-bit integers with rounding towards zero.", "description": "Converts each double-precision floating-point element in XB to a signed 32-bit integer in XT, rounding towards zero (truncation). This is a VSX instruction that operates on vector elements independently. No condition registers or status fields are affected by this instruction.", "syntax": "xvcvdpsxws XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xF0000360", "length": "32", "binary_pattern": "60 | XT | / | XB | 864", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "for i in 0 to 1 do\n  XT[i*64:(i+1)*64-1] ← CVTDP_TO_SI_RZ(XB[i*64:(i+1)*64-1])\nend for", "special_registers": "FPSCR (FX, XX, VXSNAN, VXCVI)", "programming_notes": "xvcvdpsxws rounds using Round towards Zero rounding mode. Previous versions of the architecture allowed the contents of words 1 and 3 of the result register to be undefined. However, all processors that support this instruction write the result into words 0 and 1 and words 2 and 3 of the result register.", "extended_mnemonics": [], "page_found": "Page 873 - 874", "example": "xvcvdpsxws vs1, vs3"}
{"mnemonic": "xvcvdpuxws", "architecture": "PowerISA", "full_name": "Vector Convert Double-Precision to Unsigned Word format with round to zero", "summary": "Converts double-precision floating-point values in a vector to unsigned 32-bit integers with rounding towards zero.", "description": "The instruction converts each element of the input vector from double-precision floating-point format to an unsigned 32-bit integer using round towards zero. If the rounded value is greater than 2^32 - 1, it results in 0xFFFF_FFFF and VXCVI is set to 1. If less than 0, it results in 0x0000_0000 and VXCVI is set to 1.", "syntax": "xvcvdpuxws XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000320", "length": "32", "binary_pattern": "60 | XT | / | XB | 800", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "for i = 0 to 1 do\n    src <- VSR[XB][i]\n    if src is a QNaN then\n        T(Nmin), fx(VXCVI)\n        if FPSCR.VXCVI=0 and MSR.FE0!=ignore-exception-mode or MSR.FE1!=ignore-exception-mode then\n            error()\n        end if\n    else if src is a SNaN then\n        T(Nmin), fx(VXCVI), fx(VXSNAN)\n        if FPSCR.VXSNAN=0 and MSR.FE0!=ignore-exception-mode or MSR.FE1!=ignore-exception-mode then\n            error()\n        end if\n    else if src ≤ Nmin-1 then\n        T(Nmin), fx(VXCVI)\n        if FPSCR.VXCVI=0 and MSR.FE0!=ignore-exception-mode or MSR.FE1!=ignore-exception-mode then\n            error()\n        end if\n    else if Nmin-1 < src < Nmin then\n        T(Nmin), fx(XX)\n        if FPSCR.XX=0 and MSR.FE0!=ignore-exception-mode or MSR.FE1!=ignore-exception-mode then\n            error()\n        end if\n    else if src = Nmin then\n        T(Nmin)\n    else if Nmin < src < Nmax then\n        T(f2i(trunc(src))), fx(XX)\n        if FPSCR.XX=0 and MSR.FE0!=ignore-exception-mode or MSR.FE1!=ignore-exception-mode then\n            error()\n        end if\n    else if src = Nmax then\n        T(Nmax)\n    else if Nmax < src < Nmax+1 then\n        T(Nmax), fx(XX)\n        if FPSCR.XX=0 and MSR.FE0!=ignore-exception-mode or MSR.FE1!=ignore-exception-mode then\n            error()\n        end if\n    else if src ≥ Nmax+1 then\n        T(Nmax), fx(VXCVI)\n        if FPSCR.VXCVI=0 and MSR.FE0!=ignore-exception-mode or MSR.FE1!=ignore-exception-mode then\n            error()\n        end if\n    end if\nend for", "special_registers": "FPSCR, VXSNAN, VXCVI, XX", "programming_notes": "xvcvdpuxws rounds using Round towards Zero rounding mode. Previous versions of the architecture allowed the contents of words 1 and 3 of the result register to be undefined. However, all processors that support this instruction write the result into words 0 and 1 and words 2 and 3 of the result register.", "extended_mnemonics": [], "page_found": "Page 877 - 878", "example": "xvcvdpuxws vs1, vs3"}
{"mnemonic": "xvcvspsxws", "architecture": "PowerISA", "full_name": "Vector Convert with round to zero Single-Precision to Signed Word format", "summary": "Converts a vector of single-precision floating-point numbers to signed integers using round towards zero.", "description": "Converts each single-precision floating-point element in XB to a signed 32-bit integer in XT, rounding towards zero. This is a VSX instruction operating element-wise on a vector of single-precision values. No condition registers or status fields are modified.", "syntax": "xvcvspsxws XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000260", "length": "32", "binary_pattern": "18 | T | B | 152 | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VSX", "pseudocode": "for i in 0 to 3 do\n  XT[i*32:(i+1)*32-1] ← CVTSP_TO_SI_RZ(XB[i*32:(i+1)*32-1])\nend for", "special_registers": "FPSCR", "programming_notes": "xvcvspsxws rounds using Round towards Zero rounding mode. For other rounding modes, software must use a Round to Single-Precision Integer instruction that corresponds to the desired rounding mode.", "extended_mnemonics": [], "page_found": "Page 881 - 882", "example": "xvcvspsxws vs1, vs3"}
{"mnemonic": "xvcvspuxds", "architecture": "PowerISA", "full_name": "Vector Convert with round to zero Single-Precision to Unsigned Doubleword format", "summary": "Converts a single-precision floating-point value to an unsigned doubleword integer, rounding according to the current rounding mode.", "description": "Converts single-precision floating-point elements in XB to unsigned 64-bit integer elements in XT, using the current rounding mode. This is a VSX instruction that processes elements independently. No condition registers or status fields are affected.", "syntax": "xvcvspuxds XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000620", "length": "32", "binary_pattern": "60 | XT | / | XB | 1568", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "for i in 0 to 1 do\n  XT[i*64:(i+1)*64-1] ← CVTSP_TO_UI64(XB[i*32:(i+1)*32-1])\nend for", "special_registers": "FPSCR, VXSNAN, VXCVI, XX", "programming_notes": "xvcvspuxds rounds using Round towards Zero rounding mode. For other rounding modes, software must use a Round to Single-Precision Integer instruction that corresponds to the desired rounding mode, including xvrspic which uses the rounding mode specified by RN.", "extended_mnemonics": [], "page_found": "Page 883 - 884", "example": "xvcvspuxds vs1, vs3"}
{"mnemonic": "xvcvspuxws", "architecture": "PowerISA", "full_name": "Vector Convert with round to zero Single-Precision to Unsigned Word format", "summary": "Converts a single-precision floating-point value to an unsigned word using round towards zero.", "description": "The instruction converts each element of the source vector (VSR[XB]) from single-precision floating-point format to an unsigned 32-bit integer, rounding towards zero. If the result is out of range, it saturates to either 0x0000_0000 or 0xFFFF_FFFF.", "syntax": "xvcvspuxws XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF0000220", "length": "32", "binary_pattern": "60 | XT | / | XB | 544", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "for i = 0 to 3 do\n    src <- VSR[XB][i]\n    if src ≤ Nmin-1 then\n        T(Nmin)\n    else if Nmin-1 < src < Nmin then\n        if FPSCR.VE = 0 then\n            T(Nmin)\n        else\n            fx(VXCVI), error()\n        end if\n    else if src = Nmin then\n        T(Nmin)\n    else if Nmin < src < Nmax then\n        if FPSCR.XE = 0 then\n            T(f2i(trunc(src)))\n        else\n            fx(XX), error()\n        end if\n    else if src = Nmax then\n        T(Nmax)\n    else if Nmax < src < Nmax+1 then\n        if FPSCR.XE = 0 then\n            T(Nmax)\n        else\n            fx(XX), error()\n        end if\n    else if src ≥ Nmax+1 then\n        if FPSCR.VE = 0 then\n            T(Nmin)\n        else\n            fx(VXCVI), error()\n        end if\n    else if src is a QNaN then\n        if FPSCR.VE = 0 then\n            T(Nmin)\n        else\n            fx(VXCVI), error()\n        end if\n    else if src is a SNaN then\n        if FPSCR.VE = 0 then\n            T(Nmin)\n        else\n            fx(VXCVI), fx(VXSNAN), error()\n        end if\n    end if\nend for", "special_registers": "FPSCR, VXSNAN, VXCVI, XX", "programming_notes": "xvcvspuxws rounds using Round towards Zero rounding mode. For other rounding modes, software must use a Round to Single-Precision Integer instruction that corresponds to the desired rounding mode.", "extended_mnemonics": [], "page_found": "Page 885 - 886", "example": "xvcvspuxws vs1, vs3"}
{"mnemonic": "xscvsqqp", "architecture": "PowerISA", "full_name": "VSX Scalar Convert with round Signed Quadword to Quad-Precision", "summary": "Converts a signed quadword integer to a quad-precision floating-point number and rounds it.", "description": "The instruction converts the 128-bit signed integer value in VSR[VRB+32] to an unbounded-precision floating-point value, rounds it to quad-precision using the rounding mode specified by RN, and places the result into VSR[VRT+32].", "syntax": "xscvsqqp VRT,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC0B0688", "length": "32", "binary_pattern": "0 | VRT | 11 | VRB | 836", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ←bfp_CONVERT_FROM_SI128(VSR[VRB+32])\nrnd ←bfp_ROUND_TO_BFP128(0, FPSCR.RN, src)\nresult ←bfp128_CONVERT_FROM_BFP(rnd)\nif xx_flag=1 then SetFX(XX)\nVSR[VRT+32] ←result\nFPSCR.FPRF ←fprf_CLASS_BFP128(result)\nFPSCR.FR ←inc_flag\nFPSCR.FI ←xx_flag", "special_registers": "FPSCR (FPRF, FR, FI, FX, XX)", "programming_notes": "This instruction is used to convert a 128-bit signed integer to a quad-precision floating-point number with rounding. Ensure the VSX feature is enabled in the MSR register. Be cautious of the rounding mode specified by FPSCR.RN, as it affects the precision and result of the conversion. The instruction updates several special registers like FPSCR.FPRF, FPSCR.FR, and FPSCR.FI to reflect the operation's outcome.", "extended_mnemonics": [], "page_found": "Page 888 - 889", "example": "xscvsqqp v1, v3"}
{"mnemonic": "xscvsxdsp", "architecture": "PowerISA", "full_name": "VSX Scalar Convert with round Signed Doubleword to Single-Precision format", "summary": "Converts a signed doubleword integer in a VSX register to a single-precision floating-point number and rounds it.", "description": "The instruction converts the contents of doubleword element 0 of VSR[XB] from a signed integer to a single-precision floating-point number, rounds it according to the rounding mode specified by FPSCR.RN, and places the result in doubleword element 0 of VSR[XT] in double-precision format. Doubleword element 1 of VSR[XT] is set to zero.", "syntax": "xscvsxdsp XT,XB", "operands": [{"name": "XT", "desc": "Target VSX Register"}, {"name": "XB", "desc": "Source VSX Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00004E0", "length": "32", "binary_pattern": "18 | T | B | 312 | BX TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ← bfp_CONVERT_FROM_SI64(VSR[32×BX+B].dword[0])\nrnd ← bfp_ROUND_TO_BFP32(FPSCR.RN,v)\nresult32 ← bfp32_CONVERT_FROM_BFP(rnd)\nresult64 ← bfp64_CONVERT_FROM_BFP(rnd)\nif xx_flag=1 then SetFX(FPSCR.XX)\nVSR[32×TX+T].dword[0] ← result64\nVSR[32×TX+T].dword[1] ← 0x0000_0000_0000_0000\nFPSCR.FPRF ← fprf_CLASS_BFP32(result32)\nFPSCR.FR ← inc_flag\nFPSCR.FI ← xx_flag", "special_registers": "FPSCR", "programming_notes": "Previous versions of the architecture allowed the contents of doubleword 1 of the result register to be undefined. However, all processors that support this instruction write 0s into doubleword 1 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 890 - 891", "example": "xscvsxdsp vs1, vs3"}
{"mnemonic": "xvcvsxddp", "architecture": "PowerISA", "full_name": "VSX Vector Convert with round Signed Doubleword to Double-Precision format", "summary": "Converts signed doublewords from a vector register to double-precision floating-point values and rounds them.", "description": "The instruction converts each signed doubleword in the source vector register (VSR[XB]) to a double-precision floating-point value, rounds it according to the rounding mode specified by FPSCR.RN, and stores the result in the target vector register (VSR[XT]).", "syntax": "xvcvsxddp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00007E0", "length": "32", "binary_pattern": "T | B | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\n\ndo i = 0 to 1\n    reset_xflags()\n\n    src ←bfp_CONVERT_FROM_SI64(VSR[32×BX+B].dword[i])\n    rnd ←bfp_ROUND_TO_BFP64(0b0,FPSCR.RN,v)\n\n    vresult.dword[i] ←bfp64_CONVERT_FROM_BFP(rnd)\n\n    if xx_flag=1 then SetFX(FPSCR.XX)\n\n    ex_flag ←ex_flag | (FPSCR.XE & xx_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR.FX, FPSCR.XX", "programming_notes": "This instruction is commonly used for converting signed doubleword integers to double-precision floating-point numbers in vector operations. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting the MSR.VSX bit. Be aware of rounding modes specified in FPSCR.RN, as they affect the precision of the conversion. Handle exceptions by checking FPSCR.XE and FPSCR.XX flags after execution.", "extended_mnemonics": [], "page_found": "Page 892 - 893", "example": "xvcvsxddp vs1, vs3"}
{"mnemonic": "xvcvsxwdp", "architecture": "PowerISA", "full_name": "VSX Vector Convert Signed Word to Double-Precision format XX2-form", "summary": "Converts signed word elements from a vector register to double-precision floating-point elements in another vector register.", "description": "The instruction converts each signed integer value in bits 0:31 of doubleword element i of VSR[XB] into double-precision format and places it into doubleword element i of VSR[XT].", "syntax": "xvcvsxwdp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00003E0", "length": "32", "binary_pattern": "18 | T | B | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\ndo i = 0 to 1\n    src ←bfp_CONVERT_FROM_SI32(VSR[32×BX+B].dword[i].word[0])\n    VSR[32×TX+T].dword[i] ←bfp64_CONVERT_FROM_BFP(src)\nend", "special_registers": "N/A", "programming_notes": "This instruction is used to convert signed 32-bit integers in a VSX register to double-precision floating-point format. Ensure that the VSX facility is enabled (MSR.VSX=1) before using this instruction; otherwise, it will raise an exception. The conversion is performed for each of the two doublewords in the source register and stored in the corresponding positions of the target register.", "extended_mnemonics": [], "page_found": "Page 893 - 894", "example": "xvcvsxwdp vs1, vs3"}
{"mnemonic": "xvcvsxdsp", "architecture": "PowerISA", "full_name": "VSX Vector Convert with round Signed Doubleword to Single-Precision format", "summary": "Converts signed doubleword elements of a vector register to single-precision floating-point and rounds the result.", "description": "The instruction converts each signed doubleword element in VSR[XB] to an unbounded-precision floating-point value, rounds it to single-precision using the rounding mode specified by FPSCR.RN, and places the result into bits 0:31 and 32:63 of the corresponding doubleword element in VSR[XT].", "syntax": "xvcvsxdsp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00006E0", "length": "32", "binary_pattern": "18 | T | B | BX | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\n\ndo i = 0 to 1\n    reset_xflags()\n\n    src ←bfp_CONVERT_FROM_SI64(VSR[32×BX+B].dword[i])\n    rnd ←bfp_ROUND_TO_BFP32(FPSCR.RN,v)\n\n    vresult.dword[i].word[0] ←bfp32_CONVERT_FROM_BFP(rnd)\n    vresult.dword[i].word[1] ←bfp32_CONVERT_FROM_BFP(rnd)\n\n    if xx_flag=1 then SetFX(FPSCR.XX)\n\n    ex_flag ←ex_flag | (FPSCR.XE & xx_flag)\nend\n\nif ex_flag=0 then VSR[32×TX+T] ←vresult", "special_registers": "FPSCR.FX, FPSCR.XX", "programming_notes": "Previous versions of the architecture allowed the contents of words 1 and 3 of the result register to be undefined. However, all processors that support these instructions write the result into words 0 and 1 and words 2 and 3 of the result register, as is required by this version of the architecture.", "extended_mnemonics": [], "page_found": "Page 894 - 895", "example": "xvcvsxdsp vs1, vs3"}
{"mnemonic": "xsiexpqp", "architecture": "PowerISA", "full_name": "VSX Scalar Insert Exponent Quad-Precision", "summary": "Inserts the exponent from a doubleword element of one vector register into another vector register.", "description": "The contents of bit 0 of VSR[VRA+32] are placed into bit 0 of VSR[VRT+32]. The contents of bits 49:63 of doubleword element 0 of VSR[VRB+32] are placed into bits 1:15 of VSR[VRT+32]. The contents of bits 16:127 of VSR[VRA+32] are placed into bits 16:127 of VSR[VRT+32].", "syntax": "xsiexpqp VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC0006C8", "length": "32", "binary_pattern": "18 | VRT | VRA | VRB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then\n    VSX_Unavailable()\nelse\n    VSR[VRT+32].bit[0]     ←VSR[VRA+32].bit[0]\n    VSR[VRT+32].bit[1:15] ← VSR[VRB+32].dword[0].bit[49:63]\n    VSR[VRT+32].bit[16:127] ←VSR[VRA+32].bit[16:127]", "special_registers": "MSR", "programming_notes": "This instruction is used to manipulate the exponent and sign of a quad-precision floating-point number. Ensure that VSX (Vector Scalar Extensions) is enabled in the MSR register before using this instruction; otherwise, it will raise an exception. The operation requires proper alignment of the input registers, specifically for doubleword access in VRB. This instruction operates at the user privilege level and does not generate exceptions under normal conditions.", "extended_mnemonics": [], "page_found": "Page 900 - 901", "example": "xsiexpqp v1, v2, v3"}
{"mnemonic": "xviexpdp", "architecture": "PowerISA", "full_name": "VSX Vector Insert Exponent Double-Precision", "summary": "Inserts the exponent from one vector register into another for double-precision floating-point numbers.", "description": "Inserts the exponent field from XB into the exponent of XA to form a new double-precision floating-point value in XT. This is a VSX instruction used for constructing floating-point values with specific exponents. No condition registers or status fields are affected.", "syntax": "xviexpdp XT,XA,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XA", "desc": "Source Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF00007C0", "length": "32", "binary_pattern": "T | A | B | 248 | AX BX TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "for i in 0 to 1 do\n  exp ← XB[i*64+52:i*64+62]\n  sig ← XA[i*64:i*64+51]\n  XT[i*64:(i+1)*64-1] ← CONSTRUCT_FP64(exp, sig)\nend for", "special_registers": "N/A", "programming_notes": "The xviexpdp instruction is used to insert the exponent from one vector register into another for double-precision floating-point numbers. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR.VSX bit before using this instruction, otherwise a VSX_Unavailable exception will be raised. The instruction operates on 64-bit elements and requires proper alignment of the source and target registers to avoid undefined behavior.", "extended_mnemonics": [], "page_found": "Page 906 - 907", "example": "xviexpdp vs1, vs2, vs3"}
{"mnemonic": "xvtstdcdp", "architecture": "PowerISA", "full_name": "VSX Vector Test Data Class Double-Precision", "summary": "Tests each double-precision floating-point element in a vector against specified data classes and sets the corresponding elements in another vector to either all ones or all zeros based on the match.", "description": "For xvtstdcdp, each double-precision floating-point value in VSR[XB] is tested against the data classes specified by DCMX. If a match is found, the corresponding element in VSR[XT] is set to 0xFFFF_FFFF_FFFF_FFFF; otherwise, it is set to 0x0000_0000_0000_0000.", "syntax": "xvtstdcdp XT,XB,DCMX", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}, {"name": "DCMX", "desc": "Data Class Mask (concatenation of dc, dm, and dx)"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00007A8", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nDCMX ← dc || dm || dx\nXT ← 32×TX + T\ndo i = 0 to 1\n    src ← VSR[32×BX+B].dword[i]\n    sign ← src.bit[0]\n    exponent ← src.bit[1:11]\n    fraction ← src.bit[12:63]\n\n    class.Infinity ← (exponent = 0x7FF) & (fraction = 0)\n    class.NaN ← (exponent = 0x7FF) & (fraction ≠ 0)\n    class.Zero ← (exponent = 0x000) & (fraction = 0)\n    class.Denormal ← (exponent = 0x000) & (fraction ≠ 0)\n\n    match ←\n        (DCMX.bit[0] & class.NaN) |\n        (DCMX.bit[1] & class.Infinity & !sign) |\n        (DCMX.bit[2] & class.Infinity & sign) |\n        (DCMX.bit[3] & class.Zero & !sign) |\n        (DCMX.bit[4] & class.Zero & sign) |\n        (DCMX.bit[5] & class.Denormal & !sign) |\n        (DCMX.bit[6] & class.Denormal & sign)\n\n    if match = 1 then\n        VSR[XT].dword[i] ← 0xFFFF_FFFF_FFFF_FFFF\n    else\n        VSR[XT].dword[i] ← 0x0000_0000_0000_0000\nend", "special_registers": null, "programming_notes": "This instruction is used to test each double-precision floating-point value in a vector register against specified data classes. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting the appropriate bit in the Machine State Register (MSR). The instruction requires proper alignment of the source and target vector registers. Be cautious with the data class mask (DCMX) as incorrect settings can lead to unexpected results. This operation is performed at the user privilege level, but it may trigger exceptions if VSX is not available or if there are issues with register access.", "extended_mnemonics": [], "page_found": "Page 907 - 908", "example": "xvtstdcdp vs1, vs3, 0"}
{"mnemonic": "xvtstdcsp", "architecture": "PowerISA", "full_name": "VSX Vector Test Data Class Single-Precision", "summary": "Tests each single-precision floating-point element in a vector against specified data classes and sets the corresponding elements in another vector based on the match.", "description": "This instruction tests each single-precision floating-point element in VSR[XB] against the data classes specified by DCMX. If an element matches one of the specified data classes, the corresponding element in VSR[XT] is set to 0xFFFF_FFFF; otherwise, it is set to 0x0000_0000.", "syntax": "xvtstdcsp XT,XB,DCMX", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}, {"name": "DCMX", "desc": "Data Class Mask (concatenation of dc, dm, and dx)"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00006A8", "length": "32", "binary_pattern": "110000 | T | dx | B | 13 | dc | 5 | dm | BX | TX", "bit_positions": "0:5 | 6:7 | 8:9 | 10:15 | 16 | 17:18 | 19:20 | 21 | 22:25 | 26:31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nDCMX ←dc || dm || dx\ndo i = 0 to 3\n    src           ←VSR[32×BX+B].word[i]\n    sign         ←src.bit[0]\n    exponent      ←src.bit[1:8]\n    fraction      ←src.bit[9:31]\n    class.Infinity ←(exponent = 0xFF) & (fraction  = 0)\n    class.NaN     ←(exponent = 0xFF) & (fraction != 0)\n    class.Zero    ←(exponent = 0x00) & (fraction  = 0)\n    class.Denormal ←(exponent = 0x00) & (fraction != 0)\n\n    match ←\n        (DCMX.bit[0] & class.NaN)              |\n        (DCMX.bit[1] & class.Infinity & !sign) |\n        (DCMX.bit[2] & class.Infinity &  sign) |\n        (DCMX.bit[3] & class.Zero     & !sign) |\n        (DCMX.bit[4] & class.Zero     &  sign) |\n        (DCMX.bit[5] & class.Denormal & !sign) |\n        (DCMX.bit[6] & class.Denormal &  sign)\n\n    if match = 1 then\n        VSR[32×TX+T].dword[i] ←0xFFFF_FFFF\n    else\n        VSR[32×TX+T].dword[i] ←0x0000_0000\nend", "special_registers": null, "programming_notes": "This instruction is useful for identifying specific data classes in single-precision floating-point vectors. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting the appropriate bits in the MSR register. The instruction does not require any special alignment, but it operates on 32-bit elements within the vector registers. Be cautious with the DCMX mask to avoid unintended matches, as incorrect settings can lead to all elements being set to zero or all being set to 0xFFFFFFFF.", "extended_mnemonics": [], "page_found": "Page 908 - 909", "example": "xvtstdcsp vs1, vs3, 0"}
{"mnemonic": "xvxexpdp", "architecture": "PowerISA", "full_name": "VSX Vector Extract Exponent Double-Precision", "summary": "Extracts the exponent from each double-precision floating-point value in a vector and places it into another vector.", "description": "For xvxexpdp, the exponent field of each double-precision floating-point value in VSR[XB] is extracted and placed into VSR[XT].", "syntax": "xvxexpdp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF000076C", "length": "32", "binary_pattern": "T | 0 | B | 475 | BX | TX", "bit_positions": "0 | 6 | 11 | 16 | 21 | 30 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\ndo i = 0 to 1\n    src ←VSR[32×BX+B].dword[i]\n    VSR[32×TX+T].dword[i] ←EXTZ64(src.bit[1:11])\nend", "special_registers": "N/A", "programming_notes": "This instruction extracts the exponent from each double-precision floating-point value in the source vector and stores it in the destination vector. Ensure that VSX is enabled; otherwise, a VSX_Unavailable exception will be raised. The operation processes two elements per vector register (64 bits each), extracting the 11-bit exponent field and zero-extending it to 64 bits.", "extended_mnemonics": [], "page_found": "Page 909 - 910", "example": "xvxexpdp vs1, vs3"}
{"mnemonic": "xvxsigdp", "architecture": "PowerISA", "full_name": "Vector Extract Significand Double-Precision", "summary": "Extracts the significand of double-precision floating-point values from a vector register and places them into another vector register.", "description": "For xvxsigdp, the significand of each double-precision floating-point value in the source vector register VSR[XB] is extracted and placed into the target vector register VSR[XT].", "syntax": "xvxsigdp XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF001076C", "length": "32", "binary_pattern": "T | 1 | B | 475 | BX | TX", "bit_positions": "0 | 6 | 11 | 16 | 21 | 30 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\ndo i = 0 to 1\n    src ←VSR[32×BX+B].dword[i]\n    exponent ←EXTZ(src.bit[1:11])\n    fraction ←EXTZ64(src.bit[12:63])\n    if (exponent != 0) & (exponent != 2047) then\n        fraction ←fraction | (0x001 || 520)\n    VSR[32×TX+T].dword[i] ←fraction\nend", "special_registers": "N/A", "programming_notes": "This instruction extracts the significand from each double-precision floating-point value in the source vector register and places it into the target vector register. Ensure that the VSX (Vector Scalar Extensions) is enabled, as attempting to use this instruction when VSX is unavailable will result in an exception. The operation does not modify the exponent or sign bit of the original values.", "extended_mnemonics": [], "page_found": "Page 910 - 911", "example": "xvxsigdp vs1, vs3"}
{"mnemonic": "xvi8ger4spp", "architecture": "PowerISA", "full_name": "VSX Vector 8-bit Signed/Unsigned Integer GER (rank-4 update) with Saturation Positive multiply, Positive accumulate", "summary": "Performs a vector-scalar operation on 8-bit signed and unsigned integers with saturation.", "description": "Performs a 4×4 generalized outer product (GER) on 8-bit signed/unsigned integers from XA and XB, accumulating the products into the 32-bit accumulator AT with saturation applied. Results with positive products and positive accumulation ('pp' suffix) are saturated to the signed 32-bit range. This is a VSX instruction requiring the MMA category support.", "syntax": "xvi8ger4spp AT,XA,XB", "operands": [{"name": "AT", "desc": "Target Vector Register"}, {"name": "XA", "desc": "Source Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xEC000318", "length": "32", "binary_pattern": "0 | AT | XA | XB | 16 | 21 | 29 | 30 | 31", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:28 | 29 | 30 | 31"}, "extension": "VSX", "pseudocode": "acc ← AT\nfor i in 0 to 3 do\n  for j in 0 to 3 do\n    a ← sign_extend(XA[i*8:(i+1)*8-1], 8)\n    b ← sign_extend(XB[j*8:(j+1)*8-1], 8)\n    prod ← a × b\n    acc[i*32+j*8:(i*32+j*8+31)] ← SATURATE_S32(acc[i*32+j*8:(i*32+j*8+31)] + prod)\n  end for\nend for\nAT ← acc", "special_registers": "VSCR, ACC", "programming_notes": "This instruction is used for performing vector-scalar operations on 8-bit signed and unsigned integers, multiplying corresponding elements of two vectors and accumulating the results into an accumulator with saturation handling. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid a 'VSX_Unavailable' exception. The operation involves multiple steps of multiplication and accumulation, which can be computationally intensive; consider optimizing vector sizes and operations for performance.", "extended_mnemonics": [], "page_found": "Page 922 - 923", "example": "xvi8ger4spp acc0, vs2, vs3"}
{"mnemonic": "pmxvbf16ger2np", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector bfloat16 GER (rank-2 update) Negative multiply, Positive accumulate", "summary": "Performs a masked vector operation with bfloat16 elements using negative multiplication and positive accumulation.", "description": "This instruction performs a masked vector operation with bfloat16 elements using negative multiplication and positive accumulation. It updates the accumulator register based on the specified masks and rounding mode.", "syntax": "pmxvbf16ger2np AT,XA,XB,XMSK,YMSK,PMSK", "operands": [{"name": "AT", "desc": "Target Accumulator Register"}, {"name": "XA", "desc": "Source Vector Register A"}, {"name": "XB", "desc": "Source Vector Register B"}, {"name": "XMSK", "desc": "Row Mask for ACC[AT]"}, {"name": "YMSK", "desc": "Column Mask for ACC[AT]"}, {"name": "PMSK", "desc": "Prefix Mask"}], "encoding": {"format": "MMIRR:XX3-form", "hex_opcode": "0x07900000EC000390", "length": "64", "binary_pattern": "1 | PMSK | XMSK | YMSK", "bit_positions": "0:11 | 12:17 | 18:23 | 24:63"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nif 'xvbf16ger2' | 'xvbf16ger2pp' | 'xvbf16ger2pn' | 'xvbf16ger2np' | 'xvbf16ger2nn' then\ndo\n   PMSK ←0b11      // enable all rank updates\n   XMSK ←0b1111    // enable all ACC[AT] rows\n   YMSK ←0b1111    // enable all ACC[AT] columns\nend\n\ndo i = 0 to 3\n   do j = 0 to 3\n      if XMSK.bit[i]=1 & YMSK.bit[j]=1 then do\n         src11 ←(PMSK.bit[0]=0) ? bfp_ZERO :\n                       bfp_CONVERT_FROM_BFLOAT16(VSR[32×AX+A].word[i].hword[0])\n         src21 ←(PMSK.bit[0]=0) ? bfp_ZERO :\n                       bfp_CONVERT_FROM_BFLOAT16(VSR[32×BX+B].word[j].hword[0])\n         src12 ←(PMSK.bit[1]=0) ? bfp_ZERO :\n                       bfp_CONVERT_FROM_BFLOAT16(VSR[32×AX+A].word[i].hword[1])\n         src22 ←(PMSK.bit[1]=0) ? bfp_ZERO :\n                       bfp_CONVERT_FROM_BFLOAT16(VSR[32×BX+B].word[j].hword[1])\n\n         reset_flags()\n\n         p1 ←bfp_MULTIPLY(src11, src21)\n         v1 ←bfp_MULTIPLY_ADD(src12, src22, p1)\n         r1 ←bfp_ROUND_TO_BFP32_SIGNIFICAND(v1)\n\n         if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n         if vximz_flag=1 then SetFX(FPSCR.VXIMZ)\n         if vxisi_flag=1 then SetFX(FPSCR.VXISI)\n         if xx_flag=1 then SetFX(FPSCR.XX)\n\n         if 'pmxvbf16ger2' then do\n            reset_flags()\n\n            r2 ←bfp_ROUND_TO_BFP32_DEFAULT(FPSCR.RN,r1)\n            ACC[AT][i].word[j] ←bfp32_CONVERT_FROM_BFP(r2)\n\n            if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n            if vxisi_flag=1 then SetFX(FPSCR.VXISI)\n            if ox_flag=1 then SetFX(FPSCR.OX)\n            if ux_flag=1 then SetFX(FPSCR.UX)\n            if xx_flag=1 then SetFX(FPSCR.XX)\n         end\n\n         else do\n            acc ←bfp_CONVERT_FROM_BFP32(ACC[AT][i].word[j])\n\n            reset_flags()\n      end\n   end\nend", "special_registers": "N/A", "programming_notes": "This instruction is used for performing a masked vector operation with bfloat16 elements, using negative multiplication and positive accumulation. It requires the VSX feature to be enabled in the MSR register. The instruction updates the accumulator register based on specified masks and rounding mode. Ensure that the VSX feature is available and properly configured before using this instruction.", "extended_mnemonics": [], "page_found": "Page 925 - 926", "example": "pmxvbf16ger2np acc0, vs2, vs3, 15, 15, 3"}
{"mnemonic": "pmxvf16ger2np", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector 16-bit Floating-Point GER (rank-2 update) Negative multiply, Positive accumulate", "summary": "Performs a masked vector operation with negative multiplication and positive accumulation.", "description": "The instruction performs a masked vector operation where the elements of two vectors are multiplied and accumulated based on the mask values provided.", "syntax": "pmxvf16ger2np AT,XA,XB,XMSK,YMSK,PMSK", "operands": [{"name": "AT", "desc": "Target Vector Register"}, {"name": "XA", "desc": "Source Vector Register A"}, {"name": "XB", "desc": "Source Vector Register B"}, {"name": "XMSK", "desc": "Mask for Source Vector XA"}, {"name": "YMSK", "desc": "Mask for Source Vector XB"}, {"name": "PMSK", "desc": "Mask for Product"}], "encoding": {"format": "MMIRR:XX3-form", "hex_opcode": "0x07900000EC000290", "length": "64", "binary_pattern": "1 | PMSK | XMSK | YMSK", "bit_positions": "0:11 | 12:13 | 14:17 | 18:63"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nif 'xvf16ger2' | 'xvf16ger2pp' | 'xvf16ger2pn' | 'xvf16ger2np' | 'xvf16ger2nn' then do\n   PMSK ←0b11\n   XMSK ←0b1111\n   YMSK ←0b1111\nend\n\ndo i = 0 to 3\n   do j = 0 to 3\n      if XMSK.bit[i] & YMSK.bit[j] then do\n         reset_flags()\n\n         src10 ←bfp_CONVERT_FROM_BFP16((PMSK.bit[0]=0) ? 0x0000 : VSR[32×AX+A].word[i].hword[0])\n         src11 ←bfp_CONVERT_FROM_BFP16((PMSK.bit[1]=0) ? 0x0000 : VSR[32×AX+A].word[i].hword[1])\n         src20 ←bfp_CONVERT_FROM_BFP16((PMSK.bit[0]=0) ? 0x0000 : VSR[32×BX+B].word[j].hword[0])\n         src21 ←bfp_CONVERT_FROM_BFP16((PMSK.bit[1]=0) ? 0x0000 : VSR[32×BX+B].word[j].hword[1])\n\n         p1    ←bfp_MULTIPLY(src10, src20)\n         v1    ←bfp_MULTIPLY_ADD(src11, src21, p1)\n         r1    ←bfp_ROUND_TO_BFP32_DEFAULT(FPSCR.RN, v1)\n\n         if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n         if vximz_flag=1 then SetFX(FPSCR.VXIMZ)\n         if vxisi_flag=1 then SetFX(FPSCR.VXISI)\n         if ox_flag=1 then SetFX(FPSCR.OX)\n         if ux_flag=1 then SetFX(FPSCR.UX)\n         if xx_flag=1 then SetFX(FPSCR.XX)\n\n         reset_flags()\n\n         if '[pm]xvf16ger2' then\n            ACC[AT][i].word[j] ←bfp32_CONVERT_FROM_BFP(r1)\n\n         else do\n            acc ←bfp_CONVERT_FROM_BFP32(ACC[AT][i].word[j])\n\n            if '[pm]xvf16ger2pp' then v2 ←bfp_ADD(r1, acc)\n            if '[pm]xvf16ger2pn' then v2 ←bfp_ADD(r1, bfp_NEGATE(acc))\n            if '[pm]xvf16ger2np' then v2 ←bfp_ADD(bfp_NEGATE(r1), acc)\n            if '[pm]xvf16ger2nn' then v2 ←bfp_ADD(bfp_NEGATE(r1), bfp_NEGATE(acc))\n\n            r2 ←bfp_ROUND_TO_BFP32_DEFAULT(FPSCR.RN, v2)\n      end\n   end\nend", "special_registers": "FPSCR, VXSNAN, VXIMZ, VXISI, OX, UX, XX", "programming_notes": "This instruction is used for performing masked vector operations on 16-bit floating-point numbers, with specific handling of negative and positive accumulations. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. Pay attention to the mask values (PMSK, XMSK, YMSK) as they control which elements are processed. Be aware of potential floating-point exceptions such as VXSNAN, VXIMZ, VXISI, OX, UX, and XX, and handle them appropriately in your code.", "extended_mnemonics": [], "page_found": "Page 930 - 931", "example": "pmxvf16ger2np acc0, vs2, vs3, 15, 15, 3"}
{"mnemonic": "pmxvf32gernp", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector 32-bit Floating-Point GER (rank-1 update) Negative multiply, Positive accumulate", "summary": "Performs a masked vector operation with negative multiplication and positive accumulation.", "description": "Performs a masked 4×4 generalized outer product (rank-1 update GER) on 32-bit floating-point elements, using negative multiplication and positive accumulation ('np' suffix). The XMSK and YMSK operands control which rows and columns participate in the operation. This is a prefixed VSX instruction requiring VSX and prefix support.", "syntax": "pmxvf32gernp AT,XA,XB,XMSK,YMSK", "operands": [{"name": "AT", "desc": "Target Accumulator Register"}, {"name": "XA", "desc": "Source Accumulator Register Index A"}, {"name": "XB", "desc": "Source Accumulator Register Index B"}, {"name": "XMSK", "desc": "Mask for Source Accumulator Register A"}, {"name": "YMSK", "desc": "Mask for Source Accumulator Register B"}], "encoding": {"format": "MMIRR:XX3-form", "hex_opcode": "0x07900000EC0002D0", "length": "64", "binary_pattern": "1 | XA | XB | XMSK | YMSK", "bit_positions": "0:5 | 6:7 | 8:11 | 12:13 | 14:63"}, "extension": "VSX", "pseudocode": "acc ← AT\nfor i in 0 to 3 do\n  if XMSK[i] = 1 then\n    for j in 0 to 3 do\n      if YMSK[j] = 1 then\n        a ← XA[i*32:(i+1)*32-1]\n        b ← XB[j*32:(j+1)*32-1]\n        prod ← -1.0 × a × b\n        acc[i*32+j*8:(i*32+j*8+31)] ← acc[i*32+j*8:(i*32+j*8+31)] + prod\n      end if\n    end for\n  end if\nend for\nAT ← acc", "special_registers": "FPSCR, VXSNAN, VXIMZ, VxisI, OX, UX, XX", "programming_notes": "This instruction is used for performing masked vector operations on single-precision floating-point values, specifically a GER (rank-1 update) operation with negative multiplication and positive accumulation. Ensure that the VSX feature is enabled in the MSR register to avoid exceptions. The instruction processes 4x4 elements, checking masks before performing operations. Be cautious of potential overflow or underflow conditions, as they can trigger exceptions and set flags in the FPSCR register.", "extended_mnemonics": [], "page_found": "Page 935 - 936", "example": "pmxvf32gernp acc0, vs2, vs3, 15, 15"}
{"mnemonic": "pmxvf64gernp", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector 64-bit Floating-Point GER (rank-1 update) Negative multiply, Positive accumulate", "summary": "Performs a masked vector floating-point operation with negative multiplication and positive accumulation.", "description": "Performs a masked 2×2 generalized outer product (rank-1 update GER) on 64-bit floating-point elements, using negative multiplication and positive accumulation ('np' suffix). The XMSK and YMSK operands control participation of rows and columns respectively. This is a prefixed VSX instruction requiring VSX and prefix support.", "syntax": "pmxvf64gernp AT,XAp,XB,XMSK,YMSK", "operands": [{"name": "AT", "desc": "Target Vector Register"}, {"name": "XAp", "desc": "Index for Source Vector Register 1"}, {"name": "XB", "desc": "Index for Source Vector Register 2"}, {"name": "XMSK", "desc": "Mask for Source Vector Register 1"}, {"name": "YMSK", "desc": "Mask for Source Vector Register 2"}], "encoding": {"format": "MMIRR:XX3-form", "hex_opcode": "0x07900000EC0003D0", "length": "64", "binary_pattern": "0 | XAp | XB | AT | XMSK | YMSK", "bit_positions": "0:5 | 6:11 | 12:17 | 18:23 | 24:29 | 30:63"}, "extension": "VSX", "pseudocode": "acc ← AT\nfor i in 0 to 1 do\n  if XMSK[i] = 1 then\n    for j in 0 to 1 do\n      if YMSK[j] = 1 then\n        a ← XAp[i*64:(i+1)*64-1]\n        b ← XB[j*64:(j+1)*64-1]\n        prod ← -1.0 × a × b\n        acc[i*64+j*64:(i*64+j*64+63)] ← acc[i*64+j*64:(i*64+j*64+63)] + prod\n      end if\n    end for\n  end if\nend for\nAT ← acc", "special_registers": "FPSCR, VXSNAN, VXIMZ, VXISI, OX, UX, XX", "programming_notes": "This instruction is used for performing masked vector floating-point operations with negative multiplication and positive accumulation. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid a VSX_Unavailable exception. The operation involves converting BFP64 values, performing arithmetic operations, rounding, and handling exceptions based on flags set during computation.", "extended_mnemonics": [], "page_found": "Page 939 - 940", "example": "pmxvf64gernp acc0, vs2, vs3, 15, 15"}
{"mnemonic": "xxbrd", "architecture": "PowerISA", "full_name": "VSX Vector Byte-Reverse Doubleword", "summary": "Reverses the bytes of each doubleword element in a vector register.", "description": "The contents of byte 5 of doubleword element i of VSR[XB] are placed into byte 2 of doubleword element i of VSR[XT]. Similarly, the contents of byte 4 of doubleword element i of VSR[XB] are placed into byte 3 of doubleword element i of VSR[XT], and so on.", "syntax": "xxbrd XT,XB", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "XB", "desc": "Source Vector-Specific Register"}], "encoding": {"format": "XX-form", "hex_opcode": "0xF017076C", "length": "32", "binary_pattern": "60 | T | 23 | B | BX | TX", "bit_positions": ""}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\ndo i = 0 to 1\n    vsrc ← VSR[32×BX+B].dword[i]\n    do j = 0 to 7\n        VSR[32×TX+T].dword[i].byte[j] ← vsrc.byte[7-j]\n    end\nend", "special_registers": "MSR", "programming_notes": "The xxbrd instruction reverses the bytes within each doubleword of a VSX vector. Ensure that the VSX facility is enabled in the MSR register to avoid an exception. This instruction operates on 128-bit vectors, processing two 64-bit doublewords. There are no specific alignment requirements for the source or target registers.", "extended_mnemonics": [], "page_found": "Page 949 - 950", "example": "xxbrd vs1, vs3"}
{"mnemonic": "xxbrh", "architecture": "PowerISA", "full_name": "VSX Vector Byte-Reverse Halfword", "summary": "Reverses the bytes of each halfword in a vector register.", "description": "Reverses the byte order within each 16-bit (halfword) element in XB and stores the result in XT. This is a VSX instruction commonly used for endianness conversion on 16-bit data granules. No condition registers or status fields are affected.", "syntax": "xxbrh XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF007076C", "length": "32", "binary_pattern": "T | B | 475 | BX | TX", "bit_positions": "0 | 11 | 16 | 21 | 30 31"}, "extension": "VSX", "pseudocode": "for i in 0 to 7 do\n  hw ← XB[i*16:(i+1)*16-1]\n  XT[i*16:(i+1)*16-1] ← REVERSE_BYTES(hw, 2)\nend for", "special_registers": "MSR", "programming_notes": "The xxbrh instruction is useful for reversing the byte order of each halfword in a vector, which can be necessary for data format conversion or compatibility. Ensure that the VSX (Vector Scalar Extensions) are enabled by checking and setting the appropriate bit in the MSR register. This instruction operates on 128-bit vectors and requires proper alignment of the source and target registers. Be cautious of endianness issues when using this instruction, as it directly manipulates byte order.", "extended_mnemonics": [], "page_found": "Page 950 - 951", "example": "xxbrh vs1, vs3"}
{"mnemonic": "xxbrw", "architecture": "PowerISA", "full_name": "Vector Byte-Reverse Word", "summary": "Reverses the bytes of each word in a vector register.", "description": "Reverses the byte order within each 32-bit word of the source VSX vector register XB and places the result in XT. This is a VSX extension instruction with no effect on condition registers or status fields.", "syntax": "xxbrw XT,XB", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00F076C", "length": "32", "binary_pattern": "T | B | BX | TX", "bit_positions": "6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "do i = 0 to 3\n  word ← XB[i*32:(i+1)*32-1]\n  XT[i*32:(i+1)*32-1] ← reverse_bytes(word)\nenddo", "special_registers": "MSR", "programming_notes": "The xxbrw instruction is used to reverse the byte order of each word in a vector register. Ensure that VSX (Vector Scalar Extensions) is enabled by checking and setting the appropriate bit in the MSR register. This instruction operates on 128-bit vector registers, processing four 32-bit words per operation. Be cautious of alignment requirements; source and target vectors must be properly aligned to avoid exceptions.", "extended_mnemonics": [], "page_found": "Page 951 - 952", "example": "xxbrw vs1, vs3"}
{"mnemonic": "xxsldwi", "architecture": "PowerISA", "full_name": "VSX Vector Shift Left Double by Word Immediate", "summary": "Shifts the contents of two vector registers left by a specified number of words and places the result into another vector register.", "description": "Shifts the concatenation of VSX vector registers XA and XB left by SHW words (0-3) and stores the result in XT. This instruction treats the two 128-bit source registers as a 256-bit value and extracts a 128-bit aligned window. No condition registers or status fields are affected.", "syntax": "xxsldwi XT,XA,XB,SHW", "operands": [{"name": "XT", "desc": "Target Vector Register"}, {"name": "XA", "desc": "Source Vector Register"}, {"name": "XB", "desc": "Source Vector Register"}, {"name": "SHW", "desc": "Shift Amount in Words"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "SH", "desc": "Shift Amount (Immediate)"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000010", "length": "32", "binary_pattern": "18 | SH[5:0] | VRT[4:0] | VRA[4:0] | VRB[4:0]", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "shw ← SHW[1:0]\ntemp ← (XA || XB)  # concatenate as 256-bit value\nXT ← temp[shw*32:(shw*32)+127]", "special_registers": "MSR", "programming_notes": "The xxsldwi instruction is commonly used for shifting vector elements by a specified number of words. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid exceptions. The shift amount must be within the range of 0 to 3, as it specifies the word position to align the result. This instruction operates at the user privilege level and does not generate exceptions for valid shifts; however, misalignment or exceeding the shift limit can lead to undefined behavior.", "extended_mnemonics": [], "page_found": "Page 960 - 961", "example": "xxsldwi vs1, vs2, vs3, 0"}
{"mnemonic": "lxvkq", "architecture": "PowerISA", "full_name": "Load VSX Vector Special Value Quadword", "summary": "Loads a special value into a VSX vector register.", "description": "Loads a special constant vector value into VSX vector register XT based on the 5-bit unsigned immediate UIM. The instruction provides a fast way to initialize vectors with commonly used special values. No condition registers or status fields are affected.", "syntax": "lxvkq XT,UIM", "operands": [{"name": "XT", "desc": "Target Vector-Specific Register"}, {"name": "UIM", "desc": "Unspecified Immediate, specifies which special value to load"}], "encoding": {"format": "X-form", "hex_opcode": "0xF01F02D0", "length": "32", "binary_pattern": "T | UIM | TX", "bit_positions": "0:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "case UIM of\n  0:  XT ← 0x00000000_00000000_00000000_00000000\n  1:  XT ← 0xFFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF\n  2:  XT ← 0x00000000_00000000_00000000_00000001\n  3:  XT ← 0x00000001_00000001_00000001_00000001\n  ... # other special values as defined in ISA\nendcase", "special_registers": "MSR", "programming_notes": "Loads a VSX register with a constant vector value determined by UIM. The 5-bit UIM field selects from a set of predefined quadword constants (e.g., IEEE infinity, NaN, zero). No memory access is performed. This instruction cannot be used to load arbitrary immediates.", "extended_mnemonics": [], "page_found": "Page 970 - 971", "example": "lxvkq vs1, uim"}
{"mnemonic": "xvtlsbb", "architecture": "PowerISA", "full_name": "VSX Vector Test Least-Significant Bit by Byte", "summary": "Tests the least-significant bit of each byte in a VSX vector register and sets a condition register field based on the results.", "description": "Tests the least-significant bit of each byte in VSX vector register XB and sets condition register field BF based on whether all tested bits are zero. Sets BF to reflect if all LSBs are 0 (CR field = 0b0010) or if any LSB is 1 (CR field = 0b0011). This is a VSX extension instruction.", "syntax": "xvtlsbb BF,XB", "operands": [{"name": "BF", "desc": "Condition Register Field"}, {"name": "XB", "desc": "Source VSX Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF002076C", "length": "32", "binary_pattern": "18 | BF | XB", "bit_positions": "0:5 | 6:8 | 9:31"}, "extension": "VSX", "pseudocode": "all_zero ← 1\ndo i = 0 to 15\n  if XB[i*8+7] = 1 then all_zero ← 0\nenddo\nif all_zero then\n  CR[BF] ← 0b0010\nelse\n  CR[BF] ← 0b0011\nendif", "special_registers": "CR", "programming_notes": "This instruction following any Vector Compare provides the ability to direct the summary status of the Vector Compare to any CR field, not just CR field 6 when Rc=1.", "extended_mnemonics": [], "page_found": "Page 971 - 972", "example": "xvtlsbb cr0, vs3"}
{"mnemonic": "blt", "architecture": "PowerISA", "full_name": "Branch if Less Than", "summary": "Branches to a target address if the condition 'less than' is true.", "description": "The instruction checks if the condition 'less than' in the specified CR field is true and branches to the target address if it is.", "syntax": "blt target_addr", "operands": [{"name": "target", "desc": "Target Address"}], "encoding": {"format": "B-form", "hex_opcode": "0x41800000", "length": "32", "binary_pattern": "10 | AA | LK | LI", "bit_positions": ""}, "extension": "Base", "pseudocode": "if CR[CR field][LT] then\n    PC <- target_address", "special_registers": "LR, CTR", "programming_notes": "The blt instruction is commonly used for conditional branching based on comparison results. Ensure that the correct condition register (CR) field is specified, as this directly affects the branch decision. The target address must be properly calculated to avoid incorrect jumps. This instruction operates at user privilege level and does not generate exceptions under normal circumstances.", "extended_mnemonics": ["blta", "bltlr", "bltctr"], "page_found": "Page 991 - 992", "example": "blt target"}
{"mnemonic": "blt+", "architecture": "PowerISA", "full_name": "Branch if Less Than, Predict Taken", "summary": "Branches to the target address if CR0 reflects condition 'less than', predicting the branch will be taken.", "description": "The instruction branches to the specified target address if the less-than condition is set in CR0. The prediction hint indicates that the branch is almost always taken.", "syntax": "blt+ target", "operands": [{"name": "target", "desc": "Target Address"}], "encoding": {"format": "B-form", "hex_opcode": "0x41E00000", "length": "32", "binary_pattern": "1 | LK | AA | LI | BO | BI | BH | A | AT", "bit_positions": ""}, "extension": "Base", "pseudocode": "if CR0[LT] then\n    branch to target", "special_registers": "CR0, LR", "programming_notes": "Use blt+ when branching based on a less-than comparison where the branch is expected to be taken frequently. Ensure CR0 is correctly set with the result of the comparison before using this instruction. The prediction hint can improve performance by reducing pipeline stalls, but it should match the actual branch behavior.", "extended_mnemonics": [], "page_found": "Page 992 - 993", "example": "blt+ target"}
{"mnemonic": "cmpdi", "architecture": "PowerISA", "full_name": "Compare Doubleword Immediate", "summary": "Compares a doubleword immediate value with the contents of a register and updates the condition register.", "description": "For cmpdi, the immediate value SI is compared with the contents of register RA. The result is placed into CR Field BF.", "syntax": "cmpdi bf,ra,si", "operands": [{"name": "bf", "desc": "Target Condition Register Field"}, {"name": "ra", "desc": "Source General Purpose Register"}, {"name": "si", "desc": "Signed Immediate Value"}], "encoding": {"format": "XO-form", "hex_opcode": "0x2C200000", "length": "32", "binary_pattern": "11 | BF | / | L | RA | SI", "bit_positions": "0:5 | 6:8 | 9 | 10 | 11:15 | 16:31"}, "extension": "Base", "pseudocode": "if 'cmpdi' then\n    if (RA) < SI then CR[bF] <- 0b00000001\n    else if (RA) > SI then CR[bF] <- 0b00000010\n    else CR[bF] <- 0b00000100", "special_registers": "CR0, CR1-CR7", "programming_notes": "Use cmpdi to compare a register with an immediate value and set the condition register field accordingly. Ensure the immediate value fits within the signed 16-bit range. The comparison result is used in conditional branches, so check CR Field BF after execution.", "extended_mnemonics": ["cmpdi"], "page_found": "Page 994 - 995", "example": "cmpdi bf, ra, si"}
{"mnemonic": "extldi", "architecture": "PowerISA", "full_name": "Extract and Left Justify Immediate", "summary": "Extracts a field of n bits starting at bit position b in the source register, left justifies this field in the target register, and clears all other bits of the target register to 0.", "description": "For extldi, the field of n bits starting at bit position b in the source register is extracted, left justified in the target register, and all other bits are cleared to 0.", "syntax": "extldi ra,rs,n,b (n > 0)", "operands": [{"name": "ra", "desc": "Target General Purpose Register"}, {"name": "rs", "desc": "Source General Purpose Register"}, {"name": "n", "desc": "Number of bits to extract"}, {"name": "b", "desc": "Starting bit position"}], "encoding": {"format": "XO-form", "hex_opcode": "0x78000004", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Base", "pseudocode": "if 'extldi' then\n    ra <- (rs >> b) & ((1 << n) - 1)", "special_registers": "N/A", "programming_notes": "Use extldi to extract a specific bit field from a source register, left-justifying it in the target register. Ensure that the bit position and length are correctly specified to avoid data corruption. This instruction operates at user privilege level.", "extended_mnemonics": [], "page_found": "Page 997 - 998", "example": "extldi ra, rs, n, b (n > 0)"}
{"mnemonic": "extlwi", "architecture": "PowerISA", "full_name": "Extract and Left Justify Immediate", "summary": "Extracts a specified number of bits from the source register, left-justifies them, and places them in the target register.", "description": "Extracts n bits starting at bit position b from GPR rs, left-justifies them in the target GPR ra, and zeros the remaining bits. This is a pseudo-instruction (alias) for rlwimi with specific parameters and operates in 32-bit mode. The instruction updates CR0 if the record bit (Rc) is set.", "syntax": "extlwi ra,rs,n,b (n > 0)", "operands": [{"name": "ra", "desc": "Target General Purpose Register"}, {"name": "rs", "desc": "Source General Purpose Register"}, {"name": "n", "desc": "Number of bits to extract (must be greater than 0)"}, {"name": "b", "desc": "Starting bit position for extraction"}], "encoding": {"format": "XO-form", "hex_opcode": "0x54000000", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Base", "pseudocode": "mask ← MASK(0, n-1)\nra ← (rs >> b) & mask\nra ← ra << (32 - n)\nif Rc then CR0 ← record_cr(ra) endif", "special_registers": "N/A", "programming_notes": "The extlwi instruction is useful for extracting a specific bit field from a source register and left-justifying it in the target register. Ensure that the bit positions 'b' and 'n' are correctly specified to avoid data corruption. The operation preserves or rotates the high-order bits of the target register, so be aware of this behavior if you need to maintain specific register contents.", "extended_mnemonics": ["rlwinm"], "page_found": "Page 998 - 999", "example": "extlwi ra, rs, n, b (n > 0)"}
{"mnemonic": "lwat", "architecture": "PowerISA", "full_name": "Load Word Atomic", "summary": "Loads a word from memory atomically.", "description": "Loads a 32-bit word from memory at an address computed from RA with atomic semantics determined by function code FC. The loaded value is placed in GPR RT. This instruction requires alignment and may be restricted to hypervisor mode depending on FC value.", "syntax": "lwat RT,RA,FC", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "FC", "desc": "Function Code"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00048C", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Base", "pseudocode": "EA ← RA\nRT ← [EA]\n# Atomic load with fence behavior determined by FC", "special_registers": "N/A", "programming_notes": "EA must be a multiple of 4, and the portion of mem(EA-4,12) accessed by the instruction must be contained within an aligned 32-byte block of storage. If either of these requirements is not satisfied, the system alignment error handler is invoked.", "extended_mnemonics": [], "page_found": "Page 1046 - 1047", "example": "lwat r3, r4, fc"}
{"mnemonic": "stwat", "architecture": "PowerISA", "full_name": "Store Word Atomic", "summary": "Stores a word atomically to memory.", "description": "Stores a 32-bit word from GPR RS to memory at an address in RA with atomic semantics specified by function code FC. The store is performed atomically with fence behavior determined by FC. Alignment requirements and potential privilege restrictions apply.", "syntax": "stwat RS,RA,FC", "operands": [{"name": "RS", "desc": "Source General Purpose Register"}, {"name": "RA", "desc": "Address General Purpose Register"}, {"name": "FC", "desc": "Function Code"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00058C", "length": "32", "binary_pattern": "0 | RS | RA | FC", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Base", "pseudocode": "EA ← RA\n[EA] ← RS\n# Atomic store with fence behavior determined by FC", "special_registers": "N/A", "programming_notes": "The stwat instruction atomically updates a word in memory at the address specified by register RA. Ensure that RA is properly aligned to avoid exceptions. The function code FC determines the specific update operation; consult the ISA documentation for valid operations. This instruction operates at user privilege level and does not generate any exceptions under normal conditions.", "extended_mnemonics": [], "page_found": "Page 1048 - 1049", "example": "stwat r3, r4, fc"}
{"mnemonic": "brd", "architecture": "PowerISA", "full_name": "Byte-Reverse Doubleword", "summary": "Reverses the bytes in a doubleword.", "description": "Reverses the byte order of a 64-bit doubleword from the source register and places the result in the target register. This instruction operates at the architectural level to perform a complete byte reversal (byte 0 ↔ byte 7, byte 1 ↔ byte 6, etc.). No status fields are affected. This is a Base category instruction with no privilege requirements.", "syntax": "brd RT,RA", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}], "encoding": {"format": "XO-form", "hex_opcode": "0x7C000176", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Base", "pseudocode": "RT ← BYTESWAP64(RA)", "special_registers": "", "programming_notes": "The brd instruction is useful for reversing the byte order of a doubleword in a register, which can be necessary for data format conversion between big-endian and little-endian systems. Ensure that the source register (RA) contains a valid doubleword value to avoid undefined behavior. This operation does not require any special privileges or alignment considerations.", "extended_mnemonics": [], "page_found": "Page 1099 - 1100", "example": "brd r3, r4"}
{"mnemonic": "vclzdm", "architecture": "PowerISA", "full_name": "Vector Count Leading Zeros Doubleword under bit Mask", "summary": "Counts the number of leading zeros in each doubleword element of a vector, considering a mask.", "description": "Counts the number of leading zero bits in each doubleword element of the source vector, using a bit mask from a second source vector to selectively apply the count operation. The results are placed in the target vector as doubleword elements. This is a VMX (AltiVec) category instruction that does not affect condition register or status fields.", "syntax": "vclzdm VRT, VRA, VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x10000784", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "VMX (AltiVec)", "pseudocode": "for i in 0 to 1 do\n  if VRB[i*64:(i+1)*64] != 0 then\n    VRT[i*64:(i+1)*64] ← LEADING_ZEROS(VRA[i*64:(i+1)*64])\n  else\n    VRT[i*64:(i+1)*64] ← 0\nend for", "special_registers": "N/A", "programming_notes": "Use vclzdm to efficiently count leading zeros in masked bit positions within doublewords. Ensure that VRB contains a valid mask where 1s indicate bits to be considered for zero counting. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "extended_mnemonics": [], "page_found": "Page 1100 - 1101", "example": "vclzdm v1, v2, v3"}
{"mnemonic": "lbzcix", "architecture": "PowerISA", "full_name": "Load Byte and Zero Caching Inhibited Indexed", "summary": "Loads a byte from memory into a register, zeroing the upper bits of the target register.", "description": "The effective address (EA) is calculated as the sum of RA and RB. The byte at EA is loaded into RT56:63, while RT0:55 are set to 0. The storage access is performed as though the location is Caching Inhibited and Guarded.", "syntax": "lbzcix RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0006AA", "length": "32", "binary_pattern": "0 | RT | RA | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Base", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + (RB)\nRT ← 560 || MEM(EA, 1)", "special_registers": "N/A", "programming_notes": "The lbzcix instruction is useful for loading a single byte from memory into the upper bits of a register while zeroing out the lower bits. It ensures that the access is treated as caching inhibited and guarded, which can be crucial for accessing special memory regions. Be cautious with RA being zero, as it results in an effective address equal to RB, potentially leading to unintended memory accesses if not handled properly.", "extended_mnemonics": [], "page_found": "Page 1132 - 1133", "example": "lbzcix r3, r4, r5"}
{"mnemonic": "stbcix", "architecture": "PowerISA", "full_name": "Store Byte Caching Inhibited Indexed X-form", "summary": "Stores a byte from a register to memory with caching inhibited and guarded.", "description": "The instruction stores the byte (RS)56:63 into the memory location addressed by the effective address (EA), which is calculated as the sum of RA and RB. The storage access is performed as though the specified storage location is Caching Inhibited and Guarded.", "syntax": "stbcix RS,RA,RB", "operands": [{"name": "RS", "desc": "Source General Purpose Register"}, {"name": "RA", "desc": "Base Address General Purpose Register"}, {"name": "RB", "desc": "Index General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0007AA", "length": "32", "binary_pattern": "0 | RS | RA | RB", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Base", "pseudocode": "if RA = 0 then\n    b ← 0\nelse\n    b ← (RA)\nEA ← b + (RB)\nMEM(EA, 1) ← (RS)56:63", "special_registers": "N/A", "programming_notes": "This instruction is hypervisor privileged.", "extended_mnemonics": [], "page_found": "Page 1133 - 1134", "example": "stbcix r3, r4, r5"}
{"mnemonic": "slbieg", "architecture": "PowerISA", "full_name": "SLB Invalidate Entry Global", "summary": "Invalidates SLB entries based on the contents of registers RS and RB.", "description": "Invalidates one or more entries in the Segment Lookaside Buffer (SLB) based on the effective address class and segment size specified in RB and the process ID specified in RS, with global scope affecting all processors. This is a privileged instruction (Hypervisor-level) that requires supervisor privileges and does not affect condition register or status fields. It is used for SLB maintenance in virtual memory operations.", "syntax": "slbieg RS,RB", "operands": [{"name": "RS", "desc": "Source General Purpose Register containing the target PID (and optionally the target LPID)"}, {"name": "RB", "desc": "Source General Purpose Register containing the EA, class, and segment size"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0003A4", "length": "32", "binary_pattern": "0 | RS | RB | 466", "bit_positions": ""}, "extension": "Base", "pseudocode": "for each SLB entry matching (RS and RB parameters) do\n  INVALIDATE_SLB_ENTRY(entry)\nend for", "special_registers": "LR,CTR,CR,FPSCR,XER,MSR,SRR0,SRR1,TAR,SPR,DSISR,DAR,HMER", "programming_notes": "slbieg does aﬀect SLBs on other threads.", "extended_mnemonics": [], "page_found": "Page 1197 - 1198", "example": "slbieg r3, r5"}
{"mnemonic": "slbiag", "architecture": "PowerISA", "full_name": "SLB Invalidate All Global", "summary": "Invalidates all SLBs for a specified LPID and PID.", "description": "The instruction invalidates all SLB entries for the target LPID and PID. If L=0, the target PID is taken from RS0:31. If executed in hypervisor state, the target LPID is taken from RS32:63; otherwise, it is taken from LPIDR.", "syntax": "slbiag RS,L", "operands": [{"name": "RS", "desc": "Source General Purpose Register"}, {"name": "L", "desc": "Logical flag (0 or 1)"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0006A4", "length": "32", "binary_pattern": "0 | RS | L | 0", "bit_positions": "0:5 | 6:10 | 11:14 | 15:31"}, "extension": "Base", "pseudocode": "if 'slbiag' then\n    if L=0 then target_PID = RS0:31\n    if MSRHV=1 then target_LPID = RS32:63\n    else target_LPID = LPIDR\n    for each nest SLB\n        for each SLBE with LPID=target_LPID and (PID=target_PID | L=1)\n            SLBEV ←0\n            all other fields of SLBE ←undefined", "special_registers": "LPIDR", "programming_notes": "slbiag does not affect SLBs on processor threads. slbiag serves as both a basic and an extended mnemonic. The Assembler will recognize an slbiag mnemonic with two operands as the basic form, and an slbiag mnemonic with one operand as the extended form. In the extended form the L operand is omitted and assumed to be 0.", "extended_mnemonics": ["slbiag RS,0"], "page_found": "Page 1202 - 1203", "example": "slbiag r3, 0"}
{"mnemonic": "slbfee.", "architecture": "PowerISA", "full_name": "SLB Find Entry ESID", "summary": "Searches the SLB for an entry that matches the effective address specified by register RB.", "description": "The SLB is searched for an entry that matches the effective address specified by register RB. If exactly one matching entry is found, the contents of the B, VSID, Ks, Kp, N, L, C, and LP fields of the entry are placed into register RT. If no matching entry is found, register RT is set to 0. If more than one matching entry is found, either one of the matching entries is used, or a Machine Check occurs.", "syntax": "slbfee. RT,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0007A7", "length": "32", "binary_pattern": "0 | RT | RB | 18 | 1", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "Base", "pseudocode": "if LPCRUPRT=1 then\n    // Instruction is nonfunctional\nelse\n    search SLB for entry matching (RB)0:63-s\n    if exactly one match found then\n        RT <- B | VSID | KsKpNLC | LP\n    else if no match found then\n        RT <- 0\n    else\n        // More than one match, Machine Check occurs\nend", "special_registers": "CR0, XER", "programming_notes": "The contents of registers RT and RB are interpreted as shown below.\nRT0:1   B\nRT2:51   VSID\nRT52     Ks\nRT53    Kp\nRT54   N\nRT55    L\nRT56   C\nRT57     set to 0b0\nRT58:59  LP\nRT60:63   set to 0b0000\nRB0:35   ESID\nRB36:39  must be 0b0000\nRB40:63  must be 0x000000\nIf s > 28, RT80-s:51 are set to zeros. On implementations that support a virtual address size of only n bits, n < 78, RT2:79-n are set to zeros.\nCR Field 0 is set as follows. j is a 1-bit value that is equal to 0b1 if a matching entry was found. Otherwise, j is 0b0. When LPCRUPRT̸=0, j=0b0.\nCR0LT GT EQ SO = 0b00 || j || XERSO", "extended_mnemonics": [], "page_found": "Page 1205 - 1206", "example": "slbfee. r3, r5"}
{"mnemonic": "msgsndu", "architecture": "PowerISA", "full_name": "Message Send Ultravisor", "summary": "Sends a message to other threads in the system.", "description": "The instruction sends a message to other threads in the system. The message type and destination thread(s) are specified in RB.", "syntax": "msgsndu RB", "operands": [{"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00009C", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Privileged", "pseudocode": "msgtype ← GPR(RB)32:36\npayload ← GPR(RB)37:63\nif (msgtype = 0x05)\nthen\n    send_msg(msgtype, payload)", "special_registers": "", "programming_notes": "If msgsndu is used to notify the receiver that updates have been made to storage, a sync should be placed between the stores and the msgsndu. See Section 6.9.2.", "extended_mnemonics": [], "page_found": "Page 1309 - 1310", "example": "msgsndu r5"}
{"mnemonic": "mtvsrbmi", "architecture": "PowerISA", "full_name": "Move to Vector Scalar Register with Bit Mask Immediate", "summary": "Moves a bit mask immediate value into a vector scalar register, setting each byte element based on corresponding bits of the immediate.", "description": "Moves an 8-bit immediate value into a VSR (Vector Scalar Register) with each bit of the immediate controlling whether the corresponding byte element is set to all-ones (0xFF) or all-zeros (0x00). This is a Base category instruction that does not affect condition register or other status fields. The instruction provides a quick way to create byte-level masks in vector registers.", "syntax": "mtvsrbmi VRT,bm", "operands": [{"name": "VRT", "type": "VSR", "desc": "Target vector scalar register that receives the byte mask pattern generated from the immediate value."}, {"name": "IMM8", "type": "imm8", "desc": "8-bit immediate value where each bit controls the corresponding byte element (1 = 0xFF, 0 = 0x00)."}], "encoding": {"format": "XO-form", "hex_opcode": "0x10000014", "length": "32", "binary_pattern": "4 | VRT | b1 | b0 | 10 | b2", "bit_positions": "0:5 | 6:10 | 11:15 | 16:25 | 26:30 | 31"}, "extension": "Base", "pseudocode": "for i in 0 to 7 do\n  if IMM[i] = 1 then\n    VSR_target[i*8:(i+1)*8] ← 0xFF\n  else\n    VSR_target[i*8:(i+1)*8] ← 0x00\nend for", "special_registers": "N/A", "programming_notes": "The mtvsrbmi instruction is useful for initializing vector registers with specific byte patterns based on an immediate bit mask. Ensure that the immediate value correctly reflects the desired byte-wise initialization to avoid unexpected results. This instruction operates at user privilege level and does not raise exceptions under normal conditions.", "extended_mnemonics": [], "page_found": "Page 1329 - 1330", "example": "mtvsrbmi vs1, 0, 0xFF"}
{"mnemonic": "subfc.", "architecture": "PowerISA", "full_name": "Subtract from Complement with Carry-Out", "summary": "Subtracts the contents of one register from the complement of another and updates the carry-out flag.", "description": "For subfc., the complement of the contents of register RB is subtracted from the contents of register RA, and the result is placed into register RT. The carry-out flag is updated based on the operation.", "syntax": "subfc. RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "XO-form", "hex_opcode": "0x7C000010", "length": "32", "binary_pattern": "01000 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Base", "pseudocode": "if 'subfc.' then\n    RT <- (RA) - (~RB)\n    XER.CA <- carry-out", "special_registers": "CR0, XER", "programming_notes": "Use subfc. to subtract the bitwise complement of one register from another, updating the carry-out flag in XER.CA. Ensure registers are properly aligned and consider the effect on CR0 for conditional branching.", "extended_mnemonics": [], "page_found": "Page 1342 - 1343", "example": "subfc. r3, r4, r5"}
{"mnemonic": "slw.", "architecture": "PowerISA", "full_name": "Shift Left Word Immediate", "summary": "Shifts the contents of a register left by a specified number of bits and updates the condition register.", "description": "For slw., the contents of register RA are shifted left by the amount specified in RB, and the result is placed into register RT. The shift count is masked to 5 bits.", "syntax": "slw. RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Shift Count (0-31)"}], "encoding": {"format": "XO-form", "hex_opcode": "0x7C000030", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Base", "pseudocode": "if 'slw.' then\n    RT <- (RA) << ((RB) & 31)", "special_registers": "CR0, XER", "programming_notes": "The slw instruction shifts the contents of RA left by a number of bits specified in RB, with the shift count masked to 5 bits. This operation is useful for bit manipulation tasks but be cautious as shifting large values can lead to overflow. The result is stored in RT, and this instruction operates at user privilege level.", "extended_mnemonics": [], "page_found": "Page 1344 - 1345", "example": "slw. r3, r4, r5"}
{"mnemonic": "dadd.", "architecture": "PowerISA", "full_name": "Double Precision Add Record", "summary": "Adds the contents of two double precision floating-point registers and updates the condition register.", "description": "Adds two double-precision decimal floating-point operands and places the result in the target register, then updates CR1 based on the result, exception status, and FPSCR flags. This instruction requires the Decimal Floating-Point (DFP) category and updates FPSCR condition bits and CR1 field based on the result classification and exception conditions.", "syntax": "dadd. FRD,FRB,FRC", "operands": [{"name": "FRD", "desc": "Target Double Precision Floating-Point Register"}, {"name": "FRB", "desc": "Source Double Precision Floating-Point Register"}, {"name": "FRC", "desc": "Source Double Precision Floating-Point Register"}], "encoding": {"format": "XO-form", "hex_opcode": "0xEC000004", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Base", "pseudocode": "FRD ← FRB + FRC\nCR1 ← FPSCR[FPRF]\nFPSCR[exception bits] ← updated based on result", "special_registers": "CR0, XER", "programming_notes": "The dadd. instruction is used for adding two double-precision decimal floating-point numbers. It updates Condition Register Field 1 to indicate the result, which can be useful for conditional operations. Ensure that the input registers contain valid decimal floating-point values to avoid undefined behavior.", "extended_mnemonics": [], "page_found": "Page 1345 - 1346", "example": "dadd. f5, f3, f4"}
{"mnemonic": "fdivs", "architecture": "PowerISA", "full_name": "Floating Point Divide Single Precision", "summary": "Divides the contents of two single precision floating point registers.", "description": "For fdivs, the value in register FRB is divided by the value in register FRA, and the result is placed into register FRT.", "syntax": "fdivs FRT,FRA,FRB", "operands": [{"name": "FRT", "desc": "Target Floating Point Register"}, {"name": "FRA", "desc": "Source Floating Point Register"}, {"name": "FRB", "desc": "Source Floating Point Register"}], "encoding": {"format": "XO-form", "hex_opcode": "0xEC000024", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Floating-Point", "pseudocode": "FRT <- (FRA) / (FRB)", "special_registers": "FPSCR", "programming_notes": "The fdivs instruction performs a single-precision floating-point division. Ensure that neither operand is zero to avoid division by zero exceptions. The FPSCR register may be updated with status flags such as overflow or underflow. This operation can raise exceptions if the result overflows, underflows, or is invalid (e.g., NaN).", "extended_mnemonics": [], "page_found": "Page 1347 - 1348", "example": "fdivs f1, f2, f3"}
{"mnemonic": "fcpsgn.", "architecture": "PowerISA", "full_name": "Copy Sign", "summary": "Copies the sign of one floating-point number to another.", "description": "The fcpsgn. instruction copies the sign bit from the source operand B to the target operand A and places the result in the destination operand C.", "syntax": "fcpsgn. FRT,FRB,FRA", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register (sign source)"}, {"name": "FRA", "desc": "Source Floating-Point Register (magnitude source)"}, {"name": "RT", "desc": "Target Floating-Point Register"}, {"name": "RB", "desc": "Source Floating-Point Register (sign source)"}, {"name": "RA", "desc": "Source Floating-Point Register (magnitude source)"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000010", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "Floating-Point", "pseudocode": "if 'fcpsgn.' then\n    RT <- (RA) with sign of (RB)", "special_registers": "N/A", "programming_notes": "The fcpsgn. instruction is useful for manipulating the sign of floating-point numbers without changing their magnitude. Ensure that operands A and B are properly aligned in memory to avoid alignment faults. This operation does not require any special privileges and will not generate exceptions under normal circumstances.", "extended_mnemonics": [], "page_found": "Page 1354 - 1355", "example": "fcpsgn. f1, f3, f2"}
{"mnemonic": "fdiv.", "architecture": "PowerISA", "full_name": "Floating Point Divide Record", "summary": "Divides the contents of two floating-point registers and updates the condition register.", "description": "For fdiv., the quotient of the contents of register FA and FB is placed into register FC.", "syntax": "fdiv. FC,FA,FB", "operands": [{"name": "FC", "desc": "Target Floating Point Register"}, {"name": "FA", "desc": "Source Floating Point Register"}, {"name": "FB", "desc": "Source Floating Point Register"}], "encoding": {"format": "XO-form", "hex_opcode": "0xFC000024", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Floating-Point", "pseudocode": "if 'fdiv.' then\n    FC <- (FA) / (FB)", "special_registers": "CR0, FPSCR", "programming_notes": "The fdiv. instruction performs a floating-point division, storing the result in register FC. Ensure that registers FA and FB are properly initialized to avoid undefined behavior. This operation may raise exceptions if FB is zero or if there are overflow/underflow conditions; check FPSCR for exception flags after execution.", "extended_mnemonics": [], "page_found": "Page 1355 - 1356", "example": "fdiv. fc, fa, fb"}
{"mnemonic": "fre.", "architecture": "PowerISA", "full_name": "Reciprocal Estimate", "summary": "Estimates the reciprocal of a floating-point number.", "description": "The fre. instruction estimates the reciprocal of the contents of register RA and places the result into register RT.", "syntax": "fre. FRT,FRB", "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | 0 | 0 | FRB | 24 | /", "hex_opcode": "0xFC000030", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "24", "clean": "24"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "extension": "Floating-Point", "pseudocode": "if 'fre.' then\n    RT <- estimate_reciprocal(RA)", "special_registers": "N/A", "programming_notes": "The fre. instruction provides a fast, approximate reciprocal value, useful for performance-critical applications like graphics or scientific computing where precision can be traded for speed. Ensure that the input register RA contains a non-zero value to avoid undefined behavior; otherwise, consider adding checks to handle zero inputs gracefully.", "extended_mnemonics": [], "page_found": "Page 200 - 202", "example": "fre. r3, r4"}
{"mnemonic": "dcffixqq", "architecture": "PowerISA", "full_name": "Double-Precision Floating-Point Fix to Quadword", "summary": "Converts a double-precision floating-point value to a quadword integer.", "description": "Converts a double-precision decimal floating-point value to a 128-bit signed quadword integer, storing the result in a GPR pair or related register file location. This Floating-Point category instruction does not update condition registers but may set exception flags in FPSCR. The conversion uses the current rounding mode from FPSCR.", "syntax": "dcffixqq RT,RA", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC0007C4", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Floating-Point", "pseudocode": "RT ← CONVERT_DFP_TO_INT128(FRA, FPSCR[RN])", "special_registers": "FPSCR", "programming_notes": "The dcffixqq instruction is commonly used for converting double-precision floating-point numbers to integers, rounding towards zero. Ensure that the input value in RA is within the range representable by a quadword integer to avoid overflow or underflow exceptions. This instruction operates at user privilege level and does not require any specific ordering or alignment of registers.", "extended_mnemonics": [], "page_found": "Page 1361 - 1362", "example": "dcffixqq r3, r4"}
{"mnemonic": "vinshvrx", "architecture": "PowerISA", "full_name": "Vector Insert Halfword from VSR using GPR-specified Right-Index VX-form", "summary": "Inserts a halfword from a vector register into another vector register at a position specified by a general-purpose register.", "description": "Inserts a halfword-sized element from one vector register into another vector register at a byte position determined by the contents of a general-purpose register. This VMX (AltiVec) category instruction does not affect condition register or status fields. The GPR value specifies the insertion position within the destination vector.", "syntax": "vinshvrx VRT,RA,VRB", "operands": [{"name": "VRT", "type": "VR", "desc": "Target vector register. Bits 48:63 of VSR[VRB+32] are placed into its byte elements 14-index:15-index."}, {"name": "RA", "type": "GPR", "desc": "General purpose register whose bits 60:63 supply the byte index, counted from the right end of the target."}, {"name": "VRB", "type": "VR", "desc": "Source vector register supplying the halfword held in its bits 48:63."}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000014F", "length": "32", "binary_pattern": "00101 001111", "bit_positions": ""}, "extension": "VMX (AltiVec)", "pseudocode": "index ← GPR[RA].bit[60:63]\nVSR[VRT+32].byte[14-index:15-index] ← VSR[VRB+32].bit[48:63]\nIf index is greater than 14, the result is undefined.", "special_registers": "N/A", "programming_notes": "The vinshvrx instruction is useful for selectively updating a halfword within a vector register based on a dynamic index provided by a general-purpose register. Ensure that the right-index specified in the GPR does not exceed the bounds of the 16-byte vector to avoid undefined behavior. This instruction operates at user privilege level and does not generate exceptions under normal circumstances, but incorrect indexing can lead to data corruption.", "extended_mnemonics": [], "page_found": "Page 1371 - 1372", "example": "vinshvrx"}
{"mnemonic": "creqv", "architecture": "PowerISA", "full_name": "Condition Register Equivalent", "summary": "Sets the condition register field to 1 if the corresponding fields of two source registers are equal, otherwise sets it to 0.", "description": "Performs a bitwise equivalence operation on two condition register fields and places the result in the target condition register field (setting the target bit to 1 if both source bits are equal, 0 otherwise). This Base category instruction operates entirely within the condition register and does not affect other status fields. It is commonly used in conditional branch logic and CR field manipulation.", "syntax": "creqv CRb,CRA,CRB", "operands": [{"name": "CRb", "desc": "Target Condition Register Field"}, {"name": "CRA", "desc": "Source Condition Register Field"}, {"name": "CRB", "desc": "Source Condition Register Field"}], "encoding": {"format": "XL-form", "hex_opcode": "0x4C000242", "length": "32", "binary_pattern": "010011 | CRb | CRA | CRB | 01001 | 00001 | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:18 | 19:20 | 21:30 | 31"}, "extension": "Base", "pseudocode": "CR[CRb] ← CR[CRA] XNOR CR[CRB]\nCR[CRb] ← (CR[CRA] AND CR[CRB]) OR (NOT CR[CRA] AND NOT CR[CRB])", "special_registers": "CR0, CR1-CR7", "programming_notes": "The creqv instruction is useful for comparing two condition register fields and determining where they are equivalent. It's important to ensure that the source registers (CRA and CRB) are correctly set before using this instruction, as incorrect values can lead to unexpected results in subsequent conditional logic. This instruction operates at the user privilege level and does not generate exceptions under normal circumstances.", "extended_mnemonics": [], "page_found": "Page 1373 - 1374", "example": "creqv 0, cr0, cr1"}
{"mnemonic": "ldat", "architecture": "PowerISA", "full_name": "Load Doubleword Atomic", "summary": "Atomically loads a doubleword from memory.", "description": "Atomically loads a doubleword from memory at the address formed by RA + RB and places the result in RT. This instruction provides atomic semantics for load operations on Power10 and later processors. The instruction updates CR0 when Rc=1.", "syntax": "ldat RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Base Address General Purpose Register"}, {"name": "RB", "desc": "Offset General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0004CC", "length": "32", "binary_pattern": "011111 | RT | RA | RB | 10011 | 00110 | Rc", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Base", "pseudocode": "EA ← (RA) + (RB)\nRT ← [EA]", "special_registers": "N/A", "programming_notes": "Places a reservation on the cache line containing the effective address. The subsequent store-conditional (stwcx./stdcx. etc.) will fail if the reservation has been lost due to an intervening store from any processor or an exception. Always check the EQ bit in CR0 after the store-conditional.", "extended_mnemonics": [], "page_found": "Page 1374 - 1375", "example": "ldat r3, r4, r5"}
{"mnemonic": "addme.", "architecture": "PowerISA", "full_name": "Add to Minus One Extended", "summary": "Adds the contents of two registers and subtracts one, then updates the condition register.", "description": "For addme., the sum of the contents of register RA and RB minus one is placed into register RT.", "syntax": "addme. RT,RA", "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register"}], "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | 00000 | OE | 234 | Rc", "hex_opcode": "0x7C0001D4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "00000", "clean": "00000"}, {"raw": "OE", "clean": "OE"}, {"raw": "234", "clean": "234"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "extension": "Base", "pseudocode": "if 'addme.' then\n    RT <- (RA) + (RB) - 1", "special_registers": "CR0, XER", "programming_notes": "The addme. instruction adds two registers, subtracts one from the result, and stores it in a third register. It updates the CR0 and XER special registers with the arithmetic results. Ensure that the input registers RA and RB are correctly aligned for optimal performance. This instruction is available at user privilege level.", "extended_mnemonics": [], "page_found": "Page 112 - 114", "example": "addme. r3, r4, r5"}
{"mnemonic": "stxvrdx", "architecture": "PowerISA", "full_name": "Store VSX Vector Rightmost Doubleword Indexed X-form", "summary": "Stores the rightmost doubleword of a VSX vector register to memory.", "description": "Stores the rightmost (low-order) doubleword of the VSX vector register VX to memory at the address formed by RA + RB. This instruction is part of the VSX extension and operates on the 64-bit portion of the 128-bit VSX register.", "syntax": "stxvrdx VX,RA,RB", "operands": [{"name": "VX", "desc": "VSX Vector Register"}, {"name": "RA", "desc": "Base Address General Purpose Register"}, {"name": "RB", "desc": "Index General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0001DA", "length": "32", "binary_pattern": "31 | XS | RA | RB | 237 | TX", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "EA ← (RA) + (RB)\n[EA] ← VX[64:127]", "special_registers": "N/A", "programming_notes": "The stxvrdx instruction is used to store the rightmost doubleword (8 bytes) of a VSX vector register to memory. Ensure that the effective address formed by RA and RB is properly aligned to 8 bytes to avoid alignment faults. This instruction requires supervisor or hypervisor privilege level.", "extended_mnemonics": [], "page_found": "Page 1376 - 1377", "example": "stxvrdx v1, r4, r5"}
{"mnemonic": "plfd", "architecture": "PowerISA", "full_name": "Prefixed Load Floating-Point Double MLS:D-form", "summary": "Loads a double-precision floating-point value from memory into a VSX register.", "description": "A prefixed load instruction that loads a double-precision floating-point value from memory into a VSX register using a 34-bit immediate displacement. The effective address is formed using a prefix word and suffix word together, supporting a much larger displacement range than standard instructions.", "syntax": "plfd RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}, {"name": "VRT", "desc": "Destination VSX Register"}, {"name": "B", "desc": "Base General Purpose Register"}], "encoding": {"format": "D-form", "hex_opcode": "0x06000000C8000000", "length": "32", "binary_pattern": "01 | 100 | Rc | .//.. | RT | RA | RB", "bit_positions": "0:5 | 6:10 | 11 | 12 | 13:17 | 18:22 | 23:31"}, "extension": "Prefixed", "pseudocode": "EA ← (RA) + EXTS(D)\nVRT ← [EA]", "special_registers": "N/A", "programming_notes": "The plfd instruction is used to load a double-precision floating-point value from memory into a VSX register. Ensure that the base and index registers point to a correctly aligned 8-byte boundary to avoid alignment faults. This instruction operates at user privilege level.", "extended_mnemonics": [], "page_found": "Page 1381 - 1382", "example": "plfd r3, r4, r5"}
{"mnemonic": "dquai.", "architecture": "PowerISA", "full_name": "DFP Quantize Immediate", "summary": "Quantizes a DFP value to an immediate number of decimal digits.", "description": "Quantizes a decimal floating-point (DFP) value in FRB to the number of decimal digits specified by immediate UI, storing the result in FRT. This instruction is part of the Decimal Floating-Point category and updates FPSCR and CR1 when Rc=1.", "syntax": "dquai. TE,FRT,FRB,RMC", "operands": [{"name": "TE", "desc": "Target Exponent"}, {"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}, {"name": "RMC", "desc": "Rounding Mode Control"}], "encoding": {"format": "Z23-form", "hex_opcode": "0xEC000086", "length": "32", "binary_pattern": "0 | FRT | TE | FRB | RMC | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Decimal Floating-Point", "pseudocode": "FRT ← Quantize(FRB, UI)\nFPSCR ← updated with DFP status\nCR1 ← (FRT is NaN, FRT is Infinity, FRT is Zero, FRT is Negative) if Rc=1", "special_registers": "N/A", "programming_notes": "The dquai. instruction is used for quantizing DFP values with an immediate quantum, rounding as necessary. Ensure that the immediate field UI specifies a valid quantum and that the source operand FRB is correctly formatted. This instruction operates at the problem state privilege level.", "extended_mnemonics": [], "page_found": "Page 249 - 250", "example": "dquai. f1, f3, 4"}
{"mnemonic": "xvf64gernn", "architecture": "PowerISA", "full_name": "VSX Vector 64-bit Floating-Point GER (rank-1 update) Negative multiply, Negative accumulate XX3-form", "summary": "Performs a VSX Vector 64-bit Floating-Point GER (rank-1 update) with negative multiply and negative accumulate, updating an accumulator register.", "description": "Performs a VSX vector 64-bit floating-point outer-product update (GER rank-1 update) with negative multiply and negative accumulate. This MMA instruction is part of the Matrix Multiply Accumulate facility and requires MMA support; it reads two VSX vector registers and updates a 512-bit accumulator.", "syntax": "xvf64gernn AT,XAp,XB", "operands": [{"name": "AT", "type": "ACC", "desc": "Target accumulator. ACC[AT] holds a 4x2 matrix of double-precision values."}, {"name": "XAp", "type": "VSR", "desc": "Source VSR pair (even/odd). VSR[XAp] and VSR[XAp+1] are concatenated to supply the four row values."}, {"name": "XB", "type": "VSR", "desc": "Source VSR supplying the two column values."}], "encoding": {"format": "XX3-form", "hex_opcode": "0xEC0007D0", "length": "32", "binary_pattern": "59 | AT | / | XA | XB | 250 | AX | BX | /", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "extension": "MMA", "pseudocode": "vsrcX ← VSR[XAp] || VSR[XAp+1]\nvsrcY ← VSR[XB]\ndo i = 0 to 3\n  do j = 0 to 1\n    ACC[AT][i].dword[j] ← -( vsrcX.dword[i] × vsrcY.dword[j] + ACC[AT][i].dword[j] )\nThe product and the accumulated value are negated together.", "special_registers": "N/A", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "extended_mnemonics": [], "page_found": "Page 1384 - 1385", "example": "xvf64gernn"}
{"mnemonic": "fcfidus.", "architecture": "PowerISA", "full_name": "Floating Convert with round Unsigned Doubleword to Single-Precision format", "summary": "Converts an unsigned doubleword integer in a floating-point register to a single-precision floating-point number, rounding the result.", "description": "The instruction converts the contents of the source floating-point register (FRB) from an unsigned doubleword integer to a single-precision floating-point number and stores it in the target floating-point register (FRT).", "syntax": "fcfidus. FRT,FRB", "operands": [{"name": "FRT", "desc": "Target Floating Point Register"}, {"name": "FRB", "desc": "Source Floating Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xEC00079C", "length": "32", "binary_pattern": "111011 | FRT | // | FRB | 11110 | 01110", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Floating-Point", "pseudocode": "FRT <- ConvertToSinglePrecision(FRB, unsigned)", "special_registers": "FPSCR, CR0", "programming_notes": "Use fcfidus. when converting unsigned 64-bit integers to single-precision floats. Ensure the source register contains a valid unsigned integer; otherwise, the result is undefined. This instruction operates at user privilege level and does not raise exceptions for invalid input values.", "extended_mnemonics": [], "page_found": "Page 1385 - 1386", "example": "fcfidus. f1, f3"}
{"mnemonic": "xsmaddmsp", "architecture": "PowerISA", "full_name": "VSX Scalar Multiply-Add Type-M Single-Precision", "summary": "Multiplies two single-precision floating-point values and adds a third, storing the result in the target register (Type-M form).", "description": "Performs a scalar single-precision floating-point multiply-add operation (Type-M form) using VSX registers, computing FRB × FRC + FRT and storing the result in FRT. The Type-M form provides additional semantics for rounding and exception handling in VSX scalar operations.", "syntax": "xsmaddmsp FRT,FRB,FRC", "operands": [{"name": "FRT", "desc": "Target Floating Point Register"}, {"name": "FRB", "desc": "Source Floating Point Register"}, {"name": "FRC", "desc": "Source Floating Point Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000048", "length": "32", "binary_pattern": "111100 | FRT | FRB | FRC | 00001 | 001", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "FRT ← FRT + (FRB × FRC)", "special_registers": "FPSCR", "programming_notes": "The xsmaddmsp instruction is commonly used for efficient scalar floating-point arithmetic operations, particularly in applications requiring high performance and precision. Ensure that the input registers are properly aligned to avoid potential exceptions. This instruction operates at a privilege level that allows it to be executed by user-mode programs, making it accessible for general-purpose computations. Be aware of the FPSCR register's impact on rounding modes and exception flags.", "extended_mnemonics": [], "page_found": "Page 1386 - 1387", "example": "xsmaddmsp f1, f3, f4"}
{"mnemonic": "xvnmaddmsp", "architecture": "PowerISA", "full_name": "VSX Vector Negative Multiply-Add Type-M Single-Precision", "summary": "Performs a vector single-precision floating-point negative multiply-add operation (Type-M), computing the negation of (XB * XT + XA) for each single-precision element.", "description": "Performs a VSX vector single-precision floating-point negative multiply-add operation (Type-M form), computing -(XA + XB × XT) for each single-precision element. This instruction is part of the VSX extension and operates on four single-precision values per 128-bit vector.", "syntax": "xvnmaddmsp XT,XA,XB", "operands": [{"name": "XT", "type": "VSR", "desc": "Target VSX vector register that serves as both the third multiplicand and destination for negated results."}, {"name": "XA", "type": "VSR", "desc": "Source VSX vector register providing the first operand (addend)."}, {"name": "XB", "type": "VSR", "desc": "Source VSX vector register providing the first multiplier operand."}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000648", "length": "32", "binary_pattern": "60 | XT | XA | XB | 1608", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "for i ∈ [0,3]:\n  XA[32*i:32*i+31] ← -(XA[32*i:32*i+31] + (XB[32*i:32*i+31] × XT[32*i:32*i+31]))", "special_registers": "N/A", "programming_notes": "This instruction is useful for performing complex vector operations involving single-precision floating-point arithmetic. Ensure that all input and output vectors are properly aligned to avoid performance penalties or exceptions. The operation is performed at the user privilege level, so no special privileges are required. Be cautious of potential overflow or underflow conditions during multiplication and addition steps.", "extended_mnemonics": [], "page_found": "Page 1387 - 1388", "example": "xvnmaddmsp vs1, vs2, vs3"}
{"mnemonic": "xvcvuxddp", "architecture": "PowerISA", "full_name": "VSX Vector Convert with round Unsigned Doubleword to Double-Precision format", "summary": "Converts an unsigned doubleword vector element to a double-precision floating-point value.", "description": "For each doubleword element in the source vector register VRB, the instruction converts the unsigned 64-bit integer value to a double-precision floating-point value and places the result in the corresponding doubleword element of the target vector register VRT. The conversion uses the current rounding mode. Two elements are processed in parallel, one per doubleword lane.", "syntax": "xvcvuxddp VRT, VRA, VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00007A0", "length": "32", "binary_pattern": "111100 | VRT | // | VRA | 11110 | 1000", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "do i = 0 to 1\n  VRT.dword[i] ← ConvertUnsignedFixed64ToFP64(VRB.dword[i])", "special_registers": "N/A", "programming_notes": "This instruction is useful for converting unsigned 64-bit integers in a vector to double-precision floating-point numbers. Ensure that the source vector elements are correctly aligned and consider the current rounding mode's effect on conversion results. This operation processes two elements per cycle, making it efficient for bulk conversions.", "extended_mnemonics": [], "page_found": "Page 1389 - 1390", "example": "xvcvuxddp v1, v2, v3"}
{"mnemonic": "pmxvf16ger2pp", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector 16-bit Floating-Point GER (rank-2 update) Positive multiply, Positive accumulate", "summary": "Performs a prefixed masked VSX vector 16-bit floating-point GER rank-2 update with positive multiply and positive accumulate.", "description": "A prefixed masked VSX vector 16-bit floating-point outer-product update (GER rank-2 update) with positive multiply and positive accumulate. This 64-bit MMA instruction requires both prefix and suffix encoding and supports register-based masking for selective accumulator updates.", "syntax": "pmxvf16ger2pp AT,XA,XB,XMSK,YMSK,PMSK", "operands": [{"name": "AT", "type": "ACC", "desc": "Target accumulator. ACC[AT] holds a 4x4 matrix of 32-bit floating-point values."}, {"name": "XA", "type": "VSR", "desc": "Source VSR supplying four words, each holding two 16-bit values."}, {"name": "XB", "type": "VSR", "desc": "Source VSR supplying four words, each holding two 16-bit values."}, {"name": "XMSK", "type": "imm4", "desc": "4-bit row mask. Row i is updated only when bit i is 1; a masked-off element is set to zero."}, {"name": "YMSK", "type": "imm4", "desc": "4-bit column mask. Column j is updated only when bit j is 1; a masked-off element is set to zero."}, {"name": "PMSK", "type": "imm2", "desc": "2-bit product mask selecting which of the two 16-bit lanes contribute to each product."}], "encoding": {"format": "MMIRR:XX3-form", "hex_opcode": "0x07900000EC000090", "length": "64", "binary_pattern": "000001 | 11100 | 1 | Rc | ../// | ///.. | ?", "bit_positions": "0:5 | 6:10 | 11 | 12 | 13 | 14 | 15:63"}, "extension": "MMA", "pseudocode": "do i = 0 to 3\n  do j = 0 to 3\n    if XMSK.bit[i]=1 & YMSK.bit[j]=1 then\n      a0 ← (PMSK.bit[0]=1) ? VSR[XA].word[i].hword[0] : 0\n      a1 ← (PMSK.bit[1]=1) ? VSR[XA].word[i].hword[1] : 0\n      b0 ← (PMSK.bit[0]=1) ? VSR[XB].word[j].hword[0] : 0\n      b1 ← (PMSK.bit[1]=1) ? VSR[XB].word[j].hword[1] : 0\n      ACC[AT][i].word[j] ← round(a0 × b0 + a1 × b1) + ACC[AT][i].word[j]\n    else\n      ACC[AT][i].word[j] ← 0", "special_registers": "N/A", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "extended_mnemonics": [], "page_found": "Page 1397 - 1398", "example": "pmxvf16ger2pp"}
{"mnemonic": "pmxvi8ger4pp", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector 8-bit Signed/Unsigned Integer GER (rank-4 update) Positive multiply, Positive accumulate", "summary": "Performs a prefixed masked VSX vector 8-bit signed/unsigned integer GER rank-4 update with positive multiply and positive accumulate, adding the result to the accumulator.", "description": "Performs a prefixed masked VSX vector 8-bit signed/unsigned integer generalized matrix multiply (GER) rank-4 update with positive multiply and positive accumulate semantics, adding the outer product result to the target accumulator register. This instruction is part of the MMA (Matrix-Multiply Assist) extension and uses masking to selectively update the accumulator based on mask fields AT, AX, and BX.", "syntax": "pmxvi8ger4pp AT,XA,XB,XMSK,YMSK,PMSK", "operands": [{"name": "AT", "type": "ACC", "desc": "Target accumulator. ACC[AT] holds a 4x4 matrix of 32-bit signed integer values."}, {"name": "XA", "type": "VSR", "desc": "Source VSR supplying four words, each holding four signed 8-bit values."}, {"name": "XB", "type": "VSR", "desc": "Source VSR supplying four words, each holding four unsigned 8-bit values."}, {"name": "XMSK", "type": "imm4", "desc": "4-bit row mask. Row i is updated only when bit i is 1; a masked-off element is set to zero."}, {"name": "YMSK", "type": "imm4", "desc": "4-bit column mask. Column j is updated only when bit j is 1; a masked-off element is set to zero."}, {"name": "PMSK", "type": "imm4", "desc": "4-bit product mask selecting which of the four byte lanes contribute to each product."}], "encoding": {"format": "MMIRR:XX3-form", "hex_opcode": "0x07900000EC000010", "length": "32", "binary_pattern": "59 | AT | / | XA | XB | 2 | AX | BX | /", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "extension": "MMA", "pseudocode": "do i = 0 to 3\n  do j = 0 to 3\n    if XMSK.bit[i]=1 & YMSK.bit[j]=1 then\n      psum ← 0\n      do k = 0 to 3\n        if PMSK.bit[k]=1 then\n          psum ← psum + EXTS(VSR[XA].word[i].byte[k]) × EXTZ(VSR[XB].word[j].byte[k])\n      ACC[AT][i].word[j] ← CHOP32( psum + EXTS(ACC[AT][i].word[j]) )\n    else\n      ACC[AT][i].word[j] ← 0", "special_registers": "N/A", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "extended_mnemonics": [], "page_found": "Page 1398 - 1399", "example": "pmxvi8ger4pp"}
{"mnemonic": "xvf16ger2pn", "architecture": "PowerISA", "full_name": "VSX Vector 16-bit Floating-Point GER (rank-2 update) Positive multiply, Negative accumulate", "summary": "Performs a rank-2 update of an accumulator register using 16-bit floating-point outer product, with positive multiply and negative accumulate.", "description": "Performs a VSX rank-2 generalized matrix multiply (GER) update using 16-bit floating-point elements with positive multiply and negative accumulate semantics. The instruction computes an outer product of two 2-element vectors and subtracts the result from the target accumulator. This is an MMA extension instruction that updates a 2×2 block of the accumulator.", "syntax": "xvf16ger2pn AT,XA,XB", "operands": [{"name": "AT", "type": "imm3", "desc": "Accumulator target index (specifies which accumulator register in the range ACC0-ACC7)"}, {"name": "XA", "type": "VSR", "desc": "Source VSX register containing 2 16-bit floating-point elements"}, {"name": "XB", "type": "VSR", "desc": "Source VSX register containing 2 16-bit floating-point elements"}, {"name": "AX", "type": "imm1", "desc": "Accumulator mask for rows (2 16-bit FP values, positive multiply)"}, {"name": "BX", "type": "imm1", "desc": "Source mask for columns (2 16-bit FP values, negative accumulate)"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xEC000490", "length": "32", "binary_pattern": "59 | AT | / | XA | XB | 146 | AX | BX | /", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "extension": "MMA", "pseudocode": "acc ← acc - (outer product of 2 16-bit FP elements from XA and 2 from XB)", "special_registers": "N/A", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "extended_mnemonics": [], "page_found": "Page 1402 - 1403", "example": "xvf16ger2pn"}
{"mnemonic": "xsxsigqp", "architecture": "PowerISA", "full_name": "VSX Scalar Extract Significand Quad-Precision", "summary": "Extracts the significand of a quad-precision floating-point number.", "description": "Extracts the significand (mantissa) field from a quad-precision (128-bit) floating-point value in the source VSX register and places the extracted significand into the target VSX register. The result preserves the sign of the original significand and right-justifies it within a 64-bit field. The instruction does not modify condition registers or exception flags.", "syntax": "xsxsigqp VRT, VRA", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC120648", "length": "32", "binary_pattern": "111111 | VRT | 10010 | VRA | 11001 | 00100 | Rc", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Floating-Point", "pseudocode": "significand ← extract_significand(VRA[0:127])\nVRT[0:127] ← sign_extend_to_128bit(significand)", "special_registers": "N/A", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": [], "page_found": "Page 1408 - 1409", "example": "xsxsigqp v1, v2"}
{"mnemonic": "xsnmsubmsp", "architecture": "PowerISA", "full_name": "VSX Scalar Negative Multiply-Subtract Type-M Single-Precision", "summary": "Performs a scalar negative multiply-subtract operation in single-precision floating-point, storing the result using the Type-M (multiplicand) form where the target register provides one of the multiplicand operands.", "description": "Performs a VSX scalar negative multiply-subtract operation on single-precision floating-point values using the Type-M form, where the target register (VRT) provides the subtrahend multiplicand operand. Computes -(VRA × VRT - VRB) and stores the result in VRT. This operation uses the FPSCR rounding mode and may set exception flags FPSCR[VXSNAN, VXISI, VXSQRT, VXCVI, XX, ZX, UX, OX].", "syntax": "xsnmsubmsp XT,XA,XB", "operands": [{"name": "XT", "type": "VSR", "desc": "Target VSR. In the Type-M form it also supplies the multiplier, and it receives the negated result."}, {"name": "XA", "type": "VSR", "desc": "First source VSR, the multiplicand."}, {"name": "XB", "type": "VSR", "desc": "Second source VSR, subtracted from the product."}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF00004C8", "length": "32", "binary_pattern": "60 | XT | XA | XB | 1224", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "VSR[XT].dword[0] ← -( VSR[XA].dword[0] × VSR[XT].dword[0] - VSR[XB].dword[0] )\nThe result is rounded to single precision and FPSCR exception flags are updated.", "special_registers": "N/A", "programming_notes": "The xsnmsubmsp instruction is useful for performing complex floating-point calculations involving multiplication, subtraction, and negation in a single operation. Ensure that the target register (XT) is properly aligned and contains valid single-precision floating-point values to avoid undefined behavior. This instruction operates at user privilege level and may raise exceptions if operands are out of range or if there are NaNs involved.", "extended_mnemonics": [], "page_found": "Page 1411 - 1412", "example": "xsnmsubmsp"}
{"mnemonic": "xsnmaddmdp", "architecture": "PowerISA", "full_name": "VSX Scalar Negative Multiply-Add Type-M Double-Precision", "summary": "Computes the negative of the fused multiply-add of the double-precision floating-point operands, storing the result in the target scalar VSX register (Type-M: target register is used as the addend).", "description": "Performs a VSX scalar fused negative multiply-add operation on double-precision floating-point values using the Type-M form, where VRT is used as the addend operand. Computes -(VRA × VRB + VRT) and stores the result in VRT. The instruction operates on scalar elements (bits 0:63 of the VSX registers) and updates FPSCR exception flags accordingly.", "syntax": "xsnmaddmdp VRT, VRA, VRB, VRC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF0000548", "length": "32", "binary_pattern": "60 | XT | XA | XB | 1352", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "VRT[0:63] ← -(VRA[0:63] × VRB[0:63] + VRT[0:63])\nUpdate FPSCR exception flags based on floating-point result", "special_registers": "N/A", "programming_notes": "Use xsnmaddmdp for performing a fused multiply-add operation on double-precision floating-point numbers, negating the result. Ensure that the target register provides the addend, and be aware that this instruction operates as a single fused step without intermediate rounding.", "extended_mnemonics": [], "page_found": "Page 1413 - 1414", "example": "xsnmaddmdp v1, v2, v3, v4"}
{"mnemonic": "xvmsubmdp", "architecture": "PowerISA", "full_name": "VSX Vector Multiply-Subtract Type-M Double-Precision", "summary": "Multiplies corresponding double-precision floating-point elements of two VSX registers, subtracts the corresponding element of a third register, and stores the results, using the Type-M (multiplicand) form.", "description": "For each of the two double-precision floating-point elements, the instruction multiplies the corresponding elements of VRA and VRT, subtracts the corresponding element of VRB, and places the result into the corresponding element of VRT. This is the Type-M variant, meaning VRT serves as both a source (multiplicand) and the destination register. The operation computes VRT ← (VRA × VRT) - VRB for each element.", "syntax": "xvmsubmdp VRT, VRA, VRB, VRC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF00003C8", "length": "32", "binary_pattern": "111100 | VRT | VRA | VRB | 01111 | 001", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "do i = 0 to 1\n  VRT.fpr[i] ← RND(VRA.fpr[i] × VRT.fpr[i] - VRB.fpr[i])\nend", "special_registers": "N/A", "programming_notes": "This instruction is commonly used in applications requiring complex floating-point arithmetic operations, such as scientific computations and graphics processing. Ensure that the input registers (VRA, VRT, VRB) are properly aligned to avoid performance penalties or exceptions. The Type-M variant requires careful handling since VRT is both a source and destination register, which can lead to unexpected results if not managed correctly. This instruction operates at user privilege level but may raise exceptions for invalid operations like division by zero or overflow.", "extended_mnemonics": [], "page_found": "Page 1415 - 1416", "example": "xvmsubmdp v1, v2, v3, v4"}
{"mnemonic": "diexq.", "architecture": "PowerISA", "full_name": "DFP Insert Biased Exponent Quad X-form", "summary": "Inserts the biased exponent from a source register into a destination register in quad format.", "description": "Inserts a biased exponent from a source general-purpose register into a quad-precision decimal floating-point number, replacing the exponent field of the destination. The instruction requires Decimal Floating-Point (DFP) support. The update form (indicated by the dot) sets condition register field CR0 based on the result classification (zero, normal, infinity, or NaN).", "syntax": "diexq. RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC0006C4", "length": "32", "binary_pattern": "111111 | RT | RA | RB | 11011 | 00010 | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "extension": "Decimal Floating-Point", "pseudocode": "exponent ← RA[32:63]\nRT ← insert_exponent_into_DFP_quad(RB, exponent)\nif Rc = 1 then CR0 ← classify_DFP_result(RT)", "special_registers": "N/A", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": [], "page_found": "Page 1417 - 1418", "example": "diexq. r3, r4, r5"}
{"mnemonic": "sthcix", "architecture": "PowerISA", "full_name": "Store Halfword Caching Inhibited Indexed X-form", "summary": "Stores a halfword from a general-purpose register to memory, with caching inhibited.", "description": "The contents of the lower 16 bits (bits 48:63) of register RS are stored into the halfword in memory addressed by the effective address (EA). The EA is the sum of the contents of register RA and register RB. The store is performed with caching inhibited, meaning the data is written directly to memory bypassing the cache. This instruction is a privileged hypervisor instruction available in Book III.", "syntax": "sthcix RT,RB,RA", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RB", "desc": "Base Address General Purpose Register"}, {"name": "RA", "desc": "Index General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00076A", "length": "32", "binary_pattern": "31 | RS | RA | RB | 949 | /", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Base", "pseudocode": "EA ← (RA) + (RB)\nMEM(EA, 2) ← (RS)[48:63]", "special_registers": "", "programming_notes": "This instruction is used for storing data directly to memory without caching, which can be useful for ensuring data consistency in hypervisor environments. It requires supervisor privilege level and should be used with caution as it bypasses the cache, potentially affecting performance. Ensure that registers RA and RB contain valid addresses, and RS contains the data to be stored in its lower 16 bits.", "extended_mnemonics": [], "page_found": "Page 1418 - 1419", "example": "sthcix r3, r5, r4"}
{"mnemonic": "vcmpgefp.", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than or Equal Floating-Point", "summary": "Compares the elements of two vector registers and sets the result in a third vector register based on whether each element is greater than or equal to the corresponding element in the other vector.", "description": "The vcmpgefp. instruction compares corresponding single-precision floating-point elements of vector registers VRA and VRB. For each of the four 32-bit floating-point elements, if the element in VRA is greater than or equal to the corresponding element in VRB, the corresponding element in VRT is set to all 1s (0xFFFFFFFF); otherwise, it is set to all 0s (0x00000000). The dot form (vcmpgefp.) additionally updates the CR6 field of the Condition Register to reflect whether all elements, some elements, or no elements satisfied the comparison.", "syntax": "vcmpgefp. VRT, VRA, VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register A"}, {"name": "VRB", "desc": "Source Vector Register B"}], "encoding": {"format": "VC-form", "hex_opcode": "0x100001C6", "length": "32", "binary_pattern": "000100 | VRT | VRA | VRB | .0111 | 000110", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Base", "pseudocode": "for i = 0 to 7 do\n    if (VRA[i] >= VRB[i]) then\n        VRT[i] <- 1\n    else\n        VRT[i] <- 0\n    end if\nend for", "special_registers": "N/A", "programming_notes": "Use vcmpgefp. to compare four single-precision floating-point elements in two vector registers. Ensure both input vectors are properly aligned and initialized. The dot form updates CR6, indicating the comparison results, which can be useful for conditional branching.", "extended_mnemonics": [], "page_found": "Page 1419 - 1420", "example": "vcmpgefp. v1, v2, v3"}
{"mnemonic": "mulhd.", "architecture": "PowerISA", "full_name": "Multiply High Doubleword", "summary": "Multiplies the contents of two registers and places the high-order 64 bits of the product into a target register.", "description": "For mulhd., the product of the contents of register RA and RB is computed, and the high-order 64 bits of this product are placed into register RT.", "syntax": "mulhd. RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "XO-form", "hex_opcode": "0x7C000092", "length": "32", "binary_pattern": "011111 | RT | RA | RB | /0010 | 01001", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Base", "pseudocode": "if 'mulhd.' then\n    RT <- (RA) * (RB)", "special_registers": "CR0, XER", "programming_notes": "The mulhd. instruction multiplies two 64-bit integers and stores the high 64 bits of the result in a destination register. It does not affect any special registers like CR0 or XER, so developers should be cautious when relying on carry flags or overflow conditions. This instruction is commonly used in cryptographic algorithms where large integer multiplication is required without needing the lower half of the product.", "extended_mnemonics": [], "page_found": "Page 1423 - 1424", "example": "mulhd. r3, r4, r5"}
{"mnemonic": "lbzux", "architecture": "PowerISA", "full_name": "Load Byte and Zero with Update Indexed X-form", "summary": "Loads a byte from memory into a register, zero-extends it to 32 bits, and updates the base address.", "description": "The sum of the contents of general-purpose register RA and the contents of general-purpose register RB is the effective address (EA). The byte in memory addressed by EA is loaded into the low-order 8 bits of general-purpose register RT, and the remaining bits of RT are cleared to 0. The effective address EA is placed into register RA. If RA = 0 or RA = RT, the instruction form is invalid.", "syntax": "lbzux RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Base Address General Purpose Register"}, {"name": "RB", "desc": "Index General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0000EE", "length": "32", "binary_pattern": "31 | RT | RA | RB | 119 | /", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Base", "pseudocode": "EA ← (RA) + (RB)\nRT ← 0x000000 || MEM(EA, 1)\nRA ← EA", "special_registers": "N/A", "programming_notes": "The base register (RA) is updated with the effective address after the memory access. RA must not be 0 and must differ from the destination register; violating this constraint produces undefined results.", "extended_mnemonics": [], "page_found": "Page 1425 - 1426", "example": "lbzux r3, r4, r5"}
{"mnemonic": "or.", "architecture": "PowerISA", "full_name": "OR Record", "summary": "Performs a bitwise OR operation on the contents of two registers and updates the condition register.", "description": "For or., the bitwise OR of the contents of register RA and RB is placed into register RT.", "syntax": "or. RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C000378", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Base", "pseudocode": "if 'or.' then\n    RT <- (RA) OR (RB)", "special_registers": "CR0, XER", "programming_notes": "The or. instruction performs a bitwise OR operation between two registers, storing the result in another register. This instruction does not require any special alignment and can be executed at any privilege level. It is commonly used for combining flags or setting specific bits in a register.", "extended_mnemonics": [], "page_found": "Page 1426 - 1427", "example": "or. r3, r4, r5"}
{"mnemonic": "add.", "architecture": "PowerISA", "full_name": "Add Record", "summary": "Adds the contents of two registers and updates the condition register.", "description": "For add., the sum of the contents of register RA and RB is placed into register RT.", "syntax": "add. RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "XO-form", "hex_opcode": "0x7C000214", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Base", "pseudocode": "if 'add.' then\n    RT <- (RA) + (RB)", "special_registers": "CR0, XER", "programming_notes": "The add. instruction adds the values in registers RA and RB, storing the result in RT. It updates the CR0 and XER special registers to reflect overflow and carry conditions. Ensure that the operands are correctly aligned for optimal performance.", "extended_mnemonics": [], "page_found": "Page 1428 - 1429", "example": "add. r3, r4, r5"}
{"mnemonic": "fctiwuz", "architecture": "PowerISA", "full_name": "Floating Convert with truncate Double-Precision To Unsigned Word format", "summary": "Converts a double-precision floating-point number to an unsigned integer word.", "description": "The double-precision floating-point operand in FRB is converted to a 32-bit unsigned integer using truncation (round toward zero), and the result is placed in the low-order 32 bits of FRT. If the operand is a NaN or less than 0, the result is 0. If the operand is greater than the maximum unsigned 32-bit value, the result is 0xFFFFFFFF. The high-order 32 bits of FRT are undefined. The FPSCR is updated to reflect the result of the operation.", "syntax": "fctiwuz[.] FRT,FRB", "operands": [{"name": "FRT", "desc": "Target Floating Point Register"}, {"name": "FRB", "desc": "Source Floating Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC00011E", "length": "32", "binary_pattern": "18 | LI | AA | LK", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Floating-Point", "pseudocode": "if FPSCR[VXSNAN] then FRT ← undefined\nelse\n  src ← (FRB)\n  if src is NaN or src < 0 then\n    result ← 0x00000000\n    FPSCR[VXCVI] ← 1\n  else if src > 2^32 - 1 then\n    result ← 0xFFFFFFFF\n    FPSCR[VXCVI] ← 1\n  else\n    result ← truncate(src) converted to unsigned 32-bit integer\n  FRT[32:63] ← result\n  FRT[0:31] ← undefined", "special_registers": "CR0, XER, FPSCR", "programming_notes": "The fctiwuz instruction converts a double-precision floating-point number to an unsigned 32-bit integer by truncating towards zero. If the input is NaN, negative, or exceeds the maximum unsigned 32-bit value, it results in 0 or 0xFFFFFFFF respectively, and sets VXCVI in FPSCR. The high-order bits of FRT are undefined after this operation.", "extended_mnemonics": [], "page_found": "Page 1432 - 1433", "example": "fctiwuz[.] f1, f3"}
{"mnemonic": "lfsx", "architecture": "PowerISA", "full_name": "Load Floating-Point Single Indexed X-form", "summary": "Loads a single-precision floating-point value from memory into a floating-point register.", "description": "Loads a single-precision floating-point value from memory into a floating-point register using indexed addressing. The effective address is computed as RA + RB. If RA is 0, the address is simply RB. The instruction does not affect condition registers or exception flags; any floating-point exceptions are determined by the loaded value itself.", "syntax": "lfsx FT,RA,RB", "operands": [{"name": "FT", "desc": "Target Floating-Point Register"}, {"name": "RA", "desc": "Index General Purpose Register"}, {"name": "RB", "desc": "Base General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00042E", "length": "32", "binary_pattern": "011111 | FT | RA | RB | 10000 | 10111 | Rc", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Floating-Point", "pseudocode": "EA ← (RA = 0) ? RB : RA + RB\nFT ← [EA:EA+3]", "special_registers": "CR0, FPSCR", "programming_notes": "The lfsx instruction is commonly used to load single-precision floating-point values from memory into a floating-point register. Ensure that the base and index registers contain valid addresses, and be aware of potential alignment issues that may affect performance or cause exceptions. This instruction operates at user privilege level.", "extended_mnemonics": [], "page_found": "Page 1433 - 1434", "example": "lfsx f1, r4, r5"}
{"mnemonic": "pstfd", "architecture": "PowerISA", "full_name": "Prefixed Store Floating-Point Double MLS:D-form", "summary": "Stores a double-precision floating-point value from a register to memory.", "description": "Stores a double-precision floating-point value from a floating-point register to memory using a prefixed instruction format (64 bits total: 32-bit prefix + 32-bit instruction). The addressing mode uses a base register and a displacement that can be formed from the prefix and suffix portions, allowing for a wider displacement range than non-prefixed forms. This instruction does not update condition registers.", "syntax": "pstfd FRT,RA,RB", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "RA", "desc": "Base General Purpose Register"}, {"name": "RB", "desc": "Offset General Purpose Register"}], "encoding": {"format": "MLS:D-form", "hex_opcode": "0x06000000D8000000", "length": "64", "binary_pattern": "01 | 100 | Rc | .//.. | FRT | RA | RB", "bit_positions": "0:5 | 6:10 | 11 | 12 | 13:17 | 18:22 | 23:63"}, "extension": "Prefixed", "pseudocode": "displacement ← (prefix_immediate || suffix_immediate) [sign-extended to 64 bits]\nEA ← RA + displacement\n[EA:EA+7] ← FRT[0:63]", "special_registers": "N/A", "programming_notes": "The pstfd instruction is used to store a double-precision floating-point value from a register into memory. Ensure that the effective address calculation does not result in an overflow or underflow. This instruction requires the EA to be aligned on an 8-byte boundary for optimal performance and correctness.", "extended_mnemonics": [], "page_found": "Page 1437 - 1438", "example": "pstfd f1, r4, r5"}
{"mnemonic": "stwcix", "architecture": "PowerISA", "full_name": "Store Word Caching Inhibited Indexed X-form", "summary": "Stores a word from a source register to memory with caching inhibited.", "description": "Stores a 32-bit word from register RS to memory at the address formed by adding RA and RB, with caching inhibited to bypass L1 cache. This instruction is used for I/O operations and memory-mapped device access where cache coherency is not desired. No condition registers or status fields are modified.", "syntax": "stwcix RS,RA,RB", "operands": [{"name": "RS", "desc": "Source General Purpose Register"}, {"name": "RA", "desc": "Base Address General Purpose Register"}, {"name": "RB", "desc": "Index General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00072A", "length": "32", "binary_pattern": "0 | RS | RA | RB | 11100 | 10101", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "Base", "pseudocode": "EA ← (RA) + (RB)\n[EA] ← (RS)[32:63]", "special_registers": "N/A", "programming_notes": "The stwcix instruction is used to store a 32-bit word from a register to memory with caching inhibited, which can be useful for ensuring data consistency between the CPU and external storage. This instruction requires hypervisor privilege (level HV) and should be used sparingly due to its performance impact. Ensure that the destination address is properly aligned to avoid potential exceptions.", "extended_mnemonics": [], "page_found": "Page 1438 - 1439", "example": "stwcix r3, r4, r5"}
{"mnemonic": "vextuwrx", "architecture": "PowerISA", "full_name": "Vector Extract Unsigned Word to GPR using GPR-specified Right-Index VX-form", "summary": "Extracts an unsigned word from a vector register and places it into a general-purpose register.", "description": "Extracts a 32-bit unsigned word from vector register RB using a byte-offset index contained in GPR RA, and places the extracted value into GPR VRT. The index specifies which 4-byte element to extract from the 128-bit vector. This instruction requires VMX/AltiVec support and no condition flags are affected.", "syntax": "vextuwrx VRT,RA,RB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "RA", "desc": "Source General Purpose Register (index)"}, {"name": "RB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000078D", "length": "32", "binary_pattern": "000100 | VRT | // | RA | 10100 | 001100", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VMX (AltiVec)", "pseudocode": "idx ← (RA)[29:31] || 0b00\nVRT ← (RB)[idx*8 : idx*8+31]", "special_registers": "N/A", "programming_notes": "Use vextuwrx to extract a 32-bit unsigned word from a vector register using a right-index specified by a GPR. Ensure the index is correctly calculated to avoid out-of-bounds access. The result is zero-extended to 64 bits before being stored in the target GPR.", "extended_mnemonics": [], "page_found": "Page 1442 - 1443", "example": "vextuwrx v1, r4, r5"}
{"mnemonic": "vmul10ecuq", "architecture": "PowerISA", "full_name": "Vector Multiply-by-10 Extended & write Carry-out Unsigned Quadword", "summary": "Multiplies the unsigned quadword integer in vector register VA by 10, adds the least-significant bit of VB as a carry-in digit, and writes the carry-out of the result to vector register VX.", "description": "Multiplies the unsigned 128-bit quadword in vector register VA by 10, adds the least-significant bit of VB as a carry-in, and writes only the carry-out (overflow) of the result to vector register VX. The result discards the low 128 bits, retaining only the high carry. This instruction requires VMX/AltiVec support and no condition registers are modified.", "syntax": "vmul10ecuq VX,VA,VB", "operands": [{"name": "VX", "desc": "Target Vector Register"}, {"name": "VA", "desc": "Source Vector Register"}, {"name": "VB", "desc": "Source Vector Register"}], "encoding": {"format": "VX-form", "hex_opcode": "0x10000041", "length": "32", "binary_pattern": "000100 | VX | VA | VB | 00001 | 000001", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VMX (AltiVec)", "pseudocode": "product ← (VA) × 10 + ((VB)[127] as carry-in)\nVX ← product[128:191]", "special_registers": "N/A", "programming_notes": "This instruction is ideal for high-performance multi-precision decimal arithmetic, especially when performing chained multiply-by-10 operations. Ensure that the input values in VA and VB are correctly aligned as unsigned 128-bit integers to avoid unexpected results. The carry-out written to VX should be used as the extended carry-in for subsequent operations to maintain precision.", "extended_mnemonics": [], "page_found": "Page 1444 - 1445", "example": "vmul10ecuq v1, v2, v2"}
{"mnemonic": "vpkswus", "architecture": "PowerISA", "full_name": "Vector Pack Signed Word Unsigned Saturate", "summary": "Packs signed words from two source vectors into one destination vector with unsigned saturation.", "description": "Packs signed 32-bit word elements from vectors VSRA and VSRB into 16-bit unsigned elements in VRT, saturating to the unsigned 16-bit range [0, 65535] if any source element overflows. The operation interleaves words from VSRA and VSRB into the result. This instruction requires VMX/AltiVec support and no condition registers are modified.", "syntax": "vpkswus VRT,VSRA,VSRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VSRA", "desc": "Source Vector Register A"}, {"name": "VSRB", "desc": "Source Vector Register B"}], "encoding": {"format": "VX-form", "hex_opcode": "0x1000014E", "length": "32", "binary_pattern": "000100 | VRT | VSRA | VSRB | 00101 | 001110", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:31"}, "extension": "VMX (AltiVec)", "pseudocode": "for i in 0..3:\n  VRT[i*16 : i*16+15] ← saturate_unsigned_16bit(VSRA[i*32 : i*32+31])\n  VRT[(i+4)*16 : (i+4)*16+15] ← saturate_unsigned_16bit(VSRB[i*32 : i*32+31])", "special_registers": "N/A", "programming_notes": "The vpkswus instruction is useful for efficiently packing and converting signed 32-bit integers to unsigned 16-bit integers with saturation. Ensure that the input vectors are correctly aligned and that the operation does not exceed the bounds of the target vector register. This instruction operates at user privilege level and will raise an exception if any invalid operand access occurs.", "extended_mnemonics": [], "page_found": "Page 1445 - 1446", "example": "vpkswus v1, vs2, vs3"}
{"mnemonic": "cpabort", "architecture": "PowerISA", "full_name": "Copy-Paste Abort", "summary": "Aborts any in-progress copy-paste operation, discarding any pending copy target set by a previous Copy instruction.", "description": "Aborts any in-progress copy-paste operation initiated by a previous Copy instruction, discarding the pending copy buffer and resetting the copy-paste state. This is a privileged Base instruction that has no operands and does not modify any condition or status registers.", "syntax": "cpabort", "operands": [], "encoding": {"format": "X-form", "hex_opcode": "0x7C00068C", "length": "32", "binary_pattern": "31 | / | / | / | 838 | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Base", "pseudocode": "CopyPasteState ← ABORT", "special_registers": "N/A", "programming_notes": "Use cpabort to safely terminate an ongoing copy-paste sequence, preventing any subsequent paste operations from completing with the reserved data. This is useful in error handling scenarios where a copy operation needs to be aborted without allowing further processing of the copied data. Ensure that cpabort is called at the appropriate privilege level and consider its impact on performance if used frequently.", "extended_mnemonics": [], "page_found": "Page 1457 - 1458", "example": "cpabort"}
{"mnemonic": "pmxvf32gerpp", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector 32-bit Floating-Point GER (rank-1 update) Positive multiply, Positive accumulate", "summary": "Performs a prefixed masked VSX vector 32-bit floating-point GER rank-1 update with positive multiply and positive accumulate.", "description": "A prefixed MMA instruction that performs a masked rank-1 matrix update using 32-bit floating-point elements, with positive multiply (no sign flip) and positive accumulate semantics. The prefix word controls masking and additional configuration. This instruction requires MMA support and updates the accumulator register; no condition registers are directly modified by this operation.", "syntax": "pmxvf32gerpp", "operands": [], "encoding": {"format": "MMIRR:XX3-form", "hex_opcode": "0x07900000EC0000D0", "length": "32", "binary_pattern": "59 | AT | / | XA | XB | 26 | AX | BX | /", "bit_positions": "0:5 | 6:8 | 9:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "extension": "MMA", "pseudocode": "Accumulator ← Accumulator + (masked_multiply_by_vsrX(XA) ⊗ masked_multiply_by_vsrY(XB))", "special_registers": "N/A", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "extended_mnemonics": [], "page_found": "Page 1458 - 1459", "example": "pmxvf32gerpp"}
{"mnemonic": "drrnd.", "architecture": "PowerISA", "full_name": "DFP Reround", "summary": "Rerounds a decimal floating-point number to the specified precision.", "description": "Rerounds a decimal floating-point number from FRB to the precision specified by the rounding mode control, placing the result in FRA and setting CR1 based on the result (if Rc=1). The instruction handles overflow, underflow, and inexact exceptions according to FPSCR settings. This instruction requires Decimal Floating-Point support and modifies CR1 and FPSCR when Rc is set.", "syntax": "drrnd. FRT,FRA,FRB,RMC", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRA", "desc": "Source Floating-Point Register containing the reference significance"}, {"name": "FRB", "desc": "Source Floating-Point Register containing the value to be rounded"}, {"name": "RMC", "desc": "Rounding Mode Control"}, {"name": "k", "desc": "Number of significant digits"}], "encoding": {"format": "Z23-form", "hex_opcode": "0xEC000046", "length": "32", "binary_pattern": "0 | FRT | FRA | FRB | RMC | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Decimal Floating-Point", "pseudocode": "FRA ← dround(FRB, RMC)\nif Rc = 1 then CR1 ← (FRA_exception_flags)", "special_registers": "FPSCR, CR0", "programming_notes": "The drrnd instruction is used to reround a decimal floating-point number in register RA according to the rounding mode specified in the FPSCR. Ensure that the FPSCR's rounding mode is set appropriately before executing this instruction to achieve the desired precision. This instruction operates at user privilege level and does not raise exceptions under normal circumstances, but it may alter the contents of CR0 if an exception occurs during execution.", "extended_mnemonics": [], "page_found": "Page 252 - 254", "example": "drrnd. r4, r5"}
{"mnemonic": "lvehx", "architecture": "PowerISA", "full_name": "Load Vector Element Halfword Indexed X-form", "summary": "Loads a halfword element from memory into the corresponding halfword element of a vector register, with the address computed as the sum of RA and RB, aligned to a halfword boundary.", "description": "Loads a halfword (16-bit) element from memory at the address formed by RA + RB into the corresponding halfword element of vector register VRT. The effective address is aligned to a halfword boundary. This is a VMX/AltiVec instruction with no effect on condition or status registers.", "syntax": "lvehx VX,RA,RB", "operands": [{"name": "VX", "desc": "Target VSX Register"}, {"name": "RA", "desc": "Base Address General Purpose Register"}, {"name": "RB", "desc": "Index General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C00004E", "length": "32", "binary_pattern": "31 | VRT | RA | RB | 39 | /", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VMX (AltiVec)", "pseudocode": "EA ← (RA) + (RB)\nVRT[element] ← MEM(EA, 2)", "special_registers": "N/A", "programming_notes": "The lvehx instruction loads a halfword from memory into a specific element of a vector register. Ensure the effective address is halfword-aligned to avoid alignment faults. The operation does not require any special privileges, but it may raise an exception if the access violates memory protection rules.", "extended_mnemonics": [], "page_found": "Page 1467 - 1468", "example": "lvehx v1, r4, r5"}
{"mnemonic": "plxv", "architecture": "PowerISA", "full_name": "Prefixed Load VSX Vector 8LS:D-form", "summary": "Loads a 128-bit VSX vector from memory into a VSX register using a prefixed instruction with a large displacement.", "description": "Loads a 128-bit VSX vector from memory into VSX register RT using a prefixed instruction with a 34-bit signed displacement. The address is computed as RA + displacement (scaled by 4). This is a VSX instruction requiring the VSX category and the Prefixed instruction set.", "syntax": "plxv RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "D-form", "hex_opcode": "0x04000000C8000000", "length": "64", "binary_pattern": "000001 | 000 | Rc | .//.. | RT | RA | RB", "bit_positions": "0:5 | 6:8 | 9 | 10 | 11:15 | 16:20 | 21:63"}, "extension": "Prefixed", "pseudocode": "EA ← (RA) + (DQ || Disp)\nRT ← MEM(EA, 16)", "special_registers": "N/A", "programming_notes": "The plxv instruction is used for loading a 128-bit VSX vector from memory into a target register, using an extended displacement field provided by the prefix word. Ensure that the base address register (RA) contains the correct pointer or is zero if no base address is needed. This instruction requires the VSX facility and is available in PowerISA v3.1 and later.", "extended_mnemonics": [], "page_found": "Page 1470 - 1471", "example": "plxv r3, r4, r5"}
{"mnemonic": "pmxvf64gernn", "architecture": "PowerISA", "full_name": "Prefixed Masked VSX Vector 64-bit Floating-Point GER (rank-1 update) Negative multiply, Negative accumulate", "summary": "Performs a prefixed masked VSX vector 64-bit floating-point GER (rank-1 update) with negative multiply and negative accumulate.", "description": "A prefixed MMA instruction that performs a masked 64-bit floating-point GER (generalized matrix element rank-1 update) with negative multiply and negative accumulate into an accumulator. The operation updates a 4×4 matrix accumulator using VSX registers with optional row and column masking. This instruction requires MMA support and updates FPSCR.", "syntax": "pmxvf64gernn AT,XAp,XB,XMSK,YMSK", "operands": [{"name": "AT", "type": "ACC", "desc": "Target accumulator. ACC[AT] holds a 4x2 matrix of double-precision values."}, {"name": "XAp", "type": "VSR", "desc": "Source VSR pair (even/odd). VSR[XAp] and VSR[XAp+1] are concatenated to supply the four row values."}, {"name": "XB", "type": "VSR", "desc": "Source VSR supplying the two column values."}, {"name": "XMSK", "type": "imm4", "desc": "4-bit row mask. Row i is updated only when bit i is 1; a masked-off element is set to zero."}, {"name": "YMSK", "type": "imm2", "desc": "2-bit column mask. Column j is updated only when bit j is 1; a masked-off element is set to zero."}], "encoding": {"format": "MMIRR:XX3-form", "hex_opcode": "0x07900000EC0007D0", "length": "64", "binary_pattern": "000001 | 11100 | 1 | Rc | // | ///.. | ?", "bit_positions": "0:5 | 6:10 | 11 | 12 | 13 | 14 | 15:63"}, "extension": "MMA", "pseudocode": "vsrcX ← VSR[XAp] || VSR[XAp+1]\nvsrcY ← VSR[XB]\ndo i = 0 to 3\n  do j = 0 to 1\n    if XMSK.bit[i]=1 & YMSK.bit[j]=1 then\n      ACC[AT][i].dword[j] ← -( vsrcX.dword[i] × vsrcY.dword[j] + ACC[AT][i].dword[j] )\n    else\n      ACC[AT][i].dword[j] ← 0", "special_registers": "N/A", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER.", "extended_mnemonics": [], "page_found": "Page 1471 - 1472", "example": "pmxvf64gernn"}
{"mnemonic": "pstfs", "architecture": "PowerISA", "full_name": "Prefixed Store Floating-Point Single MLS:D-form", "summary": "Stores a single-precision floating-point value from a register to memory.", "description": "The double-precision floating-point value in register FRS is converted to single-precision and stored as a 32-bit single-precision value at the effective address (EA). The EA is formed by adding the sign-extended 34-bit immediate displacement D to the contents of general-purpose register RA (or zero if RA=0). This is the prefixed form of the stfs instruction, allowing a larger displacement field than the non-prefixed variant.", "syntax": "pstfs FRT,RA,RB", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "RA", "desc": "Base General Purpose Register"}, {"name": "RB", "desc": "Offset General Purpose Register"}], "encoding": {"format": "MLS:D-form", "hex_opcode": "0x06000000D0000000", "length": "64", "binary_pattern": "000001 | 100 | Rc | .//.. | FRT | RA | RB", "bit_positions": "0:5 | 6:10 | 11 | 12:16 | 17:21 | 22:26 | 27:63"}, "extension": "Floating-Point", "pseudocode": "EA ← (RA|0) + D\nMEM(EA, 4) ← SINGLE(FRS)", "special_registers": "N/A", "programming_notes": "The pstfs instruction is useful for storing single-precision floating-point values with an extended displacement. Ensure that the EA calculation does not result in an invalid memory address to avoid exceptions. This instruction operates at user privilege level and requires proper alignment of the EA for optimal performance.", "extended_mnemonics": [], "page_found": "Page 1472 - 1473", "example": "pstfs f1, r4, r5"}
{"mnemonic": "srad.", "architecture": "PowerISA", "full_name": "Shift Right Algebraic Doubleword", "summary": "Shifts the contents of a doubleword register right algebraically, shifting in sign bits.", "description": "The contents of register RA are shifted right by the number of bits specified by the low-order 7 bits of register RB. Bits shifted out of position 63 are lost. Sign bits are shifted into the high-order bits, replicating the sign bit (RA[0]). If the shift amount is greater than 63, each bit of the result is equal to the sign bit of RA. The XER[CA] bit is set if the result is negative and any '1' bits are shifted out; otherwise XER[CA] is cleared. If the Rc bit is set, CR0 is updated.", "syntax": "srad. RT,RA,RB", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RA", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C000634", "length": "32", "binary_pattern": "31 | RS | RA | RB | 794 | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Base", "pseudocode": "n ← rB[58:63]\nif rB[57] = 0 then\n   r ← ROTL64(rA, 64-n)\n   mask ← MASK(n, 63)\n   rT ← r & mask | (64)rA[0] & ¬mask\nelse\n   rT ← (64)rA[0]\nXER[CA] ← rA[0] & (rT ≠ rA)\nXER[CA32] ← rA[0] & (rT[32:63] ≠ rA[32:63])", "special_registers": "CR0, XER", "programming_notes": "The srad. instruction is commonly used for right-shifting signed integers while preserving the sign bit. Be cautious with shift amounts greater than 63, as they result in a full replication of the sign bit. The XER[CA] flag indicates if negative bits were shifted out, which can be useful for overflow detection. Ensure that register RB contains a valid shift amount to avoid unexpected results.", "extended_mnemonics": [], "page_found": "Page 1473 - 1474", "example": "srad. r3, r4, r5"}
{"mnemonic": "stvxl", "architecture": "PowerISA", "full_name": "Store Vector Indexed Last", "summary": "Stores a vector element to memory, with the last element being stored if the index is out of bounds.", "description": "Stores a vector from register VS to memory at the address formed by RA + RB. The address is aligned to the vector element size. This is a Base category instruction with no effect on condition or status registers.", "syntax": "stvxl VS,RA,RB", "operands": [{"name": "VS", "desc": "Vector Register"}, {"name": "RA", "desc": "Base Address General Purpose Register"}, {"name": "RB", "desc": "Index General Purpose Register"}], "encoding": {"format": "X-form", "hex_opcode": "0x7C0003CE", "length": "32", "binary_pattern": "31 | VS | RA | RB | 487 | /", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "Base", "pseudocode": "EA ← (RA) + (RB)\nMEM(EA, 16) ← VS", "special_registers": "N/A", "programming_notes": "Use stvxl when storing vector data with a 'last touch' hint, potentially reducing cache line allocations. Ensure RA and RB are correctly set to form the aligned 16-byte address. This instruction is useful for optimizing memory usage in performance-critical sections.", "extended_mnemonics": [], "page_found": "Page 1474 - 1475", "example": "stvxl vs1, r4, r5"}
{"mnemonic": "xvcvuxdsp", "architecture": "PowerISA", "full_name": "VSX Vector Convert with round Unsigned Doubleword to Single-Precision format", "summary": "Converts an unsigned doubleword to a single-precision floating-point value with rounding.", "description": "Converts a 64-bit unsigned doubleword integer (in the doubleword elements of VS64) to 32-bit single-precision floating-point format with rounding and stores the result in the corresponding word elements of VS32. This is a VSX instruction that performs IEEE-compliant rounding and may update FPSCR.", "syntax": "xvcvuxdsp VS32,VS64", "operands": [{"name": "VS32", "desc": "Target Vector Register"}, {"name": "VS64", "desc": "Source Vector Register"}], "encoding": {"format": "XX2-form", "hex_opcode": "0xF00006A0", "length": "32", "binary_pattern": "111100 | VS32 | // | VS64 | 11010 | 1000", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "for i in 0 to 1:\n  VS32[2*i:2*i+1] ← CONVERT_UNSIGNED_DWORD_TO_SINGLE_PRECISION_ROUNDED(VS64[i])", "special_registers": "N/A", "programming_notes": "This instruction is useful for converting unsigned 64-bit integers to single-precision floating-point numbers. Ensure that the source vector elements are properly aligned and consider the current rounding mode's effect on conversion results. The target vector register will have its lower words zeroed out, so handle this if you need to preserve data in those positions.", "extended_mnemonics": [], "page_found": "Page 1489 - 1490", "example": "xvcvuxdsp vs1, vs1"}
{"mnemonic": "xvnmsubmdp", "architecture": "PowerISA", "full_name": "VSX Vector Negative Multiply-Subtract Type-M Double-Precision", "summary": "Performs a negative multiply-subtract operation on double-precision floating-point values.", "description": "For each double-precision floating-point element, the instruction multiplies the corresponding elements of VRA and VRT, subtracts the corresponding element of VRB from the product, negates the result, and stores it in VRT. This is the Type-M variant, meaning VRT serves as both a source operand (multiplicand) and the destination register. The operation is performed in double-precision floating-point arithmetic with IEEE 754 rounding rules applied.", "syntax": "xvnmsubmdp VRT, VRA, VRB, VRC", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}, {"name": "VRC", "desc": "Source Vector Register"}], "encoding": {"format": "XX3-form", "hex_opcode": "0xF00007C8", "length": "32", "binary_pattern": "60 | XT | XA | XB | 1992", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "do i = 0 to 1\n  VRT.dword[i] ← RoundFP64(-(FP64(VRA.dword[i]) × FP64(VRT.dword[i])) - FP64(VRB.dword[i]))", "special_registers": "FPSCR", "programming_notes": "This instruction is commonly used in scenarios requiring complex floating-point arithmetic operations, such as in scientific computations or graphics processing. Be cautious of potential overflow or underflow conditions due to the nature of double-precision multiplication and subtraction. Ensure that VRT is properly aligned for optimal performance, as misalignment can lead to significant slowdowns. This instruction operates at user privilege level but may generate exceptions if invalid operations occur, such as division by zero or NaN results.", "extended_mnemonics": [], "page_found": "Page 1491 - 1492", "example": "xvnmsubmdp v1, v2, v3, v4"}
{"mnemonic": "xscvqpudz", "architecture": "PowerISA", "full_name": "VSX Scalar Convert with round to zero Quad-Precision to Unsigned Doubleword format X-form", "summary": "Converts a quad-precision floating-point value to an unsigned doubleword integer, rounding towards zero.", "description": "The instruction converts the quad-precision floating-point value in VSR[VRB+32] to an unsigned doubleword integer, rounding towards zero. The result is placed into doubleword element 0 of VSR[VRT+32]. Doubleword element 1 of VSR[VRT+32] is set to 0.", "syntax": "xscvqpudz VRT,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC110688", "length": "32", "binary_pattern": "63 | VRT | 17 | VRB | 836 | /", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "extension": "VSX", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nreset_xflags()\nsrc ←bfp_CONVERT_FROM_BFP128(VSR[VRB+32])\nvxsnan_flag ←0\nvxcvi_flag ←0\nif src.class.QNaN=1 | src.class.SNaN=1 then do\n    result ←0x0000_0000_0000_0000\n    vxsnan_flag ←src.class.SNaN\n    vxcvi_flag ←1\nend else if src.class.Infinity=1 then do\n    vxcvi_flag ←1\n    if src.sign=0 then\n        result ←0xFFFF_FFFF_FFFF_FFFF\n    else\n        result ←0x0000_0000_0000_0000\n    end\nend else if src.class.Zero then\n    result ←0x0000_0000_0000_0000\nelse do\n    rnd ←bfp_ROUND_TO_INTEGER(0b001,src)\n    if bfp_COMPARE_GT(rnd, +264-1) then do\n        result ←0xFFFF_FFFF_FFFF_FFFF\n        vxcvi_flag ←1\n    end else if bfp_COMPARE_LT(rnd, 0) then do\n        result ←0x0000_0000_0000_0000\n        vxcvi_flag ←1\n    end else do\n        result ←ui64_CONVERT_FROM_BFP(rnd)\n        if xx_flag=1 then SetFX(FPSCR.XX)\n    end\nend\nif vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\nif vxcvi_flag=1  then SetFX(FPSCR.VXCVI)\nvx_flag ←vxsnan_flag | vxcvi_flag\nex_flag ←FPSCR.VE & vx_flag\nif ex_flag=0 then do\n    VSR[VRT+32].dword[0] ←result\n    VSR[VRT+32].dword[1] ←0x0000_0000_0000_0000\nend\nFPSCR.FR ←(vx_flag=0) & inc_flag\nFPSCR.FI ←(vx_flag=0) & xx_flag", "special_registers": "FPSCR.FPRF, FPSCR.FR, FPSCR.FI, FPSCR.XX, FPSCR.VXSNAN, FPSCR.VXCVI", "programming_notes": "This instruction is used to convert a quad-precision floating-point number to an unsigned doubleword integer, rounding towards zero. Ensure the VSX facility is enabled; otherwise, it will raise an exception. Be cautious of NaNs and infinities, as they result in specific values and set condition flags. The operation does not require any particular alignment or privilege level.", "extended_mnemonics": [], "page_found": "Page 865 - 866", "example": "xscvqpudz v1, v3"}
{"mnemonic": "mulldo", "architecture": "PowerISA", "full_name": "Multiply Low Doubleword (Overflow)", "summary": "Multiplies the contents of two registers and places the low-order 64 bits of the product into a target register.", "syntax": "mulldo RT,RA,RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 233 | Rc", "hex_opcode": "0x7C0001D2", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "233", "clean": "233"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target"}, {"name": "RA", "desc": "Src 1"}, {"name": "RB", "desc": "Src 2"}], "pseudocode": "prod0:127 ← (RA) × (RB)\nRT ← prod0:63\nif OE=1 then\n    OV and OV32 are set to 1 if the product cannot be represented in 64 bits.", "example": "mulld r3, r4, r5", "example_note": "64-bit multiply.", "extension": "Base", "description": "The 64-bit operands are (RA) and (RB). The low-order 64 bits of the 128-bit product of the operands are placed into register RT. Both operands and the product are interpreted as signed integers.", "special_registers": "CR0, XER", "programming_notes": "The XO-form Multiply instructions may execute faster on some implementations if RB contains the operand having the smaller absolute value.", "page_found": "Page 120 - 122"}
{"mnemonic": "not.", "architecture": "PowerISA", "full_name": "Complement Register (Record)", "summary": "Complements the contents of one register and places the result into another register.", "syntax": "not. Rx,Ry", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RS | 124 | /", "hex_opcode": "0x7C0000F8", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RS", "clean": "RS"}, {"raw": "124", "clean": "124"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "Rx", "desc": "Target General Purpose Register"}, {"name": "Ry", "desc": "Source General Purpose Register"}], "extension": "Base", "description": "The 'not' instruction complements the contents of register Ry and places the result into register Rx. This mnemonic can be coded with a final '.' to cause the Rc bit to be set in the underlying instruction.", "pseudocode": "if 'not' then\n    Rx <- ~Ry\nif 'not.' then\n    Rx <- ~Ry\n    Rc = 1", "special_registers": "CR0, XER", "page_found": "Page 1001 - 1002", "programming_notes": "The 'not' instruction is commonly used for bitwise negation of a register's contents. Be cautious with the '.' suffix as it affects the condition register (CR0) by setting the Rc bit, which can impact subsequent conditional branches. Ensure that the registers are properly aligned and accessible at the privilege level required for execution.", "example": "not r3, r4"}
{"mnemonic": "rlwinm.", "architecture": "PowerISA", "full_name": "Rotate Left Word Immediate Then AND with Mask (Record)", "summary": "Rotates the low-order 32 bits of a register left by a specified number of bit positions, generates a mask, and performs an AND operation.", "syntax": "rlwinm. RA,RS,SH,MB,ME", "encoding": {"format": "M-form", "binary_pattern": "21 | RS | RA | SH | MB | ME | Rc", "hex_opcode": "0x54000000", "visual_parts": [{"raw": "21", "clean": "21"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "SH", "clean": "SH"}, {"raw": "MB", "clean": "MB"}, {"raw": "ME", "clean": "ME"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "SH", "desc": "Shift"}, {"name": "MB", "desc": "Mask Begin"}, {"name": "ME", "desc": "Mask End"}], "extension": "Base", "description": "The contents of register RS are rotated32 left SH bits. A mask is generated having 1-bits from bit MB+32 through bit ME+32 and 0-bits elsewhere. The rotated data are ANDed with the generated mask and the result is placed into register RA.", "pseudocode": "if 'rlwinm' then\n    n ← SH\n    r ← ROTL32((RS)32:63, n)\n    m ← MASK(MB+32, ME+32)\n    RA ← r & m", "special_registers": "CR0", "programming_notes": "Let RSL represent the low-order 32 bits of register RS, with the bits numbered from 0 through 31. rlwinm can be used to extract an n-bit field that starts at bit position b in RSL, right-justified into the low-order 32 bits of register RA (clearing the remaining 32-n bits of the low-order 32 bits of RA), by setting SH=b+n, MB=32-n, and ME=31. It can be used to extract an n-bit field that starts at bit position b in RSL, left-justified into the low-order 32 bits of register RA (clearing the remaining 32-n bits of the low-order 32 bits of RA), by setting SH=b, MB = 0, and ME=n-1. It can be used to rotate the contents of the low-order 32 bits of a register left (right) by n bits, by setting SH=n (32-n), MB=0, and ME=31. It can be used to shift the contents of the low-order 32 bits of a register right by n bits, by setting SH=32-n, MB=n, and ME=31. It can be used to clear the high-order b bits of the low-order 32 bits of the contents of a register and then shift the result left by n bits, by setting SH=n, MB=b-n, and ME=31-n. It can be used to clear the low-order n bits of the low-order 32 bits of a register, by setting SH=0, MB=0, and ME=31-n.", "extended_mnemonics": [{"mnemonic": "extlwi", "equivalent_to": "rlwinm RA,RS,b,0,n-1"}, {"mnemonic": "srwi", "equivalent_to": "rlwinm RA,RS,32-n,n,31"}, {"mnemonic": "clrrwi", "equivalent_to": "rlwinm RA,RS,0,0,31-n"}, {"name": "extlwi", "equivalent_to": "rlwinm RA,RS,b,0,n-1"}, {"name": "srwi", "equivalent_to": "rlwinm RA,RS,32-n,n,31"}, {"name": "clrrwi", "equivalent_to": "rlwinm RA,RS,0,0,31-n"}], "page_found": "Page 142 - 144", "example": "rlwinm r4, r3, 3, 0, 31"}
{"mnemonic": "rlwnm.", "architecture": "PowerISA", "full_name": "Rotate Left Word Then AND with Mask (Record)", "summary": "Rotates the contents of register RS left by the number of bits specified by (RB)59:63, and then performs a bitwise AND operation with a mask.", "syntax": "rlwnm. RT,RS,RB,MB,ME", "encoding": {"format": "M-form", "binary_pattern": "23 | RS | RA | RB | MB | ME | Rc", "hex_opcode": "0x5C000000", "visual_parts": [{"raw": "23", "clean": "23"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "MB", "clean": "MB"}, {"raw": "ME", "clean": "ME"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RB", "desc": "Shift Reg"}, {"name": "MB", "desc": "Mask Begin"}, {"name": "ME", "desc": "Mask End"}, {"name": "RT", "desc": "Target General Purpose Register"}], "extension": "Base", "description": "The contents of register RS are rotated 32 left the number of bits specified by (RB)59:63. A mask is generated having 1-bits from bit MB+32 through bit ME+32 and 0-bits elsewhere. The rotated data are ANDed with the generated mask and the result is placed into register RA.", "pseudocode": "if 'rlwnm' then\n    n ← (RB)59:63\n    r ← ROTL32((RS)32:63, n)\n    m ← MASK(MB+32, ME+32)\n    RA ← r & m\nelse if 'rlwnm.' then\n    n ← (RB)59:63\n    r ← ROTL32((RS)32:63, n)\n    m ← MASK(MB+32, ME+32)\n    RA ← r & m", "special_registers": "CR0", "programming_notes": "RS, with the bits numbered from 0 through 31. rlwnm can be used to extract an n-bit field that starts at variable bit position b in RSL, right-justified into the low-order 32 bits of register RA (clearing the remaining 32-n bits of the low-order 32 bits of RA), by setting RB59:63=b+n, MB=32-n, and ME=31. It can be used to extract an n-bit field that starts at variable bit position b in RSL, left-justified into the low-order 32 bits of register RA (clearing the remaining 32-n bits of the low-order 32 bits of RA), by setting RB59:63=b, MB = 0, and ME=n-1. It can be used to rotate the contents of the low-order 32 bits of a register left (right) by variable n bits, by setting RB59:63=n (32-n), MB=0, and ME=31.", "extended_mnemonics": [{"mnemonic": "rotlw", "equivalent_to": "rlwnm RA,RS,RB,0,31"}, {"mnemonic": "rotlw.", "equivalent_to": "rlwnm. RA,RS,RB,0,31"}], "page_found": "Page 144 - 146", "example": "rlwnm r3, r3, r5, 0, 31"}
{"mnemonic": "rldic.", "architecture": "PowerISA", "full_name": "Rotate Left Doubleword Immediate Clear (Record)", "summary": "Rotates a 64-bit register left, then clears bits based on a mask. 64-bit equivalent of rlwinm.", "syntax": "rldic. RT,RA,RB,MB", "encoding": {"format": "MD-form", "binary_pattern": "30 | RS | RA | SH | MB | 2 | sh Rc", "hex_opcode": "0x78000008", "visual_parts": [{"raw": "30", "clean": "30"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "SH", "clean": "SH"}, {"raw": "MB", "clean": "MB"}, {"raw": "00", "clean": "00"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "SH", "desc": "Shift Amount"}, {"name": "MB", "desc": "Mask Begin"}, {"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RB", "desc": "Immediate Value for SH (Shift Amount)"}], "pseudocode": "if 'rldic' then\n    SH ← sh5 || sh0:4\n    r ← ROTL64((RS), SH)\n    MB ← mb5 || mb0:4\n    m ← MASK(MB, 63-SH)\n    RA ← r & m", "example": "rldic r3, r4, 4, 10", "example_note": "Rotate left 4, clear bits 0-9.", "extension": "Base", "description": "The contents of register RS are rotated64 left SH bits. A mask is generated having 1-bits from bit MB through bit 63-SH and 0-bits elsewhere. The rotated data are ANDed with the generated mask and the result is placed into register RA.", "special_registers": "CR0", "programming_notes": "rldic can be used to clear the high-order b bits of the contents of a register and then shift the result left by n bits, by setting SH=n and MB=b-n. It can be used to clear the high-order n bits of a register, by setting SH=0 and MB=n.", "extended_mnemonics": [{"mnemonic": "clrlsldi", "equivalent_to": "rldic RA,RS,n,b-n"}, {"mnemonic": "clrlsldi.RA,RS,b,n", "equivalent_to": "rldic. RA,RS,n,b-n"}], "page_found": "Page 146 - 148"}
{"mnemonic": "extsb.", "architecture": "PowerISA", "full_name": "Extend Sign Byte (Record)", "summary": "Sign extends the low byte of a register to the full width.", "syntax": "extsb. RT,RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 954 | /", "hex_opcode": "0x7C000774", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "954", "clean": "954"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RT", "desc": "Target General Purpose Register"}], "extension": "Base", "description": "The contents of the specified byte (RS)56 are placed into RA56:63, and RA0:55 are filled with a copy of (RS)56.", "pseudocode": "if 'extsb' then\n    s ← (RS)56\n    RA56:63 ← (RS)56:63\n    RA0:55 ← 56s\nelse if 'extsb.' then\n    s ← (RS)56\n    RA56:63 ← (RS)56:63\n    RA0:55 ← 56s", "special_registers": "CR0, XER", "page_found": "Page 136 - 138", "programming_notes": "The extsb instruction is commonly used to sign-extend a byte value into a full word. Ensure the source register contains the correct byte to avoid unexpected results. This instruction operates at user privilege level and does not generate exceptions under normal conditions.", "example": "extsb r3, r3"}
{"mnemonic": "extsw.", "architecture": "PowerISA", "full_name": "Extend Sign Word (Record)", "summary": "Sign extends the low word (32-bit) to 64 bits.", "syntax": "extsw. RT,RS", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 986 | /", "hex_opcode": "0x7C0007B4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "986", "clean": "986"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Source"}, {"name": "RT", "desc": "Target General Purpose Register"}], "extension": "Base", "description": "The contents of register RS are extended to fill the upper 32 bits of register RA, and the lower 32 bits of RA are filled with a copy of the upper 32 bits of RS.", "pseudocode": "if 'extsw' then\n    s ← (RS)32\n    RA32:63 ← (RS)32:63\n    RA0:31 ← 32s\nelse if 'extsw.' then\n    s ← (RS)32\n    RA32:63 ← (RS)32:63\n    RA0:31 ← 32s", "special_registers": "CR0, XER", "page_found": "Page 138 - 140", "programming_notes": "The extsw instruction is commonly used to sign-extend a 32-bit value in RS to a 64-bit value in RA. Ensure that the source register RS contains the correct 32-bit signed integer to avoid unexpected results. This instruction operates at user privilege level and does not generate exceptions under normal circumstances.", "example": "extsw r3, r3"}
{"mnemonic": "orc.", "architecture": "PowerISA", "full_name": "OR with Complement (Record)", "summary": "Performs a bitwise OR operation between the contents of two registers and the complement of the third register.", "syntax": "orc. RA,RS,RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 412 | /", "hex_opcode": "0x7C000338", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "412", "clean": "412"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target"}, {"name": "RS", "desc": "Src A"}, {"name": "RB", "desc": "Src B"}], "extension": "Base", "description": "The contents of register RS are ORed with the complement of the contents of register RB, and the result is placed into register RA.", "pseudocode": "if 'orc' then\n    RA <- (RS) | ¬(RB)\nelse if 'orc.' then\n    RA <- (RS) | ¬(RB)\n    CR0 <- result of OR operation", "special_registers": "CR0", "page_found": "Page 135 - 136", "programming_notes": "The orc instruction is useful for setting bits in a register based on the complement of another register. Be cautious with bit manipulation as incorrect usage can lead to unexpected results. The instruction operates at user privilege level and does not generate exceptions under normal conditions. Performance may vary depending on the specific implementation and architecture.", "example": "orc r4, r3, r5"}
{"mnemonic": "mffs.", "architecture": "PowerISA", "full_name": "Move From FPSCR (Record)", "summary": "Moves the contents of the Floating-Point Status and Control Register (FPSCR) into a floating-point register.", "syntax": "mffs. FRT", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | / | / | 583 | Rc", "hex_opcode": "0xFC00048E", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "583", "clean": "583"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}], "extension": "Floating-Point", "description": "Moves the contents of the Floating-Point Status and Control Register (FPSCR) into floating-point register FRT. If Rc=1 (mffs.), the instruction updates CR1 based on the moved FPSCR value. This is a privileged instruction that does not alter FPSCR itself.", "pseudocode": "FRT ← FPSCR\nif Rc = 1 then\n  CR1 ← (FRT[0:3])", "special_registers": "FPSCR, CR1, (if, Rc=1), CR0", "extended_mnemonics": ["mffs.", "mffs"], "page_found": "Page 216 - 218", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "mffs f1"}
{"mnemonic": "mtfsf.", "architecture": "PowerISA", "full_name": "Move To FPSCR Fields (Record)", "summary": "Moves the contents of a floating-point register into specified fields of the FPSCR.", "syntax": "mtfsf. FLM,FRB,L,W", "encoding": {"format": "XFL-form", "binary_pattern": "63 | L | FLM | W | FRB | 711 | /", "hex_opcode": "0xFC00058E", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "L", "clean": "L"}, {"raw": "FLM", "clean": "FLM"}, {"raw": "W", "clean": "W"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "711", "clean": "711"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "FLM", "desc": "Field Mask"}, {"name": "FRB", "desc": "Source"}, {"name": "L", "desc": "Load Control Bit"}, {"name": "W", "desc": "Word Select Bit"}], "extension": "Floating-Point", "description": "The FPSCR is modified as specified by the FLM, L, and W fields. If L=0, the contents of register FRB are placed into the FPSCR under control of the W field and the field mask specified by FLM. If L=1, the contents of register FRB are placed into the FPSCR.", "pseudocode": "if 'mtfsf' then\n    if L=0 then\n        for i from 0 to 7 do\n            if FLMi=1 then\n                FPSCR[k] <- FRB[i+8*(1-W)]\n            end if\n        end for\n    else if L=1 then\n        FPSCR <- FRB\n    end if\nend if", "special_registers": "FPSCR, CR1", "programming_notes": "Bits 33 and 34 (FEX and VX) cannot be explicitly reset.\nIf L=1 or if L=0 and FPSCR32:35 is specified, bits 32 (FX) and 35 (OX) are set to the values of (FRB)32 and (FRB)35.", "extended_mnemonics": ["mtfsf FLM,FRB"], "page_found": "Page 220 - 222", "example": "mtfsf 0xFF, f3, 0, 0"}
{"mnemonic": "frsqrte.", "architecture": "PowerISA", "full_name": "Floating Reciprocal Square Root Estimate (Record)", "summary": "Estimates the reciprocal of the square root of a floating-point operand.", "syntax": "frsqrte. FRT,FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | 0 | 0 | FRB | 26 | /", "hex_opcode": "0xFC000034", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "26", "clean": "26"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "A estimate of the reciprocal of the square root of the floating-point operand in register FRB is placed into register FRT. The estimate placed into register FRT is correct to a precision of one part in 32 of the reciprocal of the square root of (FRB).", "special_registers": "FPSCR, CR1", "page_found": "Page 201 - 202", "pseudocode": "FRT ← estimate(1 / √FRB)", "programming_notes": "The frsqrte instruction provides a fast, approximate reciprocal square root calculation. It is useful for performance-critical applications where precision can be traded for speed. Ensure the input in FRB is positive to avoid undefined behavior. The result may need refinement for higher precision applications.", "example": "frsqrte f1, f3"}
{"mnemonic": "vcmpequb.", "architecture": "PowerISA", "full_name": "Vector Compare Equal Byte (Record)", "summary": "Compares two vector registers element by element as unsigned bytes and sets the target vector register based on the comparison.", "syntax": "vcmpequb. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "18 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000006", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "6", "clean": "6"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "The Vector Integer Compare instructions compare two VSRs element by element, interpreting the elements as unsigned or signed integers depending on the instruction, and set the corresponding element of the target VSR to all 1s if the relation being tested is true and to all 0s if the relation being tested is false.", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 15\n    src1 ←VSR[VRA+32].byte[i]\n    src2 ←VSR[VRB+32].byte[i]\n    if src1 = src2 then do\n        VSR[VRT+32].byte[i] ←0xFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].byte[i] ←0x00\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6", "programming_notes": "vcmpequb[.], vcmpequh[.], vcmpequw[.], and vcmpequd[.] can be used for unsigned or signed integers.", "page_found": "Page 413 - 414", "example": "vcmpequb v1, v2, v3"}
{"mnemonic": "vcmpequh.", "architecture": "PowerISA", "full_name": "Vector Compare Equal Halfword (Record)", "summary": "Compares each halfword of two vector registers and sets the corresponding halfword in the target register to all 1s if they are equal, otherwise all 0s.", "syntax": "vcmpequh. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000046", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "70", "clean": "70"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpequh, each halfword of VSR[VRA+32] is compared with the corresponding halfword of VSR[VRB+32]. If they are equal, the corresponding halfword in VSR[VRT+32] is set to all 1s (0xFFFF); otherwise, it is set to all 0s (0x0000).", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\n\nall_true ←1\nall_false ←1\ndo i = 0 to 7\n   src1 ←VSR[VRA+32].hword[i]\n   src2 ←VSR[VRB+32].hword[i]\n   if src1 = src2 then do\n      VSR[VRT+32].hword[i] ←0xFFFF\n      all_false ←0\n   end\n   else do\n      VSR[VRT+32].hword[i] ←0x0000\n      all_true ←0\n   end\nend\ndo i = 0 to 7\n   src1 ←VSR[VRA+32].hword[i]\n   src2 ←VSR[VRB+32].hword[i]\n   if src1 = src2 then do\n      VSR[VRT+32].hword[i] ←0xFFFF\n      all_false ←0\n   end\n   else do\n      VSR[VRT+32].hword[i] ←0x0000\n      all_true ←0\n   end\nend\nif Rc=1 then\n   CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6", "page_found": "Page 414 - 415", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpequh v1, v2, v3"}
{"mnemonic": "vcmpequd.", "architecture": "PowerISA", "full_name": "Vector Compare Equal Doubleword (Record)", "summary": "Compares two vector registers for equality on an unsigned doubleword basis and stores the result in a third vector register.", "syntax": "vcmpequd. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc | 199", "hex_opcode": "0x100000C7", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "199", "clean": "199"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Compares two vector registers element-wise for equality on an unsigned doubleword basis (2 64-bit elements) and stores a mask in the destination vector register, with all 1s where elements are equal and all 0s where unequal. When the record bit (.) is set, the CR6 field is updated to reflect whether any or all comparisons are equal.", "pseudocode": "for i in 0 to 1 do\n  if VRA[i] = VRB[i] then\n    VRT[i] ← 0xFFFF_FFFF_FFFF_FFFF\n  else\n    VRT[i] ← 0x0000_0000_0000_0000\nif Rc = 1 then CR6 ← comparison results", "special_registers": "CR6", "page_found": "Page 416 - 417", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpequd v1, v2, v3"}
{"mnemonic": "vcmpgtsb.", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Signed Byte (Record)", "summary": "Compares each byte of two vector registers and sets the corresponding result byte to all 1s if the signed byte in the first source register is greater than the signed byte in the second source register, otherwise sets it to all 0s.", "syntax": "vcmpgtsb. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "0 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000306", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "774", "clean": "774"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpgtsb, each byte of VSR[VRA+32] is compared with the corresponding byte of VSR[VRB+32]. If the signed byte in VSR[VRA+32] is greater than the signed byte in VSR[VRB+32], then the corresponding byte in VSR[VRT+32] is set to all 1s (0xFF). Otherwise, it is set to all 0s (0x00).", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 15\n    src1 ←EXTS(VSR[VRA+32].byte[i])\n    src2 ←EXTS(VSR[VRB+32].byte[i])\n    if src1 > src2 then do\n        VSR[VRT+32].byte[i] ←0xFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].byte[i] ←0x00\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR0, XER", "page_found": "Page 418 - 419", "extended_mnemonics": ["vcmpgtsb."], "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpgtsb v1, v2, v3"}
{"mnemonic": "vcmpgtsh.", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Signed Halfword (Record)", "summary": "Compares each halfword of two vector registers and sets the corresponding result element to all 1s if the first operand is greater than the second, otherwise all 0s.", "syntax": "vcmpgtsh. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "0 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000346", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "838", "clean": "838"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpgtsh, each halfword of VSR[VRA+32] is compared with the corresponding halfword of VSR[VRB+32]. If the signed value in VSR[VRA+32].hword[i] is greater than that in VSR[VRB+32].hword[i], then VSR[VRT+32].hword[i] is set to 0xFFFF; otherwise, it is set to 0x0000.", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 7\n    src1 ←EXTS(VSR[VRA+32].hword[i])\n    src2 ←EXTS(VSR[VRB+32].hword[i])\n    if src1 > src2 then do\n        VSR[VRT+32].hword[i] ←0xFFFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].hword[i] ←0x0000\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6 (if Rc=1)", "page_found": "Page 419 - 420", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpgtsh v1, v2, v3"}
{"mnemonic": "vcmpgtsw.", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Signed Word (Record)", "summary": "Compares each word of two vector registers and sets the corresponding word in the target vector register to all 1s if the first operand is greater than the second, otherwise to all 0s.", "syntax": "vcmpgtsw. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000386", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "902", "clean": "902"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpgtsw, each word of VSR[VRA+32] is compared with the corresponding word of VSR[VRB+32]. If the signed integer value in the word element i of VSR[VRA+32] is greater than that in VSR[VRB+32], then the contents of word element i of VSR[VRT+32] are set to all 1s; otherwise, they are set to all 0s.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 3\n    src1 ←EXTS(VSR[VRA+32].word[i])\n    src2 ←EXTS(VSR[VRB+32].word[i])\n    if src1 > src2 then do\n        VSR[VRT+32].word[i] ←0xFFFF_FFFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].word[i] ←0x0000_0000\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6 (if Rc=1)", "page_found": "Page 420 - 421", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpgtsw v1, v2, v3"}
{"mnemonic": "vcmpgtsd.", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Signed Doubleword (Record)", "summary": "Compares two doublewords of signed integers and sets the result vector based on the comparison.", "syntax": "vcmpgtsd. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x100003C7", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "967", "clean": "967"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpgtsd, each doubleword in VSR[VRA+32] is compared to the corresponding doubleword in VSR[VRB+32]. If a doubleword in VSR[VRA+32] is greater than the corresponding doubleword in VSR[VRB+32], the corresponding doubleword in VSR[VRT+32] is set to all 1s; otherwise, it is set to all 0s.", "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 1\n    src1 ←EXTS(VSR[VRA+32].dword[i])\n    src2 ←EXTS(VSR[VRB+32].dword[i])\n    if src1 > src2 then do\n        VSR[VRT+32].dword[i] ←0xFFFF_FFFF_FFFF_FFFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].dword[i] ←0x0000_0000_0000_0000\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6 (if Rc=1)", "page_found": "Page 421 - 422", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpgtsd v1, v2, v3"}
{"mnemonic": "xvcmpeqdp.", "architecture": "PowerISA", "full_name": "VSX Vector Compare Equal Double-Precision (Record)", "summary": "Compares two double-precision floating-point values in vector registers and sets the target register based on equality.", "syntax": "xvcmpeqdp. XT,XA,XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | Rc | AX | BX | TX", "hex_opcode": "0xF0000318", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "99", "clean": "99"}], "length": "32", "bit_positions": "6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "For xvcmpeqdp, each element of the source vectors VSR[XA] and VSR[XB] is compared. The result is stored in VSR[XT]. If Rc=1, CR field 6 is updated with comparison results.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nex_flag ←0b0\nall_false ←0b1\nall_true ←0b1\ndo i = 0 to 1\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[i])\n    src2 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    vxsnan_flag ←IsSNaN(src1) | IsSNaN(src2)\n    if src1 = src2 then do\n        all_false ←0b0\n    end\n    else do\n        vresult.dword[i] ←0x0000_0000_0000_0000\n        all_true ←0b0\n    end\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag)\nend\nif Rc=1 then do\n    if vex_flag=0 then\n        CR[6] ←all_true || 0b0 || all_false || 0b0\n    else\n        CR[6] ←0bUUUU\nend", "special_registers": "CR, FPSCR", "page_found": "Page 806 - 807", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xvcmpeqdp vs1, vs2, vs3"}
{"mnemonic": "xvcmpgtdp.", "architecture": "PowerISA", "full_name": "VSX Vector Compare Greater Than Double-Precision (Record)", "summary": "Compares two double-precision floating-point values and sets the target vector register based on the comparison.", "syntax": "xvcmpgtdp. XT,XA,XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | Rc | AX | BX | TX", "hex_opcode": "0xF0000358", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "107", "clean": "107"}], "length": "32", "bit_positions": "6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "For xvcmpgtdp, each element of the source vectors VSR[XA] and VSR[XB] is compared. The result is stored in VSR[XT]. If Rc=1, CR Field 6 is updated with the results of the comparison.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ← 0b0\nall_false ← 0b1\nall_true ← 0b1\ndo i = 0 to 1\n    reset_xflags()\n    src1 ← bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[i])\n    src2 ← bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    if src1.class.SNaN | src2.class.SNaN then do\n        vxsnan_flag ← 0b1\n        if FPSCR.VE=0 then vxvc_flag ← 0b1\n    end else vxvc_flag ← IsQNaN(src1) | IsQNaN(src2)\n    if src1 > src2 then do\n        vresult.dword[i] ← 0xFFFF_FFFF_FFFF_FFFF\n        all_false ← 0b0\n    end else do\n        all_true ← 0b0\n        vresult.dword[i] ← 0x0000_0000_0000_0000\n    end\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vxvc_flag=1 then SetFX(FPSCR.VXVC)\n    ex_flag ← ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vxvc_flag)\nend\nif ex_flag=0 then VSR[32×TX+T] ← vresult\nif Rc=1 then do\n    if vex_flag=0 then CR.field[6] ← all_true || 0b0 || all_false || 0b0 else CR.field[6] ← 0bUUUU\nend", "special_registers": "CR, FPSCR", "page_found": "Page 810 - 811", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xvcmpgtdp vs1, vs2, vs3"}
{"mnemonic": "xvcmpgedp.", "architecture": "PowerISA", "full_name": "VSX Vector Compare Greater or Equal Double-Precision (Record)", "summary": "Compares two double-precision floating-point values and sets the target vector register based on the comparison.", "syntax": "xvcmpgedp. XT,XA,XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | Rc | 115 | AX | BX | TX", "hex_opcode": "0xF0000398", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "115", "clean": "115"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VSX", "description": "For xvcmpgedp, each integer value i from 0 to 1, the double-precision floating-point operand in doubleword element i of VSR[XA] is compared to the double-precision floating-point operand in doubleword element i of VSR[XB]. The contents of doubleword element i of VSR[XT] are set to all 1s if src1 is greater than or equal to src2, and is set to all 0s otherwise.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nex_flag ←0b0\nall_false ←0b1\nall_true ←0b1\ndo i = 0 to 1\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP64(VSR[32×AX+A].dword[i])\n    src2 ←bfp_CONVERT_FROM_BFP64(VSR[32×BX+B].dword[i])\n    if src1.class.SNaN | src2.class.SNaN then do\n        vxsnan_flag ←0b1\n        if FPSCR.VE=0 then vxvc_flag ←0b1\n    end\n    else vxvc_flag ←IsQNaN(src1) | IsQNaN(src2)\n    if src1 >= src2 then do\n        vresult.dword[i] ←0xFFFF_FFFF_FFFF_FFFF\n        all_false ←0b0\n    end\n    else do\n        vresult.dword[i] ←0x0000_0000_0000_0000\n        all_true ←0b0\n    end\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vxvc_flag=1 then SetFX(FPSCR.VXVC)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vxvc_flag)\nend\nif ex_flag=0 then VSR[32×TX+T] ←vresult\nif Rc=1 then do\n    if vex_flag=0 then CR.field[6] ←all_true || 0b0 || all_false || 0b0\n    else CR.field[6] ←0bUUUU\nend", "special_registers": "CR6, FPSCR", "page_found": "Page 808 - 809", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xvcmpgedp vs1, vs2, vs3"}
{"mnemonic": "xvcmpeqsp.", "architecture": "PowerISA", "full_name": "VSX Vector Compare Equal Single-Precision (Record)", "summary": "Compares each single-precision floating-point element of two VSX registers and sets the corresponding element in the target register to all 1s if they are equal, otherwise all 0s.", "syntax": "xvcmpeqsp. XT,XA,XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | Rc | AX | BX | TX", "hex_opcode": "0xF0000218", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "67", "clean": "67"}], "length": "32", "bit_positions": "6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "For xvcmpeqsp, each integer value i from 0 to 3, the single-precision floating-point operand in word element i of VSR[XA] is compared to the single-precision floating-point operand in word element i of VSR[XB]. The contents of word element i of VSR[XT] are set to all 1s if they are equal, and all 0s otherwise.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\nex_flag ←0b0\nall_false ←0b1\nall_true ←0b1\ndo i = 0 to 3\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP32(VSR[32×AX+A].word[i])\n    src2 ←bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n    vxsnan_flag ←IsSNaN(src1) | IsSNaN(src2)\n    if src1 = src2 then do\n        all_false ←0b0\n    end\n    else do\n        vresult.word[i] ←0x0000_0000\n        all_true ←0b0\n    end\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag)\nend\nif Rc=1 then do\n    if vex_flag=0 then\n        CR.field[6] ←all_true || 0b0 || all_false || 0b0\n    else\n        CR.field[6] ←0bUUUU\nend", "special_registers": "CR, FPSCR", "page_found": "Page 807 - 808", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xvcmpeqsp vs1, vs2, vs3"}
{"mnemonic": "xvcmpgtsp.", "architecture": "PowerISA", "full_name": "VSX Vector Compare Greater Than Single-Precision (Record)", "summary": "Compares each single-precision floating-point element in two vector registers and sets the corresponding element in a target vector register to all 1s if the first element is greater than the second, otherwise all 0s.", "syntax": "xvcmpgtsp. XT,XA,XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | Rc | AX | BX | TX", "hex_opcode": "0xF0000258", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "75", "clean": "75"}], "length": "32", "bit_positions": "6:10 | 11:15 | 16:20 | 21 | 22:28 | 29 | 30:31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "For xvcmpgtsp, each integer value i from 0 to 3, the single-precision floating-point operand in word element i of VSR[XA] is compared to the single-precision floating-point operand in word element i of VSR[XB]. The contents of word element i of VSR[XT] are set to all 1s if the first operand is greater than the second, and all 0s otherwise.", "pseudocode": "if MSR.VSX=0 then VSX_Unavailable()\n\nex_flag ←0b0\nall_false ←0b1\nall_true ←0b1\ndo i = 0 to 3\n    reset_xflags()\n    src1 ←bfp_CONVERT_FROM_BFP32(VSR[32×AX+A].word[i])\n    src2 ←bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n    if IsSNaN(src1)=1 | IsSNaN(src2)=1 then do\n        vxsnan_flag ←0b1\n        if FPSCR.VE=0 then vxvc_flag ←0b1\n    end\n    else\n        vxvc_flag ←src1.class.QNaN | src2.class.QNaN\n    if src1 > src2 then do\n        vresult.word[i] ←0xFFFF_FFFF\n        all_false ←0b0\n    end\n    else\n        vresult.word[i] ←0x0000_0000\n        all_true ←0b0\n    end\n    if vxsnan_flag=1 then SetFX(FPSCR.VXSNAN)\n    if vxvc_flag=1 then SetFX(FPSCR.VXVC)\n    ex_flag ←ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vxvc_flag)\nend\nif ex_flag=0 then VSR[32×TX+T] ←vresult\nif Rc=1 then do\n    if vex_flag=0 then\n        CR.field[6] ←all_true || 0b0 || all_false || 0b0\n    else\n        CR.field[6] ←0bUUUU\nend", "special_registers": "CR6, FPSCR", "page_found": "Page 811 - 812", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xvcmpgtsp vs1, vs2, vs3"}
{"mnemonic": "xvcmpgesp.", "architecture": "PowerISA", "full_name": "VSX Vector Compare Greater or Equal Single-Precision (Record)", "summary": "Compares each element of two single-precision floating-point vectors and sets the target vector elements to all 1s if the corresponding source elements are greater than or equal, otherwise all 0s.", "syntax": "xvcmpgesp. XT,XA,XB", "encoding": {"format": "XX3-form", "binary_pattern": "T | A | B | Rc | 83 | AX | BX | TX", "hex_opcode": "0xF0000298", "visual_parts": [{"raw": "60", "clean": "60"}, {"raw": "XT", "clean": "XT"}, {"raw": "XA", "clean": "XA"}, {"raw": "XB", "clean": "XB"}, {"raw": "83", "clean": "83"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:28 | 29 | 30 | 31"}, "operands": [{"name": "XT", "desc": "Target"}, {"name": "XA", "desc": "Src A"}, {"name": "XB", "desc": "Src B"}], "extension": "VSX", "description": "For xvcmpgesp, each element of the single-precision floating-point vector in VSR[XA] is compared with the corresponding element in VSR[XB]. The result is stored in VSR[XT]. If Rc=1, CR field 6 is updated based on the comparison results.", "pseudocode": "if 'xvcmpgesp' then\n    for each integer value i from 0 to 3 do\n        src1 ← bfp_CONVERT_FROM_BFP32(VSR[32×AX+A].word[i])\n        src2 ← bfp_CONVERT_FROM_BFP32(VSR[32×BX+B].word[i])\n        if src1.class.SNaN | src2.class.SNaN then\n            vxsnan_flag ← 0b1\n            if FPSCR.VE=0 then vxvc_flag ← 0b1\n        else vxvc_flag ← IsQNaN(src1) | IsQNaN(src2)\n        if src1 >= src2 then\n            vresult.word[i] ← 0xFFFF_FFFF\n        else\n            vresult.word[i] ← 0x0000_0000\n        ex_flag ← ex_flag | (FPSCR.VE & vxsnan_flag) | (FPSCR.VE & vxvc_flag)\n    end\n    if ex_flag=0 then VSR[32×TX+T] ← vresult\n    if Rc=1 then do\n        CR.field[6] ← all_true || 0b0 || all_false || 0b0\n    end", "special_registers": "CR6, FPSCR (FX VXSNAN VXVC)", "page_found": "Page 809 - 810", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "xvcmpgesp vs1, vs2, vs3"}
{"mnemonic": "vcmpeqfp.", "architecture": "PowerISA", "full_name": "Vector Compare Equal Floating-Point (Record)", "summary": "Compares the elements of two vector registers for equality and stores the result in a third vector register.", "syntax": "vcmpeqfp. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x100000C6", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "198", "clean": "198"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpeqfp, each element of VSR[VRA+32] is compared to the corresponding element of VSR[VRB+32]. If they are equal, the corresponding element of VSR[VRT+32] is set to all 1s; otherwise, it is set to all 0s.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 3\n    src1 ←VSR[VRA+32].word[i]\n    src2 ←VSR[VRB+32].word[i]\n    if bool_COMPARE_EQ_BFP32(src1,src2)=1 then\n        VSR[VRT+32].word[i] ←0xFFFF_FFFF\n        all_false ←0\n    else\n        VSR[VRT+32].word[i] ←0x0000_0000\n        all_true ←0\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR0, XER", "page_found": "Page 454 - 455", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpeqfp v1, v2, v3"}
{"mnemonic": "vcmpgtfp.", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Floating-Point (Record)", "summary": "Compares the contents of two vector registers and sets the target vector register based on whether each element is greater than the corresponding element in the other vector.", "syntax": "vcmpgtfp. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x100002C6", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "710", "clean": "710"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpgtfp, the contents of VSR[VRA+32] are compared to the contents of VSR[VRB+32]. The result is stored in VSR[VRT+32], with each word set to all 1s if the corresponding element in VSR[VRA+32] is greater than that in VSR[VRB+32], and all 0s otherwise.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 3\n    src1 ←VSR[VRA+32].word[i]\n    src2 ←VSR[VRB+32].word[i]\n    if bool_COMPARE_GT_BFP32(src1,src2)=1 then\n        VSR[VRT+32].word[i] ←0xFFFF_FFFF\n        all_false ←0\n    else\n        all_true ←0\n        VSR[VRT+32].word[i] ←0x0000_0000\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6", "page_found": "Page 455 - 456", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpgtfp v1, v2, v3"}
{"mnemonic": "vcmpbfp.", "architecture": "PowerISA", "full_name": "Vector Compare Bounds Floating-Point (Record)", "summary": "Compares two VSRs word element by word and sets the target VSR if Rc=1.", "syntax": "vcmpbfp. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc | 966", "hex_opcode": "0x100003C6", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "966", "clean": "966"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Performs a bounds check comparing each of four 32-bit floating-point elements in VRA against the range defined by two bounds in VRB. The result is stored in VRT as a 4-bit value per element indicating which bound(s) the value violates. When the Rc bit is set (vcmpbfp.), the CR6 field is updated based on the result.", "pseudocode": "for i in 0 to 3:\n  if isnan(VRA[32*i:32*i+31]) or isnan(VRB[32*i:32*i+31]) then\n    VRT[30*i:30*i+29] ← 0b11\n  else if VRA[32*i:32*i+31] < -VRB[32*i:32*i+31] then\n    VRT[30*i:30*i+29] ← 0b10\n  else if VRA[32*i:32*i+31] > VRB[32*i:32*i+31] then\n    VRT[30*i:30*i+29] ← 0b01\n  else\n    VRT[30*i:30*i+29] ← 0b00\nif Rc = 1 then\n  CR6 ← 0b0001 if all results are within bounds else 0b0000", "special_registers": "CR6", "programming_notes": "Each single-precision floating-point value in VSR[VRB+32] should be non-negative; if it is negative, the corresponding element in VSR[VRA+32] will necessarily be out of bounds. One exception to this is when the value of an element in VSR[VRB+32] is -0.0 and the value of the corresponding element in VSR[VRA+32] is either +0.0 or -0.0. +0.0 and -0.0 compare equal to -0.0.", "page_found": "Page 453 - 454", "example": "vcmpbfp v1, v2, v3"}
{"mnemonic": "cntlzd.", "architecture": "PowerISA", "full_name": "Count Leading Zeros Doubleword (Record)", "summary": "Counts the number of consecutive 0 bits starting from bit 0 (MSB of 64-bit reg).", "syntax": "cntlzd. RT,RA", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | 00000 | 000111010 | Rc", "hex_opcode": "0x7C000074", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "00000", "clean": "00000"}, {"raw": "000111010", "clean": "000111010"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register"}, {"name": "RT", "desc": "Target General Purpose Register"}], "pseudocode": "n ← 0\nwhile n < 64 and RS[n] = 0 do n ← n + 1\nRT ← n\nif Rc = 1 then CR0 ← (RT = 0, RT < 0, RT > 0, SO)", "example": "cntlzd r3, r4", "example_note": "r3 = Leading Zeros in 64-bit r4.", "extension": "Base", "description": "Counts the number of consecutive zero bits from the MSB (bit 0) of the 64-bit doubleword in RS and stores the result in RT. The count ranges from 0 to 64. If Rc=1, CR0 is updated based on the result.", "special_registers": "CR0", "page_found": "Page 139 - 140", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "bla", "architecture": "PowerISA", "full_name": "Branch Absolute (Link)", "summary": "Branches to the target address and sets the Link Register to the return address.", "syntax": "bla target_addr (AA=1 LK=1)", "encoding": {"format": "I-form"}, "operands": [{"name": "target_addr", "desc": "Branch target address"}], "pseudocode": "if AA then NIA <- EXTS(LI || 0b00)\nelse NIA <- CIA + EXTS(LI || 0b00)\nif LK then LR <- CIA + 4", "example": "b label", "example_note": "Jump to 'label'.", "extension": "Base", "description": "If LK=1 then the effective address of the instruction following the branch is placed into the Link Register. Used for subroutine calls.", "special_registers": "LR", "page_found": "Page 75 (verified)", "programming_notes": "The b instruction is used for unconditional branching. The AA and LK fields control whether the address is absolute or relative and whether to link back to the current instruction."}
{"mnemonic": "bca", "architecture": "PowerISA", "full_name": "Branch Conditional Absolute", "summary": "Branches to the target address if the specified condition is met.", "syntax": "bca BO,BI,target_addr (AA=1 LK=0)", "encoding": {"format": "B-form"}, "operands": [{"name": "BO", "desc": "Branch options / condition to test"}, {"name": "BI", "desc": "Condition Register bit to test"}, {"name": "target_addr", "desc": "Branch target address"}], "pseudocode": "(see bc)", "example": "bc 12, 2, label", "example_note": "Branch if CR bit 2 is set (beq).", "extension": "Base", "description": "Conditional branch - see bc for the full BO/BI semantics. AA selects absolute vs. relative addressing; LK selects whether the Link Register is set to the return address.", "special_registers": "LR, CTR", "extended_mnemonics": ["bca", "bclr", "bcctr"], "page_found": "Page 75 (verified)", "programming_notes": "The bc instruction branches to a target address based on the condition bits in the Condition Register (CR). Ensure that the branch condition and target address are correctly set. The instruction operates at user privilege level, but care must be taken with conditional logic to avoid unintended execution paths."}
{"mnemonic": "bcl", "architecture": "PowerISA", "full_name": "Branch Conditional (Link)", "summary": "Branches to the target address if the specified condition is met.", "syntax": "bcl BO,BI,target_addr (AA=0 LK=1)", "encoding": {"format": "B-form"}, "operands": [{"name": "BO", "desc": "Branch options / condition to test"}, {"name": "BI", "desc": "Condition Register bit to test"}, {"name": "target_addr", "desc": "Branch target address"}], "pseudocode": "(see bc)", "example": "bc 12, 2, label", "example_note": "Branch if CR bit 2 is set (beq).", "extension": "Base", "description": "Conditional branch - see bc for the full BO/BI semantics. AA selects absolute vs. relative addressing; LK selects whether the Link Register is set to the return address.", "special_registers": "LR, CTR", "extended_mnemonics": ["bca", "bclr", "bcctr"], "page_found": "Page 75 (verified)", "programming_notes": "The bc instruction branches to a target address based on the condition bits in the Condition Register (CR). Ensure that the branch condition and target address are correctly set. The instruction operates at user privilege level, but care must be taken with conditional logic to avoid unintended execution paths."}
{"mnemonic": "bcla", "architecture": "PowerISA", "full_name": "Branch Conditional Absolute (Link)", "summary": "Branches to the target address if the specified condition is met.", "syntax": "bcla BO,BI,target_addr (AA=1 LK=1)", "encoding": {"format": "B-form"}, "operands": [{"name": "BO", "desc": "Branch options / condition to test"}, {"name": "BI", "desc": "Condition Register bit to test"}, {"name": "target_addr", "desc": "Branch target address"}], "pseudocode": "(see bc)", "example": "bc 12, 2, label", "example_note": "Branch if CR bit 2 is set (beq).", "extension": "Base", "description": "Conditional branch - see bc for the full BO/BI semantics. AA selects absolute vs. relative addressing; LK selects whether the Link Register is set to the return address.", "special_registers": "LR, CTR", "extended_mnemonics": ["bca", "bclr", "bcctr"], "page_found": "Page 75 (verified)", "programming_notes": "The bc instruction branches to a target address based on the condition bits in the Condition Register (CR). Ensure that the branch condition and target address are correctly set. The instruction operates at user privilege level, but care must be taken with conditional logic to avoid unintended execution paths."}
{"mnemonic": "bclrl", "architecture": "PowerISA", "full_name": "Branch Conditional to Link Register (Link)", "summary": "Branches to the address in the Link Register if the specified condition is met, and sets the Link Register to the return address.", "syntax": "bclrl BO,BI,BH", "encoding": {"format": "XL-form"}, "operands": [{"name": "BO", "desc": "Branch options / condition to test"}, {"name": "BI", "desc": "Condition Register bit to test"}, {"name": "BH", "desc": "Branch hint"}], "pseudocode": "(see bclr)", "example": "bclr 20, 0", "example_note": "Unconditional return (blr).", "extension": "Base", "description": "Conditional branch to the Link Register (see bclr) with LK=1 -- the Link Register is set to the return address after the branch is taken.", "special_registers": "CTR, LR", "programming_notes": "bclr, bclrl, bcctr, and bcctrl each serve as both a basic and an extended mnemonic. The Assembler will recognize a bclr, bclrl, bcctr, or bcctrl mnemonic with three operands as the basic form, and a bclr, bclrl, bcctr, or bcctrl mnemonic with two operands as the extended form. In the extended form the BH operand is omitted and assumed to be 0b00.", "extended_mnemonics": [{"mnemonic": "bcctr", "equivalent_to": "bcctr BO,BI,BH"}, {"mnemonic": "bltctr", "equivalent_to": "bcctr 12,0,0"}, {"mnemonic": "bnectr", "equivalent_to": "bcctr 4,10,0"}, {"mnemonic": "bclr", "equivalent_to": "bclr BO,BI,BH"}, {"mnemonic": "bltlr", "equivalent_to": "bclr 12,0,0"}, {"mnemonic": "bnelr", "equivalent_to": "bclr 4,10,0"}, {"mnemonic": "bdnzlr", "equivalent_to": "bclr 16,0,0"}, {"mnemonic": "bcctr", "equivalent_to": "bcctr BO,BI,BH (LK=0)"}, {"mnemonic": "bcctrl", "equivalent_to": "bcctr BO,BI,BH (LK=1)"}, {"mnemonic": "bclr 4,6", "equivalent_to": "bclr 4,6,0"}, {"mnemonic": "bnelr cr2", "equivalent_to": "bclr 4,10,0"}], "page_found": "Page 73-78 (verified, Appendix C Table C.2)"}
{"mnemonic": "fadd.", "architecture": "PowerISA", "full_name": "Floating Add (Record)", "summary": "Adds the contents of two floating-point registers and places the result into another register.", "syntax": "fadd. FRT,FRA,FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | FRA | FRB | 00000 | 21 | Rc", "hex_opcode": "0xFC00002A", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "00000", "clean": "00000"}, {"raw": "21", "clean": "21"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target FPR"}, {"name": "FRA", "desc": "Source FPR A"}, {"name": "FRB", "desc": "Source FPR B"}], "pseudocode": "if 'fadd' then\n    FRT <- (FRA) + (FRB)\nelse if 'fadd.' then\n    FRT <- (FRA) + (FRB)\n    CR1 <- result class and sign", "example": "fadd f1, f2, f3", "example_note": "f1 = f2 + f3", "extension": "Floating-Point", "description": "The floating-point operand in register FRA is added to the floating-point operand in register FRB. The result is rounded to the target precision under control of RN and placed into register FRT.", "special_registers": "FPSCR, CR1, CR0", "page_found": "Page 197 - 198", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes."}
{"mnemonic": "fmul.", "architecture": "PowerISA", "full_name": "Floating Multiply (Record)", "summary": "Multiplies the contents of two floating-point registers and places the result into another register.", "syntax": "fmul. FRT,FRA,FRC", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | FRA | 00000 | FRC | 25 | Rc", "hex_opcode": "0xFC000032", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "00000", "clean": "00000"}, {"raw": "FRC", "clean": "FRC"}, {"raw": "25", "clean": "25"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target FPR"}, {"name": "FRA", "desc": "Source FPR A"}, {"name": "FRC", "desc": "Source FPR C"}], "pseudocode": "if 'fmul' then\n    FRT <- (FRA) * (FRC)\nelse if 'fmul.' then\n    FRT <- (FRA) * (FRC)", "example": "fmul f1, f2, f3", "example_note": "f1 = f2 * f3", "extension": "Floating-Point", "description": "The floating-point operand in register FRA is multiplied by the floating-point operand in register FRC. The result is rounded to the target precision under control of RN and placed into register FRT.", "special_registers": "FPSCR, CR1, CR0", "page_found": "Page 198 - 200", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes."}
{"mnemonic": "fmadd.", "architecture": "PowerISA", "full_name": "Floating Multiply-Add (Record)", "summary": "Performs (A * C) + B with a single rounding step. (The classic FMA).", "syntax": "fmadd. FRT,FRA,FRC,FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | FRA | FRB | FRC | 29 | Rc", "hex_opcode": "0xFC00003A", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "FRC", "clean": "FRC"}, {"raw": "29", "clean": "29"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target FPR"}, {"name": "FRA", "desc": "Multiplier"}, {"name": "FRC", "desc": "Multiplicand"}, {"name": "FRB", "desc": "Addend"}], "pseudocode": "FRT ←[(FRA)×(FRC)] + (FRB)\nif 'fmadd.' then\n    CR1 <- result class and sign", "example": "fmadd f1, f2, f3, f4", "example_note": "f1 = (f2 * f3) + f4", "extension": "Floating-Point", "description": "The instruction multiplies the contents of register FRA by the contents of register FRC, then adds the result to the contents of register FRB. The final result is placed into register FRT.", "special_registers": "FPSCR, CR1, CR0", "page_found": "Page 203 - 204", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes."}
{"mnemonic": "fctiw.", "architecture": "PowerISA", "full_name": "Floating Convert with round Double-Precision To Signed Word format (Record)", "summary": "Converts a float to a 32-bit signed integer (using the current rounding mode) and stores it in the lower half of the FPR.", "syntax": "fctiw. FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | / | FRB | 14 | Rc", "hex_opcode": "0xFC00001C", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "/", "clean": "/"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "14", "clean": "14"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target FPR"}, {"name": "FRB", "desc": "Source FPR"}, {"name": "RT", "desc": "Target Floating Point Register"}, {"name": "RA", "desc": "Source Floating Point Register"}], "pseudocode": "round_mode ← FPSCRRN\ntgt_precision ← '32-bit signed integer'\n\nsign ← (FRB)0\nif (FRB)1:11 = 2047 and (FRB)12:63 = 0 then goto Infinity Operand\nif (FRB)1:11 = 2047 and (FRB)12 = 0 then goto SNaN Operand\nif (FRB)1:11 = 2047 and (FRB)12 = 1 then goto QNaN Operand\nif (FRB)1:11 > 1086 then goto Large Operand\n\nif (FRB)1:11 > 0 then exp ← (FRB)1:11 - 1023   /* exp - bias */\nif (FRB)1:11 = 0 then exp ← -1022\nif (FRB)1:11 > 0 then frac0:64 ← 0b01 || (FRB)12:63 || 110   /* normal */\nif (FRB)1:11 = 0 then frac0:64 ← 0b00 || (FRB)12:63 || 110   /* denormal */\n\nrbit || xbit ← 0b00\nfor i=1,63-exp    /* do the loop 0 times if exp = 63 */\n    frac0:64 || rbit || xbit ← 0b0 || frac0:64 || (rbit | xbit)\nend\n\nFRT ← Round Integer(sign, frac0:64, gbit, rbit, xbit, round_mode)", "example": "fctiw f1, f2", "example_note": "Convert float f2 to int in f1.", "extension": "Floating-Point", "description": "The instruction converts the double-precision floating-point value in FRB to a signed word using the specified rounding mode. If the result is out of range, it saturates to the maximum or minimum signed integer value.", "special_registers": "FPSCR, (FR, FI, FX, XX, VXSNAN, VXCVI), CR1, (if, Rc=1), CR0", "page_found": "Page 208 - 210", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes."}
{"mnemonic": "dmul.", "architecture": "PowerISA", "full_name": "Decimal Multiply (Record)", "summary": "Multiplies the contents of two DFP registers and places the result in another DFP register.", "syntax": "dmul. FRT,FRA,FRB", "encoding": {"format": "X-form", "binary_pattern": "0 | FRT | FRA | FRB | Rc | 0 | 0 | 0", "hex_opcode": "0xEC000044", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "34", "clean": "34"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26 | 27:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target FPR"}, {"name": "FRA", "desc": "Source A"}, {"name": "FRB", "desc": "Source B"}], "pseudocode": "FPR[FRT] ← DFP_multiply(FPR[FRA], FPR[FRB])\nFPSCR ← updated with exception flags\nif Rc = 1 then CR0 ← condition_code(FPR[FRT])", "example": "dmul f1, f2, f3", "example_note": "Financial Multiply.", "extension": "Decimal Floating-Point", "description": "Multiplies two 64-bit Decimal Floating Point (DFP) numbers held in FPRs and stores the result in another FPR. DFP multiplication preserves decimal precision required for financial calculations. The instruction can optionally update CR0 (via the dot form); FPSCR is always updated with exception flags and rounding information.", "special_registers": "FPSCR, CR1", "programming_notes": "dmul[q][.] are treated as Floating-Point instructions in terms of resource availability.", "page_found": "Page 241 - 242"}
{"mnemonic": "dqua.", "architecture": "PowerISA", "full_name": "Decimal Quantize (Record)", "summary": "Adjusts the exponent of a DFP number to match a reference. Critical for aligning decimal points before addition.", "syntax": "dqua. FRT,FRA,FRB,RMC", "encoding": {"format": "X-form", "binary_pattern": "0 | FRT | FRA | FRB | RMC | Rc | 3 | 21 | 23", "hex_opcode": "0xEC000006", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "66", "clean": "66"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": ""}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Source Value"}, {"name": "FRB", "desc": "Reference Exponent"}, {"name": "RMC", "desc": "Rounding Mode Control"}], "pseudocode": "FPR[FRT] ← DFP_quantize(FPR[FRA], FPR[FRB], RMC)\nFPSCR ← updated with exception flags\nif Rc = 1 then CR0 ← condition_code(FPR[FRT])", "example": "dqua f1, f2, f3", "example_note": "Align decimal points.", "extension": "Decimal Floating-Point", "description": "Adjusts the exponent of a 64-bit DFP number to match a reference exponent, rounding the significand as needed according to the RMC control bits. This operation is essential for aligning decimal points before addition in financial calculations. The instruction can optionally update CR0 via the dot form; FPSCR is always updated with exception flags.", "special_registers": "FPSCR, FPRF, FR, FI, FX, XX, VXSNAN, VXCVI, CR1", "programming_notes": "DFP Quantize can be used to adjust one DFP value to a form having the same exponent as another DFP value. If the adjustment requires the significand to be shifted left and would cause overflow from the most significant digit, the result is a default QNaN.", "page_found": "Page 250 - 252", "extended_mnemonics": ["dqua", "dqua."]}
{"mnemonic": "vcmpneb.", "architecture": "PowerISA", "full_name": "Vector Compare Not Equal Byte (Record)", "summary": "Compares each byte of two vector registers and sets the result register to all 1s if the bytes are not equal, otherwise all 0s.", "syntax": "vcmpneb. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000007", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "7", "clean": "7"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpneb, each byte of VSR[VRA+32] is compared with the corresponding byte of VSR[VRB+32]. If they are not equal, the corresponding byte in VSR[VRT+32] is set to 0xFF; otherwise, it is set to 0x00.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 15\n    src1 ←VSR[VRA+32].byte[i]\n    src2 ←VSR[VRB+32].byte[i]\n    if src1 != src2 then do\n        VSR[VRT+32].byte[i] ←0xFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].byte[i] ←0x00\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR0, XER", "page_found": "Page 423 - 424", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpneb v1, v2, v3"}
{"mnemonic": "vcmpneh.", "architecture": "PowerISA", "full_name": "Vector Compare Not Equal Halfword (Record)", "summary": "Compares the contents of two vector registers and sets the result register to all 1s if the elements are not equal, otherwise all 0s.", "syntax": "vcmpneh. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000047", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "71", "clean": "71"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpneh, each halfword element in VSR[VRA+32] is compared with the corresponding element in VSR[VRB+32]. If they are not equal, the corresponding element in VSR[VRT+32] is set to all 1s; otherwise, it is set to all 0s.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 7\n    src1 ←VSR[VRA+32].hword[i]\n    src2 ←VSR[VRB+32].hword[i]\n    if src1 != src2 then do\n        VSR[VRT+32].hword[i] ←0xFFFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].hword[i] ←0x0000\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6 (if Rc=1)", "page_found": "Page 424 - 425", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpneh v1, v2, v3"}
{"mnemonic": "vcmpnew.", "architecture": "PowerISA", "full_name": "Vector Compare Not Equal Word (Record)", "summary": "Compares each word of two vector registers and sets the corresponding word in the target vector register to all 1s if the words are not equal, otherwise to all 0s.", "syntax": "vcmpnew. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000087", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "135", "clean": "135"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vA", "desc": "Src A"}, {"name": "vB", "desc": "Src B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "For vcmpnew, each word of VSR[VRA+32] is compared with the corresponding word of VSR[VRB+32]. If they are not equal, the corresponding word in VSR[VRT+32] is set to 0xFFFF_FFFF; otherwise, it is set to 0x0000_0000.", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\ndo i = 0 to 3\n    src1 ←VSR[VRA+32].word[i]\n    src2 ←VSR[VRB+32].word[i]\n    if src1 != src2 then do\n        VSR[VRT+32].word[i] ←0xFFFF_FFFF\n        all_false ←0\n    end\n    else do\n        VSR[VRT+32].word[i] ←0x0000_0000\n        all_true ←0\n    end\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6 (if Rc=1)", "page_found": "Page 425 - 426", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vcmpnew v1, v2, v3"}
{"mnemonic": "vstribr.", "architecture": "PowerISA", "full_name": "Vector String Isolate Byte Right (Record)", "summary": "Isolates the rightmost non-zero byte in a vector string and shifts it to the left.", "syntax": "vstribr. VRT,VRB", "encoding": {"format": "VX-form", "binary_pattern": "0 | VRT | VRB | Rc | 13", "hex_opcode": "0x1001000D", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "0", "clean": "0"}, {"raw": "vB", "clean": "vB"}, {"raw": "582", "clean": "582"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target"}, {"name": "vB", "desc": "Source"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "extension": "VMX (AltiVec)", "description": "Isolates the rightmost non-zero byte in each 16-byte element of the source vector and shifts it to the leftmost position of the corresponding result element; all other bytes in the result are zeroed. When Rc=1, the instruction updates CR6 based on whether a zero vector was produced.", "pseudocode": "for i in 0 to 15:\n  byte_value ← VRB[i*8:(i+1)*8]\n  if byte_value ≠ 0 then\n    VRT[i*8:(i+1)*8] ← byte_value\n  else\n    VRT[i*8:(i+1)*8] ← 0\nif Rc = 1 then CR6 ← record_zero_vector(VRT)", "special_registers": "CR6 (if Rc=1)", "page_found": "Page 497 - 498", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "vstribr v1, v3"}
{"mnemonic": "addc.", "architecture": "PowerISA", "full_name": "Add Carrying (Record)", "summary": "Adds the contents of two registers and a carry bit, placing the result in a target register.", "syntax": "addc. RT,RA,RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 10 | Rc", "hex_opcode": "0x7C000014", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "10", "clean": "10"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}], "pseudocode": "if 'addc' then\n    RT <- (RA) + (RB)\nelse if 'addc.' then\n    RT <- (RA) + (RB)\n    if Rc=1 then update CR0\nelse if 'addco' then\n    RT <- (RA) + (RB)\n    if OE=1 then update XER[SO], XER[OV]\nelse if 'addco.' then\n    RT <- (RA) + (RB)\n    if Rc=1 then update CR0\n    if OE=1 then update XER[SO], XER[OV]", "example": "addc r3, r4, r5", "example_note": "r3 = r4 + r5 (Updates Carry)", "extension": "Base", "description": "The sum (RA) + (RB) is placed into register RT.", "special_registers": "CR0, XER", "page_found": "Page 111 - 112", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "addco", "architecture": "PowerISA", "full_name": "Add Carrying (Overflow)", "summary": "Adds the contents of two registers and a carry bit, placing the result in a target register.", "syntax": "addco RT,RA,RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 10 | Rc", "hex_opcode": "0x7C000014", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "10", "clean": "10"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}], "pseudocode": "if 'addc' then\n    RT <- (RA) + (RB)\nelse if 'addc.' then\n    RT <- (RA) + (RB)\n    if Rc=1 then update CR0\nelse if 'addco' then\n    RT <- (RA) + (RB)\n    if OE=1 then update XER[SO], XER[OV]\nelse if 'addco.' then\n    RT <- (RA) + (RB)\n    if Rc=1 then update CR0\n    if OE=1 then update XER[SO], XER[OV]", "example": "addc r3, r4, r5", "example_note": "r3 = r4 + r5 (Updates Carry)", "extension": "Base", "description": "The sum (RA) + (RB) is placed into register RT.", "special_registers": "CR0, XER", "page_found": "Page 111 - 112", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "addco.", "architecture": "PowerISA", "full_name": "Add Carrying (Record)", "summary": "Adds the contents of two registers and a carry bit, placing the result in a target register.", "syntax": "addco. RT,RA,RB", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | RB | OE | 10 | Rc", "hex_opcode": "0x7C000014", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "OE", "clean": "OE"}, {"raw": "10", "clean": "10"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}], "pseudocode": "if 'addc' then\n    RT <- (RA) + (RB)\nelse if 'addc.' then\n    RT <- (RA) + (RB)\n    if Rc=1 then update CR0\nelse if 'addco' then\n    RT <- (RA) + (RB)\n    if OE=1 then update XER[SO], XER[OV]\nelse if 'addco.' then\n    RT <- (RA) + (RB)\n    if Rc=1 then update CR0\n    if OE=1 then update XER[SO], XER[OV]", "example": "addc r3, r4, r5", "example_note": "r3 = r4 + r5 (Updates Carry)", "extension": "Base", "description": "The sum (RA) + (RB) is placed into register RT.", "special_registers": "CR0, XER", "page_found": "Page 111 - 112", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "subf", "architecture": "PowerISA", "full_name": "Subtract From", "summary": "Subtracts the contents of register RA from register RB and places the result in RT.", "syntax": "subf RT,RA,RB", "encoding": {"format": "D-form"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register (subtracted)"}, {"name": "RB", "desc": "Source Register (minuend)"}], "pseudocode": "RT ← ¬(RA) + (RB) + 1", "example": "subf r3, r4, r5", "example_note": "r3 = r4 + 10 (Updates CA)", "extension": "Base", "description": "The sum ¬(RA) + (RB) + 1 is placed into register RT. This is equivalent to RB - RA.", "special_registers": "CR CR0 (if Rc=1); XER SO OV OV32 (if OE=1)", "extended_mnemonics": [{"mnemonic": "sub RT,RB,RA", "equivalent": "subf RT,RA,RB"}, {"mnemonic": "sub. RT,RB,RA", "equivalent": "subf. RT,RA,RB"}, {"mnemonic": "subo RT,RB,RA", "equivalent": "subfo RT,RA,RB"}, {"mnemonic": "subo. RT,RB,RA", "equivalent": "subfo. RT,RA,RB"}], "page_found": "Page 110 (verified, corrected from addic's mis-scraped block)", "programming_notes": "The subf instruction subtracts the contents of register RA from register RB (RT = RB - RA); note the 'subtract from' operand order. Assemblers provide the extended mnemonic sub RT,RA,RB, implemented as subf RT,RB,RA. This instruction operates at user privilege level."}
{"mnemonic": "subf.", "architecture": "PowerISA", "full_name": "Subtract From (Record)", "summary": "Subtracts the contents of register RA from register RB and places the result in RT.", "syntax": "subf. RT,RA,RB", "encoding": {"format": "D-form"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register (subtracted)"}, {"name": "RB", "desc": "Source Register (minuend)"}], "pseudocode": "RT ← ¬(RA) + (RB) + 1", "example": "subf. r3, r4, r5", "example_note": "r3 = r4 + 10 (Updates CA)", "extension": "Base", "description": "The sum ¬(RA) + (RB) + 1 is placed into register RT. This is equivalent to RB - RA.", "special_registers": "CR CR0 (if Rc=1); XER SO OV OV32 (if OE=1)", "extended_mnemonics": [{"mnemonic": "sub RT,RB,RA", "equivalent": "subf RT,RA,RB"}, {"mnemonic": "sub. RT,RB,RA", "equivalent": "subf. RT,RA,RB"}, {"mnemonic": "subo RT,RB,RA", "equivalent": "subfo RT,RA,RB"}, {"mnemonic": "subo. RT,RB,RA", "equivalent": "subfo. RT,RA,RB"}], "page_found": "Page 110 (verified, corrected from addic's mis-scraped block)", "programming_notes": "The subf instruction subtracts the contents of register RA from register RB (RT = RB - RA); note the 'subtract from' operand order. Assemblers provide the extended mnemonic sub RT,RA,RB, implemented as subf RT,RB,RA. This instruction operates at user privilege level."}
{"mnemonic": "subfo", "architecture": "PowerISA", "full_name": "Subtract From (Overflow)", "summary": "Subtracts the contents of register RA from register RB and places the result in RT.", "syntax": "subfo RT,RA,RB", "encoding": {"format": "D-form"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register (subtracted)"}, {"name": "RB", "desc": "Source Register (minuend)"}], "pseudocode": "RT ← ¬(RA) + (RB) + 1", "example": "subfo r3, r4, r5", "example_note": "r3 = r4 + 10 (Updates CA)", "extension": "Base", "description": "The sum ¬(RA) + (RB) + 1 is placed into register RT. This is equivalent to RB - RA.", "special_registers": "CR CR0 (if Rc=1); XER SO OV OV32 (if OE=1)", "extended_mnemonics": [{"mnemonic": "sub RT,RB,RA", "equivalent": "subf RT,RA,RB"}, {"mnemonic": "sub. RT,RB,RA", "equivalent": "subf. RT,RA,RB"}, {"mnemonic": "subo RT,RB,RA", "equivalent": "subfo RT,RA,RB"}, {"mnemonic": "subo. RT,RB,RA", "equivalent": "subfo. RT,RA,RB"}], "page_found": "Page 110 (verified, corrected from addic's mis-scraped block)", "programming_notes": "The subf instruction subtracts the contents of register RA from register RB (RT = RB - RA); note the 'subtract from' operand order. Assemblers provide the extended mnemonic sub RT,RA,RB, implemented as subf RT,RB,RA. This instruction operates at user privilege level."}
{"mnemonic": "subfo.", "architecture": "PowerISA", "full_name": "Subtract From (Overflow, Record)", "summary": "Subtracts the contents of register RA from register RB and places the result in RT.", "syntax": "subfo. RT,RA,RB", "encoding": {"format": "D-form"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register (subtracted)"}, {"name": "RB", "desc": "Source Register (minuend)"}], "pseudocode": "RT ← ¬(RA) + (RB) + 1", "example": "subfo. r3, r4, r5", "example_note": "r3 = r4 + 10 (Updates CA)", "extension": "Base", "description": "The sum ¬(RA) + (RB) + 1 is placed into register RT. This is equivalent to RB - RA.", "special_registers": "CR CR0 (if Rc=1); XER SO OV OV32 (if OE=1)", "extended_mnemonics": [{"mnemonic": "sub RT,RB,RA", "equivalent": "subf RT,RA,RB"}, {"mnemonic": "sub. RT,RB,RA", "equivalent": "subf. RT,RA,RB"}, {"mnemonic": "subo RT,RB,RA", "equivalent": "subfo RT,RA,RB"}, {"mnemonic": "subo. RT,RB,RA", "equivalent": "subfo. RT,RA,RB"}], "page_found": "Page 110 (verified, corrected from addic's mis-scraped block)", "programming_notes": "The subf instruction subtracts the contents of register RA from register RB (RT = RB - RA); note the 'subtract from' operand order. Assemblers provide the extended mnemonic sub RT,RA,RB, implemented as subf RT,RB,RA. This instruction operates at user privilege level."}
{"mnemonic": "addmeo", "architecture": "PowerISA", "full_name": "Add to Minus One Extended (Overflow)", "summary": "Adds the contents of a register and a constant minus one, with optional overflow exception.", "syntax": "addmeo RT,RA", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | 00000 | OE | 234 | Rc", "hex_opcode": "0x7C0001D4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "00000", "clean": "00000"}, {"raw": "OE", "clean": "OE"}, {"raw": "234", "clean": "234"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register"}], "pseudocode": "if 'addme' then\n    RT <- (RA) + CA - 1", "example": "addme r3, r4", "example_note": "r3 = r4 + CA - 1", "extension": "Base", "description": "The sum (RA) + CA - 1 is placed into register RT. The carry bit (CA) is used in the calculation.", "special_registers": "CR0, XER", "extended_mnemonics": ["addme.", "addmeo", "addmeo."], "page_found": "Page 112 - 114", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "addmeo.", "architecture": "PowerISA", "full_name": "Add to Minus One Extended (Record)", "summary": "Adds the contents of a register and a constant minus one, with optional overflow exception.", "syntax": "addmeo. RT,RA", "encoding": {"format": "XO-form", "binary_pattern": "31 | RT | RA | 00000 | OE | 234 | Rc", "hex_opcode": "0x7C0001D4", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RT", "clean": "RT"}, {"raw": "RA", "clean": "RA"}, {"raw": "00000", "clean": "00000"}, {"raw": "OE", "clean": "OE"}, {"raw": "234", "clean": "234"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21 | 22:30 | 31"}, "operands": [{"name": "RT", "desc": "Target Register"}, {"name": "RA", "desc": "Source Register"}], "pseudocode": "if 'addme' then\n    RT <- (RA) + CA - 1", "example": "addme r3, r4", "example_note": "r3 = r4 + CA - 1", "extension": "Base", "description": "The sum (RA) + CA - 1 is placed into register RT. The carry bit (CA) is used in the calculation.", "special_registers": "CR0, XER", "extended_mnemonics": ["addme.", "addmeo", "addmeo."], "page_found": "Page 112 - 114", "programming_notes": "When Rc=1 (dot form), CR0 is updated with the signed comparison of the result against zero (LT, GT, EQ) and the current SO bit from XER."}
{"mnemonic": "and.", "architecture": "PowerISA", "full_name": "AND (Record)", "summary": "Performs a bitwise AND operation on the contents of two registers and places the result into another register.", "syntax": "and. RT,RS,RB", "encoding": {"format": "X-form", "binary_pattern": "31 | RS | RA | RB | 28 | Rc", "hex_opcode": "0x7C000038", "visual_parts": [{"raw": "31", "clean": "31"}, {"raw": "RS", "clean": "RS"}, {"raw": "RA", "clean": "RA"}, {"raw": "RB", "clean": "RB"}, {"raw": "28", "clean": "28"}, {"raw": "Rc", "clean": "Rc"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "RA", "desc": "Target Register"}, {"name": "RS", "desc": "Source Register 1"}, {"name": "RB", "desc": "Source Register 2"}, {"name": "RT", "desc": "Target General Purpose Register"}], "pseudocode": "if 'and' then\n    RT <- (RS) & (RB)\nelse if 'and.' then\n    RT <- (RS) & (RB)", "example": "and r3, r4, r5", "example_note": "r3 = r4 & r5", "extension": "Base", "description": "The contents of register RS are ANDed with the contents of register RB and the result is placed into register RA.", "special_registers": "CR0", "programming_notes": "Some forms of and Rx, Rx, Rx provide special functions; see Section 11.3 of Book III.", "page_found": "Page 134 - 136"}
{"mnemonic": "fmr.", "architecture": "PowerISA", "full_name": "Floating Move Register (Record)", "summary": "Copies a float register (Pseudo: for FRB).", "syntax": "fmr. FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | 0 | FRB | 72 | /", "hex_opcode": "0xFC000090", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "72", "clean": "72"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "The contents of register FRB are placed into register FRT.", "pseudocode": "FRT <- FRB", "special_registers": "CR1, (if, Rc=1), FPSCR", "page_found": "Page 195 - 196", "programming_notes": "The fmr instruction is used to copy the contents of one floating-point register (FRB) to another (FRT). It does not alter any special registers unless Rc=1, in which case it updates CR1. Ensure that both source and destination registers are properly aligned for optimal performance.", "example": "fmr f1, f3"}
{"mnemonic": "fsel.", "architecture": "PowerISA", "full_name": "Floating Select (Record)", "summary": "Selects FRA if FRC >= 0, else FRB (Optional).", "syntax": "fsel. FRT,FRA,FRC,FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | FRA | FRB | FRC | 23 | /", "hex_opcode": "0xFC00002E", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "FRC", "clean": "FRC"}, {"raw": "23", "clean": "23"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "True"}, {"name": "FRC", "desc": "Cond"}, {"name": "FRB", "desc": "False"}], "extension": "Floating-Point", "description": "Selects between FRA and FRB based on the sign of FRC: if FRC ≥ 0, the result is FRA; otherwise, the result is FRB. The optional dot (.) form sets CR1 based on the result's FPRF. This is an optional category instruction.", "pseudocode": "if FRC ≥ 0.0 then\n  FRT ← FRA\nelse\n  FRT ← FRB\nif Rc = 1 then CR1 ← FPRF(FRT)", "special_registers": "CR1, FPSCR", "programming_notes": "Warning: Care must be taken in using fsel if IEEE compatibility is required, or if the values being tested can be NaNs or infinities.", "page_found": "Page 215 - 216", "example": "fsel f1, f2, f4, f3"}
{"mnemonic": "fsqrt.", "architecture": "PowerISA", "full_name": "Floating Square Root (Record)", "summary": "Computes the square root of a floating-point number.", "syntax": "fsqrt. FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | 0 | FRB | 22 | /", "hex_opcode": "0xFC00002C", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "22", "clean": "22"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "The square root of the floating-point operand in register FRB is placed into register FRT. If the most significant bit of the resultant significand is not 1, the result is normalized. The result is rounded to the target precision under control of RN and placed into register FRT.", "special_registers": "FPSCR, CR1", "page_found": "Page 199 - 200", "pseudocode": "if FRB < 0 then\n    FRT ← QNaN\n    if VE = 1 then raise VXSQRT exception\nelse\n    FRT ← sqrt(FRB)\n    if most significant bit of FRT's significand is not 1 then normalize FRT\n    round FRT to target precision under control of RN\nend if\nFPSCR.FPRF ← class and sign of FRT\nif VE = 1 and result is invalid operation exception then raise VXSQRT exception", "programming_notes": "The fsqrt instruction computes the square root of a floating-point number. It handles negative inputs by returning a quiet NaN (QNaN) and may raise an exception if enabled. Ensure the input is non-negative to avoid unexpected results. The result is normalized and rounded according to the current rounding mode, which can affect precision.", "example": "fsqrt f1, f3"}
{"mnemonic": "fnmadd.", "architecture": "PowerISA", "full_name": "Floating Negative Multiply-Add (Record)", "summary": "Performs a floating-point negative multiply-add operation.", "syntax": "fnmadd. FRT,FRA,FRC,FRB", "encoding": {"format": "A-form", "binary_pattern": "63 | FRT | FRA | FRB | FRC | 31 | /", "hex_opcode": "0xFC00003E", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "FRC", "clean": "FRC"}, {"raw": "31", "clean": "31"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:25 | 26:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "A"}, {"name": "FRC", "desc": "C"}, {"name": "FRB", "desc": "B"}], "extension": "Floating-Point", "description": "The operation FRT ←- ( [(FRA)×(FRC)] + (FRB) ) is performed. The result is negated and placed into register FRT.", "pseudocode": "FRT ←- ( [(FRA)×(FRC)] + (FRB) )\nif 'fnmadd.' then\n    update CR1 and FPSCR fields", "special_registers": "FPSCR, CR1", "page_found": "Page 204 - 206", "programming_notes": "The fnmadd instruction is useful for performing a negated multiply-add operation on floating-point numbers. Ensure that the input registers FRA, FRC, and FRB are correctly aligned and contain valid floating-point values to avoid exceptions. If using the 'fnmadd.' form, be aware that it updates CR1 and FPSCR, which can affect subsequent conditional operations or exception handling.", "example": "fnmadd f1, f2, f4, f3"}
{"mnemonic": "frsp.", "architecture": "PowerISA", "full_name": "Floating Round to Single-Precision (Record)", "summary": "Rounds the contents of a floating-point register to single-precision.", "syntax": "frsp. FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | / | FRB | 12 | Rc", "hex_opcode": "0xFC000018", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "12", "clean": "12"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "The floating-point operand in register FRB is rounded to single-precision using the rounding mode specified by RN and placed into register FRT.", "pseudocode": "if (FRB)1:11 < 897 and (FRB)1:63 > 0 then\n    if FPSCRUE = 0 then goto Disabled Exponent Underflow\n    if FPSCRUE = 1 then goto Enabled Exponent Underflow\nend\n\nif (FRB)1:11 > 1150 and (FRB)1:11 < 2047 then\n    if FPSCROE = 0 then goto Disabled Exponent Overflow\n    if FPSCROE = 1 then goto Enabled Exponent Overflow\nend\n\nif (FRB)1:11 > 896 and (FRB)1:11 < 1151 then goto Normal Operand\n\nif (FRB)1:63 = 0 then goto Zero Operand\n\nif (FRB)1:11 = 2047 then\n    if (FRB)12:63 = 0 then goto Infinity Operand\n    if (FRB)12 = 1 then goto QNaN Operand\n    if (FRB)12 = 0 and (FRB)13:63 > 0 then goto SNaN Operand\nend\n\nDisabled Exponent Underflow:\n    sign ←(FRB)0\n    if (FRB)1:11 = 0 then\n        exp ←-1022\n        frac0:52 ←0b0 || (FRB)12:63\n    end\n    if (FRB)1:11 > 0 then\n        exp ←(FRB)1:11 -1023\n        frac0:52 ←0b1 || (FRB)12:63\n    end\n    Denormalize operand:\n        G || R || X ←0b000\n        do while exp < -126\n            exp ←exp + 1\n            frac0:52 || G || R || X ←0b0 || frac0:52 || G || (R | X)\n        end\n    FPSCRUX ←(frac24:52 || G || R || X) > 0\n    Round Single(sign,exp,frac0:52,G,R,X)\n    FPSCRXX ←FPSCRXX | FPSCRFI", "special_registers": "FPSCR (FPRF FR FI FX OX UX XX VXSNAN), CR1", "page_found": "Page 205 - 206", "programming_notes": "The frsp instruction rounds a double-precision floating-point number to single precision. It handles various cases like underflow, overflow, and NaNs, setting appropriate flags in the FPSCR register. Ensure that the input register FRB is correctly set before calling this instruction.", "example": "frsp f1, f3"}
{"mnemonic": "fcfid.", "architecture": "PowerISA", "full_name": "Floating Convert with round Signed Doubleword to Double-Precision format (Record)", "summary": "Converts a signed doubleword integer to a double-precision floating-point number.", "syntax": "fcfid. FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "63 | FRT | 0 | FRB | 846 | /", "hex_opcode": "0xFC00069C", "visual_parts": [{"raw": "63", "clean": "63"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "846", "clean": "846"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "The 64-bit signed fixed-point operand in register FRB is converted to an infinitely precise floating-point integer. The result of the conversion is rounded to double-precision, using the rounding mode specified by RN, and placed into register FRT.", "pseudocode": "if 'fcfid' then\n    FRT <- (FRB) converted to double-precision floating-point integer\n    round result using RN\n    if Rc=1 then update CR1", "special_registers": "FPSCR, CR1 (if Rc=1)", "programming_notes": "Converting a signed integer word to double-precision floating-point can be accomplished by loading the word from storage using Load Float Word Algebraic Indexed and then using fcfid.", "page_found": "Page 210 - 212", "example": "fcfid f1, f3"}
{"mnemonic": "fcfids.", "architecture": "PowerISA", "full_name": "Floating Convert with round Signed Doubleword to Single-Precision format (Record)", "summary": "Converts a 64-bit signed fixed-point operand in register FRB to single-precision floating-point.", "syntax": "fcfids. FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | 0 | FRB | 846 | /", "hex_opcode": "0xEC00069C", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "846", "clean": "846"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Floating-Point", "description": "The 64-bit signed fixed-point operand in register FRB is converted to an infinitely precise floating-point integer. The result of the conversion is rounded to single-precision, using the rounding mode specified by RN, and placed into register FRT.", "special_registers": "FPSCR (FPRF, FR, FI, FX, XX), CR1 (if Rc=1)", "programming_notes": "Converting a signed integer word to single-precision floating-point can be accomplished by loading the word from storage using Load Float Word Algebraic and then using fcfids.", "page_found": "Page 211 - 212", "pseudocode": "FRT ← ConvertToFloat(FRB, RN)\nSetFlags(FPRF, FR, FI)", "example": "fcfids f1, f3"}
{"mnemonic": "vcmpequw.", "architecture": "PowerISA", "full_name": "Vector Compare Equal Word (Record)", "summary": "Compares each word of two vector registers and sets the corresponding word in the target register to all 1s if they are equal, otherwise all 0s.", "syntax": "vcmpequw. VRT,VRA,VRB", "encoding": {"format": "VC-form", "binary_pattern": "0 | VRT | VRA | VRB | Rc", "hex_opcode": "0x10000086", "visual_parts": [{"raw": "4", "clean": "4"}, {"raw": "vD", "clean": "vD"}, {"raw": "vA", "clean": "vA"}, {"raw": "vB", "clean": "vB"}, {"raw": "134", "clean": "134"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "operands": [{"name": "vD", "desc": "Target (Mask)"}, {"name": "vA", "desc": "Source A"}, {"name": "vB", "desc": "Source B"}, {"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "pseudocode": "if MSR.VEC=0 then Vector_Unavailable()\n\nall_true ←1\nall_false ←1\ndo i = 0 to 3\n   src1 ←VSR[VRA+32].word[i]\n   src2 ←VSR[VRB+32].word[i]\n   if src1 = src2 then do\n      VSR[VRT+32].word[i] ←0xFFFF_FFFF\n      all_false ←0\n   end\n   else do\n      VSR[VRT+32].word[i] ←0x0000_0000\n      all_true ←0\n   end\nend\ndo i = 0 to 3\n   src1 ←VSR[VRA+32].word[i]\n   src2 ←VSR[VRB+32].word[i]\n   if src1 = src2 then do\n      VSR[VRT+32].word[i] ←0xFFFF_FFFF\n      all_false ←0\n   end\n   else do\n      VSR[VRT+32].word[i] ←0x0000_0000\n      all_true ←0\n   end\nend\nif Rc=1 then\n   CR.field[6] ←all_true || 0b0 || all_false || 0b0", "example": "vcmpequw v1, v2, v3", "example_note": "Generate mask for equality.", "extension": "VMX (AltiVec)", "description": "For vcmpequw, each word of VSR[VRA+32] is compared with the corresponding word of VSR[VRB+32]. If they are equal, the corresponding word in VSR[VRT+32] is set to 0xFFFF_FFFF; otherwise, it is set to 0x0000_0000.", "special_registers": "CR6", "page_found": "Page 415 - 416", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes."}
{"mnemonic": "ddiv.", "architecture": "PowerISA", "full_name": "Decimal Divide (Record)", "summary": "Divides the contents of two decimal floating-point registers and places the result in a target register.", "syntax": "ddiv. FRT,FRA,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | FRA | FRB | 546 | /", "hex_opcode": "0xEC000444", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "FRA", "clean": "FRA"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "546", "clean": "546"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRA", "desc": "Src A"}, {"name": "FRB", "desc": "Src B"}], "extension": "Decimal Floating-Point", "description": "The DFP operand in FRA is divided by the DFP operand in FRB. The result is rounded to the target-format precision under control of the DRN (bits 29:31 of the FPSCR). An appropriate form of the rounded result is selected based on the ideal exponent and is placed in FRT.", "pseudocode": "if 'ddiv' then\n    FRT <- (FRA) / (FRB)\n    if Rc=1 then\n        CR1 <- result of comparison", "special_registers": "FPSCR, CR1", "page_found": "Page 242 - 244", "programming_notes": "The ddiv instruction performs a decimal division, rounding the result according to the precision control bits in FPSCR. Ensure that operands are properly aligned and check for division by zero or overflow conditions, which may trigger exceptions. The result can be compared if Rc is set, updating CR1 accordingly.", "example": "ddiv f1, f2, f3"}
{"mnemonic": "drsp.", "architecture": "PowerISA", "full_name": "Decimal Round To DFP Short (Record)", "summary": "Rounds DFP Long (64-bit) to DFP Short (32-bit compressed).", "syntax": "drsp. FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | 0 | FRB | 770 | /", "hex_opcode": "0xEC000604", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "770", "clean": "770"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Decimal Floating-Point", "description": "The DFP long operand in FRB is converted and rounded to DFP short format. The DFP short value is extended on the left with zeros to form a 64-bit entity and placed into FRT. The sign of the result is the same as the sign of the source operand.", "pseudocode": "if 'drsp' then\n    FRT <- (FRB) rounded to DFP short format\n    if Rc=1 then\n        CR0, CR1 <- updated based on result", "special_registers": "FPSCR, CR0, CR1", "programming_notes": "Note that DFP short format is a storage-only format. Therefore, conversion of a long SNaN to short for mat will not cause an exception.", "page_found": "Page 261 - 262", "example": "drsp f1, f3"}
{"mnemonic": "dctfix.", "architecture": "PowerISA", "full_name": "Decimal Convert To Fixed (Record)", "summary": "Converts a decimal floating-point number to a fixed-point integer.", "syntax": "dctfix. FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | / | FRB | 290 | Rc", "hex_opcode": "0xEC000244", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "290", "clean": "290"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Decimal Floating-Point", "description": "The DFP operand in FRB is rounded to an integer value and placed into FRT in the 64-bit signed binary integer format. The sign of the result is the same as the sign of the source operand, except when the source operand is a NaN or a zero.", "pseudocode": "if 'dctfix' then\n    FRT <- round(FRB)\nelse if 'dctfix.' then\n    FRT <- round(FRB)\n    CR1 <- result of comparison", "special_registers": "FPSCR (FPRF, FR, FI, FX, VXSNAN, VXCVI, XX), CR1 (if Rc=1)", "page_found": "Page 270 - 272", "programming_notes": "It is recommended that software pre-round the operand to a floating-point integral using drintx[q] or drintn[q] if a rounding mode other than the current rounding mode specified by DRN is needed.", "example": "dctfix f1, f3"}
{"mnemonic": "ddedpd.", "architecture": "PowerISA", "full_name": "Decode DPD To BCD (Single Precision) (Record)", "summary": "Converts a portion of the significand of a DFP operand to a signed or unsigned BCD number.", "syntax": "ddedpd. SP,FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | SP | / | FRB | 322 | Rc", "hex_opcode": "0xEC000284", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "SP", "clean": "SP"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "322", "clean": "322"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:12 | 13:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}, {"name": "SP", "desc": "Sign Control"}], "extension": "Decimal Floating-Point", "description": "The rightmost 16 digits of the significand (32 digits for ddedpdq) is converted to an unsigned BCD number and the result is placed into FRT[p].", "pseudocode": "if 'ddedpd' then\n    if SP = 0 then\n        FRT <- unsigned BCD conversion of rightmost 16 digits of FRB[p]\n    else if SP = 1 then\n        FRT <- signed BCD conversion of rightmost 15 digits of FRB[p] with the same sign as FRB[p]\n    end if", "special_registers": "FPSCR, (FPRF, FX, VXCVI), FPSCR, (FR, set, to, 0), CR1, (if, Rc=1), CR0", "page_found": "Page 264 - 266", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "example": "ddedpd 0, f1, f3"}
{"mnemonic": "dxex.", "architecture": "PowerISA", "full_name": "Decimal Extract Exponent (Record)", "summary": "Extracts the biased exponent of a DFP operand in FRB and places it into FRT.", "syntax": "dxex. FRT,FRB", "encoding": {"format": "X-form", "binary_pattern": "59 | FRT | 0 | FRB | 354 | /", "hex_opcode": "0xEC0002C4", "visual_parts": [{"raw": "59", "clean": "59"}, {"raw": "FRT", "clean": "FRT"}, {"raw": "0", "clean": "0"}, {"raw": "FRB", "clean": "FRB"}, {"raw": "354", "clean": "354"}, {"raw": "/", "clean": "/"}], "length": "32", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:30 | 31"}, "operands": [{"name": "FRT", "desc": "Target"}, {"name": "FRB", "desc": "Source"}], "extension": "Decimal Floating-Point", "description": "The biased exponent of the operand in FRB is extracted and placed into FRT in the 64-bit signed binary integer format. Special codes are returned for infinity, QNaN, or SNaN operands.", "pseudocode": "if 'dxex' then\n    a <- biased exponent of FRB[p]\n    if a > MBE1 then\n        FRT[p] <- QNaNSNaN\n    else if 0 ≤a ≤MBE then\n        FRT[p] <- Finite number with biased exponent a\n    else if a = -1 then\n        FRT[p] <- Infinity\n    else if a = -2 then\n        FRT[p] <- QNaN\n    else if a = -3 then\n        FRT[p] <- SNaN\n    else if a < -3 then\n        FRT[p] <- QNaN", "special_registers": "CR1, (if, Rc=1), FPSCR", "programming_notes": "The exponent bias value is 101 for DFP Short, 398 for DFP Long, and 6176 for DFP Extended.", "page_found": "Page 266 - 268", "example": "dxex f1, f3"}
{"mnemonic": "frin.", "architecture": "PowerISA", "full_name": "Floating Round to Integer Nearest (Record)", "summary": "Rounds the floating-point operand in register FRB to an integral value using the rounding mode round to nearest.", "description": "The floating-point operand in register FRB is rounded to an integral value as follows, with the result placed into register FRT. If the sign of the operand is positive, (FRB) + 0.5 is truncated to an integral value, otherwise (FRB) - 0.5 is truncated to an integral value.", "syntax": "frin. FRT,FRB", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000310", "length": "32", "binary_pattern": "18 | FRT | FRB | Rc", "bit_positions": "0:5 | 6:29 | 30 | 31"}, "extension": "Floating-Point", "pseudocode": "if 'frin' then\n    if (FRB) >= 0 then\n        FRT <- truncate((FRB) + 0.5)\n    else\n        FRT <- truncate((FRB) - 0.5)", "special_registers": "FPSCR, (FPRF, FX, VXSNAN), FPSCR, (FR, FI), CR1, (if, Rc=1), CR0", "programming_notes": "These instructions set FR and FI to 0b00 regardless of whether the result is inexact or rounded because there is a desire to preserve the value of XX.", "extended_mnemonics": [], "page_found": "Page 212 - 214", "example": "frin f1, f3"}
{"mnemonic": "drintx.", "architecture": "PowerISA", "full_name": "Decimal Floating-Point Round To FP Integer With Inexact (Record)", "summary": "Rounds a decimal floating-point number to the nearest integer and places it into a floating-point register.", "description": "The DFP operand in FRB is rounded to a floating-point integer and placed into FRT. The sign of the result is the same as the sign of the operand in FRB. The ideal exponent is the larger value of zero and the exponent of the operand in FRB. The rounding mode used is specified by RMC.", "syntax": "drintx. R,FRT,FRB,RMC", "operands": [{"name": "R", "desc": "Rounding mode control bit"}, {"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}, {"name": "RMC", "desc": "Rounding mode control field"}], "encoding": {"format": "Z23-form", "hex_opcode": "0xEC0000C6", "length": "32", "binary_pattern": "0 | R | FRT | FRB | RMC | Rc", "bit_positions": "0:5 | 6:10 | 11:14 | 15 | 16:20 | 21:31"}, "extension": "Decimal Floating-Point", "pseudocode": "if 'drintx' then\n    FRT <- round(FRB, RMC)\n    if result differs from FRB then\n        raise inexact exception", "special_registers": "FPSCR, (FPRF, FR, FI, FX, XX), VXSNAN, CR1, (if, Rc=1), CR0", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": ["drintx."], "page_found": "Page 254 - 256", "example": "drintx 0, f1, f3, 0"}
{"mnemonic": "drintn.", "architecture": "PowerISA", "full_name": "Decimal Floating-Point Round To FP Integer Without Inexact (Record)", "summary": "Rounds a decimal floating-point number to an integer without recognizing an inexact exception.", "description": "This operation rounds the value in FRB to an integer using the specified rounding mode (RMC) and places the result in FRT. It does not recognize an inexact exception.", "syntax": "drintn. R,FRT,FRB,RMC", "operands": [{"name": "R", "desc": "Rounding mode control"}, {"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}, {"name": "RMC", "desc": "Rounding Mode Control"}], "encoding": {"format": "Z23-form", "hex_opcode": "0xEC0001C6", "length": "32", "binary_pattern": "0 | FRT | R | FRB | RMC | Rc", "bit_positions": "0:5 | 6:10 | 11:14 | 15 | 16:20 | 21:31"}, "extension": "Decimal Floating-Point", "pseudocode": "if 'drintn' then\n    FRT <- Round(FRB, RMC)\n    FI <- 0\n    FR <- 0\n    VXSNAN <- 0\n    if Rc=1 then\n        CR1 <- ClassAndSign(FRT)\nelse if 'drintn.' then\n    FRT <- Round(FRB, RMC)\n    FI <- 0\n    FR <- 0\n    VXSNAN <- 0\n    CR1 <- ClassAndSign(FRT)", "special_registers": "FPSCR, (FPRF, FX, VXSNAN), FPSCR, (FR, FI), CR1, CR0", "programming_notes": "The DFP Round To FP Integer Without Inexact and DFP Round To FP Integer Without Inexact Quad instructions can be used to implement decimal equivalents of several C99 rounding functions by specifying the appropriate R and RMC field values.", "extended_mnemonics": [], "page_found": "Page 256 - 258", "example": "drintn 0, f1, f3, 0"}
{"mnemonic": "rldcr.", "architecture": "PowerISA", "full_name": "Rotate Left Doubleword then Clear Right (Record)", "summary": "Rotates the contents of register RS left by a variable number of bits specified by (RB)58:63, and clears the rightmost bits.", "description": "The contents of register RS are rotated 64 bits to the left by the number of bits specified by (RB)58:63. A mask is generated having 1-bits from bit 0 through bit ME and 0-bits elsewhere. The rotated data are ANDed with the generated mask, and the result is placed into register RA.", "syntax": "rldcr. RT,RS,RB,ME", "operands": [{"name": "RT", "desc": "Target General Purpose Register"}, {"name": "RS", "desc": "Source General Purpose Register"}, {"name": "RB", "desc": "Source General Purpose Register"}, {"name": "ME", "desc": "Mask End bit position"}], "encoding": {"format": "MDS-form", "hex_opcode": "0x78000012", "length": "32", "binary_pattern": "0 | RS | RA | RB | ME | 9 | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:26 | 27:30 | 31"}, "extension": "Base", "pseudocode": "if 'rldcr' then\n    n ← (RB)58:63\n    r ← ROTL64((RS), n)\n    ME ← me5 || me0:4\n    m ← MASK(0, ME)\n    RA ← r & m\nif 'rldcr.' then\n    CR0 <- updated based on result", "special_registers": "CR0 (if Rc=1)", "programming_notes": "rldcr can be used to extract an n-bit field that starts at variable bit position b in register RS, left-justified RA), by setting RB58:63=b and ME=n-1. It can also be used to rotate the contents of a register left (right) by variable n bits, by setting RB58:63=n (64-n) and ME=63.", "extended_mnemonics": ["insrdi RA,RS,b,n"], "page_found": "Page 147 - 148", "example": "rldcr r3, r3, r5, 31"}
{"mnemonic": "frip.", "architecture": "PowerISA", "full_name": "Floating Round to Integer Plus (Record)", "summary": "Rounds a floating-point operand towards +infinity and places the result into a register.", "description": "The floating-point operand in register FRB is rounded to an integral value using the rounding mode round toward +infinity, and the result is placed into register FRT. FPRF is set to the class and sign of the result, except for Invalid Operation Exceptions when VE=1.", "syntax": "frip. FRT,FRB", "operands": [{"name": "FRT", "desc": "Target Floating-Point Register"}, {"name": "FRB", "desc": "Source Floating-Point Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000390", "length": "32", "binary_pattern": "0 | FRT | FRB | Rc", "bit_positions": "0:5 | 6:10 | 11:30 | 31"}, "extension": "Floating-Point", "pseudocode": "if 'frip' then\n    FRT <- round_towards_plus_infinity(FRB)\nelse if 'frip.' then\n    FRT <- round_towards_plus_infinity(FRB)\n    update_CR1_based_on_result(FRT)", "special_registers": "FPSCR, CR, CR0", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": [], "page_found": "Page 213 - 214", "example": "frip f1, f3"}
{"mnemonic": "vcmpequq.", "architecture": "PowerISA", "full_name": "Vector Compare Equal Quadword (Record)", "summary": "Compares two quadwords and sets the result to all ones if they are equal, otherwise all zeros.", "description": "Compares each quadword element of VRA with the corresponding quadword element of VRB for equality; the result for each quadword is all ones if equal or all zeros if not equal. If the Rc bit is set, CR6 is updated with summary information. Requires VMX support.", "syntax": "vcmpequq. VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VC-form", "hex_opcode": "0x100001C7", "length": "32", "binary_pattern": "0 | VRT | VRA | VRB | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "for i in 0 to 1 do\n  if VRA[i*128:(i+1)*128-1] = VRB[i*128:(i+1)*128-1] then\n    VRT[i*128:(i+1)*128-1] ← 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n  else\n    VRT[i*128:(i+1)*128-1] ← 0x00000000000000000000000000000000\n  end if\nend for\nif Rc then\n  CR6 ← summary of results\nend if", "special_registers": "CR6", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": [], "page_found": "Page 417 - 418", "example": "vcmpequq v1, v2, v3"}
{"mnemonic": "vcmpgtsq.", "architecture": "PowerISA", "full_name": "Vector Compare Greater Than Signed Quadword (Record)", "summary": "Compares two signed quadwords and sets the result based on whether the first is greater than the second.", "description": "For vcmpgtsq, the contents of VSR[VRA+32] (src1) are compared to the contents of VSR[VRB+32] (src2). If src1 > src2, VSR[VRT+32] is set to all 1s; otherwise, it is set to all 0s. If Rc=1, CR field 6 is updated.", "syntax": "vcmpgtsq. VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VC-form", "hex_opcode": "0x10000387", "length": "32", "binary_pattern": "4 | VRT | VRA | VRB | Rc", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nall_true ←1\nall_false ←1\nsrc1 ←EXTS(VSR[VRA+32])\nsrc2 ←EXTS(VSR[VRB+32])\nif src1 > src2 then do\n    VSR[VRT+32] ← 0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF\n    all_false ←0\nend else do\n    VSR[VRT+32] ← 0x0000_0000_0000_0000_0000_0000_0000_0000\n    all_true ←0\nend\nif Rc=1 then\n    CR.field[6] ←all_true || 0b0 || all_false || 0b0", "special_registers": "CR6 (if Rc=1)", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": [], "page_found": "Page 422 - 423", "example": "vcmpgtsq v1, v2, v3"}
{"mnemonic": "vstrihr.", "architecture": "PowerISA", "full_name": "Vector String Isolate Halfword Right-justified (Record)", "summary": "Isolates the rightmost non-zero halfword in a vector string.", "description": "From right to left, the contents of each halfword element of VSR[VRB+32] are placed into the corresponding halfword element in VSR[VRT+32]. If a halfword element in VSR[VRB+32] is found to contain 0, the corresponding halfword element and all halfword elements to the left of that halfword element in VSR[VRT+32] are set to 0.", "syntax": "vstrihr. VRT,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "VC-form", "hex_opcode": "0x1003000D", "length": "32", "binary_pattern": "0 | VRT | VRB | Rc | 13", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VMX (AltiVec)", "pseudocode": "if MSR.VEC=0 then\n    Vector_Unavailable()\nnull_found ← 0\nwhile (!null_found) do i = 0 to 7\n    null_found ← (VSR[VRB+32].hword[7-i] = 0)\n    VSR[VRT+32].hword[7-i] ← VSR[VRB+32].hword[7-i]\nend\ndo j = i to 7\n    VSR[VRT+32].hword[7-j] ← 0\nend\nif Rc=1 then\n    CR.field[6] ← 0b00 || null_found || 0b0", "special_registers": "CR6 (if Rc=1)", "programming_notes": "When Rc=1, CR1 is set from the FPSCR[FX, FEX, VX, OX] bits immediately after the operation completes.", "extended_mnemonics": [], "page_found": "Page 498 - 499", "example": "vstrihr v1, v3"}
{"mnemonic": "xsmsubqpo", "architecture": "PowerISA", "full_name": "VSX Scalar Multiply-Subtract Quad-Precision (Overflow)", "summary": "Performs a multiply-subtract operation on quad-precision floating-point values.", "description": "Performs a scalar multiply-subtract operation on quad-precision floating-point values, computing VRT = VRT - (VRA × VRB). The result is rounded according to the current rounding mode in FPSCR. This instruction requires VSX support and updates FPSCR exception flags based on the operation result.", "syntax": "xsmsubqpo VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000348", "length": "32", "binary_pattern": "18 | VRT | VRA | VRB | RO", "bit_positions": "0:5 | 6:10 | 11:15 | 16:20 | 21:31"}, "extension": "VSX", "pseudocode": "VRT[0:127] ← VRT[0:127] - (VRA[0:127] × VRB[0:127])\nFPSCR ← update_exception_flags(FPSCR, result)", "special_registers": "FPSCR", "programming_notes": "The xsmsubqp instruction is used for performing a multiply-subtract operation on quad-precision floating-point numbers. Ensure that the VSX (Vector Scalar Extensions) are enabled in the MSR register to avoid an exception. Be cautious of rounding modes and exceptions, as they can affect the result and set flags in the FPSCR register. This instruction operates on 128-bit aligned data in vector registers VSR[VRA+32], VSR[VRT+32], and VSR[VRB+32].", "extended_mnemonics": [], "page_found": "Page 698 - 699", "example": "xsmsubqp v1, v2, v3"}
{"mnemonic": "xsnmaddqpo", "architecture": "PowerISA", "full_name": "VSX Scalar Negative Multiply-Add Quad-Precision (Overflow)", "summary": "Performs a negative multiply-add operation on quad-precision floating-point values.", "description": "Performs a scalar negative multiply-add operation on quad-precision floating-point values, computing VRT = -(VRA × VRB) + VRT. The result is rounded according to the current rounding mode in FPSCR. This instruction requires VSX support and updates FPSCR exception flags based on the operation result.", "syntax": "xsnmaddqpo VRT,VRA,VRB", "operands": [{"name": "VRT", "desc": "Target Vector Register"}, {"name": "VRA", "desc": "Source Vector Register"}, {"name": "VRB", "desc": "Source Vector Register"}], "encoding": {"format": "X-form", "hex_opcode": "0xFC000388", "length": "32", "binary_pattern": "11110001 | 00000000 | 00000000 | 1000", "bit_positions": "0:5 | 6:10 | 11:15 | 16:31"}, "extension": "VSX", "pseudocode": "VRT[0:127] ← -(VRA[0:127] × VRB[0:127]) + VRT[0:127]\nFPSCR ← update_exception_flags(FPSCR, result)", "special_registers": "FPSCR FPRF FR FI FX VXSNAN VXIMZ VXISI OX UX XX", "programming_notes": "This instruction is used for performing a scalar negative multiply-add operation on quad-precision floating-point numbers. Ensure that the VSX feature is enabled in the MSR register to avoid exceptions. Be cautious of potential overflow and underflow conditions, as indicated by the OX and UX flags in the FPSCR register. The result is rounded according to the rounding mode specified in FPSCR.RN.", "extended_mnemonics": ["xsnmaddqp[o]"], "page_found": "Page 708 - 709", "example": "xsnmaddqp v1, v2, v3"}
{"mnemonic": "VANDN.VV", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Bitwise AND-NOT", "summary": "Computes vd = vs2 & ~vs1 (bitwise AND with inverted source).", "syntax": "VANDN.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "000001 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x04000057", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = vs2[i] & ~vs1[i];", "description": "Performs element-wise AND with inverted source (vs2 op ~vs1), writing results to vd.", "example": "VANDN.VV v1, v4, v2, v0.t"}
{"mnemonic": "VROL.VV", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Rotate Left", "summary": "Rotates bits in elements of vs2 left by amounts in vs1.", "syntax": "VROL.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "010101 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x54000057", "visual_parts": [{"raw": "010101", "clean": "010101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (vs2[i] << vs1[i]) | (vs2[i] >> (SEW - vs1[i]));", "description": "Rotates each vector element left by the corresponding shift amount.", "example": "VROL.VV v1, v4, v2, v0.t"}
{"mnemonic": "VROR.VV", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Rotate Right", "summary": "Rotates bits in elements of vs2 right by amounts in vs1.", "syntax": "VROR.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "010100 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x50000057", "visual_parts": [{"raw": "010100", "clean": "010100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (vs2[i] >> vs1[i]) | (vs2[i] << (SEW - vs1[i]));", "description": "Rotates each vector element right by the corresponding shift amount.", "example": "VROR.VV v1, v4, v2, v0.t"}
{"mnemonic": "VROL.VX", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Rotate Left Scalar", "summary": "Rotates bits in elements of vs2 left by scalar rs1.", "syntax": "VROL.VX vd, vs2, rs1, vm", "encoding": {"format": "OPIVX", "binary_pattern": "010101 | vm | vs2 | rs1 | 100 | vd | 1010111", "hex_opcode": "0x54004057", "visual_parts": [{"raw": "010101", "clean": "010101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "rs1", "desc": "Source register 1 (integer)"}], "pseudocode": "foreach(i < vl): vd[i] = rotate_left(vs2[i], rs1);", "description": "Rotates each vector element left by the corresponding shift amount.", "example": "VROL.VX v1, v4, a0, v0.t"}
{"mnemonic": "VROR.VX", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Rotate Right Scalar", "summary": "Rotates bits in elements of vs2 right by scalar rs1.", "syntax": "VROR.VX vd, vs2, rs1, vm", "encoding": {"format": "OPIVX", "binary_pattern": "010100 | vm | vs2 | rs1 | 100 | vd | 1010111", "hex_opcode": "0x50004057", "visual_parts": [{"raw": "010100", "clean": "010100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "rs1", "desc": "Source register 1 (integer)"}], "pseudocode": "foreach(i < vl): vd[i] = rotate_right(vs2[i], rs1);", "description": "Rotates each vector element right by the corresponding shift amount.", "example": "VROR.VX v1, v4, a0, v0.t"}
{"mnemonic": "VBREV8.V", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Byte Reverse", "summary": "Reverses the bits within each byte of the source elements.", "syntax": "VBREV8.V vd, vs2, vm", "encoding": {"format": "OPIVV", "binary_pattern": "010010 | vm | vs2 | 01000010 | vd | 1010111", "hex_opcode": "0x48042057", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "01000010", "clean": "01000010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}], "pseudocode": "foreach(i < vl): vd[i] = reverse_bits_in_bytes(vs2[i]);", "description": "Reverses the bit or byte order within each vector element.", "example": "VBREV8.V v1, v4, v0.t"}
{"mnemonic": "VREV8.V", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Reverse 8", "summary": "Reverses the order of bytes within each element (Endian swap).", "syntax": "VREV8.V vd, vs2, vm", "encoding": {"format": "OPIVV", "binary_pattern": "010010 | vm | vs2 | 01001010 | vd | 1010111", "hex_opcode": "0x4804A057", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "01001010", "clean": "01001010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}], "pseudocode": "foreach(i < vl): vd[i] = bswap(vs2[i]);", "description": "Reverses the bit or byte order within each vector element.", "example": "VREV8.V v1, v4, v0.t"}
{"mnemonic": "VCLZ.V", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Count Leading Zeros", "summary": "Counts the number of leading zero bits in each element.", "syntax": "VCLZ.V vd, vs2, vm", "encoding": {"format": "OPIVV", "binary_pattern": "010010 | vm | vs2 | 01100010 | vd | 1010111", "hex_opcode": "0x48062057", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "01100010", "clean": "01100010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}], "pseudocode": "foreach(i < vl): vd[i] = count_leading_zeros(vs2[i]);", "description": "Counts the number of leading zero bits in each active vector element, writing counts to vd.", "example": "VCLZ.V v1, v4, v0.t"}
{"mnemonic": "VCTZ.V", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Count Trailing Zeros", "summary": "Counts the number of trailing zero bits in each element.", "syntax": "VCTZ.V vd, vs2, vm", "encoding": {"format": "OPIVV", "binary_pattern": "010010 | vm | vs2 | 01101010 | vd | 1010111", "hex_opcode": "0x4806A057", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "01101010", "clean": "01101010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}], "pseudocode": "foreach(i < vl): vd[i] = count_trailing_zeros(vs2[i]);", "description": "Counts the number of trailing zero bits in each active vector element, writing counts to vd.", "example": "VCTZ.V v1, v4, v0.t"}
{"mnemonic": "VCPOP.V", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Population Count", "summary": "Counts the number of set bits (1s) in each element.", "syntax": "VCPOP.V vd, vs2, vm", "encoding": {"format": "OPIVV", "binary_pattern": "010010 | vm | vs2 | 01110010 | vd | 1010111", "hex_opcode": "0x48072057", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "01110010", "clean": "01110010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}], "pseudocode": "foreach(i < vl): vd[i] = count_set_bits(vs2[i]);", "description": "Counts the number of set bits in mask register vs2 that are active (within vl), writing the count to scalar rd.", "example": "VCPOP.V v1, v4, v0.t"}
{"mnemonic": "VWSLL.VV", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Widening Shift Left Logical", "summary": "Shifts N-bit elements left to produce 2*N-bit results.", "syntax": "VWSLL.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "110101 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0xD4000057", "visual_parts": [{"raw": "110101", "clean": "110101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Wide)"}, {"name": "vs2", "desc": "Src (Narrow)"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = zext(vs2[i]) << vs1[i];", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWSLL.VV v1, v4, v2, v0.t"}
{"mnemonic": "VAESDF.VV", "architecture": "RISC-V", "extension": "Zvkned", "full_name": "Vector AES Decryption Final Round", "summary": "Performs the final AES decryption round.", "syntax": "VAESDF.VV vd, vs2, vs1", "encoding": {"format": "OPIVV", "binary_pattern": "1010001 | vs2 | 00001010 | vd | 1110111", "hex_opcode": "0xA200A077", "visual_parts": [{"raw": "1010001", "clean": "1010001", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00001010", "clean": "00001010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1110111", "clean": "1110111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "State"}, {"name": "vs2", "desc": "Round Key"}, {"name": "vs1", "desc": "Undef"}], "pseudocode": "vd = AES_Decrypt_Final(vd, vs2);", "description": "Performs a vectorised AES cryptographic round operation. Each element group undergoes one step of the cipher algorithm in parallel. See the Zvk vector crypto extension for full semantic details.", "example": "VAESDF.VV v1, v4, v2"}
{"mnemonic": "VAESDM.VV", "architecture": "RISC-V", "extension": "Zvkned", "full_name": "Vector AES Decryption Middle Round", "summary": "Performs a middle AES decryption round.", "syntax": "VAESDM.VV vd, vs2, vs1", "encoding": {"format": "OPIVV", "binary_pattern": "1010001 | vs2 | 00000010 | vd | 1110111", "hex_opcode": "0xA2002077", "visual_parts": [{"raw": "1010001", "clean": "1010001", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00000010", "clean": "00000010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1110111", "clean": "1110111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "State"}, {"name": "vs2", "desc": "Round Key"}, {"name": "vs1", "desc": "Undef"}], "pseudocode": "vd = AES_Decrypt_Middle(vd, vs2);", "description": "Performs a vectorised AES cryptographic round operation. Each element group undergoes one step of the cipher algorithm in parallel. See the Zvk vector crypto extension for full semantic details.", "example": "VAESDM.VV v1, v4, v2"}
{"mnemonic": "VAESEF.VV", "architecture": "RISC-V", "extension": "Zvkned", "full_name": "Vector AES Encryption Final Round", "summary": "Performs the final AES encryption round.", "syntax": "VAESEF.VV vd, vs2, vs1", "encoding": {"format": "OPIVV", "binary_pattern": "1010001 | vs2 | 00011010 | vd | 1110111", "hex_opcode": "0xA201A077", "visual_parts": [{"raw": "1010001", "clean": "1010001", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00011010", "clean": "00011010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1110111", "clean": "1110111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "State"}, {"name": "vs2", "desc": "Round Key"}, {"name": "vs1", "desc": "Undef"}], "pseudocode": "vd = AES_Encrypt_Final(vd, vs2);", "description": "Performs a vectorised AES cryptographic round operation. Each element group undergoes one step of the cipher algorithm in parallel. See the Zvk vector crypto extension for full semantic details.", "example": "VAESEF.VV v1, v4, v2"}
{"mnemonic": "VAESEM.VV", "architecture": "RISC-V", "extension": "Zvkned", "full_name": "Vector AES Encryption Middle Round", "summary": "Performs a middle AES encryption round.", "syntax": "VAESEM.VV vd, vs2, vs1", "encoding": {"format": "OPIVV", "binary_pattern": "1010001 | vs2 | 00010010 | vd | 1110111", "hex_opcode": "0xA2012077", "visual_parts": [{"raw": "1010001", "clean": "1010001", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00010010", "clean": "00010010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1110111", "clean": "1110111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "State"}, {"name": "vs2", "desc": "Round Key"}, {"name": "vs1", "desc": "Undef"}], "pseudocode": "vd = AES_Encrypt_Middle(vd, vs2);", "description": "Performs a vectorised AES cryptographic round operation. Each element group undergoes one step of the cipher algorithm in parallel. See the Zvk vector crypto extension for full semantic details.", "example": "VAESEM.VV v1, v4, v2"}
{"mnemonic": "VAESKF1.VI", "architecture": "RISC-V", "extension": "Zvkned", "full_name": "Vector AES Key Expansion 1", "summary": "Generates the next round key for AES (Step 1).", "syntax": "VAESKF1.VI vd, vs2, uimm", "encoding": {"format": "OPIVI", "binary_pattern": "1000101 | vs2 | zimm5 | 010 | vd | 1110111", "hex_opcode": "0x8A002077", "visual_parts": [{"raw": "1000101", "clean": "1000101", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1110111", "clean": "1110111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "uimm", "desc": "RCON"}], "pseudocode": "vd = AES_KeyGen_1(vs2, uimm);", "description": "Performs a vectorised AES cryptographic round operation. Each element group undergoes one step of the cipher algorithm in parallel. See the Zvk vector crypto extension for full semantic details.", "example": "VAESKF1.VI v1, v4, 4"}
{"mnemonic": "VAESKF2.VI", "architecture": "RISC-V", "extension": "Zvkned", "full_name": "Vector AES Key Expansion 2", "summary": "Generates the next round key for AES (Step 2).", "syntax": "VAESKF2.VI vd, vs2, uimm", "encoding": {"format": "OPIVI", "binary_pattern": "1010101 | vs2 | zimm5 | 010 | vd | 1110111", "hex_opcode": "0xAA002077", "visual_parts": [{"raw": "1010101", "clean": "1010101", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1110111", "clean": "1110111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "uimm", "desc": "Round"}], "pseudocode": "vd = AES_KeyGen_2(vs2, uimm);", "description": "Performs a vectorised AES cryptographic round operation. Each element group undergoes one step of the cipher algorithm in parallel. See the Zvk vector crypto extension for full semantic details.", "example": "VAESKF2.VI v1, v4, 4"}
{"mnemonic": "VSHA2CH.VV", "architecture": "RISC-V", "extension": "Zvknha", "full_name": "Vector SHA-2 Compress High", "summary": "Performs SHA-256 compression (high 128 bits).", "syntax": "VSHA2CH.VV vd, vs2, vs1", "encoding": {"format": "OPIVV", "binary_pattern": "1011101 | vs2 | vs1 | 010 | vd | 1110111", "hex_opcode": "0xBA002077", "visual_parts": [{"raw": "1011101", "clean": "1011101", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1110111", "clean": "1110111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "State"}, {"name": "vs2", "desc": "Message"}, {"name": "vs1", "desc": "State B"}], "pseudocode": "vd = SHA256_Compress_High(vd, vs1, vs2);", "description": "Performs a vectorised SHA cryptographic round operation. Each element group undergoes one step of the cipher algorithm in parallel. See the Zvk vector crypto extension for full semantic details.", "example": "VSHA2CH.VV v1, v4, v2"}
{"mnemonic": "VSHA2CL.VV", "architecture": "RISC-V", "extension": "Zvknha", "full_name": "Vector SHA-2 Compress Low", "summary": "Performs SHA-256 compression (low 128 bits).", "syntax": "VSHA2CL.VV vd, vs2, vs1", "encoding": {"format": "OPIVV", "binary_pattern": "1011111 | vs2 | vs1 | 010 | vd | 1110111", "hex_opcode": "0xBE002077", "visual_parts": [{"raw": "1011111", "clean": "1011111", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1110111", "clean": "1110111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "State"}, {"name": "vs2", "desc": "Message"}, {"name": "vs1", "desc": "State B"}], "pseudocode": "vd = SHA256_Compress_Low(vd, vs1, vs2);", "description": "Performs a vectorised SHA cryptographic round operation. Each element group undergoes one step of the cipher algorithm in parallel. See the Zvk vector crypto extension for full semantic details.", "example": "VSHA2CL.VV v1, v4, v2"}
{"mnemonic": "VSHA2MS.VV", "architecture": "RISC-V", "extension": "Zvknha", "full_name": "Vector SHA-2 Message Schedule", "summary": "Generates SHA-256 message schedule words.", "syntax": "VSHA2MS.VV vd, vs2, vs1", "encoding": {"format": "OPIVV", "binary_pattern": "1011011 | vs2 | vs1 | 010 | vd | 1110111", "hex_opcode": "0xB6002077", "visual_parts": [{"raw": "1011011", "clean": "1011011", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1110111", "clean": "1110111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "vd = SHA256_MsgSched(vd, vs1, vs2);", "description": "Performs a vectorised SHA cryptographic round operation. Each element group undergoes one step of the cipher algorithm in parallel. See the Zvk vector crypto extension for full semantic details.", "example": "VSHA2MS.VV v1, v4, v2"}
{"mnemonic": "VGHSH.VV", "architecture": "RISC-V", "extension": "Zvkg", "full_name": "Vector GCM Hash", "summary": "Performs GHASH multiply-add for AES-GCM.", "syntax": "VGHSH.VV vd, vs2, vs1", "encoding": {"format": "OPIVV", "binary_pattern": "1011001 | vs2 | vs1 | 010 | vd | 1110111", "hex_opcode": "0xB2002077", "visual_parts": [{"raw": "1011001", "clean": "1011001", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1110111", "clean": "1110111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Accumulator"}, {"name": "vs2", "desc": "Hash Key"}, {"name": "vs1", "desc": "Data"}], "pseudocode": "vd = GHASH_MulAdd(vd, vs1, vs2);", "description": "Performs a vectorised GHASH cryptographic round operation. Each element group undergoes one step of the cipher algorithm in parallel. See the Zvk vector crypto extension for full semantic details.", "example": "VGHSH.VV v1, v4, v2"}
{"mnemonic": "VCLMUL.VV", "architecture": "RISC-V", "extension": "Zvbc", "full_name": "Vector Carry-less Multiply", "summary": "Performs carry-less multiplication on vector elements (GF(2^n)).", "syntax": "VCLMUL.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "001100 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x30002057", "visual_parts": [{"raw": "001100", "clean": "001100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = clmul(vs1[i], vs2[i]);", "description": "Performs carry-less multiplication of vector elements (GF(2^n)), used in GHASH for GCM mode and CRC computation.", "example": "VCLMUL.VV v1, v4, v2, v0.t"}
{"mnemonic": "VCLMULH.VV", "architecture": "RISC-V", "extension": "Zvbc", "full_name": "Vector Carry-less Multiply High", "summary": "Performs carry-less multiplication, keeping the high half.", "syntax": "VCLMULH.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "001101 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x34002057", "visual_parts": [{"raw": "001101", "clean": "001101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = clmulh(vs1[i], vs2[i]);", "description": "Performs carry-less multiplication of vector elements (GF(2^n)), used in GHASH for GCM mode and CRC computation.", "example": "VCLMULH.VV v1, v4, v2, v0.t"}
{"mnemonic": "VCPOP.M", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Population Count", "summary": "Counts set bits in the source mask register.", "syntax": "VCPOP.M rd, vs2, vm", "encoding": {"format": "OPMVX", "binary_pattern": "010000 | vm | vs2 | 10000010 | rd | 1010111", "hex_opcode": "0x40082057", "visual_parts": [{"raw": "010000", "clean": "010000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "10000010", "clean": "10000010", "pos": "19:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Scalar)"}, {"name": "vs2", "desc": "Src Mask"}], "pseudocode": "rd = count_set_bits(vs2 & vm);", "description": "Counts the number of set bits in mask register vs2 that are active (within vl), writing the count to scalar rd.", "example": "VCPOP.M t0, v4, v0.t"}
{"mnemonic": "VFIRST.M", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Find First Set Mask Bit", "summary": "Finds the index of the first set bit in the mask.", "syntax": "VFIRST.M rd, vs2, vm", "encoding": {"format": "OPMVX", "binary_pattern": "010000 | vm | vs2 | 10001010 | rd | 1010111", "hex_opcode": "0x4008A057", "visual_parts": [{"raw": "010000", "clean": "010000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "10001010", "clean": "10001010", "pos": "19:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Index)"}, {"name": "vs2", "desc": "Src Mask"}], "pseudocode": "rd = find_first_set(vs2 & vm);", "description": "Finds the index of the lowest-numbered active set bit in mask register vs2, writing the index to rd. Returns -1 if no bit is set.", "example": "VFIRST.M t0, v4, v0.t"}
{"mnemonic": "VMSBF.M", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Before First", "summary": "Sets mask bits before the first set bit in the source mask.", "syntax": "VMSBF.M vd, vs2, vm", "encoding": {"format": "OPMVV", "binary_pattern": "010100 | vm | vs2 | 00001010 | vd | 1010111", "hex_opcode": "0x5000A057", "visual_parts": [{"raw": "010100", "clean": "010100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00001010", "clean": "00001010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Src Mask"}], "pseudocode": "Set 1s up to the first 1 in vs2.", "description": "Sets each destination mask bit to 1 for elements before the first active set bit in vs2.", "example": "VMSBF.M v1, v4, v0.t"}
{"mnemonic": "VMSIF.M", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Including First", "summary": "Sets mask bits up to and including the first set bit in the source.", "syntax": "VMSIF.M vd, vs2, vm", "encoding": {"format": "OPMVV", "binary_pattern": "010100 | vm | vs2 | 00011010 | vd | 1010111", "hex_opcode": "0x5001A057", "visual_parts": [{"raw": "010100", "clean": "010100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00011010", "clean": "00011010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Src Mask"}], "pseudocode": "Set 1s up to and including the first 1 in vs2.", "description": "Sets each destination mask bit to 1 for elements up to and including the first active set bit in vs2.", "example": "VMSIF.M v1, v4, v0.t"}
{"mnemonic": "VMSOF.M", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Only First", "summary": "Sets only the first set bit from the source mask.", "syntax": "VMSOF.M vd, vs2, vm", "encoding": {"format": "OPMVV", "binary_pattern": "010100 | vm | vs2 | 00010010 | vd | 1010111", "hex_opcode": "0x50012057", "visual_parts": [{"raw": "010100", "clean": "010100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00010010", "clean": "00010010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Src Mask"}], "pseudocode": "vd = (1 << first_set_index(vs2)) & vm;", "description": "Sets only the destination mask bit corresponding to the first active set bit in vs2.", "example": "VMSOF.M v1, v4, v0.t"}
{"mnemonic": "VANDN.VX", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Bitwise AND-NOT Scalar", "summary": "Computes vd = vs2 & ~rs1.", "syntax": "VANDN.VX vd, vs2, rs1, vm", "encoding": {"format": "OPIVX", "binary_pattern": "000001 | vm | vs2 | rs1 | 100 | vd | 1010111", "hex_opcode": "0x04004057", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "rs1", "desc": "Scalar"}], "pseudocode": "foreach(i < vl): vd[i] = vs2[i] & ~rs1;", "description": "Performs element-wise AND with inverted source (vs2 op ~vs1), writing results to vd.", "example": "VANDN.VX v1, v4, a0, v0.t"}
{"mnemonic": "VWSLL.VX", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Widening Shift Left Logical Scalar", "summary": "Shifts elements left by scalar rs1, widening the result.", "syntax": "VWSLL.VX vd, vs2, rs1, vm", "encoding": {"format": "OPIVX", "binary_pattern": "110101 | vm | vs2 | rs1 | 100 | vd | 1010111", "hex_opcode": "0xD4004057", "visual_parts": [{"raw": "110101", "clean": "110101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Wide)"}, {"name": "vs2", "desc": "Src (Narrow)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}], "pseudocode": "foreach(i < vl): vd[i] = zext(vs2[i]) << rs1;", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWSLL.VX v1, v4, a0, v0.t"}
{"mnemonic": "VWSLL.VI", "architecture": "RISC-V", "extension": "Zvbb", "full_name": "Vector Widening Shift Left Logical Immediate", "summary": "Shifts elements left by immediate, widening the result.", "syntax": "VWSLL.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "110101 | vm | vs2 | zimm5 | 011 | vd | 1010111", "hex_opcode": "0xD4003057", "visual_parts": [{"raw": "110101", "clean": "110101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Wide)"}, {"name": "vs2", "desc": "Src (Narrow)"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "foreach(i < vl): vd[i] = zext(vs2[i]) << imm;", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWSLL.VI v1, v4, 16, v0.t"}
{"mnemonic": "BLTU", "architecture": "RISC-V", "extension": "RV32I", "full_name": "Branch if Less Than Unsigned", "summary": "Take the branch if rs1 is less than rs2 (unsigned comparison).", "syntax": "BLTU rs1, rs2, offset", "encoding": {"format": "B-Type", "binary_pattern": "bimm12hi | rs2 | rs1 | 110 | bimm12lo | 1100011", "hex_opcode": "0x00006063", "visual_parts": [{"raw": "bimm12hi", "clean": "bimm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "bimm12lo", "clean": "bimm12lo", "pos": "11:7"}, {"raw": "1100011", "clean": "1100011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "if (R[rs1] <u R[rs2]) PC += sext(offset);", "description": "BLTU takes the branch if rs1 is less than rs2, treating both as unsigned integers. The branch target is the PC plus the sign-extended B-immediate.", "example": "BLTU a0, a1, 0"}
{"mnemonic": "BGEU", "architecture": "RISC-V", "extension": "RV32I", "full_name": "Branch if Greater or Equal Unsigned", "summary": "Take the branch if rs1 is greater than or equal to rs2 (unsigned comparison).", "syntax": "BGEU rs1, rs2, offset", "encoding": {"format": "B-Type", "binary_pattern": "bimm12hi | rs2 | rs1 | 111 | bimm12lo | 1100011", "hex_opcode": "0x00007063", "visual_parts": [{"raw": "bimm12hi", "clean": "bimm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "bimm12lo", "clean": "bimm12lo", "pos": "11:7"}, {"raw": "1100011", "clean": "1100011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "if (R[rs1] >=u R[rs2]) PC += sext(offset);", "description": "BGEU takes the branch if rs1 is greater than or equal to rs2, treating both as unsigned integers. The branch target is the PC plus the sign-extended B-immediate.", "example": "BGEU a0, a1, 0"}
{"mnemonic": "FMV.X.D", "architecture": "RISC-V", "extension": "D", "full_name": "Move Double to Integer", "summary": "Moves the bit pattern of a 64-bit floating-point register to an integer register (RV64).", "syntax": "FMV.X.D rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "111000100000 | rs1 | 000 | rd | 1010011", "hex_opcode": "0xE2000053", "visual_parts": [{"raw": "111000100000", "clean": "111000100000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Int64)"}, {"name": "rs1", "desc": "Source (Double)"}], "pseudocode": "R[rd] = F[rs1];", "description": "Moves bits from a floating-point register to an integer register (or vice versa) without conversion. The bit pattern is preserved exactly.", "example": "FMV.X.D t0, a0"}
{"mnemonic": "FMV.D.X", "architecture": "RISC-V", "extension": "D", "full_name": "Move Integer to Double", "summary": "Moves the bit pattern of a 64-bit integer register to a floating-point register (RV64).", "syntax": "FMV.D.X rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "111100100000 | rs1 | 000 | rd | 1010011", "hex_opcode": "0xF2000053", "visual_parts": [{"raw": "111100100000", "clean": "111100100000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Double)"}, {"name": "rs1", "desc": "Source (Int64)"}], "pseudocode": "F[rd] = R[rs1];", "description": "Moves bits from a floating-point register to an integer register (or vice versa) without conversion. The bit pattern is preserved exactly.", "example": "FMV.D.X t0, a0"}
{"mnemonic": "FSGNJX.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Sign Injection XOR (Double)", "summary": "Injects the XOR of signs of rs1 and rs2 (Double Precision).", "syntax": "FSGNJX.D rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010001 | rs2 | rs1 | 010 | rd | 1010011", "hex_opcode": "0x22002053", "visual_parts": [{"raw": "0010001", "clean": "0010001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = {F[rs1][63] ^ F[rs2][63], F[rs1][62:0]};", "description": "Produces a result with the magnitude of rs1 and the sign bit taken from the source rs2. Used to implement floating-point absolute value, negate, and copy-sign.", "example": "FSGNJX.D t0, a0, a1"}
{"mnemonic": "C.NOP", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed No Operation", "summary": "Performs no operation (Compressed encoding).", "syntax": "C.NOP", "encoding": {"format": "CI", "binary_pattern": "? | 000 | c_nzimm6hi | 00000 | c_nzimm6lo | 01", "hex_opcode": "0x00000001", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "000", "clean": "000", "pos": "15:13"}, {"raw": "c_nzimm6hi", "clean": "c_nzimm6hi", "pos": "12"}, {"raw": "00000", "clean": "00000", "pos": "11:7"}, {"raw": "c_nzimm6lo", "clean": "c_nzimm6lo", "pos": "6:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:7 | 6:2 | 1:0"}, "operands": [], "pseudocode": "R[0] = R[0] + 0;", "description": "No operation. Equivalent to C.ADDI x0, 0.", "example": "C.NOP"}
{"mnemonic": "C.ADDIW", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Add Immediate Word", "summary": "Adds a signed immediate to a register (32-bit result sign-extended, RV64).", "syntax": "C.ADDIW rd, imm", "encoding": {"format": "CI", "binary_pattern": "? | 001 | c_imm6hi | rd_rs1_n0 | c_imm6lo | 01", "hex_opcode": "0x00002001", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "001", "clean": "001", "pos": "15:13"}, {"raw": "c_imm6hi", "clean": "c_imm6hi", "pos": "12"}, {"raw": "rd_rs1_n0", "clean": "rd_rs1_n0", "pos": "11:7"}, {"raw": "c_imm6lo", "clean": "c_imm6lo", "pos": "6:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:7 | 6:2 | 1:0"}, "operands": [{"name": "rd", "desc": "Dest/Src"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "R[rd] = sext((R[rd] + sext(imm))[31:0]);", "description": "Adds a 6-bit sign-extended immediate to rd (RV64/RV128 only), truncates to 32 bits, sign-extends to 64 bits.", "example": "C.ADDIW t0, 16"}
{"mnemonic": "C.ADDW", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Add Word", "summary": "Adds two registers (32-bit result sign-extended, RV64).", "syntax": "C.ADDW rd', rs2'", "encoding": {"format": "CA", "binary_pattern": "? | 100111 | rd_rs1_p | 01 | rs2_p | 01", "hex_opcode": "0x00009C21", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100111", "clean": "100111", "pos": "15:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "01", "clean": "01", "pos": "6:5"}, {"raw": "rs2_p", "clean": "rs2_p", "pos": "4:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest/Src1"}, {"name": "rs2'", "desc": "Source register 2 (3-bit compressed)"}], "pseudocode": "R[rd'] = sext((R[rd'] + R[rs2'])[31:0]);", "description": "Adds rd and rs2 (16-bit), sign-extends the 32-bit result to 64 bits (RV64/RV128 only).", "example": "C.ADDW rd', rs2'"}
{"mnemonic": "C.SUBW", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Subtract Word", "summary": "Subtracts two registers (32-bit result sign-extended, RV64).", "syntax": "C.SUBW rd', rs2'", "encoding": {"format": "CA", "binary_pattern": "? | 100111 | rd_rs1_p | 00 | rs2_p | 01", "hex_opcode": "0x00009C01", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100111", "clean": "100111", "pos": "15:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "00", "clean": "00", "pos": "6:5"}, {"raw": "rs2_p", "clean": "rs2_p", "pos": "4:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest/Src1"}, {"name": "rs2'", "desc": "Source register 2 (3-bit compressed)"}], "pseudocode": "R[rd'] = sext((R[rd'] - R[rs2'])[31:0]);", "description": "Subtracts rs2′ from rd′, truncates to 32 bits, sign-extends to 64 bits (RV64).", "example": "C.SUBW rd', rs2'"}
{"mnemonic": "C.LDSP", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Load Doubleword from Stack Pointer", "summary": "Loads a 64-bit value from the stack pointer (RV64).", "syntax": "C.LDSP rd, offset(x2)", "encoding": {"format": "CI", "binary_pattern": "? | 011 | c_uimm9sphi | rd_n0 | c_uimm9splo | 10", "hex_opcode": "0x00006002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "011", "clean": "011", "pos": "15:13"}, {"raw": "c_uimm9sphi", "clean": "c_uimm9sphi", "pos": "12"}, {"raw": "rd_n0", "clean": "rd_n0", "pos": "11:7"}, {"raw": "c_uimm9splo", "clean": "c_uimm9splo", "pos": "6:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:7 | 6:2 | 1:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "R[rd] = M[R[2] + offset][63:0];", "description": "Loads a 64-bit doubleword from a stack-pointer-relative address into rd (RV64).", "example": "C.LDSP t0, 0(a0)"}
{"mnemonic": "C.SDSP", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Store Doubleword to Stack Pointer", "summary": "Stores a 64-bit value to the stack pointer (RV64).", "syntax": "C.SDSP rs2, offset(x2)", "encoding": {"format": "CSS", "binary_pattern": "? | 111 | c_uimm9sp_s | c_rs2 | 10", "hex_opcode": "0x0000E002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "111", "clean": "111", "pos": "15:13"}, {"raw": "c_uimm9sp_s", "clean": "c_uimm9sp_s", "pos": "12:7"}, {"raw": "c_rs2", "clean": "c_rs2", "pos": "6:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:7 | 6:2 | 1:0"}, "operands": [{"name": "rs2", "desc": "Source"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[2] + offset][63:0] = R[rs2];", "description": "Stores a 64-bit doubleword from rs2 to a stack-pointer-relative address (RV64).", "example": "C.SDSP a1, 0(a0)"}
{"mnemonic": "C.FLWSP", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Float Load Word from Stack Pointer", "summary": "Loads a single-precision float from the stack pointer.", "syntax": "C.FLWSP rd, offset(x2)", "encoding": {"format": "CI", "binary_pattern": "? | 011 | c_uimm8sphi | rd | c_uimm8splo | 10", "hex_opcode": "0x00006002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "011", "clean": "011", "pos": "15:13"}, {"raw": "c_uimm8sphi", "clean": "c_uimm8sphi", "pos": "12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "c_uimm8splo", "clean": "c_uimm8splo", "pos": "6:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:7 | 6:2 | 1:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "F[rd] = M[R[2] + offset][31:0];", "description": "Loads a single-precision FP value from a stack-pointer-relative address into fd (RV32 only).", "example": "C.FLWSP t0, 0(a0)"}
{"mnemonic": "C.FSWSP", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Float Store Word to Stack Pointer", "summary": "Stores a single-precision float to the stack pointer.", "syntax": "C.FSWSP rs2, offset(x2)", "encoding": {"format": "CSS", "binary_pattern": "? | 111 | c_uimm8sp_s | c_rs2 | 10", "hex_opcode": "0x0000E002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "111", "clean": "111", "pos": "15:13"}, {"raw": "c_uimm8sp_s", "clean": "c_uimm8sp_s", "pos": "12:7"}, {"raw": "c_rs2", "clean": "c_rs2", "pos": "6:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:7 | 6:2 | 1:0"}, "operands": [{"name": "rs2", "desc": "Source"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[2] + offset][31:0] = F[rs2];", "description": "Stores a single-precision FP value from fd to a stack-pointer-relative address (RV32 only).", "example": "C.FSWSP a1, 0(a0)"}
{"mnemonic": "C.FLDSP", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Float Load Double from Stack Pointer", "summary": "Loads a double-precision float from the stack pointer.", "syntax": "C.FLDSP rd, offset(x2)", "encoding": {"format": "CI", "binary_pattern": "? | 001 | c_uimm9sphi | rd | c_uimm9splo | 10", "hex_opcode": "0x00002002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "001", "clean": "001", "pos": "15:13"}, {"raw": "c_uimm9sphi", "clean": "c_uimm9sphi", "pos": "12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "c_uimm9splo", "clean": "c_uimm9splo", "pos": "6:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:7 | 6:2 | 1:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "F[rd] = M[R[2] + offset][63:0];", "description": "Loads a double-precision FP value from a stack-pointer-relative address into fd.", "example": "C.FLDSP t0, 0(a0)"}
{"mnemonic": "C.FSDSP", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Float Store Double to Stack Pointer", "summary": "Stores a double-precision float to the stack pointer.", "syntax": "C.FSDSP rs2, offset(x2)", "encoding": {"format": "CSS", "binary_pattern": "? | 101 | c_uimm9sp_s | c_rs2 | 10", "hex_opcode": "0x0000A002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "101", "clean": "101", "pos": "15:13"}, {"raw": "c_uimm9sp_s", "clean": "c_uimm9sp_s", "pos": "12:7"}, {"raw": "c_rs2", "clean": "c_rs2", "pos": "6:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:7 | 6:2 | 1:0"}, "operands": [{"name": "rs2", "desc": "Source"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[2] + offset][63:0] = F[rs2];", "description": "Stores a double-precision FP value from fd to a stack-pointer-relative address.", "example": "C.FSDSP a1, 0(a0)"}
{"mnemonic": "VSUB.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Integer Subtract", "summary": "Subtracts elements of two vector registers.", "syntax": "VSUB.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "000010 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x08000057", "visual_parts": [{"raw": "000010", "clean": "000010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Src 2 (Subtrahend)"}, {"name": "vs1", "desc": "Src 1 (Minuend)"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] - vs2[i];", "description": "Performs element-wise integer subtraction on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VSUB.VV v1, v4, v2, v0.t"}
{"mnemonic": "VRSUB.VX", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Integer Reverse Subtract Scalar", "summary": "Subtracts vector elements from a scalar value (scalar - vector).", "syntax": "VRSUB.VX vd, vs2, rs1, vm", "encoding": {"format": "OPIVX", "binary_pattern": "000011 | vm | vs2 | rs1 | 100 | vd | 1010111", "hex_opcode": "0x0C004057", "visual_parts": [{"raw": "000011", "clean": "000011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Vector Src"}, {"name": "rs1", "desc": "Scalar Src"}], "pseudocode": "foreach(i < vl): vd[i] = rs1 - vs2[i];", "description": "Performs element-wise reverse integer subtraction on a vector and a scalar register, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VRSUB.VX v1, v4, a0, v0.t"}
{"mnemonic": "VMIN.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Minimum (Signed)", "summary": "Computes the signed minimum of elements in two vectors.", "syntax": "VMIN.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "000101 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x14000057", "visual_parts": [{"raw": "000101", "clean": "000101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = min(vs1[i], vs2[i]);", "description": "Performs element-wise signed minimum on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VMIN.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMAX.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Maximum (Signed)", "summary": "Computes the signed maximum of elements in two vectors.", "syntax": "VMAX.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "000111 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x1C000057", "visual_parts": [{"raw": "000111", "clean": "000111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = max(vs1[i], vs2[i]);", "description": "Performs element-wise signed maximum on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VMAX.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMINU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Minimum (Unsigned)", "summary": "Computes the unsigned minimum of elements in two vectors.", "syntax": "VMINU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "000100 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x10000057", "visual_parts": [{"raw": "000100", "clean": "000100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = min_u(vs1[i], vs2[i]);", "description": "Performs element-wise unsigned minimum on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VMINU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMAXU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Maximum (Unsigned)", "summary": "Computes the unsigned maximum of elements in two vectors.", "syntax": "VMAXU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "000110 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x18000057", "visual_parts": [{"raw": "000110", "clean": "000110", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = max_u(vs1[i], vs2[i]);", "description": "Performs element-wise unsigned maximum on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VMAXU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VOR.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Bitwise OR", "summary": "Performs bitwise OR on elements of two vectors.", "syntax": "VOR.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "001010 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x28000057", "visual_parts": [{"raw": "001010", "clean": "001010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] | vs2[i];", "description": "Performs element-wise bitwise OR on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VOR.VV v1, v4, v2, v0.t"}
{"mnemonic": "VXOR.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Bitwise XOR", "summary": "Performs bitwise XOR on elements of two vectors.", "syntax": "VXOR.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "001011 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x2C000057", "visual_parts": [{"raw": "001011", "clean": "001011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] ^ vs2[i];", "description": "Performs element-wise bitwise XOR on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VXOR.VV v1, v4, v2, v0.t"}
{"mnemonic": "VSLL.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Shift Left Logical", "summary": "Shifts elements of vector vs2 left by amounts in vs1.", "syntax": "VSLL.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100101 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x94000057", "visual_parts": [{"raw": "100101", "clean": "100101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source"}, {"name": "vs1", "desc": "Shift Amount"}], "pseudocode": "foreach(i < vl): vd[i] = vs2[i] << (vs1[i] & Mask);", "description": "Performs element-wise left logical shift on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VSLL.VV v1, v4, v2, v0.t"}
{"mnemonic": "VSRL.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Shift Right Logical", "summary": "Shifts elements of vector vs2 right (logical) by amounts in vs1.", "syntax": "VSRL.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "101000 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0xA0000057", "visual_parts": [{"raw": "101000", "clean": "101000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source"}, {"name": "vs1", "desc": "Shift Amount"}], "pseudocode": "foreach(i < vl): vd[i] = vs2[i] >> (vs1[i] & Mask);", "description": "Performs element-wise right logical shift on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VSRL.VV v1, v4, v2, v0.t"}
{"mnemonic": "VSRA.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Shift Right Arithmetic", "summary": "Shifts elements of vector vs2 right (arithmetic) by amounts in vs1.", "syntax": "VSRA.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "101001 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0xA4000057", "visual_parts": [{"raw": "101001", "clean": "101001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source"}, {"name": "vs1", "desc": "Shift Amount"}], "pseudocode": "foreach(i < vl): vd[i] = vs2[i] >>s (vs1[i] & Mask);", "description": "Performs element-wise right arithmetic shift on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VSRA.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMSEQ.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Equal", "summary": "Sets destination mask bit if elements are equal.", "syntax": "VMSEQ.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "011000 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x60000057", "visual_parts": [{"raw": "011000", "clean": "011000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (vs2[i] == vs1[i]) ? 1 : 0;", "description": "Compares elements element-wise for equal and writes a mask result to vd.", "example": "VMSEQ.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMSLT.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Less Than (Signed)", "summary": "Sets destination mask bit if vs2 < vs1 (signed).", "syntax": "VMSLT.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "011011 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x6C000057", "visual_parts": [{"raw": "011011", "clean": "011011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (vs2[i] <s vs1[i]) ? 1 : 0;", "description": "Compares elements element-wise for less than and writes a mask result to vd.", "example": "VMSLT.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMSLTU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Less Than (Unsigned)", "summary": "Sets destination mask bit if vs2 < vs1 (unsigned).", "syntax": "VMSLTU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "011010 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x68000057", "visual_parts": [{"raw": "011010", "clean": "011010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (vs2[i] <u vs1[i]) ? 1 : 0;", "description": "Compares elements element-wise for less than and writes a mask result to vd.", "example": "VMSLTU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VREDSUM.VS", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Reduction Sum", "summary": "Reduces a vector to a scalar by summing all elements.", "syntax": "VREDSUM.VS vd, vs2, vs1, vm", "encoding": {"format": "OPMVV", "binary_pattern": "000000 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x00002057", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Scalar"}, {"name": "vs2", "desc": "Source Vector"}, {"name": "vs1", "desc": "Start Scalar"}], "pseudocode": "vd[0] = vs1[0] + sum(vs2[*]);", "description": "Performs a vector reduction: applies the operation across all active elements of vs2, using vs1[0] as the initial accumulator, and writes the scalar result to vd[0]. Active elements are determined by vl.", "example": "VREDSUM.VS v1, v4, v2, v0.t"}
{"mnemonic": "VLSE32.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load Strided Element (32-bit)", "summary": "Loads elements from memory with a fixed stride.", "syntax": "VLSE32.V vd, (rs1), rs2, vm", "encoding": {"format": "VL-Type", "binary_pattern": "000010 | vm | rs2 | rs1 | 110 | vd | 0000111", "hex_opcode": "0x08006007", "visual_parts": [{"raw": "000010", "clean": "000010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Vector Dest"}, {"name": "rs1", "desc": "Base Address"}, {"name": "rs2", "desc": "Stride"}], "pseudocode": "foreach(i < vl): vd[i] = M[rs1 + i * rs2];", "description": "Performs a vector strided load of 32-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLSE32.V v1, a0, a1, v0.t"}
{"mnemonic": "VSSE32.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Store Strided Element (32-bit)", "summary": "Stores elements to memory with a fixed stride.", "syntax": "VSSE32.V vs3, (rs1), rs2, vm", "encoding": {"format": "VS-Type", "binary_pattern": "000010 | vm | rs2 | rs1 | 110 | vs3 | 0100111", "hex_opcode": "0x08006027", "visual_parts": [{"raw": "000010", "clean": "000010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vs3", "clean": "vs3", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vs3", "desc": "Vector Source"}, {"name": "rs1", "desc": "Base Address"}, {"name": "rs2", "desc": "Stride"}], "pseudocode": "foreach(i < vl): M[rs1 + i * rs2] = vs3[i];", "description": "Performs a vector strided store of 32-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VSSE32.V v6, a0, a1, v0.t"}
{"mnemonic": "VLUXEI32.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load Unordered Indexed (32-bit indices)", "summary": "Loads elements from memory using a vector of indices (Gather).", "syntax": "VLUXEI32.V vd, (rs1), vs2, vm", "encoding": {"format": "VL-Type", "binary_pattern": "000001 | vm | vs2 | rs1 | 110 | vd | 0000111", "hex_opcode": "0x04006007", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Vector Dest"}, {"name": "rs1", "desc": "Base Address"}, {"name": "vs2", "desc": "Vector Indices"}], "pseudocode": "foreach(i < vl): vd[i] = M[rs1 + vs2[i]];", "description": "Performs a vector indexed unordered load of 32-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLUXEI32.V v1, a0, v4, v0.t"}
{"mnemonic": "VSUXEI32.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Store Unordered Indexed (32-bit indices)", "summary": "Stores elements to memory using a vector of indices (Scatter).", "syntax": "VSUXEI32.V vs3, (rs1), vs2, vm", "encoding": {"format": "VS-Type", "binary_pattern": "000001 | vm | vs2 | rs1 | 110 | vs3 | 0100111", "hex_opcode": "0x04006027", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vs3", "clean": "vs3", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vs3", "desc": "Vector Source"}, {"name": "rs1", "desc": "Base Address"}, {"name": "vs2", "desc": "Vector Indices"}], "pseudocode": "foreach(i < vl): M[rs1 + vs2[i]] = vs3[i];", "description": "Performs a vector indexed unordered store of 32-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VSUXEI32.V v6, a0, v4, v0.t"}
{"mnemonic": "VSLIDEUP.VX", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Slide Up", "summary": "Moves elements up by a scalar amount (vd[i] = vs2[i - rs1]).", "syntax": "VSLIDEUP.VX vd, vs2, rs1, vm", "encoding": {"format": "OPIVX", "binary_pattern": "001110 | vm | vs2 | rs1 | 100 | vd | 1010111", "hex_opcode": "0x38004057", "visual_parts": [{"raw": "001110", "clean": "001110", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source Vector"}, {"name": "rs1", "desc": "Shift Amount"}], "pseudocode": "foreach(i): if i < rs1: vd[i] = vd[i] (unchanged); else: vd[i] = vs2[i - rs1];", "description": "Slides vector elements up by the specified offset, filling vacated positions with zero or the value from vs1[0].", "example": "VSLIDEUP.VX v1, v4, a0, v0.t"}
{"mnemonic": "VSLIDEDOWN.VX", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Slide Down", "summary": "Moves elements down by a scalar amount (vd[i] = vs2[i + rs1]).", "syntax": "VSLIDEDOWN.VX vd, vs2, rs1, vm", "encoding": {"format": "OPIVX", "binary_pattern": "001111 | vm | vs2 | rs1 | 100 | vd | 1010111", "hex_opcode": "0x3C004057", "visual_parts": [{"raw": "001111", "clean": "001111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source Vector"}, {"name": "rs1", "desc": "Shift Amount"}], "pseudocode": "foreach(i < vl): vd[i] = vs2[i + rs1];", "description": "Slides vector elements down by the specified offset, filling vacated positions with zero or the value from vs1[0].", "example": "VSLIDEDOWN.VX v1, v4, a0, v0.t"}
{"mnemonic": "VMNAND.MM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask NAND", "summary": "Performs bitwise NAND on vector mask registers. Used to invert masks (NOT).", "syntax": "VMNAND.MM vd, vs2, vs1", "encoding": {"format": "OPMVV", "binary_pattern": "0111011 | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x76002057", "visual_parts": [{"raw": "0111011", "clean": "0111011", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Src 2 Mask"}, {"name": "vs1", "desc": "Src 1 Mask"}], "pseudocode": "vd = ~(vs1 & vs2);", "description": "Performs element-wise mask NAND on the mask registers vm1 and vm2, writing to vd.", "example": "VMNAND.MM v1, v4, v2"}
{"mnemonic": "CSRRC", "architecture": "RISC-V", "extension": "Zicsr", "full_name": "Control Status Register Read and Clear", "summary": "Reads the old value of the CSR, then clears bits in the CSR based on the mask in rs1.", "syntax": "CSRRC rd, csr, rs1", "encoding": {"format": "I-Type", "binary_pattern": "csr | rs1 | 011 | rd | 1110011", "hex_opcode": "0x00003073", "visual_parts": [{"raw": "csr", "clean": "csr", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "csr", "desc": "CSR Address"}, {"name": "rs1", "desc": "Bit Mask"}], "pseudocode": "t = CSRs[csr]; CSRs[csr] = t & ~R[rs1]; R[rd] = t;", "example": "CSRRC x10, sstatus, x5", "example_note": "Clears bits in 'sstatus' where x5 is 1.", "description": "CSRRC atomically reads CSR csr into rd, then clears the bits in the CSR that correspond to bits set in rs1. If rs1 is x0, no bits are modified."}
{"mnemonic": "CSRRWI", "architecture": "RISC-V", "extension": "Zicsr", "full_name": "CSR Read/Write Immediate", "summary": "Updates a CSR using a 5-bit unsigned immediate (zimm) instead of a register.", "syntax": "CSRRWI rd, csr, uimm", "encoding": {"format": "I-Type", "binary_pattern": "csr | zimm5 | 101 | rd | 1110011", "hex_opcode": "0x00005073", "visual_parts": [{"raw": "csr", "clean": "csr", "pos": "31:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "csr", "desc": "CSR Address"}, {"name": "uimm", "desc": "5-bit Unsigned Imm"}], "pseudocode": "t = CSRs[csr]; CSRs[csr] = zext(uimm); R[rd] = t;", "example": "CSRRWI x0, 0x001, 0", "example_note": "Writes 0 to CSR 0x001.", "description": "CSRRWI atomically reads CSR csr into rd, then writes the zero-extended 5-bit immediate to the CSR. If rd is x0, the read is skipped."}
{"mnemonic": "CSRRSI", "architecture": "RISC-V", "extension": "Zicsr", "full_name": "CSR Read and Set Immediate", "summary": "Sets bits in a CSR using a 5-bit unsigned immediate.", "syntax": "CSRRSI rd, csr, uimm", "encoding": {"format": "I-Type", "binary_pattern": "csr | zimm5 | 110 | rd | 1110011", "hex_opcode": "0x00006073", "visual_parts": [{"raw": "csr", "clean": "csr", "pos": "31:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "csr", "desc": "CSR Address"}, {"name": "uimm", "desc": "Bit Mask"}], "pseudocode": "t = CSRs[csr]; CSRs[csr] = t | zext(uimm); R[rd] = t;", "example": "CSRRSI x0, sstatus, 1", "example_note": "Sets bit 0 of sstatus.", "description": "CSRRSI atomically reads CSR csr into rd, then sets bits in the CSR corresponding to set bits in the zero-extended 5-bit immediate. If the immediate is zero, no bits are modified."}
{"mnemonic": "CSRRCI", "architecture": "RISC-V", "extension": "Zicsr", "full_name": "CSR Read and Clear Immediate", "summary": "Clears bits in a CSR using a 5-bit unsigned immediate.", "syntax": "CSRRCI rd, csr, uimm", "encoding": {"format": "I-Type", "binary_pattern": "csr | zimm5 | 111 | rd | 1110011", "hex_opcode": "0x00007073", "visual_parts": [{"raw": "csr", "clean": "csr", "pos": "31:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "csr", "desc": "CSR Address"}, {"name": "uimm", "desc": "Bit Mask"}], "pseudocode": "t = CSRs[csr]; CSRs[csr] = t & ~zext(uimm); R[rd] = t;", "example": "CSRRCI x0, sstatus, 2", "example_note": "Clears bit 1 of sstatus.", "description": "CSRRCI atomically reads CSR csr into rd, then clears bits in the CSR corresponding to set bits in the zero-extended 5-bit immediate. If the immediate is zero, no bits are modified."}
{"mnemonic": "FLD", "architecture": "RISC-V", "extension": "D", "full_name": "Float Load Double", "summary": "Loads a 64-bit double-precision floating-point value from memory.", "syntax": "FLD rd, offset(rs1)", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 011 | rd | 0000111", "hex_opcode": "0x00003007", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Float Reg)"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "F[rd] = M[R[rs1] + sext(offset)][63:0];", "example": "FLD f1, 8(x10)", "example_note": "Loads double from address x10+8.", "description": "Loads a 64-bit doubleword from memory at address rs1+sext(offset) into floating-point register rd."}
{"mnemonic": "FSD", "architecture": "RISC-V", "extension": "D", "full_name": "Float Store Double", "summary": "Stores a 64-bit double-precision floating-point value to memory.", "syntax": "FSD rs2, offset(rs1)", "encoding": {"format": "S-Type", "binary_pattern": "imm12hi | rs2 | rs1 | 011 | imm12lo | 0100111", "hex_opcode": "0x00003027", "visual_parts": [{"raw": "imm12hi", "clean": "imm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "imm12lo", "clean": "imm12lo", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs2", "desc": "Src (Float Reg)"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[rs1] + sext(offset)][63:0] = F[rs2];", "example": "FSD f1, 16(x2)", "example_note": "Stores f1 to stack+16.", "description": "Stores a floating-point register to memory at address rs1+sext(offset)."}
{"mnemonic": "FADD.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Add Double", "summary": "Performs double-precision floating-point addition.", "syntax": "FADD.D rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | rm | rd | 1010011", "hex_opcode": "0x02000053", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = F[rs1] + F[rs2];", "example": "FADD.D f0, f1, f2", "example_note": "64-bit float addition.", "description": "Performs double-precision (64-bit) floating-point addition. The operation adds the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008."}
{"mnemonic": "FSUB.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Subtract Double", "summary": "Performs double-precision floating-point subtraction.", "syntax": "FSUB.D rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000101 | rs2 | rs1 | rm | rd | 1010011", "hex_opcode": "0x0A000053", "visual_parts": [{"raw": "0000101", "clean": "0000101", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = F[rs1] - F[rs2];", "example": "FSUB.D f0, f1, f2", "example_note": "64-bit float subtraction.", "description": "Performs double-precision (64-bit) floating-point subtraction. The operation subtracts the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008."}
{"mnemonic": "FMUL.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Multiply Double", "summary": "Performs double-precision floating-point multiplication.", "syntax": "FMUL.D rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0001001 | rs2 | rs1 | rm | rd | 1010011", "hex_opcode": "0x12000053", "visual_parts": [{"raw": "0001001", "clean": "0001001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = F[rs1] * F[rs2];", "example": "FMUL.D f0, f1, f2", "example_note": "64-bit float multiplication.", "description": "Performs double-precision (64-bit) floating-point multiplication. The operation multiplies the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008."}
{"mnemonic": "FDIV.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Divide Double", "summary": "Performs double-precision floating-point division.", "syntax": "FDIV.D rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0001101 | rs2 | rs1 | rm | rd | 1010011", "hex_opcode": "0x1A000053", "visual_parts": [{"raw": "0001101", "clean": "0001101", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Dividend"}, {"name": "rs2", "desc": "Divisor"}], "pseudocode": "F[rd] = F[rs1] / F[rs2];", "example": "FDIV.D f0, f1, f2", "example_note": "64-bit float division.", "description": "Performs double-precision (64-bit) floating-point division. The operation divides the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008."}
{"mnemonic": "AMOOR.W", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic OR Word", "summary": "Atomically performs bitwise OR on a word in memory.", "syntax": "AMOOR.W rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "01000 | aq | rl | rs2 | rs1 | 010 | rd | 0101111", "hex_opcode": "0x4000202F", "visual_parts": [{"raw": "01000", "clean": "01000", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = temp | R[rs2]; R[rd] = temp;", "example": "AMOOR.W x10, x11, (x12)", "example_note": "Atomic OR.", "description": "AMOOR.W atomically loads a word from the address in rs1 into rd, ORs it with rs2, and stores the result back."}
{"mnemonic": "AMOXOR.W", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic XOR Word", "summary": "Atomically performs bitwise XOR on a word in memory.", "syntax": "AMOXOR.W rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "00100 | aq | rl | rs2 | rs1 | 010 | rd | 0101111", "hex_opcode": "0x2000202F", "visual_parts": [{"raw": "00100", "clean": "00100", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = temp ^ R[rs2]; R[rd] = temp;", "example": "AMOXOR.W x10, x11, (x12)", "example_note": "Atomic XOR.", "description": "AMOXOR.W atomically loads a word, XORs it with rs2, and stores the result back."}
{"mnemonic": "AMOMAX.W", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic Max Word", "summary": "Atomically updates memory with the maximum of the memory value and register value (Signed).", "syntax": "AMOMAX.W rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "10100 | aq | rl | rs2 | rs1 | 010 | rd | 0101111", "hex_opcode": "0xA000202F", "visual_parts": [{"raw": "10100", "clean": "10100", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = max(temp, R[rs2]); R[rd] = temp;", "example": "AMOMAX.W x10, x11, (x12)", "example_note": "Atomic Signed Max.", "description": "AMOMAX.W atomically loads a word, writes the signed maximum of the loaded value and rs2 back to memory, and returns the original value in rd."}
{"mnemonic": "AMOMIN.W", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic Min Word", "summary": "Atomically updates memory with the minimum of the memory value and register value (Signed).", "syntax": "AMOMIN.W rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "10000 | aq | rl | rs2 | rs1 | 010 | rd | 0101111", "hex_opcode": "0x8000202F", "visual_parts": [{"raw": "10000", "clean": "10000", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = min(temp, R[rs2]); R[rd] = temp;", "example": "AMOMIN.W x10, x11, (x12)", "example_note": "Atomic Signed Min.", "description": "AMOMIN.W atomically computes the signed minimum of a memory word and rs2, stores the result, and returns the original in rd."}
{"mnemonic": "URET", "architecture": "RISC-V", "extension": "Privileged", "full_name": "User Return", "summary": "Returns from a user-mode trap handler (requires N extension).", "syntax": "URET", "encoding": {"format": "R-Type (System)", "binary_pattern": "0000000 | 00010 | 00000 | 000 | 00000 | 1110011", "hex_opcode": "0x00200073", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "00010", "clean": "00010", "pos": "24:20"}, {"raw": "00000", "clean": "00000", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "00000", "clean": "00000", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [], "pseudocode": "PC = UEPC; Priv = U; UIE = UPIE;", "example": "URET", "example_note": "Return from User-mode exception.", "description": "URET returns from a user-level trap (N extension). It restores PC from uepc and restores interrupt-enable state."}
{"mnemonic": "VLE8.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load Element (8-bit)", "summary": "Loads a vector of 8-bit elements from memory.", "syntax": "VLE8.V vd, (rs1), vm", "encoding": {"format": "VL-Type", "binary_pattern": "000000 | vm | 00000 | rs1 | 000 | vd | 0000111", "hex_opcode": "0x00000007", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base Address"}], "pseudocode": "foreach(i < vl): vd[i] = M[rs1 + i];", "description": "Performs a vector unit-stride load of 8-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLE8.V v1, a0, v0.t"}
{"mnemonic": "VLE16.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load Element (16-bit)", "summary": "Loads a vector of 16-bit elements from memory.", "syntax": "VLE16.V vd, (rs1), vm", "encoding": {"format": "VL-Type", "binary_pattern": "000000 | vm | 00000 | rs1 | 101 | vd | 0000111", "hex_opcode": "0x00005007", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base Address"}], "pseudocode": "foreach(i < vl): vd[i] = M[rs1 + i*2];", "description": "Performs a vector unit-stride load of 16-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLE16.V v1, a0, v0.t"}
{"mnemonic": "VLE64.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load Element (64-bit)", "summary": "Loads a vector of 64-bit elements from memory.", "syntax": "VLE64.V vd, (rs1), vm", "encoding": {"format": "VL-Type", "binary_pattern": "000000 | vm | 00000 | rs1 | 111 | vd | 0000111", "hex_opcode": "0x00007007", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base Address"}], "pseudocode": "foreach(i < vl): vd[i] = M[rs1 + i*8];", "description": "Performs a vector unit-stride load of 64-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLE64.V v1, a0, v0.t"}
{"mnemonic": "VSE8.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Store Element (8-bit)", "summary": "Stores a vector of 8-bit elements to memory.", "syntax": "VSE8.V vs3, (rs1), vm", "encoding": {"format": "VS-Type", "binary_pattern": "000000 | vm | 00000 | rs1 | 000 | vs3 | 0100111", "hex_opcode": "0x00000027", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vs3", "clean": "vs3", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vs3", "desc": "Source"}, {"name": "rs1", "desc": "Base Address"}], "pseudocode": "foreach(i < vl): M[rs1 + i] = vs3[i];", "description": "Performs a vector unit-stride store of 8-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VSE8.V v6, a0, v0.t"}
{"mnemonic": "VSE16.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Store Element (16-bit)", "summary": "Stores a vector of 16-bit elements to memory.", "syntax": "VSE16.V vs3, (rs1), vm", "encoding": {"format": "VS-Type", "binary_pattern": "000000 | vm | 00000 | rs1 | 101 | vs3 | 0100111", "hex_opcode": "0x00005027", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "vs3", "clean": "vs3", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vs3", "desc": "Source"}, {"name": "rs1", "desc": "Base Address"}], "pseudocode": "foreach(i < vl): M[rs1 + i*2] = vs3[i];", "description": "Performs a vector unit-stride store of 16-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VSE16.V v6, a0, v0.t"}
{"mnemonic": "VSE64.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Store Element (64-bit)", "summary": "Stores a vector of 64-bit elements to memory.", "syntax": "VSE64.V vs3, (rs1), vm", "encoding": {"format": "VS-Type", "binary_pattern": "000000 | vm | 00000 | rs1 | 111 | vs3 | 0100111", "hex_opcode": "0x00007027", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "vs3", "clean": "vs3", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vs3", "desc": "Source"}, {"name": "rs1", "desc": "Base Address"}], "pseudocode": "foreach(i < vl): M[rs1 + i*8] = vs3[i];", "description": "Performs a vector unit-stride store of 64-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VSE64.V v6, a0, v0.t"}
{"mnemonic": "VMV1R.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Move 1 Register (Whole)", "summary": "Moves a single vector register to another, ignoring VL and VTYPE (used for spilling).", "syntax": "VMV1R.V vd, vs2", "encoding": {"format": "OPVI", "binary_pattern": "1001111 | vs2 | 00000011 | vd | 1010111", "hex_opcode": "0x9E003057", "visual_parts": [{"raw": "1001111", "clean": "1001111", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00000011", "clean": "00000011", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source"}], "pseudocode": "vd = vs2; // Copies entire register content", "description": "Copies 1 vector register(s) from vs2 to vd, independent of vtype or vl. No masking.", "example": "VMV1R.V v1, v4"}
{"mnemonic": "VMV2R.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Move 2 Registers (Whole)", "summary": "Moves 2 consecutive vector registers, ignoring VL and VTYPE.", "syntax": "VMV2R.V vd, vs2", "encoding": {"format": "OPVI", "binary_pattern": "1001111 | vs2 | 00001011 | vd | 1010111", "hex_opcode": "0x9E00B057", "visual_parts": [{"raw": "1001111", "clean": "1001111", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00001011", "clean": "00001011", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Group"}, {"name": "vs2", "desc": "Source Group"}], "pseudocode": "vd[0:1] = vs2[0:1];", "description": "Copies 2 vector register(s) from vs2 to vd, independent of vtype or vl. No masking.", "example": "VMV2R.V v1, v4"}
{"mnemonic": "VMV4R.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Move 4 Registers (Whole)", "summary": "Moves 4 consecutive vector registers, ignoring VL and VTYPE.", "syntax": "VMV4R.V vd, vs2", "encoding": {"format": "OPVI", "binary_pattern": "1001111 | vs2 | 00011011 | vd | 1010111", "hex_opcode": "0x9E01B057", "visual_parts": [{"raw": "1001111", "clean": "1001111", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00011011", "clean": "00011011", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Group"}, {"name": "vs2", "desc": "Source Group"}], "pseudocode": "vd[0:3] = vs2[0:3];", "description": "Copies 4 vector register(s) from vs2 to vd, independent of vtype or vl. No masking.", "example": "VMV4R.V v1, v4"}
{"mnemonic": "VMV8R.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Move 8 Registers (Whole)", "summary": "Moves 8 consecutive vector registers, ignoring VL and VTYPE.", "syntax": "VMV8R.V vd, vs2", "encoding": {"format": "OPVI", "binary_pattern": "1001111 | vs2 | 00111011 | vd | 1010111", "hex_opcode": "0x9E03B057", "visual_parts": [{"raw": "1001111", "clean": "1001111", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00111011", "clean": "00111011", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Group"}, {"name": "vs2", "desc": "Source Group"}], "pseudocode": "vd[0:7] = vs2[0:7];", "description": "Copies 8 vector register(s) from vs2 to vd, independent of vtype or vl. No masking.", "example": "VMV8R.V v1, v4"}
{"mnemonic": "VSETIVLI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Set VL Immediate", "summary": "Sets vector length (VL) and type (VTYPE) using a 5-bit immediate for the requested length.", "syntax": "VSETIVLI rd, uimm, vtypei", "encoding": {"format": "V-Type", "binary_pattern": "11 | zimm10 | zimm5 | 111 | rd | 1010111", "hex_opcode": "0xC0007057", "visual_parts": [{"raw": "11", "clean": "11", "pos": "31:30"}, {"raw": "zimm10", "clean": "zimm10", "pos": "29:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:30 | 29:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (New VL)"}, {"name": "uimm", "desc": "Req VL (Imm)"}, {"name": "vtypei", "desc": "Config"}], "pseudocode": "vl = set_config(uimm, vtypei); R[rd] = vl;", "description": "Sets the vector length (vl) and vector type (vtype) registers based on the requested application vector length (AVL) and element width/grouping. The actual vector length set is written to rd. vtype encodes SEW (element width), LMUL (register grouping), and tail/mask policies.", "example": "VSETIVLI t0, 4, vtypei"}
{"mnemonic": "VLM.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load Mask", "summary": "Loads a vector mask register from memory.", "syntax": "VLM.V vd, (rs1)", "encoding": {"format": "VL-Type", "binary_pattern": "000000101011 | rs1 | 000 | vd | 0000111", "hex_opcode": "0x02B00007", "visual_parts": [{"raw": "000000101011", "clean": "000000101011", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "rs1", "desc": "Base Address"}], "pseudocode": "vd = LoadMask(rs1);", "description": "Performs a vector mask register load of element-sized-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLM.V v1, a0"}
{"mnemonic": "VSM.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Store Mask", "summary": "Stores a vector mask register to memory.", "syntax": "VSM.V vs3, (rs1)", "encoding": {"format": "VS-Type", "binary_pattern": "000000101011 | rs1 | 000 | vs3 | 0100111", "hex_opcode": "0x02B00027", "visual_parts": [{"raw": "000000101011", "clean": "000000101011", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vs3", "clean": "vs3", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vs3", "desc": "Src Mask"}, {"name": "rs1", "desc": "Base Address"}], "pseudocode": "StoreMask(rs1, vs3);", "description": "Performs a vector mask register store of element-sized-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VSM.V v6, a0"}
{"mnemonic": "AMOMINU.D", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic Min Unsigned Doubleword", "summary": "Atomically updates memory with the minimum of the memory value and register value (Unsigned 64-bit).", "syntax": "AMOMINU.D rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "11000 | aq | rl | rs2 | rs1 | 011 | rd | 0101111", "hex_opcode": "0xC000302F", "visual_parts": [{"raw": "11000", "clean": "11000", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = min_u(temp, R[rs2]); R[rd] = temp;", "description": "AMOMINU.D performs an atomic unsigned minimum doubleword operation (RV64 only).", "example": "AMOMINU.D t0, a1, a0"}
{"mnemonic": "AMOMAXU.D", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic Max Unsigned Doubleword", "summary": "Atomically updates memory with the maximum of the memory value and register value (Unsigned 64-bit).", "syntax": "AMOMAXU.D rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "11100 | aq | rl | rs2 | rs1 | 011 | rd | 0101111", "hex_opcode": "0xE000302F", "visual_parts": [{"raw": "11100", "clean": "11100", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = max_u(temp, R[rs2]); R[rd] = temp;", "description": "AMOMAXU.D performs an atomic unsigned maximum doubleword operation (RV64 only).", "example": "AMOMAXU.D t0, a1, a0"}
{"mnemonic": "FMSUB.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Fused Multiply-Subtract (Single)", "summary": "Computes (rs1 * rs2) - rs3 with a single rounding.", "syntax": "FMSUB.S rd, rs1, rs2, rs3", "encoding": {"format": "R4-Type", "binary_pattern": "rs3 | 00 | rs2 | rs1 | rm | rd | 1000111", "hex_opcode": "0x00000047", "visual_parts": [{"raw": "rs3", "clean": "rs3", "pos": "31:27"}, {"raw": "00", "clean": "00", "pos": "26:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1000111", "clean": "1000111", "pos": "6:0"}], "bit_positions": "31:27 | 26:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "rs3", "desc": "Src 3"}], "pseudocode": "F[rd] = (F[rs1] * F[rs2]) - F[rs3];", "description": "Performs single-precision (32-bit) floating-point fused multiply-subtract. The operation computes fused multiply-subtract on the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FMSUB.S t0, a0, a1, a2"}
{"mnemonic": "FNMADD.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Negated Fused Multiply-Add (Single)", "summary": "Computes -(rs1 * rs2) - rs3 with a single rounding.", "syntax": "FNMADD.S rd, rs1, rs2, rs3", "encoding": {"format": "R4-Type", "binary_pattern": "rs3 | 00 | rs2 | rs1 | rm | rd | 1001111", "hex_opcode": "0x0000004F", "visual_parts": [{"raw": "rs3", "clean": "rs3", "pos": "31:27"}, {"raw": "00", "clean": "00", "pos": "26:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1001111", "clean": "1001111", "pos": "6:0"}], "bit_positions": "31:27 | 26:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "rs3", "desc": "Src 3"}], "pseudocode": "F[rd] = -((F[rs1] * F[rs2]) + F[rs3]);", "description": "Performs single-precision (32-bit) floating-point fused negate-multiply-add. The operation computes fused negate-multiply-add on the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FNMADD.S t0, a0, a1, a2"}
{"mnemonic": "FNMSUB.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Negated Fused Multiply-Subtract (Single)", "summary": "Computes -(rs1 * rs2) + rs3 with a single rounding.", "syntax": "FNMSUB.S rd, rs1, rs2, rs3", "encoding": {"format": "R4-Type", "binary_pattern": "rs3 | 00 | rs2 | rs1 | rm | rd | 1001011", "hex_opcode": "0x0000004B", "visual_parts": [{"raw": "rs3", "clean": "rs3", "pos": "31:27"}, {"raw": "00", "clean": "00", "pos": "26:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1001011", "clean": "1001011", "pos": "6:0"}], "bit_positions": "31:27 | 26:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "rs3", "desc": "Src 3"}], "pseudocode": "F[rd] = -((F[rs1] * F[rs2]) - F[rs3]);", "description": "Performs single-precision (32-bit) floating-point fused negate-multiply-subtract. The operation computes fused negate-multiply-subtract on the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FNMSUB.S t0, a0, a1, a2"}
{"mnemonic": "FSQRT.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Square Root (Double)", "summary": "Computes the square root of a double-precision floating-point number.", "syntax": "FSQRT.D rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "010110100000 | rs1 | rm | rd | 1010011", "hex_opcode": "0x5A000053", "visual_parts": [{"raw": "010110100000", "clean": "010110100000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "F[rd] = sqrt(F[rs1]);", "description": "Stores a floating-point register to memory at address rs1+sext(offset).", "example": "FSQRT.D t0, a0"}
{"mnemonic": "FMIN.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Minimum (Double)", "summary": "Writes the smaller of two double-precision floating-point values to rd.", "syntax": "FMIN.D rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010101 | rs2 | rs1 | 000 | rd | 1010011", "hex_opcode": "0x2A000053", "visual_parts": [{"raw": "0010101", "clean": "0010101", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = min(F[rs1], F[rs2]);", "description": "Returns the double-precision (64-bit) floating-point minimum of rs1 and rs2, following IEEE 754-2019 minNum/maxNum semantics. Quiet NaN inputs return the non-NaN operand; signalling NaN inputs raise invalid-operation.", "example": "FMIN.D t0, a0, a1"}
{"mnemonic": "FMAX.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Maximum (Double)", "summary": "Writes the larger of two double-precision floating-point values to rd.", "syntax": "FMAX.D rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010101 | rs2 | rs1 | 001 | rd | 1010011", "hex_opcode": "0x2A001053", "visual_parts": [{"raw": "0010101", "clean": "0010101", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = max(F[rs1], F[rs2]);", "description": "Returns the double-precision (64-bit) floating-point maximum of rs1 and rs2, following IEEE 754-2019 minNum/maxNum semantics. Quiet NaN inputs return the non-NaN operand; signalling NaN inputs raise invalid-operation.", "example": "FMAX.D t0, a0, a1"}
{"mnemonic": "FMSUB.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Fused Multiply-Subtract (Double)", "summary": "Computes (rs1 * rs2) - rs3 with a single rounding (Double).", "syntax": "FMSUB.D rd, rs1, rs2, rs3", "encoding": {"format": "R4-Type", "binary_pattern": "rs3 | 01 | rs2 | rs1 | rm | rd | 1000111", "hex_opcode": "0x02000047", "visual_parts": [{"raw": "rs3", "clean": "rs3", "pos": "31:27"}, {"raw": "01", "clean": "01", "pos": "26:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1000111", "clean": "1000111", "pos": "6:0"}], "bit_positions": "31:27 | 26:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "rs3", "desc": "Src 3"}], "pseudocode": "F[rd] = (F[rs1] * F[rs2]) - F[rs3];", "description": "Performs double-precision (64-bit) floating-point fused multiply-subtract. The operation computes fused multiply-subtract on the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FMSUB.D t0, a0, a1, a2"}
{"mnemonic": "FNMADD.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Negated Fused Multiply-Add (Double)", "summary": "Computes -(rs1 * rs2) - rs3 with a single rounding (Double).", "syntax": "FNMADD.D rd, rs1, rs2, rs3", "encoding": {"format": "R4-Type", "binary_pattern": "rs3 | 01 | rs2 | rs1 | rm | rd | 1001111", "hex_opcode": "0x0200004F", "visual_parts": [{"raw": "rs3", "clean": "rs3", "pos": "31:27"}, {"raw": "01", "clean": "01", "pos": "26:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1001111", "clean": "1001111", "pos": "6:0"}], "bit_positions": "31:27 | 26:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "rs3", "desc": "Src 3"}], "pseudocode": "F[rd] = -((F[rs1] * F[rs2]) + F[rs3]);", "description": "Performs double-precision (64-bit) floating-point fused negate-multiply-add. The operation computes fused negate-multiply-add on the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FNMADD.D t0, a0, a1, a2"}
{"mnemonic": "FNMSUB.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Negated Fused Multiply-Subtract (Double)", "summary": "Computes -(rs1 * rs2) + rs3 with a single rounding (Double).", "syntax": "FNMSUB.D rd, rs1, rs2, rs3", "encoding": {"format": "R4-Type", "binary_pattern": "rs3 | 01 | rs2 | rs1 | rm | rd | 1001011", "hex_opcode": "0x0200004B", "visual_parts": [{"raw": "rs3", "clean": "rs3", "pos": "31:27"}, {"raw": "01", "clean": "01", "pos": "26:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1001011", "clean": "1001011", "pos": "6:0"}], "bit_positions": "31:27 | 26:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "rs3", "desc": "Src 3"}], "pseudocode": "F[rd] = -((F[rs1] * F[rs2]) - F[rs3]);", "description": "Performs double-precision (64-bit) floating-point fused negate-multiply-subtract. The operation computes fused negate-multiply-subtract on the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FNMSUB.D t0, a0, a1, a2"}
{"mnemonic": "FCVT.WU.D", "architecture": "RISC-V", "extension": "D", "full_name": "Convert Double to Unsigned Word", "summary": "Converts a double-precision float to a 32-bit unsigned integer.", "syntax": "FCVT.WU.D rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110000100001 | rs1 | rm | rd | 1010011", "hex_opcode": "0xC2100053", "visual_parts": [{"raw": "110000100001", "clean": "110000100001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (UInt)"}, {"name": "rs1", "desc": "Source (Double)"}], "pseudocode": "R[rd] = sext(f64_to_u32(F[rs1]));", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value.", "example": "FCVT.WU.D t0, a0"}
{"mnemonic": "FCVT.D.WU", "architecture": "RISC-V", "extension": "D", "full_name": "Convert Unsigned Word to Double", "summary": "Converts a 32-bit unsigned integer to a double-precision float.", "syntax": "FCVT.D.WU rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110100100001 | rs1 | rm | rd | 1010011", "hex_opcode": "0xD2100053", "visual_parts": [{"raw": "110100100001", "clean": "110100100001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Double)"}, {"name": "rs1", "desc": "Source (UInt)"}], "pseudocode": "F[rd] = u32_to_f64(R[rs1]);", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value.", "example": "FCVT.D.WU t0, a0"}
{"mnemonic": "C.FLW", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Float Load Word", "summary": "Loads a single-precision float from memory (Compressed).", "syntax": "C.FLW rd', offset(rs1')", "encoding": {"format": "CL", "binary_pattern": "? | 011 | c_uimm7hi | rs1_p | c_uimm7lo | rd_p | 00", "hex_opcode": "0x00006000", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "011", "clean": "011", "pos": "15:13"}, {"raw": "c_uimm7hi", "clean": "c_uimm7hi", "pos": "12:10"}, {"raw": "rs1_p", "clean": "rs1_p", "pos": "9:7"}, {"raw": "c_uimm7lo", "clean": "c_uimm7lo", "pos": "6:5"}, {"raw": "rd_p", "clean": "rd_p", "pos": "4:2"}, {"raw": "00", "clean": "00", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest (f8-f15)"}, {"name": "rs1'", "desc": "Base (x8-x15)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "F[rd'] = M[R[rs1'] + offset][31:0];", "description": "Loads a single-precision FP value from memory into fd′ (RV32 only).", "example": "C.FLW rd', 0(a0)"}
{"mnemonic": "C.FSW", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Float Store Word", "summary": "Stores a single-precision float to memory (Compressed).", "syntax": "C.FSW rs2', offset(rs1')", "encoding": {"format": "CS", "binary_pattern": "? | 111 | c_uimm7hi | rs1_p | c_uimm7lo | rs2_p | 00", "hex_opcode": "0x0000E000", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "111", "clean": "111", "pos": "15:13"}, {"raw": "c_uimm7hi", "clean": "c_uimm7hi", "pos": "12:10"}, {"raw": "rs1_p", "clean": "rs1_p", "pos": "9:7"}, {"raw": "c_uimm7lo", "clean": "c_uimm7lo", "pos": "6:5"}, {"raw": "rs2_p", "clean": "rs2_p", "pos": "4:2"}, {"raw": "00", "clean": "00", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rs2'", "desc": "Source (f8-f15)"}, {"name": "rs1'", "desc": "Base (x8-x15)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[rs1'] + offset][31:0] = F[rs2'];", "description": "Stores a single-precision FP value from fd′ to memory (RV32 only).", "example": "C.FSW rs2', 0(a0)"}
{"mnemonic": "C.LD", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Load Doubleword", "summary": "Loads a 64-bit value from memory (Compressed, RV64).", "syntax": "C.LD rd', offset(rs1')", "encoding": {"format": "CL", "binary_pattern": "? | 011 | c_uimm8hi | rs1_p | c_uimm8lo | rd_p | 00", "hex_opcode": "0x00006000", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "011", "clean": "011", "pos": "15:13"}, {"raw": "c_uimm8hi", "clean": "c_uimm8hi", "pos": "12:10"}, {"raw": "rs1_p", "clean": "rs1_p", "pos": "9:7"}, {"raw": "c_uimm8lo", "clean": "c_uimm8lo", "pos": "6:5"}, {"raw": "rd_p", "clean": "rd_p", "pos": "4:2"}, {"raw": "00", "clean": "00", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest (x8-x15)"}, {"name": "rs1'", "desc": "Base (x8-x15)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "R[rd'] = M[R[rs1'] + offset][63:0];", "description": "Loads a 64-bit doubleword from memory at an 8-bit unsigned offset from rs1′ into rd′ (RV64).", "example": "C.LD rd', 0(a0)"}
{"mnemonic": "C.SD", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Store Doubleword", "summary": "Stores a 64-bit value to memory (Compressed, RV64).", "syntax": "C.SD rs2', offset(rs1')", "encoding": {"format": "CS", "binary_pattern": "? | 111 | c_uimm8hi | rs1_p | c_uimm8lo | rs2_p | 00", "hex_opcode": "0x0000E000", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "111", "clean": "111", "pos": "15:13"}, {"raw": "c_uimm8hi", "clean": "c_uimm8hi", "pos": "12:10"}, {"raw": "rs1_p", "clean": "rs1_p", "pos": "9:7"}, {"raw": "c_uimm8lo", "clean": "c_uimm8lo", "pos": "6:5"}, {"raw": "rs2_p", "clean": "rs2_p", "pos": "4:2"}, {"raw": "00", "clean": "00", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rs2'", "desc": "Source (x8-x15)"}, {"name": "rs1'", "desc": "Base (x8-x15)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[rs1'] + offset][63:0] = R[rs2'];", "description": "Stores a 64-bit doubleword from rs2′ to memory at an 8-bit offset from rs1′ (RV64).", "example": "C.SD rs2', 0(a0)"}
{"mnemonic": "VFADD.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Add", "summary": "Adds elements of two vector registers (Floating Point).", "syntax": "VFADD.VV vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "000000 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0x00001057", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] + vs2[i];", "description": "Performs element-wise floating-point addition on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VFADD.VV v1, v4, v2, v0.t"}
{"mnemonic": "VRGATHER.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Register Gather", "summary": "Gathers elements from a vector register using indices from another vector register.", "syntax": "VRGATHER.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "001100 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x30000057", "visual_parts": [{"raw": "001100", "clean": "001100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source Table"}, {"name": "vs1", "desc": "Indices"}], "pseudocode": "foreach(i < vl): vd[i] = (vs1[i] >= vlmax) ? 0 : vs2[vs1[i]];", "description": "Gathers elements from vs2 using indices in vs1 (or an immediate), writing to vd. Out-of-range indices produce zero.", "example": "VRGATHER.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMAND.MM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask AND", "summary": "Performs bitwise AND on vector mask registers.", "syntax": "VMAND.MM vd, vs2, vs1", "encoding": {"format": "OPMVV", "binary_pattern": "0110011 | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x66002057", "visual_parts": [{"raw": "0110011", "clean": "0110011", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Src 2 Mask"}, {"name": "vs1", "desc": "Src 1 Mask"}], "pseudocode": "vd = vs1 & vs2;", "description": "Performs element-wise mask AND on the mask registers vm1 and vm2, writing to vd.", "example": "VMAND.MM v1, v4, v2"}
{"mnemonic": "AMOADD.D", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic Add Doubleword", "summary": "Atomically adds a value to a 64-bit doubleword in memory.", "syntax": "AMOADD.D rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "00000 | aq | rl | rs2 | rs1 | 011 | rd | 0101111", "hex_opcode": "0x0000302F", "visual_parts": [{"raw": "00000", "clean": "00000", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Value to Add"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = temp + R[rs2]; R[rd] = temp;", "example": "AMOADD.D x10, x11, (x12)", "example_note": "64-bit atomic add.", "description": "AMOADD.D atomically loads a doubleword from the address in rs1 into rd, adds rs2, and stores the result back (RV64 only)."}
{"mnemonic": "AMOSWAP.D", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic Swap Doubleword", "summary": "Atomically swaps a 64-bit value in memory with a register.", "syntax": "AMOSWAP.D rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "00001 | aq | rl | rs2 | rs1 | 011 | rd | 0101111", "hex_opcode": "0x0800302F", "visual_parts": [{"raw": "00001", "clean": "00001", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "New Value"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = R[rs2]; R[rd] = temp;", "example": "AMOSWAP.D x10, x11, (x12)", "example_note": "64-bit atomic swap.", "description": "AMOSWAP.D atomically loads a doubleword, writes it to rd, and stores rs2 to that address (RV64 only)."}
{"mnemonic": "AMOAND.D", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic AND Doubleword", "summary": "Atomically performs bitwise AND on a 64-bit doubleword in memory.", "syntax": "AMOAND.D rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "01100 | aq | rl | rs2 | rs1 | 011 | rd | 0101111", "hex_opcode": "0x6000302F", "visual_parts": [{"raw": "01100", "clean": "01100", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = temp & R[rs2]; R[rd] = temp;", "example": "AMOAND.D x5, x6, (x7)", "example_note": "64-bit atomic AND.", "description": "AMOAND.D atomically loads a doubleword, ANDs with rs2, and stores the result back (RV64 only)."}
{"mnemonic": "AMOOR.D", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic OR Doubleword", "summary": "Atomically performs bitwise OR on a 64-bit doubleword in memory.", "syntax": "AMOOR.D rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "01000 | aq | rl | rs2 | rs1 | 011 | rd | 0101111", "hex_opcode": "0x4000302F", "visual_parts": [{"raw": "01000", "clean": "01000", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = temp | R[rs2]; R[rd] = temp;", "example": "AMOOR.D x10, x11, (x12)", "example_note": "64-bit atomic OR.", "description": "AMOOR.D atomically loads a doubleword, ORs with rs2, and stores the result back (RV64 only)."}
{"mnemonic": "AMOXOR.D", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic XOR Doubleword", "summary": "Atomically performs bitwise XOR on a 64-bit doubleword in memory.", "syntax": "AMOXOR.D rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "00100 | aq | rl | rs2 | rs1 | 011 | rd | 0101111", "hex_opcode": "0x2000302F", "visual_parts": [{"raw": "00100", "clean": "00100", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = temp ^ R[rs2]; R[rd] = temp;", "example": "AMOXOR.D x10, x11, (x12)", "example_note": "64-bit atomic XOR.", "description": "AMOXOR.D atomically loads a doubleword, XORs with rs2, and stores the result back (RV64 only)."}
{"mnemonic": "AMOMAX.D", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic Max Doubleword", "summary": "Atomically updates memory with the maximum of the memory value and register value (64-bit Signed).", "syntax": "AMOMAX.D rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "10100 | aq | rl | rs2 | rs1 | 011 | rd | 0101111", "hex_opcode": "0xA000302F", "visual_parts": [{"raw": "10100", "clean": "10100", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = max(temp, R[rs2]); R[rd] = temp;", "example": "AMOMAX.D x10, x11, (x12)", "example_note": "64-bit atomic max.", "description": "AMOMAX.D performs an atomic signed maximum doubleword operation (RV64 only)."}
{"mnemonic": "AMOMIN.D", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic Min Doubleword", "summary": "Atomically updates memory with the minimum of the memory value and register value (64-bit Signed).", "syntax": "AMOMIN.D rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "10000 | aq | rl | rs2 | rs1 | 011 | rd | 0101111", "hex_opcode": "0x8000302F", "visual_parts": [{"raw": "10000", "clean": "10000", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = min(temp, R[rs2]); R[rd] = temp;", "example": "AMOMIN.D x10, x11, (x12)", "example_note": "64-bit atomic min.", "description": "AMOMIN.D performs an atomic signed minimum doubleword operation (RV64 only)."}
{"mnemonic": "SC.D", "architecture": "RISC-V", "extension": "A", "full_name": "Store Conditional Doubleword", "summary": "Conditionally stores a 64-bit value to memory if the reservation is valid.", "syntax": "SC.D rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "00011 | aq | rl | rs2 | rs1 | 011 | rd | 0101111", "hex_opcode": "0x1800302F", "visual_parts": [{"raw": "00011", "clean": "00011", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (0=Success)"}, {"name": "rs2", "desc": "Source Value"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "if (ReservationValid) { M[R[rs1]] = R[rs2]; R[rd] = 0; } else { R[rd] = 1; }", "example": "SC.D x10, x11, (x12)", "example_note": "64-bit conditional store.", "description": "SC.D conditionally stores the doubleword in rs2 to the address in rs1, only if the reservation set by LR.D is still valid (RV64 only). It writes 0 to rd on success and a non-zero value on failure."}
{"mnemonic": "FMADD.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Fused Multiply-Add (Single)", "summary": "Computes (rs1 * rs2) + rs3 with a single rounding.", "syntax": "FMADD.S rd, rs1, rs2, rs3", "encoding": {"format": "R4-Type", "binary_pattern": "rs3 | 00 | rs2 | rs1 | rm | rd | 1000011", "hex_opcode": "0x00000043", "visual_parts": [{"raw": "rs3", "clean": "rs3", "pos": "31:27"}, {"raw": "00", "clean": "00", "pos": "26:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1000011", "clean": "1000011", "pos": "6:0"}], "bit_positions": "31:27 | 26:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "rs3", "desc": "Src 3"}], "pseudocode": "F[rd] = (F[rs1] * F[rs2]) + F[rs3];", "example": "FMADD.S f0, f1, f2, f3", "example_note": "f0 = (f1 * f2) + f3", "description": "Performs single-precision (32-bit) floating-point fused multiply-add. The operation computes fused multiply-add on the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008."}
{"mnemonic": "FMADD.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Fused Multiply-Add (Double)", "summary": "Computes (rs1 * rs2) + rs3 with a single rounding (64-bit).", "syntax": "FMADD.D rd, rs1, rs2, rs3", "encoding": {"format": "R4-Type", "binary_pattern": "rs3 | 01 | rs2 | rs1 | rm | rd | 1000011", "hex_opcode": "0x02000043", "visual_parts": [{"raw": "rs3", "clean": "rs3", "pos": "31:27"}, {"raw": "01", "clean": "01", "pos": "26:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1000011", "clean": "1000011", "pos": "6:0"}], "bit_positions": "31:27 | 26:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "rs3", "desc": "Src 3"}], "pseudocode": "F[rd] = (F[rs1] * F[rs2]) + F[rs3];", "example": "FMADD.D f0, f1, f2, f3", "example_note": "64-bit fused multiply-add.", "description": "Performs double-precision (64-bit) floating-point fused multiply-add. The operation computes fused multiply-add on the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008."}
{"mnemonic": "SUB", "architecture": "RISC-V", "extension": "RV32I", "full_name": "Subtract", "summary": "Subtracts rs2 from rs1.", "syntax": "SUB rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0100000 | rs2 | rs1 | 000 | rd | 0110011", "hex_opcode": "0x40000033", "visual_parts": [{"raw": "0100000", "clean": "0100000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Minuend"}, {"name": "rs2", "desc": "Subtrahend"}], "pseudocode": "R[rd] = R[rs1] - R[rs2];", "description": "SUB subtracts the value in rs2 from rs1 and writes the result to rd. Arithmetic overflow is ignored; the result is the low XLEN bits of the mathematical difference.", "example": "SUB t0, a0, a1"}
{"mnemonic": "SLTU", "architecture": "RISC-V", "extension": "RV32I", "full_name": "Set Less Than Unsigned", "summary": "Sets rd to 1 if rs1 < rs2 (unsigned comparison), otherwise 0.", "syntax": "SLTU rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | rs1 | 011 | rd | 0110011", "hex_opcode": "0x00003033", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = (R[rs1] <u R[rs2]) ? 1 : 0;", "description": "SLTU performs an unsigned comparison of rs1 and rs2, writing 1 to rd if rs1 < rs2 (unsigned), and 0 otherwise. Note: SLTU rd, x0, rs2 sets rd to 1 if rs2 is non-zero (assembler pseudoinstruction SNEZ).", "example": "SLTU t0, a0, a1"}
{"mnemonic": "SLTIU", "architecture": "RISC-V", "extension": "RV32I", "full_name": "Set Less Than Immediate Unsigned", "summary": "Sets rd to 1 if rs1 < immediate (unsigned comparison), otherwise 0.", "syntax": "SLTIU rd, rs1, imm", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 011 | rd | 0010011", "hex_opcode": "0x00003013", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "R[rd] = (R[rs1] <u sext(imm)) ? 1 : 0;", "description": "SLTIU compares rs1 against the sign-extended immediate treating both as unsigned integers, writing 1 to rd if rs1 < imm (unsigned), else 0. SLTIU rd, rs1, 1 implements SEQZ (set if equal to zero).", "example": "SLTIU t0, a0, 16"}
{"mnemonic": "ECALL", "architecture": "RISC-V", "extension": "RV32I", "full_name": "Environment Call", "summary": "Generates an environment call exception (system call).", "syntax": "ECALL", "encoding": {"format": "I-Type", "binary_pattern": "00000000000000000000000001110011", "hex_opcode": "0x00000073", "visual_parts": [{"raw": "00000000000000000000000001110011", "clean": "00000000000000000000000001110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "RaiseException(EnvironmentCall);", "description": "ECALL makes a service request to the execution environment. It generates an environment-call exception, whose handling depends on the privilege level (U, S, or M).", "example": "ECALL"}
{"mnemonic": "MULHU", "architecture": "RISC-V", "extension": "M", "full_name": "Multiply High Unsigned", "summary": "Performs unsigned multiplication and returns the upper XLEN bits.", "syntax": "MULHU rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 011 | rd | 0110011", "hex_opcode": "0x02003033", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Upper Bits)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = (R[rs1] *u R[rs2]) >> XLEN;", "description": "MULHU multiplies rs1 and rs2 as unsigned values and writes the upper XLEN bits of the product to rd.", "example": "MULHU t0, a0, a1"}
{"mnemonic": "MULHSU", "architecture": "RISC-V", "extension": "M", "full_name": "Multiply High Signed-Unsigned", "summary": "Multiplies signed rs1 by unsigned rs2 and returns the upper XLEN bits.", "syntax": "MULHSU rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 010 | rd | 0110011", "hex_opcode": "0x02002033", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Upper Bits)"}, {"name": "rs1", "desc": "Signed Source"}, {"name": "rs2", "desc": "Unsigned Source"}], "pseudocode": "R[rd] = (sext(R[rs1]) * zext(R[rs2])) >> XLEN;", "description": "MULHSU multiplies rs1 (signed) by rs2 (unsigned) and writes the upper XLEN bits of the product to rd.", "example": "MULHSU t0, a0, a1"}
{"mnemonic": "REMU", "architecture": "RISC-V", "extension": "M", "full_name": "Remainder Unsigned", "summary": "Computes the unsigned remainder of division.", "syntax": "REMU rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 111 | rd | 0110011", "hex_opcode": "0x02007033", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Remainder)"}, {"name": "rs1", "desc": "Dividend"}, {"name": "rs2", "desc": "Divisor"}], "pseudocode": "R[rd] = R[rs1] %u R[rs2];", "description": "REMU computes the unsigned remainder of rs1 ÷ rs2, writing the result to rd. Remainder by zero yields the dividend.", "example": "REMU t0, a0, a1"}
{"mnemonic": "AMOMINU.W", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic Min Unsigned Word", "summary": "Atomically updates memory with the minimum of the memory value and register value (Unsigned).", "syntax": "AMOMINU.W rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "11000 | aq | rl | rs2 | rs1 | 010 | rd | 0101111", "hex_opcode": "0xC000202F", "visual_parts": [{"raw": "11000", "clean": "11000", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = min_u(temp, R[rs2]); R[rd] = temp;", "description": "AMOMINU.W atomically computes the unsigned minimum of a memory word and rs2, stores the result, and returns the original in rd.", "example": "AMOMINU.W t0, a1, a0"}
{"mnemonic": "AMOMAXU.W", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic Max Unsigned Word", "summary": "Atomically updates memory with the maximum of the memory value and register value (Unsigned).", "syntax": "AMOMAXU.W rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "11100 | aq | rl | rs2 | rs1 | 010 | rd | 0101111", "hex_opcode": "0xE000202F", "visual_parts": [{"raw": "11100", "clean": "11100", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = max_u(temp, R[rs2]); R[rd] = temp;", "description": "AMOMAXU.W atomically computes the unsigned maximum of a memory word and rs2, stores the result, and returns the original in rd.", "example": "AMOMAXU.W t0, a1, a0"}
{"mnemonic": "FSUB.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Subtract (Single)", "summary": "Performs single-precision floating-point subtraction.", "syntax": "FSUB.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000100 | rs2 | rs1 | rm | rd | 1010011", "hex_opcode": "0x08000053", "visual_parts": [{"raw": "0000100", "clean": "0000100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = F[rs1] - F[rs2];", "description": "Performs single-precision (32-bit) floating-point subtraction. The operation subtracts the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FSUB.S t0, a0, a1"}
{"mnemonic": "FMUL.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Multiply (Single)", "summary": "Performs single-precision floating-point multiplication.", "syntax": "FMUL.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0001000 | rs2 | rs1 | rm | rd | 1010011", "hex_opcode": "0x10000053", "visual_parts": [{"raw": "0001000", "clean": "0001000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = F[rs1] * F[rs2];", "description": "Performs single-precision (32-bit) floating-point multiplication. The operation multiplies the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FMUL.S t0, a0, a1"}
{"mnemonic": "FDIV.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Divide (Single)", "summary": "Performs single-precision floating-point division.", "syntax": "FDIV.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0001100 | rs2 | rs1 | rm | rd | 1010011", "hex_opcode": "0x18000053", "visual_parts": [{"raw": "0001100", "clean": "0001100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Dividend"}, {"name": "rs2", "desc": "Divisor"}], "pseudocode": "F[rd] = F[rs1] / F[rs2];", "description": "Performs single-precision (32-bit) floating-point division. The operation divides the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FDIV.S t0, a0, a1"}
{"mnemonic": "FSQRT.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Square Root (Single)", "summary": "Computes the square root of a single-precision floating-point number.", "syntax": "FSQRT.S rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "010110000000 | rs1 | rm | rd | 1010011", "hex_opcode": "0x58000053", "visual_parts": [{"raw": "010110000000", "clean": "010110000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "F[rd] = sqrt(F[rs1]);", "description": "Stores a floating-point register to memory at address rs1+sext(offset).", "example": "FSQRT.S t0, a0"}
{"mnemonic": "FMIN.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Minimum (Single)", "summary": "Writes the smaller of two single-precision floating-point values to rd.", "syntax": "FMIN.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010100 | rs2 | rs1 | 000 | rd | 1010011", "hex_opcode": "0x28000053", "visual_parts": [{"raw": "0010100", "clean": "0010100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = min(F[rs1], F[rs2]);", "description": "Returns the single-precision (32-bit) floating-point minimum of rs1 and rs2, following IEEE 754-2019 minNum/maxNum semantics. Quiet NaN inputs return the non-NaN operand; signalling NaN inputs raise invalid-operation.", "example": "FMIN.S t0, a0, a1"}
{"mnemonic": "FMAX.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Maximum (Single)", "summary": "Writes the larger of two single-precision floating-point values to rd.", "syntax": "FMAX.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010100 | rs2 | rs1 | 001 | rd | 1010011", "hex_opcode": "0x28001053", "visual_parts": [{"raw": "0010100", "clean": "0010100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = max(F[rs1], F[rs2]);", "description": "Returns the single-precision (32-bit) floating-point maximum of rs1 and rs2, following IEEE 754-2019 minNum/maxNum semantics. Quiet NaN inputs return the non-NaN operand; signalling NaN inputs raise invalid-operation.", "example": "FMAX.S t0, a0, a1"}
{"mnemonic": "CSRR", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Control Status Register Read", "summary": "Reads the value of a CSR into a register.", "syntax": "CSRR rd, csr", "encoding": {"format": "I-Type", "binary_pattern": "csr | 00000010 | rd | 1110011", "hex_opcode": "0x00002073", "visual_parts": [{"raw": "csr", "clean": "csr", "pos": "31:20"}, {"raw": "00000010", "clean": "00000010", "pos": "19:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "csr", "desc": "CSR Address"}], "pseudocode": "R[rd] = CSRs[csr];", "example": "CSRR x10, mstatus", "example_note": "Read mstatus.", "description": "CSRR is an assembler pseudoinstruction for CSRRS rd, csr, x0. It reads the CSR into rd without modifying it."}
{"mnemonic": "CSRW", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Control Status Register Write", "summary": "Writes a register value to a CSR.", "syntax": "CSRW csr, rs", "encoding": {"format": "I-Type", "binary_pattern": "csr | rs1 | 001000001110011", "hex_opcode": "0x00001073", "visual_parts": [{"raw": "csr", "clean": "csr", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001000001110011", "clean": "001000001110011", "pos": "14:0"}], "bit_positions": "31:20 | 19:15 | 14:0"}, "operands": [{"name": "csr", "desc": "CSR Address"}, {"name": "rs", "desc": "Source"}], "pseudocode": "CSRs[csr] = R[rs];", "example": "CSRW mepc, x10", "example_note": "Write address in x10 to mepc.", "description": "CSRW is an assembler pseudoinstruction for CSRRW x0, csr, rs1. It writes rs1 to the CSR without reading it."}
{"mnemonic": "CSRS", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Control Status Register Set", "summary": "Sets bits in a CSR (bitwise OR).", "syntax": "CSRS csr, rs", "encoding": {"format": "I-Type", "binary_pattern": "csr | rs1 | 010000001110011", "hex_opcode": "0x00002073", "visual_parts": [{"raw": "csr", "clean": "csr", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010000001110011", "clean": "010000001110011", "pos": "14:0"}], "bit_positions": "31:20 | 19:15 | 14:0"}, "operands": [{"name": "csr", "desc": "CSR Address"}, {"name": "rs", "desc": "Bit Mask"}], "pseudocode": "CSRs[csr] |= R[rs];", "example": "CSRS sstatus, x5", "example_note": "Set bits in sstatus.", "description": "CSRS is an assembler pseudoinstruction for CSRRS x0, csr, rs1. It sets bits in the CSR based on rs1 without reading."}
{"mnemonic": "CSRC", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Control Status Register Clear", "summary": "Clears bits in a CSR (bitwise AND NOT).", "syntax": "CSRC csr, rs", "encoding": {"format": "I-Type", "binary_pattern": "csr | rs1 | 011000001110011", "hex_opcode": "0x00003073", "visual_parts": [{"raw": "csr", "clean": "csr", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011000001110011", "clean": "011000001110011", "pos": "14:0"}], "bit_positions": "31:20 | 19:15 | 14:0"}, "operands": [{"name": "csr", "desc": "CSR Address"}, {"name": "rs", "desc": "Bit Mask"}], "pseudocode": "CSRs[csr] &= ~R[rs];", "example": "CSRC sstatus, x5", "example_note": "Clear bits in sstatus.", "description": "CSRC is an assembler pseudoinstruction for CSRRC x0, csr, rs1. It clears bits in the CSR based on rs1 without reading."}
{"mnemonic": "FCVT.LU.D", "architecture": "RISC-V", "extension": "D", "full_name": "Convert Double to Unsigned Long", "summary": "Converts a double-precision float to a 64-bit unsigned integer.", "syntax": "FCVT.LU.D rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110000100011 | rs1 | rm | rd | 1010011", "hex_opcode": "0xC2300053", "visual_parts": [{"raw": "110000100011", "clean": "110000100011", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (ULong)"}, {"name": "rs1", "desc": "Source (Double)"}], "pseudocode": "R[rd] = f64_to_u64(F[rs1]);", "example": "FCVT.LU.D x10, f0", "example_note": "Double -> Unsigned 64-bit Int.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FLH", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Load Halfword", "summary": "Loads a 16-bit half-precision float from memory.", "syntax": "FLH rd, offset(rs1)", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 001 | rd | 0000111", "hex_opcode": "0x00001007", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Float)"}, {"name": "rs1", "desc": "Base"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "F[rd] = M[R[rs1] + sext(offset)][15:0];", "example": "FLH f1, 0(x10)", "example_note": "Load 16-bit float.", "description": "Loads a 16-bit halfword from memory at address rs1+sext(offset) into floating-point register rd."}
{"mnemonic": "FSH", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Store Halfword", "summary": "Stores a 16-bit half-precision float to memory.", "syntax": "FSH rs2, offset(rs1)", "encoding": {"format": "S-Type", "binary_pattern": "imm12hi | rs2 | rs1 | 001 | imm12lo | 0100111", "hex_opcode": "0x00001027", "visual_parts": [{"raw": "imm12hi", "clean": "imm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "imm12lo", "clean": "imm12lo", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs2", "desc": "Source"}, {"name": "rs1", "desc": "Base"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[rs1] + sext(offset)][15:0] = F[rs2];", "example": "FSH f1, 0(x10)", "example_note": "Store 16-bit float.", "description": "Stores a floating-point register to memory at address rs1+sext(offset)."}
{"mnemonic": "FADD.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Add Half", "summary": "Performs 16-bit floating-point addition.", "syntax": "FADD.H rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000010 | rs2 | rs1 | rm | rd | 1010011", "hex_opcode": "0x04000053", "visual_parts": [{"raw": "0000010", "clean": "0000010", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = F[rs1] + F[rs2];", "example": "FADD.H f0, f1, f2", "example_note": "16-bit float add.", "description": "Performs half-precision (16-bit) floating-point addition. The operation adds the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008."}
{"mnemonic": "FCVT.S.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Convert Half to Single", "summary": "Converts a 16-bit half-precision float to a 32-bit single-precision float.", "syntax": "FCVT.S.H rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "010000000010 | rs1 | rm | rd | 1010011", "hex_opcode": "0x40200053", "visual_parts": [{"raw": "010000000010", "clean": "010000000010", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Single)"}, {"name": "rs1", "desc": "Source (Half)"}], "pseudocode": "F[rd] = f16_to_f32(F[rs1]);", "example": "FCVT.S.H f0, f1", "example_note": "Promote Half to Float.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.H.S", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Convert Single to Half", "summary": "Converts a 32-bit single-precision float to a 16-bit half-precision float.", "syntax": "FCVT.H.S rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "010001000000 | rs1 | rm | rd | 1010011", "hex_opcode": "0x44000053", "visual_parts": [{"raw": "010001000000", "clean": "010001000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Half)"}, {"name": "rs1", "desc": "Source (Single)"}], "pseudocode": "F[rd] = f32_to_f16(F[rs1]);", "example": "FCVT.H.S f0, f1", "example_note": "Demote Float to Half.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "SUBW", "architecture": "RISC-V", "extension": "RV64I", "full_name": "Subtract Word", "summary": "Subtracts the lower 32 bits of rs2 from rs1 and sign-extends the result to 64 bits.", "syntax": "SUBW rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0100000 | rs2 | rs1 | 000 | rd | 0111011", "hex_opcode": "0x4000003B", "visual_parts": [{"raw": "0100000", "clean": "0100000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0111011", "clean": "0111011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Minuend"}, {"name": "rs2", "desc": "Subtrahend"}], "pseudocode": "R[rd] = sext((R[rs1] - R[rs2])[31:0]);", "example": "SUBW x10, x11, x12", "example_note": "32-bit subtraction on 64-bit registers.", "description": "SUBW subtracts rs2 from rs1, truncates to 32 bits, sign-extends to 64 bits, and writes to rd."}
{"mnemonic": "SLLW", "architecture": "RISC-V", "extension": "RV64I", "full_name": "Shift Left Logical Word", "summary": "Performs a 32-bit logical left shift on rs1 by the amount in rs2 (lower 5 bits), sign-extending the result.", "syntax": "SLLW rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | rs1 | 001 | rd | 0111011", "hex_opcode": "0x0000103B", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0111011", "clean": "0111011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Shift Amount"}], "pseudocode": "R[rd] = sext((R[rs1] << (R[rs2] & 0x1F))[31:0]);", "example": "SLLW x5, x6, x7", "example_note": "32-bit shift.", "description": "SLLW performs a logical left shift of the lower 32 bits of rs1 by the shift amount in the lower 5 bits of rs2, sign-extends the 32-bit result to 64 bits, and writes to rd."}
{"mnemonic": "SRLW", "architecture": "RISC-V", "extension": "RV64I", "full_name": "Shift Right Logical Word", "summary": "Performs a 32-bit logical right shift on rs1 by the amount in rs2, sign-extending the result.", "syntax": "SRLW rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | rs1 | 101 | rd | 0111011", "hex_opcode": "0x0000503B", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0111011", "clean": "0111011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Shift Amount"}], "pseudocode": "R[rd] = sext((R[rs1][31:0] >>u (R[rs2] & 0x1F)));", "example": "SRLW x5, x6, x7", "example_note": "32-bit logical right shift.", "description": "SRLW performs a logical right shift of the lower 32 bits of rs1 by the shift amount in the lower 5 bits of rs2, sign-extends the 32-bit result to 64 bits, and writes to rd."}
{"mnemonic": "SRAW", "architecture": "RISC-V", "extension": "RV64I", "full_name": "Shift Right Arithmetic Word", "summary": "Performs a 32-bit arithmetic right shift on rs1, sign-extending the result.", "syntax": "SRAW rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0100000 | rs2 | rs1 | 101 | rd | 0111011", "hex_opcode": "0x4000503B", "visual_parts": [{"raw": "0100000", "clean": "0100000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0111011", "clean": "0111011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Shift Amount"}], "pseudocode": "R[rd] = sext((R[rs1][31:0] >>s (R[rs2] & 0x1F)));", "example": "SRAW x5, x6, x7", "example_note": "32-bit arithmetic right shift.", "description": "SRAW performs an arithmetic right shift of the lower 32 bits of rs1 by the shift amount in the lower 5 bits of rs2, sign-extends the 32-bit result to 64 bits, and writes to rd."}
{"mnemonic": "SLLIW", "architecture": "RISC-V", "extension": "RV64I", "full_name": "Shift Left Logical Immediate Word", "summary": "Shifts the lower 32 bits of rs1 left by a constant, sign-extending the result.", "syntax": "SLLIW rd, rs1, shamt", "encoding": {"format": "I-Type (Shift)", "binary_pattern": "0000000 | shamtw | rs1 | 001 | rd | 0011011", "hex_opcode": "0x0000101B", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "shamtw", "clean": "shamtw", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0011011", "clean": "0011011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "shamt", "desc": "Shift Amount (0-31)"}], "pseudocode": "R[rd] = sext((R[rs1] << shamt)[31:0]);", "example": "SLLIW x10, x11, 4", "example_note": "Shift lower 32 bits left by 4.", "description": "SLLIW performs a logical left shift of the lower 32 bits of rs1 by the 5-bit immediate, sign-extends the 32-bit result to 64 bits, and writes it to rd."}
{"mnemonic": "SRLIW", "architecture": "RISC-V", "extension": "RV64I", "full_name": "Shift Right Logical Immediate Word", "summary": "Logically shifts the lower 32 bits of rs1 right by a constant, sign-extending the result.", "syntax": "SRLIW rd, rs1, shamt", "encoding": {"format": "I-Type (Shift)", "binary_pattern": "0000000 | shamtw | rs1 | 101 | rd | 0011011", "hex_opcode": "0x0000501B", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "shamtw", "clean": "shamtw", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0011011", "clean": "0011011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "shamt", "desc": "Shift Amount"}], "pseudocode": "R[rd] = sext((R[rs1][31:0] >>u shamt));", "example": "SRLIW x10, x11, 4", "example_note": "Logical right shift of lower word.", "description": "SRLIW performs a logical right shift of the lower 32 bits of rs1 by the 5-bit immediate, sign-extends the 32-bit result to 64 bits, and writes it to rd."}
{"mnemonic": "SRAIW", "architecture": "RISC-V", "extension": "RV64I", "full_name": "Shift Right Arithmetic Immediate Word", "summary": "Arithmetically shifts the lower 32 bits of rs1 right by a constant, sign-extending the result.", "syntax": "SRAIW rd, rs1, shamt", "encoding": {"format": "I-Type (Shift)", "binary_pattern": "0100000 | shamtw | rs1 | 101 | rd | 0011011", "hex_opcode": "0x4000501B", "visual_parts": [{"raw": "0100000", "clean": "0100000", "pos": "31:25"}, {"raw": "shamtw", "clean": "shamtw", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0011011", "clean": "0011011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "shamt", "desc": "Shift Amount"}], "pseudocode": "R[rd] = sext((R[rs1][31:0] >>s shamt));", "example": "SRAIW x10, x11, 4", "example_note": "Arithmetic right shift of lower word.", "description": "SRAIW performs an arithmetic right shift of the lower 32 bits of rs1 by the 5-bit immediate, sign-extends the 32-bit result to 64 bits, and writes it to rd."}
{"mnemonic": "MULW", "architecture": "RISC-V", "extension": "M", "full_name": "Multiply Word", "summary": "Performs 32-bit multiplication of rs1 and rs2, sign-extending the 32-bit result to 64 bits.", "syntax": "MULW rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 000 | rd | 0111011", "hex_opcode": "0x0200003B", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0111011", "clean": "0111011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = sext((R[rs1] * R[rs2])[31:0]);", "example": "MULW x10, x11, x12", "example_note": "32-bit multiplication.", "description": "MULW multiplies the lower 32 bits of rs1 and rs2, sign-extends the lower 32 bits of the product to 64 bits, and writes to rd (RV64 only)."}
{"mnemonic": "DIVW", "architecture": "RISC-V", "extension": "M", "full_name": "Divide Word", "summary": "Performs 32-bit signed division of rs1 by rs2, sign-extending the result.", "syntax": "DIVW rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 100 | rd | 0111011", "hex_opcode": "0x0200403B", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0111011", "clean": "0111011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Quotient"}, {"name": "rs1", "desc": "Dividend"}, {"name": "rs2", "desc": "Divisor"}], "pseudocode": "R[rd] = sext(R[rs1][31:0] /s R[rs2][31:0]);", "example": "DIVW x10, x11, x12", "example_note": "32-bit signed division.", "description": "DIVW performs signed 32-bit division of the lower 32 bits of rs1 by rs2, sign-extends the quotient to 64 bits, and writes to rd (RV64 only). Division by zero yields -1."}
{"mnemonic": "DIVUW", "architecture": "RISC-V", "extension": "M", "full_name": "Divide Unsigned Word", "summary": "Performs 32-bit unsigned division of rs1 by rs2, sign-extending the result.", "syntax": "DIVUW rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 101 | rd | 0111011", "hex_opcode": "0x0200503B", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0111011", "clean": "0111011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Quotient"}, {"name": "rs1", "desc": "Dividend"}, {"name": "rs2", "desc": "Divisor"}], "pseudocode": "R[rd] = sext(R[rs1][31:0] /u R[rs2][31:0]);", "example": "DIVUW x10, x11, x12", "example_note": "32-bit unsigned division.", "description": "DIVUW performs unsigned 32-bit division of the lower 32 bits of rs1 by rs2, zero-extends the quotient to 64 bits, and writes to rd (RV64 only). Division by zero yields 2^32 - 1."}
{"mnemonic": "REMW", "architecture": "RISC-V", "extension": "M", "full_name": "Remainder Word", "summary": "Computes the remainder of 32-bit signed division, sign-extending the result.", "syntax": "REMW rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 110 | rd | 0111011", "hex_opcode": "0x0200603B", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0111011", "clean": "0111011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Remainder"}, {"name": "rs1", "desc": "Dividend"}, {"name": "rs2", "desc": "Divisor"}], "pseudocode": "R[rd] = sext(R[rs1][31:0] %s R[rs2][31:0]);", "example": "REMW x10, x11, x12", "example_note": "32-bit signed remainder.", "description": "REMW computes the signed 32-bit remainder of rs1 ÷ rs2, sign-extends to 64 bits, and writes to rd (RV64 only)."}
{"mnemonic": "REMUW", "architecture": "RISC-V", "extension": "M", "full_name": "Remainder Unsigned Word", "summary": "Computes the remainder of 32-bit unsigned division, sign-extending the result.", "syntax": "REMUW rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 111 | rd | 0111011", "hex_opcode": "0x0200703B", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0111011", "clean": "0111011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Remainder"}, {"name": "rs1", "desc": "Dividend"}, {"name": "rs2", "desc": "Divisor"}], "pseudocode": "R[rd] = sext(R[rs1][31:0] %u R[rs2][31:0]);", "example": "REMUW x10, x11, x12", "example_note": "32-bit unsigned remainder.", "description": "REMUW computes the unsigned 32-bit remainder of rs1 ÷ rs2, zero-extends to 64 bits, and writes to rd (RV64 only)."}
{"mnemonic": "FENCE.I", "architecture": "RISC-V", "extension": "Zifencei", "full_name": "Instruction Fence", "summary": "Synchronizes the instruction cache with the data cache (used after self-modifying code).", "syntax": "FENCE.I", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 001 | rd | 0001111", "hex_opcode": "0x0000100F", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0001111", "clean": "0001111", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [], "pseudocode": "Fence(Store, Fetch);", "example": "FENCE.I", "example_note": "Flushes I-Cache; ensures previous writes are visible to instruction fetch.", "description": "FENCE.I synchronises the instruction and data streams. It ensures that any stores to instruction memory visible to the current hart are made visible to subsequent instruction fetches by that hart."}
{"mnemonic": "HLV.B", "architecture": "RISC-V", "extension": "H", "full_name": "Hypervisor Load Byte", "summary": "Loads a byte from Guest Physical Memory (VS-stage translation only).", "syntax": "HLV.B rd, (rs1)", "encoding": {"format": "R-Type (System)", "binary_pattern": "011000000000 | rs1 | 100 | rd | 1110011", "hex_opcode": "0x60004073", "visual_parts": [{"raw": "011000000000", "clean": "011000000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Guest Address"}], "pseudocode": "R[rd] = sext(GuestMem[R[rs1]][7:0]);", "example": "HLV.B x10, (x11)", "example_note": "Read byte from guest memory.", "description": "HLV.B performs a virtual-machine load of a byte from the address in rs1, using the virtual supervisor address space (VS-mode translation). The result is sign-extended and written to rd."}
{"mnemonic": "HLV.W", "architecture": "RISC-V", "extension": "H", "full_name": "Hypervisor Load Word", "summary": "Loads a word from Guest Physical Memory (VS-stage translation only).", "syntax": "HLV.W rd, (rs1)", "encoding": {"format": "R-Type (System)", "binary_pattern": "011010000000 | rs1 | 100 | rd | 1110011", "hex_opcode": "0x68004073", "visual_parts": [{"raw": "011010000000", "clean": "011010000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Guest Address"}], "pseudocode": "R[rd] = sext(GuestMem[R[rs1]][31:0]);", "example": "HLV.W x10, (x11)", "example_note": "Read word from guest memory.", "description": "HLV.W performs a virtual-machine load of a word using VS-mode translation. In RV64 the result is sign-extended."}
{"mnemonic": "HSV.B", "architecture": "RISC-V", "extension": "H", "full_name": "Hypervisor Store Byte", "summary": "Stores a byte to Guest Physical Memory.", "syntax": "HSV.B rs2, (rs1)", "encoding": {"format": "R-Type (System)", "binary_pattern": "0110001 | rs2 | rs1 | 100000001110011", "hex_opcode": "0x62004073", "visual_parts": [{"raw": "0110001", "clean": "0110001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100000001110011", "clean": "100000001110011", "pos": "14:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:0"}, "operands": [{"name": "rs2", "desc": "Source"}, {"name": "rs1", "desc": "Guest Address"}], "pseudocode": "GuestMem[R[rs1]][7:0] = R[rs2][7:0];", "example": "HSV.B x10, (x11)", "example_note": "Write byte to guest memory.", "description": "HSV.B stores the least-significant byte of rs2 to the VS-mode virtual address in rs1."}
{"mnemonic": "HSV.W", "architecture": "RISC-V", "extension": "H", "full_name": "Hypervisor Store Word", "summary": "Stores a word to Guest Physical Memory.", "syntax": "HSV.W rs2, (rs1)", "encoding": {"format": "R-Type (System)", "binary_pattern": "0110101 | rs2 | rs1 | 100000001110011", "hex_opcode": "0x6A004073", "visual_parts": [{"raw": "0110101", "clean": "0110101", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100000001110011", "clean": "100000001110011", "pos": "14:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:0"}, "operands": [{"name": "rs2", "desc": "Source"}, {"name": "rs1", "desc": "Guest Address"}], "pseudocode": "GuestMem[R[rs1]][31:0] = R[rs2][31:0];", "example": "HSV.W x10, (x11)", "example_note": "Write word to guest memory.", "description": "HSV.W stores the least-significant word of rs2 to the VS-mode virtual address in rs1."}
{"mnemonic": "PREFETCH.I", "architecture": "RISC-V", "extension": "Zicbop", "full_name": "Prefetch Instruction", "summary": "Hints to hardware to bring the cache block containing the instruction at the address into the instruction cache.", "syntax": "PREFETCH.I offset(rs1)", "encoding": {"format": "S-Type (Hint)", "binary_pattern": "imm12hi | 00000 | rs1 | 110000000010011", "hex_opcode": "0x00006013", "visual_parts": [{"raw": "imm12hi", "clean": "imm12hi", "pos": "31:25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110000000010011", "clean": "110000000010011", "pos": "14:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:0"}, "operands": [{"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "Prefetch(I-Cache, R[rs1] + offset);", "example": "PREFETCH.I 0(x10)", "example_note": "Prepare I-Cache for upcoming jump.", "description": "PREFETCH.I is a hint to the memory system to prefetch the cache block at the address rs1+offset into the instruction cache."}
{"mnemonic": "PREFETCH.R", "architecture": "RISC-V", "extension": "Zicbop", "full_name": "Prefetch Read", "summary": "Hints to hardware to bring the cache block at the address into the data cache for reading.", "syntax": "PREFETCH.R offset(rs1)", "encoding": {"format": "S-Type (Hint)", "binary_pattern": "imm12hi | 00001 | rs1 | 110000000010011", "hex_opcode": "0x00106013", "visual_parts": [{"raw": "imm12hi", "clean": "imm12hi", "pos": "31:25"}, {"raw": "00001", "clean": "00001", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110000000010011", "clean": "110000000010011", "pos": "14:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:0"}, "operands": [{"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "Prefetch(D-Cache, Read, R[rs1] + offset);", "example": "PREFETCH.R 64(x10)", "example_note": "Prepare D-Cache for reading next cache line.", "description": "PREFETCH.R is a hint to the memory system to prefetch the cache block at rs1+offset into the data cache for a read access."}
{"mnemonic": "PREFETCH.W", "architecture": "RISC-V", "extension": "Zicbop", "full_name": "Prefetch Write", "summary": "Hints to hardware to bring the cache block at the address into the data cache for writing (exclusive ownership).", "syntax": "PREFETCH.W offset(rs1)", "encoding": {"format": "S-Type (Hint)", "binary_pattern": "imm12hi | 00011 | rs1 | 110000000010011", "hex_opcode": "0x00306013", "visual_parts": [{"raw": "imm12hi", "clean": "imm12hi", "pos": "31:25"}, {"raw": "00011", "clean": "00011", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110000000010011", "clean": "110000000010011", "pos": "14:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:0"}, "operands": [{"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "Prefetch(D-Cache, Write, R[rs1] + offset);", "example": "PREFETCH.W 0(x10)", "example_note": "Prepare D-Cache for writing.", "description": "PREFETCH.W is a hint to the memory system to prefetch the cache block at rs1+offset into the data cache for a write access."}
{"mnemonic": "DRET", "architecture": "RISC-V", "extension": "Privileged", "full_name": "Debug Return", "summary": "Returns from Debug Mode to the mode defined in the 'dcsr' register.", "syntax": "DRET", "encoding": {"format": "R-Type (System)", "binary_pattern": "01111011001000000000000001110011", "hex_opcode": "0x7B200073", "visual_parts": [{"raw": "01111011001000000000000001110011", "clean": "01111011001000000000000001110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "PC = DPC; Priv = DCSR.prv;", "example": "DRET", "example_note": "Resume execution from debug break.", "description": "DRET returns from debug mode. It restores PC from dpc and restores the privilege mode recorded before entering debug mode."}
{"mnemonic": "VSETVLI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Set VL Immediate", "summary": "Configures the vector length (vl) and vector type (vtype) based on application needs.", "syntax": "VSETVLI rd, rs1, vtypei", "encoding": {"format": "V-Type", "binary_pattern": "0 | zimm11 | rs1 | 111 | rd | 1010111", "hex_opcode": "0x00007057", "visual_parts": [{"raw": "0", "clean": "0", "pos": "31"}, {"raw": "zimm11", "clean": "zimm11", "pos": "30:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31 | 30:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Actual VL)"}, {"name": "rs1", "desc": "Req VL (Avail)"}, {"name": "vtypei", "desc": "Config (SEW/LMUL)"}], "pseudocode": "vl = set_config(rs1, vtypei); R[rd] = vl;", "example": "VSETVLI t0, a0, e32, m1, ta, ma", "example_note": "Request VL=a0, 32-bit elements, 1 register group.", "description": "Sets the vector length (vl) and vector type (vtype) registers based on the requested application vector length (AVL) and element width/grouping. The actual vector length set is written to rd. vtype encodes SEW (element width), LMUL (register grouping), and tail/mask policies."}
{"mnemonic": "VLE32.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load Element (32-bit)", "summary": "Loads a vector of 32-bit elements from memory into a vector register.", "syntax": "VLE32.V vd, (rs1), vm", "encoding": {"format": "V-Load", "binary_pattern": "000000 | vm | 00000 | rs1 | 110 | vd | 0000111", "hex_opcode": "0x00006007", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Vector Dest"}, {"name": "rs1", "desc": "Base Address"}, {"name": "vm", "desc": "Mask"}], "pseudocode": "foreach(i < vl): vd[i] = Mem[rs1 + i*4];", "example": "VLE32.V v8, (a0)", "example_note": "Load 32-bit integers from address in a0 to v8.", "description": "Performs a vector unit-stride load of 32-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm."}
{"mnemonic": "VSE32.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Store Element (32-bit)", "summary": "Stores a vector of 32-bit elements from a vector register to memory.", "syntax": "VSE32.V vs3, (rs1), vm", "encoding": {"format": "V-Store", "binary_pattern": "000000 | vm | 00000 | rs1 | 110 | vs3 | 0100111", "hex_opcode": "0x00006027", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vs3", "clean": "vs3", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vs3", "desc": "Vector Source"}, {"name": "rs1", "desc": "Base Address"}, {"name": "vm", "desc": "Mask"}], "pseudocode": "foreach(i < vl): Mem[rs1 + i*4] = vs3[i];", "example": "VSE32.V v8, (a0)", "example_note": "Store v8 to memory at a0.", "description": "Performs a vector unit-stride store of 32-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm."}
{"mnemonic": "VADD.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Integer Add", "summary": "Adds elements of two vector registers.", "syntax": "VADD.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "000000 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x00000057", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] + vs2[i];", "example": "VADD.VV v10, v8, v9", "example_note": "v10[i] = v8[i] + v9[i]", "description": "Performs element-wise integer addition on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm."}
{"mnemonic": "VMUL.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Integer Multiply", "summary": "Multiplies elements of two vector registers.", "syntax": "VMUL.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100101 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x94002057", "visual_parts": [{"raw": "100101", "clean": "100101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] * vs2[i];", "example": "VMUL.VV v10, v8, v9", "example_note": "v10[i] = v8[i] * v9[i]", "description": "Performs element-wise integer multiplication (low bits) on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm."}
{"mnemonic": "CLZ", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Count Leading Zeros", "summary": "Counts the number of 0 bits at the MSB end of the register.", "syntax": "CLZ rd, rs1", "encoding": {"format": "I-Type", "binary_pattern": "011000000000 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x60001013", "visual_parts": [{"raw": "011000000000", "clean": "011000000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "int count = 0; while(rs1[XLEN-1-count] == 0) count++; R[rd] = count;", "example": "CLZ x10, x11", "example_note": "Find highest set bit index.", "description": "CLZ counts the number of leading (most-significant) zero bits in rs1, writing the count to rd. Returns XLEN if rs1 is zero."}
{"mnemonic": "CTZ", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Count Trailing Zeros", "summary": "Counts the number of 0 bits at the LSB end of the register.", "syntax": "CTZ rd, rs1", "encoding": {"format": "I-Type", "binary_pattern": "011000000001 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x60101013", "visual_parts": [{"raw": "011000000001", "clean": "011000000001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "int count = 0; while(rs1[count] == 0) count++; R[rd] = count;", "example": "CTZ x10, x11", "example_note": "Find lowest set bit index.", "description": "CTZ counts the number of trailing (least-significant) zero bits in rs1, writing the count to rd. Returns XLEN if rs1 is zero."}
{"mnemonic": "CPOP", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Population Count", "summary": "Counts the number of set bits (1s) in the register.", "syntax": "CPOP rd, rs1", "encoding": {"format": "I-Type", "binary_pattern": "011000000010 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x60201013", "visual_parts": [{"raw": "011000000010", "clean": "011000000010", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "R[rd] = count_set_bits(R[rs1]);", "example": "CPOP x10, x11", "example_note": "Hamming weight calculation.", "description": "CPOP counts the number of set bits (population count / Hamming weight) in rs1 and writes the count to rd."}
{"mnemonic": "ANDN", "architecture": "RISC-V", "extension": "Zbb", "full_name": "AND Not", "summary": "Performs bitwise AND with the bitwise negation of rs2 (rs1 & ~rs2).", "syntax": "ANDN rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0100000 | rs2 | rs1 | 111 | rd | 0110011", "hex_opcode": "0x40007033", "visual_parts": [{"raw": "0100000", "clean": "0100000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source 2 (Inverted)"}], "pseudocode": "R[rd] = R[rs1] & ~R[rs2];", "example": "ANDN x10, x11, x12", "example_note": "Clear bits in x11 that are set in x12.", "description": "ANDN computes the bitwise AND of rs1 with the bitwise NOT of rs2, writing the result to rd. Equivalent to rd = rs1 & ~rs2."}
{"mnemonic": "ORN", "architecture": "RISC-V", "extension": "Zbb", "full_name": "OR Not", "summary": "Performs bitwise OR with the bitwise negation of rs2 (rs1 | ~rs2).", "syntax": "ORN rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0100000 | rs2 | rs1 | 110 | rd | 0110011", "hex_opcode": "0x40006033", "visual_parts": [{"raw": "0100000", "clean": "0100000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source 2 (Inverted)"}], "pseudocode": "R[rd] = R[rs1] | ~R[rs2];", "example": "ORN x10, x11, x12", "example_note": "Set bits.", "description": "ORN computes the bitwise OR of rs1 with the bitwise NOT of rs2. Equivalent to rd = rs1 | ~rs2."}
{"mnemonic": "XNOR", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Exclusive NOR", "summary": "Performs bitwise exclusive-NOR (rs1 ^ ~rs2).", "syntax": "XNOR rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0100000 | rs2 | rs1 | 100 | rd | 0110011", "hex_opcode": "0x40004033", "visual_parts": [{"raw": "0100000", "clean": "0100000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = ~(R[rs1] ^ R[rs2]);", "example": "XNOR x10, x11, x12", "example_note": "Logical equivalence.", "description": "XNOR computes the bitwise XNOR of rs1 and rs2. Equivalent to rd = ~(rs1 ^ rs2)."}
{"mnemonic": "ROL", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Rotate Left", "summary": "Rotates the bits in rs1 left by the amount in rs2.", "syntax": "ROL rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0110000 | rs2 | rs1 | 001 | rd | 0110011", "hex_opcode": "0x60001033", "visual_parts": [{"raw": "0110000", "clean": "0110000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Rotate Amount"}], "pseudocode": "shamt = R[rs2] & (XLEN-1); R[rd] = (R[rs1] << shamt) | (R[rs1] >> (XLEN-shamt));", "example": "ROL x10, x11, x12", "example_note": "Bitwise rotation.", "description": "ROL rotates rs1 left by the shift amount in the lower log2(XLEN) bits of rs2, writing the result to rd."}
{"mnemonic": "ROR", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Rotate Right", "summary": "Rotates the bits in rs1 right by the amount in rs2.", "syntax": "ROR rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0110000 | rs2 | rs1 | 101 | rd | 0110011", "hex_opcode": "0x60005033", "visual_parts": [{"raw": "0110000", "clean": "0110000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Rotate Amount"}], "pseudocode": "shamt = R[rs2] & (XLEN-1); R[rd] = (R[rs1] >> shamt) | (R[rs1] << (XLEN-shamt));", "example": "ROR x10, x11, x12", "example_note": "Bitwise rotation.", "description": "ROR rotates rs1 right by the shift amount in the lower log2(XLEN) bits of rs2, writing the result to rd."}
{"mnemonic": "MAX", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Maximum", "summary": "Computes the signed maximum of two registers.", "syntax": "MAX rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000101 | rs2 | rs1 | 110 | rd | 0110011", "hex_opcode": "0x0A006033", "visual_parts": [{"raw": "0000101", "clean": "0000101", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = (R[rs1] >s R[rs2]) ? R[rs1] : R[rs2];", "example": "MAX x10, x11, x12", "example_note": "Signed Max.", "description": "MAX computes the signed maximum of rs1 and rs2, writing the result to rd."}
{"mnemonic": "MIN", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Minimum", "summary": "Computes the signed minimum of two registers.", "syntax": "MIN rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000101 | rs2 | rs1 | 100 | rd | 0110011", "hex_opcode": "0x0A004033", "visual_parts": [{"raw": "0000101", "clean": "0000101", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = (R[rs1] <s R[rs2]) ? R[rs1] : R[rs2];", "example": "MIN x10, x11, x12", "example_note": "Signed Min.", "description": "MIN computes the signed minimum of rs1 and rs2, writing the result to rd."}
{"mnemonic": "SEXT.B", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Sign Extend Byte", "summary": "Sign-extends the lowest byte (8 bits) to XLEN bits.", "syntax": "SEXT.B rd, rs1", "encoding": {"format": "I-Type", "binary_pattern": "0110000 | 00100 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x60401013", "visual_parts": [{"raw": "0110000", "clean": "0110000", "pos": "31:25"}, {"raw": "00100", "clean": "00100", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "R[rd] = sext(R[rs1][7:0]);", "example": "SEXT.B x10, x11", "example_note": "Sign extend 8-bit value.", "description": "SEXT.B sign-extends the least-significant byte of rs1 to XLEN bits."}
{"mnemonic": "SEXT.H", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Sign Extend Halfword", "summary": "Sign-extends the lowest halfword (16 bits) to XLEN bits.", "syntax": "SEXT.H rd, rs1", "encoding": {"format": "I-Type", "binary_pattern": "0110000 | 00101 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x60501013", "visual_parts": [{"raw": "0110000", "clean": "0110000", "pos": "31:25"}, {"raw": "00101", "clean": "00101", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "R[rd] = sext(R[rs1][15:0]);", "example": "SEXT.H x10, x11", "example_note": "Sign extend 16-bit value.", "description": "SEXT.H sign-extends the least-significant halfword of rs1 to XLEN bits."}
{"mnemonic": "ZEXT.H", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Zero Extend Halfword", "summary": "Zero-extends the lowest halfword (16 bits) to XLEN bits.", "syntax": "ZEXT.H rd, rs1", "encoding": {"format": "I-Type", "binary_pattern": "000010000000 | rs1 | 100 | rd | 0111011", "hex_opcode": "0x0800403B", "visual_parts": [{"raw": "000010000000", "clean": "000010000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0111011", "clean": "0111011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "R[rd] = zext(R[rs1][15:0]);", "example": "ZEXT.H x10, x11", "example_note": "Zero extend 16-bit value.", "description": "ZEXT.H zero-extends the least-significant halfword of rs1 to XLEN bits, writing to rd."}
{"mnemonic": "ORC.B", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Bitwise OR-Combine Byte", "summary": "Sets each byte of the result to 0xFF if the corresponding byte of the source is non-zero, else 0x00.", "syntax": "ORC.B rd, rs1", "encoding": {"format": "I-Type", "binary_pattern": "001010000111 | rs1 | 101 | rd | 0010011", "hex_opcode": "0x28705013", "visual_parts": [{"raw": "001010000111", "clean": "001010000111", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "For each byte i: R[rd].byte[i] = (R[rs1].byte[i] != 0) ? 0xFF : 0x00;", "example": "ORC.B x10, x11", "example_note": "Used for string processing (strlen, strcpy).", "description": "ORC.B sets each byte of rd to 0xFF if the corresponding byte of rs1 is non-zero, or 0x00 if it is zero. Useful for detecting null bytes in strings."}
{"mnemonic": "REV8", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Byte Reverse", "summary": "Reverses the order of bytes in a register (Endian swap).", "syntax": "REV8 rd, rs1", "encoding": {"format": "I-Type", "binary_pattern": "011010111000 | rs1 | 101 | rd | 0010011", "hex_opcode": "0x6B805013", "visual_parts": [{"raw": "011010111000", "clean": "011010111000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "R[rd] = Byteswap(R[rs1]);", "example": "REV8 x10, x11", "example_note": "Converts Big-Endian to Little-Endian.", "description": "REV8 reverses the byte order of rs1 (byte-swap / endianness conversion), writing the result to rd."}
{"mnemonic": "AES64KS1I", "architecture": "RISC-V", "extension": "Zkne", "full_name": "AES-64 Key Schedule Instruction 1", "summary": "Performs the first part of the AES-128/192/256 key schedule generation (RV64).", "syntax": "AES64KS1I rd, rs1, rcon", "encoding": {"format": "I-Type", "binary_pattern": "00110001 | rnum | rs1 | 001 | rd | 0010011", "hex_opcode": "0x31001013", "visual_parts": [{"raw": "00110001", "clean": "00110001", "pos": "31:24"}, {"raw": "rnum", "clean": "rnum", "pos": "23:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:24 | 23:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source Key"}, {"name": "rcon", "desc": "Round Constant (0-10)"}], "pseudocode": "rd = aes_key_schedule_1(rs1, rcon);", "description": "AES64KS1I performs the first step of the AES-128/192/256 key schedule, applying SubWord, RotWord, and XOR with a round constant (Rcon[imm]) to rs1.", "example": "AES64KS1I t0, a0, rcon"}
{"mnemonic": "AES64KS2", "architecture": "RISC-V", "extension": "Zkne", "full_name": "AES-64 Key Schedule Instruction 2", "summary": "Performs the second part of the AES-192/256 key schedule generation (RV64).", "syntax": "AES64KS2 rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0111111 | rs2 | rs1 | 000 | rd | 0110011", "hex_opcode": "0x7E000033", "visual_parts": [{"raw": "0111111", "clean": "0111111", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "rd = aes_key_schedule_2(rs1, rs2);", "description": "AES64KS2 performs the second step of the AES-256 key schedule, XORing rs1 with the appropriate bytes of rs2.", "example": "AES64KS2 t0, a0, a1"}
{"mnemonic": "AES64IM", "architecture": "RISC-V", "extension": "Zknd", "full_name": "AES-64 Inverse MixColumns", "summary": "Performs the Inverse MixColumns transformation for AES decryption (RV64).", "syntax": "AES64IM rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "001100000000 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x30001013", "visual_parts": [{"raw": "001100000000", "clean": "001100000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source State"}], "pseudocode": "rd = aes_inverse_mix_columns(rs1);", "description": "AES64IM applies the AES InvMixColumns transformation to the 64-bit value in rs1 and writes the result to rd. Used to convert round keys for equivalent inverse cipher.", "example": "AES64IM t0, a0"}
{"mnemonic": "WRS.NTO", "architecture": "RISC-V", "extension": "Zawrs", "full_name": "Wait on Reservation Set (Normal Time-Out)", "summary": "Stalls the hart until a reservation set is invalid or a short timeout expires. Used for efficient polling/spinlocks.", "syntax": "WRS.NTO", "encoding": {"format": "I-Type", "binary_pattern": "00000000110100000000000001110011", "hex_opcode": "0x00D00073", "visual_parts": [{"raw": "00000000110100000000000001110011", "clean": "00000000110100000000000001110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "while (reservation_valid() && !timeout) { pause(); }", "description": "WRS.NTO (Wait on Reservation Set, No Timeout) causes the hart to pause until the reservation set established by an LR instruction is invalidated or an interrupt or trap is pending. Unlike WFI, it is expected to resume on any reservation invalidation.", "example": "WRS.NTO"}
{"mnemonic": "WRS.STO", "architecture": "RISC-V", "extension": "Zawrs", "full_name": "Wait on Reservation Set (Short Time-Out)", "summary": "Stalls the hart until a reservation set is invalid or a very short implementation-defined timeout expires.", "syntax": "WRS.STO", "encoding": {"format": "I-Type", "binary_pattern": "00000001110100000000000001110011", "hex_opcode": "0x01D00073", "visual_parts": [{"raw": "00000001110100000000000001110011", "clean": "00000001110100000000000001110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "while (reservation_valid() && !short_timeout) { pause(); }", "description": "WRS.STO (Wait on Reservation Set, Short Timeout) behaves like WRS.NTO but may optionally time out after an implementation-defined short period, allowing the hart to poll the reservation set.", "example": "WRS.STO"}
{"mnemonic": "SFENCE.W.INVAL", "architecture": "RISC-V", "extension": "Svinval", "full_name": "Supervisor Fence Write Invalidate", "summary": "Orders previous stores against subsequent local instruction fetches or translations (Memory Management).", "syntax": "SFENCE.W.INVAL", "encoding": {"format": "R-Type (System)", "binary_pattern": "00011000000000000000000001110011", "hex_opcode": "0x18000073", "visual_parts": [{"raw": "00011000000000000000000001110011", "clean": "00011000000000000000000001110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "Fence_Write_Invalidate();", "description": "SFENCE.W.INVAL, when used with SFENCE.INVAL.IR, provides fine-grained virtual memory management. It ensures that all stores preceding this instruction are ordered before any subsequent SFENCE.INVAL.IR.", "example": "SFENCE.W.INVAL"}
{"mnemonic": "SFENCE.INVAL.IR", "architecture": "RISC-V", "extension": "Svinval", "full_name": "Supervisor Fence Invalidate Range", "summary": "Invalidates a range of address translations based on ASID and Virtual Address.", "syntax": "SFENCE.INVAL.IR", "encoding": {"format": "R-Type (System)", "binary_pattern": "00011000000100000000000001110011", "hex_opcode": "0x18100073", "visual_parts": [{"raw": "00011000000100000000000001110011", "clean": "00011000000100000000000001110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "Invalidate_TLB_Range();", "description": "SFENCE.INVAL.IR invalidates all address-translation cache entries that match stores ordered before a preceding SFENCE.W.INVAL on the same hart.", "example": "SFENCE.INVAL.IR"}
{"mnemonic": "NTL.P1", "architecture": "RISC-V", "extension": "Zihintntl", "full_name": "Non-Temporal Locality Hint (Prefetch Level 1)", "summary": "Hint that the target cache block will be needed, but is likely to be discarded after use (Stream data).", "syntax": "NTL.P1", "encoding": {"format": "R-Type", "binary_pattern": "00000000001000000000000000110011", "hex_opcode": "0x00200033", "visual_parts": [{"raw": "00000000001000000000000000110011", "clean": "00000000001000000000000000110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "Hint(NonTemporal_Level1);", "description": "NTL.P1 hints that the following memory instruction has low temporal locality at the innermost cache level (L1). Implementations may bypass L1 on the memory access.", "example": "NTL.P1"}
{"mnemonic": "NTL.PALL", "architecture": "RISC-V", "extension": "Zihintntl", "full_name": "Non-Temporal Locality Hint (All Levels)", "summary": "Hint that the target data should not be cached in any level of the cache hierarchy (Transient data).", "syntax": "NTL.PALL", "encoding": {"format": "R-Type", "binary_pattern": "00000000001100000000000000110011", "hex_opcode": "0x00300033", "visual_parts": [{"raw": "00000000001100000000000000110011", "clean": "00000000001100000000000000110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "Hint(NonTemporal_All);", "description": "NTL.PALL hints that the following memory instruction has low temporal locality at all private cache levels. Implementations may bypass all private caches.", "example": "NTL.PALL"}
{"mnemonic": "NTL.S1", "architecture": "RISC-V", "extension": "Zihintntl", "full_name": "Non-Temporal Locality Hint (Store Level 1)", "summary": "Hint that the subsequent store is non-temporal (Streaming Store).", "syntax": "NTL.S1", "encoding": {"format": "R-Type", "binary_pattern": "00000000010000000000000000110011", "hex_opcode": "0x00400033", "visual_parts": [{"raw": "00000000010000000000000000110011", "clean": "00000000010000000000000000110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "Hint(NonTemporal_Store_Level1);", "description": "NTL.S1 hints that the following memory instruction has low temporal locality at the innermost shared cache level.", "example": "NTL.S1"}
{"mnemonic": "NTL.ALL", "architecture": "RISC-V", "extension": "Zihintntl", "full_name": "Non-Temporal Locality Hint (Store All)", "summary": "Hint that the subsequent store should bypass all cache levels.", "syntax": "NTL.ALL", "encoding": {"format": "R-Type", "binary_pattern": "00000000010100000000000000110011", "hex_opcode": "0x00500033", "visual_parts": [{"raw": "00000000010100000000000000110011", "clean": "00000000010100000000000000110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "Hint(NonTemporal_Store_All);", "description": "NTL.ALL hints that the following memory instruction has low temporal locality at all cache levels. Implementations may bypass all caches.", "example": "NTL.ALL"}
{"mnemonic": "VWADD.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Integer Add", "summary": "Adds N-bit elements to produce 2*N-bit results (Widening).", "syntax": "VWADD.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "110001 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0xC4002057", "visual_parts": [{"raw": "110001", "clean": "110001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (2*SEW)"}, {"name": "vs2", "desc": "Src 2 (SEW)"}, {"name": "vs1", "desc": "Src 1 (SEW)"}], "pseudocode": "foreach(i < vl): vd[i] = sext(vs1[i]) + sext(vs2[i]);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWADD.VV v1, v4, v2, v0.t"}
{"mnemonic": "VWADDU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Integer Add Unsigned", "summary": "Adds unsigned N-bit elements to produce unsigned 2*N-bit results.", "syntax": "VWADDU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "110000 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0xC0002057", "visual_parts": [{"raw": "110000", "clean": "110000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (2*SEW)"}, {"name": "vs2", "desc": "Src 2 (SEW)"}, {"name": "vs1", "desc": "Src 1 (SEW)"}], "pseudocode": "foreach(i < vl): vd[i] = zext(vs1[i]) + zext(vs2[i]);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWADDU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VWSUB.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Integer Subtract", "summary": "Subtracts N-bit elements to produce 2*N-bit results.", "syntax": "VWSUB.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "110011 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0xCC002057", "visual_parts": [{"raw": "110011", "clean": "110011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (2*SEW)"}, {"name": "vs2", "desc": "Src 2 (SEW)"}, {"name": "vs1", "desc": "Src 1 (SEW)"}], "pseudocode": "foreach(i < vl): vd[i] = sext(vs2[i]) - sext(vs1[i]);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWSUB.VV v1, v4, v2, v0.t"}
{"mnemonic": "VWMUL.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Integer Multiply", "summary": "Multiplies N-bit elements to produce 2*N-bit results.", "syntax": "VWMUL.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "111011 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0xEC002057", "visual_parts": [{"raw": "111011", "clean": "111011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (2*SEW)"}, {"name": "vs2", "desc": "Src 2 (SEW)"}, {"name": "vs1", "desc": "Src 1 (SEW)"}], "pseudocode": "foreach(i < vl): vd[i] = sext(vs2[i]) * sext(vs1[i]);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWMUL.VV v1, v4, v2, v0.t"}
{"mnemonic": "VNSRL.WX", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Narrowing Shift Right Logical", "summary": "Shifts 2*N-bit elements right and narrows the result to N-bits.", "syntax": "VNSRL.WX vd, vs2, rs1, vm", "encoding": {"format": "OPIVX", "binary_pattern": "101100 | vm | vs2 | rs1 | 100 | vd | 1010111", "hex_opcode": "0xB0004057", "visual_parts": [{"raw": "101100", "clean": "101100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (SEW)"}, {"name": "vs2", "desc": "Src Vector (2*SEW)"}, {"name": "rs1", "desc": "Shift Amount"}], "pseudocode": "foreach(i < vl): vd[i] = (vs2[i] >> rs1) & Mask(SEW);", "description": "Performs a narrowing operation, halving the result element width relative to the source. Optionally saturates the result. Active elements are determined by vl; masking by vm.", "example": "VNSRL.WX v1, v4, a0, v0.t"}
{"mnemonic": "VNSRA.WX", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Narrowing Shift Right Arithmetic", "summary": "Arithmetically shifts 2*N-bit elements right and narrows to N-bits.", "syntax": "VNSRA.WX vd, vs2, rs1, vm", "encoding": {"format": "OPIVX", "binary_pattern": "101101 | vm | vs2 | rs1 | 100 | vd | 1010111", "hex_opcode": "0xB4004057", "visual_parts": [{"raw": "101101", "clean": "101101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (SEW)"}, {"name": "vs2", "desc": "Src Vector (2*SEW)"}, {"name": "rs1", "desc": "Shift Amount"}], "pseudocode": "foreach(i < vl): vd[i] = (vs2[i] >>s rs1) & Mask(SEW);", "description": "Performs a narrowing operation, halving the result element width relative to the source. Optionally saturates the result. Active elements are determined by vl; masking by vm.", "example": "VNSRA.WX v1, v4, a0, v0.t"}
{"mnemonic": "VMERGE.VVM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Merge", "summary": "Merges two vectors based on the mask (if mask=0, pick vs2; if mask=1, pick vs1).", "syntax": "VMERGE.VVM vd, vs2, vs1, v0", "encoding": {"format": "OPIVV", "binary_pattern": "0101110 | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x5C000057", "visual_parts": [{"raw": "0101110", "clean": "0101110", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "False Src"}, {"name": "vs1", "desc": "True Src"}, {"name": "v0", "desc": "Mask"}], "pseudocode": "foreach(i < vl): vd[i] = v0[i] ? vs1[i] : vs2[i];", "description": "Merges elements from vs1 and vs2 (or an immediate) according to the mask: masked-on elements come from vs1, masked-off from vs2.", "example": "VMERGE.VVM v1, v4, v2, v0"}
{"mnemonic": "VMV.V.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Move", "summary": "Copies a vector register.", "syntax": "VMV.V.V vd, vs1", "encoding": {"format": "OPIVV", "binary_pattern": "010111100000 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x5E000057", "visual_parts": [{"raw": "010111100000", "clean": "010111100000", "pos": "31:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs1", "desc": "Source"}], "pseudocode": "vd = vs1;", "description": "Copies vector vs1 to vd under mask vm.", "example": "VMV.V.V v1, v2"}
{"mnemonic": "VMV.X.S", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Move Scalar to Integer", "summary": "Copies element 0 of a vector to an integer register.", "syntax": "VMV.X.S rd, vs2", "encoding": {"format": "OPMVX", "binary_pattern": "0100001 | vs2 | 00000010 | rd | 1010111", "hex_opcode": "0x42002057", "visual_parts": [{"raw": "0100001", "clean": "0100001", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00000010", "clean": "00000010", "pos": "19:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Int)"}, {"name": "vs2", "desc": "Source (Vector)"}], "pseudocode": "rd = vs2[0];", "description": "Moves element 0 of vector vs2 to GPR rd.", "example": "VMV.X.S t0, v4"}
{"mnemonic": "VMV.S.X", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Move Integer to Scalar", "summary": "Copies an integer register to element 0 of a vector.", "syntax": "VMV.S.X vd, rs1", "encoding": {"format": "OPMVX", "binary_pattern": "010000100000 | rs1 | 110 | vd | 1010111", "hex_opcode": "0x42006057", "visual_parts": [{"raw": "010000100000", "clean": "010000100000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Vector)"}, {"name": "rs1", "desc": "Source (Int)"}], "pseudocode": "vd[0] = rs1;", "description": "Moves a scalar integer value from GPR rs1 into element 0 of vd.", "example": "VMV.S.X v1, a0"}
{"mnemonic": "VMFEQ.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Equal", "summary": "Compares float vectors for equality, writing result to mask register.", "syntax": "VMFEQ.VV vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "011000 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0x60001057", "visual_parts": [{"raw": "011000", "clean": "011000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (vs2[i] == vs1[i]) ? 1 : 0;", "description": "Compares elements element-wise for equal and writes a mask result to vd.", "example": "VMFEQ.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMFLE.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Less or Equal", "summary": "Compares float vectors (vs2 <= vs1), writing result to mask register.", "syntax": "VMFLE.VV vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "011001 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0x64001057", "visual_parts": [{"raw": "011001", "clean": "011001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (vs2[i] <= vs1[i]) ? 1 : 0;", "description": "Compares elements element-wise for less than or equal and writes a mask result to vd.", "example": "VMFLE.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMFLT.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Less Than", "summary": "Compares float vectors (vs2 < vs1), writing result to mask register.", "syntax": "VMFLT.VV vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "011011 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0x6C001057", "visual_parts": [{"raw": "011011", "clean": "011011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (vs2[i] < vs1[i]) ? 1 : 0;", "description": "Compares elements element-wise for less than and writes a mask result to vd.", "example": "VMFLT.VV v1, v4, v2, v0.t"}
{"mnemonic": "VFCLASS.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Classify", "summary": "Classifies elements of a float vector (NaN, Inf, etc.).", "syntax": "VFCLASS.V vd, vs2, vm", "encoding": {"format": "OPFVV", "binary_pattern": "010011 | vm | vs2 | 10000001 | vd | 1010111", "hex_opcode": "0x4C081057", "visual_parts": [{"raw": "010011", "clean": "010011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "10000001", "clean": "10000001", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Mask Bits)"}, {"name": "vs2", "desc": "Src Vector"}], "pseudocode": "foreach(i < vl): vd[i] = classify(vs2[i]);", "description": "Classifies each floating-point element (NaN, infinity, zero, normal, subnormal, negative/positive), writing a bitmask classification to vd.", "example": "VFCLASS.V v1, v4, v0.t"}
{"mnemonic": "VFMV.F.S", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Move Float to Scalar", "summary": "Moves element 0 of a float vector to a scalar float register.", "syntax": "VFMV.F.S fd, vs2", "encoding": {"format": "OPFVW", "binary_pattern": "0100001 | vs2 | 00000001 | rd | 1010111", "hex_opcode": "0x42001057", "visual_parts": [{"raw": "0100001", "clean": "0100001", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00000001", "clean": "00000001", "pos": "19:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "fd", "desc": "Dest (Float)"}, {"name": "vs2", "desc": "Src Vector"}], "pseudocode": "fd = vs2[0];", "description": "Moves element 0 of vector vs2 to floating-point register fd.", "example": "VFMV.F.S fd, v4"}
{"mnemonic": "VFMV.S.F", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Move Scalar to Float", "summary": "Moves a scalar float register to element 0 of a vector.", "syntax": "VFMV.S.F vd, fs1", "encoding": {"format": "OPFVW", "binary_pattern": "010000100000 | rs1 | 101 | vd | 1010111", "hex_opcode": "0x42005057", "visual_parts": [{"raw": "010000100000", "clean": "010000100000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Vector"}, {"name": "fs1", "desc": "Src Float"}], "pseudocode": "vd[0] = fs1;", "description": "Moves floating-point scalar fs1 into element 0 of vd.", "example": "VFMV.S.F v1, fs1"}
{"mnemonic": "FLI.S", "architecture": "RISC-V", "extension": "Zfa", "full_name": "Float Load Immediate (Single)", "summary": "Loads a common floating-point constant (e.g., 1.0, 0.5, PI) into a register from a small table.", "syntax": "FLI.S rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "111100000001 | rs1 | 000 | rd | 1010011", "hex_opcode": "0xF0100053", "visual_parts": [{"raw": "111100000001", "clean": "111100000001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Constant Index"}], "pseudocode": "F[rd] = FloatTable[rs1];", "description": "Loads a single-precision (32-bit) floating-point constant from a predefined lookup table (indexed by rs1) into fd. Provides common constants such as -1, 0, 1, 2, ∞, and others without a memory access.", "example": "FLI.S t0, a0"}
{"mnemonic": "FLI.D", "architecture": "RISC-V", "extension": "Zfa", "full_name": "Float Load Immediate (Double)", "summary": "Loads a common double-precision constant into a register.", "syntax": "FLI.D rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "111100100001 | rs1 | 000 | rd | 1010011", "hex_opcode": "0xF2100053", "visual_parts": [{"raw": "111100100001", "clean": "111100100001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Constant Index"}], "pseudocode": "F[rd] = DoubleTable[rs1];", "description": "Loads a double-precision (64-bit) floating-point constant from a predefined lookup table (indexed by rs1) into fd. Provides common constants such as -1, 0, 1, 2, ∞, and others without a memory access.", "example": "FLI.D t0, a0"}
{"mnemonic": "FLI.H", "architecture": "RISC-V", "extension": "Zfa", "full_name": "Float Load Immediate (Half)", "summary": "Loads a common half-precision constant into a register.", "syntax": "FLI.H rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "111101000001 | rs1 | 000 | rd | 1010011", "hex_opcode": "0xF4100053", "visual_parts": [{"raw": "111101000001", "clean": "111101000001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Constant Index"}], "pseudocode": "F[rd] = HalfTable[rs1];", "description": "Loads a half-precision (16-bit) floating-point constant from a predefined lookup table (indexed by rs1) into fd. Provides common constants such as -1, 0, 1, 2, ∞, and others without a memory access.", "example": "FLI.H t0, a0"}
{"mnemonic": "FMINM.S", "architecture": "RISC-V", "extension": "Zfa", "full_name": "Float Minimum (IEEE 754-2019)", "summary": "Minimum of two floats, treating -0.0 as smaller than +0.0 (canonicalize NaNs).", "syntax": "FMINM.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010100 | rs2 | rs1 | 010 | rd | 1010011", "hex_opcode": "0x28002053", "visual_parts": [{"raw": "0010100", "clean": "0010100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = minNum(F[rs1], F[rs2]);", "description": "Returns the single-precision (32-bit) floating-point minimum of rs1 and rs2, following IEEE 754-2019 minNum/maxNum semantics. Quiet NaN inputs return the non-NaN operand; signalling NaN inputs raise invalid-operation.", "example": "FMINM.S t0, a0, a1"}
{"mnemonic": "FMAXM.S", "architecture": "RISC-V", "extension": "Zfa", "full_name": "Float Maximum (IEEE 754-2019)", "summary": "Maximum of two floats, treating +0.0 as larger than -0.0.", "syntax": "FMAXM.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010100 | rs2 | rs1 | 011 | rd | 1010011", "hex_opcode": "0x28003053", "visual_parts": [{"raw": "0010100", "clean": "0010100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = maxNum(F[rs1], F[rs2]);", "description": "Returns the single-precision (32-bit) floating-point maximum of rs1 and rs2, following IEEE 754-2019 minNum/maxNum semantics. Quiet NaN inputs return the non-NaN operand; signalling NaN inputs raise invalid-operation.", "example": "FMAXM.S t0, a0, a1"}
{"mnemonic": "FROUND.S", "architecture": "RISC-V", "extension": "Zfa", "full_name": "Float Round to Integer", "summary": "Rounds a float to the nearest integer value (returned as a float).", "syntax": "FROUND.S rd, rs1, rm", "encoding": {"format": "I-Type", "binary_pattern": "010000000100 | rs1 | rm | rd | 1010011", "hex_opcode": "0x40400053", "visual_parts": [{"raw": "010000000100", "clean": "010000000100", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rm", "desc": "Mode"}], "pseudocode": "F[rd] = round(F[rs1]);", "description": "Rounds the single-precision (32-bit) floating-point value in rs1 to an integer value (still in FP format), using the rounding mode in the rm field. The result preserves the FP type.", "example": "FROUND.S t0, a0, rm"}
{"mnemonic": "AMOCAS.W", "architecture": "RISC-V", "extension": "Zacas", "full_name": "Atomic Compare and Swap Word", "summary": "Atomically compares memory at rs1 with rd; if equal, writes rs2 to memory. Returns original value in rd.", "syntax": "AMOCAS.W rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "00101 | aq | rl | rs2 | rs1 | 010 | rd | 0101111", "hex_opcode": "0x2800202F", "visual_parts": [{"raw": "00101", "clean": "00101", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest/Compare"}, {"name": "rs2", "desc": "Swap Value"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "atomic { if(M[rs1]==R[rd]) M[rs1]=R[rs2]; R[rd]=M[rs1]; }", "description": "AMOCAS.W (Zacas) atomically compares the word at the address in rs1 with rs1 (the compare value), and if equal, writes rs2 to that address. The original value is returned in rd.", "example": "AMOCAS.W t0, a1, a0"}
{"mnemonic": "AMOCAS.D", "architecture": "RISC-V", "extension": "Zacas", "full_name": "Atomic Compare and Swap Doubleword", "summary": "Atomically compares 64-bit memory at rs1 with rd; if equal, writes rs2 to memory.", "syntax": "AMOCAS.D rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "00101 | aq | rl | rs2 | rs1 | 011 | rd | 0101111", "hex_opcode": "0x2800302F", "visual_parts": [{"raw": "00101", "clean": "00101", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest/Compare"}, {"name": "rs2", "desc": "Swap Value"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "atomic { if(M[rs1]==R[rd]) M[rs1]=R[rs2]; R[rd]=M[rs1]; }", "description": "AMOCAS.D atomically compares a doubleword in memory with a register pair and conditionally swaps it with another register pair (RV64 only).", "example": "AMOCAS.D t0, a1, a0"}
{"mnemonic": "C.MUL", "architecture": "RISC-V", "extension": "Zcb", "full_name": "Compressed Multiply", "summary": "Performs 32-bit multiplication (rd = rd * rs2) in 16-bit encoding.", "syntax": "C.MUL rd', rs2'", "encoding": {"format": "CA", "binary_pattern": "? | 100111 | rd_rs1_p | 10 | rs2_p | 01", "hex_opcode": "0x00009C41", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100111", "clean": "100111", "pos": "15:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "10", "clean": "10", "pos": "6:5"}, {"raw": "rs2_p", "clean": "rs2_p", "pos": "4:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest/Src1"}, {"name": "rs2'", "desc": "Source register 2 (3-bit compressed)"}], "pseudocode": "R[rd'] = R[rd'] * R[rs2'];", "description": "Multiplies rd′ and rs2′, writing the lower XLEN bits of the product to rd′ (Zcb).", "example": "C.MUL rd', rs2'"}
{"mnemonic": "C.ZEXT.B", "architecture": "RISC-V", "extension": "Zcb", "full_name": "Compressed Zero Extend Byte", "summary": "Zero extends the lowest byte of rd' to XLEN.", "syntax": "C.ZEXT.B rd'", "encoding": {"format": "CR", "binary_pattern": "? | 100111 | rd_rs1_p | 1100001", "hex_opcode": "0x00009C61", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100111", "clean": "100111", "pos": "15:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "1100001", "clean": "1100001", "pos": "6:0"}], "bit_positions": "31:16 | 15:10 | 9:7 | 6:0"}, "operands": [{"name": "rd'", "desc": "Dest/Src"}], "pseudocode": "R[rd'] = zext(R[rd'][7:0]);", "description": "Zero-extends the least-significant byte of rd′ in place (Zcb).", "example": "C.ZEXT.B rd'"}
{"mnemonic": "C.SEXT.B", "architecture": "RISC-V", "extension": "Zcb", "full_name": "Compressed Sign Extend Byte", "summary": "Sign extends the lowest byte of rd' to XLEN.", "syntax": "C.SEXT.B rd'", "encoding": {"format": "CR", "binary_pattern": "? | 100111 | rd_rs1_p | 1100101", "hex_opcode": "0x00009C65", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100111", "clean": "100111", "pos": "15:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "1100101", "clean": "1100101", "pos": "6:0"}], "bit_positions": "31:16 | 15:10 | 9:7 | 6:0"}, "operands": [{"name": "rd'", "desc": "Dest/Src"}], "pseudocode": "R[rd'] = sext(R[rd'][7:0]);", "description": "Sign-extends the least-significant byte of rd′ in place (Zcb).", "example": "C.SEXT.B rd'"}
{"mnemonic": "C.NOT", "architecture": "RISC-V", "extension": "Zcb", "full_name": "Compressed Bitwise NOT", "summary": "Computes bitwise logical negation.", "syntax": "C.NOT rd'", "encoding": {"format": "CR", "binary_pattern": "? | 100111 | rd_rs1_p | 1110101", "hex_opcode": "0x00009C75", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100111", "clean": "100111", "pos": "15:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "1110101", "clean": "1110101", "pos": "6:0"}], "bit_positions": "31:16 | 15:10 | 9:7 | 6:0"}, "operands": [{"name": "rd'", "desc": "Dest/Src"}], "pseudocode": "R[rd'] = ~R[rd'];", "description": "Bitwise logical NOT of rd′; writes to rd′ (Zcb). Equivalent to XORI rd′, -1.", "example": "C.NOT rd'"}
{"mnemonic": "SM4ED", "architecture": "RISC-V", "extension": "Zksh", "full_name": "SM4 Encryption/Decryption", "summary": "Accelerates the SM4 block cipher (encryption/decryption round).", "syntax": "SM4ED rd, rs1, rs2, bs", "encoding": {"format": "R-Type", "binary_pattern": "bs | 11000 | rs2 | rs1 | 000 | rd | 0110011", "hex_opcode": "0x30000033", "visual_parts": [{"raw": "bs", "clean": "bs", "pos": "31:30"}, {"raw": "11000", "clean": "11000", "pos": "29:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:30 | 29:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "bs", "desc": "Byte Select"}], "pseudocode": "rd = SM4_Round(rs1, rs2, bs);", "description": "SM4ED performs one round of the SM4 block cipher encryption/decryption by applying the S-box and linear transformation to four bytes from rs2, XORing with rs1, and accumulating into rd.", "example": "SM4ED t0, a0, a1, bs"}
{"mnemonic": "SM4KS", "architecture": "RISC-V", "extension": "Zksh", "full_name": "SM4 Key Schedule", "summary": "Accelerates the SM4 key schedule generation.", "syntax": "SM4KS rd, rs1, rs2, bs", "encoding": {"format": "R-Type", "binary_pattern": "bs | 11010 | rs2 | rs1 | 000 | rd | 0110011", "hex_opcode": "0x34000033", "visual_parts": [{"raw": "bs", "clean": "bs", "pos": "31:30"}, {"raw": "11010", "clean": "11010", "pos": "29:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:30 | 29:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "bs", "desc": "Byte Select"}], "pseudocode": "rd = SM4_KeyGen(rs1, rs2, bs);", "description": "SM4KS performs one step of the SM4 key schedule by applying the S-box and key-schedule linear transformation to four bytes from rs2, XORing with rs1, and accumulating into rd.", "example": "SM4KS t0, a0, a1, bs"}
{"mnemonic": "SM3P0", "architecture": "RISC-V", "extension": "Zksh", "full_name": "SM3 P0 Transformation", "summary": "Performs the P0 permutation for the SM3 hash algorithm.", "syntax": "SM3P0 rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "000100001000 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x10801013", "visual_parts": [{"raw": "000100001000", "clean": "000100001000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}], "pseudocode": "rd = P0(rs1);", "description": "SM3P0 applies the SM3 P0 permutation function to rs1 and writes to rd. Used in the key schedule and compression function of the Chinese SM3 hash algorithm.", "example": "SM3P0 t0, a0"}
{"mnemonic": "SM3P1", "architecture": "RISC-V", "extension": "Zksh", "full_name": "SM3 P1 Transformation", "summary": "Performs the P1 permutation for the SM3 hash algorithm.", "syntax": "SM3P1 rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "000100001001 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x10901013", "visual_parts": [{"raw": "000100001001", "clean": "000100001001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}], "pseudocode": "rd = P1(rs1);", "description": "SM3P1 applies the SM3 P1 permutation function to rs1 and writes to rd. Used in message expansion of the SM3 hash algorithm.", "example": "SM3P1 t0, a0"}
{"mnemonic": "CM.PUSH", "architecture": "RISC-V", "extension": "Zcmp", "full_name": "Push Registers", "summary": "Pushes multiple registers (ra, s0-s11) to the stack and adjusts sp. Critical for small code size.", "syntax": "CM.PUSH {reg_list}, -stack_adj", "encoding": {"format": "Push/Pop", "binary_pattern": "? | 10111000 | c_rlist | c_spimm | 10", "hex_opcode": "0x0000B802", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "10111000", "clean": "10111000", "pos": "15:8"}, {"raw": "c_rlist", "clean": "c_rlist", "pos": "7:4"}, {"raw": "c_spimm", "clean": "c_spimm", "pos": "3:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:8 | 7:4 | 3:2 | 1:0"}, "operands": [{"name": "rlist", "desc": "Register List"}, {"name": "stack_adj", "desc": "Stack Adjustment"}], "pseudocode": "SP -= adj; Mem[SP] = {regs};", "description": "CM.PUSH (Zcmp) saves a set of registers to the stack and decrements sp by a stack-frame size. The register list and stack adjustment are encoded in the instruction. Used as a function prologue.", "example": "CM.PUSH {reg_list}, -stack_adj"}
{"mnemonic": "CM.POP", "architecture": "RISC-V", "extension": "Zcmp", "full_name": "Pop Registers", "summary": "Pops multiple registers from the stack and restores sp.", "syntax": "CM.POP {reg_list}, stack_adj", "encoding": {"format": "Push/Pop", "binary_pattern": "? | 10111010 | c_rlist | c_spimm | 10", "hex_opcode": "0x0000BA02", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "10111010", "clean": "10111010", "pos": "15:8"}, {"raw": "c_rlist", "clean": "c_rlist", "pos": "7:4"}, {"raw": "c_spimm", "clean": "c_spimm", "pos": "3:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:8 | 7:4 | 3:2 | 1:0"}, "operands": [{"name": "rlist", "desc": "Register List"}, {"name": "stack_adj", "desc": "Stack Adjustment"}], "pseudocode": "{regs} = Mem[SP]; SP += adj;", "description": "CM.POP (Zcmp) restores a set of registers from the stack, increments sp by the matching stack-frame size, and returns. Used as a function epilogue.", "example": "CM.POP {reg_list}, stack_adj"}
{"mnemonic": "VSETVL", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Set VL", "summary": "Sets the vector length (VL) based on the application vector length (AVL) in rs1 and configuration in rs2.", "syntax": "VSETVL rd, rs1, rs2", "encoding": {"format": "V-Type", "binary_pattern": "1000000 | rs2 | rs1 | 111 | rd | 1010111", "hex_opcode": "0x80007057", "visual_parts": [{"raw": "1000000", "clean": "1000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (New VL)"}, {"name": "rs1", "desc": "AVL"}, {"name": "rs2", "desc": "Config (VTYPE)"}], "pseudocode": "vl = set_config(rs1, rs2); R[rd] = vl;", "description": "Sets the vector length (vl) and vector type (vtype) registers based on the requested application vector length (AVL) and element width/grouping. The actual vector length set is written to rd. vtype encodes SEW (element width), LMUL (register grouping), and tail/mask policies.", "example": "VSETVL t0, a0, a1"}
{"mnemonic": "CBO.ZERO", "architecture": "RISC-V", "extension": "Zicboz", "full_name": "Cache Block Zero", "summary": "Zeros a cache block corresponding to the address in rs1.", "syntax": "CBO.ZERO (rs1)", "encoding": {"format": "I-Type", "binary_pattern": "000000000100 | rs1 | 010000000001111", "hex_opcode": "0x0040200F", "visual_parts": [{"raw": "000000000100", "clean": "000000000100", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010000000001111", "clean": "010000000001111", "pos": "14:0"}], "bit_positions": "31:20 | 19:15 | 14:0"}, "operands": [{"name": "rs1", "desc": "Address"}], "pseudocode": "memset(BlockAddr(rs1), 0, BlockSize);", "description": "CBO.ZERO writes zeros to the cache block containing the effective address. Typically faster than a sequence of store instructions for zeroing memory.", "example": "CBO.ZERO a0"}
{"mnemonic": "FCVT.W.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Convert to Word (Single)", "summary": "Converts a single-precision floating-point number to a signed 32-bit integer.", "syntax": "FCVT.W.S rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110000000000 | rs1 | rm | rd | 1010011", "hex_opcode": "0xC0000053", "visual_parts": [{"raw": "110000000000", "clean": "110000000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Integer)"}, {"name": "rs1", "desc": "Source (Float)"}], "pseudocode": "R[rd] = sext(f32_to_i32(F[rs1]));", "example": "FCVT.W.S x10, f1", "example_note": "Convert float f1 to int x10.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.S.W", "architecture": "RISC-V", "extension": "F", "full_name": "Float Convert from Word (Single)", "summary": "Converts a signed 32-bit integer to a single-precision floating-point number.", "syntax": "FCVT.S.W rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110100000000 | rs1 | rm | rd | 1010011", "hex_opcode": "0xD0000053", "visual_parts": [{"raw": "110100000000", "clean": "110100000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Float)"}, {"name": "rs1", "desc": "Source (Integer)"}], "pseudocode": "F[rd] = i32_to_f32(R[rs1]);", "example": "FCVT.S.W f1, x10", "example_note": "Convert int x10 to float f1.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.D.S", "architecture": "RISC-V", "extension": "D", "full_name": "Float Convert Single to Double", "summary": "Converts a single-precision float to a double-precision float.", "syntax": "FCVT.D.S rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "010000100000 | rs1 | rm | rd | 1010011", "hex_opcode": "0x42000053", "visual_parts": [{"raw": "010000100000", "clean": "010000100000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Double)"}, {"name": "rs1", "desc": "Source (Single)"}], "pseudocode": "F[rd] = f32_to_f64(F[rs1]);", "example": "FCVT.D.S f0, f1", "example_note": "Promote float to double.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.S.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Convert Double to Single", "summary": "Converts a double-precision float to a single-precision float.", "syntax": "FCVT.S.D rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "010000000001 | rs1 | rm | rd | 1010011", "hex_opcode": "0x40100053", "visual_parts": [{"raw": "010000000001", "clean": "010000000001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Single)"}, {"name": "rs1", "desc": "Source (Double)"}], "pseudocode": "F[rd] = f64_to_f32(F[rs1]);", "example": "FCVT.S.D f1, f0", "example_note": "Demote double to float.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FSGNJ.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Sign Injection (Single)", "summary": "Injects the sign of rs2 into rs1. Used to copy values or manipulate signs.", "syntax": "FSGNJ.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010000 | rs2 | rs1 | 000 | rd | 1010011", "hex_opcode": "0x20000053", "visual_parts": [{"raw": "0010000", "clean": "0010000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source (Body)"}, {"name": "rs2", "desc": "Source (Sign)"}], "pseudocode": "F[rd] = {F[rs2][31], F[rs1][30:0]};", "example": "FSGNJ.S f1, f2, f3", "example_note": "f1 gets magnitude of f2 and sign of f3.", "description": "Produces a result with the magnitude of rs1 and the sign bit taken from the source rs2. Used to implement floating-point absolute value, negate, and copy-sign."}
{"mnemonic": "FSGNJN.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Sign Injection Negate (Single)", "summary": "Injects the *negated* sign of rs2 into rs1. Used for negation and absolute value.", "syntax": "FSGNJN.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010000 | rs2 | rs1 | 001 | rd | 1010011", "hex_opcode": "0x20001053", "visual_parts": [{"raw": "0010000", "clean": "0010000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source (Body)"}, {"name": "rs2", "desc": "Source (Sign)"}], "pseudocode": "F[rd] = {~F[rs2][31], F[rs1][30:0]};", "example": "FSGNJN.S f1, f2, f2", "example_note": "Negates f2 (f1 = -f2).", "description": "Produces a result with the magnitude of rs1 and the sign bit taken from the source rs2. Used to implement floating-point absolute value, negate, and copy-sign."}
{"mnemonic": "FSGNJX.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Sign Injection XOR (Single)", "summary": "Injects the XOR of signs of rs1 and rs2. Used to copy sign.", "syntax": "FSGNJX.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010000 | rs2 | rs1 | 010 | rd | 1010011", "hex_opcode": "0x20002053", "visual_parts": [{"raw": "0010000", "clean": "0010000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = {F[rs1][31] ^ F[rs2][31], F[rs1][30:0]};", "example": "FSGNJX.S f1, f1, f2", "example_note": "Logic similar to Abs(f1) if f2 is properly set.", "description": "Produces a result with the magnitude of rs1 and the sign bit taken from the source rs2. Used to implement floating-point absolute value, negate, and copy-sign."}
{"mnemonic": "FEQ.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Equal (Single)", "summary": "Sets integer rd to 1 if float rs1 equals float rs2, else 0.", "syntax": "FEQ.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "1010000 | rs2 | rs1 | 010 | rd | 1010011", "hex_opcode": "0xA0002053", "visual_parts": [{"raw": "1010000", "clean": "1010000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Integer)"}, {"name": "rs1", "desc": "Src 1 (Float)"}, {"name": "rs2", "desc": "Src 2 (Float)"}], "pseudocode": "R[rd] = (F[rs1] == F[rs2]) ? 1 : 0;", "example": "FEQ.S x10, f1, f2", "example_note": "x10 = (f1 == f2)", "description": "Performs a single-precision (32-bit) floating-point equality comparison and writes 1 (true) or 0 (false) to integer rd. NaN inputs produce 0 (unordered), except FEQ which raises invalid-operation if either operand is a signalling NaN."}
{"mnemonic": "FLT.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Less Than (Single)", "summary": "Sets integer rd to 1 if float rs1 is less than float rs2, else 0.", "syntax": "FLT.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "1010000 | rs2 | rs1 | 001 | rd | 1010011", "hex_opcode": "0xA0001053", "visual_parts": [{"raw": "1010000", "clean": "1010000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Integer)"}, {"name": "rs1", "desc": "Src 1 (Float)"}, {"name": "rs2", "desc": "Src 2 (Float)"}], "pseudocode": "R[rd] = (F[rs1] < F[rs2]) ? 1 : 0;", "example": "FLT.S x10, f1, f2", "example_note": "x10 = (f1 < f2)", "description": "Performs a single-precision (32-bit) floating-point less-than comparison and writes 1 (true) or 0 (false) to integer rd. NaN inputs produce 0 (unordered), except FEQ which raises invalid-operation if either operand is a signalling NaN."}
{"mnemonic": "FLE.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Less or Equal (Single)", "summary": "Sets integer rd to 1 if float rs1 is less than or equal to float rs2, else 0.", "syntax": "FLE.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "1010000 | rs2 | rs1 | 000 | rd | 1010011", "hex_opcode": "0xA0000053", "visual_parts": [{"raw": "1010000", "clean": "1010000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Integer)"}, {"name": "rs1", "desc": "Src 1 (Float)"}, {"name": "rs2", "desc": "Src 2 (Float)"}], "pseudocode": "R[rd] = (F[rs1] <= F[rs2]) ? 1 : 0;", "example": "FLE.S x10, f1, f2", "example_note": "x10 = (f1 <= f2)", "description": "Performs a single-precision (32-bit) floating-point less-than-or-equal comparison and writes 1 (true) or 0 (false) to integer rd. NaN inputs produce 0 (unordered), except FEQ which raises invalid-operation if either operand is a signalling NaN."}
{"mnemonic": "FMV.X.W", "architecture": "RISC-V", "extension": "F", "full_name": "Move Float to Integer", "summary": "Moves the bit pattern of a floating-point register to an integer register.", "syntax": "FMV.X.W rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "111000000000 | rs1 | 000 | rd | 1010011", "hex_opcode": "0xE0000053", "visual_parts": [{"raw": "111000000000", "clean": "111000000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Integer)"}, {"name": "rs1", "desc": "Source (Float)"}], "pseudocode": "R[rd] = sext(F[rs1]);", "example": "FMV.X.W x10, f1", "example_note": "Copy bits from f1 to x10.", "description": "Moves bits from a floating-point register to an integer register (or vice versa) without conversion. The bit pattern is preserved exactly."}
{"mnemonic": "FMV.W.X", "architecture": "RISC-V", "extension": "F", "full_name": "Move Integer to Float", "summary": "Moves the bit pattern of an integer register to a floating-point register.", "syntax": "FMV.W.X rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "111100000000 | rs1 | 000 | rd | 1010011", "hex_opcode": "0xF0000053", "visual_parts": [{"raw": "111100000000", "clean": "111100000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Float)"}, {"name": "rs1", "desc": "Source (Integer)"}], "pseudocode": "F[rd] = R[rs1];", "example": "FMV.W.X f1, x10", "example_note": "Copy bits from x10 to f1.", "description": "Moves bits from a floating-point register to an integer register (or vice versa) without conversion. The bit pattern is preserved exactly."}
{"mnemonic": "VFMUL.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Multiply", "summary": "Multiplies elements of two floating-point vectors.", "syntax": "VFMUL.VV vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "100100 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0x90001057", "visual_parts": [{"raw": "100100", "clean": "100100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] * vs2[i];", "description": "Performs element-wise floating-point multiplication on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VFMUL.VV v1, v4, v2, v0.t"}
{"mnemonic": "VFDIV.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Divide", "summary": "Divides elements of two floating-point vectors.", "syntax": "VFDIV.VV vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "100000 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0x80001057", "visual_parts": [{"raw": "100000", "clean": "100000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Divisor"}, {"name": "vs1", "desc": "Dividend"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] / vs2[i];", "description": "Performs element-wise floating-point division on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VFDIV.VV v1, v4, v2, v0.t"}
{"mnemonic": "VFSQRT.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Square Root", "summary": "Computes the square root of elements in a floating-point vector.", "syntax": "VFSQRT.V vd, vs2, vm", "encoding": {"format": "OPFVV", "binary_pattern": "010011 | vm | vs2 | 00000001 | vd | 1010111", "hex_opcode": "0x4C001057", "visual_parts": [{"raw": "010011", "clean": "010011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00000001", "clean": "00000001", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source"}], "pseudocode": "foreach(i < vl): vd[i] = sqrt(vs2[i]);", "description": "Performs element-wise FP square root on operands, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VFSQRT.V v1, v4, v0.t"}
{"mnemonic": "VFMADD.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Fused Multiply-Add", "summary": "Computes (vs1 * vs2) + vd (overwriting vd) with single rounding.", "syntax": "VFMADD.VV vd, vs1, vs2, vm", "encoding": {"format": "OPFVV", "binary_pattern": "101000 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0xA0001057", "visual_parts": [{"raw": "101000", "clean": "101000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest/Addend"}, {"name": "vs1", "desc": "Source vector register 1"}, {"name": "vs2", "desc": "Source vector register 2"}], "pseudocode": "foreach(i < vl): vd[i] = (vs1[i] * vs2[i]) + vd[i];", "description": "Performs element-wise FP fused multiply-add on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VFMADD.VV v1, v2, v4, v0.t"}
{"mnemonic": "VFMIN.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Minimum", "summary": "Writes the smaller of two floating-point vector elements to vd.", "syntax": "VFMIN.VV vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "000100 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0x10001057", "visual_parts": [{"raw": "000100", "clean": "000100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = min(vs1[i], vs2[i]);", "description": "Performs element-wise FP min on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VFMIN.VV v1, v4, v2, v0.t"}
{"mnemonic": "VFMAX.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Maximum", "summary": "Writes the larger of two floating-point vector elements to vd.", "syntax": "VFMAX.VV vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "000110 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0x18001057", "visual_parts": [{"raw": "000110", "clean": "000110", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = max(vs1[i], vs2[i]);", "description": "Performs element-wise FP max on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VFMAX.VV v1, v4, v2, v0.t"}
{"mnemonic": "VFSGNJ.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Sign Injection", "summary": "Injects the sign of vs2 into vs1 (Copy Sign).", "syntax": "VFSGNJ.VV vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "001000 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0x20001057", "visual_parts": [{"raw": "001000", "clean": "001000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Sign Src"}, {"name": "vs1", "desc": "Body Src"}], "pseudocode": "foreach(i < vl): vd[i] = copy_sign(vs1[i], vs2[i]);", "description": "Injects the sign of one FP element into the magnitude of another, implementing sign copy, negate, or XOR operations.", "example": "VFSGNJ.VV v1, v4, v2, v0.t"}
{"mnemonic": "VSADD.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Saturating Integer Add", "summary": "Adds elements with signed saturation (clips to Max/Min instead of wrapping).", "syntax": "VSADD.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100001 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x84000057", "visual_parts": [{"raw": "100001", "clean": "100001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = saturate_s(vs1[i] + vs2[i]);", "description": "Performs element-wise signed saturating add on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VSADD.VV v1, v4, v2, v0.t"}
{"mnemonic": "VSSUB.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Saturating Integer Subtract", "summary": "Subtracts elements with signed saturation.", "syntax": "VSSUB.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100011 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x8C000057", "visual_parts": [{"raw": "100011", "clean": "100011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = saturate_s(vs1[i] - vs2[i]);", "description": "Performs element-wise signed saturating subtract on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VSSUB.VV v1, v4, v2, v0.t"}
{"mnemonic": "VAADD.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Averaging Add", "summary": "Computes (vs1 + vs2) >> 1 with rounding.", "syntax": "VAADD.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "001001 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x24002057", "visual_parts": [{"raw": "001001", "clean": "001001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (vs1[i] + vs2[i] + 1) >> 1;", "description": "Vector Averaging Add: Computes (vs1 + vs2) >> 1 with rounding. Operation: foreach(i < vl): vd[i] = (vs1[i] + vs2[i] + 1) >> 1;.", "example": "VAADD.VV v1, v4, v2, v0.t"}
{"mnemonic": "VCOMPRESS.VM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Compress", "summary": "Compacts elements from source vector into contiguous elements in dest where the mask is 1.", "syntax": "VCOMPRESS.VM vd, vs2, vs1", "encoding": {"format": "OPMVV", "binary_pattern": "0101111 | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x5E002057", "visual_parts": [{"raw": "0101111", "clean": "0101111", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source"}, {"name": "vs1", "desc": "Mask"}], "pseudocode": "idx = 0; foreach(i < vl): if vs1[i]: vd[idx++] = vs2[i];", "description": "Compresses active (masked) elements of vs2 into the low elements of vd, discarding masked-off elements.", "example": "VCOMPRESS.VM v1, v4, v2"}
{"mnemonic": "FSUB.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Subtract (Half)", "summary": "Performs 16-bit floating-point subtraction.", "syntax": "FSUB.H rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000110 | rs2 | rs1 | rm | rd | 1010011", "hex_opcode": "0x0C000053", "visual_parts": [{"raw": "0000110", "clean": "0000110", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = F[rs1] - F[rs2];", "description": "Performs half-precision (16-bit) floating-point subtraction. The operation subtracts the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FSUB.H t0, a0, a1"}
{"mnemonic": "FMUL.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Multiply (Half)", "summary": "Performs 16-bit floating-point multiplication.", "syntax": "FMUL.H rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0001010 | rs2 | rs1 | rm | rd | 1010011", "hex_opcode": "0x14000053", "visual_parts": [{"raw": "0001010", "clean": "0001010", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = F[rs1] * F[rs2];", "description": "Performs half-precision (16-bit) floating-point multiplication. The operation multiplies the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FMUL.H t0, a0, a1"}
{"mnemonic": "FDIV.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Divide (Half)", "summary": "Performs 16-bit floating-point division.", "syntax": "FDIV.H rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0001110 | rs2 | rs1 | rm | rd | 1010011", "hex_opcode": "0x1C000053", "visual_parts": [{"raw": "0001110", "clean": "0001110", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Dividend"}, {"name": "rs2", "desc": "Divisor"}], "pseudocode": "F[rd] = F[rs1] / F[rs2];", "description": "Performs half-precision (16-bit) floating-point division. The operation divides the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FDIV.H t0, a0, a1"}
{"mnemonic": "FSQRT.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Square Root (Half)", "summary": "Computes the square root of a 16-bit floating-point number.", "syntax": "FSQRT.H rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "010111000000 | rs1 | rm | rd | 1010011", "hex_opcode": "0x5C000053", "visual_parts": [{"raw": "010111000000", "clean": "010111000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "F[rd] = sqrt(F[rs1]);", "description": "Stores a floating-point register to memory at address rs1+sext(offset).", "example": "FSQRT.H t0, a0"}
{"mnemonic": "FMIN.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Minimum (Half)", "summary": "Writes the smaller of two 16-bit floating-point values to rd.", "syntax": "FMIN.H rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010110 | rs2 | rs1 | 000 | rd | 1010011", "hex_opcode": "0x2C000053", "visual_parts": [{"raw": "0010110", "clean": "0010110", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = min(F[rs1], F[rs2]);", "description": "Returns the half-precision (16-bit) floating-point minimum of rs1 and rs2, following IEEE 754-2019 minNum/maxNum semantics. Quiet NaN inputs return the non-NaN operand; signalling NaN inputs raise invalid-operation.", "example": "FMIN.H t0, a0, a1"}
{"mnemonic": "FMAX.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Maximum (Half)", "summary": "Writes the larger of two 16-bit floating-point values to rd.", "syntax": "FMAX.H rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010110 | rs2 | rs1 | 001 | rd | 1010011", "hex_opcode": "0x2C001053", "visual_parts": [{"raw": "0010110", "clean": "0010110", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = max(F[rs1], F[rs2]);", "description": "Returns the half-precision (16-bit) floating-point maximum of rs1 and rs2, following IEEE 754-2019 minNum/maxNum semantics. Quiet NaN inputs return the non-NaN operand; signalling NaN inputs raise invalid-operation.", "example": "FMAX.H t0, a0, a1"}
{"mnemonic": "FMADD.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Fused Multiply-Add (Half)", "summary": "Computes (rs1 * rs2) + rs3 with single rounding (16-bit).", "syntax": "FMADD.H rd, rs1, rs2, rs3", "encoding": {"format": "R4-Type", "binary_pattern": "rs3 | 10 | rs2 | rs1 | rm | rd | 1000011", "hex_opcode": "0x04000043", "visual_parts": [{"raw": "rs3", "clean": "rs3", "pos": "31:27"}, {"raw": "10", "clean": "10", "pos": "26:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1000011", "clean": "1000011", "pos": "6:0"}], "bit_positions": "31:27 | 26:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "rs3", "desc": "Src 3"}], "pseudocode": "F[rd] = (F[rs1] * F[rs2]) + F[rs3];", "description": "Performs half-precision (16-bit) floating-point fused multiply-add. The operation computes fused multiply-add on the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FMADD.H t0, a0, a1, a2"}
{"mnemonic": "FMSUB.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Fused Multiply-Subtract (Half)", "summary": "Computes (rs1 * rs2) - rs3 with single rounding (16-bit).", "syntax": "FMSUB.H rd, rs1, rs2, rs3", "encoding": {"format": "R4-Type", "binary_pattern": "rs3 | 10 | rs2 | rs1 | rm | rd | 1000111", "hex_opcode": "0x04000047", "visual_parts": [{"raw": "rs3", "clean": "rs3", "pos": "31:27"}, {"raw": "10", "clean": "10", "pos": "26:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1000111", "clean": "1000111", "pos": "6:0"}], "bit_positions": "31:27 | 26:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "rs3", "desc": "Src 3"}], "pseudocode": "F[rd] = (F[rs1] * F[rs2]) - F[rs3];", "description": "Performs half-precision (16-bit) floating-point fused multiply-subtract. The operation computes fused multiply-subtract on the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FMSUB.H t0, a0, a1, a2"}
{"mnemonic": "FNMADD.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Negated Fused Multiply-Add (Half)", "summary": "Computes -(rs1 * rs2) - rs3 with single rounding (16-bit).", "syntax": "FNMADD.H rd, rs1, rs2, rs3", "encoding": {"format": "R4-Type", "binary_pattern": "rs3 | 10 | rs2 | rs1 | rm | rd | 1001111", "hex_opcode": "0x0400004F", "visual_parts": [{"raw": "rs3", "clean": "rs3", "pos": "31:27"}, {"raw": "10", "clean": "10", "pos": "26:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1001111", "clean": "1001111", "pos": "6:0"}], "bit_positions": "31:27 | 26:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "rs3", "desc": "Src 3"}], "pseudocode": "F[rd] = -((F[rs1] * F[rs2]) + F[rs3]);", "description": "Performs half-precision (16-bit) floating-point fused negate-multiply-add. The operation computes fused negate-multiply-add on the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FNMADD.H t0, a0, a1, a2"}
{"mnemonic": "FNMSUB.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Negated Fused Multiply-Subtract (Half)", "summary": "Computes -(rs1 * rs2) + rs3 with single rounding (16-bit).", "syntax": "FNMSUB.H rd, rs1, rs2, rs3", "encoding": {"format": "R4-Type", "binary_pattern": "rs3 | 10 | rs2 | rs1 | rm | rd | 1001011", "hex_opcode": "0x0400004B", "visual_parts": [{"raw": "rs3", "clean": "rs3", "pos": "31:27"}, {"raw": "10", "clean": "10", "pos": "26:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1001011", "clean": "1001011", "pos": "6:0"}], "bit_positions": "31:27 | 26:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "rs3", "desc": "Src 3"}], "pseudocode": "F[rd] = -((F[rs1] * F[rs2]) - F[rs3]);", "description": "Performs half-precision (16-bit) floating-point fused negate-multiply-subtract. The operation computes fused negate-multiply-subtract on the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008.", "example": "FNMSUB.H t0, a0, a1, a2"}
{"mnemonic": "FEQ.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Equal (Half)", "summary": "Sets integer rd to 1 if half-precision rs1 equals rs2, else 0.", "syntax": "FEQ.H rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "1010010 | rs2 | rs1 | 010 | rd | 1010011", "hex_opcode": "0xA4002053", "visual_parts": [{"raw": "1010010", "clean": "1010010", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Int)"}, {"name": "rs1", "desc": "Src 1 (Half)"}, {"name": "rs2", "desc": "Src 2 (Half)"}], "pseudocode": "R[rd] = (F[rs1] == F[rs2]) ? 1 : 0;", "description": "Performs a half-precision (16-bit) floating-point equality comparison and writes 1 (true) or 0 (false) to integer rd. NaN inputs produce 0 (unordered), except FEQ which raises invalid-operation if either operand is a signalling NaN.", "example": "FEQ.H t0, a0, a1"}
{"mnemonic": "FLT.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Less Than (Half)", "summary": "Sets integer rd to 1 if half-precision rs1 is less than rs2, else 0.", "syntax": "FLT.H rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "1010010 | rs2 | rs1 | 001 | rd | 1010011", "hex_opcode": "0xA4001053", "visual_parts": [{"raw": "1010010", "clean": "1010010", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Int)"}, {"name": "rs1", "desc": "Src 1 (Half)"}, {"name": "rs2", "desc": "Src 2 (Half)"}], "pseudocode": "R[rd] = (F[rs1] < F[rs2]) ? 1 : 0;", "description": "Performs a half-precision (16-bit) floating-point less-than comparison and writes 1 (true) or 0 (false) to integer rd. NaN inputs produce 0 (unordered), except FEQ which raises invalid-operation if either operand is a signalling NaN.", "example": "FLT.H t0, a0, a1"}
{"mnemonic": "FLE.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Less or Equal (Half)", "summary": "Sets integer rd to 1 if half-precision rs1 is less than or equal to rs2, else 0.", "syntax": "FLE.H rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "1010010 | rs2 | rs1 | 000 | rd | 1010011", "hex_opcode": "0xA4000053", "visual_parts": [{"raw": "1010010", "clean": "1010010", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Int)"}, {"name": "rs1", "desc": "Src 1 (Half)"}, {"name": "rs2", "desc": "Src 2 (Half)"}], "pseudocode": "R[rd] = (F[rs1] <= F[rs2]) ? 1 : 0;", "description": "Performs a half-precision (16-bit) floating-point less-than-or-equal comparison and writes 1 (true) or 0 (false) to integer rd. NaN inputs produce 0 (unordered), except FEQ which raises invalid-operation if either operand is a signalling NaN.", "example": "FLE.H t0, a0, a1"}
{"mnemonic": "FCLASS.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Classify (Half)", "summary": "Examines a 16-bit floating-point number and generates a classification bitmask.", "syntax": "FCLASS.H rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "111001000000 | rs1 | 001 | rd | 1010011", "hex_opcode": "0xE4001053", "visual_parts": [{"raw": "111001000000", "clean": "111001000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Int)"}, {"name": "rs1", "desc": "Src (Half)"}], "pseudocode": "R[rd] = classify_half(F[rs1]);", "description": "Classifies the half-precision (16-bit) floating-point value in rs1, writing a 10-bit one-hot result to integer rd. Bits represent: negative infinity, negative normal, negative subnormal, negative zero, positive zero, positive subnormal, positive normal, positive infinity, signalling NaN, quiet NaN.", "example": "FCLASS.H t0, a0"}
{"mnemonic": "FSGNJ.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Sign Injection (Half)", "summary": "Injects the sign of rs2 into rs1 (16-bit).", "syntax": "FSGNJ.H rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010010 | rs2 | rs1 | 000 | rd | 1010011", "hex_opcode": "0x24000053", "visual_parts": [{"raw": "0010010", "clean": "0010010", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Sign Src"}], "pseudocode": "F[rd] = {F[rs2][15], F[rs1][14:0]};", "description": "Produces a result with the magnitude of rs1 and the sign bit taken from the source rs2. Used to implement floating-point absolute value, negate, and copy-sign.", "example": "FSGNJ.H t0, a0, a1"}
{"mnemonic": "FSGNJN.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Sign Injection Negate (Half)", "summary": "Injects the negated sign of rs2 into rs1 (16-bit).", "syntax": "FSGNJN.H rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010010 | rs2 | rs1 | 001 | rd | 1010011", "hex_opcode": "0x24001053", "visual_parts": [{"raw": "0010010", "clean": "0010010", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Sign Src"}], "pseudocode": "F[rd] = {~F[rs2][15], F[rs1][14:0]};", "description": "Produces a result with the magnitude of rs1 and the sign bit taken from the source rs2. Used to implement floating-point absolute value, negate, and copy-sign.", "example": "FSGNJN.H t0, a0, a1"}
{"mnemonic": "FSGNJX.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Float Sign Injection XOR (Half)", "summary": "Injects the XOR of signs of rs1 and rs2 (16-bit).", "syntax": "FSGNJX.H rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010010 | rs2 | rs1 | 010 | rd | 1010011", "hex_opcode": "0x24002053", "visual_parts": [{"raw": "0010010", "clean": "0010010", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Sign Src"}], "pseudocode": "F[rd] = {F[rs1][15] ^ F[rs2][15], F[rs1][14:0]};", "description": "Produces a result with the magnitude of rs1 and the sign bit taken from the source rs2. Used to implement floating-point absolute value, negate, and copy-sign.", "example": "FSGNJX.H t0, a0, a1"}
{"mnemonic": "FCVT.W.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Convert Half to Word", "summary": "Converts a 16-bit floating-point number to a 32-bit signed integer.", "syntax": "FCVT.W.H rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110001000000 | rs1 | rm | rd | 1010011", "hex_opcode": "0xC4000053", "visual_parts": [{"raw": "110001000000", "clean": "110001000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Int)"}, {"name": "rs1", "desc": "Src (Half)"}], "pseudocode": "R[rd] = sext(f16_to_i32(F[rs1]));", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value.", "example": "FCVT.W.H t0, a0"}
{"mnemonic": "FCVT.WU.H", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Convert Half to Unsigned Word", "summary": "Converts a 16-bit floating-point number to a 32-bit unsigned integer.", "syntax": "FCVT.WU.H rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110001000001 | rs1 | rm | rd | 1010011", "hex_opcode": "0xC4100053", "visual_parts": [{"raw": "110001000001", "clean": "110001000001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (UInt)"}, {"name": "rs1", "desc": "Src (Half)"}], "pseudocode": "R[rd] = sext(f16_to_u32(F[rs1]));", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value.", "example": "FCVT.WU.H t0, a0"}
{"mnemonic": "FCVT.H.W", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Convert Word to Half", "summary": "Converts a 32-bit signed integer to a 16-bit floating-point number.", "syntax": "FCVT.H.W rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110101000000 | rs1 | rm | rd | 1010011", "hex_opcode": "0xD4000053", "visual_parts": [{"raw": "110101000000", "clean": "110101000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Half)"}, {"name": "rs1", "desc": "Src (Int)"}], "pseudocode": "F[rd] = i32_to_f16(R[rs1]);", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value.", "example": "FCVT.H.W t0, a0"}
{"mnemonic": "FCVT.H.WU", "architecture": "RISC-V", "extension": "Zfh", "full_name": "Convert Unsigned Word to Half", "summary": "Converts a 32-bit unsigned integer to a 16-bit floating-point number.", "syntax": "FCVT.H.WU rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110101000001 | rs1 | rm | rd | 1010011", "hex_opcode": "0xD4100053", "visual_parts": [{"raw": "110101000001", "clean": "110101000001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Half)"}, {"name": "rs1", "desc": "Src (UInt)"}], "pseudocode": "F[rd] = u32_to_f16(R[rs1]);", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value.", "example": "FCVT.H.WU t0, a0"}
{"mnemonic": "VNCLIP.WV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Narrowing Clip (Arithmetic Shift)", "summary": "Shifts elements right, rounds, and clips (saturates) the result to the destination width. Critical for Quantization.", "syntax": "VNCLIP.WV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "101111 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0xBC000057", "visual_parts": [{"raw": "101111", "clean": "101111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Narrow)"}, {"name": "vs2", "desc": "Src Vector (Wide)"}, {"name": "vs1", "desc": "Shift Vector"}], "pseudocode": "foreach(i < vl): vd[i] = clip(round(vs2[i] >> vs1[i]));", "description": "Performs a narrowing operation, halving the result element width relative to the source. Optionally saturates the result. Active elements are determined by vl; masking by vm.", "example": "VNCLIP.WV v1, v4, v2, v0.t"}
{"mnemonic": "VNCLIPU.WI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Narrowing Clip Unsigned (Immediate)", "summary": "Shifts right (logical), rounds, and clips to unsigned destination. Used for pixel packing.", "syntax": "VNCLIPU.WI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "101110 | vm | vs2 | zimm5 | 011 | vd | 1010111", "hex_opcode": "0xB8003057", "visual_parts": [{"raw": "101110", "clean": "101110", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Narrow)"}, {"name": "vs2", "desc": "Src Vector (Wide)"}, {"name": "imm", "desc": "Shift Amount"}], "pseudocode": "foreach(i < vl): vd[i] = clip_u(round(vs2[i] >>u imm));", "description": "Performs a narrowing operation, halving the result element width relative to the source. Optionally saturates the result. Active elements are determined by vl; masking by vm.", "example": "VNCLIPU.WI v1, v4, 16, v0.t"}
{"mnemonic": "VFCVT.X.F.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float to Signed Integer Convert", "summary": "Converts floating-point elements to signed integers.", "syntax": "VFCVT.X.F.V vd, vs2, vm", "encoding": {"format": "OPFVV", "binary_pattern": "010010 | vm | vs2 | 00001001 | vd | 1010111", "hex_opcode": "0x48009057", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00001001", "clean": "00001001", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Int)"}, {"name": "vs2", "desc": "Src (Float)"}], "pseudocode": "foreach(i < vl): vd[i] = float_to_int(vs2[i]);", "description": "Converts vector elements between floating-point and integer types, or between floating-point precisions. Conversions respect the active rounding mode.", "example": "VFCVT.X.F.V v1, v4, v0.t"}
{"mnemonic": "VFCVT.F.X.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Signed Integer to Float Convert", "summary": "Converts signed integer elements to floating-point.", "syntax": "VFCVT.F.X.V vd, vs2, vm", "encoding": {"format": "OPFVV", "binary_pattern": "010010 | vm | vs2 | 00011001 | vd | 1010111", "hex_opcode": "0x48019057", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00011001", "clean": "00011001", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Float)"}, {"name": "vs2", "desc": "Src (Int)"}], "pseudocode": "foreach(i < vl): vd[i] = int_to_float(vs2[i]);", "description": "Converts vector elements between floating-point and integer types, or between floating-point precisions. Conversions respect the active rounding mode.", "example": "VFCVT.F.X.V v1, v4, v0.t"}
{"mnemonic": "VFWCVT.F.X.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Integer to Float Convert", "summary": "Converts N-bit integers to 2*N-bit floats (e.g., Int16 -> FP32).", "syntax": "VFWCVT.F.X.V vd, vs2, vm", "encoding": {"format": "OPFVV", "binary_pattern": "010010 | vm | vs2 | 01011001 | vd | 1010111", "hex_opcode": "0x48059057", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "01011001", "clean": "01011001", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Wide Float)"}, {"name": "vs2", "desc": "Src (Narrow Int)"}], "pseudocode": "foreach(i < vl): vd[i] = int_to_wide_float(vs2[i]);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VFWCVT.F.X.V v1, v4, v0.t"}
{"mnemonic": "VFNCVT.F.F.W", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Narrowing Float Convert", "summary": "Converts 2*N-bit floats to N-bit floats (e.g., FP32 -> FP16).", "syntax": "VFNCVT.F.F.W vd, vs2, vm", "encoding": {"format": "OPFVV", "binary_pattern": "010010 | vm | vs2 | 10100001 | vd | 1010111", "hex_opcode": "0x480A1057", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "10100001", "clean": "10100001", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Narrow Float)"}, {"name": "vs2", "desc": "Src (Wide Float)"}], "pseudocode": "foreach(i < vl): vd[i] = narrow_float(vs2[i]);", "description": "Converts vector elements between floating-point and integer types, or between floating-point precisions. Conversions respect the active rounding mode.", "example": "VFNCVT.F.F.W v1, v4, v0.t"}
{"mnemonic": "VFREC7.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Reciprocal Estimate 7-bit", "summary": "Computes an estimate of 1/x (7-bit precision). Used for fast division/normalization loops.", "syntax": "VFREC7.V vd, vs2, vm", "encoding": {"format": "OPFVV", "binary_pattern": "010011 | vm | vs2 | 00101001 | vd | 1010111", "hex_opcode": "0x4C029057", "visual_parts": [{"raw": "010011", "clean": "010011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00101001", "clean": "00101001", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source"}], "pseudocode": "foreach(i < vl): vd[i] = approx_reciprocal(vs2[i]);", "description": "Vector Float Reciprocal Estimate 7-bit: Computes an estimate of 1/x (7-bit precision). Used for fast division/normalization loops. Operation: foreach(i < vl): vd[i] = approx_reciprocal(vs2[i]);.", "example": "VFREC7.V v1, v4, v0.t"}
{"mnemonic": "VFRSQRT7.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Reciprocal Sqrt Estimate 7-bit", "summary": "Computes an estimate of 1/sqrt(x). Critical for vector normalization.", "syntax": "VFRSQRT7.V vd, vs2, vm", "encoding": {"format": "OPFVV", "binary_pattern": "010011 | vm | vs2 | 00100001 | vd | 1010111", "hex_opcode": "0x4C021057", "visual_parts": [{"raw": "010011", "clean": "010011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "00100001", "clean": "00100001", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source"}], "pseudocode": "foreach(i < vl): vd[i] = approx_rsqrt(vs2[i]);", "description": "Vector Float Reciprocal Sqrt Estimate 7-bit: Computes an estimate of 1/sqrt(x). Critical for vector normalization. Operation: foreach(i < vl): vd[i] = approx_rsqrt(vs2[i]);.", "example": "VFRSQRT7.V v1, v4, v0.t"}
{"mnemonic": "VMADC.VVM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Add with Carry (Produce Mask)", "summary": "Adds two vectors and a carry-in, producing the carry-out to the destination mask.", "syntax": "VMADC.VVM vd, vs2, vs1, v0", "encoding": {"format": "OPIVV", "binary_pattern": "0100010 | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x44000057", "visual_parts": [{"raw": "0100010", "clean": "0100010", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask (Carry Out)"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}, {"name": "v0", "desc": "Carry-In Mask"}], "pseudocode": "foreach(i < vl): vd[i] = carry_out(vs1[i] + vs2[i] + v0[i]);", "description": "Vector Add with Carry (Produce Mask): Adds two vectors and a carry-in, producing the carry-out to the destination mask. Operation: foreach(i < vl): vd[i] = carry_out(vs1[i] + vs2[i] + v0[i]);.", "example": "VMADC.VVM v1, v4, v2, v0"}
{"mnemonic": "VSBC.VVM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Subtract with Borrow", "summary": "Subtracts two vectors minus a borrow-in from the mask register.", "syntax": "VSBC.VVM vd, vs2, vs1, v0", "encoding": {"format": "OPIVV", "binary_pattern": "0100100 | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x48000057", "visual_parts": [{"raw": "0100100", "clean": "0100100", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}, {"name": "v0", "desc": "Borrow-In Mask"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] - vs2[i] - v0[i];", "description": "Vector Subtract with Borrow: Subtracts two vectors minus a borrow-in from the mask register. Operation: foreach(i < vl): vd[i] = vs1[i] - vs2[i] - v0[i];.", "example": "VSBC.VVM v1, v4, v2, v0"}
{"mnemonic": "VMACC.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Integer Multiply-Accumulate", "summary": "Computes vd = vd + (vs1 * vs2). Essential for dot products.", "syntax": "VMACC.VV vd, vs1, vs2, vm", "encoding": {"format": "OPIVV", "binary_pattern": "101101 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0xB4002057", "visual_parts": [{"raw": "101101", "clean": "101101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest/Accumulator"}, {"name": "vs1", "desc": "Source vector register 1"}, {"name": "vs2", "desc": "Source vector register 2"}], "pseudocode": "foreach(i < vl): vd[i] = vd[i] + (vs1[i] * vs2[i]);", "description": "Vector Integer Multiply-Accumulate: Computes vd = vd + (vs1 * vs2). Essential for dot products. Operation: foreach(i < vl): vd[i] = vd[i] + (vs1[i] * vs2[i]);.", "example": "VMACC.VV v1, v2, v4, v0.t"}
{"mnemonic": "VNMSUB.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Integer Negative Multiply-Subtract", "summary": "Computes vd = -(vd - (vs1 * vs2)).", "syntax": "VNMSUB.VV vd, vs1, vs2, vm", "encoding": {"format": "OPIVV", "binary_pattern": "101011 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0xAC002057", "visual_parts": [{"raw": "101011", "clean": "101011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest/Accumulator"}, {"name": "vs1", "desc": "Source vector register 1"}, {"name": "vs2", "desc": "Source vector register 2"}], "pseudocode": "foreach(i < vl): vd[i] = -(vd[i] - (vs1[i] * vs2[i]));", "description": "Performs a narrowing operation, halving the result element width relative to the source. Optionally saturates the result. Active elements are determined by vl; masking by vm.", "example": "VNMSUB.VV v1, v2, v4, v0.t"}
{"mnemonic": "VSMUL.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Single-Width Saturating Multiply", "summary": "Performs signed saturating multiplication, keeping the high half of the product (Fixed-point support).", "syntax": "VSMUL.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100111 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x9C000057", "visual_parts": [{"raw": "100111", "clean": "100111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (sext(vs1[i]) * sext(vs2[i])) >> (SEW-1);", "description": "Performs a vector mask register store of element-sized-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VSMUL.VV v1, v4, v2, v0.t"}
{"mnemonic": "VREDMAX.VS", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Reduction Maximum (Signed)", "summary": "Reduces a vector to a scalar by finding the maximum signed element.", "syntax": "VREDMAX.VS vd, vs2, vs1, vm", "encoding": {"format": "OPMVV", "binary_pattern": "000111 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x1C002057", "visual_parts": [{"raw": "000111", "clean": "000111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Scalar)"}, {"name": "vs2", "desc": "Src Vector"}, {"name": "vs1", "desc": "Start Scalar"}], "pseudocode": "vd[0] = max(vs1[0], max_element(vs2));", "description": "Performs a vector reduction: applies the operation across all active elements of vs2, using vs1[0] as the initial accumulator, and writes the scalar result to vd[0]. Active elements are determined by vl.", "example": "VREDMAX.VS v1, v4, v2, v0.t"}
{"mnemonic": "VREDMIN.VS", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Reduction Minimum (Signed)", "summary": "Reduces a vector to a scalar by finding the minimum signed element.", "syntax": "VREDMIN.VS vd, vs2, vs1, vm", "encoding": {"format": "OPMVV", "binary_pattern": "000101 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x14002057", "visual_parts": [{"raw": "000101", "clean": "000101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Scalar)"}, {"name": "vs2", "desc": "Src Vector"}, {"name": "vs1", "desc": "Start Scalar"}], "pseudocode": "vd[0] = min(vs1[0], min_element(vs2));", "description": "Performs a vector reduction: applies the operation across all active elements of vs2, using vs1[0] as the initial accumulator, and writes the scalar result to vd[0]. Active elements are determined by vl.", "example": "VREDMIN.VS v1, v4, v2, v0.t"}
{"mnemonic": "VREDAND.VS", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Reduction AND", "summary": "Reduces a vector to a scalar using bitwise AND.", "syntax": "VREDAND.VS vd, vs2, vs1, vm", "encoding": {"format": "OPMVV", "binary_pattern": "000001 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x04002057", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Scalar)"}, {"name": "vs2", "desc": "Src Vector"}, {"name": "vs1", "desc": "Start Scalar"}], "pseudocode": "vd[0] = vs1[0] & reduce_and(vs2);", "description": "Performs a vector reduction: applies the operation across all active elements of vs2, using vs1[0] as the initial accumulator, and writes the scalar result to vd[0]. Active elements are determined by vl.", "example": "VREDAND.VS v1, v4, v2, v0.t"}
{"mnemonic": "VREDOR.VS", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Reduction OR", "summary": "Reduces a vector to a scalar using bitwise OR.", "syntax": "VREDOR.VS vd, vs2, vs1, vm", "encoding": {"format": "OPMVV", "binary_pattern": "000010 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x08002057", "visual_parts": [{"raw": "000010", "clean": "000010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Scalar)"}, {"name": "vs2", "desc": "Src Vector"}, {"name": "vs1", "desc": "Start Scalar"}], "pseudocode": "vd[0] = vs1[0] | reduce_or(vs2);", "description": "Performs a vector reduction: applies the operation across all active elements of vs2, using vs1[0] as the initial accumulator, and writes the scalar result to vd[0]. Active elements are determined by vl.", "example": "VREDOR.VS v1, v4, v2, v0.t"}
{"mnemonic": "VFWADD.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Float Add", "summary": "Adds N-bit floats to produce 2*N-bit float results (e.g., FP16 + FP16 -> FP32).", "syntax": "VFWADD.VV vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "110000 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0xC0001057", "visual_parts": [{"raw": "110000", "clean": "110000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (2*SEW)"}, {"name": "vs2", "desc": "Src 2 (SEW)"}, {"name": "vs1", "desc": "Src 1 (SEW)"}], "pseudocode": "foreach(i < vl): vd[i] = extend(vs1[i]) + extend(vs2[i]);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VFWADD.VV v1, v4, v2, v0.t"}
{"mnemonic": "VFWMUL.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Float Multiply", "summary": "Multiplies N-bit floats to produce 2*N-bit float results.", "syntax": "VFWMUL.VV vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "111000 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0xE0001057", "visual_parts": [{"raw": "111000", "clean": "111000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (2*SEW)"}, {"name": "vs2", "desc": "Src 2 (SEW)"}, {"name": "vs1", "desc": "Src 1 (SEW)"}], "pseudocode": "foreach(i < vl): vd[i] = extend(vs1[i]) * extend(vs2[i]);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VFWMUL.VV v1, v4, v2, v0.t"}
{"mnemonic": "VFREDUSUM.VS", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Unordered Float Reduction Sum", "summary": "Reduces a float vector to a scalar by summing elements (Order not preserved, faster).", "syntax": "VFREDUSUM.VS vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "000001 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0x04001057", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Scalar)"}, {"name": "vs2", "desc": "Src Vector"}, {"name": "vs1", "desc": "Start Scalar"}], "pseudocode": "vd[0] = vs1[0] + sum(vs2[*]); // Non-deterministic order", "description": "Performs a vector reduction: applies the operation across all active elements of vs2, using vs1[0] as the initial accumulator, and writes the scalar result to vd[0]. Active elements are determined by vl.", "example": "VFREDUSUM.VS v1, v4, v2, v0.t"}
{"mnemonic": "VFREDMAX.VS", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Float Reduction Maximum", "summary": "Reduces a float vector to a scalar by finding the maximum element.", "syntax": "VFREDMAX.VS vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "000111 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0x1C001057", "visual_parts": [{"raw": "000111", "clean": "000111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Scalar)"}, {"name": "vs2", "desc": "Src Vector"}, {"name": "vs1", "desc": "Start Scalar"}], "pseudocode": "vd[0] = max(vs1[0], max_element(vs2));", "description": "Performs a vector reduction: applies the operation across all active elements of vs2, using vs1[0] as the initial accumulator, and writes the scalar result to vd[0]. Active elements are determined by vl.", "example": "VFREDMAX.VS v1, v4, v2, v0.t"}
{"mnemonic": "VMSBC.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Before First", "summary": "Writes a mask where bits are 1 before the first element in vs2 that is 1.", "syntax": "VMSBC.VV vd, vs2, vs1", "encoding": {"format": "OPMVV", "binary_pattern": "0100111 | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x4E000057", "visual_parts": [{"raw": "0100111", "clean": "0100111", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Src Mask"}], "pseudocode": "Sets mask bits to 1 up to (but not including) the first set bit in vs2.", "description": "Vector Mask Set Before First: Writes a mask where bits are 1 before the first element in vs2 that is 1. Operation: Sets mask bits to 1 up to (but not including) the first set bit in vs2..", "example": "VMSBC.VV v1, v4, v2"}
{"mnemonic": "CZERO.EQZ", "architecture": "RISC-V", "extension": "Zicond", "full_name": "Conditional Zero Equal to Zero", "summary": "Moves rs1 to rd if rs2 is non-zero, otherwise sets rd to zero.", "syntax": "CZERO.EQZ rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000111 | rs2 | rs1 | 101 | rd | 0110011", "hex_opcode": "0x0E005033", "visual_parts": [{"raw": "0000111", "clean": "0000111", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Condition"}], "pseudocode": "if (R[rs2] == 0) R[rd] = 0; else R[rd] = R[rs1];", "example": "CZERO.EQZ x10, x11, x12", "example_note": "If x12 is 0, x10=0. Else x10=x11.", "description": "CZERO.EQZ conditionally zeroes rd: it writes zero to rd if rs2 equals zero, otherwise writes the value of rs1 to rd. Useful for branch-free conditional selection."}
{"mnemonic": "CZERO.NEZ", "architecture": "RISC-V", "extension": "Zicond", "full_name": "Conditional Zero Not Equal to Zero", "summary": "Moves rs1 to rd if rs2 is zero, otherwise sets rd to zero.", "syntax": "CZERO.NEZ rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000111 | rs2 | rs1 | 111 | rd | 0110011", "hex_opcode": "0x0E007033", "visual_parts": [{"raw": "0000111", "clean": "0000111", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Condition"}], "pseudocode": "if (R[rs2] != 0) R[rd] = 0; else R[rd] = R[rs1];", "example": "CZERO.NEZ x10, x11, x12", "example_note": "If x12 != 0, x10=0. Else x10=x11.", "description": "CZERO.NEZ conditionally zeroes rd: it writes zero to rd if rs2 is non-zero, otherwise writes rs1 to rd. Useful for branch-free conditional selection."}
{"mnemonic": "PAUSE", "architecture": "RISC-V", "extension": "Zihintpause", "full_name": "Pause", "summary": "Hints that the current hart is in a spin-wait loop, allowing the hardware to reduce power consumption or yield resources.", "syntax": "PAUSE", "encoding": {"format": "I-Type (Hint)", "binary_pattern": "00000001000000000000000000001111", "hex_opcode": "0x0100000F", "visual_parts": [{"raw": "00000001000000000000000000001111", "clean": "00000001000000000000000000001111", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "// Implementation-defined delay/yield", "example": "PAUSE", "example_note": "Used inside spinlocks.", "description": "PAUSE is a hint instruction that may stall the pipeline for an implementation-defined short period. It is intended to reduce energy consumption in spin-wait loops."}
{"mnemonic": "CBO.CLEAN", "architecture": "RISC-V", "extension": "Zicbom", "full_name": "Cache Block Operation: Clean", "summary": "Performs a clean operation on the cache block containing the effective address.", "syntax": "CBO.CLEAN (rs1)", "encoding": {"format": "I-Type", "binary_pattern": "000000000001 | rs1 | 010000000001111", "hex_opcode": "0x0010200F", "visual_parts": [{"raw": "000000000001", "clean": "000000000001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010000000001111", "clean": "010000000001111", "pos": "14:0"}], "bit_positions": "31:20 | 19:15 | 14:0"}, "operands": [{"name": "rs1", "desc": "Address"}], "pseudocode": "CacheClean(R[rs1]);", "example": "CBO.CLEAN (x10)", "example_note": "Write back dirty data to memory.", "description": "CBO.CLEAN performs a clean operation on a cache block containing the effective address computed from rs1. It writes back the contents of the cache block to memory if dirty, but retains the block in the cache."}
{"mnemonic": "CBO.FLUSH", "architecture": "RISC-V", "extension": "Zicbom", "full_name": "Cache Block Operation: Flush", "summary": "Performs a flush (clean + invalidate) operation on the cache block.", "syntax": "CBO.FLUSH (rs1)", "encoding": {"format": "I-Type", "binary_pattern": "000000000010 | rs1 | 010000000001111", "hex_opcode": "0x0020200F", "visual_parts": [{"raw": "000000000010", "clean": "000000000010", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010000000001111", "clean": "010000000001111", "pos": "14:0"}], "bit_positions": "31:20 | 19:15 | 14:0"}, "operands": [{"name": "rs1", "desc": "Address"}], "pseudocode": "CacheFlush(R[rs1]);", "example": "CBO.FLUSH (x10)", "example_note": "Write back and invalidate.", "description": "CBO.FLUSH cleans and then invalidates the cache block containing the effective address. The block's contents are written back to memory if dirty, then the block is evicted from the cache."}
{"mnemonic": "CBO.INVAL", "architecture": "RISC-V", "extension": "Zicbom", "full_name": "Cache Block Operation: Invalidate", "summary": "Performs an invalidate operation on the cache block.", "syntax": "CBO.INVAL (rs1)", "encoding": {"format": "I-Type", "binary_pattern": "000000000000 | rs1 | 010000000001111", "hex_opcode": "0x0000200F", "visual_parts": [{"raw": "000000000000", "clean": "000000000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010000000001111", "clean": "010000000001111", "pos": "14:0"}], "bit_positions": "31:20 | 19:15 | 14:0"}, "operands": [{"name": "rs1", "desc": "Address"}], "pseudocode": "CacheInvalidate(R[rs1]);", "example": "CBO.INVAL (x10)", "example_note": "Discard cache line (data lost if dirty).", "description": "CBO.INVAL invalidates the cache block containing the effective address, removing it from the cache without writing back dirty data. This is a hint; the implementation may write back dirty data."}
{"mnemonic": "RDCYCLE", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Read Cycle Counter", "summary": "Reads the lower 32/64 bits of the cycle counter.", "syntax": "RDCYCLE rd", "encoding": {"format": "I-Type", "binary_pattern": "11000000000000000010 | rd | 1110011", "hex_opcode": "0xC0002073", "visual_parts": [{"raw": "11000000000000000010", "clean": "11000000000000000010", "pos": "31:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}], "pseudocode": "R[rd] = CSR[cycle];", "example": "RDCYCLE x10", "example_note": "Get cycle count for performance timing.", "description": "RDCYCLE reads the cycle CSR, which counts the number of clock cycles executed by the processor. It is an assembler pseudoinstruction for CSRRS rd, cycle, x0."}
{"mnemonic": "RDTIME", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Read Real-Time Clock", "summary": "Reads the lower 32/64 bits of the real-time clock.", "syntax": "RDTIME rd", "encoding": {"format": "I-Type", "binary_pattern": "11000000000100000010 | rd | 1110011", "hex_opcode": "0xC0102073", "visual_parts": [{"raw": "11000000000100000010", "clean": "11000000000100000010", "pos": "31:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}], "pseudocode": "R[rd] = CSR[time];", "example": "RDTIME x10", "example_note": "Get wall-clock time.", "description": "RDTIME reads the time CSR, which reflects the current value of the real-time counter. It is an assembler pseudoinstruction for CSRRS rd, time, x0."}
{"mnemonic": "RDINSTRET", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Read Instructions Retired", "summary": "Reads the count of instructions retired (completed).", "syntax": "RDINSTRET rd", "encoding": {"format": "I-Type", "binary_pattern": "11000000001000000010 | rd | 1110011", "hex_opcode": "0xC0202073", "visual_parts": [{"raw": "11000000001000000010", "clean": "11000000001000000010", "pos": "31:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}], "pseudocode": "R[rd] = CSR[instret];", "example": "RDINSTRET x10", "example_note": "Get instruction count.", "description": "RDINSTRET reads the instret CSR, which counts the number of instructions retired by the processor. It is an assembler pseudoinstruction for CSRRS rd, instret, x0."}
{"mnemonic": "NOP", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "No Operation", "summary": "Performs no operation. Used for alignment or timing delays.", "syntax": "NOP", "encoding": {"format": "I-Type", "binary_pattern": "00000000000000000000000000010011", "hex_opcode": "0x00000013", "visual_parts": [{"raw": "00000000000000000000000000010011", "clean": "00000000000000000000000000010011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "R[0] = R[0] + 0;", "example": "NOP", "example_note": "Does nothing.", "description": "NOP does not change any architecturally visible state except advancing the PC. It is canonically encoded as ADDI x0, x0, 0."}
{"mnemonic": "MV", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Move", "summary": "Copies the value of one register into another.", "syntax": "MV rd, rs", "encoding": {"format": "I-Type", "binary_pattern": "000000000000 | rs1 | 000 | rd | 0010011", "hex_opcode": "0x00000013", "visual_parts": [{"raw": "000000000000", "clean": "000000000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs", "desc": "Source"}], "pseudocode": "R[rd] = R[rs];", "example": "MV x10, x11", "example_note": "Copies x11 to x10.", "description": "MV copies the value of rs1 into rd. It is an assembler pseudoinstruction for ADDI rd, rs1, 0."}
{"mnemonic": "LI", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Load Immediate", "summary": "Loads an arbitrary immediate value into a register.", "syntax": "LI rd, imm", "encoding": {"format": "U-Type", "binary_pattern": "imm[31:12] | rd | 0110111", "hex_opcode": "0x00000013", "visual_parts": [{"raw": "imm[31:12]", "clean": "imm", "pos": "31:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110111", "clean": "0110111", "pos": "6:0"}], "bit_positions": "31:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "imm", "desc": "Immediate Value"}], "pseudocode": "R[rd] = imm;", "example": "LI x5, 0x12345", "example_note": "Expands to: LUI x5, 0x12; ADDI x5, x5, 0x345", "description": "LI loads an arbitrary immediate value into rd using one or two instructions (LUI+ADDI for 32-bit, or longer for 64-bit). It is an assembler pseudoinstruction."}
{"mnemonic": "RET", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Return", "summary": "Returns from a subroutine call.", "syntax": "RET", "encoding": {"format": "I-Type", "binary_pattern": "00000000000000001000000001100111", "hex_opcode": "0x00008067", "visual_parts": [{"raw": "00000000000000001000000001100111", "clean": "00000000000000001000000001100111", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "PC = R[1];", "example": "RET", "example_note": "Jumps to the address in the Return Address register (ra/x1).", "description": "RET returns from a subroutine by jumping to the address in x1 (ra). It is a pseudoinstruction for JALR x0, 0(x1)."}
{"mnemonic": "J", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Jump", "summary": "Unconditionally jumps to a target offset.", "syntax": "J offset", "encoding": {"format": "J-Type", "binary_pattern": "jimm20 | 000001101111", "hex_opcode": "0x0000006F", "visual_parts": [{"raw": "jimm20", "clean": "jimm20", "pos": "31:12"}, {"raw": "000001101111", "clean": "000001101111", "pos": "11:0"}], "bit_positions": "31:12 | 11:0"}, "operands": [{"name": "offset", "desc": "Jump Target"}], "pseudocode": "PC += sext(offset);", "example": "J label", "example_note": "Unconditional jump (discarding return address).", "description": "J performs an unconditional jump to a PC-relative offset. It is a pseudoinstruction for JAL x0, offset."}
{"mnemonic": "JR", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Jump Register", "summary": "Unconditionally jumps to an address held in a register.", "syntax": "JR rs", "encoding": {"format": "I-Type", "binary_pattern": "000000000000 | rs1 | 000000001100111", "hex_opcode": "0x00000067", "visual_parts": [{"raw": "000000000000", "clean": "000000000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000000001100111", "clean": "000000001100111", "pos": "14:0"}], "bit_positions": "31:20 | 19:15 | 14:0"}, "operands": [{"name": "rs", "desc": "Address Register"}], "pseudocode": "PC = R[rs];", "example": "JR x10", "example_note": "Jump to address stored in x10.", "description": "JR performs an unconditional indirect jump to the address in rs1. It is a pseudoinstruction for JALR x0, 0(rs1)."}
{"mnemonic": "CALL", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Call Subroutine", "summary": "Calls a function by jumping to an address and saving the return address.", "syntax": "CALL symbol", "encoding": {"format": "Pseudo", "binary_pattern": "AUIPC + JALR", "hex_opcode": "0x00000017", "visual_parts": [{"raw": "AUIPC + JALR", "clean": "AUIPC + JALR"}]}, "operands": [{"name": "symbol", "desc": "Function Name"}], "pseudocode": "x1 = PC + 4; PC = symbol;", "example": "CALL printf", "example_note": "Sets up x1 (ra) and jumps to printf.", "description": "CALL calls a far subroutine using a two-instruction AUIPC+JALR sequence, saving the return address in x1 (ra)."}
{"mnemonic": "NOT", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Bitwise NOT", "summary": "Computes the bitwise logical negation (one's complement).", "syntax": "NOT rd, rs", "encoding": {"format": "I-Type", "binary_pattern": "111111111111 | rs1 | 100 | rd | 0010011", "hex_opcode": "0xFFF04013", "visual_parts": [{"raw": "111111111111", "clean": "111111111111", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs", "desc": "Source"}], "pseudocode": "R[rd] = ~R[rs];", "example": "NOT x10, x11", "example_note": "Inverts all bits of x11.", "description": "NOT performs a bitwise logical NOT of rs1 and writes to rd. It is a pseudoinstruction for XORI rd, rs1, -1."}
{"mnemonic": "NEG", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Negate", "summary": "Computes the two's complement negation (arithmetic negative).", "syntax": "NEG rd, rs", "encoding": {"format": "R-Type", "binary_pattern": "010000000000 | rs1 | 000 | rd | 0110011", "hex_opcode": "0x40000033", "visual_parts": [{"raw": "010000000000", "clean": "010000000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs", "desc": "Source"}], "pseudocode": "R[rd] = 0 - R[rs];", "example": "NEG x5, x6", "example_note": "x5 = -x6", "description": "NEG negates rs1 and writes to rd. It is a pseudoinstruction for SUB rd, x0, rs1."}
{"mnemonic": "BEQZ", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Branch if Equal to Zero", "summary": "Branches if the register is zero.", "syntax": "BEQZ rs, offset", "encoding": {"format": "B-Type", "binary_pattern": "bimm12hi | 00000 | rs1 | 000 | bimm12lo | 1100011", "hex_opcode": "0x00000063", "visual_parts": [{"raw": "bimm12hi", "clean": "bimm12hi", "pos": "31:25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "bimm12lo", "clean": "bimm12lo", "pos": "11:7"}, {"raw": "1100011", "clean": "1100011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs", "desc": "Source"}, {"name": "offset", "desc": "Label"}], "pseudocode": "if (R[rs] == 0) PC += offset;", "example": "BEQZ x10, exit", "example_note": "Jump to exit if x10 is zero.", "description": "BEQZ branches to the target if rs1 equals zero. It is a pseudoinstruction for BEQ rs1, x0, offset."}
{"mnemonic": "BNEZ", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Branch if Not Equal to Zero", "summary": "Branches if the register is not zero.", "syntax": "BNEZ rs, offset", "encoding": {"format": "B-Type", "binary_pattern": "bimm12hi | 00000 | rs1 | 001 | bimm12lo | 1100011", "hex_opcode": "0x00001063", "visual_parts": [{"raw": "bimm12hi", "clean": "bimm12hi", "pos": "31:25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "bimm12lo", "clean": "bimm12lo", "pos": "11:7"}, {"raw": "1100011", "clean": "1100011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs", "desc": "Source"}, {"name": "offset", "desc": "Label"}], "pseudocode": "if (R[rs] != 0) PC += offset;", "example": "BNEZ x10, loop", "example_note": "Jump to loop if x10 is not zero.", "description": "BNEZ branches to the target if rs1 is non-zero. It is a pseudoinstruction for BNE rs1, x0, offset."}
{"mnemonic": "SEQZ", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Set if Equal to Zero", "summary": "Sets rd to 1 if rs is zero, otherwise 0.", "syntax": "SEQZ rd, rs", "encoding": {"format": "I-Type", "binary_pattern": "000000000001 | rs1 | 011 | rd | 0010011", "hex_opcode": "0x00103013", "visual_parts": [{"raw": "000000000001", "clean": "000000000001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs", "desc": "Source"}], "pseudocode": "R[rd] = (R[rs] == 0) ? 1 : 0;", "example": "SEQZ x5, x10", "example_note": "Sets x5 to 1 if x10 is 0.", "description": "SEQZ writes 1 to rd if rs1 equals zero, and 0 otherwise. It is a pseudoinstruction for SLTIU rd, rs1, 1."}
{"mnemonic": "SNEZ", "architecture": "RISC-V", "extension": "Pseudo", "full_name": "Set if Not Equal to Zero", "summary": "Sets rd to 1 if rs is not zero, otherwise 0.", "syntax": "SNEZ rd, rs", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | 00000011 | rd | 0110011", "hex_opcode": "0x00003033", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "00000011", "clean": "00000011", "pos": "19:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs", "desc": "Source"}], "pseudocode": "R[rd] = (R[rs] != 0) ? 1 : 0;", "example": "SNEZ x5, x10", "example_note": "Sets x5 to 1 if x10 is non-zero.", "description": "SNEZ writes 1 to rd if rs1 is non-zero, and 0 otherwise. It is a pseudoinstruction for SLTU rd, x0, rs1."}
{"mnemonic": "AES64ES", "architecture": "RISC-V", "extension": "Zkne", "full_name": "AES-64 Encryption Schedule", "summary": "Performs one round of AES-128 encryption key schedule generation.", "syntax": "AES64ES rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0011001 | rs2 | rs1 | 000 | rd | 0110011", "hex_opcode": "0x32000033", "visual_parts": [{"raw": "0011001", "clean": "0011001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = aes_encrypt_schedule(R[rs1], R[rs2]);", "example": "AES64ES x10, x11, x12", "example_note": "AES Key Gen.", "description": "AES64ES performs two phases of the AES forward SubBytes and ShiftRows transformation. Used in AES encryption."}
{"mnemonic": "AES64DS", "architecture": "RISC-V", "extension": "Zknd", "full_name": "AES-64 Decryption Schedule", "summary": "Performs one round of AES-128 decryption key schedule generation.", "syntax": "AES64DS rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0011101 | rs2 | rs1 | 000 | rd | 0110011", "hex_opcode": "0x3A000033", "visual_parts": [{"raw": "0011101", "clean": "0011101", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = aes_decrypt_schedule(R[rs1], R[rs2]);", "example": "AES64DS x10, x11, x12", "example_note": "AES Decrypt Key Gen.", "description": "AES64DS performs two phases of the AES block cipher inverse SubBytes and ShiftRows transformation on 64-bit halves of the round state. Used in AES decryption."}
{"mnemonic": "SHA256SIG0", "architecture": "RISC-V", "extension": "Zk", "full_name": "SHA-256 Sigma0", "summary": "Performs the Sigma0 transformation function for SHA-256.", "syntax": "SHA256SIG0 rd, rs1", "encoding": {"format": "I-Type", "binary_pattern": "000100000010 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x10201013", "visual_parts": [{"raw": "000100000010", "clean": "000100000010", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "R[rd] = ROTR(x, 7) ^ ROTR(x, 18) ^ (x >> 3);", "example": "SHA256SIG0 x10, x11", "example_note": "SHA-256 calculation.", "description": "SHA256SIG0 computes the sigma_0 mixing function for SHA-256, applying a combination of rotate-right and shift operations to rs1."}
{"mnemonic": "SHA256SUM0", "architecture": "RISC-V", "extension": "Zk", "full_name": "SHA-256 Sum0", "summary": "Performs the Sum0 transformation function for SHA-256.", "syntax": "SHA256SUM0 rd, rs1", "encoding": {"format": "I-Type", "binary_pattern": "000100000000 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x10001013", "visual_parts": [{"raw": "000100000000", "clean": "000100000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}], "pseudocode": "R[rd] = ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22);", "example": "SHA256SUM0 x10, x11", "example_note": "SHA-256 calculation.", "description": "SHA256SUM0 computes the sum-0 mixing function (Sigma-0 capital) for SHA-256 message scheduling."}
{"mnemonic": "FCVT.WU.S", "architecture": "RISC-V", "extension": "F", "full_name": "Convert Float to Unsigned Word", "summary": "Converts a single-precision float to a 32-bit unsigned integer.", "syntax": "FCVT.WU.S rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110000000001 | rs1 | rm | rd | 1010011", "hex_opcode": "0xC0100053", "visual_parts": [{"raw": "110000000001", "clean": "110000000001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (UInt)"}, {"name": "rs1", "desc": "Source (Float)"}], "pseudocode": "R[rd] = sext(f32_to_u32(F[rs1]));", "example": "FCVT.WU.S x10, f1", "example_note": "Float -> Unsigned Int.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.S.WU", "architecture": "RISC-V", "extension": "F", "full_name": "Convert Unsigned Word to Float", "summary": "Converts a 32-bit unsigned integer to a single-precision float.", "syntax": "FCVT.S.WU rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110100000001 | rs1 | rm | rd | 1010011", "hex_opcode": "0xD0100053", "visual_parts": [{"raw": "110100000001", "clean": "110100000001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Float)"}, {"name": "rs1", "desc": "Source (UInt)"}], "pseudocode": "F[rd] = u32_to_f32(R[rs1]);", "example": "FCVT.S.WU f1, x10", "example_note": "Unsigned Int -> Float.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.W.D", "architecture": "RISC-V", "extension": "D", "full_name": "Convert Double to Word", "summary": "Converts a double-precision float to a 32-bit signed integer.", "syntax": "FCVT.W.D rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110000100000 | rs1 | rm | rd | 1010011", "hex_opcode": "0xC2000053", "visual_parts": [{"raw": "110000100000", "clean": "110000100000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Int)"}, {"name": "rs1", "desc": "Source (Double)"}], "pseudocode": "R[rd] = sext(f64_to_i32(F[rs1]));", "example": "FCVT.W.D x10, f0", "example_note": "Double -> Int.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.D.W", "architecture": "RISC-V", "extension": "D", "full_name": "Convert Word to Double", "summary": "Converts a 32-bit signed integer to a double-precision float.", "syntax": "FCVT.D.W rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110100100000 | rs1 | rm | rd | 1010011", "hex_opcode": "0xD2000053", "visual_parts": [{"raw": "110100100000", "clean": "110100100000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Double)"}, {"name": "rs1", "desc": "Source (Int)"}], "pseudocode": "F[rd] = i32_to_f64(R[rs1]);", "example": "FCVT.D.W f0, x10", "example_note": "Int -> Double.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "SH1ADD", "architecture": "RISC-V", "extension": "Zba", "full_name": "Shift Left 1 and Add", "summary": "Shifts rs1 left by 1 and adds rs2. Used for calculating addresses of 16-bit elements.", "syntax": "SH1ADD rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010000 | rs2 | rs1 | 010 | rd | 0110011", "hex_opcode": "0x20002033", "visual_parts": [{"raw": "0010000", "clean": "0010000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Index"}, {"name": "rs2", "desc": "Base"}], "pseudocode": "R[rd] = R[rs2] + (R[rs1] << 1);", "example": "SH1ADD x10, x11, x12", "example_note": "Calculate address: x12 + (x11 * 2).", "description": "SH1ADD shifts rs1 left by 1 bit, then adds the result to rs2, writing to rd. Used for stride-1 array indexing (byte element + base)."}
{"mnemonic": "SH2ADD", "architecture": "RISC-V", "extension": "Zba", "full_name": "Shift Left 2 and Add", "summary": "Shifts rs1 left by 2 and adds rs2. Used for calculating addresses of 32-bit elements.", "syntax": "SH2ADD rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010000 | rs2 | rs1 | 100 | rd | 0110011", "hex_opcode": "0x20004033", "visual_parts": [{"raw": "0010000", "clean": "0010000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Index"}, {"name": "rs2", "desc": "Base"}], "pseudocode": "R[rd] = R[rs2] + (R[rs1] << 2);", "example": "SH2ADD x10, x11, x12", "example_note": "Calculate address: x12 + (x11 * 4).", "description": "SH2ADD shifts rs1 left by 2 bits, then adds to rs2, writing to rd. Used for stride-4 array indexing (e.g., int32 arrays)."}
{"mnemonic": "SH3ADD", "architecture": "RISC-V", "extension": "Zba", "full_name": "Shift Left 3 and Add", "summary": "Shifts rs1 left by 3 and adds rs2. Used for calculating addresses of 64-bit elements.", "syntax": "SH3ADD rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010000 | rs2 | rs1 | 110 | rd | 0110011", "hex_opcode": "0x20006033", "visual_parts": [{"raw": "0010000", "clean": "0010000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Index"}, {"name": "rs2", "desc": "Base"}], "pseudocode": "R[rd] = R[rs2] + (R[rs1] << 3);", "example": "SH3ADD x10, x11, x12", "example_note": "Calculate address: x12 + (x11 * 8).", "description": "SH3ADD shifts rs1 left by 3 bits, then adds to rs2, writing to rd. Used for stride-8 array indexing (e.g., int64 arrays)."}
{"mnemonic": "ADD.UW", "architecture": "RISC-V", "extension": "Zba", "full_name": "Add Unsigned Word", "summary": "Zero-extends the lower 32 bits of rs1 and adds it to rs2. Useful for 64-bit address calculations with 32-bit unsigned indices.", "syntax": "ADD.UW rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000100 | rs2 | rs1 | 000 | rd | 0111011", "hex_opcode": "0x0800003B", "visual_parts": [{"raw": "0000100", "clean": "0000100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0111011", "clean": "0111011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Index (32-bit)"}, {"name": "rs2", "desc": "Base"}], "pseudocode": "R[rd] = R[rs2] + zext(R[rs1][31:0]);", "example": "ADD.UW x10, x11, x12", "example_note": "x10 = x12 + (uint32_t)x11", "description": "ADD.UW zero-extends the lower 32 bits of rs1 to XLEN bits, adds the result to rs2, and writes to rd. Used for pointer arithmetic with zero-extended 32-bit offsets."}
{"mnemonic": "BSET", "architecture": "RISC-V", "extension": "Zbs", "full_name": "Bit Set", "summary": "Sets a single bit in rs1 at the index specified by rs2.", "syntax": "BSET rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010100 | rs2 | rs1 | 001 | rd | 0110011", "hex_opcode": "0x28001033", "visual_parts": [{"raw": "0010100", "clean": "0010100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Index"}], "pseudocode": "R[rd] = R[rs1] | (1 << (R[rs2] & (XLEN-1)));", "example": "BSET x10, x11, x12", "example_note": "Set the bit at index x12 in x11.", "description": "BSET sets the single bit of rs1 selected by the lower log2(XLEN) bits of rs2, writing the result to rd."}
{"mnemonic": "BSETI", "architecture": "RISC-V", "extension": "Zbs", "full_name": "Bit Set Immediate", "summary": "Sets a single bit in rs1 at the index specified by an immediate.", "syntax": "BSETI rd, rs1, imm", "encoding": {"format": "I-Type", "binary_pattern": "001010 | shamtd | rs1 | 001 | rd | 0010011", "hex_opcode": "0x28001013", "visual_parts": [{"raw": "001010", "clean": "001010", "pos": "31:26"}, {"raw": "shamtd", "clean": "shamtd", "pos": "25:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:26 | 25:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "imm", "desc": "Index"}], "pseudocode": "R[rd] = R[rs1] | (1 << imm);", "example": "BSETI x10, x11, 5", "example_note": "Set bit 5.", "description": "BSETI sets the single bit of rs1 selected by the immediate, writing the result to rd."}
{"mnemonic": "BCLR", "architecture": "RISC-V", "extension": "Zbs", "full_name": "Bit Clear", "summary": "Clears a single bit in rs1 at the index specified by rs2.", "syntax": "BCLR rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0100100 | rs2 | rs1 | 001 | rd | 0110011", "hex_opcode": "0x48001033", "visual_parts": [{"raw": "0100100", "clean": "0100100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Index"}], "pseudocode": "R[rd] = R[rs1] & ~(1 << (R[rs2] & (XLEN-1)));", "example": "BCLR x10, x11, x12", "example_note": "Clear the bit at index x12.", "description": "BCLR clears the single bit of rs1 selected by the lower log2(XLEN) bits of rs2, writing the result to rd."}
{"mnemonic": "BCLRI", "architecture": "RISC-V", "extension": "Zbs", "full_name": "Bit Clear Immediate", "summary": "Clears a single bit in rs1 at the index specified by an immediate.", "syntax": "BCLRI rd, rs1, imm", "encoding": {"format": "I-Type", "binary_pattern": "010010 | shamtd | rs1 | 001 | rd | 0010011", "hex_opcode": "0x48001013", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "shamtd", "clean": "shamtd", "pos": "25:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:26 | 25:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "imm", "desc": "Index"}], "pseudocode": "R[rd] = R[rs1] & ~(1 << imm);", "example": "BCLRI x10, x11, 3", "example_note": "Clear bit 3.", "description": "BCLRI clears the single bit of rs1 selected by the immediate, writing the result to rd."}
{"mnemonic": "BINV", "architecture": "RISC-V", "extension": "Zbs", "full_name": "Bit Invert", "summary": "Inverts (toggles) a single bit in rs1 at the index specified by rs2.", "syntax": "BINV rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0110100 | rs2 | rs1 | 001 | rd | 0110011", "hex_opcode": "0x68001033", "visual_parts": [{"raw": "0110100", "clean": "0110100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Index"}], "pseudocode": "R[rd] = R[rs1] ^ (1 << (R[rs2] & (XLEN-1)));", "example": "BINV x10, x11, x12", "example_note": "Toggle the bit at index x12.", "description": "BINV inverts the single bit of rs1 selected by the lower log2(XLEN) bits of rs2, writing the result to rd."}
{"mnemonic": "BINVI", "architecture": "RISC-V", "extension": "Zbs", "full_name": "Bit Invert Immediate", "summary": "Inverts (toggles) a single bit in rs1 at the index specified by an immediate.", "syntax": "BINVI rd, rs1, imm", "encoding": {"format": "I-Type", "binary_pattern": "011010 | shamtd | rs1 | 001 | rd | 0010011", "hex_opcode": "0x68001013", "visual_parts": [{"raw": "011010", "clean": "011010", "pos": "31:26"}, {"raw": "shamtd", "clean": "shamtd", "pos": "25:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:26 | 25:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "imm", "desc": "Index"}], "pseudocode": "R[rd] = R[rs1] ^ (1 << imm);", "example": "BINVI x10, x11, 7", "example_note": "Toggle bit 7.", "description": "BINVI inverts the single bit of rs1 selected by the immediate, writing the result to rd."}
{"mnemonic": "BEXT", "architecture": "RISC-V", "extension": "Zbs", "full_name": "Bit Extract", "summary": "Extracts the value of a single bit (0 or 1) at the index specified by rs2. The result is placed in the LSB of rd.", "syntax": "BEXT rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0100100 | rs2 | rs1 | 101 | rd | 0110011", "hex_opcode": "0x48005033", "visual_parts": [{"raw": "0100100", "clean": "0100100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (0 or 1)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Index"}], "pseudocode": "R[rd] = (R[rs1] >> (R[rs2] & (XLEN-1))) & 1;", "example": "BEXT x10, x11, x12", "example_note": "x10 = (x11 >> x12) & 1", "description": "BEXT extracts the single bit of rs1 selected by the lower log2(XLEN) bits of rs2, zero-extending to XLEN and writing to rd."}
{"mnemonic": "BEXTI", "architecture": "RISC-V", "extension": "Zbs", "full_name": "Bit Extract Immediate", "summary": "Extracts the value of a single bit (0 or 1) at the index specified by an immediate.", "syntax": "BEXTI rd, rs1, imm", "encoding": {"format": "I-Type", "binary_pattern": "010010 | shamtd | rs1 | 101 | rd | 0010011", "hex_opcode": "0x48005013", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "shamtd", "clean": "shamtd", "pos": "25:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:26 | 25:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (0 or 1)"}, {"name": "rs1", "desc": "Source"}, {"name": "imm", "desc": "Index"}], "pseudocode": "R[rd] = (R[rs1] >> imm) & 1;", "example": "BEXTI x10, x11, 31", "example_note": "Get sign bit (bit 31) of x11.", "description": "BEXTI extracts the single bit of rs1 selected by the immediate, zero-extending to XLEN and writing to rd."}
{"mnemonic": "CLMUL", "architecture": "RISC-V", "extension": "Zbc", "full_name": "Carry-less Multiply", "summary": "Performs carry-less multiplication of the lower bits of rs1 and rs2. Used for CRC and GCM (crypto).", "syntax": "CLMUL rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000101 | rs2 | rs1 | 001 | rd | 0110011", "hex_opcode": "0x0A001033", "visual_parts": [{"raw": "0000101", "clean": "0000101", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = clmul(R[rs1], R[rs2]);", "example": "CLMUL x10, x11, x12", "example_note": "Carry-less multiply (GF(2^n)).", "description": "CLMUL performs carry-less multiplication of rs1 and rs2, writing the lower XLEN bits of the carry-less product to rd. Used in GF(2^n) arithmetic and CRC computation."}
{"mnemonic": "VSADDU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Saturating Integer Add Unsigned", "summary": "Adds unsigned integers with saturation (clips to max instead of wrapping).", "syntax": "VSADDU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100000 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x80000057", "visual_parts": [{"raw": "100000", "clean": "100000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = saturate_u(vs1[i] + vs2[i]);", "description": "Performs element-wise unsigned saturating add on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VSADDU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VSSUBU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Saturating Integer Subtract Unsigned", "summary": "Subtracts unsigned integers with saturation (clips to 0 instead of wrapping).", "syntax": "VSSUBU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100010 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x88000057", "visual_parts": [{"raw": "100010", "clean": "100010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = saturate_u(vs1[i] - vs2[i]);", "description": "Performs element-wise unsigned saturating subtract on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VSSUBU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VAADDU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Averaging Add Unsigned", "summary": "Computes (a + b + 1) >> 1 for unsigned integers.", "syntax": "VAADDU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "001000 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x20002057", "visual_parts": [{"raw": "001000", "clean": "001000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (vs1[i] + vs2[i] + 1) >> 1;", "description": "Vector Averaging Add Unsigned: Computes (a + b + 1) >> 1 for unsigned integers. Operation: foreach(i < vl): vd[i] = (vs1[i] + vs2[i] + 1) >> 1;.", "example": "VAADDU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VASUB.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Averaging Subtract Signed", "summary": "Computes (a - b) >> 1 for signed integers.", "syntax": "VASUB.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "001011 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x2C002057", "visual_parts": [{"raw": "001011", "clean": "001011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (vs1[i] - vs2[i]) >> 1;", "description": "Vector Averaging Subtract Signed: Computes (a - b) >> 1 for signed integers. Operation: foreach(i < vl): vd[i] = (vs1[i] - vs2[i]) >> 1;.", "example": "VASUB.VV v1, v4, v2, v0.t"}
{"mnemonic": "VASUBU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Averaging Subtract Unsigned", "summary": "Computes (a - b) >> 1 for unsigned integers.", "syntax": "VASUBU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "001010 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x28002057", "visual_parts": [{"raw": "001010", "clean": "001010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (vs1[i] - vs2[i]) >> 1;", "description": "Vector Averaging Subtract Unsigned: Computes (a - b) >> 1 for unsigned integers. Operation: foreach(i < vl): vd[i] = (vs1[i] - vs2[i]) >> 1;.", "example": "VASUBU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VSSRA.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Saturating Shift Right Arithmetic", "summary": "Shifts right with sign extension and rounding/saturation logic.", "syntax": "VSSRA.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "101011 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0xAC000057", "visual_parts": [{"raw": "101011", "clean": "101011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = saturate(vs2[i] >>s vs1[i]);", "description": "Vector Saturating Shift Right Arithmetic: Shifts right with sign extension and rounding/saturation logic. Operation: foreach(i < vl): vd[i] = saturate(vs2[i] >>s vs1[i]);.", "example": "VSSRA.VV v1, v4, v2, v0.t"}
{"mnemonic": "VSSRL.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Saturating Shift Right Logical", "summary": "Shifts right with zero extension and rounding/saturation logic.", "syntax": "VSSRL.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "101010 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0xA8000057", "visual_parts": [{"raw": "101010", "clean": "101010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = saturate(vs2[i] >>u vs1[i]);", "description": "Vector Saturating Shift Right Logical: Shifts right with zero extension and rounding/saturation logic. Operation: foreach(i < vl): vd[i] = saturate(vs2[i] >>u vs1[i]);.", "example": "VSSRL.VV v1, v4, v2, v0.t"}
{"mnemonic": "VWREDSUM.VS", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Reduction Sum Signed", "summary": "Sums N-bit elements into a 2*N-bit scalar accumulator (Signed).", "syntax": "VWREDSUM.VS vd, vs2, vs1, vm", "encoding": {"format": "OPMVV", "binary_pattern": "110001 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0xC4000057", "visual_parts": [{"raw": "110001", "clean": "110001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Scalar Wide)"}, {"name": "vs2", "desc": "Vector (Narrow)"}, {"name": "vs1", "desc": "Start (Wide)"}], "pseudocode": "vd[0] = vs1[0] + sum(extend(vs2[*]));", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWREDSUM.VS v1, v4, v2, v0.t"}
{"mnemonic": "VWREDSUMU.VS", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Reduction Sum Unsigned", "summary": "Sums N-bit elements into a 2*N-bit scalar accumulator (Unsigned).", "syntax": "VWREDSUMU.VS vd, vs2, vs1, vm", "encoding": {"format": "OPMVV", "binary_pattern": "110000 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0xC0000057", "visual_parts": [{"raw": "110000", "clean": "110000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Scalar Wide)"}, {"name": "vs2", "desc": "Vector (Narrow)"}, {"name": "vs1", "desc": "Start (Wide)"}], "pseudocode": "vd[0] = vs1[0] + sum(zext(vs2[*]));", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWREDSUMU.VS v1, v4, v2, v0.t"}
{"mnemonic": "VMANDN.MM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask AND NOT", "summary": "Computes vd = vs1 & ~vs2 (mask operation).", "syntax": "VMANDN.MM vd, vs2, vs1", "encoding": {"format": "OPMVV", "binary_pattern": "0110001 | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x62002057", "visual_parts": [{"raw": "0110001", "clean": "0110001", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "vd = vs1 & ~vs2;", "description": "Performs element-wise mask AND on the mask registers vm1 and vm2, writing to vd.", "example": "VMANDN.MM v1, v4, v2"}
{"mnemonic": "VMORN.MM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask OR NOT", "summary": "Computes vd = vs1 | ~vs2 (mask operation).", "syntax": "VMORN.MM vd, vs2, vs1", "encoding": {"format": "OPMVV", "binary_pattern": "0111001 | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x72002057", "visual_parts": [{"raw": "0111001", "clean": "0111001", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "vd = vs1 | ~vs2;", "description": "Performs element-wise mask OR on the mask registers vm1 and vm2, writing to vd.", "example": "VMORN.MM v1, v4, v2"}
{"mnemonic": "VMXNOR.MM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask XNOR", "summary": "Computes vd = ~(vs1 ^ vs2) (mask operation).", "syntax": "VMXNOR.MM vd, vs2, vs1", "encoding": {"format": "OPMVV", "binary_pattern": "0111111 | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x7E002057", "visual_parts": [{"raw": "0111111", "clean": "0111111", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "vd = ~(vs1 ^ vs2);", "description": "Performs element-wise mask XNOR on the mask registers vm1 and vm2, writing to vd.", "example": "VMXNOR.MM v1, v4, v2"}
{"mnemonic": "MAXU", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Maximum Unsigned", "summary": "Computes the maximum of two unsigned integers.", "syntax": "MAXU rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000101 | rs2 | rs1 | 111 | rd | 0110011", "hex_opcode": "0x0A007033", "visual_parts": [{"raw": "0000101", "clean": "0000101", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = (R[rs1] >u R[rs2]) ? R[rs1] : R[rs2];", "description": "MAXU computes the unsigned maximum of rs1 and rs2, writing the result to rd.", "example": "MAXU t0, a0, a1"}
{"mnemonic": "MINU", "architecture": "RISC-V", "extension": "Zbb", "full_name": "Minimum Unsigned", "summary": "Computes the minimum of two unsigned integers.", "syntax": "MINU rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000101 | rs2 | rs1 | 101 | rd | 0110011", "hex_opcode": "0x0A005033", "visual_parts": [{"raw": "0000101", "clean": "0000101", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = (R[rs1] <u R[rs2]) ? R[rs1] : R[rs2];", "description": "MINU computes the unsigned minimum of rs1 and rs2, writing the result to rd.", "example": "MINU t0, a0, a1"}
{"mnemonic": "PACK", "architecture": "RISC-V", "extension": "Zbkb", "full_name": "Pack two words into a register", "summary": "Packs the lower halves of rs1 and rs2 into rd.", "syntax": "PACK rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000100 | rs2 | rs1 | 100 | rd | 0110011", "hex_opcode": "0x08004033", "visual_parts": [{"raw": "0000100", "clean": "0000100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Lower Half"}, {"name": "rs2", "desc": "Upper Half"}], "pseudocode": "R[rd] = (R[rs2] << XLEN/2) | (R[rs1] & ((1 << XLEN/2)-1));", "description": "Pack two words into a register: Packs the lower halves of rs1 and rs2 into rd. Operation: R[rd] = (R[rs2] << XLEN/2) | (R[rs1] & ((1 << XLEN/2)-1));.", "example": "PACK t0, a0, a1"}
{"mnemonic": "PACKH", "architecture": "RISC-V", "extension": "Zbkb", "full_name": "Pack Byte", "summary": "Packs the lower bytes of rs1 and rs2 into a 16-bit value.", "syntax": "PACKH rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000100 | rs2 | rs1 | 111 | rd | 0110011", "hex_opcode": "0x08007033", "visual_parts": [{"raw": "0000100", "clean": "0000100", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = (R[rs2] << 8) | (R[rs1] & 0xFF);", "description": "Pack Byte: Packs the lower bytes of rs1 and rs2 into a 16-bit value. Operation: R[rd] = (R[rs2] << 8) | (R[rs1] & 0xFF);.", "example": "PACKH t0, a0, a1"}
{"mnemonic": "HLV.WU", "architecture": "RISC-V", "extension": "H", "full_name": "Hypervisor Load Word Unsigned", "summary": "Loads a word from guest physical memory (unsigned).", "syntax": "HLV.WU rd, (rs1)", "encoding": {"format": "R-Type (System)", "binary_pattern": "011010000001 | rs1 | 100 | rd | 1110011", "hex_opcode": "0x68104073", "visual_parts": [{"raw": "011010000001", "clean": "011010000001", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Guest Addr"}], "pseudocode": "R[rd] = zext(GuestMem[rs1][31:0]);", "description": "HLV.WU performs a virtual-machine load of an unsigned word using VS-mode translation, zero-extending to 64 bits (RV64 only).", "example": "HLV.WU t0, a0"}
{"mnemonic": "HLV.D", "architecture": "RISC-V", "extension": "H", "full_name": "Hypervisor Load Double", "summary": "Loads a doubleword from guest physical memory.", "syntax": "HLV.D rd, (rs1)", "encoding": {"format": "R-Type (System)", "binary_pattern": "011011000000 | rs1 | 100 | rd | 1110011", "hex_opcode": "0x6C004073", "visual_parts": [{"raw": "011011000000", "clean": "011011000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Guest Addr"}], "pseudocode": "R[rd] = GuestMem[rs1][63:0];", "description": "HLV.D performs a virtual-machine load of a doubleword using VS-mode translation (RV64 only).", "example": "HLV.D t0, a0"}
{"mnemonic": "HSV.D", "architecture": "RISC-V", "extension": "H", "full_name": "Hypervisor Store Double", "summary": "Stores a doubleword to guest physical memory.", "syntax": "HSV.D rs2, (rs1)", "encoding": {"format": "R-Type (System)", "binary_pattern": "0110111 | rs2 | rs1 | 100000001110011", "hex_opcode": "0x6E004073", "visual_parts": [{"raw": "0110111", "clean": "0110111", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100000001110011", "clean": "100000001110011", "pos": "14:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:0"}, "operands": [{"name": "rs2", "desc": "Source"}, {"name": "rs1", "desc": "Guest Addr"}], "pseudocode": "GuestMem[rs1][63:0] = R[rs2];", "description": "HSV.D stores the doubleword in rs2 to the VS-mode virtual address in rs1 (RV64 only).", "example": "HSV.D a1, a0"}
{"mnemonic": "VLOXEI32.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load Ordered Indexed (32-bit indices)", "summary": "Loads elements using indices, ensuring order (useful for I/O buffers).", "syntax": "VLOXEI32.V vd, (rs1), vs2, vm", "encoding": {"format": "VL-Type", "binary_pattern": "000011 | vm | vs2 | rs1 | 110 | vd | 0000111", "hex_opcode": "0x0C006007", "visual_parts": [{"raw": "000011", "clean": "000011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Indices"}], "pseudocode": "Ordered_Load(vd, rs1, vs2);", "description": "Performs a vector indexed ordered load of 32-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLOXEI32.V v1, a0, v4, v0.t"}
{"mnemonic": "VSOXEI32.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Store Ordered Indexed (32-bit indices)", "summary": "Stores elements using indices, ensuring order.", "syntax": "VSOXEI32.V vs3, (rs1), vs2, vm", "encoding": {"format": "VS-Type", "binary_pattern": "000011 | vm | vs2 | rs1 | 110 | vs3 | 0100111", "hex_opcode": "0x0C006027", "visual_parts": [{"raw": "000011", "clean": "000011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vs3", "clean": "vs3", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vs3", "desc": "Source"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Indices"}], "pseudocode": "Ordered_Store(vs3, rs1, vs2);", "description": "Performs a vector indexed ordered store of 32-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VSOXEI32.V v6, a0, v4, v0.t"}
{"mnemonic": "VMULH.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Multiply High Signed", "summary": "Multiplies signed integers and keeps the high N bits.", "syntax": "VMULH.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100111 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x9C002057", "visual_parts": [{"raw": "100111", "clean": "100111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (sext(vs1[i]) * sext(vs2[i])) >> SEW;", "description": "Performs element-wise high-half multiply signed on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VMULH.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMULHU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Multiply High Unsigned", "summary": "Multiplies unsigned integers and keeps the high N bits.", "syntax": "VMULHU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100100 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x90002057", "visual_parts": [{"raw": "100100", "clean": "100100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "foreach(i < vl): vd[i] = (zext(vs1[i]) * zext(vs2[i])) >> SEW;", "description": "Performs element-wise high-half multiply unsigned on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VMULHU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VDIV.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Integer Divide Signed", "summary": "Divides signed vector elements.", "syntax": "VDIV.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100001 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x84002057", "visual_parts": [{"raw": "100001", "clean": "100001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Divisor"}, {"name": "vs1", "desc": "Dividend"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] / vs2[i];", "description": "Performs element-wise signed integer division on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VDIV.VV v1, v4, v2, v0.t"}
{"mnemonic": "VDIVU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Integer Divide Unsigned", "summary": "Divides unsigned vector elements.", "syntax": "VDIVU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100000 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x80002057", "visual_parts": [{"raw": "100000", "clean": "100000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Divisor"}, {"name": "vs1", "desc": "Dividend"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] /u vs2[i];", "description": "Performs element-wise unsigned integer division on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VDIVU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VREM.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Remainder Signed", "summary": "Computes signed remainder.", "syntax": "VREM.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100011 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x8C002057", "visual_parts": [{"raw": "100011", "clean": "100011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Divisor"}, {"name": "vs1", "desc": "Dividend"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] % vs2[i];", "description": "Performs element-wise signed remainder on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VREM.VV v1, v4, v2, v0.t"}
{"mnemonic": "VREMU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Remainder Unsigned", "summary": "Computes unsigned remainder.", "syntax": "VREMU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "100010 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0x88002057", "visual_parts": [{"raw": "100010", "clean": "100010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Divisor"}, {"name": "vs1", "desc": "Dividend"}], "pseudocode": "foreach(i < vl): vd[i] = vs1[i] %u vs2[i];", "description": "Performs element-wise unsigned remainder on two vector registers, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VREMU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VWMACC.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Multiply-Accumulate", "summary": "Computes vd = vd + (vs1 * vs2) with widening (N*N -> 2N + 2N).", "syntax": "VWMACC.VV vd, vs1, vs2, vm", "encoding": {"format": "OPIVV", "binary_pattern": "111101 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0xF4002057", "visual_parts": [{"raw": "111101", "clean": "111101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest/Acc (2*SEW)"}, {"name": "vs1", "desc": "Src 1 (SEW)"}, {"name": "vs2", "desc": "Src 2 (SEW)"}], "pseudocode": "foreach(i < vl): vd[i] = vd[i] + (sext(vs1[i]) * sext(vs2[i]));", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWMACC.VV v1, v2, v4, v0.t"}
{"mnemonic": "VWMACCU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Multiply-Accumulate Unsigned", "summary": "Computes vd = vd + (vs1 * vs2) widening unsigned.", "syntax": "VWMACCU.VV vd, vs1, vs2, vm", "encoding": {"format": "OPIVV", "binary_pattern": "111100 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0xF0002057", "visual_parts": [{"raw": "111100", "clean": "111100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest/Acc (2*SEW)"}, {"name": "vs1", "desc": "Src 1 (SEW)"}, {"name": "vs2", "desc": "Src 2 (SEW)"}], "pseudocode": "foreach(i < vl): vd[i] = vd[i] + (zext(vs1[i]) * zext(vs2[i]));", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWMACCU.VV v1, v2, v4, v0.t"}
{"mnemonic": "VIOTA.M", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Iota", "summary": "Writes the index of the active element to the destination. Useful for parallel prefix sums.", "syntax": "VIOTA.M vd, vs2, vm", "encoding": {"format": "OPMVV", "binary_pattern": "010100 | vm | vs2 | 10000010 | vd | 1010111", "hex_opcode": "0x50082057", "visual_parts": [{"raw": "010100", "clean": "010100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "10000010", "clean": "10000010", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Mask Src"}], "pseudocode": "count = 0; foreach(i < vl): if vm[i]: vd[i] = count++;", "description": "Writes to each element of vd the sum of set mask bits in vs2 at positions less than the current element index.", "example": "VIOTA.M v1, v4, v0.t"}
{"mnemonic": "VID.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Element Index", "summary": "Writes the element index (0, 1, 2...) to the destination.", "syntax": "VID.V vd, vm", "encoding": {"format": "OPMVV", "binary_pattern": "010100 | vm | 0000010001010 | vd | 1010111", "hex_opcode": "0x5008A057", "visual_parts": [{"raw": "010100", "clean": "010100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "0000010001010", "clean": "0000010001010", "pos": "24:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}], "pseudocode": "foreach(i < vl): vd[i] = i;", "description": "Writes the element index (0, 1, 2, …, vl-1) to each active element of vd.", "example": "VID.V v1, v0.t"}
{"mnemonic": "VFWCVT.F.F.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Float to Float Convert", "summary": "Converts N-bit floats to 2*N-bit floats (e.g., FP16 -> FP32).", "syntax": "VFWCVT.F.F.V vd, vs2, vm", "encoding": {"format": "OPFVV", "binary_pattern": "010010 | vm | vs2 | 01100001 | vd | 1010111", "hex_opcode": "0x48061057", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "01100001", "clean": "01100001", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Wide)"}, {"name": "vs2", "desc": "Src (Narrow)"}], "pseudocode": "foreach(i < vl): vd[i] = convert_w(vs2[i]);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VFWCVT.F.F.V v1, v4, v0.t"}
{"mnemonic": "VFWCVT.X.F.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Float to Signed Int", "summary": "Converts N-bit float to 2*N-bit signed integer.", "syntax": "VFWCVT.X.F.V vd, vs2, vm", "encoding": {"format": "OPFVV", "binary_pattern": "010010 | vm | vs2 | 01001001 | vd | 1010111", "hex_opcode": "0x48049057", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "01001001", "clean": "01001001", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Wide Int)"}, {"name": "vs2", "desc": "Src (Float)"}], "pseudocode": "foreach(i < vl): vd[i] = f_to_x_w(vs2[i]);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VFWCVT.X.F.V v1, v4, v0.t"}
{"mnemonic": "VFNCVT.X.F.W", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Narrowing Float to Signed Int", "summary": "Converts 2*N-bit float to N-bit signed integer.", "syntax": "VFNCVT.X.F.W vd, vs2, vm", "encoding": {"format": "OPFVV", "binary_pattern": "010010 | vm | vs2 | 10001001 | vd | 1010111", "hex_opcode": "0x48089057", "visual_parts": [{"raw": "010010", "clean": "010010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "10001001", "clean": "10001001", "pos": "19:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Int)"}, {"name": "vs2", "desc": "Src (Wide Float)"}], "pseudocode": "foreach(i < vl): vd[i] = f_to_x_n(vs2[i]);", "description": "Converts vector elements between floating-point and integer types, or between floating-point precisions. Conversions respect the active rounding mode.", "example": "VFNCVT.X.F.W v1, v4, v0.t"}
{"mnemonic": "VNSRL.WI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Narrowing Shift Right Logical Immediate", "summary": "Shifts wide elements right by immediate and narrows.", "syntax": "VNSRL.WI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "101100 | vm | vs2 | zimm5 | 011 | vd | 1010111", "hex_opcode": "0xB0003057", "visual_parts": [{"raw": "101100", "clean": "101100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Narrow)"}, {"name": "vs2", "desc": "Src (Wide)"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "foreach(i < vl): vd[i] = (vs2[i] >>u imm) & Mask;", "description": "Performs a narrowing operation, halving the result element width relative to the source. Optionally saturates the result. Active elements are determined by vl; masking by vm.", "example": "VNSRL.WI v1, v4, 16, v0.t"}
{"mnemonic": "VNSRA.WI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Narrowing Shift Right Arithmetic Immediate", "summary": "Shifts wide elements right (arithmetic) by immediate and narrows.", "syntax": "VNSRA.WI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "101101 | vm | vs2 | zimm5 | 011 | vd | 1010111", "hex_opcode": "0xB4003057", "visual_parts": [{"raw": "101101", "clean": "101101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Narrow)"}, {"name": "vs2", "desc": "Src (Wide)"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "foreach(i < vl): vd[i] = (vs2[i] >>s imm) & Mask;", "description": "Performs a narrowing operation, halving the result element width relative to the source. Optionally saturates the result. Active elements are determined by vl; masking by vm.", "example": "VNSRA.WI v1, v4, 16, v0.t"}
{"mnemonic": "FCLASS.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Classify (Single)", "summary": "Examines the value in a float register and generates a 10-bit bitmask indicating its class (NaN, Inf, Zero, Normal, etc.).", "syntax": "FCLASS.S rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "111000000000 | rs1 | 001 | rd | 1010011", "hex_opcode": "0xE0001053", "visual_parts": [{"raw": "111000000000", "clean": "111000000000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Integer Mask)"}, {"name": "rs1", "desc": "Source (Float)"}], "pseudocode": "R[rd] = classify_float(F[rs1]);", "example": "FCLASS.S x10, f1", "example_note": "Check if f1 is NaN, Infinity, or Zero.", "description": "Classifies the single-precision (32-bit) floating-point value in rs1, writing a 10-bit one-hot result to integer rd. Bits represent: negative infinity, negative normal, negative subnormal, negative zero, positive zero, positive subnormal, positive normal, positive infinity, signalling NaN, quiet NaN."}
{"mnemonic": "FCLASS.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Classify (Double)", "summary": "Examines a double-precision register and generates a classification bitmask.", "syntax": "FCLASS.D rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "111000100000 | rs1 | 001 | rd | 1010011", "hex_opcode": "0xE2001053", "visual_parts": [{"raw": "111000100000", "clean": "111000100000", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Integer Mask)"}, {"name": "rs1", "desc": "Source (Double)"}], "pseudocode": "R[rd] = classify_double(F[rs1]);", "example": "FCLASS.D x10, f0", "example_note": "Check if f0 is NaN/Inf/Zero.", "description": "Classifies the double-precision (64-bit) floating-point value in rs1, writing a 10-bit one-hot result to integer rd. Bits represent: negative infinity, negative normal, negative subnormal, negative zero, positive zero, positive subnormal, positive normal, positive infinity, signalling NaN, quiet NaN."}
{"mnemonic": "FCVT.S.L", "architecture": "RISC-V", "extension": "F", "full_name": "Convert Long to Float", "summary": "Converts a 64-bit signed integer (Long) to a single-precision float.", "syntax": "FCVT.S.L rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110100000010 | rs1 | rm | rd | 1010011", "hex_opcode": "0xD0200053", "visual_parts": [{"raw": "110100000010", "clean": "110100000010", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Float)"}, {"name": "rs1", "desc": "Source (Long Int)"}], "pseudocode": "F[rd] = i64_to_f32(R[rs1]);", "example": "FCVT.S.L f1, x10", "example_note": "64-bit int -> 32-bit float.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.S.LU", "architecture": "RISC-V", "extension": "F", "full_name": "Convert Unsigned Long to Float", "summary": "Converts a 64-bit unsigned integer to a single-precision float.", "syntax": "FCVT.S.LU rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110100000011 | rs1 | rm | rd | 1010011", "hex_opcode": "0xD0300053", "visual_parts": [{"raw": "110100000011", "clean": "110100000011", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Float)"}, {"name": "rs1", "desc": "Source (U-Long)"}], "pseudocode": "F[rd] = u64_to_f32(R[rs1]);", "example": "FCVT.S.LU f1, x10", "example_note": "Unsigned 64-bit int -> float.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.L.S", "architecture": "RISC-V", "extension": "F", "full_name": "Convert Float to Long", "summary": "Converts a single-precision float to a 64-bit signed integer.", "syntax": "FCVT.L.S rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110000000010 | rs1 | rm | rd | 1010011", "hex_opcode": "0xC0200053", "visual_parts": [{"raw": "110000000010", "clean": "110000000010", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Long Int)"}, {"name": "rs1", "desc": "Source (Float)"}], "pseudocode": "R[rd] = f32_to_i64(F[rs1]);", "example": "FCVT.L.S x10, f1", "example_note": "Float -> 64-bit signed int.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.LU.S", "architecture": "RISC-V", "extension": "F", "full_name": "Convert Float to Unsigned Long", "summary": "Converts a single-precision float to a 64-bit unsigned integer.", "syntax": "FCVT.LU.S rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110000000011 | rs1 | rm | rd | 1010011", "hex_opcode": "0xC0300053", "visual_parts": [{"raw": "110000000011", "clean": "110000000011", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (U-Long)"}, {"name": "rs1", "desc": "Source (Float)"}], "pseudocode": "R[rd] = f32_to_u64(F[rs1]);", "example": "FCVT.LU.S x10, f1", "example_note": "Float -> 64-bit unsigned int.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.D.L", "architecture": "RISC-V", "extension": "D", "full_name": "Convert Long to Double", "summary": "Converts a 64-bit signed integer to a double-precision float.", "syntax": "FCVT.D.L rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110100100010 | rs1 | rm | rd | 1010011", "hex_opcode": "0xD2200053", "visual_parts": [{"raw": "110100100010", "clean": "110100100010", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Double)"}, {"name": "rs1", "desc": "Source (Long)"}], "pseudocode": "F[rd] = i64_to_f64(R[rs1]);", "example": "FCVT.D.L f0, x10", "example_note": "64-bit Int -> Double.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.D.LU", "architecture": "RISC-V", "extension": "D", "full_name": "Convert Unsigned Long to Double", "summary": "Converts a 64-bit unsigned integer to a double-precision float.", "syntax": "FCVT.D.LU rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110100100011 | rs1 | rm | rd | 1010011", "hex_opcode": "0xD2300053", "visual_parts": [{"raw": "110100100011", "clean": "110100100011", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Double)"}, {"name": "rs1", "desc": "Source (U-Long)"}], "pseudocode": "F[rd] = u64_to_f64(R[rs1]);", "example": "FCVT.D.LU f0, x10", "example_note": "Unsigned 64-bit Int -> Double.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FCVT.L.D", "architecture": "RISC-V", "extension": "D", "full_name": "Convert Double to Long", "summary": "Converts a double-precision float to a 64-bit signed integer.", "syntax": "FCVT.L.D rd, rs1", "encoding": {"format": "I-Type (Float)", "binary_pattern": "110000100010 | rs1 | rm | rd | 1010011", "hex_opcode": "0xC2200053", "visual_parts": [{"raw": "110000100010", "clean": "110000100010", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Long)"}, {"name": "rs1", "desc": "Source (Double)"}], "pseudocode": "R[rd] = f64_to_i64(F[rs1]);", "example": "FCVT.L.D x10, f0", "example_note": "Double -> 64-bit Int.", "description": "Converts between floating-point types or between floating-point and integer. Result is rounded according to the dynamic rounding mode. Invalid conversions produce the IEEE default NaN or the appropriate integer saturation value."}
{"mnemonic": "FSGNJ.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Sign Injection (Double)", "summary": "Injects the sign of rs2 into rs1 (Double Precision).", "syntax": "FSGNJ.D rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010001 | rs2 | rs1 | 000 | rd | 1010011", "hex_opcode": "0x22000053", "visual_parts": [{"raw": "0010001", "clean": "0010001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source (Body)"}, {"name": "rs2", "desc": "Source (Sign)"}], "pseudocode": "F[rd] = {F[rs2][63], F[rs1][62:0]};", "example": "FSGNJ.D f0, f1, f2", "example_note": "Copy sign of f2 to f1.", "description": "Produces a result with the magnitude of rs1 and the sign bit taken from the source rs2. Used to implement floating-point absolute value, negate, and copy-sign."}
{"mnemonic": "FSGNJN.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Sign Injection Negate (Double)", "summary": "Injects the *negated* sign of rs2 into rs1 (Double Precision).", "syntax": "FSGNJN.D rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010001 | rs2 | rs1 | 001 | rd | 1010011", "hex_opcode": "0x22001053", "visual_parts": [{"raw": "0010001", "clean": "0010001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source (Body)"}, {"name": "rs2", "desc": "Source (Sign)"}], "pseudocode": "F[rd] = {~F[rs2][63], F[rs1][62:0]};", "example": "FSGNJN.D f0, f1, f1", "example_note": "Negate f1 (f0 = -f1).", "description": "Produces a result with the magnitude of rs1 and the sign bit taken from the source rs2. Used to implement floating-point absolute value, negate, and copy-sign."}
{"mnemonic": "FEQ.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Equal (Double)", "summary": "Sets integer rd to 1 if double rs1 equals double rs2, else 0.", "syntax": "FEQ.D rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "1010001 | rs2 | rs1 | 010 | rd | 1010011", "hex_opcode": "0xA2002053", "visual_parts": [{"raw": "1010001", "clean": "1010001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Int)"}, {"name": "rs1", "desc": "Src 1 (Double)"}, {"name": "rs2", "desc": "Src 2 (Double)"}], "pseudocode": "R[rd] = (F[rs1] == F[rs2]) ? 1 : 0;", "example": "FEQ.D x10, f0, f1", "example_note": "Compare equality.", "description": "Performs a double-precision (64-bit) floating-point equality comparison and writes 1 (true) or 0 (false) to integer rd. NaN inputs produce 0 (unordered), except FEQ which raises invalid-operation if either operand is a signalling NaN."}
{"mnemonic": "FLT.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Less Than (Double)", "summary": "Sets integer rd to 1 if double rs1 is less than double rs2, else 0.", "syntax": "FLT.D rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "1010001 | rs2 | rs1 | 001 | rd | 1010011", "hex_opcode": "0xA2001053", "visual_parts": [{"raw": "1010001", "clean": "1010001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Int)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = (F[rs1] < F[rs2]) ? 1 : 0;", "example": "FLT.D x10, f0, f1", "example_note": "Less than check.", "description": "Performs a double-precision (64-bit) floating-point less-than comparison and writes 1 (true) or 0 (false) to integer rd. NaN inputs produce 0 (unordered), except FEQ which raises invalid-operation if either operand is a signalling NaN."}
{"mnemonic": "FLE.D", "architecture": "RISC-V", "extension": "D", "full_name": "Float Less or Equal (Double)", "summary": "Sets integer rd to 1 if double rs1 is less than or equal to double rs2, else 0.", "syntax": "FLE.D rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "1010001 | rs2 | rs1 | 000 | rd | 1010011", "hex_opcode": "0xA2000053", "visual_parts": [{"raw": "1010001", "clean": "1010001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Int)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = (F[rs1] <= F[rs2]) ? 1 : 0;", "example": "FLE.D x10, f0, f1", "example_note": "Less equal check.", "description": "Performs a double-precision (64-bit) floating-point less-than-or-equal comparison and writes 1 (true) or 0 (false) to integer rd. NaN inputs produce 0 (unordered), except FEQ which raises invalid-operation if either operand is a signalling NaN."}
{"mnemonic": "VLSEG3E8.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load Segment (3 fields, 8-bit)", "summary": "Loads 3 fields (e.g., RGB) of 8-bit elements into 3 vector registers.", "syntax": "VLSEG3E8.V vd, (rs1), vm", "encoding": {"format": "VL-Type", "binary_pattern": "010000 | vm | 00000 | rs1 | 000 | vd | 0000111", "hex_opcode": "0x40000007", "visual_parts": [{"raw": "010000", "clean": "010000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Group (3 regs)"}, {"name": "rs1", "desc": "Base Addr"}], "pseudocode": "Load 3 interleaved 8-bit streams into 3 vector registers.", "description": "Performs a vector strided load of 3-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLSEG3E8.V v1, a0, v0.t"}
{"mnemonic": "VSSEG3E8.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Store Segment (3 fields, 8-bit)", "summary": "Stores 3 vector registers (e.g., RGB) into memory as interleaved 8-bit fields.", "syntax": "VSSEG3E8.V vs3, (rs1), vm", "encoding": {"format": "VS-Type", "binary_pattern": "010000 | vm | 00000 | rs1 | 000 | vs3 | 0100111", "hex_opcode": "0x40000027", "visual_parts": [{"raw": "010000", "clean": "010000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vs3", "clean": "vs3", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vs3", "desc": "Src Group (3 regs)"}, {"name": "rs1", "desc": "Base Addr"}], "pseudocode": "Store 3 vector registers as interleaved 8-bit fields.", "description": "Performs a vector strided store of 3-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VSSEG3E8.V v6, a0, v0.t"}
{"mnemonic": "VLSEG4E8.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load Segment (4 fields, 8-bit)", "summary": "Loads 4 fields (e.g., RGBA) of 8-bit elements into 4 vector registers.", "syntax": "VLSEG4E8.V vd, (rs1), vm", "encoding": {"format": "VL-Type", "binary_pattern": "011000 | vm | 00000 | rs1 | 000 | vd | 0000111", "hex_opcode": "0x60000007", "visual_parts": [{"raw": "011000", "clean": "011000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Group (4 regs)"}, {"name": "rs1", "desc": "Base Addr"}], "pseudocode": "Load 4 interleaved 8-bit streams into 4 vector registers.", "description": "Performs a vector strided load of 4-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLSEG4E8.V v1, a0, v0.t"}
{"mnemonic": "VSSEG4E8.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Store Segment (4 fields, 8-bit)", "summary": "Stores 4 vector registers (e.g., RGBA) into memory as interleaved 8-bit fields.", "syntax": "VSSEG4E8.V vs3, (rs1), vm", "encoding": {"format": "VS-Type", "binary_pattern": "011000 | vm | 00000 | rs1 | 000 | vs3 | 0100111", "hex_opcode": "0x60000027", "visual_parts": [{"raw": "011000", "clean": "011000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vs3", "clean": "vs3", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vs3", "desc": "Src Group (4 regs)"}, {"name": "rs1", "desc": "Base Addr"}], "pseudocode": "Store 4 vector registers as interleaved 8-bit fields.", "description": "Performs a vector strided store of 4-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VSSEG4E8.V v6, a0, v0.t"}
{"mnemonic": "VLSEG2E16.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load Segment (2 fields, 16-bit)", "summary": "Loads 2 fields (e.g., Complex Real/Imag) of 16-bit elements.", "syntax": "VLSEG2E16.V vd, (rs1), vm", "encoding": {"format": "VL-Type", "binary_pattern": "001000 | vm | 00000 | rs1 | 101 | vd | 0000111", "hex_opcode": "0x20005007", "visual_parts": [{"raw": "001000", "clean": "001000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest Group (2 regs)"}, {"name": "rs1", "desc": "Base Addr"}], "pseudocode": "Load 2 interleaved 16-bit streams.", "description": "Performs a vector strided load of 2-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLSEG2E16.V v1, a0, v0.t"}
{"mnemonic": "VSSEG2E16.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Store Segment (2 fields, 16-bit)", "summary": "Stores 2 vector registers as interleaved 16-bit fields.", "syntax": "VSSEG2E16.V vs3, (rs1), vm", "encoding": {"format": "VS-Type", "binary_pattern": "001000 | vm | 00000 | rs1 | 101 | vs3 | 0100111", "hex_opcode": "0x20005027", "visual_parts": [{"raw": "001000", "clean": "001000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "vs3", "clean": "vs3", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vs3", "desc": "Src Group (2 regs)"}, {"name": "rs1", "desc": "Base Addr"}], "pseudocode": "Store 2 interleaved 16-bit streams.", "description": "Performs a vector strided store of 2-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VSSEG2E16.V v6, a0, v0.t"}
{"mnemonic": "VLE8FF.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load 8-bit Fault-Only-First", "summary": "Loads 8-bit elements, suppressing faults on elements after the first. Sets VL to number of elements loaded. Critical for strings.", "syntax": "VLE8FF.V vd, (rs1), vm", "encoding": {"format": "VL-Type", "binary_pattern": "000000 | vm | 10000 | rs1 | 000 | vd | 0000111", "hex_opcode": "0x01000007", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "10000", "clean": "10000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base Addr"}], "pseudocode": "vl = LoadFaultFirst(vd, rs1, 1);", "description": "Performs a vector unit-stride load of 8-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLE8FF.V v1, a0, v0.t"}
{"mnemonic": "VLE16FF.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load 16-bit Fault-Only-First", "summary": "Loads 16-bit elements with fault suppression.", "syntax": "VLE16FF.V vd, (rs1), vm", "encoding": {"format": "VL-Type", "binary_pattern": "000000 | vm | 10000 | rs1 | 101 | vd | 0000111", "hex_opcode": "0x01005007", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "10000", "clean": "10000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base Addr"}], "pseudocode": "vl = LoadFaultFirst(vd, rs1, 2);", "description": "Performs a vector unit-stride load of 16-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLE16FF.V v1, a0, v0.t"}
{"mnemonic": "VLE32FF.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load 32-bit Fault-Only-First", "summary": "Loads 32-bit elements with fault suppression.", "syntax": "VLE32FF.V vd, (rs1), vm", "encoding": {"format": "VL-Type", "binary_pattern": "000000 | vm | 10000 | rs1 | 110 | vd | 0000111", "hex_opcode": "0x01006007", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "10000", "clean": "10000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base Addr"}], "pseudocode": "vl = LoadFaultFirst(vd, rs1, 4);", "description": "Performs a vector unit-stride load of 32-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLE32FF.V v1, a0, v0.t"}
{"mnemonic": "VLE64FF.V", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Load 64-bit Fault-Only-First", "summary": "Loads 64-bit elements with fault suppression.", "syntax": "VLE64FF.V vd, (rs1), vm", "encoding": {"format": "VL-Type", "binary_pattern": "000000 | vm | 10000 | rs1 | 111 | vd | 0000111", "hex_opcode": "0x01007007", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "10000", "clean": "10000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base Addr"}], "pseudocode": "vl = LoadFaultFirst(vd, rs1, 8);", "description": "Performs a vector unit-stride load of 64-bit elements from/to memory. The number of elements transferred is determined by vl. Masking is controlled by vm.", "example": "VLE64FF.V v1, a0, v0.t"}
{"mnemonic": "VAMOADDW.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic Add Word", "summary": "Atomically adds elements from vs2 to memory addresses in rs1 (indexed by vs2? No, rs1 is base, vs2 is index).", "syntax": "VAMOADDW.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "00000 | wd | vm | vs2 | rs1 | 110 | vd | 0101111", "hex_opcode": "0x0000602F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "00000", "clean": "00000", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Old Val)"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicAdd(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic Add Word: Atomically adds elements from vs2 to memory addresses in rs1 (indexed by vs2? No, rs1 is base, vs2 is index). Operation: AtomicAdd(rs1 + vs2[i], vd[i]);.", "example": "VAMOADDW.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOADDD.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic Add Doubleword", "summary": "Atomically adds elements from vs2 to memory addresses (64-bit).", "syntax": "VAMOADDD.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "00000 | wd | vm | vs2 | rs1 | 111 | vd | 0101111", "hex_opcode": "0x0000702F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "00000", "clean": "00000", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Dest (Old Val)"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicAdd(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic Add Doubleword: Atomically adds elements from vs2 to memory addresses (64-bit). Operation: AtomicAdd(rs1 + vs2[i], vd[i]);.", "example": "VAMOADDD.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOANDW.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic AND Word", "summary": "Atomically ANDs elements.", "syntax": "VAMOANDW.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "01100 | wd | vm | vs2 | rs1 | 110 | vd | 0101111", "hex_opcode": "0x6000602F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "01100", "clean": "01100", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicAnd(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic AND Word: Atomically ANDs elements. Operation: AtomicAnd(rs1 + vs2[i], vd[i]);.", "example": "VAMOANDW.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOANDD.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic AND Doubleword", "summary": "Atomically ANDs elements (64-bit).", "syntax": "VAMOANDD.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "01100 | wd | vm | vs2 | rs1 | 111 | vd | 0101111", "hex_opcode": "0x6000702F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "01100", "clean": "01100", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicAnd(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic AND Doubleword: Atomically ANDs elements (64-bit). Operation: AtomicAnd(rs1 + vs2[i], vd[i]);.", "example": "VAMOANDD.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOORW.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic OR Word", "summary": "Atomically ORs elements.", "syntax": "VAMOORW.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "01000 | wd | vm | vs2 | rs1 | 110 | vd | 0101111", "hex_opcode": "0x4000602F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "01000", "clean": "01000", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicOr(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic OR Word: Atomically ORs elements. Operation: AtomicOr(rs1 + vs2[i], vd[i]);.", "example": "VAMOORW.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOORD.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic OR Doubleword", "summary": "Atomically ORs elements (64-bit).", "syntax": "VAMOORD.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "01000 | wd | vm | vs2 | rs1 | 111 | vd | 0101111", "hex_opcode": "0x4000702F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "01000", "clean": "01000", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicOr(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic OR Doubleword: Atomically ORs elements (64-bit). Operation: AtomicOr(rs1 + vs2[i], vd[i]);.", "example": "VAMOORD.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOXORW.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic XOR Word", "summary": "Atomically XORs elements.", "syntax": "VAMOXORW.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "00100 | wd | vm | vs2 | rs1 | 110 | vd | 0101111", "hex_opcode": "0x2000602F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "00100", "clean": "00100", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicXor(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic XOR Word: Atomically XORs elements. Operation: AtomicXor(rs1 + vs2[i], vd[i]);.", "example": "VAMOXORW.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOXORD.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic XOR Doubleword", "summary": "Atomically XORs elements (64-bit).", "syntax": "VAMOXORD.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "00100 | wd | vm | vs2 | rs1 | 111 | vd | 0101111", "hex_opcode": "0x2000702F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "00100", "clean": "00100", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicXor(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic XOR Doubleword: Atomically XORs elements (64-bit). Operation: AtomicXor(rs1 + vs2[i], vd[i]);.", "example": "VAMOXORD.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOMAXW.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic Max Word", "summary": "Atomic Max (Signed).", "syntax": "VAMOMAXW.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "10100 | wd | vm | vs2 | rs1 | 110 | vd | 0101111", "hex_opcode": "0xA000602F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "10100", "clean": "10100", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicMax(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic Max Word: Atomic Max (Signed). Operation: AtomicMax(rs1 + vs2[i], vd[i]);.", "example": "VAMOMAXW.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOMAXD.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic Max Doubleword", "summary": "Atomic Max (Signed, 64-bit).", "syntax": "VAMOMAXD.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "10100 | wd | vm | vs2 | rs1 | 111 | vd | 0101111", "hex_opcode": "0xA000702F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "10100", "clean": "10100", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicMax(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic Max Doubleword: Atomic Max (Signed, 64-bit). Operation: AtomicMax(rs1 + vs2[i], vd[i]);.", "example": "VAMOMAXD.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOMINW.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic Min Word", "summary": "Atomic Min (Signed).", "syntax": "VAMOMINW.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "10000 | wd | vm | vs2 | rs1 | 110 | vd | 0101111", "hex_opcode": "0x8000602F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "10000", "clean": "10000", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicMin(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic Min Word: Atomic Min (Signed). Operation: AtomicMin(rs1 + vs2[i], vd[i]);.", "example": "VAMOMINW.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOMIND.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic Min Doubleword", "summary": "Atomic Min (Signed, 64-bit).", "syntax": "VAMOMIND.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "10000 | wd | vm | vs2 | rs1 | 111 | vd | 0101111", "hex_opcode": "0x8000702F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "10000", "clean": "10000", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicMin(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic Min Doubleword: Atomic Min (Signed, 64-bit). Operation: AtomicMin(rs1 + vs2[i], vd[i]);.", "example": "VAMOMIND.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOMAXU.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic Max Unsigned", "summary": "Atomic Max (Unsigned, Width implicit).", "syntax": "VAMOMAXU.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "000001 | 11100 | vm | rs1 | width | vd | 0101111", "hex_opcode": "0xE000602F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "11100", "clean": "11100", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "width", "clean": "width", "pos": ""}, {"raw": "vd", "clean": "vd", "pos": "14:10"}, {"raw": "0101111", "clean": "0101111", "pos": "9:3"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 |  | 14:10 | 9:3"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicMaxU(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic Max Unsigned: Atomic Max (Unsigned, Width implicit). Operation: AtomicMaxU(rs1 + vs2[i], vd[i]);.", "example": "VAMOMAXU.V v1, a0, v4, v0.t"}
{"mnemonic": "VAMOMINU.V", "architecture": "RISC-V", "extension": "Zvamo (draft)", "full_name": "Vector Atomic Min Unsigned", "summary": "Atomic Min (Unsigned, Width implicit).", "syntax": "VAMOMINU.V vd, (rs1), vs2, vm", "encoding": {"format": "VAMO", "binary_pattern": "000001 | 11000 | vm | rs1 | width | vd | 0101111", "hex_opcode": "0xC000602F", "visual_parts": [{"raw": "000001", "clean": "000001", "pos": "31:26"}, {"raw": "11000", "clean": "11000", "pos": "25:21"}, {"raw": "vm", "clean": "vm", "pos": "20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "width", "clean": "width", "pos": ""}, {"raw": "vd", "clean": "vd", "pos": "14:10"}, {"raw": "0101111", "clean": "0101111", "pos": "9:3"}], "bit_positions": "31:26 | 25:21 | 20 | 19:15 |  | 14:10 | 9:3"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "rs1", "desc": "Base"}, {"name": "vs2", "desc": "Index"}], "pseudocode": "AtomicMinU(rs1 + vs2[i], vd[i]);", "description": "Vector Atomic Min Unsigned: Atomic Min (Unsigned, Width implicit). Operation: AtomicMinU(rs1 + vs2[i], vd[i]);.", "example": "VAMOMINU.V v1, a0, v4, v0.t"}
{"mnemonic": "VSLIDE1UP.VX", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Slide One Element Up", "summary": "Moves elements up by 1, injecting scalar into index 0.", "syntax": "VSLIDE1UP.VX vd, vs2, rs1, vm", "encoding": {"format": "OPIVX", "binary_pattern": "001110 | vm | vs2 | rs1 | 110 | vd | 1010111", "hex_opcode": "0x38006057", "visual_parts": [{"raw": "001110", "clean": "001110", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Src Vec"}, {"name": "rs1", "desc": "Scalar"}], "pseudocode": "vd[0] = rs1; vd[i] = vs2[i-1];", "description": "Slides vector elements up by the specified offset, filling vacated positions with zero or the value from vs1[0].", "example": "VSLIDE1UP.VX v1, v4, a0, v0.t"}
{"mnemonic": "VSLIDE1DOWN.VX", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Slide One Element Down", "summary": "Moves elements down by 1, injecting scalar into top index.", "syntax": "VSLIDE1DOWN.VX vd, vs2, rs1, vm", "encoding": {"format": "OPIVX", "binary_pattern": "001111 | vm | vs2 | rs1 | 110 | vd | 1010111", "hex_opcode": "0x3C006057", "visual_parts": [{"raw": "001111", "clean": "001111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Src Vec"}, {"name": "rs1", "desc": "Scalar"}], "pseudocode": "vd[i] = vs2[i+1]; vd[vl-1] = rs1;", "description": "Slides vector elements down by the specified offset, filling vacated positions with zero or the value from vs1[0].", "example": "VSLIDE1DOWN.VX v1, v4, a0, v0.t"}
{"mnemonic": "VFREDOSUM.VS", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Ordered Float Reduction Sum", "summary": "Sums float vector elements in exact order (0 to vl-1).", "syntax": "VFREDOSUM.VS vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "000011 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0x0C001057", "visual_parts": [{"raw": "000011", "clean": "000011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Scalar Dest"}, {"name": "vs2", "desc": "Vector"}, {"name": "vs1", "desc": "Start"}], "pseudocode": "vd[0] = vs1[0]; for i in 0..vl-1: vd[0] += vs2[i];", "description": "Performs a vector reduction: applies the operation across all active elements of vs2, using vs1[0] as the initial accumulator, and writes the scalar result to vd[0]. Active elements are determined by vl.", "example": "VFREDOSUM.VS v1, v4, v2, v0.t"}
{"mnemonic": "VFWREDUSUM.VS", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Unordered Float Reduction Sum", "summary": "Sums N-bit floats into 2*N-bit scalar accumulator (Unordered).", "syntax": "VFWREDUSUM.VS vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "110001 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0xC4001057", "visual_parts": [{"raw": "110001", "clean": "110001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Wide Dest"}, {"name": "vs2", "desc": "Narrow Vec"}, {"name": "vs1", "desc": "Wide Start"}], "pseudocode": "vd[0] = vs1[0] + sum(vs2[*]);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VFWREDUSUM.VS v1, v4, v2, v0.t"}
{"mnemonic": "VFWREDOSUM.VS", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening Ordered Float Reduction Sum", "summary": "Sums N-bit floats into 2*N-bit scalar accumulator (Ordered).", "syntax": "VFWREDOSUM.VS vd, vs2, vs1, vm", "encoding": {"format": "OPFVV", "binary_pattern": "110011 | vm | vs2 | vs1 | 001 | vd | 1010111", "hex_opcode": "0xCC001057", "visual_parts": [{"raw": "110011", "clean": "110011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Wide Dest"}, {"name": "vs2", "desc": "Narrow Vec"}, {"name": "vs1", "desc": "Wide Start"}], "pseudocode": "vd[0] = vs1[0]; for i: vd[0] += extend(vs2[i]);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VFWREDOSUM.VS v1, v4, v2, v0.t"}
{"mnemonic": "VMERGE.VXM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Merge Scalar", "summary": "Merges integer scalar vs vector based on mask.", "syntax": "VMERGE.VXM vd, vs2, rs1, v0", "encoding": {"format": "OPIVX", "binary_pattern": "0101110 | vs2 | rs1 | 100 | vd | 1010111", "hex_opcode": "0x5C004057", "visual_parts": [{"raw": "0101110", "clean": "0101110", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "False"}, {"name": "rs1", "desc": "True (Scalar)"}], "pseudocode": "vd[i] = v0[i] ? rs1 : vs2[i];", "description": "Merges elements from vs1 and vs2 (or an immediate) according to the mask: masked-on elements come from vs1, masked-off from vs2.", "example": "VMERGE.VXM v1, v4, a0, v0"}
{"mnemonic": "VMERGE.VIM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Merge Immediate", "summary": "Merges immediate vs vector based on mask.", "syntax": "VMERGE.VIM vd, vs2, imm, v0", "encoding": {"format": "OPIVI", "binary_pattern": "0101110 | vs2 | simm5 | 011 | vd | 1010111", "hex_opcode": "0x5C003057", "visual_parts": [{"raw": "0101110", "clean": "0101110", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "simm5", "clean": "simm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "False"}, {"name": "imm", "desc": "True (Imm)"}], "pseudocode": "vd[i] = v0[i] ? imm : vs2[i];", "description": "Merges elements from vs1 and vs2 (or an immediate) according to the mask: masked-on elements come from vs1, masked-off from vs2.", "example": "VMERGE.VIM v1, v4, 16, v0"}
{"mnemonic": "SHA512SIG0", "architecture": "RISC-V", "extension": "Zknh", "full_name": "SHA-512 Sigma0", "summary": "Performs SHA-512 Sigma0 transformation (RV64).", "syntax": "SHA512SIG0 rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "000100000110 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x10601013", "visual_parts": [{"raw": "000100000110", "clean": "000100000110", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}], "pseudocode": "rd = sigma0_512(rs1);", "description": "SHA512SIG0 computes the lower 64-bit word of the sigma_0 function for SHA-512.", "example": "SHA512SIG0 t0, a0"}
{"mnemonic": "SHA512SIG1", "architecture": "RISC-V", "extension": "Zknh", "full_name": "SHA-512 Sigma1", "summary": "Performs SHA-512 Sigma1 transformation (RV64).", "syntax": "SHA512SIG1 rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "000100000111 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x10701013", "visual_parts": [{"raw": "000100000111", "clean": "000100000111", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}], "pseudocode": "rd = sigma1_512(rs1);", "description": "SHA512SIG1 computes the sigma_1 function for SHA-512.", "example": "SHA512SIG1 t0, a0"}
{"mnemonic": "SHA512SUM0", "architecture": "RISC-V", "extension": "Zknh", "full_name": "SHA-512 Sum0", "summary": "Performs SHA-512 Sum0 transformation (RV64).", "syntax": "SHA512SUM0 rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "000100000100 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x10401013", "visual_parts": [{"raw": "000100000100", "clean": "000100000100", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}], "pseudocode": "rd = sum0_512(rs1);", "description": "SHA512SUM0 computes the sum-0 (capital Sigma-0) function for SHA-512.", "example": "SHA512SUM0 t0, a0"}
{"mnemonic": "SHA512SUM1", "architecture": "RISC-V", "extension": "Zknh", "full_name": "SHA-512 Sum1", "summary": "Performs SHA-512 Sum1 transformation (RV64).", "syntax": "SHA512SUM1 rd, rs1", "encoding": {"format": "R-Type", "binary_pattern": "000100000101 | rs1 | 001 | rd | 0010011", "hex_opcode": "0x10501013", "visual_parts": [{"raw": "000100000101", "clean": "000100000101", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}], "pseudocode": "rd = sum1_512(rs1);", "description": "SHA512SUM1 computes the sum-1 (capital Sigma-1) function for SHA-512.", "example": "SHA512SUM1 t0, a0"}
{"mnemonic": "C.FLD", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Float Load Double", "summary": "Loads a double-precision float from memory (Compressed).", "syntax": "C.FLD rd', offset(rs1')", "encoding": {"format": "CL", "binary_pattern": "? | 001 | c_uimm8hi | rs1_p | c_uimm8lo | rd_p | 00", "hex_opcode": "0x00002000", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "001", "clean": "001", "pos": "15:13"}, {"raw": "c_uimm8hi", "clean": "c_uimm8hi", "pos": "12:10"}, {"raw": "rs1_p", "clean": "rs1_p", "pos": "9:7"}, {"raw": "c_uimm8lo", "clean": "c_uimm8lo", "pos": "6:5"}, {"raw": "rd_p", "clean": "rd_p", "pos": "4:2"}, {"raw": "00", "clean": "00", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest (f8-f15)"}, {"name": "rs1'", "desc": "Base (x8-x15)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "F[rd'] = M[R[rs1'] + offset][63:0];", "description": "Loads a double-precision FP value from memory into fd′. Stack-pointer relative or register-based variants.", "example": "C.FLD rd', 0(a0)"}
{"mnemonic": "C.FSD", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Float Store Double", "summary": "Stores a double-precision float to memory (Compressed).", "syntax": "C.FSD rs2', offset(rs1')", "encoding": {"format": "CS", "binary_pattern": "? | 101 | c_uimm8hi | rs1_p | c_uimm8lo | rs2_p | 00", "hex_opcode": "0x0000A000", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "101", "clean": "101", "pos": "15:13"}, {"raw": "c_uimm8hi", "clean": "c_uimm8hi", "pos": "12:10"}, {"raw": "rs1_p", "clean": "rs1_p", "pos": "9:7"}, {"raw": "c_uimm8lo", "clean": "c_uimm8lo", "pos": "6:5"}, {"raw": "rs2_p", "clean": "rs2_p", "pos": "4:2"}, {"raw": "00", "clean": "00", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rs2'", "desc": "Source (f8-f15)"}, {"name": "rs1'", "desc": "Base (x8-x15)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[rs1'] + offset][63:0] = F[rs2'];", "description": "Stores a double-precision FP value from fd′ to memory.", "example": "C.FSD rs2', 0(a0)"}
{"mnemonic": "C.ADDI4SPN", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Add Immediate to Stack Pointer (Non-zero)", "summary": "Adds a zero-extended non-zero immediate to the stack pointer (x2) and stores the result in a register.", "syntax": "C.ADDI4SPN rd', uimm", "encoding": {"format": "CIW", "binary_pattern": "? | 000 | c_nzuimm10 | rd_p | 00", "hex_opcode": "0x00000000", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "000", "clean": "000", "pos": "15:13"}, {"raw": "c_nzuimm10", "clean": "c_nzuimm10", "pos": "12:5"}, {"raw": "rd_p", "clean": "rd_p", "pos": "4:2"}, {"raw": "00", "clean": "00", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:5 | 4:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest (x8-x15)"}, {"name": "uimm", "desc": "Unsigned immediate value"}], "pseudocode": "R[rd'] = R[2] + zext(uimm);", "example": "C.ADDI4SPN x8, 16", "example_note": "Load address of stack object.", "description": "Adds a zero-extended non-zero immediate to sp (x2) and writes the result to rd′ (CIW format). Used to address stack-allocated data."}
{"mnemonic": "C.LW", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Load Word", "summary": "Loads a 32-bit word from memory using a compressed encoding.", "syntax": "C.LW rd', offset(rs1')", "encoding": {"format": "CL", "binary_pattern": "? | 010 | c_uimm7hi | rs1_p | c_uimm7lo | rd_p | 00", "hex_opcode": "0x00004000", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "010", "clean": "010", "pos": "15:13"}, {"raw": "c_uimm7hi", "clean": "c_uimm7hi", "pos": "12:10"}, {"raw": "rs1_p", "clean": "rs1_p", "pos": "9:7"}, {"raw": "c_uimm7lo", "clean": "c_uimm7lo", "pos": "6:5"}, {"raw": "rd_p", "clean": "rd_p", "pos": "4:2"}, {"raw": "00", "clean": "00", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest (x8-x15)"}, {"name": "rs1'", "desc": "Base (x8-x15)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "R[rd'] = M[R[rs1'] + offset][31:0];", "example": "C.LW x8, 4(x9)", "example_note": "16-bit encoding of LW.", "description": "Loads a 32-bit word from memory at a 6-bit unsigned offset from rs1′ into rd′."}
{"mnemonic": "C.SW", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Store Word", "summary": "Stores a 32-bit word to memory using a compressed encoding.", "syntax": "C.SW rs2', offset(rs1')", "encoding": {"format": "CS", "binary_pattern": "? | 110 | c_uimm7hi | rs1_p | c_uimm7lo | rs2_p | 00", "hex_opcode": "0x0000C000", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "110", "clean": "110", "pos": "15:13"}, {"raw": "c_uimm7hi", "clean": "c_uimm7hi", "pos": "12:10"}, {"raw": "rs1_p", "clean": "rs1_p", "pos": "9:7"}, {"raw": "c_uimm7lo", "clean": "c_uimm7lo", "pos": "6:5"}, {"raw": "rs2_p", "clean": "rs2_p", "pos": "4:2"}, {"raw": "00", "clean": "00", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rs2'", "desc": "Source (x8-x15)"}, {"name": "rs1'", "desc": "Base (x8-x15)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[rs1'] + offset][31:0] = R[rs2'];", "example": "C.SW x8, 4(x9)", "example_note": "16-bit encoding of SW.", "description": "Stores the low 32 bits of rs2′ to memory at a 6-bit unsigned offset from rs1′."}
{"mnemonic": "C.ADDI", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Add Immediate", "summary": "Adds a non-zero immediate to a register.", "syntax": "C.ADDI rd, imm", "encoding": {"format": "CI", "binary_pattern": "? | 000 | c_nzimm6hi | rd_rs1_n0 | c_nzimm6lo | 01", "hex_opcode": "0x00000001", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "000", "clean": "000", "pos": "15:13"}, {"raw": "c_nzimm6hi", "clean": "c_nzimm6hi", "pos": "12"}, {"raw": "rd_rs1_n0", "clean": "rd_rs1_n0", "pos": "11:7"}, {"raw": "c_nzimm6lo", "clean": "c_nzimm6lo", "pos": "6:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:7 | 6:2 | 1:0"}, "operands": [{"name": "rd", "desc": "Dest/Source"}, {"name": "imm", "desc": "6-bit Signed Imm"}], "pseudocode": "R[rd] = R[rd] + sext(imm);", "example": "C.ADDI x10, 1", "example_note": "Increment x10.", "description": "Adds a non-zero 6-bit sign-extended immediate to rd (≠ x0) and writes back. 16-bit encoding of ADDI."}
{"mnemonic": "C.JAL", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Jump and Link", "summary": "Performs a PC-relative jump and stores return address in x1 (ra). RV32 only.", "syntax": "C.JAL offset", "encoding": {"format": "CJ", "binary_pattern": "? | 001 | c_imm12 | 01", "hex_opcode": "0x00002001", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "001", "clean": "001", "pos": "15:13"}, {"raw": "c_imm12", "clean": "c_imm12", "pos": "12:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:2 | 1:0"}, "operands": [{"name": "offset", "desc": "Jump Target"}], "pseudocode": "R[1] = PC + 2; PC += sext(offset);", "example": "C.JAL func", "example_note": "Compressed function call.", "description": "Performs a PC-relative jump and saves the return address in x1 (RV32 only)."}
{"mnemonic": "C.LI", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Load Immediate", "summary": "Loads a 6-bit signed immediate into a register.", "syntax": "C.LI rd, imm", "encoding": {"format": "CI", "binary_pattern": "? | 010 | c_imm6hi | rd_n0 | c_imm6lo | 01", "hex_opcode": "0x00004001", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "010", "clean": "010", "pos": "15:13"}, {"raw": "c_imm6hi", "clean": "c_imm6hi", "pos": "12"}, {"raw": "rd_n0", "clean": "rd_n0", "pos": "11:7"}, {"raw": "c_imm6lo", "clean": "c_imm6lo", "pos": "6:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:7 | 6:2 | 1:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "R[rd] = sext(imm);", "example": "C.LI x10, 1", "example_note": "Set x10 to 1.", "description": "Loads a 6-bit sign-extended immediate into rd (≠ x0). Equivalent to ADDI rd, x0, imm."}
{"mnemonic": "C.ADDI16SP", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Add Immediate to Stack Pointer", "summary": "Adds a signed non-zero immediate to the stack pointer (x2).", "syntax": "C.ADDI16SP imm", "encoding": {"format": "CI", "binary_pattern": "? | 011 | c_nzimm10hi | 00010 | c_nzimm10lo | 01", "hex_opcode": "0x00006101", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "011", "clean": "011", "pos": "15:13"}, {"raw": "c_nzimm10hi", "clean": "c_nzimm10hi", "pos": "12"}, {"raw": "00010", "clean": "00010", "pos": "11:7"}, {"raw": "c_nzimm10lo", "clean": "c_nzimm10lo", "pos": "6:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:7 | 6:2 | 1:0"}, "operands": [{"name": "imm", "desc": "Signed Imm * 16"}], "pseudocode": "R[2] = R[2] + sext(imm);", "example": "C.ADDI16SP -64", "example_note": "Allocate 64 bytes on stack.", "description": "Adds a non-zero 6-bit sign-extended immediate scaled by 16 to the stack pointer (x2)."}
{"mnemonic": "C.LUI", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Load Upper Immediate", "summary": "Loads a non-zero 6-bit immediate into bits 17-12 of the destination register, clears lower 12 bits, sign-extends bit 17.", "syntax": "C.LUI rd, imm", "encoding": {"format": "CI", "binary_pattern": "? | 011 | c_nzimm18hi | rd_n2 | c_nzimm18lo | 01", "hex_opcode": "0x00006001", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "011", "clean": "011", "pos": "15:13"}, {"raw": "c_nzimm18hi", "clean": "c_nzimm18hi", "pos": "12"}, {"raw": "rd_n2", "clean": "rd_n2", "pos": "11:7"}, {"raw": "c_nzimm18lo", "clean": "c_nzimm18lo", "pos": "6:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:7 | 6:2 | 1:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "R[rd] = sext(imm << 12);", "example": "C.LUI x10, 1", "example_note": "Loads 0x1000 into x10.", "description": "Loads a 18-bit sign-extended value (upper 6 bits of 20-bit immediate) into rd (≠ x0, x2)."}
{"mnemonic": "C.SRLI", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Shift Right Logical Immediate", "summary": "Logically shifts a register right by immediate.", "syntax": "C.SRLI rd', imm", "encoding": {"format": "CB", "binary_pattern": "? | 100 | c_nzuimm6hi | 00 | rd_rs1_p | c_nzuimm6lo | 01", "hex_opcode": "0x00008001", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100", "clean": "100", "pos": "15:13"}, {"raw": "c_nzuimm6hi", "clean": "c_nzuimm6hi", "pos": "12"}, {"raw": "00", "clean": "00", "pos": "11:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "c_nzuimm6lo", "clean": "c_nzuimm6lo", "pos": "6:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:10 | 9:7 | 6:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest/Source (x8-x15)"}, {"name": "imm", "desc": "Shift Amount"}], "pseudocode": "R[rd'] = R[rd'] >> imm;", "example": "C.SRLI x8, 2", "example_note": "x8 = x8 >> 2", "description": "Logical right shift of rd′ by a 5-bit immediate."}
{"mnemonic": "C.SRAI", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Shift Right Arithmetic Immediate", "summary": "Arithmetically shifts a register right by immediate.", "syntax": "C.SRAI rd', imm", "encoding": {"format": "CB", "binary_pattern": "? | 100 | c_nzuimm6hi | 01 | rd_rs1_p | c_nzuimm6lo | 01", "hex_opcode": "0x00008401", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100", "clean": "100", "pos": "15:13"}, {"raw": "c_nzuimm6hi", "clean": "c_nzuimm6hi", "pos": "12"}, {"raw": "01", "clean": "01", "pos": "11:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "c_nzuimm6lo", "clean": "c_nzuimm6lo", "pos": "6:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:10 | 9:7 | 6:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest/Source"}, {"name": "imm", "desc": "Shift Amount"}], "pseudocode": "R[rd'] = R[rd'] >>s imm;", "example": "C.SRAI x8, 2", "example_note": "x8 = x8 >>s 2", "description": "Arithmetic right shift of rd′ by a 5-bit immediate."}
{"mnemonic": "C.ANDI", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed AND Immediate", "summary": "Computes bitwise AND with a signed immediate.", "syntax": "C.ANDI rd', imm", "encoding": {"format": "CB", "binary_pattern": "? | 100 | c_imm6hi | 10 | rd_rs1_p | c_imm6lo | 01", "hex_opcode": "0x00008801", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100", "clean": "100", "pos": "15:13"}, {"raw": "c_imm6hi", "clean": "c_imm6hi", "pos": "12"}, {"raw": "10", "clean": "10", "pos": "11:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "c_imm6lo", "clean": "c_imm6lo", "pos": "6:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:10 | 9:7 | 6:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest/Source"}, {"name": "imm", "desc": "Signed Imm"}], "pseudocode": "R[rd'] = R[rd'] & sext(imm);", "example": "C.ANDI x8, 15", "example_note": "Keep lowest 4 bits.", "description": "Computes the bitwise AND of rd′ and a 6-bit sign-extended immediate."}
{"mnemonic": "C.SUB", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Subtract", "summary": "Subtracts two registers.", "syntax": "C.SUB rd', rs2'", "encoding": {"format": "CA", "binary_pattern": "? | 100011 | rd_rs1_p | 00 | rs2_p | 01", "hex_opcode": "0x00008C01", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100011", "clean": "100011", "pos": "15:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "00", "clean": "00", "pos": "6:5"}, {"raw": "rs2_p", "clean": "rs2_p", "pos": "4:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest/Src1"}, {"name": "rs2'", "desc": "Source register 2 (3-bit compressed)"}], "pseudocode": "R[rd'] = R[rd'] - R[rs2'];", "example": "C.SUB x8, x9", "example_note": "x8 = x8 - x9", "description": "Subtracts rs2′ from rd′ and writes the result to rd′."}
{"mnemonic": "C.XOR", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed XOR", "summary": "Bitwise XOR of two registers.", "syntax": "C.XOR rd', rs2'", "encoding": {"format": "CA", "binary_pattern": "? | 100011 | rd_rs1_p | 01 | rs2_p | 01", "hex_opcode": "0x00008C21", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100011", "clean": "100011", "pos": "15:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "01", "clean": "01", "pos": "6:5"}, {"raw": "rs2_p", "clean": "rs2_p", "pos": "4:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest/Src1"}, {"name": "rs2'", "desc": "Source register 2 (3-bit compressed)"}], "pseudocode": "R[rd'] = R[rd'] ^ R[rs2'];", "example": "C.XOR x8, x9", "example_note": "x8 = x8 ^ x9", "description": "Computes the bitwise XOR of rd′ and rs2′, writing to rd′."}
{"mnemonic": "C.OR", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed OR", "summary": "Bitwise OR of two registers.", "syntax": "C.OR rd', rs2'", "encoding": {"format": "CA", "binary_pattern": "? | 100011 | rd_rs1_p | 10 | rs2_p | 01", "hex_opcode": "0x00008C41", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100011", "clean": "100011", "pos": "15:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "10", "clean": "10", "pos": "6:5"}, {"raw": "rs2_p", "clean": "rs2_p", "pos": "4:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest/Src1"}, {"name": "rs2'", "desc": "Source register 2 (3-bit compressed)"}], "pseudocode": "R[rd'] = R[rd'] | R[rs2'];", "example": "C.OR x8, x9", "example_note": "x8 = x8 | x9", "description": "Computes the bitwise OR of rd′ and rs2′, writing to rd′."}
{"mnemonic": "C.AND", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed AND", "summary": "Bitwise AND of two registers.", "syntax": "C.AND rd', rs2'", "encoding": {"format": "CA", "binary_pattern": "? | 100011 | rd_rs1_p | 11 | rs2_p | 01", "hex_opcode": "0x00008C61", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "100011", "clean": "100011", "pos": "15:10"}, {"raw": "rd_rs1_p", "clean": "rd_rs1_p", "pos": "9:7"}, {"raw": "11", "clean": "11", "pos": "6:5"}, {"raw": "rs2_p", "clean": "rs2_p", "pos": "4:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:10 | 9:7 | 6:5 | 4:2 | 1:0"}, "operands": [{"name": "rd'", "desc": "Dest/Src1"}, {"name": "rs2'", "desc": "Source register 2 (3-bit compressed)"}], "pseudocode": "R[rd'] = R[rd'] & R[rs2'];", "example": "C.AND x8, x9", "example_note": "x8 = x8 & x9", "description": "Computes the bitwise AND of rd′ and rs2′, writing the result to rd′."}
{"mnemonic": "C.J", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Jump", "summary": "Unconditional PC-relative jump.", "syntax": "C.J offset", "encoding": {"format": "CJ", "binary_pattern": "? | 101 | c_imm12 | 01", "hex_opcode": "0x0000A001", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "101", "clean": "101", "pos": "15:13"}, {"raw": "c_imm12", "clean": "c_imm12", "pos": "12:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:2 | 1:0"}, "operands": [{"name": "offset", "desc": "Target"}], "pseudocode": "PC += sext(offset);", "example": "C.J label", "example_note": "Jump to label.", "description": "Performs an unconditional PC-relative jump within an 11-bit signed offset range."}
{"mnemonic": "C.BEQZ", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Branch if Equal to Zero", "summary": "Branches if the register is zero.", "syntax": "C.BEQZ rs1', offset", "encoding": {"format": "CB", "binary_pattern": "? | 110 | c_bimm9hi | rs1_p | c_bimm9lo | 01", "hex_opcode": "0x0000C001", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "110", "clean": "110", "pos": "15:13"}, {"raw": "c_bimm9hi", "clean": "c_bimm9hi", "pos": "12:10"}, {"raw": "rs1_p", "clean": "rs1_p", "pos": "9:7"}, {"raw": "c_bimm9lo", "clean": "c_bimm9lo", "pos": "6:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:10 | 9:7 | 6:2 | 1:0"}, "operands": [{"name": "rs1'", "desc": "Source"}, {"name": "offset", "desc": "Target"}], "pseudocode": "if (R[rs1'] == 0) PC += sext(offset);", "example": "C.BEQZ x8, exit", "example_note": "Jump if x8 is 0.", "description": "Branches to an 8-bit PC-relative offset if rs1′ equals zero."}
{"mnemonic": "C.BNEZ", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Branch if Not Equal to Zero", "summary": "Branches if the register is not zero.", "syntax": "C.BNEZ rs1', offset", "encoding": {"format": "CB", "binary_pattern": "? | 111 | c_bimm9hi | rs1_p | c_bimm9lo | 01", "hex_opcode": "0x0000E001", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "111", "clean": "111", "pos": "15:13"}, {"raw": "c_bimm9hi", "clean": "c_bimm9hi", "pos": "12:10"}, {"raw": "rs1_p", "clean": "rs1_p", "pos": "9:7"}, {"raw": "c_bimm9lo", "clean": "c_bimm9lo", "pos": "6:2"}, {"raw": "01", "clean": "01", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:10 | 9:7 | 6:2 | 1:0"}, "operands": [{"name": "rs1'", "desc": "Source"}, {"name": "offset", "desc": "Target"}], "pseudocode": "if (R[rs1'] != 0) PC += sext(offset);", "example": "C.BNEZ x8, loop", "example_note": "Jump if x8 is not 0.", "description": "Branches to an 8-bit PC-relative offset if rs1′ is non-zero."}
{"mnemonic": "C.SLLI", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Shift Left Logical Immediate", "summary": "Logically shifts a register left by immediate.", "syntax": "C.SLLI rd, imm", "encoding": {"format": "CI", "binary_pattern": "? | 000 | c_nzuimm6hi | rd_rs1_n0 | c_nzuimm6lo | 10", "hex_opcode": "0x00000002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "000", "clean": "000", "pos": "15:13"}, {"raw": "c_nzuimm6hi", "clean": "c_nzuimm6hi", "pos": "12"}, {"raw": "rd_rs1_n0", "clean": "rd_rs1_n0", "pos": "11:7"}, {"raw": "c_nzuimm6lo", "clean": "c_nzuimm6lo", "pos": "6:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:7 | 6:2 | 1:0"}, "operands": [{"name": "rd", "desc": "Dest/Source"}, {"name": "imm", "desc": "Shift Amount"}], "pseudocode": "R[rd] = R[rd] << imm;", "example": "C.SLLI x10, 2", "example_note": "x10 = x10 << 2", "description": "Logical left shift of rd (≠ x0) by a 5-bit (RV32) or 6-bit (RV64) immediate."}
{"mnemonic": "C.LWSP", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Load Word from Stack Pointer", "summary": "Loads a word from the stack pointer (x2).", "syntax": "C.LWSP rd, offset(x2)", "encoding": {"format": "CI", "binary_pattern": "? | 010 | c_uimm8sphi | rd_n0 | c_uimm8splo | 10", "hex_opcode": "0x00004002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "010", "clean": "010", "pos": "15:13"}, {"raw": "c_uimm8sphi", "clean": "c_uimm8sphi", "pos": "12"}, {"raw": "rd_n0", "clean": "rd_n0", "pos": "11:7"}, {"raw": "c_uimm8splo", "clean": "c_uimm8splo", "pos": "6:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12 | 11:7 | 6:2 | 1:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "R[rd] = M[R[2] + offset][31:0];", "example": "C.LWSP x10, 4(x2)", "example_note": "Load from stack.", "description": "Loads a 32-bit word from a stack-pointer-relative address into rd."}
{"mnemonic": "C.SWSP", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Store Word to Stack Pointer", "summary": "Stores a word to the stack pointer (x2).", "syntax": "C.SWSP rs2, offset(x2)", "encoding": {"format": "CSS", "binary_pattern": "? | 110 | c_uimm8sp_s | c_rs2 | 10", "hex_opcode": "0x0000C002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "110", "clean": "110", "pos": "15:13"}, {"raw": "c_uimm8sp_s", "clean": "c_uimm8sp_s", "pos": "12:7"}, {"raw": "c_rs2", "clean": "c_rs2", "pos": "6:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:13 | 12:7 | 6:2 | 1:0"}, "operands": [{"name": "rs2", "desc": "Source"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[2] + offset][31:0] = R[rs2];", "example": "C.SWSP x10, 8(x2)", "example_note": "Store to stack.", "description": "Stores the low 32 bits of rs2 to a stack-pointer-relative address."}
{"mnemonic": "C.JR", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Jump Register", "summary": "Unconditionally jumps to address in register.", "syntax": "C.JR rs1", "encoding": {"format": "CR", "binary_pattern": "? | 1000 | rs1_n0 | 0000010", "hex_opcode": "0x00008002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "1000", "clean": "1000", "pos": "15:12"}, {"raw": "rs1_n0", "clean": "rs1_n0", "pos": "11:7"}, {"raw": "0000010", "clean": "0000010", "pos": "6:0"}], "bit_positions": "31:16 | 15:12 | 11:7 | 6:0"}, "operands": [{"name": "rs1", "desc": "Address"}], "pseudocode": "PC = R[rs1];", "example": "C.JR x1", "example_note": "Return (if x1 is ra).", "description": "Jumps to the address in rs1 without linking."}
{"mnemonic": "C.MV", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Move", "summary": "Copies register rs2 to rd.", "syntax": "C.MV rd, rs2", "encoding": {"format": "CR", "binary_pattern": "? | 1000 | rd_n0 | c_rs2_n0 | 10", "hex_opcode": "0x00008002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "1000", "clean": "1000", "pos": "15:12"}, {"raw": "rd_n0", "clean": "rd_n0", "pos": "11:7"}, {"raw": "c_rs2_n0", "clean": "c_rs2_n0", "pos": "6:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:12 | 11:7 | 6:2 | 1:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs2", "desc": "Source"}], "pseudocode": "R[rd] = R[rs2];", "example": "C.MV x10, x11", "example_note": "Copy x11 to x10.", "description": "Copies the value of rs2 (≠ x0) to rd (≠ x0). Equivalent to C.ADD rd, x0, rs2."}
{"mnemonic": "C.EBREAK", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Environment Break", "summary": "Triggers a debugger breakpoint.", "syntax": "C.EBREAK", "encoding": {"format": "CR", "binary_pattern": "? | 1001000000000010", "hex_opcode": "0x00009002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "1001000000000010", "clean": "1001000000000010", "pos": "15:0"}], "bit_positions": "31:16 | 15:0"}, "operands": [], "pseudocode": "RaiseException(Breakpoint);", "example": "C.EBREAK", "example_note": "Break.", "description": "Causes a breakpoint exception. 16-bit encoding of EBREAK."}
{"mnemonic": "C.JALR", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Jump and Link Register", "summary": "Jumps to register address and links (saves PC+2 to ra).", "syntax": "C.JALR rs1", "encoding": {"format": "CR", "binary_pattern": "? | 1001 | c_rs1_n0 | 0000010", "hex_opcode": "0x00009002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "1001", "clean": "1001", "pos": "15:12"}, {"raw": "c_rs1_n0", "clean": "c_rs1_n0", "pos": "11:7"}, {"raw": "0000010", "clean": "0000010", "pos": "6:0"}], "bit_positions": "31:16 | 15:12 | 11:7 | 6:0"}, "operands": [{"name": "rs1", "desc": "Address"}], "pseudocode": "t = PC + 2; PC = R[rs1]; R[1] = t;", "example": "C.JALR x10", "example_note": "Call function pointer in x10.", "description": "Jumps to address in rs1 and saves PC+2 in x1."}
{"mnemonic": "C.ADD", "architecture": "RISC-V", "extension": "C", "full_name": "Compressed Add", "summary": "Adds two registers.", "syntax": "C.ADD rd, rs2", "encoding": {"format": "CR", "binary_pattern": "? | 1001 | rd_rs1_n0 | c_rs2_n0 | 10", "hex_opcode": "0x00009002", "visual_parts": [{"raw": "?", "clean": "?", "pos": "31:16"}, {"raw": "1001", "clean": "1001", "pos": "15:12"}, {"raw": "rd_rs1_n0", "clean": "rd_rs1_n0", "pos": "11:7"}, {"raw": "c_rs2_n0", "clean": "c_rs2_n0", "pos": "6:2"}, {"raw": "10", "clean": "10", "pos": "1:0"}], "bit_positions": "31:16 | 15:12 | 11:7 | 6:2 | 1:0"}, "operands": [{"name": "rd", "desc": "Dest/Src1"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = R[rd] + R[rs2];", "example": "C.ADD x10, x11", "example_note": "x10 = x10 + x11", "description": "Adds the value of a register to rd/rs1 and writes the result back to rd. 16-bit encoding of ADD."}
{"mnemonic": "BEQ", "architecture": "RISC-V", "full_name": "Branch if Equal", "summary": "Take the branch if registers rs1 and rs2 are equal.", "syntax": "BEQ rs1, rs2, offset", "encoding": {"format": "B-Type", "binary_pattern": "bimm12hi | rs2 | rs1 | 000 | bimm12lo | 1100011", "hex_opcode": "0x00000063", "visual_parts": [{"raw": "bimm12hi", "clean": "bimm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "bimm12lo", "clean": "bimm12lo", "pos": "11:7"}, {"raw": "1100011", "clean": "1100011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "offset", "desc": "PC-relative offset"}], "pseudocode": "if (R[rs1] == R[rs2]) PC += sext(offset);", "example": "BEQ x5, x6, 100", "example_note": "Jump to PC+100 if x5 == x6.", "extension": "RV32I", "description": "BEQ takes the branch if rs1 equals rs2. The branch target is the PC of the branch plus the sign-extended B-immediate, which encodes an offset in multiples of 2 bytes within a ±4 KiB range."}
{"mnemonic": "BNE", "architecture": "RISC-V", "full_name": "Branch if Not Equal", "summary": "Take the branch if registers rs1 and rs2 are not equal.", "syntax": "BNE rs1, rs2, offset", "encoding": {"format": "B-Type", "binary_pattern": "bimm12hi | rs2 | rs1 | 001 | bimm12lo | 1100011", "hex_opcode": "0x00001063", "visual_parts": [{"raw": "bimm12hi", "clean": "bimm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "bimm12lo", "clean": "bimm12lo", "pos": "11:7"}, {"raw": "1100011", "clean": "1100011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "offset", "desc": "PC-relative offset"}], "pseudocode": "if (R[rs1] != R[rs2]) PC += sext(offset);", "example": "BNE x5, x6, loop", "example_note": "Jump to 'loop' if x5 != x6.", "extension": "RV32I", "description": "BNE takes the branch if rs1 is not equal to rs2. The branch target is the PC of the branch plus the sign-extended B-immediate within a ±4 KiB range."}
{"mnemonic": "BLT", "architecture": "RISC-V", "full_name": "Branch if Less Than", "summary": "Take the branch if rs1 is less than rs2 (signed).", "syntax": "BLT rs1, rs2, offset", "encoding": {"format": "B-Type", "binary_pattern": "bimm12hi | rs2 | rs1 | 100 | bimm12lo | 1100011", "hex_opcode": "0x00004063", "visual_parts": [{"raw": "bimm12hi", "clean": "bimm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "bimm12lo", "clean": "bimm12lo", "pos": "11:7"}, {"raw": "1100011", "clean": "1100011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "if (R[rs1] <s R[rs2]) PC += sext(offset);", "example": "BLT x10, x11, exit", "example_note": "Branch to 'exit' if x10 < x11 (signed comparison).", "extension": "RV32I", "description": "BLT takes the branch if rs1 is less than rs2, using a signed comparison. The branch target is the PC plus the sign-extended B-immediate."}
{"mnemonic": "BGE", "architecture": "RISC-V", "full_name": "Branch if Greater or Equal", "summary": "Take the branch if rs1 is greater than or equal to rs2 (signed).", "syntax": "BGE rs1, rs2, offset", "encoding": {"format": "B-Type", "binary_pattern": "bimm12hi | rs2 | rs1 | 101 | bimm12lo | 1100011", "hex_opcode": "0x00005063", "visual_parts": [{"raw": "bimm12hi", "clean": "bimm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "bimm12lo", "clean": "bimm12lo", "pos": "11:7"}, {"raw": "1100011", "clean": "1100011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "if (R[rs1] >=s R[rs2]) PC += sext(offset);", "example": "BGE x10, x0, positive", "example_note": "Branch if x10 is positive or zero.", "extension": "RV32I", "description": "BGE takes the branch if rs1 is greater than or equal to rs2, using a signed comparison. The branch target is the PC plus the sign-extended B-immediate."}
{"mnemonic": "CSRRW", "architecture": "RISC-V", "extension": "Zicsr", "full_name": "Control Status Register Read/Write", "summary": "Atomically swaps values in the CSRs. Reads the old value of the CSR into rd, then writes rs1 to the CSR.", "syntax": "CSRRW rd, csr, rs1", "encoding": {"format": "I-Type", "binary_pattern": "csr | rs1 | 001 | rd | 1110011", "hex_opcode": "0x00001073", "visual_parts": [{"raw": "csr", "clean": "csr", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "csr", "desc": "CSR Address"}, {"name": "rs1", "desc": "Src (New Value)"}], "pseudocode": "t = CSRs[csr]; CSRs[csr] = R[rs1]; R[rd] = t;", "example": "CSRRW x10, scause, x11", "example_note": "Writes x11 to 'scause' CSR and reads old 'scause' into x10.", "description": "CSRRW atomically reads the value of CSR csr into rd, then writes the value from rs1 into the CSR. If rd is x0, the read is skipped and no side-effects from reading occur."}
{"mnemonic": "CSRRS", "architecture": "RISC-V", "extension": "Zicsr", "full_name": "Control Status Register Read and Set", "summary": "Reads the value of the CSR into rd, then bitwise ORs the value in rs1 into the CSR (setting bits).", "syntax": "CSRRS rd, csr, rs1", "encoding": {"format": "I-Type", "binary_pattern": "csr | rs1 | 010 | rd | 1110011", "hex_opcode": "0x00002073", "visual_parts": [{"raw": "csr", "clean": "csr", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1110011", "clean": "1110011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "csr", "desc": "CSR Address"}, {"name": "rs1", "desc": "Bit Mask"}], "pseudocode": "t = CSRs[csr]; CSRs[csr] = t | R[rs1]; R[rd] = t;", "example": "CSRRS x0, sstatus, x5", "example_note": "Sets bits in 'sstatus' using mask in x5 (Result discarded).", "description": "CSRRS atomically reads CSR csr into rd, then sets the bits in the CSR that correspond to bits set in rs1. If rs1 is x0, no bits are modified."}
{"mnemonic": "DIV", "architecture": "RISC-V", "extension": "M", "full_name": "Divide", "summary": "Performs signed integer division.", "syntax": "DIV rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 100 | rd | 0110011", "hex_opcode": "0x02004033", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Quotient)"}, {"name": "rs1", "desc": "Dividend"}, {"name": "rs2", "desc": "Divisor"}], "pseudocode": "R[rd] = R[rs1] / R[rs2];", "example": "DIV x10, x11, x12", "example_note": "Signed division of x11 by x12.", "description": "DIV divides rs1 by rs2 using signed division and writes the quotient to rd, truncated toward zero. Division by zero yields -1; overflow (INT_MIN ÷ -1) yields INT_MIN."}
{"mnemonic": "DIVU", "architecture": "RISC-V", "extension": "M", "full_name": "Divide Unsigned", "summary": "Performs unsigned integer division.", "syntax": "DIVU rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 101 | rd | 0110011", "hex_opcode": "0x02005033", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Dividend"}, {"name": "rs2", "desc": "Divisor"}], "pseudocode": "R[rd] = R[rs1] /u R[rs2];", "example": "DIVU x5, x6, x7", "example_note": "Unsigned division.", "description": "DIVU divides rs1 by rs2 using unsigned division and writes the quotient to rd, truncated toward zero. Division by zero yields 2^XLEN - 1."}
{"mnemonic": "EBREAK", "architecture": "RISC-V", "full_name": "Environment Break", "summary": "Used by debuggers to cause control to be transferred back to a debugging environment.", "syntax": "EBREAK", "encoding": {"format": "I-Type", "binary_pattern": "00000000000100000000000001110011", "hex_opcode": "0x00100073", "visual_parts": [{"raw": "00000000000100000000000001110011", "clean": "00000000000100000000000001110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "RaiseException(Breakpoint);", "example": "EBREAK", "example_note": "Triggers a debugger breakpoint.", "extension": "RV32I", "description": "EBREAK causes a breakpoint exception to be raised, intended for use by debuggers. Execution is transferred to the appropriate trap handler."}
{"mnemonic": "FENCE", "architecture": "RISC-V", "full_name": "Fence", "summary": "Orders device I/O and memory accesses.", "syntax": "FENCE pred, succ", "encoding": {"format": "I-Type", "binary_pattern": "fm | pred | succ | rs1 | 000 | rd | 0001111", "hex_opcode": "0x0000000F", "visual_parts": [{"raw": "fm", "clean": "fm", "pos": "31:28"}, {"raw": "pred", "clean": "pred", "pos": "27:24"}, {"raw": "succ", "clean": "succ", "pos": "23:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0001111", "clean": "0001111", "pos": "6:0"}], "bit_positions": "31:28 | 27:24 | 23:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "pred", "desc": "Predecessor Set"}, {"name": "succ", "desc": "Successor Set"}], "pseudocode": "MemoryBarrier(pred, succ);", "example": "FENCE rw, rw", "example_note": "Ensures all previous reads/writes complete before subsequent reads/writes.", "extension": "RV32I", "description": "FENCE orders device I/O and memory accesses as viewed by other RISC-V harts and external devices. The predecessor and successor sets of operations are specified by the pred and succ fields. FENCE with all fields zero is a full memory fence."}
{"mnemonic": "FLW", "architecture": "RISC-V", "extension": "F", "full_name": "Float Load Word", "summary": "Loads a single-precision floating-point value from memory.", "syntax": "FLW rd, offset(rs1)", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 010 | rd | 0000111", "hex_opcode": "0x00002007", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0000111", "clean": "0000111", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Float Reg)"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "F[rd] = M[R[rs1] + sext(offset)][31:0];", "example": "FLW f1, 0(x10)", "example_note": "Loads float from address in x10 to f1.", "description": "Loads a 32-bit word from memory at address rs1+sext(offset) into floating-point register rd."}
{"mnemonic": "FSW", "architecture": "RISC-V", "extension": "F", "full_name": "Float Store Word", "summary": "Stores a single-precision floating-point value to memory.", "syntax": "FSW rs2, offset(rs1)", "encoding": {"format": "S-Type", "binary_pattern": "imm12hi | rs2 | rs1 | 010 | imm12lo | 0100111", "hex_opcode": "0x00002027", "visual_parts": [{"raw": "imm12hi", "clean": "imm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "imm12lo", "clean": "imm12lo", "pos": "11:7"}, {"raw": "0100111", "clean": "0100111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs2", "desc": "Src (Float Reg)"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[rs1] + sext(offset)] = F[rs2][31:0];", "example": "FSW f1, 4(x2)", "example_note": "Stores float in f1 to stack + 4.", "description": "Stores a floating-point register to memory at address rs1+sext(offset)."}
{"mnemonic": "FADD.S", "architecture": "RISC-V", "extension": "F", "full_name": "Float Add (Single)", "summary": "Performs single-precision floating-point addition.", "syntax": "FADD.S rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | rs1 | rm | rd | 1010011", "hex_opcode": "0x00000053", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "rm", "clean": "rm", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1010011", "clean": "1010011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "F[rd] = F[rs1] + F[rs2];", "example": "FADD.S f0, f1, f2", "example_note": "f0 = f1 + f2", "description": "Performs single-precision (32-bit) floating-point addition. The operation adds the source operand(s), rounds the result according to the dynamic rounding mode in fcsr, and writes to fd. NaN and infinity propagation follow IEEE 754-2008."}
{"mnemonic": "MUL", "architecture": "RISC-V", "extension": "M", "full_name": "Multiply", "summary": "Performs a 32-bit (or 64-bit) multiplication of rs1 and rs2 and stores the lower bits in rd.", "syntax": "MUL rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 000 | rd | 0110011", "hex_opcode": "0x02000033", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Lower Bits)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = (R[rs1] * R[rs2])[XLEN-1:0];", "example": "MUL x10, x11, x12", "example_note": "x10 = lower bits of x11 * x12.", "description": "MUL performs an XLEN-bit × XLEN-bit multiplication of rs1 and rs2 and writes the lower XLEN bits of the product to rd. Both operands are treated as signed or unsigned (the result is the same for the low bits)."}
{"mnemonic": "MULH", "architecture": "RISC-V", "extension": "M", "full_name": "Multiply High Signed", "summary": "Performs a signed multiplication and stores the upper bits of the result.", "syntax": "MULH rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 001 | rd | 0110011", "hex_opcode": "0x02001033", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Upper Bits)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = (sext(R[rs1]) * sext(R[rs2])) >> XLEN;", "example": "MULH x5, x6, x7", "example_note": "Get upper bits of signed multiplication.", "description": "MULH multiplies rs1 and rs2 as signed values and writes the upper XLEN bits of the 2×XLEN-bit product to rd."}
{"mnemonic": "MRET", "architecture": "RISC-V", "extension": "Privileged", "full_name": "Machine Return", "summary": "Returns from a machine-mode trap handler.", "syntax": "MRET", "encoding": {"format": "R-Type (System)", "binary_pattern": "00110000001000000000000001110011", "hex_opcode": "0x30200073", "visual_parts": [{"raw": "00110000001000000000000001110011", "clean": "00110000001000000000000001110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "PC = MEPC; Priv = MPP; MIE = MPIE;", "example": "MRET", "example_note": "Return to previous privilege level defined in mstatus.", "description": "MRET returns from a machine-level trap. It restores the PC from mepc, restores privilege from the MPP field of mstatus, and updates interrupt-enable and privilege fields in mstatus."}
{"mnemonic": "OR", "architecture": "RISC-V", "full_name": "Logical OR", "summary": "Performs a bitwise logical OR operation.", "syntax": "OR rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | rs1 | 110 | rd | 0110011", "hex_opcode": "0x00006033", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = R[rs1] | R[rs2];", "example": "OR x10, x11, x12", "example_note": "Bitwise OR of x11 and x12.", "extension": "RV32I", "description": "OR performs a bitwise logical OR of the values in rs1 and rs2, writing the result to rd."}
{"mnemonic": "ORI", "architecture": "RISC-V", "full_name": "Logical OR Immediate", "summary": "Performs a bitwise logical OR with a sign-extended immediate.", "syntax": "ORI rd, rs1, imm", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 110 | rd | 0010011", "hex_opcode": "0x00006013", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "R[rd] = R[rs1] | sext(imm);", "example": "ORI x10, x11, 1", "example_note": "Sets the lowest bit of x11.", "extension": "RV32I", "description": "ORI performs a bitwise OR of register rs1 with the sign-extended 12-bit immediate, writing the result to rd."}
{"mnemonic": "REM", "architecture": "RISC-V", "extension": "M", "full_name": "Remainder", "summary": "Computes the signed remainder of division.", "syntax": "REM rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000001 | rs2 | rs1 | 110 | rd | 0110011", "hex_opcode": "0x02006033", "visual_parts": [{"raw": "0000001", "clean": "0000001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Remainder)"}, {"name": "rs1", "desc": "Dividend"}, {"name": "rs2", "desc": "Divisor"}], "pseudocode": "R[rd] = R[rs1] % R[rs2];", "example": "REM x5, x6, x7", "example_note": "Signed remainder.", "description": "REM computes the signed remainder of rs1 ÷ rs2, writing the result to rd. The sign of the result equals the sign of the dividend (rs1). Remainder by zero yields the dividend; overflow (INT_MIN % -1) yields zero."}
{"mnemonic": "SB", "architecture": "RISC-V", "full_name": "Store Byte", "summary": "Stores the lowest 8 bits of a register to memory.", "syntax": "SB rs2, offset(rs1)", "encoding": {"format": "S-Type", "binary_pattern": "imm12hi | rs2 | rs1 | 000 | imm12lo | 0100011", "hex_opcode": "0x00000023", "visual_parts": [{"raw": "imm12hi", "clean": "imm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "imm12lo", "clean": "imm12lo", "pos": "11:7"}, {"raw": "0100011", "clean": "0100011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs2", "desc": "Source"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[rs1] + sext(offset)][7:0] = R[rs2][7:0];", "example": "SB x5, 0(x10)", "example_note": "Store low byte of x5 to address in x10.", "extension": "RV32I", "description": "SB stores the least-significant byte of rs2 to memory at address rs1+sext(offset)."}
{"mnemonic": "SH", "architecture": "RISC-V", "full_name": "Store Halfword", "summary": "Stores the lowest 16 bits of a register to memory.", "syntax": "SH rs2, offset(rs1)", "encoding": {"format": "S-Type", "binary_pattern": "imm12hi | rs2 | rs1 | 001 | imm12lo | 0100011", "hex_opcode": "0x00001023", "visual_parts": [{"raw": "imm12hi", "clean": "imm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "imm12lo", "clean": "imm12lo", "pos": "11:7"}, {"raw": "0100011", "clean": "0100011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs2", "desc": "Source"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[rs1] + sext(offset)][15:0] = R[rs2][15:0];", "example": "SH x5, 4(x10)", "example_note": "Store halfword.", "extension": "RV32I", "description": "SH stores the least-significant halfword (16 bits) of rs2 to memory at address rs1+sext(offset)."}
{"mnemonic": "SW", "architecture": "RISC-V", "full_name": "Store Word", "summary": "Stores a 32-bit word to memory.", "syntax": "SW rs2, offset(rs1)", "encoding": {"format": "S-Type", "binary_pattern": "imm12hi | rs2 | rs1 | 010 | imm12lo | 0100011", "hex_opcode": "0x00002023", "visual_parts": [{"raw": "imm12hi", "clean": "imm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "imm12lo", "clean": "imm12lo", "pos": "11:7"}, {"raw": "0100011", "clean": "0100011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs2", "desc": "Source"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[rs1] + sext(offset)][31:0] = R[rs2][31:0];", "example": "SW x5, 8(x10)", "example_note": "Store word.", "extension": "RV32I", "description": "SW stores the least-significant 32-bit word of rs2 to memory at address rs1+sext(offset)."}
{"mnemonic": "SD", "architecture": "RISC-V", "extension": "RV64I", "full_name": "Store Doubleword", "summary": "Stores a 64-bit doubleword to memory.", "syntax": "SD rs2, offset(rs1)", "encoding": {"format": "S-Type", "binary_pattern": "imm12hi | rs2 | rs1 | 011 | imm12lo | 0100011", "hex_opcode": "0x00003023", "visual_parts": [{"raw": "imm12hi", "clean": "imm12hi", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "imm12lo", "clean": "imm12lo", "pos": "11:7"}, {"raw": "0100011", "clean": "0100011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rs2", "desc": "Source"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Offset"}], "pseudocode": "M[R[rs1] + sext(offset)][63:0] = R[rs2][63:0];", "example": "SD x5, 16(x10)", "example_note": "Store 64-bit value.", "description": "SD stores the 64-bit doubleword in rs2 to memory at address rs1+sext(offset)."}
{"mnemonic": "SLL", "architecture": "RISC-V", "full_name": "Shift Left Logical", "summary": "Shifts a register left by the number of bits specified in another register.", "syntax": "SLL rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | rs1 | 001 | rd | 0110011", "hex_opcode": "0x00001033", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Shift Amount"}], "pseudocode": "R[rd] = R[rs1] << (R[rs2] & 0x1F);", "example": "SLL x10, x11, x12", "example_note": "Shift x11 left by x12.", "extension": "RV32I", "description": "SLL performs a logical left shift of the value in rs1 by the shift amount held in the lower 5 bits of rs2 (or 6 bits in RV64I), writing the result to rd. Zeros are shifted into the low-order bits."}
{"mnemonic": "SLLI", "architecture": "RISC-V", "full_name": "Shift Left Logical Immediate", "summary": "Shifts a register left by a constant amount.", "syntax": "SLLI rd, rs1, shamt", "encoding": {"format": "I-Type (Shift)", "binary_pattern": "000000 | shamtd | rs1 | 001 | rd | 0010011", "hex_opcode": "0x00001013", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "shamtd", "clean": "shamtd", "pos": "25:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:26 | 25:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "shamt", "desc": "Shift Amount"}], "pseudocode": "R[rd] = R[rs1] << shamt;", "example": "SLLI x10, x11, 2", "example_note": "Multiply x11 by 4.", "extension": "RV32I", "description": "SLLI is a logical left shift by the constant encoded in the immediate field. The shift amount is the lower 5 bits (RV32I) or 6 bits (RV64I) of the immediate. Zeros are shifted into low-order bits."}
{"mnemonic": "SRL", "architecture": "RISC-V", "full_name": "Shift Right Logical", "summary": "Shifts a register right, shifting in zeros.", "syntax": "SRL rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | rs1 | 101 | rd | 0110011", "hex_opcode": "0x00005033", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Shift Amount"}], "pseudocode": "R[rd] = R[rs1] >> (R[rs2] & 0x1F);", "example": "SRL x10, x11, x12", "example_note": "Logical right shift.", "extension": "RV32I", "description": "SRL performs a logical right shift of the value in rs1 by the shift amount held in the lower 5 bits of rs2 (or 6 bits in RV64I), writing the result to rd. Zeros are shifted into the high-order bits."}
{"mnemonic": "SRA", "architecture": "RISC-V", "full_name": "Shift Right Arithmetic", "summary": "Shifts a register right, preserving the sign bit.", "syntax": "SRA rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0100000 | rs2 | rs1 | 101 | rd | 0110011", "hex_opcode": "0x40005033", "visual_parts": [{"raw": "0100000", "clean": "0100000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "rs2", "desc": "Shift Amount"}], "pseudocode": "R[rd] = R[rs1] >>s (R[rs2] & 0x1F);", "example": "SRA x10, x11, x12", "example_note": "Arithmetic right shift (sign preserved).", "extension": "RV32I", "description": "SRA performs an arithmetic right shift of the value in rs1 by the shift amount held in the lower 5 bits of rs2 (or 6 bits in RV64I), writing the result to rd. The original sign bit is copied into the vacated upper bits."}
{"mnemonic": "SLT", "architecture": "RISC-V", "full_name": "Set Less Than", "summary": "Sets rd to 1 if rs1 < rs2 (signed), otherwise 0.", "syntax": "SLT rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | rs1 | 010 | rd | 0110011", "hex_opcode": "0x00002033", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = (R[rs1] <s R[rs2]) ? 1 : 0;", "example": "SLT x5, x6, x7", "example_note": "Check if x6 < x7.", "extension": "RV32I", "description": "SLT performs a signed comparison of rs1 and rs2, writing 1 to rd if rs1 < rs2 (signed), and 0 otherwise."}
{"mnemonic": "SLTI", "architecture": "RISC-V", "full_name": "Set Less Than Immediate", "summary": "Sets rd to 1 if rs1 < immediate (signed), otherwise 0.", "syntax": "SLTI rd, rs1, imm", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 010 | rd | 0010011", "hex_opcode": "0x00002013", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "R[rd] = (R[rs1] <s sext(imm)) ? 1 : 0;", "example": "SLTI x5, x6, 10", "example_note": "Check if x6 < 10.", "extension": "RV32I", "description": "SLTI places 1 in rd if rs1 is less than the sign-extended 12-bit immediate when both are treated as signed numbers, else 0."}
{"mnemonic": "SC.W", "architecture": "RISC-V", "extension": "A", "full_name": "Store Conditional Word", "summary": "Conditionally stores a word to memory if the reservation (from LR) is still valid.", "syntax": "SC.W rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "00011 | aq | rl | rs2 | rs1 | 010 | rd | 0101111", "hex_opcode": "0x1800202F", "visual_parts": [{"raw": "00011", "clean": "00011", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Success/Fail)"}, {"name": "rs2", "desc": "Source Value"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "if (ReservationValid) { M[R[rs1]] = R[rs2]; R[rd] = 0; } else { R[rd] = 1; }", "example": "SC.W x10, x11, (x12)", "example_note": "Try to store x11 to x12. x10=0 on success.", "description": "SC.W conditionally stores the word in rs2 to the address in rs1, only if the reservation set by LR.W is still valid. It writes 0 to rd on success and a non-zero value on failure."}
{"mnemonic": "SFENCE.VMA", "architecture": "RISC-V", "extension": "Privileged", "full_name": "Supervisor Fence Virtual Memory", "summary": "Synchronizes updates to in-memory address translation data structures (TLB flush).", "syntax": "SFENCE.VMA rs1, rs2", "encoding": {"format": "R-Type (System)", "binary_pattern": "0001001 | rs2 | rs1 | 000000001110011", "hex_opcode": "0x12000073", "visual_parts": [{"raw": "0001001", "clean": "0001001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000000001110011", "clean": "000000001110011", "pos": "14:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:0"}, "operands": [{"name": "rs1", "desc": "Virtual Address (optional)"}, {"name": "rs2", "desc": "ASID (optional)"}], "pseudocode": "Fence(PageTable);", "example": "SFENCE.VMA x0, x0", "example_note": "Flush all TLB entries.", "description": "SFENCE.VMA is a fence for virtual memory management. It guarantees that preceding stores to the page table are visible to subsequent page-table walks. The rs1 and rs2 operands optionally restrict the fence to a specific virtual address and ASID."}
{"mnemonic": "SRET", "architecture": "RISC-V", "extension": "Privileged", "full_name": "Supervisor Return", "summary": "Returns from a supervisor-mode trap handler.", "syntax": "SRET", "encoding": {"format": "R-Type (System)", "binary_pattern": "00010000001000000000000001110011", "hex_opcode": "0x10200073", "visual_parts": [{"raw": "00010000001000000000000001110011", "clean": "00010000001000000000000001110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "PC = SEPC; Priv = SPP; SIE = SPIE;", "example": "SRET", "example_note": "Return from exception/interrupt in supervisor mode.", "description": "SRET returns from a supervisor-level trap. It restores the PC from sepc, restores privilege from the SPP field of sstatus, and updates interrupt-enable fields."}
{"mnemonic": "WFI", "architecture": "RISC-V", "extension": "Privileged", "full_name": "Wait for Interrupt", "summary": "Provides a hint to the implementation that the current hart can be stalled until an interrupt occurs.", "syntax": "WFI", "encoding": {"format": "R-Type (System)", "binary_pattern": "00010000010100000000000001110011", "hex_opcode": "0x10500073", "visual_parts": [{"raw": "00010000010100000000000001110011", "clean": "00010000010100000000000001110011", "pos": "31:0"}], "bit_positions": "31:0"}, "operands": [], "pseudocode": "while(!Interrupt) { /* low power state */ }", "example": "WFI", "example_note": "Pause execution until interrupt.", "description": "WFI (Wait For Interrupt) provides a hint to the implementation that the current hart can be stalled until an interrupt might need servicing. Implementations may simply implement WFI as NOP."}
{"mnemonic": "XOR", "architecture": "RISC-V", "full_name": "Logical XOR", "summary": "Performs a bitwise logical Exclusive-OR operation.", "syntax": "XOR rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | rs1 | 100 | rd | 0110011", "hex_opcode": "0x00004033", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source register 1 (integer)"}, {"name": "rs2", "desc": "Source register 2 (integer)"}], "pseudocode": "R[rd] = R[rs1] ^ R[rs2];", "example": "XOR x10, x11, x12", "example_note": "x10 = x11 ^ x12", "extension": "RV32I", "description": "XOR performs a bitwise logical exclusive-OR of the values in rs1 and rs2, writing the result to rd."}
{"mnemonic": "XORI", "architecture": "RISC-V", "full_name": "Logical XOR Immediate", "summary": "Performs a bitwise logical Exclusive-OR with a sign-extended immediate.", "syntax": "XORI rd, rs1, imm", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 100 | rd | 0010011", "hex_opcode": "0x00004013", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination register (integer)"}, {"name": "rs1", "desc": "Source"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "R[rd] = R[rs1] ^ sext(imm);", "example": "XORI x10, x11, -1", "example_note": "Bitwise invert (NOT) x11.", "extension": "RV32I", "description": "XORI performs a bitwise XOR of register rs1 with the sign-extended 12-bit immediate, writing the result to rd. XORI rd, rs1, -1 performs a bitwise logical inversion of rs1 (assembler pseudoinstruction NOT rd, rs)."}
{"mnemonic": "HFENCE.GVMA", "architecture": "RISC-V", "extension": "H", "full_name": "Hypervisor Fence Guest Virtual Memory Address", "summary": "Synchronizes updates to guest physical address translation data structures.", "syntax": "HFENCE.GVMA rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0110001 | rs2 | rs1 | 000000001110011", "hex_opcode": "0x62000073", "visual_parts": [{"raw": "0110001", "clean": "0110001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000000001110011", "clean": "000000001110011", "pos": "14:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:0"}, "operands": [{"name": "rs1", "desc": "Guest Virtual Address (optional)"}, {"name": "rs2", "desc": "Guest ASID (optional)"}], "pseudocode": "Fence(GuestPageTable);", "example": "HFENCE.GVMA x0, x0", "example_note": "Flush all guest TLB entries.", "description": "HFENCE.GVMA orders implicit reads and writes to G-stage page tables, ensuring preceding stores to the second-stage page table are visible to subsequent VS-mode address translations. rs1 optionally restricts the fence to a guest physical address; rs2 optionally restricts it to a VMID."}
{"mnemonic": "HFENCE.VVMA", "architecture": "RISC-V", "extension": "H", "full_name": "Hypervisor Fence Virtual Virtual Memory Address", "summary": "Synchronizes updates to VS-stage address translation data structures.", "syntax": "HFENCE.VVMA rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0010001 | rs2 | rs1 | 000000001110011", "hex_opcode": "0x22000073", "visual_parts": [{"raw": "0010001", "clean": "0010001", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000000001110011", "clean": "000000001110011", "pos": "14:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:0"}, "operands": [{"name": "rs1", "desc": "Virtual Address (optional)"}, {"name": "rs2", "desc": "ASID (optional)"}], "pseudocode": "Fence(VS-StagePageTable);", "example": "HFENCE.VVMA x10, x0", "example_note": "Flush TLB entries for address in x10.", "description": "HFENCE.VVMA orders implicit reads and writes to VS-stage page tables for the current VMID. rs1 optionally restricts to a virtual address; rs2 to an ASID."}
{"mnemonic": "JAL", "architecture": "RISC-V", "full_name": "Jump and Link", "summary": "Jumps to an offset relative to PC and saves the return address (PC+4) to rd.", "syntax": "JAL rd, offset", "encoding": {"format": "J-Type", "binary_pattern": "jimm20 | rd | 1101111", "hex_opcode": "0x0000006F", "visual_parts": [{"raw": "jimm20", "clean": "jimm20", "pos": "31:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1101111", "clean": "1101111", "pos": "6:0"}], "bit_positions": "31:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Return Address Dest"}, {"name": "offset", "desc": "20-bit PC-relative Offset"}], "pseudocode": "R[rd] = PC + 4; PC += sext(offset);", "example": "JAL x1, loop_target", "example_note": "Jump to 'loop_target' and save return address in x1 (ra).", "extension": "RV32I", "description": "JAL (Jump and Link) adds the sign-extended J-immediate (encoded in multiples of 2 bytes) to the PC of the JAL instruction to form the jump target, stores PC+4 into rd as a return address, then jumps. Plain unconditional jumps use rd=x0."}
{"mnemonic": "JALR", "architecture": "RISC-V", "full_name": "Jump and Link Register", "summary": "Jumps to address in rs1 + offset, saving return address to rd.", "syntax": "JALR rd, offset(rs1)", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 000 | rd | 1100111", "hex_opcode": "0x00000067", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "1100111", "clean": "1100111", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Return Address Dest"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "12-bit Immediate"}], "pseudocode": "t = PC + 4; PC = (R[rs1] + sext(offset)) & ~1; R[rd] = t;", "example": "JALR x0, 0(x1)", "example_note": "Return from function (jumps to address in x1/ra).", "extension": "RV32I", "description": "JALR (Jump and Link Register) computes a target address by adding the sign-extended 12-bit immediate to rs1, then clears the least-significant bit of the result. It writes the address of the following instruction (PC+4) to rd, then jumps to the target."}
{"mnemonic": "LB", "architecture": "RISC-V", "full_name": "Load Byte", "summary": "Loads an 8-bit byte from memory and sign-extends it to the register width.", "syntax": "LB rd, offset(rs1)", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 000 | rd | 0000011", "hex_opcode": "0x00000003", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0000011", "clean": "0000011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Byte Offset"}], "pseudocode": "R[rd] = sext(M[R[rs1] + sext(offset)][7:0]);", "example": "LB x10, 0(x2)", "example_note": "Load byte from stack pointer (x2) into x10.", "extension": "RV32I", "description": "LB loads a byte from memory at address rs1+sext(offset), sign-extends it to XLEN bits, and writes it to rd."}
{"mnemonic": "LH", "architecture": "RISC-V", "full_name": "Load Halfword", "summary": "Loads a 16-bit halfword from memory and sign-extends it.", "syntax": "LH rd, offset(rs1)", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 001 | rd | 0000011", "hex_opcode": "0x00001003", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "001", "clean": "001", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0000011", "clean": "0000011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Byte Offset"}], "pseudocode": "R[rd] = sext(M[R[rs1] + sext(offset)][15:0]);", "example": "LH x5, 4(x10)", "example_note": "Load halfword from address x10+4.", "extension": "RV32I", "description": "LH loads a halfword (16 bits) from memory at address rs1+sext(offset), sign-extends it to XLEN bits, and writes it to rd."}
{"mnemonic": "LW", "architecture": "RISC-V", "full_name": "Load Word", "summary": "Loads a 32-bit word from memory and sign-extends it to 64 bits.", "syntax": "LW rd, offset(rs1)", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 010 | rd | 0000011", "hex_opcode": "0x00002003", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0000011", "clean": "0000011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Byte Offset"}], "pseudocode": "R[rd] = sext(M[R[rs1] + sext(offset)][31:0]);", "example": "LW x6, 12(x2)", "example_note": "Load 32-bit word from stack offset 12.", "extension": "RV32I", "description": "LW loads a 32-bit word from memory at address rs1+sext(offset). In RV32I the result is written directly to rd; in RV64I it is sign-extended to 64 bits before being written."}
{"mnemonic": "LBU", "architecture": "RISC-V", "full_name": "Load Byte Unsigned", "summary": "Loads an 8-bit byte from memory and zero-extends it.", "syntax": "LBU rd, offset(rs1)", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 100 | rd | 0000011", "hex_opcode": "0x00004003", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "100", "clean": "100", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0000011", "clean": "0000011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Byte Offset"}], "pseudocode": "R[rd] = zext(M[R[rs1] + sext(offset)][7:0]);", "example": "LBU x10, 0(x2)", "example_note": "Load byte and zero-extend.", "extension": "RV32I", "description": "LBU loads a byte from memory at address rs1+sext(offset), zero-extends it to XLEN bits, and writes it to rd."}
{"mnemonic": "LHU", "architecture": "RISC-V", "full_name": "Load Halfword Unsigned", "summary": "Loads a 16-bit halfword from memory and zero-extends it.", "syntax": "LHU rd, offset(rs1)", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 101 | rd | 0000011", "hex_opcode": "0x00005003", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "101", "clean": "101", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0000011", "clean": "0000011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Byte Offset"}], "pseudocode": "R[rd] = zext(M[R[rs1] + sext(offset)][15:0]);", "example": "LHU x5, 4(x10)", "example_note": "Load halfword and zero-extend.", "extension": "RV32I", "description": "LHU loads a halfword (16 bits) from memory at address rs1+sext(offset), zero-extends it to XLEN bits, and writes it to rd."}
{"mnemonic": "LD", "architecture": "RISC-V", "extension": "RV64I", "full_name": "Load Doubleword", "summary": "Loads a 64-bit doubleword from memory.", "syntax": "LD rd, offset(rs1)", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 011 | rd | 0000011", "hex_opcode": "0x00003003", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0000011", "clean": "0000011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Byte Offset"}], "pseudocode": "R[rd] = M[R[rs1] + sext(offset)][63:0];", "example": "LD x1, 0(x2)", "example_note": "Load 64-bit value from stack.", "description": "LD loads a 64-bit doubleword from memory at address rs1+sext(offset) and writes it to rd."}
{"mnemonic": "LWU", "architecture": "RISC-V", "extension": "RV64I", "full_name": "Load Word Unsigned", "summary": "Loads a 32-bit word from memory and zero-extends it to 64 bits.", "syntax": "LWU rd, offset(rs1)", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 110 | rd | 0000011", "hex_opcode": "0x00006003", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "110", "clean": "110", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0000011", "clean": "0000011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Base Address"}, {"name": "offset", "desc": "Byte Offset"}], "pseudocode": "R[rd] = zext(M[R[rs1] + sext(offset)][31:0]);", "example": "LWU x6, 12(x2)", "example_note": "Load 32-bit word and zero-extend to 64-bit.", "description": "LWU loads a 32-bit word from memory at address rs1+sext(offset), zero-extends it to 64 bits, and writes it to rd. Unlike LW, it does not sign-extend."}
{"mnemonic": "LUI", "architecture": "RISC-V", "full_name": "Load Upper Immediate", "summary": "Loads the 20-bit immediate into the upper 20 bits of the register (lower 12 bits are zero).", "syntax": "LUI rd, imm", "encoding": {"format": "U-Type", "binary_pattern": "imm20 | rd | 0110111", "hex_opcode": "0x00000037", "visual_parts": [{"raw": "imm20", "clean": "imm20", "pos": "31:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110111", "clean": "0110111", "pos": "6:0"}], "bit_positions": "31:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "imm", "desc": "20-bit Upper Immediate"}], "pseudocode": "R[rd] = imm << 12;", "example": "LUI x10, 0x12345", "example_note": "Puts 0x12345000 into x10.", "extension": "RV32I", "description": "LUI (Load Upper Immediate) places the 20-bit U-immediate into bits 31:12 of rd, filling bits 11:0 with zeros and sign-extending to XLEN bits. It is used together with ADDI to build arbitrary 32-bit constants."}
{"mnemonic": "LR.W", "architecture": "RISC-V", "extension": "A", "full_name": "Load Reserved Word", "summary": "Loads a word from memory and registers a reservation set for the address.", "syntax": "LR.W rd, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "00010 | aq | rl | 00000 | rs1 | 010 | rd | 0101111", "hex_opcode": "0x1000202F", "visual_parts": [{"raw": "00010", "clean": "00010", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "R[rd] = LoadReserved32(M[R[rs1]]);", "example": "LR.W x10, (x11)", "example_note": "Start atomic read-modify-write sequence.", "description": "LR.W loads a word from the memory address in rs1 into rd and registers a reservation on that address. The reservation is used by SC.W to implement load-reserved/store-conditional atomics."}
{"mnemonic": "LR.D", "architecture": "RISC-V", "extension": "A", "full_name": "Load Reserved Doubleword", "summary": "Loads a doubleword from memory and registers a reservation set.", "syntax": "LR.D rd, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "00010 | aq | rl | 00000 | rs1 | 011 | rd | 0101111", "hex_opcode": "0x1000302F", "visual_parts": [{"raw": "00010", "clean": "00010", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "00000", "clean": "00000", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "R[rd] = LoadReserved64(M[R[rs1]]);", "example": "LR.D x10, (x11)", "example_note": "64-bit atomic load reserved.", "description": "LR.D loads a doubleword from the memory address in rs1 into rd and registers a reservation on that address (RV64 only)."}
{"mnemonic": "VMSGT.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Greater Than (Signed)", "summary": "Sets mask if vs2 > vs1.", "syntax": "VMSGT.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "011011 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x6C000057", "visual_parts": [{"raw": "011111", "clean": "011111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "vd = (vs2 > vs1);", "description": "Compares elements element-wise for greater than and writes a mask result to vd.", "example": "VMSGT.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMSGTU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Greater Than (Unsigned)", "summary": "Sets mask if vs2 > vs1 (Unsigned).", "syntax": "VMSGTU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "011010 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x68000057", "visual_parts": [{"raw": "011111", "clean": "011111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "vd = (vs2 >u vs1);", "description": "Compares elements element-wise for greater than and writes a mask result to vd.", "example": "VMSGTU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMSLE.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Less or Equal (Signed)", "summary": "Sets mask if vs2 <= vs1.", "syntax": "VMSLE.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "011101 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x74000057", "visual_parts": [{"raw": "011101", "clean": "011101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "vd = (vs2 <= vs1);", "description": "Compares elements element-wise for less than or equal and writes a mask result to vd.", "example": "VMSLE.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMSLEU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Less or Equal (Unsigned)", "summary": "Sets mask if vs2 <= vs1 (Unsigned).", "syntax": "VMSLEU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "011100 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x70000057", "visual_parts": [{"raw": "011100", "clean": "011100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "vd = (vs2 <=u vs1);", "description": "Compares elements element-wise for less than or equal and writes a mask result to vd.", "example": "VMSLEU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMSGE.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Greater or Equal (Signed)", "summary": "Sets mask if vs2 >= vs1.", "syntax": "VMSGE.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "011101 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x74000057", "visual_parts": [{"raw": "011111", "clean": "011111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "vd = (vs2 >= vs1);", "description": "Compares elements element-wise for greater than or equal and writes a mask result to vd.", "example": "VMSGE.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMSGEU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Greater or Equal (Unsigned)", "summary": "Sets mask if vs2 >= vs1 (Unsigned).", "syntax": "VMSGEU.VV vd, vs2, vs1, vm", "encoding": {"format": "OPIVV", "binary_pattern": "011100 | vm | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x70000057", "visual_parts": [{"raw": "011111", "clean": "011111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "vd = (vs2 >=u vs1);", "description": "Compares elements element-wise for greater than or equal and writes a mask result to vd.", "example": "VMSGEU.VV v1, v4, v2, v0.t"}
{"mnemonic": "VMADC.VIM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Add with Carry Immediate", "summary": "Add Immediate with Carry.", "syntax": "VMADC.VIM vd, vs2, imm, v0", "encoding": {"format": "OPIVI", "binary_pattern": "0100010 | vs2 | simm5 | 011 | vd | 1010111", "hex_opcode": "0x44003057", "visual_parts": [{"raw": "0100010", "clean": "0100010", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "simm5", "clean": "simm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Carry Out"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Imm"}], "pseudocode": "vd = carry(vs2 + imm + v0);", "description": "Vector Mask Add with Carry Immediate: Add Immediate with Carry. Operation: vd = carry(vs2 + imm + v0);.", "example": "VMADC.VIM v1, v4, 16, v0"}
{"mnemonic": "VWMACCSU.VV", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening MAC (Signed * Unsigned)", "summary": "vd = vd + (signed(vs1) * unsigned(vs2)).", "syntax": "VWMACCSU.VV vd, vs1, vs2, vm", "encoding": {"format": "OPIVV", "binary_pattern": "111111 | vm | vs2 | vs1 | 010 | vd | 1010111", "hex_opcode": "0xFC002057", "visual_parts": [{"raw": "111111", "clean": "111111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Acc"}, {"name": "vs1", "desc": "Signed"}, {"name": "vs2", "desc": "Unsigned"}], "pseudocode": "vd += sext(vs1) * zext(vs2);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWMACCSU.VV v1, v2, v4, v0.t"}
{"mnemonic": "VWMACCUS.VX", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Widening MAC (Unsigned * Signed)", "summary": "vd = vd + (unsigned(vs1) * signed(vs2)).", "syntax": "VWMACCUS.VX vd, rs1, vs2, vm", "encoding": {"format": "OPMVX", "binary_pattern": "111110 | vm | vs2 | rs1 | 110 | vd | 1010111", "hex_opcode": "0xF8006057", "visual_parts": [{"raw": "111110", "clean": "111110", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Acc"}, {"name": "vs1", "desc": "Unsigned"}, {"name": "vs2", "desc": "Signed"}], "pseudocode": "vd += zext(vs1) * sext(vs2);", "description": "Performs a widening operation, producing results twice as wide as the source elements. Results are written to vd using 2× the element grouping (EEW). The number of elements and masking are governed by vl and vm.", "example": "VWMACCUS.VX v1, x10, v2, v0.t"}
{"mnemonic": "VADC.VVM", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Add with Carry", "summary": "Computes vd = vs1 + vs2 + carry (v0).", "syntax": "VADC.VVM vd, vs2, vs1, v0", "encoding": {"format": "OPIVV", "binary_pattern": "0100000 | vs2 | vs1 | 000 | vd | 1010111", "hex_opcode": "0x40000057", "visual_parts": [{"raw": "0100000", "clean": "0100000", "pos": "31:25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "vs1", "clean": "vs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "vs1", "desc": "Source vector register 1"}], "pseudocode": "vd = vs1 + vs2 + v0;", "description": "Vector Add with Carry: Computes vd = vs1 + vs2 + carry (v0). Operation: vd = vs1 + vs2 + v0;.", "example": "VADC.VVM v1, v4, v2, v0"}
{"mnemonic": "VADD.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Add Immediate", "summary": "Adds immediate to vector.", "syntax": "VADD.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "000000 | vm | vs2 | simm5 | 011 | vd | 1010111", "hex_opcode": "0x00003057", "visual_parts": [{"raw": "000000", "clean": "000000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "simm5", "clean": "simm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Imm"}], "pseudocode": "vd = vs2 + imm;", "description": "Performs element-wise integer addition on a vector and an immediate, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VADD.VI v1, v4, 16, v0.t"}
{"mnemonic": "VRSUB.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Reverse Subtract Immediate", "summary": "Computes vd = imm - vs2.", "syntax": "VRSUB.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "000011 | vm | vs2 | simm5 | 011 | vd | 1010111", "hex_opcode": "0x0C003057", "visual_parts": [{"raw": "000011", "clean": "000011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "simm5", "clean": "simm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Imm"}], "pseudocode": "vd = imm - vs2;", "description": "Performs element-wise reverse integer subtraction on a vector and an immediate, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VRSUB.VI v1, v4, 16, v0.t"}
{"mnemonic": "VAND.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector AND Immediate", "summary": "Bitwise AND with immediate.", "syntax": "VAND.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "001001 | vm | vs2 | simm5 | 011 | vd | 1010111", "hex_opcode": "0x24003057", "visual_parts": [{"raw": "001001", "clean": "001001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "simm5", "clean": "simm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Imm"}], "pseudocode": "vd = vs2 & imm;", "description": "Performs element-wise bitwise AND on a vector and an immediate, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VAND.VI v1, v4, 16, v0.t"}
{"mnemonic": "VOR.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector OR Immediate", "summary": "Bitwise OR with immediate.", "syntax": "VOR.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "001010 | vm | vs2 | simm5 | 011 | vd | 1010111", "hex_opcode": "0x28003057", "visual_parts": [{"raw": "001010", "clean": "001010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "simm5", "clean": "simm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Imm"}], "pseudocode": "vd = vs2 | imm;", "description": "Performs element-wise bitwise OR on a vector and an immediate, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VOR.VI v1, v4, 16, v0.t"}
{"mnemonic": "VXOR.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector XOR Immediate", "summary": "Bitwise XOR with immediate.", "syntax": "VXOR.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "001011 | vm | vs2 | simm5 | 011 | vd | 1010111", "hex_opcode": "0x2C003057", "visual_parts": [{"raw": "001011", "clean": "001011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "simm5", "clean": "simm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Imm"}], "pseudocode": "vd = vs2 ^ imm;", "description": "Performs element-wise bitwise XOR on a vector and an immediate, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VXOR.VI v1, v4, 16, v0.t"}
{"mnemonic": "VRGATHER.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Register Gather Immediate", "summary": "Gathers element at index 'imm' from vs2 (splat).", "syntax": "VRGATHER.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "001100 | vm | vs2 | zimm5 | 011 | vd | 1010111", "hex_opcode": "0x30003057", "visual_parts": [{"raw": "001100", "clean": "001100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Table"}, {"name": "imm", "desc": "Index"}], "pseudocode": "vd[*] = vs2[imm];", "description": "Gathers elements from vs2 using indices in vs1 (or an immediate), writing to vd. Out-of-range indices produce zero.", "example": "VRGATHER.VI v1, v4, 16, v0.t"}
{"mnemonic": "VSLIDEUP.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Slide Up Immediate", "summary": "Moves elements up by immediate amount.", "syntax": "VSLIDEUP.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "001110 | vm | vs2 | zimm5 | 011 | vd | 1010111", "hex_opcode": "0x38003057", "visual_parts": [{"raw": "001110", "clean": "001110", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "vd[i] = vs2[i - imm];", "description": "Slides vector elements up by the specified offset, filling vacated positions with zero or the value from vs1[0].", "example": "VSLIDEUP.VI v1, v4, 16, v0.t"}
{"mnemonic": "VSLIDEDOWN.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Slide Down Immediate", "summary": "Moves elements down by immediate amount.", "syntax": "VSLIDEDOWN.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "001111 | vm | vs2 | zimm5 | 011 | vd | 1010111", "hex_opcode": "0x3C003057", "visual_parts": [{"raw": "001111", "clean": "001111", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "vd[i] = vs2[i + imm];", "description": "Slides vector elements down by the specified offset, filling vacated positions with zero or the value from vs1[0].", "example": "VSLIDEDOWN.VI v1, v4, 16, v0.t"}
{"mnemonic": "VMSEQ.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Equal Immediate", "summary": "Sets mask if element == imm.", "syntax": "VMSEQ.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "011000 | vm | vs2 | simm5 | 011 | vd | 1010111", "hex_opcode": "0x60003057", "visual_parts": [{"raw": "011000", "clean": "011000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "simm5", "clean": "simm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Val"}], "pseudocode": "vd = (vs2 == imm);", "description": "Compares elements element-wise for equal and writes a mask result to vd.", "example": "VMSEQ.VI v1, v4, 16, v0.t"}
{"mnemonic": "VMSNE.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Not Equal Immediate", "summary": "Sets mask if element != imm.", "syntax": "VMSNE.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "011001 | vm | vs2 | simm5 | 011 | vd | 1010111", "hex_opcode": "0x64003057", "visual_parts": [{"raw": "011001", "clean": "011001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "simm5", "clean": "simm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Val"}], "pseudocode": "vd = (vs2 != imm);", "description": "Compares elements element-wise for not equal and writes a mask result to vd.", "example": "VMSNE.VI v1, v4, 16, v0.t"}
{"mnemonic": "VMSLE.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Less or Equal Immediate", "summary": "Sets mask if element <= imm (Signed).", "syntax": "VMSLE.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "011101 | vm | vs2 | simm5 | 011 | vd | 1010111", "hex_opcode": "0x74003057", "visual_parts": [{"raw": "011101", "clean": "011101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "simm5", "clean": "simm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Val"}], "pseudocode": "vd = (vs2 <= imm);", "description": "Compares elements element-wise for less than or equal and writes a mask result to vd.", "example": "VMSLE.VI v1, v4, 16, v0.t"}
{"mnemonic": "VMSLEU.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Less or Equal Unsigned Immediate", "summary": "Sets mask if element <= imm (Unsigned).", "syntax": "VMSLEU.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "011100 | vm | vs2 | simm5 | 011 | vd | 1010111", "hex_opcode": "0x70003057", "visual_parts": [{"raw": "011100", "clean": "011100", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "simm5", "clean": "simm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Val"}], "pseudocode": "vd = (vs2 <=u imm);", "description": "Compares elements element-wise for less than or equal and writes a mask result to vd.", "example": "VMSLEU.VI v1, v4, 16, v0.t"}
{"mnemonic": "VMSLT.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Less Than Immediate", "summary": "Sets mask if element < imm (Signed).", "syntax": "VMSLT.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "011011 | vm | vs2 | imm | 011 | vd | 1010111", "hex_opcode": "0x74003057", "visual_parts": [{"raw": "011011", "clean": "011011", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "imm", "clean": "imm", "pos": ""}, {"raw": "011", "clean": "011", "pos": "19:17"}, {"raw": "vd", "clean": "vd", "pos": "16:12"}, {"raw": "1010111", "clean": "1010111", "pos": "11:5"}], "bit_positions": "31:26 | 25 | 24:20 |  | 19:17 | 16:12 | 11:5"}, "operands": [{"name": "vd", "desc": "Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Val"}], "pseudocode": "vd = (vs2 < imm);", "description": "Compares elements element-wise for less than and writes a mask result to vd.", "example": "VMSLT.VI v1, v4, 16, v0.t"}
{"mnemonic": "VMSLTU.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Mask Set Less Than Unsigned Immediate", "summary": "Sets mask if element < imm (Unsigned).", "syntax": "VMSLTU.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "011010 | vm | vs2 | imm | 011 | vd | 1010111", "hex_opcode": "0x70003057", "visual_parts": [{"raw": "011010", "clean": "011010", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "imm", "clean": "imm", "pos": ""}, {"raw": "011", "clean": "011", "pos": "19:17"}, {"raw": "vd", "clean": "vd", "pos": "16:12"}, {"raw": "1010111", "clean": "1010111", "pos": "11:5"}], "bit_positions": "31:26 | 25 | 24:20 |  | 19:17 | 16:12 | 11:5"}, "operands": [{"name": "vd", "desc": "Mask"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Val"}], "pseudocode": "vd = (vs2 <u imm);", "description": "Compares elements element-wise for less than and writes a mask result to vd.", "example": "VMSLTU.VI v1, v4, 16, v0.t"}
{"mnemonic": "VSLL.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Shift Left Logical Immediate", "summary": "Shifts elements left by immediate.", "syntax": "VSLL.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "100101 | vm | vs2 | zimm5 | 011 | vd | 1010111", "hex_opcode": "0x94003057", "visual_parts": [{"raw": "100101", "clean": "100101", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "vd = vs2 << imm;", "description": "Performs element-wise left logical shift on a vector and an immediate, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VSLL.VI v1, v4, 16, v0.t"}
{"mnemonic": "VSRL.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Shift Right Logical Immediate", "summary": "Shifts elements right (logical) by immediate.", "syntax": "VSRL.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "101000 | vm | vs2 | zimm5 | 011 | vd | 1010111", "hex_opcode": "0xA0003057", "visual_parts": [{"raw": "101000", "clean": "101000", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "vd = vs2 >>u imm;", "description": "Performs element-wise right logical shift on a vector and an immediate, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VSRL.VI v1, v4, 16, v0.t"}
{"mnemonic": "VSRA.VI", "architecture": "RISC-V", "extension": "V", "full_name": "Vector Shift Right Arithmetic Immediate", "summary": "Shifts elements right (arithmetic) by immediate.", "syntax": "VSRA.VI vd, vs2, imm, vm", "encoding": {"format": "OPIVI", "binary_pattern": "101001 | vm | vs2 | zimm5 | 011 | vd | 1010111", "hex_opcode": "0xA4003057", "visual_parts": [{"raw": "101001", "clean": "101001", "pos": "31:26"}, {"raw": "vm", "clean": "vm", "pos": "25"}, {"raw": "vs2", "clean": "vs2", "pos": "24:20"}, {"raw": "zimm5", "clean": "zimm5", "pos": "19:15"}, {"raw": "011", "clean": "011", "pos": "14:12"}, {"raw": "vd", "clean": "vd", "pos": "11:7"}, {"raw": "1010111", "clean": "1010111", "pos": "6:0"}], "bit_positions": "31:26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "vd", "desc": "Destination vector register"}, {"name": "vs2", "desc": "Source vector register 2"}, {"name": "imm", "desc": "Signed immediate value"}], "pseudocode": "vd = vs2 >>s imm;", "description": "Performs element-wise right arithmetic shift on a vector and an immediate, writing results to vd. The number of elements processed is determined by vl, and masking is controlled by vm.", "example": "VSRA.VI v1, v4, 16, v0.t"}
{"mnemonic": "ADD", "architecture": "RISC-V", "full_name": "Add Integer", "summary": "Adds the contents of two registers.", "syntax": "ADD rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | rs1 | 000 | rd | 0110011", "hex_opcode": "0x00000033", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Source Register 1"}, {"name": "rs2", "desc": "Source Register 2"}], "pseudocode": "R[rd] = R[rs1] + R[rs2];", "example": "ADD x10, x11, x12", "example_note": "Computes x11 + x12 and stores the result in x10.", "extension": "RV32I", "description": "ADD performs an XLEN-bit addition of the values in registers rs1 and rs2, writing the result to rd. Arithmetic overflow is ignored; the result is simply the low XLEN bits of the mathematical sum."}
{"mnemonic": "ADDI", "architecture": "RISC-V", "full_name": "Add Immediate", "summary": "Adds a register and a sign-extended 12-bit immediate value.", "syntax": "ADDI rd, rs1, imm", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 000 | rd | 0010011", "hex_opcode": "0x00000013", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Source Register"}, {"name": "imm", "desc": "12-bit Signed Immediate"}], "pseudocode": "R[rd] = R[rs1] + sext(imm);", "example": "ADDI x5, x6, 10", "example_note": "Adds 10 to the value in x6 and stores it in x5.", "extension": "RV32I", "description": "ADDI adds the sign-extended 12-bit immediate to register rs1 and writes the low XLEN bits to rd. Arithmetic overflow is ignored. ADDI rd, rs1, 0 implements the MV assembler pseudoinstruction."}
{"mnemonic": "ADDW", "architecture": "RISC-V", "extension": "RV64I", "full_name": "Add Word", "summary": "Adds two 32-bit registers and sign-extends the result to 64 bits.", "syntax": "ADDW rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | rs1 | 000 | rd | 0111011", "hex_opcode": "0x0000003B", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0111011", "clean": "0111011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Source Register 1"}, {"name": "rs2", "desc": "Source Register 2"}], "pseudocode": "R[rd] = sext((R[rs1] + R[rs2])[31:0]);", "example": "ADDW x10, x11, x12", "example_note": "Performs 32-bit addition of x11 and x12, result is sign-extended to 64 bits.", "description": "ADDW adds rs1 and rs2, truncates the result to 32 bits, sign-extends to 64 bits, and writes to rd. Arithmetic overflow is ignored."}
{"mnemonic": "ADDIW", "architecture": "RISC-V", "extension": "RV64I", "full_name": "Add Immediate Word", "summary": "Adds a 12-bit immediate to a register (32-bit arithmetic) and sign-extends to 64 bits.", "syntax": "ADDIW rd, rs1, imm", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 000 | rd | 0011011", "hex_opcode": "0x0000001B", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "000", "clean": "000", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0011011", "clean": "0011011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Source Register"}, {"name": "imm", "desc": "12-bit Signed Immediate"}], "pseudocode": "R[rd] = sext((R[rs1] + sext(imm))[31:0]);", "example": "ADDIW x5, x6, 5", "example_note": "Adds 5 to lower 32 bits of x6, sign-extends result to x5.", "description": "ADDIW adds the sign-extended 12-bit immediate to rs1, truncates to 32 bits, sign-extends to 64 bits, and writes to rd. Arithmetic overflow is ignored."}
{"mnemonic": "AND", "architecture": "RISC-V", "full_name": "Logical AND", "summary": "Performs a bitwise logical AND operation between two registers.", "syntax": "AND rd, rs1, rs2", "encoding": {"format": "R-Type", "binary_pattern": "0000000 | rs2 | rs1 | 111 | rd | 0110011", "hex_opcode": "0x00007033", "visual_parts": [{"raw": "0000000", "clean": "0000000", "pos": "31:25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0110011", "clean": "0110011", "pos": "6:0"}], "bit_positions": "31:25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Source Register 1"}, {"name": "rs2", "desc": "Source Register 2"}], "pseudocode": "R[rd] = R[rs1] & R[rs2];", "example": "AND x10, x11, x12", "example_note": "Bitwise AND of x11 and x12.", "extension": "RV32I", "description": "AND performs a bitwise logical AND of the values in rs1 and rs2, writing the result to rd."}
{"mnemonic": "ANDI", "architecture": "RISC-V", "full_name": "Logical AND Immediate", "summary": "Performs a bitwise logical AND between a register and a sign-extended 12-bit immediate.", "syntax": "ANDI rd, rs1, imm", "encoding": {"format": "I-Type", "binary_pattern": "imm12 | rs1 | 111 | rd | 0010011", "hex_opcode": "0x00007013", "visual_parts": [{"raw": "imm12", "clean": "imm12", "pos": "31:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "111", "clean": "111", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010011", "clean": "0010011", "pos": "6:0"}], "bit_positions": "31:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "rs1", "desc": "Source Register"}, {"name": "imm", "desc": "12-bit Signed Immediate"}], "pseudocode": "R[rd] = R[rs1] & sext(imm);", "example": "ANDI x10, x11, 15", "example_note": "Keeps only the lowest 4 bits of x11 (mask 0xF).", "extension": "RV32I", "description": "ANDI performs a bitwise AND of register rs1 with the sign-extended 12-bit immediate, writing the result to rd."}
{"mnemonic": "AUIPC", "architecture": "RISC-V", "full_name": "Add Upper Immediate to PC", "summary": "Adds a 20-bit upper immediate to the Program Counter, used for PC-relative addressing.", "syntax": "AUIPC rd, imm", "encoding": {"format": "U-Type", "binary_pattern": "imm20 | rd | 0010111", "hex_opcode": "0x00000017", "visual_parts": [{"raw": "imm20", "clean": "imm20", "pos": "31:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0010111", "clean": "0010111", "pos": "6:0"}], "bit_positions": "31:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Destination Register"}, {"name": "imm", "desc": "20-bit Upper Immediate"}], "pseudocode": "R[rd] = PC + (imm << 12);", "example": "AUIPC x10, 0x1000", "example_note": "Adds 0x1000000 to the current PC and stores in x10.", "extension": "RV32I", "description": "AUIPC (Add Upper Immediate to PC) forms a 32-bit offset from the 20-bit U-immediate (filling the low 12 bits with zeros), adds it to the PC of the AUIPC instruction, and places the result in rd. It is used for PC-relative addressing."}
{"mnemonic": "AMOADD.W", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic Add Word", "summary": "Atomically adds a value to a word in memory.", "syntax": "AMOADD.W rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "00000 | aq | rl | rs2 | rs1 | 010 | rd | 0101111", "hex_opcode": "0x0000202F", "visual_parts": [{"raw": "00000", "clean": "00000", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Value to Add"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = temp + R[rs2]; R[rd] = temp;", "example": "AMOADD.W x10, x11, (x12)", "example_note": "Atomically adds x11 to memory at x12. Old value stored in x10.", "description": "AMOADD.W atomically loads a word from the address in rs1 into rd, then adds rs2 to it, and stores the result back to that address."}
{"mnemonic": "AMOSWAP.W", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic Swap Word", "summary": "Atomically swaps a value in memory with a register.", "syntax": "AMOSWAP.W rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "00001 | aq | rl | rs2 | rs1 | 010 | rd | 0101111", "hex_opcode": "0x0800202F", "visual_parts": [{"raw": "00001", "clean": "00001", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "New Value"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = R[rs2]; R[rd] = temp;", "example": "AMOSWAP.W x10, x11, (x12)", "example_note": "Writes x11 to memory at x12, loads old memory value into x10.", "description": "AMOSWAP.W atomically loads a word from the address in rs1 into rd and stores the value of rs2 to that address."}
{"mnemonic": "AMOAND.W", "architecture": "RISC-V", "extension": "A", "full_name": "Atomic AND Word", "summary": "Atomically performs bitwise AND on a word in memory.", "syntax": "AMOAND.W rd, rs2, (rs1)", "encoding": {"format": "R-Type (Atomic)", "binary_pattern": "01100 | aq | rl | rs2 | rs1 | 010 | rd | 0101111", "hex_opcode": "0x6000202F", "visual_parts": [{"raw": "01100", "clean": "01100", "pos": "31:27"}, {"raw": "aq", "clean": "aq", "pos": "26"}, {"raw": "rl", "clean": "rl", "pos": "25"}, {"raw": "rs2", "clean": "rs2", "pos": "24:20"}, {"raw": "rs1", "clean": "rs1", "pos": "19:15"}, {"raw": "010", "clean": "010", "pos": "14:12"}, {"raw": "rd", "clean": "rd", "pos": "11:7"}, {"raw": "0101111", "clean": "0101111", "pos": "6:0"}], "bit_positions": "31:27 | 26 | 25 | 24:20 | 19:15 | 14:12 | 11:7 | 6:0"}, "operands": [{"name": "rd", "desc": "Dest (Old Value)"}, {"name": "rs2", "desc": "Operand"}, {"name": "rs1", "desc": "Address"}], "pseudocode": "temp = M[R[rs1]]; M[R[rs1]] = temp & R[rs2]; R[rd] = temp;", "example": "AMOAND.W x5, x6, (x7)", "example_note": "Atomically ANDs memory at x7 with x6.", "description": "AMOAND.W atomically loads a word from the address in rs1 into rd, ANDs it with rs2, and stores the result back."}
{"id": "ptx.abs", "mnemonic": "abs", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Absolute Value", "category": "Arithmetic", "summary": "Compute the absolute value of a signed or floating-point operand.", "syntax": "abs.type d, a;", "syntax_forms": [{"syntax": "abs.type d, a;", "description": "Absolute value.", "dataTypes": ["s16", "s32", "s64", "f32", "f64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32", "f64", "s16", "s32", "s64"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "d = |a|.", "examples": "abs.s32  r0,a;\n\nabs.ftz.f32  x,f0;\n\nabs.ftz.f16  x,f0;\nabs.bf16     x,b0;\nabs.bf16x2   x1,b1;", "description": "Take absolute value of a and store the result in d.\nFor.f16x2 and.bf16x2 instruction type, forms input vector by extracting half word values\nfrom the source operand. Absolute values of half-word operands are then computed in parallel to\nproduce.f16x2 or.bf16x2 result in destination.\nFor.f16 instruction type, operands d and a have.f16 or.b16 type. For.f16x2 instruction type, operands d and a have.f16x2 or.b32 type. For.bf16 instruction type, operands d and a have.b16 type. For.bf16x2 instruction\ntype, operands d and a have.b32 type.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#half-precision-floating-point-instructions-abs", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.activemask", "mnemonic": "activemask", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Active Mask", "category": "Parallel Synchronization and Communication Instructions", "summary": "Query the bitmask of currently active (converged) lanes in the executing warp.", "syntax": "activemask.b32 d;", "syntax_forms": [{"syntax": "activemask.b32 d;", "description": "Reads the current active-lane mask with no side effects and no synchronization.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 6.2"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register receiving the active-lane bitmask"}], "semantics": "d = bitmask of lanes currently active/converged at this point in the warp.", "examples": "activemask.b32  %r1;", "description": "activemask queries predicated-on active threads from the executing warp and sets the destination d with 32-bit integer mask where bit position in the mask corresponds to the thread’s laneid.\nDestination d is a 32-bit destination register.\nAn active thread will contribute 1 for its entry in the result and exited or inactive or\npredicated-off thread will contribute 0 for its entry in the result.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-activemask", "introducedIn": "PTX ISA 6.2", "requiredTargets": ["sm_30"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.add", "mnemonic": "add", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Add", "category": "Arithmetic", "summary": "Add two operands of the same type, with optional saturation for signed 32-bit integers.", "syntax": "add.type d, a, b;", "syntax_forms": [{"syntax": "add.type d, a, b;", "description": "Generic add across integer and floating-point types.", "dataTypes": ["s16", "s32", "s64", "u16", "u32", "u64", "f32", "f64", "f16", "f16x2", "bf16", "bf16x2"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}, {"syntax": "add.sat.s32 d, a, b;", "description": "Signed 32-bit add with saturation on overflow instead of wraparound.", "dataTypes": ["s32"], "stateSpaces": [], "scopes": [], "modifiers": ["sat"], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["bf16", "bf16x2", "f16", "f16x2", "f32", "f64", "s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": ["sat"], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "First source operand"}, {"name": "b", "desc": "Second source operand"}], "semantics": "d = a + b, evaluated at the selected type's width.", "examples": "@p  add.u32     x,y,z;\n    add.sat.s32 c,c,1;\n    add.u16x2   u,v,w;\n    add.s8x4.sat p, q, r;\n\n@p  add.rz.ftz.f32  f1,f2,f3;\nadd.rp.ftz.f32x2    d, a, b;\n\n// scalar f16 additions\nadd.f16        d0, a0, b0;\nadd.rn.f16     d1, a1, b1;\nadd.bf16       bd0, ba0, bb0;\nadd.rn.bf16    bd1, ba1, bb1;\n// (truncated - see the official PTX ISA docs for the full example)\n\n.reg .f32 fc, fd;\n.reg .b16 ba;\nadd.rz.f32.bf16.sat   fd, fa, fc;", "description": "Performs addition and writes the resulting value into a destination register.\nFor.u16x2,.s16x2 instruction types, forms input vectors by half word values from source\noperands. Half-word operands are then added in parallel to produce.u16x2,.s16x2 result in\ndestination.\nFor.u8x4,.s8x4 instruction types, forms input vectors by quarter word values from source\noperands. Quarter-word operands are then added in parallel to produce.u8x4,.s8x4 result\nin destination.\nOperands d, a and b have the same type as the instruction type. For instruction types.u16x2,.s16x2,.u8x4,.s8x4, operands d, a and b have type.b32.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-add", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.add.cc", "mnemonic": "add.cc", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "add.cc", "category": "Extended-Precision Integer Arithmetic Instructions", "summary": "Performs integer addition and writes the carry-out value into the condition code register.", "syntax": "add.cc.type  d, a, b;", "syntax_forms": [{"syntax": "add.cc.type  d, a, b;", "description": "Performs integer addition and writes the carry-out value into the condition code register.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.2"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}], "semantics": "d = a + b;", "examples": "@p  add.cc.u32   x1,y1,z1;   // extended-precision addition of\n@p  addc.cc.u32  x2,y2,z2;   // two 128-bit values\n@p  addc.cc.u32  x3,y3,z3;\n@p  addc.u32     x4,y4,z4;", "description": "Performs integer addition and writes the carry-out value into the condition code register.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#extended-precision-arithmetic-instructions-add-cc", "introducedIn": "PTX ISA 1.2", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.addc", "mnemonic": "addc", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "addc", "category": "Extended-Precision Integer Arithmetic Instructions", "summary": "Performs integer addition with carry-in and optionally writes the carry-out value into the condition\ncode register.", "syntax": "addc{.cc}.type  d, a, b;", "syntax_forms": [{"syntax": "addc{.cc}.type  d, a, b;", "description": "Performs integer addition with carry-in and optionally writes the carry-out value into the condition\ncode register.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.2"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}], "semantics": "d = a + b + CC.CF;", "examples": "@p  add.cc.u32   x1,y1,z1;   // extended-precision addition of\n@p  addc.cc.u32  x2,y2,z2;   // two 128-bit values\n@p  addc.cc.u32  x3,y3,z3;\n@p  addc.u32     x4,y4,z4;", "description": "Performs integer addition with carry-in and optionally writes the carry-out value into the condition\ncode register.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#extended-precision-arithmetic-instructions-addc", "introducedIn": "PTX ISA 1.2", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.alloca", "mnemonic": "alloca", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "alloca", "category": "Stack Manipulation Instructions", "summary": "The alloca instruction dynamically allocates memory on the stack frame of the current function and updates the stack pointer accordingly.", "syntax": "alloca.type  ptr, size{, immAlign};", "syntax_forms": [{"syntax": "alloca.type  ptr, size{, immAlign};", "description": "The alloca instruction dynamically allocates memory on the stack frame of the current function\nand updates the stack pointer accordingly. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_52"], "introducedIn": "PTX ISA 7.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "alloca.type ptr, size, immAlign:\n\na = max(immAlign, frame_align); // frame_align is the minimum guaranteed alignment\n\n// Allocate size bytes of stack memory with alignment a and update the stack pointer.\n// Since the stack grows down, the updated stack pointer contains a lower address.\nstackptr = alloc_stack_mem(size, a);\n\n// Return the new value of stack pointer as ptr. Since ptr is the lowest address of the memory\n// allocated by alloca, the memory can be accessed using ptr up to (ptr + size of allocated memory).\nstacksave ptr;", "examples": ".reg .u32 ra, stackptr, ptr, size;\n\nstacksave.u32 stackptr;     // Save the current stack pointer\nalloca ptr, size, 8;        // Allocate stack memory\nst.local.u32 [ptr], ra;     // Use the allocated stack memory\nstackrestore.u32 stackptr;  // Deallocate memory by restoring the stack pointer", "description": "The alloca instruction dynamically allocates memory on the stack frame of the current function\nand updates the stack pointer accordingly. The returned pointer ptr points to local memory and\ncan be used in the address operand of ld.local and st.local instructions.\nIf sufficient memory is unavailable for allocation on the stack, then execution of alloca may\nresult in stack overflow. In such cases, attempting to access the allocated memory with ptr will\nresult in undefined program behavior.\nThe memory allocated by alloca is deallocated in the following ways:\nIt is automatically deallocated when the function exits. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#stack-manipulation-instructions-alloca", "introducedIn": "PTX ISA 7.3", "requiredTargets": ["sm_52"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.and", "mnemonic": "and", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Bitwise AND", "category": "Logic and Shift Instructions", "summary": "Bitwise AND of two operands.", "syntax": "and.type d, a, b;", "syntax_forms": [{"syntax": "and.type d, a, b;", "description": "Bitwise AND, including a predicate form.", "dataTypes": ["b16", "b32", "b64", "pred"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["b16", "b32", "b64", "pred"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "First operand"}, {"name": "b", "desc": "Second operand"}], "semantics": "d = a & b (bitwise).", "examples": "and.b32  x,q,r;\nand.b32  sign,fpvalue,0x80000000;", "description": "Compute the bit-wise and operation for the bits in a and b.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#logic-and-shift-instructions-and", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.applypriority", "mnemonic": "applypriority", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "applypriority", "category": "Data Movement and Conversion Instructions", "summary": "The applypriority instruction applies the cache eviction priority specified by the.level::eviction_priority qualifier to the address range [a..a+size)", "syntax": "applypriority{.global}.level::eviction_priority  [a], size;", "syntax_forms": [{"syntax": "applypriority{.global}.level::eviction_priority  [a], size;", "description": "The applypriority instruction applies the cache eviction priority specified by the.level::eviction_priority qualifier to the address range [a..a+size) in the specified cache\nlevel. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.4"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "applypriority.global.L2::evict_normal [ptr], 128;", "description": "The applypriority instruction applies the cache eviction priority specified by the.level::eviction_priority qualifier to the address range [a..a+size) in the specified cache\nlevel.\nIf no state space is specified then Generic Addressing is\nused. If the specified address does not fall within the address window of.global state space\nthen the behavior is undefined.\nThe operand size is an integer constant that specifies the amount of data, in bytes, in the\nspecified cache level on which the priority is to be applied. The only supported value for the size operand is 128.\nSupported addressing modes for operand a are described in Addresses as Operands. a must be aligned to 128 bytes.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-applypriority", "introducedIn": "PTX ISA 7.4", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.atom", "mnemonic": "atom", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Atomic Read-Modify-Write", "category": "Parallel Synchronization and Communication Instructions", "summary": "Atomically read-modify-write a memory location and return the prior value.", "syntax": "atom.space.op.type d, [a], b;", "syntax_forms": [{"syntax": "atom.space.op.type d, [a], b;", "description": "Atomic operation; op selects the read-modify-write function.", "dataTypes": ["b32", "b64", "s32", "u32", "u64", "f32", "f64"], "stateSpaces": ["global", "shared"], "scopes": [], "modifiers": ["add", "min", "max", "and", "or", "xor", "exch", "cas", "inc", "dec"], "requiredTargets": ["sm_11"], "introducedIn": "PTX ISA 1.1"}], "dataTypes": ["b32", "b64", "f32", "f64", "s32", "u32", "u64"], "stateSpaces": ["global", "shared"], "scopes": [], "modifiers": ["add", "and", "cas", "dec", "exch", "inc", "max", "min", "or", "xor"], "operands": [{"name": "d", "desc": "Destination register (receives the pre-operation value)"}, {"name": "a", "desc": "Memory address"}, {"name": "b", "desc": "Operand value"}], "semantics": "d = *a; *a = op(*a, b); indivisible with respect to other threads targeting the same address.", "examples": "atom.global.add.s32  d,[a],1;\natom.shared::cta.max.u32  d,[x+4],0;\n@p  atom.global.cas.b32  d,[p],my_val,my_new_val;\natom.global.sys.add.u32 d, [a], 1;\natom.global.acquire.sys.inc.u32 ans, [gbl], %r0;\natom.add.noftz.f16x2 d, [a], b;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Atomically loads the original value at location a into destination register d, performs a\nreduction operation with operand b and the value in location a, and stores the result of the\nspecified operation at location a, overwriting the original value. For the.cas (compare-and-swap)\noperation, operand b is the compare value and operand c is the swap value. The operation\ncompares the value at location a with operand b; if they are equal, it stores operand c at location a, otherwise it leaves the value at location a unchanged. Operand a specifies a\nlocation in the specified state space. If no state space is given, perform the memory accesses using Generic Addressing. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-atom", "introducedIn": "PTX ISA 1.1", "requiredTargets": ["sm_11"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.bar.cta", "mnemonic": "bar.cta", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "bar.cta", "category": "Parallel Synchronization and Communication Instructions", "summary": "Performs barrier synchronization and communication within a CTA.", "syntax": "bar.cta.sync      a{, b};", "syntax_forms": [{"syntax": "bar.cta.sync      a{, b};", "description": "Performs barrier synchronization and communication within a CTA. Each CTA instance has sixteen\nbarriers numbered 0..15.\nbarrier{. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Use bar.sync to arrive at a pre-computed barrier number and\n// wait for all threads in CTA to also arrive:\n    st.shared [r0],r1;  // write my result to shared memory\n    bar.cta.sync  1;    // arrive, wait for others to arrive\n    ld.shared r2,[r3];  // use shared results from other threads\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Performs barrier synchronization and communication within a CTA. Each CTA instance has sixteen\nbarriers numbered 0..15.\nbarrier{.cta} instructions can be used by the threads within the CTA for synchronization and\ncommunication.\nOperands a, b, and d have type.u32; operands p and c are predicates. Source\noperand a specifies a logical barrier resource as an immediate constant or register with value 0 through 15. Operand b specifies the number of threads participating in the barrier. If\nno thread count is specified, all threads in the CTA participate in the barrier. When specifying a\nthread count, the value must be a multiple of the warp size. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-bar", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.bar.warp.sync", "mnemonic": "bar.warp.sync", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "bar.warp.sync", "category": "Parallel Synchronization and Communication Instructions", "summary": "bar.warp.sync will cause executing thread to wait until all threads corresponding to membermask have executed a bar.warp.sync with the same membermask value before resuming execution.", "syntax": "bar.warp.sync      membermask;", "syntax_forms": [{"syntax": "bar.warp.sync      membermask;", "description": "bar.warp.sync will cause executing thread to wait until all threads corresponding to membermask have executed a bar.warp.sync with the same membermask value before resuming\nexecution. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 6.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "membermask", "desc": "Operand"}], "semantics": null, "examples": "st.shared.u32 [r0],r1;         // write my result to shared memory\nbar.warp.sync  0xffffffff;     // arrive, wait for others to arrive\nld.shared.u32 r2,[r3];         // read results written by other threads", "description": "bar.warp.sync will cause executing thread to wait until all threads corresponding to membermask have executed a bar.warp.sync with the same membermask value before resuming\nexecution.\nOperand membermask specifies a 32-bit integer which is a mask indicating threads participating\nin barrier where the bit position corresponds to thread’s laneid.\nThe behavior of bar.warp.sync is undefined if the executing thread is not in the membermask.\nbar.warp.sync also guarantee memory ordering among threads participating in barrier. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-bar-warp-sync", "introducedIn": "PTX ISA 6.0", "requiredTargets": ["sm_30"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.barrier", "mnemonic": "barrier", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Barrier Synchronization", "category": "Parallel Synchronization and Communication Instructions", "summary": "Block threads in a CTA at a named barrier until the expected number of threads has arrived.", "syntax": "barrier{.cta}.sync{.aligned}      a{, b};", "syntax_forms": [{"syntax": "barrier{.cta}.sync{.aligned}      a{, b};", "description": "Wait at barrier resource a for all (or b) threads of the CTA.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 6.0"}, {"syntax": "bar.sync a{, b};", "description": "Legacy short-form alias of barrier.sync with the same semantics.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "a", "desc": "Barrier resource identifier"}, {"name": "b", "desc": "Optional thread count participating in the barrier"}], "semantics": "Every participating thread blocks until all have executed the barrier; also orders shared-memory visibility across the participating threads.", "examples": "// Use bar.sync to arrive at a pre-computed barrier number and\n// wait for all threads in CTA to also arrive:\n    st.shared [r0],r1;  // write my result to shared memory\n    bar.cta.sync  1;    // arrive, wait for others to arrive\n    ld.shared r2,[r3];  // use shared results from other threads\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Performs barrier synchronization and communication within a CTA. Each CTA instance has sixteen\nbarriers numbered 0..15.\nbarrier{.cta} instructions can be used by the threads within the CTA for synchronization and\ncommunication.\nOperands a, b, and d have type.u32; operands p and c are predicates. Source\noperand a specifies a logical barrier resource as an immediate constant or register with value 0 through 15. Operand b specifies the number of threads participating in the barrier. If\nno thread count is specified, all threads in the CTA participate in the barrier. When specifying a\nthread count, the value must be a multiple of the warp size. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-bar", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.barrier.cluster", "mnemonic": "barrier.cluster", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "barrier.cluster", "category": "Parallel Synchronization and Communication Instructions", "summary": "Performs barrier synchronization and communication within a cluster.", "syntax": "barrier.cluster.arrive{.sem}{.aligned};", "syntax_forms": [{"syntax": "barrier.cluster.arrive{.sem}{.aligned};", "description": "Performs barrier synchronization and communication within a cluster.\nbarrier.cluster instructions can be used by the threads within the cluster for synchronization\nand communication.\nbarrier.cluster. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 7.8"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// use of arrive followed by wait\nld.shared::cluster.u32 r0, [addr];\nbarrier.cluster.arrive.aligned;\n...\nbarrier.cluster.wait.aligned;\nst.shared::cluster.u32 [addr], r1;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Performs barrier synchronization and communication within a cluster.\nbarrier.cluster instructions can be used by the threads within the cluster for synchronization\nand communication.\nbarrier.cluster.arrive instruction marks warps’ arrival at barrier without causing executing\nthread to wait for threads of other participating warps.\nbarrier.cluster.wait instruction causes the executing thread to wait for all non-exited threads\nof the cluster to perform barrier.cluster.arrive.\nIn addition, barrier.cluster instructions cause the executing thread to wait for all non-exited\nthreads from its warp.\nWhen all non-exited threads in the cluster have executed barrier.cluster. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-barrier-cluster", "introducedIn": "PTX ISA 7.8", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.barrier.cta", "mnemonic": "barrier.cta", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "barrier.cta", "category": "Parallel Synchronization and Communication Instructions", "summary": "Performs barrier synchronization and communication within a CTA.", "syntax": "barrier.cta.sync{.aligned}      a{, b};", "syntax_forms": [{"syntax": "barrier.cta.sync{.aligned}      a{, b};", "description": "Performs barrier synchronization and communication within a CTA. Each CTA instance has sixteen\nbarriers numbered 0..15.\nbarrier{. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Use bar.sync to arrive at a pre-computed barrier number and\n// wait for all threads in CTA to also arrive:\n    st.shared [r0],r1;  // write my result to shared memory\n    bar.cta.sync  1;    // arrive, wait for others to arrive\n    ld.shared r2,[r3];  // use shared results from other threads\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Performs barrier synchronization and communication within a CTA. Each CTA instance has sixteen\nbarriers numbered 0..15.\nbarrier{.cta} instructions can be used by the threads within the CTA for synchronization and\ncommunication.\nOperands a, b, and d have type.u32; operands p and c are predicates. Source\noperand a specifies a logical barrier resource as an immediate constant or register with value 0 through 15. Operand b specifies the number of threads participating in the barrier. If\nno thread count is specified, all threads in the CTA participate in the barrier. When specifying a\nthread count, the value must be a multiple of the warp size. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-bar", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.bfe", "mnemonic": "bfe", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "bfe", "category": "Integer Arithmetic Instructions", "summary": "Extract bit field from a and place the zero or sign-extended result in d.", "syntax": "bfe.type  d, a, b, c;", "syntax_forms": [{"syntax": "bfe.type  d, a, b, c;", "description": "Extract bit field from a and place the zero or sign-extended result in d. Source b gives\nthe bit field starting bit position, and source c gives the bit field length in bits. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c", "desc": "Source operand"}], "semantics": "msb = (.type==.u32 || .type==.s32) ? 31 : 63;\npos = b & 0xff;  // pos restricted to 0..255 range\nlen = c & 0xff;  // len restricted to 0..255 range\n\nif (.type==.u32 || .type==.u64 || len==0)\n    sbit = 0;\nelse\n    sbit = a[min(pos+len-1,msb)];\n\nd = 0;\nfor (i=0; i<=msb; i++) {\n    d[i] = (i<len && pos+i<=msb) ? a[pos+i] : sbit;\n}", "examples": "bfe.b32  d,a,start,len;", "description": "Extract bit field from a and place the zero or sign-extended result in d. Source b gives\nthe bit field starting bit position, and source c gives the bit field length in bits.\nOperands a and d have the same type as the instruction type. Operands b and c are\ntype.u32, but are restricted to the 8-bit value range 0..255.\nThe sign bit of the extracted field is defined as:.u32,.u64: zero.s32,.s64: msb of input a if the extracted field extends beyond the msb of a msb of extracted\nfield, otherwise\nIf the bit field length is zero, the result is zero.\nThe destination d is padded with the sign bit of the extracted field. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-bfe", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.bfi", "mnemonic": "bfi", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "bfi", "category": "Integer Arithmetic Instructions", "summary": "Align and insert a bit field from a into b, and place the result in f.", "syntax": "bfi.type  f, a, b, c, d;", "syntax_forms": [{"syntax": "bfi.type  f, a, b, c, d;", "description": "Align and insert a bit field from a into b, and place the result in f. Source c gives the starting bit position for the insertion, and source d gives the bit field length in\nbits. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "f", "desc": "Operand"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c", "desc": "Source operand"}, {"name": "d", "desc": "Destination register"}], "semantics": "msb = (.type==.b32) ? 31 : 63;\npos = c & 0xff;  // pos restricted to 0..255 range\nlen = d & 0xff;  // len restricted to 0..255 range\n\nf = b;\nfor (i=0; i<len && pos+i<=msb; i++) {\n    f[pos+i] = a[i];\n}", "examples": "bfi.b32  d,a,b,start,len;", "description": "Align and insert a bit field from a into b, and place the result in f. Source c gives the starting bit position for the insertion, and source d gives the bit field length in\nbits.\nOperands a, b, and f have the same type as the instruction type. Operands c and d are type.u32, but are restricted to the 8-bit value range 0..255.\nIf the bit field length is zero, the result is b.\nIf the start position is beyond the msb of the input, the result is b.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-bfi", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.bfind", "mnemonic": "bfind", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "bfind", "category": "Integer Arithmetic Instructions", "summary": "Find the bit position of the most significant non-sign bit in a and place the result in d.", "syntax": "bfind.type           d, a;", "syntax_forms": [{"syntax": "bfind.type           d, a;", "description": "Find the bit position of the most significant non-sign bit in a and place the result in d. Operand a has the instruction type, and destination d has type.u32. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "msb = (.type==.u32 || .type==.s32) ? 31 : 63;\n// negate negative signed inputs\nif ( (.type==.s32 || .type==.s64) && (a & (1<<msb)) ) {\n    a = ~a;\n}\n.u32  d = 0xffffffff;\nfor (.s32 i=msb; i>=0; i--) {\n    if (a & (1<<i))  { d = i; break; }\n}\nif (.shiftamt && d != 0xffffffff)  { d = msb - d; }", "examples": "bfind.u32  d, a;\nbfind.shiftamt.s64  cnt, X;  // cnt is .u32", "description": "Find the bit position of the most significant non-sign bit in a and place the result in d. Operand a has the instruction type, and destination d has type.u32. For unsigned\nintegers, bfind returns the bit position of the most significant 1. For signed integers, bfind returns the bit position of the most significant 0 for negative inputs and the most\nsignificant 1 for non-negative inputs.\nIf.shiftamt is specified, bfind returns the shift amount needed to left-shift the found bit\ninto the most-significant bit position.\nbfind returns 0xffffffff if no non-sign bit is found.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-bfind", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.bmsk", "mnemonic": "bmsk", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "bmsk", "category": "Integer Arithmetic Instructions", "summary": "Generates a 32-bit mask starting from the bit position specified in operand a, and of the width specified in operand b.", "syntax": "bmsk.mode.b32  d, a, b;", "syntax_forms": [{"syntax": "bmsk.mode.b32  d, a, b;", "description": "Generates a 32-bit mask starting from the bit position specified in operand a, and of the width\nspecified in operand b. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_70"], "introducedIn": "PTX ISA 7.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}], "semantics": "a1    = a & 0x1f;\nmask0 = (~0) << a1;\nb1    = b & 0x1f;\nsum   = a1 + b1;\nmask1 = (~0) << sum;\n\nsum-overflow          = sum >= 32 ? true : false;\nbit-position-overflow = false;\nbit-width-overflow    = false;\n\nif (.mode == .clamp) {\n    if (a >= 32) {\n        bit-position-overflow = true;\n        mask0 = 0;\n    }\n    if (b >= 32) {\n        bit-width-overflow = true;\n    }\n}\n\nif (sum-overflow || bit-position-overflow || bit-width-overflow) {\n    mask1 = 0;\n} else if (b1 == 0) {\n    mask1 = ~0;\n}\nd = mask0 & ~mask1;", "examples": "bmsk.clamp.b32  rd, ra, rb;\nbmsk.wrap.b32   rd, 1, 2; // Creates a bitmask of 0x00000006.", "description": "Generates a 32-bit mask starting from the bit position specified in operand a, and of the width\nspecified in operand b. The generated bitmask is stored in the destination operand d.\nThe resulting bitmask is 0 in the following cases:\nWhen the value of a is 32 or higher and.mode is.clamp. When either the specified value of b or the wrapped value of b (when.mode is\nspecified as.wrap ) is 0.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-bmsk", "introducedIn": "PTX ISA 7.6", "requiredTargets": ["sm_70"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.bra", "mnemonic": "bra", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "bra", "category": "Control Flow Instructions", "summary": "Continue execution at the target.", "syntax": "@p   bra{.uni}  tgt;           // tgt is a label", "syntax_forms": [{"syntax": "@p   bra{.uni}  tgt;           // tgt is a label", "description": "Continue execution at the target. Conditional branches are specified by using a guard predicate. The\nbranch target must be a label.\nbra.uni is guaranteed to be non-divergent, i.e. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "if (p) {\n    pc = tgt;\n}", "examples": "bra.uni  L_exit;    // uniform unconditional jump\n@q  bra      L23;   // conditional branch", "description": "Continue execution at the target. Conditional branches are specified by using a guard predicate. The\nbranch target must be a label.\nbra.uni is guaranteed to be non-divergent, i.e. all active threads in a warp that are currently\nexecuting this instruction have identical values for the guard predicate and branch target.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#control-flow-instructions-bra", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.brev", "mnemonic": "brev", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "brev", "category": "Integer Arithmetic Instructions", "summary": "Perform bitwise reversal of input.", "syntax": "brev.type  d, a;", "syntax_forms": [{"syntax": "brev.type  d, a;", "description": "Perform bitwise reversal of input.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "msb = (.type==.b32) ? 31 : 63;\n\nfor (i=0; i<=msb; i++) {\n    d[i] = a[msb-i];\n}", "examples": "brev.b32  d, a;", "description": "Perform bitwise reversal of input.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-brev", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.brkpt", "mnemonic": "brkpt", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "brkpt", "category": "Miscellaneous Instructions", "summary": "Suspends execution.", "syntax": "brkpt;", "syntax_forms": [{"syntax": "brkpt;", "description": "Suspends execution.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_11"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "brkpt;\n@p  brkpt;", "description": "Suspends execution.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#miscellaneous-instructions-brkpt", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_11"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.brx.idx", "mnemonic": "brx.idx", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "brx.idx", "category": "Control Flow Instructions", "summary": "Index into a list of possible destination labels, and continue execution from the chosen label.", "syntax": "@p    brx.idx{.uni} index, tlist;", "syntax_forms": [{"syntax": "@p    brx.idx{.uni} index, tlist;", "description": "Index into a list of possible destination labels, and continue execution from the chosen\nlabel. Conditional branches are specified by using a guard predicate.\nbrx.idx. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 6.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "if (p) {\n    if (index < length(tlist)) {\n      pc = tlist[index];\n    } else {\n      pc = undefined;\n    }\n}", "examples": ".function foo () {\n    .reg .u32 %r0;\n    ...\n    L1:\n    ...\n    L2:\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Index into a list of possible destination labels, and continue execution from the chosen\nlabel. Conditional branches are specified by using a guard predicate.\nbrx.idx.uni guarantees that the branch is non-divergent, i.e. all active threads in a warp that\nare currently executing this instruction have identical values for the guard predicate and the index argument.\nThe index operand is a.u32 register. The tlist operand must be the label of a.branchtargets directive. It is accessed as a zero-based sequence using index. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#control-flow-instructions-brx-idx", "introducedIn": "PTX ISA 6.0", "requiredTargets": ["sm_30"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.call", "mnemonic": "call", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "call", "category": "Control Flow Instructions", "summary": "The call instruction stores the address of the next instruction, so execution can resume at that point after executing a ret instruction.", "syntax": "// direct call to named function, func is a symbol\ncall{.uni} (ret-param), func, (param-list);", "syntax_forms": [{"syntax": "// direct call to named function, func is a symbol\ncall{.uni} (ret-param), func, (param-list);", "description": "The call instruction stores the address of the next instruction, so execution can resume at that\npoint after executing a ret instruction. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// examples of direct call\n    call     init;    // call function 'init'\n    call.uni g, (a);  // call function 'g' with parameter 'a'\n@p  call     (d), h, (a, b);  // return value into register d\n\n// call-via-pointer using jump table\n// (truncated - see the official PTX ISA docs for the full example)", "description": "The call instruction stores the address of the next instruction, so execution can resume at that\npoint after executing a ret instruction. A call is assumed to be divergent unless the.uni suffix is present. The.uni suffix indicates that the call is guaranteed to be\nnon-divergent, i.e. all active threads in a warp that are currently executing this instruction have\nidentical values for the guard predicate and call target.\nFor direct calls, the called location func must be a symbolic function name; for indirect calls,\nthe called location fptr must be an address of a function held in a register. Input arguments\nand return values are optional. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#control-flow-instructions-call", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.clmad", "mnemonic": "clmad", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "clmad", "category": "Integer Arithmetic Instructions", "summary": "Performs a carryless multiplication of a and b, followed by a carryless addition of c, and writes the result into destination register d.", "syntax": "clmad.mode.u64 d, a, b, c;", "syntax_forms": [{"syntax": "clmad.mode.u64 d, a, b, c;", "description": "Performs a carryless multiplication of a and b, followed by a carryless\naddition of c, and writes the result into destination register d.\nAll operands of clmad are unsigned 64-bit values. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 9.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c", "desc": "Source operand"}], "semantics": "tmp[127:0] = 0;  // 128-bit result of carryless multiplication.\n\nfor (i = 0; i < 64; i++) {\n    if ((a & (1 << i)) != 0) {\n        tmp ^= b << i;\n    }\n}\n\n// Select upper or lower 64 bits depending on the value of .mode.\nif (.mode == .lo) {\n    d = tmp[63..0];\n} else {\n    d = tmp[127..64];\n}\n\nd ^= c;  // carryless accumulation.", "examples": ".reg .u64 Rd, Ra, Rb, Rc;\n\n// Carryless multiply-add producing lower 64 bits of result.\nclmad.lo.u64 Rd, Ra, Rb, Rc;\n\n// Carryless multiply-add producing higher 64 bits of result.\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Performs a carryless multiplication of a and b, followed by a carryless\naddition of c, and writes the result into destination register d.\nAll operands of clmad are unsigned 64-bit values.\nThe modifier.mode specifies which part of the carryless product is stored in\nthe destination register:.lo Produces lower 64 bits of the product, with addition of c..hi Produces higher 64 bits of the product, with addition of c.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-clmad", "introducedIn": "PTX ISA 9.3", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.clusterlaunchcontrol.query_cancel", "mnemonic": "clusterlaunchcontrol.query_cancel", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "clusterlaunchcontrol.query_cancel", "category": "Parallel Synchronization and Communication Instructions", "summary": "Instruction clusterlaunchcontrol.query_cancel can be used to decode opaque response written by instruction clusterlaunchcontrol.try_cancel.", "syntax": "clusterlaunchcontrol.query_cancel.is_canceled.pred.b128 pred, try_cancel_response;", "syntax_forms": [{"syntax": "clusterlaunchcontrol.query_cancel.is_canceled.pred.b128 pred, try_cancel_response;", "description": "Instruction clusterlaunchcontrol.query_cancel can be used to decode opaque response\nwritten by instruction clusterlaunchcontrol.try_cancel.\nAfter loading response from clusterlaunchcontrol. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "pred", "desc": "Operand"}, {"name": "try_cancel_response", "desc": "Operand"}], "semantics": null, "examples": "clusterlaunchcontrol.query_cancel.is_canceled pred.b128 p, handle;\n\n@p clusterlaunchcontrol.query_cancel.get_first_ctaid.v4.b32.b128 {xdim, ydim, zdim, ignr}  handle;\n\nclusterlaunchcontrol.query_cancel.get_first_ctaid::x.b32.b128 reg0, handle;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Instruction clusterlaunchcontrol.query_cancel can be used to decode opaque response\nwritten by instruction clusterlaunchcontrol.try_cancel.\nAfter loading response from clusterlaunchcontrol.try_cancel instruction into 16-byte\nregister it can be further queried using clusterlaunchcontrol.query_cancel instruction\nas follows:\nclusterlaunchcontrol.query_cancel.is_canceled.pred.b128: If the cluster is canceled\nsuccessfully, predicate p is set to true; otherwise, it is set to false.\nIf the request succeeded, the instruction clusterlaunchcontrol.query_cancel.get_first_ctaid extracts the CTA id of the first CTA in the canceled cluster. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.clusterlaunchcontrol.try_cancel", "mnemonic": "clusterlaunchcontrol.try_cancel", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "clusterlaunchcontrol.try_cancel", "category": "Parallel Synchronization and Communication Instructions", "summary": "The clusterlaunchcontrol.try_cancel instruction requests atomically cancelling the launch of a cluster that has not started running yet.", "syntax": "clusterlaunchcontrol.try_cancel.async{.space}.completion_mechanism{.multicast::cluster::all}.b128 [addr], [mbar];", "syntax_forms": [{"syntax": "clusterlaunchcontrol.try_cancel.async{.space}.completion_mechanism{.multicast::cluster::all}.b128 [addr], [mbar];", "description": "The clusterlaunchcontrol.try_cancel instruction requests atomically cancelling the launch of\na cluster that has not started running yet. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Assumption: 1D cluster (cluster_ctaid.y/.z == 1) with 1 thread per CTA.\n\n// Current Cluster to be processed: initially the launched cluster:\nmov.b32 xctaid, %ctaid.x;\n\n// Establish full synchronization across all CTAs of the cluster for the first iteration.\n// (truncated - see the official PTX ISA docs for the full example)", "description": "The clusterlaunchcontrol.try_cancel instruction requests atomically cancelling the launch of\na cluster that has not started running yet. It asynchronously writes an opaque response to shared\nmemory indicating whether the operation succeeded or failed. The completion of the asynchronous\noperation is tracked using the mbarrier completion mechanism at.cluster scope.\nThis instruction accesses its mbarrier operand using generic-proxy.\nOn success, the opaque response contains the ctaid of the first CTA of the canceled cluster; no\nother successful response from other clusterlaunchcontrol.try_cancel operations from the same\ngrid will contain that id.\nThe mandatory. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.clz", "mnemonic": "clz", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Count Leading Zeros", "category": "Integer Arithmetic Instructions", "summary": "Count the number of leading zero bits in an integer operand.", "syntax": "clz.type d, a;", "syntax_forms": [{"syntax": "clz.type d, a;", "description": "Count leading zeros.", "dataTypes": ["b32", "b64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": ["b32", "b64"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register (u32)"}, {"name": "a", "desc": "Source operand"}], "semantics": "d = number of leading 0-bits in a, counted from the most-significant bit.", "examples": "clz.b32  d, a;\nclz.b64  cnt, X;  // cnt is .u32", "description": "Count the number of leading zeros in a starting with the most-significant bit and place the\nresult in 32-bit destination register d. Operand a has the instruction type, and destination d has type.u32. For.b32 type, the number of leading zeros is between 0 and 32,\ninclusively. For.b64 type, the number of leading zeros is between 0 and 64, inclusively.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-clz", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cnot", "mnemonic": "cnot", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cnot", "category": "Logic and Shift Instructions", "summary": "Compute the logical negation using C/C++ semantics.", "syntax": "cnot.type d, a;", "syntax_forms": [{"syntax": "cnot.type d, a;", "description": "Compute the logical negation using C/C++ semantics.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "d = (a==0) ? 1 : 0;", "examples": "cnot.b32 d,a;", "description": "Compute the logical negation using C/C++ semantics.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#logic-and-shift-instructions-cnot", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.copysign", "mnemonic": "copysign", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "copysign", "category": "Floating-Point Instructions", "summary": "Copy sign bit of a into value of b, and return the result as d.", "syntax": "copysign.type  d, a, b;", "syntax_forms": [{"syntax": "copysign.type  d, a, b;", "description": "Copy sign bit of a into value of b, and return the result as d.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}], "semantics": null, "examples": "copysign.f32  x, y, z;\ncopysign.f64  A, B, C;", "description": "Copy sign bit of a into value of b, and return the result as d.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#floating-point-instructions-copysign", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cos", "mnemonic": "cos", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cos", "category": "Floating-Point Instructions", "summary": "Find the cosine of the angle a (in radians).", "syntax": "cos.approx{.ftz}.f32  d, a;", "syntax_forms": [{"syntax": "cos.approx{.ftz}.f32  d, a;", "description": "Find the cosine of the angle a (in radians).", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "d = cos(a);", "examples": "cos.approx.ftz.f32  ca, a;", "description": "Find the cosine of the angle a (in radians).", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#floating-point-instructions-cos", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.async", "mnemonic": "cp.async", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.async", "category": "Data Movement and Conversion Instructions", "summary": "cp.async is a non-blocking instruction which initiates an asynchronous copy operation of data from the location specified by source address operand src to the location specified by destination address operand dst.", "syntax": "cp.async.ca.shared{::cta}.global{.level::cache_hint}{.level::prefetch_size}", "syntax_forms": [{"syntax": "cp.async.ca.shared{::cta}.global{.level::cache_hint}{.level::prefetch_size}", "description": "cp.async is a non-blocking instruction which initiates an asynchronous copy operation of data from the location specified by source address operand src to the location specified by destination address… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "cp.async.ca.shared.global  [shrd],    [gbl + 4], 4;\ncp.async.ca.shared::cta.global  [%r0 + 8], [%r1],     8;\ncp.async.cg.shared.global  [%r2],     [%r3],     16;\n\ncp.async.cg.shared.global.L2::64B   [%r2],      [%r3],     16;\ncp.async.cg.shared.global.L2::128B  [%r0 + 16], [%r1],     16;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "cp.async is a non-blocking instruction which initiates an asynchronous copy operation of data\nfrom the location specified by source address operand src to the location specified by\ndestination address operand dst. Operand src specifies a location\nin the global state space and dst specifies a location in the shared state space.\nOperand cp-size is an integer constant which specifies the size of data in bytes to be copied to\nthe destination dst. cp-size can only be 4, 8 and 16.\nInstruction cp.async allows optionally specifying a 32-bit integer operand src-size. Operand src-size represents the size of the data in bytes to be copied from src to dst and must\nbe less than cp-size. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-cp-async", "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.async.bulk", "mnemonic": "cp.async.bulk", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.async.bulk", "category": "Data Movement and Conversion Instructions", "summary": "cp.async.bulk is a non-blocking instruction which initiates an asynchronous bulk-copy operation from the location specified by source address operand srcMem to the location specified by destination address operand dstMem.", "syntax": "// global -> shared::cta\ncp.async.bulk{.sem}.dst.src.completion_mechanism{.level::cache_hint}{.ignore_oob}\n[dstMem], [srcMem], size{, ignoreBytesLeft, ignoreBytesRight}, [mbar] {, cache_policy};", "syntax_forms": [{"syntax": "// global -> shared::cta\ncp.async.bulk{.sem}.dst.src.completion_mechanism{.level::cache_hint}{.ignore_oob}\n[dstMem], [srcMem], size{, ignoreBytesLeft, ignoreBytesRight}, [mbar] {, cache_policy};", "description": "cp.async.bulk is a non-blocking instruction which initiates an asynchronous bulk-copy operation from the location specified by source address operand srcMem to the location specified by destination ad… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// .global -> .shared::cta (strictly non-remote):\ncp.async.bulk.shared::cta.global.mbarrier::complete_tx::bytes [dstMem], [srcMem], size, [mbar];\n\ncp.async.bulk.shared::cta.global.mbarrier::complete_tx::bytes.L2::cache_hint\n                                             [dstMem], [srcMem], size, [mbar], cache_policy;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "cp.async.bulk is a non-blocking instruction which initiates an asynchronous bulk-copy operation\nfrom the location specified by source address operand srcMem to the location specified by\ndestination address operand dstMem.\nThe direction of bulk-copy is from the state space specified by the.src modifier to the state\nspace specified by the.dst modifiers.\nThe 32-bit operand size specifies the amount of memory to be copied, in terms of number of\nbytes. size must be a multiple of 16. If the value is not a multiple of 16, then the behavior is\nundefined. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-cp-async-bulk", "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.async.bulk.commit_group", "mnemonic": "cp.async.bulk.commit_group", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.async.bulk.commit_group", "category": "Data Movement and Conversion Instructions", "summary": "cp.async.bulk.commit_group instruction creates a new per-thread bulk async-group and batches all prior cp{.reduce}.async.bulk{.prefetch}{.tensor} instructions satisfying the following conditions into…", "syntax": "cp.async.bulk.commit_group;", "syntax_forms": [{"syntax": "cp.async.bulk.commit_group;", "description": "cp.async.bulk.commit_group instruction creates a new per-thread bulk async-group and batches\nall prior cp{.reduce}.async.bulk{.prefetch}{. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "cp.async.bulk.commit_group;", "description": "cp.async.bulk.commit_group instruction creates a new per-thread bulk async-group and batches\nall prior cp{.reduce}.async.bulk{.prefetch}{.tensor} instructions satisfying the following\nconditions into the new bulk async-group:\nThe prior cp{.reduce}.async.bulk{.prefetch}{.tensor} instructions use bulk_group based\ncompletion mechanism, and They are initiated by the executing thread but not committed to any bulk async-group.\nIf there are no uncommitted cp{.reduce}.async.bulk{.prefetch}{.tensor} instructions then cp.async.bulk.commit_group results in an empty bulk async-group.\nAn executing thread can wait for the completion of all cp{.reduce}.async.bulk{.prefetch}{. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.async.bulk.prefetch", "mnemonic": "cp.async.bulk.prefetch", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.async.bulk.prefetch", "category": "Data Movement and Conversion Instructions", "summary": "cp.async.bulk.prefetch is a non-blocking instruction which may initiate an asynchronous prefetch of data from the location specified by source address operand srcMem, in.src statespace, to the L2 cache.", "syntax": "cp.async.bulk.prefetch.L2.src{.level::cache_hint}   [srcMem], size {, cache_policy};", "syntax_forms": [{"syntax": "cp.async.bulk.prefetch.L2.src{.level::cache_hint}   [srcMem], size {, cache_policy};", "description": "cp.async.bulk.prefetch is a non-blocking instruction which may initiate an asynchronous prefetch\nof data from the location specified by source address operand srcMem, in. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "cp.async.bulk.prefetch.L2.global                 [srcMem], size;\n\ncp.async.bulk.prefetch.L2.global.L2::cache_hint  [srcMem], size, policy;", "description": "cp.async.bulk.prefetch is a non-blocking instruction which may initiate an asynchronous prefetch\nof data from the location specified by source address operand srcMem, in.src statespace, to\nthe L2 cache.\nThe 32-bit operand size specifies the amount of memory to be prefetched in terms of number of\nbytes. size must be a multiple of 16. If the value is not a multiple of 16, then the behavior is\nundefined.  The address srcMem must be aligned to 16 bytes.\nWhen the optional argument cache_policy is specified, the qualifier.level::cache_hint is\nrequired. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-cp-async-bulk-prefetch", "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.async.bulk.prefetch.tensor", "mnemonic": "cp.async.bulk.prefetch.tensor", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.async.bulk.prefetch.tensor", "category": "Data Movement and Conversion Instructions", "summary": "cp.async.bulk.prefetch.tensor is a non-blocking instruction which may initiate an asynchronous prefetch of tensor data from the location in.src statespace to the L2 cache.", "syntax": "// global -> L2:\ncp.async.bulk.prefetch.tensor.dim.L2.src{.load_mode}{.level::cache_hint} [tensorMap, tensorCoords]\n{, im2colInfo } {, cache_policy}", "syntax_forms": [{"syntax": "// global -> L2:\ncp.async.bulk.prefetch.tensor.dim.L2.src{.load_mode}{.level::cache_hint} [tensorMap, tensorCoords]\n{, im2colInfo } {, cache_policy}", "description": "cp.async.bulk.prefetch.tensor is a non-blocking instruction which may initiate an asynchronous\nprefetch of tensor data from the location in.src statespace to the L2 cache. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "global -> L2:", "desc": "Operand"}], "semantics": null, "examples": ".reg .b16 ctaMask, im2colwHalo, im2colOff;\n.reg .u16 i2cOffW, i2cOffH, i2cOffD;\n.reg .b64 l2CachePolicy;\n\ncp.async.bulk.prefetch.tensor.1d.L2.global.tile  [tensorMap0, {tc0}];\n// (truncated - see the official PTX ISA docs for the full example)", "description": "cp.async.bulk.prefetch.tensor is a non-blocking instruction which may initiate an asynchronous\nprefetch of tensor data from the location in.src statespace to the L2 cache.\nThe operand tensorMap is the generic address of the opaque tensor-map object which resides\nin.param space or.const space or.global space. The operand tensorMap specifies\nthe properties of the tensor copy operation, as described in Tensor-map.\nThe tensorMap is accessed in tensormap proxy. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-cp-async-bulk-prefetch-tensor", "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.async.bulk.tensor", "mnemonic": "cp.async.bulk.tensor", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.async.bulk.tensor", "category": "Data Movement and Conversion Instructions", "summary": "cp.async.bulk.tensor is a non-blocking instruction which initiates an asynchronous copy operation of tensor data from the location in.src state space to the location in the.dst state space.", "syntax": "// global -> shared::cta\ncp.async.bulk.tensor.dim.dst.src{.load_mode}.completion_mechanism{.cta_group}{.level::cache_hint}\n[dstMem], [tensorMap, tensorCoords], [mbar]{, im2colInfo} {, cache_policy}", "syntax_forms": [{"syntax": "// global -> shared::cta\ncp.async.bulk.tensor.dim.dst.src{.load_mode}.completion_mechanism{.cta_group}{.level::cache_hint}\n[dstMem], [tensorMap, tensorCoords], [mbar]{, im2colInfo} {, cache_policy}", "description": "cp.async.bulk.tensor is a non-blocking instruction which initiates an asynchronous copy\noperation of tensor data from the location in.src state space to the location in the.dst state space. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": ".reg .b16 ctaMask;\n.reg .u16 i2cOffW, i2cOffH, i2cOffD;\n.reg .b64 l2CachePolicy;\n\ncp.async.bulk.tensor.1d.shared::cta.global.mbarrier::complete_tx::bytes.tile  [sMem0], [tensorMap0, {tc0}], [mbar0];\n// (truncated - see the official PTX ISA docs for the full example)", "description": "cp.async.bulk.tensor is a non-blocking instruction which initiates an asynchronous copy\noperation of tensor data from the location in.src state space to the location in the.dst state space.\nThe operand dstMem specifies the location in the.dst state space into which the tensor data\nhas to be copied and srcMem specifies the location in the.src state space from which the\ntensor data has to be copied.\nWhen.dst is specified as.shared::cta, the address dstMem must be in the shared memory\nof the executing CTA within the cluster, otherwise the behavior is undefined. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-cp-async-bulk-tensor", "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.async.bulk.wait_group", "mnemonic": "cp.async.bulk.wait_group", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.async.bulk.wait_group", "category": "Data Movement and Conversion Instructions", "summary": "cp.async.bulk.wait_group instruction will cause the executing thread to wait until only N or fewer of the most recent bulk async-groups are pending and all the prior bulk async-groups committed by the executing threads are complete.", "syntax": "cp.async.bulk.wait_group{.read} N;", "syntax_forms": [{"syntax": "cp.async.bulk.wait_group{.read} N;", "description": "cp.async.bulk.wait_group instruction will cause the executing thread to wait until only N or fewer of the most recent bulk async-groups are pending and all the prior bulk async-groups committed by the… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "N", "desc": "Operand"}], "semantics": null, "examples": "cp.async.bulk.wait_group.read   0;\ncp.async.bulk.wait_group        2;", "description": "cp.async.bulk.wait_group instruction will cause the executing thread to wait until only N or\nfewer of the most recent bulk async-groups are pending and all the prior bulk async-groups committed by the executing threads are complete. For example, when N is 0, the executing thread\nwaits on all the prior bulk async-groups to complete. Operand N is an integer constant.\nBy default, cp.async.bulk.wait_group instruction will cause the executing thread to wait until\ncompletion of all the bulk async operations in the specified bulk async-group. A bulk async\noperation includes the following:\nOptionally, reading from the tensormap. Reading from the source locations. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.async.commit_group", "mnemonic": "cp.async.commit_group", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.async.commit_group", "category": "Data Movement and Conversion Instructions", "summary": "cp.async.commit_group instruction creates a new cp.async-group per thread and batches all prior cp.async instructions initiated by the executing thread but not committed to any cp.async-group into the new cp.async-group.", "syntax": "cp.async.commit_group ;", "syntax_forms": [{"syntax": "cp.async.commit_group ;", "description": "cp.async.commit_group instruction creates a new cp.async-group per thread and batches all\nprior cp.async instructions initiated by the executing thread but not committed to any cp. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Example 1:\ncp.async.ca.shared.global [shrd], [gbl], 4;\ncp.async.commit_group ; // Marks the end of a cp.async group\n\n// Example 2:\ncp.async.ca.shared.global [shrd1],   [gbl1],   8;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "cp.async.commit_group instruction creates a new cp.async-group per thread and batches all\nprior cp.async instructions initiated by the executing thread but not committed to any cp.async-group into the new cp.async-group. If there are no uncommitted cp.async instructions then cp.async.commit_group results in an empty cp.async-group.\nAn executing thread can wait for the completion of all cp.async operations in a cp.async-group using cp.async.wait_group.\nThere is no memory ordering guarantee provided between any two cp.async operations within the\nsame cp.async-group. So two or more cp.async operations within a cp.async-group copying data\nto the same location results in undefined behavior.", "sourceUrl": null, "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.async.mbarrier.arrive", "mnemonic": "cp.async.mbarrier.arrive", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.async.mbarrier.arrive", "category": "Parallel Synchronization and Communication Instructions", "summary": "Causes an arrive-on operation to be triggered by the system on the mbarrier object upon the completion of all prior cp.async operations initiated by the executing thread.", "syntax": "cp.async.mbarrier.arrive{.noinc}{.shared{::cta}}.b64 [addr];", "syntax_forms": [{"syntax": "cp.async.mbarrier.arrive{.noinc}{.shared{::cta}}.b64 [addr];", "description": "Causes an arrive-on operation to be\ntriggered by the system on the mbarrier object upon the completion of all prior cp.async operations initiated by the\nexecuting thread. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Example 1: no .noinc\nmbarrier.init.shared.b64 [shMem], threadCount;\n....\ncp.async.ca.shared.global [shard1], [gbl1], 4;\ncp.async.cg.shared.global [shard2], [gbl2], 16;\n....\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Causes an arrive-on operation to be\ntriggered by the system on the mbarrier object upon the completion of all prior cp.async operations initiated by the\nexecuting thread. The mbarrier object is at the location specified by the operand addr. The arrive-on operation is\nasynchronous to execution of cp.async.mbarrier.arrive.\nWhen.noinc modifier is not specified, the pending count of the mbarrier object is incremented\nby 1 prior to the asynchronous arrive-on operation. This\nresults in a zero-net change for the pending count from the asynchronous arrive-on operation\nduring the current phase. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-cp-async-mbarrier-arrive", "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.async.wait_all", "mnemonic": "cp.async.wait_all", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.async.wait_all", "category": "Data Movement and Conversion Instructions", "summary": "cp.async.wait_all instruction will cause the executing thread to wait until all the prior cp.async operations are complete. It is equivalent to cp.async.commit_group immediately followed by cp.async.wait_group 0.", "syntax": "cp.async.wait_all;", "syntax_forms": [{"syntax": "cp.async.wait_all;", "description": "cp.async.wait_all instruction will cause the executing thread to wait until all the prior cp.async operations are complete. It is equivalent to cp.async.commit_group immediately followed by cp.async.wait_group 0.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Example of .wait_all:\ncp.async.ca.shared.global [shrd1], [gbl1], 4;\ncp.async.cg.shared.global [shrd2], [gbl2], 16;\ncp.async.wait_all;  // waits for all prior cp.async to complete\n\n// Example of .wait_group :\n// (truncated - see the official PTX ISA docs for the full example)", "description": "cp.async.wait_all instruction will cause the executing thread to wait until all the prior cp.async operations are complete. It is equivalent to cp.async.commit_group immediately followed by cp.async.wait_group 0.", "sourceUrl": null, "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.async.wait_group", "mnemonic": "cp.async.wait_group", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.async.wait_group", "category": "Data Movement and Conversion Instructions", "summary": "cp.async.wait_group instruction will cause executing thread to wait till only N or fewer of the most recent cp.async-group s are pending and all the prior cp.async-group s committed by the executing threads are complete.", "syntax": "cp.async.wait_group N;", "syntax_forms": [{"syntax": "cp.async.wait_group N;", "description": "cp.async.wait_group instruction will cause executing thread to wait till only N or fewer of\nthe most recent cp.async-group s are pending and all the prior cp. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "N", "desc": "Operand"}], "semantics": null, "examples": "// Example of .wait_all:\ncp.async.ca.shared.global [shrd1], [gbl1], 4;\ncp.async.cg.shared.global [shrd2], [gbl2], 16;\ncp.async.wait_all;  // waits for all prior cp.async to complete\n\n// Example of .wait_group :\n// (truncated - see the official PTX ISA docs for the full example)", "description": "cp.async.wait_group instruction will cause executing thread to wait till only N or fewer of\nthe most recent cp.async-group s are pending and all the prior cp.async-group s committed by\nthe executing threads are complete. For example, when N is 0, the executing thread waits on all\nthe prior cp.async-group s to complete. Operand N is an integer constant.\ncp.async.wait_all is equivalent to:\ncp.async.commit_group;\ncp.async.wait_group 0;\nAn empty cp.async-group is considered to be trivially complete.\nWrites performed by cp.async operations are made visible to the executing thread only after:\nThe completion of cp.async.wait_all or The completion of cp.async.wait_group on the cp. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.reduce.async.bulk", "mnemonic": "cp.reduce.async.bulk", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.reduce.async.bulk", "category": "Data Movement and Conversion Instructions", "summary": "cp.reduce.async.bulk is a non-blocking instruction which initiates an asynchronous reduction operation on an array of memory locations specified by the destination address operand dstMem with the source array whose location is specified by the source address operand srcMem.", "syntax": "cp.reduce.async.bulk{.sem.scope}.dst.src.completion_mechanism.redOp.type", "syntax_forms": [{"syntax": "cp.reduce.async.bulk{.sem.scope}.dst.src.completion_mechanism.redOp.type", "description": "cp.reduce.async.bulk is a non-blocking instruction which initiates an asynchronous reduction operation on an array of memory locations specified by the destination address operand dstMem with the sour… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "cp.reduce.async.bulk.shared::cluster.shared::cta.mbarrier::complete_tx::bytes.add.u64\n                                                                  [dstMem], [srcMem], size, [mbar];\n\ncp.reduce.async.bulk.shared::cluster.shared::cta.mbarrier::complete_tx::bytes.min.s32\n                                                                  [dstMem], [srcMem], size, [mbar];\n// (truncated - see the official PTX ISA docs for the full example)", "description": "cp.reduce.async.bulk is a non-blocking instruction which initiates an asynchronous reduction\noperation on an array of memory locations specified by the destination address operand dstMem with the source array whose location is specified by the source address operand srcMem. The size\nof the source and the destination array must be the same and is specified by the operand size.\nEach data element in the destination array is reduced inline with the corresponding data element in\nthe source array with the reduction operation specified by the modifier.redOp. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-cp-reduce-async-bulk", "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cp.reduce.async.bulk.tensor", "mnemonic": "cp.reduce.async.bulk.tensor", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cp.reduce.async.bulk.tensor", "category": "Data Movement and Conversion Instructions", "summary": "cp.reduce.async.bulk.tensor is a non-blocking instruction which initiates an asynchronous reduction operation of tensor data in the.dst state space with tensor data in the.src state space.", "syntax": "// shared::cta -> global:\ncp.reduce.async.bulk.tensor.dim.dst.src.redOp{.load_mode}.completion_mechanism{.level::cache_hint}\n[tensorMap, tensorCoords], [srcMem] {,cache_policy}", "syntax_forms": [{"syntax": "// shared::cta -> global:\ncp.reduce.async.bulk.tensor.dim.dst.src.redOp{.load_mode}.completion_mechanism{.level::cache_hint}\n[tensorMap, tensorCoords], [srcMem] {,cache_policy}", "description": "cp.reduce.async.bulk.tensor is a non-blocking instruction which initiates an asynchronous\nreduction operation of tensor data in the.dst state space with tensor data in the.src state space. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "cp.reduce.async.bulk.tensor.1d.global.shared::cta.add.tile.bulk_group\n                                             [tensorMap0, {tc0}], [sMem0];\n\ncp.reduce.async.bulk.tensor.2d.global.shared::cta.and.bulk_group.L2::cache_hint\n                                             [tensorMap1, {tc0, tc1}], [sMem1] , policy;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "cp.reduce.async.bulk.tensor is a non-blocking instruction which initiates an asynchronous\nreduction operation of tensor data in the.dst state space with tensor data in the.src state space.\nThe operand srcMem specifies the location of the tensor data in the.src state space using\nwhich the reduction operation has to be performed.\nThe operand tensorMap is the generic address of the opaque tensor-map object which resides\nin.param space or.const space or.global space. The operand tensorMap specifies\nthe properties of the tensor copy operation, as described in Tensor-map.\nThe tensorMap is accessed in tensormap proxy. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-cp-reduce-async-bulk-tensor", "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.createpolicy", "mnemonic": "createpolicy", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "createpolicy", "category": "Data Movement and Conversion Instructions", "summary": "The createpolicy instruction creates a cache eviction policy for the specified cache level in an opaque 64-bit register specified by the destination operand cache_policy.", "syntax": "// Range-based policy\ncreatepolicy.range{.global}.level::primary_priority{.level::secondary_priority}.b64\ncache_policy, [a], primary-size, total-size;", "syntax_forms": [{"syntax": "// Range-based policy\ncreatepolicy.range{.global}.level::primary_priority{.level::secondary_priority}.b64\ncache_policy, [a], primary-size, total-size;", "description": "The createpolicy instruction creates a cache eviction policy for the specified cache level in an\nopaque 64-bit register specified by the destination operand cache_policy. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.4"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "Range-based policy", "desc": "Operand"}], "semantics": null, "examples": "createpolicy.fractional.L2::evict_last.b64                      policy, 1.0;\ncreatepolicy.fractional.L2::evict_last.L2::evict_unchanged.b64  policy, 0.5;\n\ncreatepolicy.range.L2::evict_last.L2::evict_first.b64\n                                            policy, [ptr], 0x100000, 0x200000;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "The createpolicy instruction creates a cache eviction policy for the specified cache level in an\nopaque 64-bit register specified by the destination operand cache_policy. The cache eviction\npolicy specifies how cache eviction priorities are applied to global memory addresses used in memory\noperations with.level::cache_hint qualifier.\nThere are two types of cache eviction policies:\nRange-based policy The cache eviction policy created using createpolicy.range specifies the cache eviction\nbehaviors for the following three address ranges: [a.. a + (primary-size - 1)] referred to as primary range. [a + primary-size.. a + (total-size - 1)] referred to as trailing secondary range. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-createpolicy", "introducedIn": "PTX ISA 7.4", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cvt", "mnemonic": "cvt", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Convert", "category": "Data Movement and Conversion Instructions", "summary": "Convert a value between integer and/or floating-point types with an explicit rounding mode.", "syntax": "cvt.dtype.atype d, a;", "syntax_forms": [{"syntax": "cvt.dtype.atype d, a;", "description": "Type conversion between the source (atype) and destination (dtype) types.", "dataTypes": ["s8", "s16", "s32", "s64", "u8", "u16", "u32", "u64", "f16", "f32", "f64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}, {"syntax": "cvt.rn.f32.f64 d, a;", "description": "Floating-point narrowing/widening conversion with explicit IEEE rounding mode.", "dataTypes": ["f32", "f64"], "stateSpaces": [], "scopes": [], "modifiers": ["rn", "rz", "rm", "rp"], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f16", "f32", "f64", "s16", "s32", "s64", "s8", "u16", "u32", "u64", "u8"], "stateSpaces": [], "scopes": [], "modifiers": ["rm", "rn", "rp", "rz"], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "d = convert(a, atype -> dtype) using the specified rounding mode; saturating forms clamp on overflow.", "examples": "cvt.f32.s32 f,i;\ncvt.s32.f64 j,r;     // float-to-int saturates by default\ncvt.rni.f32.f32 x,y; // round to nearest int, result is fp\ncvt.f32.f32 x,y;     // note .ftz behavior for sm_1x targets\ncvt.rn.relu.f16.f32      b, f;        // result is saturated with .relu saturation mode\ncvt.rz.f16x2.f32         b1, f, f1;   // convert two fp32 values to packed fp16 outputs\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Convert between different types and sizes.\nFor.f16x2 and.bf16x2 instruction type, two inputs a and b of.f32 type are\nconverted into.f16 or.bf16 type and the converted values are packed in the destination\nregister d, such that the value converted from input a is stored in the upper half of d and the value converted from input b is stored in the lower half of d\nFor.f16x2 instruction type, destination operand d has.f16x2 or.b32 type. For.bf16 instruction type, operand d has.b16 type. For.bf16x2 instruction type,\noperand d has.b32 type. For.tf32 instruction type, operand d has.b32 type.\nWhen converting to.e4m3x2 /.e5m2x2 data formats, the destination operand d has.b16 type. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-cvt", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cvt.pack", "mnemonic": "cvt.pack", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cvt.pack", "category": "Data Movement and Conversion Instructions", "summary": "Convert two 32-bit integers a and b into specified type and pack the results into d.", "syntax": "cvt.pack.sat.convertType.abType  d, a, b;", "syntax_forms": [{"syntax": "cvt.pack.sat.convertType.abType  d, a, b;", "description": "Convert two 32-bit integers a and b into specified type and pack the results into d.\nDestination d is an unsigned 32-bit integer. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_72"], "introducedIn": "PTX ISA 6.5"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}], "semantics": "ta = a < MIN(convertType) ? MIN(convertType) : a;\nta = a > MAX(convertType) ? MAX(convertType) : a;\ntb = b < MIN(convertType) ? MIN(convertType) : b;\ntb = b > MAX(convertType) ? MAX(convertType) : b;\n\nsize = sizeInBits(convertType);\ntd = tb ;\nfor (i = size; i <= 2 * size - 1; i++) {\n    td[i] = ta[i - size];\n}\n\nif (isU16(convertType) || isS16(convertType)) {\n    d = td;\n} else {\n    for (i = 0; i < 2 * size; i++) {\n        d[i] = td[i];\n    }\n    for (i = 2 * size; i <= 31; i++) {\n        d[i] = c[i - 2 * size];\n    }\n}", "examples": "cvt.pack.sat.s16.s32      %r1, %r2, %r3;           // 32-bit to 16-bit conversion\ncvt.pack.sat.u8.s32.b32   %r4, %r5, %r6, 0;        // 32-bit to 8-bit conversion\ncvt.pack.sat.u8.s32.b32   %r7, %r8, %r9, %r4;      // %r7 = { %r5, %r6, %r8, %r9 }\ncvt.pack.sat.u4.s32.b32   %r10, %r12, %r13, %r14;  // 32-bit to 4-bit conversion\ncvt.pack.sat.s2.s32.b32   %r15, %r16, %r17, %r18;  // 32-bits to 2-bit conversion", "description": "Convert two 32-bit integers a and b into specified type and pack the results into d.\nDestination d is an unsigned 32-bit integer. Source operands a and b are integers of\ntype.abType and the source operand c is an integer of type.cType.\nThe inputs a and b are converted to values of type specified by.convertType with\nsaturation and the results after conversion are packed into lower bits of d.\nIf operand c is specified then remaining bits of d are copied from lower bits of c.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-cvt-pack", "introducedIn": "PTX ISA 6.5", "requiredTargets": ["sm_72"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.cvta", "mnemonic": "cvta", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "cvta", "category": "Data Movement and Conversion Instructions", "summary": "Convert a const, Kernel Function Parameters (.param ), global, local, or shared address to a generic address, or vice-versa.", "syntax": "// convert const, global, local, or shared address to generic address\ncvta.space.size  p, a;        // source address in register a", "syntax_forms": [{"syntax": "// convert const, global, local, or shared address to generic address\ncvta.space.size  p, a;        // source address in register a", "description": "Convert a const, Kernel Function Parameters (.param ), global, local, or shared address to a generic address, or vice-versa. The\nsource and destination addresses must be the same size. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "cvta.const.u32   ptr,cvar;\ncvta.local.u32   ptr,lptr;\ncvta.shared::cta.u32  p,As+4;\ncvta.shared::cluster.u32 ptr, As;\ncvta.to.global.u32  p,gptr;\ncvta.param.u64   ptr,pvar;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Convert a const, Kernel Function Parameters (.param ), global, local, or shared address to a generic address, or vice-versa. The\nsource and destination addresses must be the same size. Use cvt.u32.u64 or cvt.u64.u32 to\ntruncate or zero-extend addresses.\nFor variables declared in.const, Kernel Function Parameters (.param ),.global,.local, or.shared state space, the generic address of the variable may be taken using cvta. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-cvta", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.discard", "mnemonic": "discard", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "discard", "category": "Data Movement and Conversion Instructions", "summary": "Semantically, this behaves like a weak write of an unstable indeterminate value: reads of memory locations with unstable indeterminate values may return different bit patterns each time until the memory is overwritten.", "syntax": "discard{.global}.level  [a], size;", "syntax_forms": [{"syntax": "discard{.global}.level  [a], size;", "description": "Semantically, this behaves like a weak write of an unstable indeterminate value: reads of memory locations with unstable indeterminate values may return different bit patterns each time until the memo… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.4"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "discard.global.L2 [ptr], 128;\nld.weak.u32 r0, [ptr];\nld.weak.u32 r1, [ptr];\n// The values in r0 and r1 may differ!", "description": "Semantically, this behaves like a weak write of an unstable indeterminate value:\nreads of memory locations with unstable indeterminate values may return different\nbit patterns each time until the memory is overwritten.\nThis operation hints to the implementation that data in the specified cache.level can be destructively discarded without writing it back to memory.\nThe operand size is an integer constant that specifies the length in bytes of the\naddress range [a, a + size) to write unstable indeterminate values into.\nThe only supported value for the size operand is 128.\nIf no state space is specified then Generic Addressing is used. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-discard", "introducedIn": "PTX ISA 7.4", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.div", "mnemonic": "div", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Divide", "category": "Arithmetic", "summary": "Divide the first operand by the second.", "syntax": "div.stype d, a, b;", "syntax_forms": [{"syntax": "div.stype d, a, b;", "description": "Integer division.", "dataTypes": ["s32", "s64", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}, {"syntax": "div.approx.f32 d, a, b;", "description": "Fast approximate single-precision division.", "dataTypes": ["f32"], "stateSpaces": [], "scopes": [], "modifiers": ["approx"], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}, {"syntax": "div.rn.f64 d, a, b;", "description": "IEEE-754 round-to-nearest double-precision division.", "dataTypes": ["f64"], "stateSpaces": [], "scopes": [], "modifiers": ["rn"], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32", "f64", "s32", "s64", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": ["approx", "rn"], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Dividend"}, {"name": "b", "desc": "Divisor"}], "semantics": "d = a / b.", "examples": "div.s32  b,n,i;\n\ndiv.approx.ftz.f32  diam,circum,3.14159;\ndiv.full.ftz.f32    x, y, z;\ndiv.rn.f64          xd, yd, zd;", "description": "Divides a by b, stores result in d.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-div", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.dp2a", "mnemonic": "dp2a", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "dp2a", "category": "Integer Arithmetic Instructions", "summary": "Two-way 16-bit to 8-bit dot product which is accumulated in 32-bit result.", "syntax": "dp2a.mode.atype.btype  d, a, b, c;", "syntax_forms": [{"syntax": "dp2a.mode.atype.btype  d, a, b, c;", "description": "Two-way 16-bit to 8-bit dot product which is accumulated in 32-bit result.\nOperand a and b are 32-bit inputs. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_61"], "introducedIn": "PTX ISA 5.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c", "desc": "Source operand"}], "semantics": "d = c;\n// Extract two 16-bit values from a 32-bit input and sign or zero extend\n// based on input type.\nVa = extractAndSignOrZeroExt_2(a, .atype);\n\n// Extract four 8-bit values from a 32-bit input and sign or zer extend\n// based on input type.\nVb = extractAndSignOrZeroExt_4(b, .btype);\n\nb_select = (.mode == .lo) ? 0 : 2;\n\nfor (i = 0; i < 2; ++i) {\n    d += Va[i] * Vb[b_select + i];\n}", "examples": "dp2a.lo.u32.u32           d0, a0, b0, c0;\ndp2a.hi.u32.s32           d1, a1, b1, c1;", "description": "Two-way 16-bit to 8-bit dot product which is accumulated in 32-bit result.\nOperand a and b are 32-bit inputs. Operand a holds two 16-bits inputs in packed form and\noperand b holds 4 byte inputs in packed form for dot product.\nDepending on the.mode specified, either lower half or upper half of operand b will be used\nfor dot product.\nOperand c has type.u32 if both.atype and.btype are.u32 else operand c has type.s32.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-dp2a", "introducedIn": "PTX ISA 5.0", "requiredTargets": ["sm_61"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.dp4a", "mnemonic": "dp4a", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "dp4a", "category": "Integer Arithmetic Instructions", "summary": "Four-way byte dot product which is accumulated in 32-bit result.", "syntax": "dp4a.atype.btype  d, a, b, c;", "syntax_forms": [{"syntax": "dp4a.atype.btype  d, a, b, c;", "description": "Four-way byte dot product which is accumulated in 32-bit result.\nOperand a and b are 32-bit inputs which hold 4 byte inputs in packed form for dot product.\nOperand c has type.u32 if both.atype and. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_61"], "introducedIn": "PTX ISA 5.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c", "desc": "Source operand"}], "semantics": "d = c;\n\n// Extract 4 bytes from a 32bit input and sign or zero extend\n// based on input type.\nVa = extractAndSignOrZeroExt_4(a, .atype);\nVb = extractAndSignOrZeroExt_4(b, .btype);\n\nfor (i = 0; i < 4; ++i) {\n    d += Va[i] * Vb[i];\n}", "examples": "dp4a.u32.u32           d0, a0, b0, c0;\ndp4a.u32.s32           d1, a1, b1, c1;", "description": "Four-way byte dot product which is accumulated in 32-bit result.\nOperand a and b are 32-bit inputs which hold 4 byte inputs in packed form for dot product.\nOperand c has type.u32 if both.atype and.btype are.u32 else operand c has type.s32.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-dp4a", "introducedIn": "PTX ISA 5.0", "requiredTargets": ["sm_61"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.elect.sync", "mnemonic": "elect.sync", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "elect.sync", "category": "Parallel Synchronization and Communication Instructions", "summary": "elect.sync elects one predicated active leader thread from among a set of threads specified by membermask.", "syntax": "elect.sync d|p, membermask;", "syntax_forms": [{"syntax": "elect.sync d|p, membermask;", "description": "elect.sync elects one predicated active leader thread from among a set of threads specified by membermask. laneid of the elected thread is returned in the 32-bit destination operand d. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d|p", "desc": "Operand"}, {"name": "membermask", "desc": "Operand"}], "semantics": null, "examples": "elect.sync    %r0|%p0, 0xffffffff;", "description": "elect.sync elects one predicated active leader thread from among a set of threads specified by membermask. laneid of the elected thread is returned in the 32-bit destination operand d. The sink symbol ‘_’ can be used for destination operand d. The predicate destination p is set to True for the leader thread, and False for all other threads.\nOperand membermask specifies a 32-bit integer indicating the set of threads from which a leader\nis to be elected. The behavior is undefined if the executing thread is not in membermask.\nElection of a leader thread happens deterministically, i.e. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-elect-sync", "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.ex2", "mnemonic": "ex2", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "ex2", "category": "Half Precision Floating-Point Instructions", "summary": "Raise 2 to the power a.", "syntax": "ex2.approx{.ftz}.f32  d, a;", "syntax_forms": [{"syntax": "ex2.approx{.ftz}.f32  d, a;", "description": "Raise 2 to the power a.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_75"], "introducedIn": "PTX ISA 1.0"}, {"syntax": "ex2.approx.atype     d, a;", "description": "Raise 2 to the power a.\nThe type of operands d and a are as specified by.type.\nFor.f16x2 or. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_75"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "if (.type == .f16 || .type == .bf16) {\n  d = 2 ^ a\n} else if (.type == .f16x2 || .type == .bf16x2) {\n  fA[0] = a[0:15];\n  fA[1] = a[16:31];\n  d[0] = 2 ^ fA[0]\n  d[1] = 2 ^ fA[1]\n}", "examples": "ex2.approx.ftz.f32  xa, a;\n\nex2.approx.f16         h1, h0;\nex2.approx.f16x2       hd1, hd0;\nex2.approx.ftz.bf16    b1, b2;\nex2.approx.ftz.bf16x2  hb1, hb2;", "description": "Raise 2 to the power a.\nThe type of operands d and a are as specified by.type.\nFor.f16x2 or.bf16x2 instruction type, each of the half-word operands are operated in\nparallel and the results are packed appropriately into a.f16x2 or.bf16x2.\nFor.f16 instruction type, operands d and a have.f16 or.b16 type.\nFor.f16x2 instruction type, operands d and a have.f16x2 or.b32 type.\nFor.bf16 instruction type, operands d and a have.b16 type.\nFor.bf16x2 instruction type, operands d and a have.b32 type.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#half-precision-floating-point-instructions-ex2", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_75"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.exit", "mnemonic": "exit", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "exit", "category": "Control Flow Instructions", "summary": "Ends execution of a thread.\nBarriers exclusively waiting on arrivals from exited threads are always released.", "syntax": "exit;", "syntax_forms": [{"syntax": "exit;", "description": "Ends execution of a thread.\nBarriers exclusively waiting on arrivals from exited threads are always released.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "exit;\n@p  exit;", "description": "Ends execution of a thread.\nBarriers exclusively waiting on arrivals from exited threads are always released.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#control-flow-instructions-exit", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.fabric.submit", "mnemonic": "fabric.submit", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "fabric.submit", "category": "Fabric Instructions", "summary": "Submits prior fabric operations issued by the current thread.", "syntax": "fabric.submit{.submitop};", "syntax_forms": [{"syntax": "fabric.submit{.submitop};", "description": "Submits prior fabric operations issued by the current thread. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100"], "introducedIn": "PTX ISA 9.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "fabric.submit.op_restrict::fetching;\n\nfabric.submit;", "description": "Submits prior fabric operations issued by the current thread. For any thread to observe completion\nof fabric operations via an mbarrier object, the issuing thread is required to submit those\noperations before the barrier phase tracking these operations advances. Otherwise, the behavior is\nundefined. See Life of a Fabric Operation.\nIf.op_restrict::fetching is specified, then only prior fabric.try_get and fabric.try_pullred operations issued by the current thread are submitted. Otherwise, all prior\nfabric operations issued by the current thread are submitted.\nThis operation has no effect on fabric operations that have already been submitted.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#fabric-instructions-submit", "introducedIn": "PTX ISA 9.3", "requiredTargets": ["sm_100"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.fabric.try_get", "mnemonic": "fabric.try_get", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "fabric.try_get", "category": "Fabric Instructions", "summary": "Asynchronously copies size bytes from fabric handle [srcLeId, srcDataOff] to destination memory [dst], where srcLeId is a 32-bit unsigned value denoting the logical endpoint identifier, and…", "syntax": "fabric.try_get.async.dst.completion_mechanism.sem.scope.b128 [dst], [srcLeId, srcDataOff], size, [bar];", "syntax_forms": [{"syntax": "fabric.try_get.async.dst.completion_mechanism.sem.scope.b128 [dst], [srcLeId, srcDataOff], size, [bar];", "description": "Asynchronously copies size bytes from fabric handle [srcLeId, srcDataOff] to destination memory [dst], where srcLeId is a 32-bit unsigned value denoting the logical endpoint identifier, and srcDataOff… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100"], "introducedIn": "PTX ISA 9.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "fabric.try_get.async.shared::cta.mbarrier::complete_tx::bytes.mbarrier::report::fabric.relaxed.sys.b128 [dstSmem], [srcLeId, srcLeOff], 0x100, [mbar];\n\nfabric.try_get.async.shared::cta.relaxed.sys.mbarrier::complete_tx::bytes.mbarrier::report::fabric.b128 [dstSmem], [srcLeId, srcLeOff], sizeBytes, [mbar];", "description": "Asynchronously copies size bytes from fabric handle [srcLeId, srcDataOff] to destination\nmemory [dst], where srcLeId is a 32-bit unsigned value denoting the logical endpoint\nidentifier, and srcDataOff is a 64-bit unsigned value denoting the base offset of the\nresource to access within the logical endpoint associated with srcLeId.\nThe logical endpoint associated with srcLeId must be a unicast logical endpoint.\nThe size operand is 32 bits and specifies the number of bytes to be copied. It must be a\nmultiple of 16; otherwise, the behavior is undefined. The range [dst, dst + size - 1] must be\nin bounds of the destination memory space. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 9.3", "requiredTargets": ["sm_100"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.fabric.try_pullred", "mnemonic": "fabric.try_pullred", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "fabric.try_pullred", "category": "Fabric Instructions", "summary": "Initiates asynchronous loads from multiple resources pointed to by multicast fabric handle [srcLeId, srcDataOff], of size bytes, and performs element-", "syntax": "fabric.try_pullred.async.multimem.dst.completion_mechanism.sem.scope.redOpBit.typeBit.sync [dst], [srcLeId, srcDataOff], size, [bar], imm-membermask;", "syntax_forms": [{"syntax": "fabric.try_pullred.async.multimem.dst.completion_mechanism.sem.scope.redOpBit.typeBit.sync [dst], [srcLeId, srcDataOff], size, [bar], imm-membermask;", "description": "Initiates asynchronous loads from multiple resources pointed to by multicast fabric handle [srcLeId, srcDataOff], of size bytes, and performs element-wise reduction on data across\neach of the loads. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100"], "introducedIn": "PTX ISA 9.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "fabric.try_pullred.async.multimem.mbarrier::complete_tx::bytes.mbarrier::report::fabric.shared::cta.f32.add.sync.relaxed.sys [dst], [leId, offset], size, [mbar], imm-membermask;", "description": "Initiates asynchronous loads from multiple resources pointed to by multicast fabric handle [srcLeId, srcDataOff], of size bytes, and performs element-wise reduction on data across\neach of the loads. The result is stored in [dst, dst + size - 1]. srcLeId is a 32-bit\nunsigned value denoting the logical endpoint identifier, and srcDataOff is a 64-bit unsigned\nvalue denoting the base offset of the resources to access within the multicast logical endpoint\nassociated with srcLeId.\nThe size operand is 32 bits and specifies the number of bytes to be copied. It must be a\nmultiple of 16; otherwise, the behavior is undefined. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 9.3", "requiredTargets": ["sm_100"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.fabric.try_put", "mnemonic": "fabric.try_put", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "fabric.try_put", "category": "Fabric Instructions", "summary": "Asynchronously copies size bytes from [src] to destination fabric handle [dstLeId, dstDataOff], where dstLeId is a 32-bit unsigned value denoting the logical endpoint identifier, and dstDataOff is a…", "syntax": "fabric.try_put.async{.multimem}.src.completion_mechanism0.sem.scope.b128 [dstLeId, dstDataOff], [src], size, [bar];", "syntax_forms": [{"syntax": "fabric.try_put.async{.multimem}.src.completion_mechanism0.sem.scope.b128 [dstLeId, dstDataOff], [src], size, [bar];", "description": "Asynchronously copies size bytes from [src] to destination fabric handle [dstLeId, dstDataOff], where dstLeId is a 32-bit unsigned value denoting the logical\nendpoint identifier, and dstDataOff is a 6 (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100"], "introducedIn": "PTX ISA 9.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "fabric.try_put.async.shared::cta.mbarrier::complete_tx::16B.mbarrier::report::fabric.relaxed.sys.b128 [dstLeId, dstLeOffData], [srcSmem], 0x100, [mbar];\n\nfabric.try_put.async.counted::bytes.shared::cta.mbarrier::complete_tx::16B.mbarrier::report::fabric.relaxed.sys.b128 [dstLeId, dstLeOffData, dstLeOffCntr], [srcSmem], size, [mbar];", "description": "Asynchronously copies size bytes from [src] to destination fabric handle [dstLeId, dstDataOff], where dstLeId is a 32-bit unsigned value denoting the logical\nendpoint identifier, and dstDataOff is a 64-bit unsigned value denoting the base offset of\nthe resource to access within the logical endpoint associated with dstLeId.\nThe size operand is 32 bits and specifies the number of bytes to be copied. It must be a\nmultiple of 16; otherwise, the behavior is undefined. The range [src, src + size - 1] must\nbe in bounds of the source memory space. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 9.3", "requiredTargets": ["sm_100"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.fabric.try_red", "mnemonic": "fabric.try_red", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "fabric.try_red", "category": "Fabric Instructions", "summary": "Asynchronously copies size bytes from [src] to destination fabric handle [dstLeId, dstDataOff] with element-wise reduction, where dstLeId is a 32-bit unsigned value denoting the logical endpoint…", "syntax": "fabric.try_red.async{.multimem}.src.completion_mechanism0.sem.scope.redOpBit.typeBit [dstLeId, dstDataOff], [src], size, [bar];", "syntax_forms": [{"syntax": "fabric.try_red.async{.multimem}.src.completion_mechanism0.sem.scope.redOpBit.typeBit [dstLeId, dstDataOff], [src], size, [bar];", "description": "Asynchronously copies size bytes from [src] to destination fabric handle [dstLeId, dstDataOff] with element-wise reduction, where dstLeId is a 32-bit unsigned value denoting the logical endpoint ident… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100"], "introducedIn": "PTX ISA 9.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "fabric.try_red.async.shared::cta.mbarrier::complete_tx::16B.mbarrier::report::fabric.relaxed.sys.add.u32 [dstLeId, dstLeOffData], [srcSmem], size, [mbar];\n\nfabric.try_red.async.counted::bytes.shared::cta.mbarrier::complete_tx::16B.mbarrier::report::fabric.add.u32 [dstLeId, dstLeOffData, dstLeOffCntr], [srcSmem], size, [mbar];", "description": "Asynchronously copies size bytes from [src] to destination fabric handle [dstLeId, dstDataOff] with element-wise reduction, where dstLeId is a 32-bit unsigned\nvalue denoting the logical endpoint identifier, and dstDataOff is a 64-bit unsigned value\ndenoting the base offset of the resource to access within the logical endpoint associated with dstLeId.\nThe size operand is 32 bits and specifies the number of bytes to be copied. It must be a\nmultiple of 16; otherwise, the behavior is undefined. The source range [src, src + size - 1] must be in bounds of the source memory space. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 9.3", "requiredTargets": ["sm_100"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.fabric.wait", "mnemonic": "fabric.wait", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "fabric.wait", "category": "Fabric Instructions", "summary": "Fabric-read completion mechanism instruction fabric.wait waits on the local shared memory (.shared::cta ) reads of submitted fabric operations.", "syntax": "fabric.wait.sync_restrict::reads;", "syntax_forms": [{"syntax": "fabric.wait.sync_restrict::reads;", "description": "Fabric-read completion mechanism instruction fabric.wait waits on the local\nshared memory (.shared::cta ) reads of submitted fabric operations. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100"], "introducedIn": "PTX ISA 9.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "fabric.wait.sync_restrict::reads;", "description": "Fabric-read completion mechanism instruction fabric.wait waits on the local\nshared memory (.shared::cta ) reads of submitted fabric operations. This enables\noverwriting the shared memory read by these operations before they complete.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#fabric-instructions-wait", "introducedIn": "PTX ISA 9.3", "requiredTargets": ["sm_100"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.fence", "mnemonic": "fence", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "fence", "category": "Parallel Synchronization and Communication Instructions", "summary": "The fence instruction establishes an ordering between memory accesses requested by this thread, as described by the memory consistency model.", "syntax": "// Thread fence:\nfence{.sem}.scope;", "syntax_forms": [{"syntax": "// Thread fence:\nfence{.sem}.scope;", "description": "The fence instruction establishes an ordering between memory accesses requested by this thread, as described by the memory consistency model.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.4"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "Thread fence:", "desc": "Operand"}], "semantics": null, "examples": "membar.gl;\nmembar.cta;\nmembar.sys;\nfence.sc.cta;\nfence.sc.cluster;\nfence.proxy.alias;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "The fence instruction establishes an ordering between memory accesses requested by this thread (ld, st, atom and red instructions), as described by the memory consistency model. fence.acq_rel is a light-weight fence sufficient for memory synchronization in most programs, while fence.sc is a slower fence that can restore sequential consistency when used in sufficient places, at the cost of performance. The legacy membar instruction covers the thread-scope membar.level forms.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-membar", "introducedIn": "PTX ISA 1.4", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.fma", "mnemonic": "fma", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Fused Multiply-Add", "category": "Arithmetic", "summary": "Compute (a * b) + c with a single rounding step for improved precision over mad.", "syntax": "fma.rn.f64 d, a, b, c;", "syntax_forms": [{"syntax": "fma.rn.f64 d, a, b, c;", "description": "Double-precision fused multiply-add.", "dataTypes": ["f64"], "stateSpaces": [], "scopes": [], "modifiers": ["rn"], "requiredTargets": ["sm_13"], "introducedIn": "PTX ISA 1.4"}, {"syntax": "fma.rn.f32 d, a, b, c;", "description": "Single-precision fused multiply-add.", "dataTypes": ["f32"], "stateSpaces": [], "scopes": [], "modifiers": ["rn"], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": ["f32", "f64"], "stateSpaces": [], "scopes": [], "modifiers": ["rn"], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Multiplicand"}, {"name": "b", "desc": "Multiplier"}, {"name": "c", "desc": "Addend"}], "semantics": "d = round_once(a * b + c), the product is not rounded before the addition.", "examples": "fma.rn.ftz.f32  w,x,y,z;\n@p  fma.rn.f64      d,a,b,c;\n    fma.rp.ftz.f32x2 p,q,r,s;\n\n// scalar f16 fused multiply-add\nfma.rn.f16         d0, a0, b0, c0;\nfma.rn.f16         d1, a1, b1, c1;\nfma.rn.relu.f16    d1, a1, b1, c1;\nfma.rn.oob.f16      d1, a1, b1, c1;\nfma.rn.oob.relu.f16 d1, a1, b1, c1;\n// (truncated - see the official PTX ISA docs for the full example)\n\n.reg .f32 fc, fd;\n.reg .f16 ha, hb;\nfma.rz.sat.f32.f16.sat   fd, ha, hb, fc;", "description": "Performs a fused multiply-add with no loss of precision in the intermediate product and addition.\nFor.f16x2 and.bf16x2 instruction type, forms input vectors by half word values from source\noperands. Half-word operands are then operated in parallel to produce.f16x2 or.bf16x2 result in destination.\nFor.f16 instruction type, operands d, a, b and c have.f16 or.b16 type. For.f16x2 instruction type, operands d, a, b and c have.b32 type. For.bf16 instruction type, operands d, a, b and c have.b16 type. For.bf16x2 instruction type, operands d, a, b and c have.b32 type.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#half-precision-floating-point-instructions-fma", "introducedIn": "PTX ISA 1.4", "requiredTargets": ["sm_13"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.fns", "mnemonic": "fns", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "fns", "category": "Integer Arithmetic Instructions", "summary": "Given a 32-bit value mask and an integer value base (between 0 and 31), find the n-th (given by offset) set bit in mask from the base bit, and store the bit position in d.", "syntax": "fns.b32 d, mask, base, offset;", "syntax_forms": [{"syntax": "fns.b32 d, mask, base, offset;", "description": "Given a 32-bit value mask and an integer value base (between 0 and 31), find the n-th (given\nby offset) set bit in mask from the base bit, and store the bit position in d. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 6.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "mask", "desc": "Operand"}, {"name": "base", "desc": "Operand"}, {"name": "offset", "desc": "Operand"}], "semantics": "d = 0xffffffff;\nif (offset == 0) {\n    if (mask[base] == 1) {\n        d = base;\n    }\n} else {\n    pos = base;\n    count = |offset| - 1;\n    inc = (offset > 0) ? 1 : -1;\n\n    while ((pos >= 0) && (pos < 32)) {\n        if (mask[pos] == 1) {\n            if (count == 0) {\n              d = pos;\n              break;\n           } else {\n               count = count - 1;\n           }\n        }\n        pos = pos + inc;\n    }\n}", "examples": "fns.b32 d, 0xaaaaaaaa, 3, 1;   // d = 3\nfns.b32 d, 0xaaaaaaaa, 3, -1;  // d = 3\nfns.b32 d, 0xaaaaaaaa, 2, 1;   // d = 3\nfns.b32 d, 0xaaaaaaaa, 2, -1;  // d = 1", "description": "Given a 32-bit value mask and an integer value base (between 0 and 31), find the n-th (given\nby offset) set bit in mask from the base bit, and store the bit position in d. If not\nfound, store 0xffffffff in d.\nOperand mask has a 32-bit type. Operand base has.b32,.u32 or.s32 type. Operand offset has.s32 type. Destination d has type.b32.\nOperand base must be <= 31, otherwise behavior is undefined.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-fns", "introducedIn": "PTX ISA 6.0", "requiredTargets": ["sm_30"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.getctarank", "mnemonic": "getctarank", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "getctarank", "category": "Data Movement and Conversion Instructions", "summary": "Write the destination register d with the rank of the CTA which contains the address specified in operand a.", "syntax": "getctarank{.space}.type d, a;", "syntax_forms": [{"syntax": "getctarank{.space}.type d, a;", "description": "Write the destination register d with the rank of the CTA which contains the address specified\nin operand a.\nInstruction type.type indicates the type of source operand a.\nWhen space is. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 7.8"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": null, "examples": "getctarank.shared::cluster.u32 d1, addr;\ngetctarank.shared::cluster.u64 d2, sh + 4;\ngetctarank.u64                 d3, src;", "description": "Write the destination register d with the rank of the CTA which contains the address specified\nin operand a.\nInstruction type.type indicates the type of source operand a.\nWhen space is.shared::cluster, source a is either a shared memory variable or a register\ncontaining a valid shared memory address. When the optional qualifier.space is not specified, a is a register containing a generic addresses pointing to shared memory. Destination d is\nalways a 32-bit register which holds the rank of the CTA.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-getctarank", "introducedIn": "PTX ISA 7.8", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.griddepcontrol", "mnemonic": "griddepcontrol", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "griddepcontrol", "category": "Parallel Synchronization and Communication Instructions", "summary": "The griddepcontrol instruction allows the dependent grids and prerequisite grids as defined by\nthe runtime, to control execution in the following way:", "syntax": "griddepcontrol.action;", "syntax_forms": [{"syntax": "griddepcontrol.action;", "description": "The griddepcontrol instruction allows the dependent grids and prerequisite grids as defined by\nthe runtime, to control execution in the following way:. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 7.8"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "griddepcontrol.launch_dependents;\ngriddepcontrol.wait;", "description": "The griddepcontrol instruction allows the dependent grids and prerequisite grids as defined by\nthe runtime, to control execution in the following way:.launch_dependents modifier signals that specific dependents the runtime system designated to\nreact to this instruction can be scheduled as soon as all other CTAs in the grid issue the same\ninstruction or have completed. The dependent may launch before the completion of the current\ngrid. There is no guarantee that the dependent will launch before the completion of the current\ngrid. Repeated invocations of this instruction by threads in the current CTA will have no additional\nside effects past that of the first invocation. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-griddepcontrol", "introducedIn": "PTX ISA 7.8", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.isspacep", "mnemonic": "isspacep", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "isspacep", "category": "Data Movement and Conversion Instructions", "summary": "Write predicate register p with 1 if generic address a falls within the specified state space window and with 0 otherwise.", "syntax": "isspacep.space  p, a;    // result is .pred", "syntax_forms": [{"syntax": "isspacep.space  p, a;    // result is .pred", "description": "Write predicate register p with 1 if generic address a falls within the specified state\nspace window and with 0 otherwise. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "isspacep.const           iscnst, cptr;\nisspacep.global          isglbl, gptr;\nisspacep.local           islcl,  lptr;\nisspacep.shared          isshrd, sptr;\nisspacep.param::entry    isparam, pptr;\nisspacep.shared::cta     isshrdcta, sptr;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Write predicate register p with 1 if generic address a falls within the specified state\nspace window and with 0 otherwise. Destination p has type.pred; the source address\noperand must be of type.u32 or.u64.\nisspacep.param{::entry} returns 1 if the generic address falls within the window of Kernel Function Parameters, otherwise returns 0. If.param is specified without any sub-qualifiers then it defaults to.param::entry.\nisspacep.global returns 1 for Kernel Function Parameters as.param window is contained within the.global window.\nIf no sub-qualifier is specified with.shared state space, then::cta is assumed by default.\nNote ispacep. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-isspacep", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.istypep", "mnemonic": "istypep", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "istypep", "category": "Texture Instructions", "summary": "Write predicate register p with 1 if register a points to an opaque variable of the\nspecified type, and with 0 otherwise. Destination p has type.pred;", "syntax": "istypep.type   p, a;  // result is .pred", "syntax_forms": [{"syntax": "istypep.type   p, a;  // result is .pred", "description": "Write predicate register p with 1 if register a points to an opaque variable of the\nspecified type, and with 0 otherwise. Destination p has type.pred; the source address\noperand must be of type.u64.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 4.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "istypep.texref istex, tptr;\nistypep.samplerref issampler, sptr;\nistypep.surfref issurface, surfptr;", "description": "Write predicate register p with 1 if register a points to an opaque variable of the\nspecified type, and with 0 otherwise. Destination p has type.pred; the source address\noperand must be of type.u64.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#texture-instructions-istypep", "introducedIn": "PTX ISA 4.0", "requiredTargets": ["sm_30"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.ld", "mnemonic": "ld", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Load", "category": "Data Movement and Conversion Instructions", "summary": "Load a value from the specified state space into a register.", "syntax": "ld.space.type d, [a];", "syntax_forms": [{"syntax": "ld.space.type d, [a];", "description": "Load from an explicit state space.", "dataTypes": ["b8", "b16", "b32", "b64", "s8", "s16", "s32", "s64", "u8", "u16", "u32", "u64", "f16", "f32", "f64"], "stateSpaces": ["global", "local", "shared", "param", "const"], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}, {"syntax": "ld.global.nc.type d, [a];", "description": "Load through the read-only (non-coherent) data cache.", "dataTypes": [], "stateSpaces": ["global"], "scopes": [], "modifiers": ["nc"], "requiredTargets": ["sm_35"], "introducedIn": "PTX ISA 4.0"}], "dataTypes": ["b16", "b32", "b64", "b8", "f16", "f32", "f64", "s16", "s32", "s64", "s8", "u16", "u32", "u64", "u8"], "stateSpaces": ["const", "global", "local", "param", "shared"], "scopes": [], "modifiers": ["nc"], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source address"}], "semantics": "d = *a, from the given state space.", "examples": "ld.global.f32    d,[a];\nld.shared.v4.b32 Q,[p];\nld.const.s32     d,[p+4];\nld.local.b32     x,[p+-8]; // negative offset\nld.local.b64     x,[240];  // immediate address\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Load register variable d from the location specified by the source address operand a in\nspecified state space. If no state space is given, perform the load using Generic Addressing.\nIf no sub-qualifier is specified with.shared state space, then::cta is assumed by default.\nSupported addressing modes for operand a and alignment requirements are described in Addresses as Operands\nIf no sub-qualifier is specified with.param state space, then:::func is assumed when access is inside a device function.::entry is assumed when accessing kernel function parameters from entry function. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-ld", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.ld.global.nc", "mnemonic": "ld.global.nc", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "ld.global.nc", "category": "Data Movement and Conversion Instructions", "summary": "Load register variable d from the location specified by the source address operand a in the global state space, and optionally cache in non-coherent read-only cache.", "syntax": "ld.global{.cop}.nc{.level::cache_hint}{.level::prefetch_size}.type                 d, [a]{, cache_policy};", "syntax_forms": [{"syntax": "ld.global{.cop}.nc{.level::cache_hint}{.level::prefetch_size}.type                 d, [a]{, cache_policy};", "description": "Load register variable d from the location specified by the source address operand a in the\nglobal state space, and optionally cache in non-coherent read-only cache. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_32"], "introducedIn": "PTX ISA 3.1"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "d = a;             // named variable a\nd = *(&a+immOff)   // variable-plus-offset\nd = *a;            // register\nd = *(a+immOff);   // register-plus-offset\nd = *(immAddr);    // immediate address", "examples": "ld.global.nc.f32           d, [a];\nld.gloal.nc.L1::evict_last.u32 d, [a];\n\ncreatepolicy.fractional.L2::evict_last.b64 cache_policy, 0.5;\nld.global.nc.L2::cache_hint.f32  d, [a], cache_policy;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Load register variable d from the location specified by the source address operand a in the\nglobal state space, and optionally cache in non-coherent read-only cache.\nNote On some architectures, the texture cache is larger, has higher bandwidth, and longer latency than\nthe global memory cache. For applications with sufficient parallelism to cover the longer\nlatency, ld.global.nc should offer better performance than ld.global on such\narchitectures.\nThe address operand a shall contain a global address.\nSupported addressing modes for operand a and alignment requirements are\ndescribed in Addresses as Operands.\nThe.v8 (.vec ) qualifier is supported if:.type is.b32,.s32,.u32, or. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-ld-global-nc", "introducedIn": "PTX ISA 3.1", "requiredTargets": ["sm_32"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.ldmatrix", "mnemonic": "ldmatrix", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "ldmatrix", "category": "Warp Level Matrix Multiply-Accumulate Instructions", "summary": "Collectively load one or more matrices across all threads in a warp from the location indicated by the address operand p, from.shared state space into destination register r.", "syntax": "ldmatrix.sync.aligned.shape.num{.trans}{.ss}.type r, [p];", "syntax_forms": [{"syntax": "ldmatrix.sync.aligned.shape.num{.trans}{.ss}.type r, [p];", "description": "Collectively load one or more matrices across all threads in a warp from the location indicated by\nthe address operand p, from.shared state space into destination register r. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_75"], "introducedIn": "PTX ISA 6.5"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Load a single 8x8 matrix using 64-bit addressing\n.reg .b64 addr;\n.reg .b32 d;\nldmatrix.sync.aligned.m8n8.x1.shared::cta.b16 {d}, [addr];\n\n// Load two 8x8 matrices in column-major format\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Collectively load one or more matrices across all threads in a warp from the location indicated by\nthe address operand p, from.shared state space into destination register r. If no state\nspace is provided, generic addressing is used, such that the address in p points into.shared space. If the generic address doesn’t fall in.shared state space, then the behavior\nis undefined.\nThe.shape qualifier indicates the dimensions of the matrices being loaded. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#warp-level-matrix-instructions-ldmatrix", "introducedIn": "PTX ISA 6.5", "requiredTargets": ["sm_75"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.ldu", "mnemonic": "ldu", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "ldu", "category": "Data Movement and Conversion Instructions", "summary": "Load read-only data into register variable d from the location specified by the source address operand a in the global state space, where the address is guaranteed to be the same across all threads in the warp.", "syntax": "ldu{.ss}.type      d, [a];       // load from address", "syntax_forms": [{"syntax": "ldu{.ss}.type      d, [a];       // load from address", "description": "Load read-only data into register variable d from the location specified by the source address operand a in the global state space, where the address is guaranteed to be the same across all threads in… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_13"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "d = a;             // named variable a\nd = *(&a+immOff)   // variable-plus-offset\nd = *a;            // register\nd = *(a+immOff);   // register-plus-offset\nd = *(immAddr);    // immediate address", "examples": "ldu.global.f32    d,[a];\nldu.global.b32    d,[p+4];\nldu.global.v4.f32 Q,[p];\nldu.global.b128   d,[a];", "description": "Load read-only data into register variable d from the location specified by the source address\noperand a in the global state space, where the address is guaranteed to be the same across all\nthreads in the warp. If no state space is given, perform the load using Generic Addressing.\nSupported addressing modes for operand a and alignment requirements are described in Addresses as Operands.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-ldu", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_13"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.lg2", "mnemonic": "lg2", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Base-2 Logarithm (Approximate)", "category": "Arithmetic", "summary": "Fast hardware approximation of log2(x).", "syntax": "lg2.approx.f32 d, a;", "syntax_forms": [{"syntax": "lg2.approx.f32 d, a;", "description": "Reduced-precision base-2 logarithm.", "dataTypes": ["f32"], "stateSpaces": [], "scopes": [], "modifiers": ["approx"], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32"], "stateSpaces": [], "scopes": [], "modifiers": ["approx"], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "d ≈ log2(a).", "examples": "lg2.approx.ftz.f32  la, a;", "description": "Determine the log 2 of a.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#floating-point-instructions-lg2", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.lop3", "mnemonic": "lop3", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "lop3", "category": "Logic and Shift Instructions", "summary": "Compute bitwise logical operation on inputs a, b, c and store the result in destination d.", "syntax": "lop3.b32 d, a, b, c, immLut;", "syntax_forms": [{"syntax": "lop3.b32 d, a, b, c, immLut;", "description": "Compute bitwise logical operation on inputs a, b, c and store the result in destination d.\nOptionally,. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_50"], "introducedIn": "PTX ISA 4.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c", "desc": "Source operand"}, {"name": "immLut", "desc": "Operand"}], "semantics": "F = GetFunctionFromTable(immLut); // returns the function corresponding to immLut value\nd = F(a, b, c);\nif (BoolOp specified) {\n    p = (d != 0) BoolOp q;\n}", "examples": "lop3.b32       d, a, b, c, 0x40;\nlop3.or.b32  d|p, a, b, c, 0x3f, q;\nlop3.and.b32 _|p, a, b, c, 0x3f, q;", "description": "Compute bitwise logical operation on inputs a, b, c and store the result in destination d.\nOptionally,.BoolOp can be specified to compute the predicate result p by performing a\nBoolean operation on the destination operand d with the predicate q in the following manner:\np = (d != 0) BoolOp q;\nThe sink symbol ‘_’ may be used in place of the destination operand d when.BoolOp qualifier\nis specified.\nThe logical operation is defined by a look-up table which, for 3 inputs, can be represented as an\n8-bit value specified by operand immLut as described below. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#logic-and-shift-instructions-lop3", "introducedIn": "PTX ISA 4.3", "requiredTargets": ["sm_50"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mad", "mnemonic": "mad", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Multiply-Add", "category": "Arithmetic", "summary": "Compute (a * b) + c as two rounding steps (unlike fma, which fuses them into one).", "syntax": "mad.mode.stype d, a, b, c;", "syntax_forms": [{"syntax": "mad.mode.stype d, a, b, c;", "description": "Integer multiply-add.", "dataTypes": ["s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": ["lo", "hi", "wide"], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}, {"syntax": "mad.f32 d, a, b, c;", "description": "Single-precision floating-point multiply-add (not fused).", "dataTypes": ["f32"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32", "s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": ["hi", "lo", "wide"], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Multiplicand"}, {"name": "b", "desc": "Multiplier"}, {"name": "c", "desc": "Addend"}], "semantics": "d = (a * b) + c.", "examples": "@p  mad.lo.s32 d,a,b,c;\n    mad.lo.s32 r,p,q,r;\n\n@p  mad.f32  d,a,b,c;", "description": "Multiplies two values, optionally extracts the high or low half of the intermediate result, and adds\na third value. Writes the result into a destination register.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-mad", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mad.cc", "mnemonic": "mad.cc", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mad.cc", "category": "Extended-Precision Integer Arithmetic Instructions", "summary": "Multiplies two values, extracts either the high or low part of the result, and adds a third value.", "syntax": "mad{.hi,.lo}.cc.type  d, a, b, c;", "syntax_forms": [{"syntax": "mad{.hi,.lo}.cc.type  d, a, b, c;", "description": "Multiplies two values, extracts either the high or low part of the result, and adds a third\nvalue. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 3.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c", "desc": "Source operand"}], "semantics": "t = a * b;\nd = t<63..32> + c;    // for .hi variant\nd = t<31..0> + c;     // for .lo variant", "examples": "@p  mad.lo.cc.u32 d,a,b,c;\n    mad.lo.cc.u32 r,p,q,r;", "description": "Multiplies two values, extracts either the high or low part of the result, and adds a third\nvalue. Writes the result to the destination register and the carry-out from the addition into the\ncondition code register.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#extended-precision-arithmetic-instructions-mad-cc", "introducedIn": "PTX ISA 3.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mad24", "mnemonic": "mad24", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mad24", "category": "Integer Arithmetic Instructions", "summary": "Compute the product of two 24-bit integer values held in 32-bit source registers, and add a third, 32-bit value to either the high or low 32-bits of the 48-bit result.", "syntax": "mad24.mode.type  d, a, b, c;", "syntax_forms": [{"syntax": "mad24.mode.type  d, a, b, c;", "description": "Compute the product of two 24-bit integer values held in 32-bit source registers, and add a third,\n32-bit value to either the high or low 32-bits of the 48-bit result. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c", "desc": "Source operand"}], "semantics": "t = a * b;\nd = t<47..16> + c;   // for .hi variant\nd = t<31..0> + c;    // for .lo variant", "examples": "mad24.lo.s32 d,a,b,c;   // low 32-bits of 24x24-bit signed multiply.", "description": "Compute the product of two 24-bit integer values held in 32-bit source registers, and add a third,\n32-bit value to either the high or low 32-bits of the 48-bit result. Return either the high or low\n32-bits of the 48-bit result.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-mad24", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.madc", "mnemonic": "madc", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "madc", "category": "Extended-Precision Integer Arithmetic Instructions", "summary": "Multiplies two values, extracts either the high or low part of the result, and adds a third value along with carry-in.", "syntax": "madc{.hi,.lo}{.cc}.type  d, a, b, c;", "syntax_forms": [{"syntax": "madc{.hi,.lo}{.cc}.type  d, a, b, c;", "description": "Multiplies two values, extracts either the high or low part of the result, and adds a third value\nalong with carry-in. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 3.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c", "desc": "Source operand"}], "semantics": "t = a * b;\nd = t<63..32> + c + CC.CF;     // for .hi variant\nd = t<31..0> + c + CC.CF;      // for .lo variant", "examples": "// extended-precision multiply:  [r3,r2,r1,r0] = [r5,r4] * [r7,r6]\nmul.lo.u32     r0,r4,r6;      // r0=(r4*r6).[31:0], no carry-out\nmul.hi.u32     r1,r4,r6;      // r1=(r4*r6).[63:32], no carry-out\nmad.lo.cc.u32  r1,r5,r6,r1;   // r1+=(r5*r6).[31:0], may carry-out\nmadc.hi.u32    r2,r5,r6,0;    // r2 =(r5*r6).[63:32]+carry-in,\n                              // no carry-out\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Multiplies two values, extracts either the high or low part of the result, and adds a third value\nalong with carry-in. Writes the result to the destination register and optionally writes the\ncarry-out from the addition into the condition code register.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#extended-precision-arithmetic-instructions-madc", "introducedIn": "PTX ISA 3.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mapa", "mnemonic": "mapa", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mapa", "category": "Data Movement and Conversion Instructions", "summary": "Get address in the CTA specified by operand b which corresponds to the address specified by operand a.", "syntax": "mapa{.space}.type          d, a, b;", "syntax_forms": [{"syntax": "mapa{.space}.type          d, a, b;", "description": "Get address in the CTA specified by operand b which corresponds to the address specified by\noperand a.\nInstruction type.type indicates the type of the destination operand d and the source\noperand a.\nW (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 7.8"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}], "semantics": null, "examples": "mapa.shared::cluster.u64 d1, %reg1, cta;\nmapa.shared::cluster.u32 d2, sh, 3;\nmapa.u64                 d3, %reg2, cta;", "description": "Get address in the CTA specified by operand b which corresponds to the address specified by\noperand a.\nInstruction type.type indicates the type of the destination operand d and the source\noperand a.\nWhen space is.shared::cluster, source a is either a shared memory variable or a register\ncontaining a valid shared memory address and register d contains a shared memory address. When\nthe optional qualifier.space is not specified, both a and d are registers containing\ngeneric addresses pointing to shared memory.\nb is a 32-bit integer operand representing the rank of the target CTA.\nDestination register d will hold an address in CTA b corresponding to operand a.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-mapa", "introducedIn": "PTX ISA 7.8", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.match.sync", "mnemonic": "match.sync", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "match.sync", "category": "Parallel Synchronization and Communication Instructions", "summary": "match.sync will cause executing thread to wait until all non-exited threads from membermask have executed match.sync with the same qualifiers and same membermask value before resuming execution.", "syntax": "match.any.sync.type  d, a, membermask;", "syntax_forms": [{"syntax": "match.any.sync.type  d, a, membermask;", "description": "match.sync will cause executing thread to wait until all non-exited threads from membermask have executed match.sync with the same qualifiers and same membermask value before resuming\nexecution. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_70"], "introducedIn": "PTX ISA 6.0"}, {"syntax": "match.all.sync.type  d[|p], a, membermask;", "description": "match.all returns the mask only if all non-exited threads in membermask share the same value of operand a; the optional predicate p is set accordingly.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_70"], "introducedIn": "PTX ISA 6.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "membermask", "desc": "Operand"}], "semantics": null, "examples": "match.any.sync.b32    d, a, 0xffffffff;\nmatch.all.sync.b64    d|p, a, mask;", "description": "match.sync will cause executing thread to wait until all non-exited threads from membermask have executed match.sync with the same qualifiers and same membermask value before resuming\nexecution.\nOperand membermask specifies a 32-bit integer which is a mask indicating threads participating\nin this instruction where the bit position corresponds to thread’s laneid.\nmatch.sync performs broadcast and compare of operand a across all non-exited threads in membermask and sets destination d and optional predicate p based on mode.\nOperand a has instruction type and d has.b32 type.\nDestination d is a 32-bit mask where bit position in mask corresponds to thread’s laneid. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-match-sync", "introducedIn": "PTX ISA 6.0", "requiredTargets": ["sm_70"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.max", "mnemonic": "max", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Maximum", "category": "Arithmetic", "summary": "Select the larger of two operands.", "syntax": "max.type d, a, b;", "syntax_forms": [{"syntax": "max.type d, a, b;", "description": "Integer or floating-point maximum.", "dataTypes": ["s16", "s32", "s64", "u16", "u32", "u64", "f32", "f64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32", "f64", "s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "First operand"}, {"name": "b", "desc": "Second operand"}], "semantics": "d = (a > b) ? a : b, with type-specific NaN-handling rules for floating-point forms.", "examples": "max.u32  d,a,b;\nmax.s32  q,q,0;\nmax.relu.s16x2 t,t,u;\nmax.u8x4 p, q, r;\n\nmax.ftz.f32  f0,f1,f2;\nmax.f64      a,b,c;\n// fp32 max with .NaN\nmax.NaN.f32  f0,f1,f2;\n// fp32 max with .xorsign.abs\nmax.xorsign.abs.f32 Rd, Ra, Rb;\n\nmax.ftz.f16       h0,h1,h2;\nmax.f16x2         b0,b1,b2;\n// SIMD fp16 max with NaN\nmax.NaN.f16x2     b0,b1,b2;\n// scalar f16 max with xorsign.abs\nmax.xorsign.abs.f16 Rd, Ra, Rb;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Store the maximum of a and b in d.\nFor.f16x2 and.bf16x2 instruction types, input vectors are formed with half-word values\nfrom source operands. Half-word operands are then processed in parallel to store.f16x2 or.bf16x2 result in destination.\nFor.f16 instruction type, operands d and a have.f16 or.b16 type. For.f16x2 instruction type, operands d and a have.f16x2 or.b32 type. For.bf16 instruction type, operands d and a have.b16 type. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#half-precision-floating-point-instructions-max", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mbarrier.arrive", "mnemonic": "mbarrier.arrive", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mbarrier.arrive", "category": "Parallel Synchronization and Communication Instructions", "summary": "A thread executing mbarrier.arrive performs an arrive-on operation\non the mbarrier object at the location specified by the address operand addr. The 3", "syntax": "mbarrier.arrive{.sem.scope}{.shared{::cta}}.b64           state, [addr]{, count};", "syntax_forms": [{"syntax": "mbarrier.arrive{.sem.scope}{.shared{::cta}}.b64           state, [addr]{, count};", "description": "A thread executing mbarrier.arrive performs an arrive-on operation\non the mbarrier object at the location specified by the address operand addr. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": ".reg .b32 cnt, remoteAddr32, remoteCTAId, addr32;\n.reg .b64 %r<5>, addr, remoteAddr64;\n.shared .b64 shMem, shMem2;\n\ncvta.shared.u64            addr, shMem2;\nmov.b32                    addr32, shMem2;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "A thread executing mbarrier.arrive performs an arrive-on operation\non the mbarrier object at the location specified by the address operand addr. The 32-bit\nunsigned integer operand count specifies the count argument to the arrive-on operation.\nIf no state space is specified then Generic Addressing is\nused. If the address specified by addr does not fall within the address window of.shared::cta state space then the behavior is undefined.\nSupported addressing modes for operand addr is as described in Addresses as Operands.\nAlignment for operand addr is as described in the Size and alignment of mbarrier object.\nThe optional qualifier. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-mbarrier-arrive", "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mbarrier.arrive_drop", "mnemonic": "mbarrier.arrive_drop", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mbarrier.arrive_drop", "category": "Parallel Synchronization and Communication Instructions", "summary": "A thread executing mbarrier.arrive_drop on the mbarrier object at the location specified by the address operand addr performs the following steps: Decrements the expected arrival count of the mbarrier object by the value specified by the 32-bit integer operand count.", "syntax": "mbarrier.arrive_drop{.sem.scope}{.shared{::cta}}.b64              state, [addr] {, count};", "syntax_forms": [{"syntax": "mbarrier.arrive_drop{.sem.scope}{.shared{::cta}}.b64              state, [addr] {, count};", "description": "A thread executing mbarrier.arrive_drop on the mbarrier object at the location specified by the address operand addr performs the following steps: Decrements the expected arrival count of the mbarrier… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": ".reg .b32 cnt;\n.reg .b64 %r1;\n.shared .b64 shMem;\n\n// Example 1\n@p mbarrier.arrive_drop.shared.b64 _, [shMem];\n// (truncated - see the official PTX ISA docs for the full example)", "description": "A thread executing mbarrier.arrive_drop on the mbarrier object at the location specified by\nthe address operand addr performs the following steps:\nDecrements the expected arrival count of the mbarrier object by the value specified by the\n32-bit integer operand count. If count operand is not specified, it defaults to 1. Performs an arrive-on operation on the mbarrier object. The operand count specifies the count argument to the arrive-on operation.\nThe decrement done in the expected arrivals count of the mbarrier object will be for all the\nsubsequent phases of the mbarrier object.\nIf no state space is specified then Generic Addressing is\nused. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mbarrier.check_layout", "mnemonic": "mbarrier.check_layout", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mbarrier.check_layout", "category": "Parallel Synchronization and Communication Instructions", "summary": "The layout of the opaque mbarrier object can be queried using mbarrier.check_layout.", "syntax": "mbarrier.check_layout.layout{.ss}.b64 p, [addr];", "syntax_forms": [{"syntax": "mbarrier.check_layout.layout{.ss}.b64 p, [addr];", "description": "The layout of the opaque mbarrier object can be queried using mbarrier.check_layout.\nThe address operand addr specifies the memory location of the mbarrier object whose\nlayout is being inspected. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 9.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": ".reg    .pred p;\n.shared .b64  shMem;\n\nmbarrier.check_layout.layout::v1.shared::cta.b64 p, [shMem];\n@!p bra exit\n// ... mbarrier operations on shMem\n// (truncated - see the official PTX ISA docs for the full example)", "description": "The layout of the opaque mbarrier object can be queried using mbarrier.check_layout.\nThe address operand addr specifies the memory location of the mbarrier object whose\nlayout is being inspected. The instruction sets the predicate operand p to True if the\nlayout of the mbarrier object exactly matches the.layout qualifier. Refer Layouts of the mbarrier object for\nmore details.\nIf no state space is specified then Generic Addressing is used. If the address specified\nby addr does not fall within the address window of.shared::cta state space then the\nbehavior is undefined.", "sourceUrl": null, "introducedIn": "PTX ISA 9.3", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mbarrier.complete_tx", "mnemonic": "mbarrier.complete_tx", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mbarrier.complete_tx", "category": "Parallel Synchronization and Communication Instructions", "summary": "A thread executing mbarrier.complete_tx performs a complete-tx operation on the mbarrier object at the location specified by the address operand addr.", "syntax": "mbarrier.complete_tx{.sem.scope}{.space}.b64 [addr], txCount;", "syntax_forms": [{"syntax": "mbarrier.complete_tx{.sem.scope}{.space}.b64 [addr], txCount;", "description": "A thread executing mbarrier.complete_tx performs a complete-tx operation on the mbarrier object at the location specified by the address operand addr. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "mbarrier.complete_tx.b64             [addr],     32;\nmbarrier.complete_tx.shared.b64      [mbarObj1], 512;\nmbarrier.complete_tx.relaxed.cta.b64 [addr2],    32;", "description": "A thread executing mbarrier.complete_tx performs a complete-tx operation on the mbarrier object at the location specified by the address operand addr. The\n32-bit unsigned integer operand txCount specifies the completeCount argument to the complete-tx operation.\nmbarrier.complete_tx does not involve any asynchronous memory operations and only simulates the\ncompletion of an asynchronous memory operation and its side effect of signaling to the mbarrier\nobject.\nIf no state space is specified then Generic Addressing is\nused. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mbarrier.expect_tx", "mnemonic": "mbarrier.expect_tx", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mbarrier.expect_tx", "category": "Parallel Synchronization and Communication Instructions", "summary": "A thread executing mbarrier.expect_tx performs an expect-tx operation on the mbarrier object at the location specified by the address operand addr.", "syntax": "mbarrier.expect_tx{.sem.scope}{.space}.b64 [addr], txCount;", "syntax_forms": [{"syntax": "mbarrier.expect_tx{.sem.scope}{.space}.b64 [addr], txCount;", "description": "A thread executing mbarrier.expect_tx performs an expect-tx operation on the mbarrier object at the location specified by the address operand addr. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "mbarrier.expect_tx.b64                       [addr], 32;\nmbarrier.expect_tx.relaxed.cta.shared.b64    [mbarObj1], 512;\nmbarrier.expect_tx.relaxed.cta.shared.b64    [mbarObj2], 512;", "description": "A thread executing mbarrier.expect_tx performs an expect-tx operation on the mbarrier object at the location specified by the address operand addr. The\n32-bit unsigned integer operand txCount specifies the expectCount argument to the expect-tx operation.\nIf no state space is specified then Generic Addressing is\nused. If the address specified by addr does not fall within the address window of.shared::cta or.shared::cluster state space then the behavior is undefined.\nSupported addressing modes for operand addr are as described in Addresses as Operands.\nAlignment for operand addr is as described in the Size and alignment of mbarrier object.\nThe optional. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mbarrier.init", "mnemonic": "mbarrier.init", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mbarrier.init", "category": "Parallel Synchronization and Communication Instructions", "summary": "mbarrier.init initializes the mbarrier object at the location specified by the address operand addr with the unsigned 32-bit integer count.", "syntax": "mbarrier.init{.layout}{.shared{::cta}}.b64 [addr], count;", "syntax_forms": [{"syntax": "mbarrier.init{.layout}{.shared{::cta}}.b64 [addr], count;", "description": "mbarrier.init initializes the mbarrier object at the location specified by the address operand addr with the unsigned 32-bit integer count.\nThe. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": ".shared .b64 shMem, shMem2, shMem3;\n.reg    .b64 addr;\n.reg    .b32 %r1;\n\ncvta.shared.u64          addr, shMem2;\nmbarrier.init.b64        [addr],   %r1;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "mbarrier.init initializes the mbarrier object at the location specified by the address operand addr with the unsigned 32-bit integer count.\nThe.layout qualifier specifies the layout that is used to initialize the mbarrier object.\nIf not specified explicitly, a.layout::v0 mbarrier is initialized.\nRefer Layouts of the mbarrier object for more details.\nThe valid range of values for the operand count varies depending upon.layout as\nspecified below:\n[1, …, 2 20 - 1] for mbarrier with.layout::v0 [1, …, 2 9 - 1] for mbarrier with.layout::v1\nThe constituents of the mbarrier object are initialized as follows:\nThe primary and conditional phases are initialized to zero. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-mbarrier-init", "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mbarrier.inval", "mnemonic": "mbarrier.inval", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mbarrier.inval", "category": "Parallel Synchronization and Communication Instructions", "summary": "mbarrier.inval invalidates the mbarrier object at the location specified by the address operand addr.", "syntax": "mbarrier.inval{.shared{::cta}}.b64 [addr];", "syntax_forms": [{"syntax": "mbarrier.inval{.shared{::cta}}.b64 [addr];", "description": "mbarrier.inval invalidates the mbarrier object at the location specified by the address\noperand addr.\nThe invalidation is supported for all layouts described in Layouts of the mbarrier object. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": ".shared .b64 shmem;\n.reg    .b64 addr;\n.reg    .b32 %r1;\n.reg    .pred t0;\n\n// Example 1 :\n// (truncated - see the official PTX ISA docs for the full example)", "description": "mbarrier.inval invalidates the mbarrier object at the location specified by the address\noperand addr.\nThe invalidation is supported for all layouts described in Layouts of the mbarrier object.\nAn mbarrier object must be invalidated before using its memory location for any other purpose.\nPerforming any mbarrier operation except mbarrier.init on a memory location that does not\ncontain a valid mbarrier object, results in undefined behaviour.\nIf no state space is specified then Generic Addressing is\nused. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-mbarrier-inval", "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mbarrier.pending_count", "mnemonic": "mbarrier.pending_count", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mbarrier.pending_count", "category": "Parallel Synchronization and Communication Instructions", "summary": "The pending count can be queried from the opaque mbarrier state using mbarrier.pending_count.", "syntax": "mbarrier.pending_count{.layout}.b64 count, state;", "syntax_forms": [{"syntax": "mbarrier.pending_count{.layout}.b64 count, state;", "description": "The pending count can be queried from the opaque mbarrier state using mbarrier.pending_count.\nThe state operand is a 64-bit register that must be the result of a prior mbarrier.arrive. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "count", "desc": "Operand"}, {"name": "state", "desc": "Operand"}], "semantics": null, "examples": ".reg .b32 %r1;\n.reg .b64 state;\n.shared .b64 shMem;\n\nmbarrier.arrive.noComplete.b64 state, [shMem], 1;\nmbarrier.pending_count.layout::v0.b64 %r1, state;", "description": "The pending count can be queried from the opaque mbarrier state using mbarrier.pending_count.\nThe state operand is a 64-bit register that must be the result of a prior mbarrier.arrive.noComplete or mbarrier.arrive_drop.noComplete instruction. Otherwise, the\nbehavior is undefined.\nThe destination register count is a 32-bit unsigned integer representing the pending count of\nthe mbarrier object prior to the arrive-on operation from\nwhich the state register was obtained.\nThe optional qualifier.layout::v0 denotes the layout of the corresponding mbarrier object as\ndescribed in the section Layouts of the mbarrier object.", "sourceUrl": null, "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mbarrier.test_wait", "mnemonic": "mbarrier.test_wait", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mbarrier.test_wait", "category": "Parallel Synchronization and Communication Instructions", "summary": "The test_wait and try_wait operations test for the completion of the current or the immediately preceding phase of an mbarrier object at the location specified by the operand addr.", "syntax": "// without parity\nmbarrier.test_wait{.phase_type::primary}{.sem.scope}{.ss}.b64      waitComplete, [addr], state;", "syntax_forms": [{"syntax": "// without parity\nmbarrier.test_wait{.phase_type::primary}{.sem.scope}{.ss}.b64      waitComplete, [addr], state;", "description": "The test_wait and try_wait operations test for the completion of the current or the immediately\npreceding phase of an mbarrier object at the location specified by the operand addr.\nmbarrier. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "without parity", "desc": "Operand"}], "semantics": null, "examples": "// Example 1a, thread synchronization with test_wait:\n\n.reg .b64 %r1;\n.shared .b64 shMem;\n\nmbarrier.init.shared.b64 [shMem], N;  // N threads participating in the mbarrier.\n// (truncated - see the official PTX ISA docs for the full example)", "description": "The test_wait and try_wait operations test for the completion of the current or the immediately\npreceding phase of an mbarrier object at the location specified by the operand addr.\nmbarrier.test_wait is a non-blocking instruction which tests for the completion of the phase.\nmbarrier.try_wait is a potentially blocking instruction which tests for the completion of the\nphase. If the phase is not complete, the executing thread may be suspended. Suspended thread resumes\nexecution when the specified phase completes OR before the phase completes following a\nsystem-dependent time limit. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mbarrier.try_wait", "mnemonic": "mbarrier.try_wait", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mbarrier.try_wait", "category": "Parallel Synchronization and Communication Instructions", "summary": "The test_wait and try_wait operations test for the completion of the current or the immediately preceding phase of an mbarrier object at the location specified by the operand addr.", "syntax": "// without parity\nmbarrier.try_wait{.phase_type::primary}{.sem.scope}{.ss}.b64      waitComplete, [addr], state {, timeHint};", "syntax_forms": [{"syntax": "// without parity\nmbarrier.try_wait{.phase_type::primary}{.sem.scope}{.ss}.b64      waitComplete, [addr], state {, timeHint};", "description": "The test_wait and try_wait operations test for the completion of the current or the immediately\npreceding phase of an mbarrier object at the location specified by the operand addr.\nmbarrier. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "without parity", "desc": "Operand"}], "semantics": null, "examples": "// Example 1a, thread synchronization with test_wait:\n\n.reg .b64 %r1;\n.shared .b64 shMem;\n\nmbarrier.init.shared.b64 [shMem], N;  // N threads participating in the mbarrier.\n// (truncated - see the official PTX ISA docs for the full example)", "description": "The test_wait and try_wait operations test for the completion of the current or the immediately\npreceding phase of an mbarrier object at the location specified by the operand addr.\nmbarrier.test_wait is a non-blocking instruction which tests for the completion of the phase.\nmbarrier.try_wait is a potentially blocking instruction which tests for the completion of the\nphase. If the phase is not complete, the executing thread may be suspended. Suspended thread resumes\nexecution when the specified phase completes OR before the phase completes following a\nsystem-dependent time limit. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.membar", "mnemonic": "membar", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Memory Barrier / Fence", "category": "Parallel Synchronization and Communication Instructions", "summary": "Order this thread's prior memory accesses relative to later ones, visible to a given scope.", "syntax": "membar.level;", "syntax_forms": [{"syntax": "membar.level;", "description": "level selects the visibility scope: CTA, whole GPU, or system (including other GPUs/host).", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": ["cta", "gl", "sys"], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.4"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": ["cta", "gl", "sys"], "operands": [], "semantics": "All memory operations issued by this thread before the fence become visible, in order, to other threads within the given scope before any operation issued after the fence.", "examples": "membar.gl;\nmembar.cta;\nmembar.sys;\nfence.sc.cta;\nfence.sc.cluster;\nfence.proxy.alias;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "The membar instruction guarantees that prior memory accesses requested by this thread ( ld, st, atom and red instructions) are performed at the specified level, before later\nmemory operations requested by this thread following the membar instruction. The level qualifier specifies the set of threads that may observe the ordering effect of this operation.\nA memory read (e.g., by ld or atom ) has been performed when the value read has been\ntransmitted from memory and cannot be modified by another thread at the indicated level. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-membar", "introducedIn": "PTX ISA 1.4", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.min", "mnemonic": "min", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Minimum", "category": "Arithmetic", "summary": "Select the smaller of two operands.", "syntax": "min.type d, a, b;", "syntax_forms": [{"syntax": "min.type d, a, b;", "description": "Integer or floating-point minimum.", "dataTypes": ["s16", "s32", "s64", "u16", "u32", "u64", "f32", "f64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32", "f64", "s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "First operand"}, {"name": "b", "desc": "Second operand"}], "semantics": "d = (a < b) ? a : b, with type-specific NaN-handling rules for floating-point forms.", "examples": "min.s32  r0,a,b;\n@p  min.u16  h,i,j;\n    min.s16x2.relu u,v,w;\n    min.u8x4 p, q, r;\n\n@p  min.ftz.f32  z,z,x;\n    min.f64      a,b,c;\n    // fp32 min with .NaN\n    min.NaN.f32  f0,f1,f2;\n    // fp32 min with .xorsign.abs\n    min.xorsign.abs.f32 Rd, Ra, Rb;\n\nmin.ftz.f16       h0,h1,h2;\nmin.f16x2         b0,b1,b2;\n// SIMD fp16 min with .NaN\nmin.NaN.f16x2     b0,b1,b2;\nmin.bf16          h0, h1, h2;\n// SIMD bf16 min with NaN\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Store the minimum of a and b in d.\nFor.f16x2 and.bf16x2 instruction types, input vectors are formed with half-word values\nfrom source operands. Half-word operands are then processed in parallel to store.f16x2 or.bf16x2 result in destination.\nFor.f16 instruction type, operands d and a have.f16 or.b16 type. For.f16x2 instruction type, operands d and a have.f16x2 or.b32 type. For.bf16 instruction type, operands d and a have.b16 type. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#half-precision-floating-point-instructions-min", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mma", "mnemonic": "mma", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Matrix Multiply-Accumulate (Tensor Core)", "category": "Warp Level Matrix Multiply-Accumulate Instructions", "summary": "Cooperative, warp-wide matrix-multiply-accumulate executed on tensor-core hardware.", "syntax": "mma.sync.aligned.shape.row.col.dtype.atype.btype.ctype d, a, b, c;", "syntax_forms": [{"syntax": "mma.sync.aligned.shape.row.col.dtype.atype.btype.ctype d, a, b, c;", "description": "Synchronizing warp-wide MMA for a fixed tile shape (e.g. m16n8k16); operand fragments are distributed across the warp's lanes per a hardware-defined layout.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_70"], "introducedIn": "PTX ISA 6.4"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Accumulator fragment (destination)"}, {"name": "a", "desc": "Matrix A fragment"}, {"name": "b", "desc": "Matrix B fragment"}, {"name": "c", "desc": "Accumulator fragment (input)"}], "semantics": "D = A * B + C for the fixed tile shape, computed cooperatively across all 32 lanes of the warp.", "examples": null, "description": "Perform a MxNxK matrix multiply and accumulate operation, D = A*B+C, where the A matrix is MxK, the B matrix is KxN, and the C and D matrices are MxN.\nQualifier.block_scale specifies that the matrices A and B are scaled with scale_A and scale_B matrices respectively before performing the matrix multiply and accumulate operation\nas specified in the section Block Scaling for mma.sync. The data type\ncorresponding to each of the element within scale_A and Scale_B matrices is specified\nby.stype. Qualifier.scale_vec_size specifies the number of columns of scale_A matrix\nand number of rows in the matrix scale_B.\nThe valid combinations of.kind,.stype and.scale_vec_size are described in Table 39. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#warp-level-matrix-instructions-mma", "introducedIn": "PTX ISA 6.4", "requiredTargets": ["sm_70"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mov", "mnemonic": "mov", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Move", "category": "Data Movement and Conversion Instructions", "summary": "Copy a value into a register, or materialize an address/immediate.", "syntax": "mov.type d, a;", "syntax_forms": [{"syntax": "mov.type d, a;", "description": "Register-to-register move, or load of an immediate/address.", "dataTypes": ["b16", "b32", "b64", "s16", "s32", "s64", "u16", "u32", "u64", "f32", "f64", "pred"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["b16", "b32", "b64", "f32", "f64", "pred", "s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source (register, immediate, or address expression)"}], "semantics": "d = a, no type conversion is performed.", "examples": "mov.f32  d,a;\nmov.u16  u,v;\nmov.f32  k,0.1;\nmov.u32  ptr, A;        // move address of A into ptr\nmov.u32  ptr, A[5];     // move address of A[5] into ptr\nmov.u32  ptr, A+20;     // move address with offset into ptr\n// (truncated - see the official PTX ISA docs for the full example)\n\nmov.b32 %r1,{a,b};      // a,b have type .u16\nmov.b64 {lo,hi}, %x;    // %x is a double; lo,hi are .u32\nmov.b32 %r1,{x,y,z,w};  // x,y,z,w have type .b8\nmov.b32 {r,g,b,a},%r1;  // r,g,b,a have type .u8\nmov.b64 {%r1, _}, %x;   // %x is.b64, %r1 is .b32\nmov.b128 {%b1, %b2}, %y;   // %y is.b128, %b1 and % b2 are .b64\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Write register d with the value of a.\nOperand a may be a register, special register, variable with optional offset in an addressable\nmemory space, or function name.\nFor variables declared in.const,.global,.local, and.shared state spaces, mov places the non-generic address of the variable (i.e., the address of the variable in its state\nspace) into the destination register. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-mov", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.movmatrix", "mnemonic": "movmatrix", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "movmatrix", "category": "Warp Level Matrix Multiply-Accumulate Instructions", "summary": "Move a row-major matrix across all threads in a warp, reading elements from source a, and writing the transposed elements to destination d.", "syntax": "movmatrix.sync.aligned.shape.trans.type d, a;", "syntax_forms": [{"syntax": "movmatrix.sync.aligned.shape.trans.type d, a;", "description": "Move a row-major matrix across all threads in a warp, reading elements from source a, and\nwriting the transposed elements to destination d.\nThe. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_75"], "introducedIn": "PTX ISA 7.8"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": null, "examples": ".reg .b32 d, a;\nmovmatrix.sync.aligned.m8n8.trans.b16 d, a;", "description": "Move a row-major matrix across all threads in a warp, reading elements from source a, and\nwriting the transposed elements to destination d.\nThe.shape qualifier indicates the dimensions of the matrix being transposed. Each matrix\nelement holds 16-bit data as indicated by the.type qualifier.\nThe mandatory.sync qualifier indicates that movmatrix causes the executing thread to wait\nuntil all threads in the warp execute the same movmatrix instruction before resuming execution.\nThe mandatory.aligned qualifier indicates that all threads in the warp must execute the same movmatrix instruction. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#warp-level-matrix-instructions-movmatrix", "introducedIn": "PTX ISA 7.8", "requiredTargets": ["sm_75"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mul", "mnemonic": "mul", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Multiply", "category": "Arithmetic", "summary": "Multiply two operands, selecting the low, high, or widened part of an integer product.", "syntax": "mul.mode.stype d, a, b;", "syntax_forms": [{"syntax": "mul.mode.stype d, a, b;", "description": "Integer multiply; mode selects which part of the full product is written to d.", "dataTypes": ["s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": ["lo", "hi", "wide"], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}, {"syntax": "mul.f32 d, a, b;", "description": "Single-precision floating-point multiply.", "dataTypes": ["f32"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}, {"syntax": "mul.rn.f64 d, a, b;", "description": "Double-precision floating-point multiply with explicit round-to-nearest-even.", "dataTypes": ["f64"], "stateSpaces": [], "scopes": [], "modifiers": ["rn"], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32", "f64", "s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": ["hi", "lo", "rn", "wide"], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "First source operand"}, {"name": "b", "desc": "Second source operand"}], "semantics": "d = a * b, truncated to the selected result slice for integer forms.", "examples": "mul.wide.s16 fa,fxs,fys;   // 16*16 bits yields 32 bits\nmul.lo.s16 fa,fxs,fys;     // 16*16 bits, save only the low 16 bits\nmul.wide.s32 z,x,y;        // 32*32 bits, creates 64 bit result\n\nmul.ftz.f32 circumf,radius,pi  // a single-precision multiply\n\n// scalar f16 multiplications\nmul.f16        d0, a0, b0;\nmul.rn.f16     d1, a1, b1;\nmul.bf16       bd0, ba0, bb0;\nmul.rn.bf16    bd1, ba1, bb1;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Performs multiplication and writes the resulting value into a destination register.\nFor.f16x2 and.bf16x2 instruction type, forms input vectors by half word values from source\noperands. Half-word operands are then multiplied in parallel to produce.f16x2 or.bf16x2 result in destination.\nFor.f16 instruction type, operands d, a and b have.f16 or.b16 type. For.f16x2 instruction type, operands d, a and b have.b32 type. For.bf16 instruction type, operands d, a, b have.b16 type. For.bf16x2 instruction type,\noperands d, a, b have.b32 type.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#half-precision-floating-point-instructions-mul", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.mul24", "mnemonic": "mul24", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "mul24", "category": "Integer Arithmetic Instructions", "summary": "Compute the product of two 24-bit integer values held in 32-bit source registers, and return either\nthe high or low 32-bits of the 48-bit result.", "syntax": "mul24.mode.type  d, a, b;", "syntax_forms": [{"syntax": "mul24.mode.type  d, a, b;", "description": "Compute the product of two 24-bit integer values held in 32-bit source registers, and return either\nthe high or low 32-bits of the 48-bit result.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}], "semantics": "t = a * b;\nd = t<47..16>;    // for .hi variant\nd = t<31..0>;     // for .lo variant", "examples": "mul24.lo.s32 d,a,b;   // low 32-bits of 24x24-bit signed multiply.", "description": "Compute the product of two 24-bit integer values held in 32-bit source registers, and return either\nthe high or low 32-bits of the 48-bit result.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-mul24", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.multimem.cp.async.bulk", "mnemonic": "multimem.cp.async.bulk", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "multimem.cp.async.bulk", "category": "Data Movement and Conversion Instructions", "summary": "Instruction multimem.cp.async.bulk initiates an asynchronous bulk-copy operation from source address range [srcMem, srcMem + size) to memory locations residing on each GPU’s memory referred to by the destination multimem address range [dstMem, dstMem + size).", "syntax": "multimem.cp.async.bulk{.sem}.dst.src.completion_mechanism{.cp_mask}", "syntax_forms": [{"syntax": "multimem.cp.async.bulk{.sem}.dst.src.completion_mechanism{.cp_mask}", "description": "Instruction multimem.cp.async.bulk initiates an asynchronous bulk-copy operation from source address range [srcMem, srcMem + size) to memory locations residing on each GPU’s memory referred to by the… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 9.1"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "multimem.cp.async.bulk.global.shared::cta.bulk_group [dstMem], [srcMem], size;\n\nmultimem.cp.async.bulk.global.shared::cta.bulk_group [dstMem], [srcMem], 512;\n\nmultimem.cp.async.bulk.global.shared::cta.bulk_group.cp_mask [dstMem], [srcMem], size, byteMask;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Instruction multimem.cp.async.bulk initiates an asynchronous bulk-copy operation from source\naddress range [srcMem, srcMem + size) to memory locations residing on each GPU’s memory referred\nto by the destination multimem address range [dstMem, dstMem + size). The direction of\nbulk-copy is from the state space specified by the.src modifier to the state space specified\nby the.dst modifiers.\nThe 32-bit operand size specifies the amount of memory to be copied, in terms of number of\nbytes. Operand size must be a multiple of 16. The memory range [dstMem, dstMem + size) must not overflow the destination multimem memory space. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-multimem-cp-async-bulk", "introducedIn": "PTX ISA 9.1", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.multimem.cp.reduce.async.bulk", "mnemonic": "multimem.cp.reduce.async.bulk", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "multimem.cp.reduce.async.bulk", "category": "Data Movement and Conversion Instructions", "summary": "Instruction multimem.cp.reduce.async.bulk initiates an element-wise asynchronous reduction operation with elements from source memory address range [srcMem, srcMem + size) to memory locations residing on each GPU’s memory referred to by the multimem destination address range [dstMem, dstMem + size).", "syntax": "multimem.cp.reduce.async.bulk{.sem.scope}.dst.src.completion_mechanism.redOp.type  [dstMem], [srcMem], size;", "syntax_forms": [{"syntax": "multimem.cp.reduce.async.bulk{.sem.scope}.dst.src.completion_mechanism.redOp.type  [dstMem], [srcMem], size;", "description": "Instruction multimem.cp.reduce.async.bulk initiates an element-wise asynchronous reduction operation with elements from source memory address range [srcMem, srcMem + size) to memory locations residing… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 9.1"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "multimem.cp.reduce.async.bulk.global.shared::cta.bulk_group.add.u32 [dstMem], [srcMem], size;\n\nmultimem.cp.reduce.async.bulk.global.shared::cta.bulk_group.xor.b64 [dstMem], [srcMem], size;\n\nmultimem.cp.reduce.async.bulk.global.shared::cta.bulk_group.inc.u32 [dstMem], [srcMem], size;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Instruction multimem.cp.reduce.async.bulk initiates an element-wise asynchronous reduction\noperation with elements from source memory address range [srcMem, srcMem + size) to memory\nlocations residing on each GPU’s memory referred to by the multimem destination address range [dstMem, dstMem + size).\nEach data element in the destination array is reduced inline with the corresponding data element in\nthe source array with the reduction operation specified by the modifier.redOp. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-multimem-cp-reduce-async-bulk", "introducedIn": "PTX ISA 9.1", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.multimem.ld_reduce", "mnemonic": "multimem.ld_reduce", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "multimem.ld_reduce", "category": "Data Movement and Conversion Instructions", "summary": "The multimem.* operations operate on multimem addresses and accesses all of the multiple memory\nlocations which the multimem address points to.\nMultimem addresses can be accessed only by multimem.* operations. Accessing a multimem address\nwith ld, st or any other memory operations results in undefined behavior.\nRefer to CUDA programming guide for creation and management of the multimem addresses.", "syntax": "// Integer type:\nmultimem.ld_reduce{.ldsem}{.scope}{.ss}.op.type      d, [a];", "syntax_forms": [{"syntax": "// Integer type:\nmultimem.ld_reduce{.ldsem}{.scope}{.ss}.op.type      d, [a];", "description": "Instruction multimem.ld_reduce performs the following operations: load operation on the multimem address a, which involves loading of data from all of the multiple memory locations pointed to by the m… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.1"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "Integer type:", "desc": "Operand"}], "semantics": null, "examples": "multimem.ld_reduce.and.b32                    val1_b32, [addr1];\nmultimem.ld_reduce.acquire.gpu.global.add.u32 val2_u32, [addr2];\n\nmultimem.st.relaxed.gpu.b32                [addr3], val3_b32;\nmultimem.st.release.cta.global.u32         [addr4], val4_u32;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Instruction multimem.ld_reduce performs the following operations:\nload operation on the multimem address a, which involves loading of data from all of the\nmultiple memory locations pointed to by the multimem address a, reduction operation specified by.op on the multiple data loaded from the multimem address a.\nThe result of the reduction operation in returned in register d.\nInstruction multimem.st performs a store operation of the input operand b to all the memory\nlocations pointed to by the multimem address a.\nInstruction multimem.red performs a reduction operation on all the memory locations pointed to\nby the multimem address a, with operand b.\nInstruction multimem. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.1", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.multimem.red", "mnemonic": "multimem.red", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "multimem.red", "category": "Data Movement and Conversion Instructions", "summary": "The multimem.* operations operate on multimem addresses and accesses all of the multiple memory\nlocations which the multimem address points to.\nMultimem addresses can be accessed only by multimem.* operations. Accessing a multimem address\nwith ld, st or any other memory operations results in undefined behavior.\nRefer to CUDA programming guide for creation and management of the multimem addresses.", "syntax": "// Integer type:\nmultimem.red{.redsem}{.scope}{.ss}.op.type           [a], b;", "syntax_forms": [{"syntax": "// Integer type:\nmultimem.red{.redsem}{.scope}{.ss}.op.type           [a], b;", "description": "Instruction multimem.ld_reduce performs the following operations: load operation on the multimem address a, which involves loading of data from all of the multiple memory locations pointed to by the m… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.1"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "Integer type:", "desc": "Operand"}], "semantics": null, "examples": "multimem.ld_reduce.and.b32                    val1_b32, [addr1];\nmultimem.ld_reduce.acquire.gpu.global.add.u32 val2_u32, [addr2];\n\nmultimem.st.relaxed.gpu.b32                [addr3], val3_b32;\nmultimem.st.release.cta.global.u32         [addr4], val4_u32;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Instruction multimem.ld_reduce performs the following operations:\nload operation on the multimem address a, which involves loading of data from all of the\nmultiple memory locations pointed to by the multimem address a, reduction operation specified by.op on the multiple data loaded from the multimem address a.\nThe result of the reduction operation in returned in register d.\nInstruction multimem.st performs a store operation of the input operand b to all the memory\nlocations pointed to by the multimem address a.\nInstruction multimem.red performs a reduction operation on all the memory locations pointed to\nby the multimem address a, with operand b.\nInstruction multimem. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.1", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.multimem.red.async", "mnemonic": "multimem.red.async", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "multimem.red.async", "category": "Parallel Synchronization and Communication Instructions", "summary": "multimem.red.async is a non-blocking instruction which initiates an asynchronous reduction operation specified by.op, with operand b and the value at memory locations residing on each GPU’s memory referred to by the destination multimem address operand a.", "syntax": "multimem.red.async.sem.scope{.ss}.op.type [a], b;", "syntax_forms": [{"syntax": "multimem.red.async.sem.scope{.ss}.op.type [a], b;", "description": "multimem.red.async is a non-blocking instruction which initiates an asynchronous\nreduction operation specified by. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 9.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Asynchronous add reduction, GPU scope, explicit .global, 32-bit unsigned.\nmultimem.red.async.release.gpu.global.add.u32 [mm_addr], src_u32;\n\n// System scope, generic addressing.\nmultimem.red.async.release.sys.add.s32 [mm_addr], src_s32;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "multimem.red.async is a non-blocking instruction which initiates an asynchronous\nreduction operation specified by.op, with operand b and the value at memory\nlocations residing on each GPU’s memory referred to by the destination multimem address\noperand a.\nAddress operand a must be a multimem address. Otherwise, the behavior is undefined.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-multimem-red-async", "introducedIn": "PTX ISA 9.3", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.multimem.st", "mnemonic": "multimem.st", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "multimem.st", "category": "Data Movement and Conversion Instructions", "summary": "The multimem.* operations operate on multimem addresses and accesses all of the multiple memory\nlocations which the multimem address points to.\nMultimem addresses can be accessed only by multimem.* operations. Accessing a multimem address\nwith ld, st or any other memory operations results in undefined behavior.\nRefer to CUDA programming guide for creation and management of the multimem addresses.", "syntax": "// Integer type:\nmultimem.st{.stsem}{.scope}{.ss}.type                [a], b;", "syntax_forms": [{"syntax": "// Integer type:\nmultimem.st{.stsem}{.scope}{.ss}.type                [a], b;", "description": "Instruction multimem.ld_reduce performs the following operations: load operation on the multimem address a, which involves loading of data from all of the multiple memory locations pointed to by the m… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.1"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "Integer type:", "desc": "Operand"}], "semantics": null, "examples": "multimem.ld_reduce.and.b32                    val1_b32, [addr1];\nmultimem.ld_reduce.acquire.gpu.global.add.u32 val2_u32, [addr2];\n\nmultimem.st.relaxed.gpu.b32                [addr3], val3_b32;\nmultimem.st.release.cta.global.u32         [addr4], val4_u32;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Instruction multimem.ld_reduce performs the following operations:\nload operation on the multimem address a, which involves loading of data from all of the\nmultiple memory locations pointed to by the multimem address a, reduction operation specified by.op on the multiple data loaded from the multimem address a.\nThe result of the reduction operation in returned in register d.\nInstruction multimem.st performs a store operation of the input operand b to all the memory\nlocations pointed to by the multimem address a.\nInstruction multimem.red performs a reduction operation on all the memory locations pointed to\nby the multimem address a, with operand b.\nInstruction multimem. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.1", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.multimem.st.async", "mnemonic": "multimem.st.async", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "multimem.st.async", "category": "Data Movement and Conversion Instructions", "summary": "multimem.st.async is a non-blocking instruction which initiates an asynchronous store operation that stores the value specified by source operand b to the memory locations residing on each GPU’s memory referred to by the destination multimem address operand a.", "syntax": "multimem.st.async.sem.scope{.ss}.type [a], b;", "syntax_forms": [{"syntax": "multimem.st.async.sem.scope{.ss}.type [a], b;", "description": "multimem.st.async is a non-blocking instruction which initiates an asynchronous store operation that stores the value specified by source operand b to the memory locations residing on each GPU’s memor… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 9.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Release store to multimem address, GPU scope, explicit .global state space.\nmultimem.st.async.release.gpu.global.u32 [mm_addr], src_u32;\n\n// Release store, system scope, generic addressing for multimem operand.\nmultimem.st.async.release.sys.f64 [mm_addr], src_f64;", "description": "multimem.st.async is a non-blocking instruction which initiates an asynchronous store\noperation that stores the value specified by source operand b to the memory locations\nresiding on each GPU’s memory referred to by the destination multimem address operand a.\nAddress operand a must be a multimem address. Otherwise, the behavior is undefined.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-multimem-st-async", "introducedIn": "PTX ISA 9.3", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.nanosleep", "mnemonic": "nanosleep", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "nanosleep", "category": "Miscellaneous Instructions", "summary": "Suspends the thread for a sleep duration approximately close to the delay t, specified in nanoseconds.", "syntax": "nanosleep.u32 t;", "syntax_forms": [{"syntax": "nanosleep.u32 t;", "description": "Suspends the thread for a sleep duration approximately close to the delay t, specified in\nnanoseconds. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_70"], "introducedIn": "PTX ISA 6.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "t", "desc": "Operand"}], "semantics": null, "examples": ".reg .b32 r;\n.reg .pred p;\n\nnanosleep.u32 r;\nnanosleep.u32 42;\n@p nanosleep.u32 r;", "description": "Suspends the thread for a sleep duration approximately close to the delay t, specified in\nnanoseconds. t may be a register or an immediate value.\nThe sleep duration is approximated, but guaranteed to be in the interval [0, 2*t]. The maximum\nsleep duration is 1 millisecond. The implementation may reduce the sleep duration for individual\nthreads within a warp such that all sleeping threads in the warp wake up together.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#miscellaneous-instructions-nanosleep", "introducedIn": "PTX ISA 6.3", "requiredTargets": ["sm_70"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.neg", "mnemonic": "neg", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Negate", "category": "Arithmetic", "summary": "Negate a signed or floating-point operand.", "syntax": "neg.type d, a;", "syntax_forms": [{"syntax": "neg.type d, a;", "description": "Arithmetic negation.", "dataTypes": ["s16", "s32", "s64", "f32", "f64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32", "f64", "s16", "s32", "s64"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "d = -a.", "examples": "neg.s32  r0,a;\nneg.s8x4 p, q, r;\n\nneg.ftz.f32  x,f0;\n\nneg.ftz.f16  x,f0;\nneg.bf16     x,b0;\nneg.bf16x2   x1,b1;", "description": "Negate the sign of a and store the result in d.\nFor.f16x2 and.bf16x2 instruction type, forms input vector by extracting half word values\nfrom the source operand. Half-word operands are then negated in parallel to produce.f16x2 or.bf16x2 result in destination.\nFor.f16 instruction type, operands d and a have.f16 or.b16 type. For.f16x2 instruction type, operands d and a have.b32 type. For.bf16 instruction\ntype, operands d and a have.b16 type. For.bf16x2 instruction type, operands d and a have.b32 type.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#half-precision-floating-point-instructions-neg", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.not", "mnemonic": "not", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Bitwise NOT", "category": "Logic and Shift Instructions", "summary": "Bitwise complement of an operand.", "syntax": "not.type d, a;", "syntax_forms": [{"syntax": "not.type d, a;", "description": "Bitwise complement, including a predicate form.", "dataTypes": ["b16", "b32", "b64", "pred"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["b16", "b32", "b64", "pred"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "d = ~a (bitwise).", "examples": "not.b32  mask,mask;\nnot.pred  p,q;", "description": "Invert the bits in a.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#logic-and-shift-instructions-not", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.or", "mnemonic": "or", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Bitwise OR", "category": "Logic and Shift Instructions", "summary": "Bitwise OR of two operands.", "syntax": "or.type d, a, b;", "syntax_forms": [{"syntax": "or.type d, a, b;", "description": "Bitwise OR, including a predicate form.", "dataTypes": ["b16", "b32", "b64", "pred"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["b16", "b32", "b64", "pred"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "First operand"}, {"name": "b", "desc": "Second operand"}], "semantics": "d = a | b (bitwise).", "examples": "or.b32  mask mask,0x00010001\nor.pred  p,q,r;", "description": "Compute the bit-wise or operation for the bits in a and b.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#logic-and-shift-instructions-or", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.pmevent", "mnemonic": "pmevent", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "pmevent", "category": "Miscellaneous Instructions", "summary": "Triggers one or more of a fixed number of performance monitor events, with event index or mask specified by immediate operand a.", "syntax": "pmevent       a;    // trigger a single performance monitor event", "syntax_forms": [{"syntax": "pmevent       a;    // trigger a single performance monitor event", "description": "Triggers one or more of a fixed number of performance monitor events, with event index or mask\nspecified by immediate operand a.\npmevent (without modifier. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.4"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "pmevent      1;\n@p  pmevent      7;\n@q  pmevent.mask 0xff;", "description": "Triggers one or more of a fixed number of performance monitor events, with event index or mask\nspecified by immediate operand a.\npmevent (without modifier.mask ) triggers a single performance monitor event indexed by\nimmediate operand a, in the range 0..15.\npmevent.mask triggers one or more of the performance monitor events. Each bit in the 16-bit\nimmediate operand a controls an event.\nProgrammatic performance moniter events may be combined with other hardware events using Boolean\nfunctions to increment one of the four performance counters. The relationship between events and\ncounters is programmed via API calls from the host.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#miscellaneous-instructions-pmevent", "introducedIn": "PTX ISA 1.4", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.popc", "mnemonic": "popc", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Population Count", "category": "Integer Arithmetic Instructions", "summary": "Count the number of set bits in an integer operand.", "syntax": "popc.type d, a;", "syntax_forms": [{"syntax": "popc.type d, a;", "description": "Population count.", "dataTypes": ["b32", "b64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": ["b32", "b64"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register (u32)"}, {"name": "a", "desc": "Source operand"}], "semantics": "d = number of 1-bits in a.", "examples": "popc.b32  d, a;\npopc.b64  cnt, X;  // cnt is .u32", "description": "Count the number of one bits in a and place the resulting population count in 32-bit\ndestination register d. Operand a has the instruction type and destination d has type.u32.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-popc", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.prefetch", "mnemonic": "prefetch", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "prefetch", "category": "Data Movement and Conversion Instructions", "summary": "The prefetch instruction brings the cache line containing the specified address in global or\nlocal memory state space into the specified cache level.", "syntax": "prefetch{.space}.level                    [a];   // prefetch to data cache", "syntax_forms": [{"syntax": "prefetch{.space}.level                    [a];   // prefetch to data cache", "description": "The prefetch instruction brings the cache line containing the specified address in global or\nlocal memory state space into the specified cache level.\nIf the. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "prefetch.global.L1             [ptr];\nprefetch.global.L2::evict_last [ptr];\nprefetchu.L1  [addr];\nprefetch.const.tensormap       [ptr];", "description": "The prefetch instruction brings the cache line containing the specified address in global or\nlocal memory state space into the specified cache level.\nIf the.tensormap qualifier is specified then the prefetch instruction brings the cache line\ncontaining the specified address in the.const or.param memory state space for subsequent\nuse by the cp.async.bulk.tensor instruction.\nIf no state space is given, the prefetch uses Generic Addressing.\nOptionally, the eviction priority to be applied on the prefetched cache line can be specified by the\nmodifier.level::eviction_priority. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-prefetch-prefetchu", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.prefetchu", "mnemonic": "prefetchu", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "prefetchu", "category": "Data Movement and Conversion Instructions", "summary": "The prefetchu instruction brings the cache line containing the specified generic address into the specified uniform cache level. A prefetch to a shared memory location performs no operation.", "syntax": "prefetchu.L1  [a];   // prefetch to uniform cache", "syntax_forms": [{"syntax": "prefetchu.L1  [a];   // prefetch to uniform cache", "description": "The prefetchu instruction brings the cache line containing the specified generic address into the specified uniform cache level. A prefetch to a shared memory location performs no operation.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "prefetch.global.L1             [ptr];\nprefetch.global.L2::evict_last [ptr];\nprefetchu.L1  [addr];\nprefetch.const.tensormap       [ptr];", "description": "The prefetchu instruction brings the cache line containing the specified generic address into the specified uniform cache level. A prefetch to a shared memory location performs no operation.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-prefetch-prefetchu", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.prmt", "mnemonic": "prmt", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "prmt", "category": "Data Movement and Conversion Instructions", "summary": "Pick four arbitrary bytes from two 32-bit registers, and reassemble them into a 32-bit destination register.", "syntax": "prmt.b32{.mode}  d, a, b, c;", "syntax_forms": [{"syntax": "prmt.b32{.mode}  d, a, b, c;", "description": "Pick four arbitrary bytes from two 32-bit registers, and reassemble them into a 32-bit destination\nregister. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c", "desc": "Source operand"}], "semantics": "tmp64 = (b<<32) | a;  // create 8 byte source\n\nif ( ! mode ) {\n   ctl[0] = (c >>  0) & 0xf;\n   ctl[1] = (c >>  4) & 0xf;\n   ctl[2] = (c >>  8) & 0xf;\n   ctl[3] = (c >> 12) & 0xf;\n} else {\n   ctl[0] = ctl[1] = ctl[2] = ctl[3] = (c >>  0) & 0x3;\n}\n\ntmp[07:00] = ReadByte( mode, ctl[0], tmp64 );\ntmp[15:08] = ReadByte( mode, ctl[1], tmp64 );\ntmp[23:16] = ReadByte( mode, ctl[2], tmp64 );\ntmp[31:24] = ReadByte( mode, ctl[3], tmp64 );", "examples": "prmt.b32      r1, r2, r3, r4;\nprmt.b32.f4e  r1, r2, r3, r4;", "description": "Pick four arbitrary bytes from two 32-bit registers, and reassemble them into a 32-bit destination\nregister.\nIn the generic form (no mode specified), the permute control consists of four 4-bit selection\nvalues. The bytes in the two source registers are numbered from 0 to 7: {b, a} = {{b7, b6, b5, b4}, {b3, b2, b1, b0}}. For each byte in the target register, a 4-bit selection value is defined.\nThe 3 lsbs of the selection value specify which of the 8 source bytes should be moved into the\ntarget position. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-prmt", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.rcp", "mnemonic": "rcp", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "rcp", "category": "Floating-Point Instructions", "summary": "Compute 1/a, store result in d.", "syntax": "rcp.approx{.ftz}.f32  d, a;  // fast, approximate reciprocal", "syntax_forms": [{"syntax": "rcp.approx{.ftz}.f32  d, a;  // fast, approximate reciprocal", "description": "Compute 1/a, store result in d.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "d = 1 / a;", "examples": "rcp.approx.ftz.f32  ri,r;\nrcp.rn.ftz.f32      xi,x;\nrcp.rn.f64          xi,x;", "description": "Compute 1/a, store result in d.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#floating-point-instructions-rcp", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.rcp.approx.ftz.f64", "mnemonic": "rcp.approx.ftz.f64", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "rcp.approx.ftz.f64", "category": "Floating-Point Instructions", "summary": "Compute a fast, gross approximation to the reciprocal as follows: extract the most-significant 32 bits of.f64 operand a in 1.11.20 IEEE floating-point format (i.e., ignore the least-significant 32…", "syntax": "rcp.approx.ftz.f64  d, a;", "syntax_forms": [{"syntax": "rcp.approx.ftz.f64  d, a;", "description": "Compute a fast, gross approximation to the reciprocal as follows:\nextract the most-significant 32 bits of.f64 operand a in 1.11.20 IEEE floating-point\nformat (i.e. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.1"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "tmp = a[63:32]; // upper word of a, 1.11.20 format\nd[63:32] = 1.0 / tmp;\nd[31:0] = 0x00000000;", "examples": "rcp.approx.ftz.f64  xi,x;", "description": "Compute a fast, gross approximation to the reciprocal as follows:\nextract the most-significant 32 bits of.f64 operand a in 1.11.20 IEEE floating-point\nformat (i.e., ignore the least-significant 32 bits of a ), compute an approximate.f64 reciprocal of this value using the most-significant 20 bits of\nthe mantissa of operand a, place the resulting 32-bits in 1.11.20 IEEE floating-point format in the most-significant 32-bits\nof destination d,and zero the least significant 32 mantissa bits of.f64 destination d.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#floating-point-instructions-rcp-approx-ftz-f64", "introducedIn": "PTX ISA 2.1", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.red", "mnemonic": "red", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Reduction", "category": "Parallel Synchronization and Communication Instructions", "summary": "Atomically read-modify-write a memory location without returning the prior value.", "syntax": "red.space.op.type [a], b;", "syntax_forms": [{"syntax": "red.space.op.type [a], b;", "description": "Same read-modify-write as atom, but discards the prior value - cheaper when the old value isn't needed.", "dataTypes": ["b32", "b64", "s32", "u32", "u64", "f32", "f64"], "stateSpaces": ["global", "shared"], "scopes": [], "modifiers": ["add", "min", "max", "and", "or", "xor", "inc", "dec"], "requiredTargets": ["sm_11"], "introducedIn": "PTX ISA 1.2"}], "dataTypes": ["b32", "b64", "f32", "f64", "s32", "u32", "u64"], "stateSpaces": ["global", "shared"], "scopes": [], "modifiers": ["add", "and", "dec", "inc", "max", "min", "or", "xor"], "operands": [{"name": "a", "desc": "Memory address"}, {"name": "b", "desc": "Operand value"}], "semantics": "*a = op(*a, b).", "examples": "red.global.add.s32  [a],1;\nred.shared::cluster.max.u32  [x+4],0;\n@p  red.global.and.b32  [p],my_val;\nred.global.sys.add.u32 [a], 1;\nred.global.acquire.sys.add.u32 [gbl], 1;\nred.add.noftz.f16x2 [a], b;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Performs a reduction operation with operand b and the value in location a, and stores the\nresult of the specified operation at location a, overwriting the original value. Operand a specifies a location in the specified state space. If no state space is given, perform the memory\naccesses using Generic Addressing. red with scalar type may\nbe used only with.global and.shared spaces and with generic addressing, where the address\npoints to.global or.shared space. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-red", "introducedIn": "PTX ISA 1.2", "requiredTargets": ["sm_11"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.red.async", "mnemonic": "red.async", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "red.async", "category": "Parallel Synchronization and Communication Instructions", "summary": "red.async is a non-blocking instruction which initiates an asynchronous reduction operation specified by.op, with the operand b and the value at destination shared memory location specified by operand a.", "syntax": "// Increment and Decrement reductions\nred.async.sem.scope{.ss}.completion_mechanism.op.type [a], b, [mbar];", "syntax_forms": [{"syntax": "// Increment and Decrement reductions\nred.async.sem.scope{.ss}.completion_mechanism.op.type [a], b, [mbar];", "description": "red.async is a non-blocking instruction which initiates an asynchronous reduction operation\nspecified by. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.1"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "red.async.relaxed.cluster.shared::cluster.mbarrier::complete_tx::bytes.min.u32 [addr], b, [mbar_addr];\n\nred.async.release.sys.global.add.u32 [addr], b;", "description": "red.async is a non-blocking instruction which initiates an asynchronous reduction operation\nspecified by.op, with the operand b and the value at destination shared memory location\nspecified by operand a.\nred.async is performed in the generic proxy.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-red-async", "introducedIn": "PTX ISA 8.1", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.redux.sync", "mnemonic": "redux.sync", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "redux.sync", "category": "Parallel Synchronization and Communication Instructions", "summary": "redux.sync will cause the executing thread to wait until all non-exited threads corresponding to membermask have executed redux.sync with the same qualifiers and same membermask value before resuming execution.", "syntax": "redux.sync.op.type dst, src, membermask;", "syntax_forms": [{"syntax": "redux.sync.op.type dst, src, membermask;", "description": "redux.sync will cause the executing thread to wait until all non-exited threads corresponding to membermask have executed redux. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_80"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "dst", "desc": "Operand"}, {"name": "src", "desc": "Operand"}, {"name": "membermask", "desc": "Operand"}], "semantics": null, "examples": ".reg .b32 dst, src, init, mask;\nredux.sync.add.s32 dst, src, 0xff;\nredux.sync.xor.b32 dst, src, mask;\n\nredux.sync.min.abs.NaN.f32 dst, src, mask;", "description": "redux.sync will cause the executing thread to wait until all non-exited threads corresponding to membermask have executed redux.sync with the same qualifiers and same membermask value\nbefore resuming execution.\nOperand membermask specifies a 32-bit integer which is a mask indicating threads participating\nin this instruction where the bit position corresponds to thread’s laneid.\nredux.sync performs a reduction operation.op of the 32 bit source register src across\nall non-exited threads in the membermask. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-redux-sync", "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_80"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.rem", "mnemonic": "rem", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Remainder", "category": "Arithmetic", "summary": "Compute the integer remainder of division.", "syntax": "rem.stype d, a, b;", "syntax_forms": [{"syntax": "rem.stype d, a, b;", "description": "Integer remainder.", "dataTypes": ["s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Dividend"}, {"name": "b", "desc": "Divisor"}], "semantics": "d = a - b * trunc(a / b).", "examples": "rem.s32  x,x,8;    // x = x%8;", "description": "Divides a by b, store the remainder in d.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-rem", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.ret", "mnemonic": "ret", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "ret", "category": "Control Flow Instructions", "summary": "Return execution to caller’s environment.", "syntax": "ret{.uni};", "syntax_forms": [{"syntax": "ret{.uni};", "description": "Return execution to caller’s environment. A divergent return suspends threads until all threads are\nready to return to the caller. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "ret;\n@p  ret;", "description": "Return execution to caller’s environment. A divergent return suspends threads until all threads are\nready to return to the caller. This allows multiple divergent ret instructions.\nA ret is assumed to be divergent unless the.uni suffix is present, indicating that the\nreturn is guaranteed to be non-divergent.\nAny values returned from a function should be moved into the return parameter variables prior to\nexecuting the ret instruction.\nA return instruction executed in a top-level entry routine will terminate thread execution.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#control-flow-instructions-ret", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.rsqrt", "mnemonic": "rsqrt", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Reciprocal Square Root (Approximate)", "category": "Arithmetic", "summary": "Fast hardware approximation of 1/sqrt(x).", "syntax": "rsqrt.approx.f32 d, a;", "syntax_forms": [{"syntax": "rsqrt.approx.f32 d, a;", "description": "Reduced-precision reciprocal square root.", "dataTypes": ["f32"], "stateSpaces": [], "scopes": [], "modifiers": ["approx"], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32"], "stateSpaces": [], "scopes": [], "modifiers": ["approx"], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "d ≈ 1 / sqrt(a), with a hardware-specific ULP error bound rather than a fully IEEE-rounded result.", "examples": "rsqrt.approx.ftz.f32  isr, x;\nrsqrt.approx.f64      ISR, X;", "description": "Compute 1/sqrt(a) and store the result in d.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#floating-point-instructions-rsqrt", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.rsqrt.approx.ftz.f64", "mnemonic": "rsqrt.approx.ftz.f64", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "rsqrt.approx.ftz.f64", "category": "Floating-Point Instructions", "summary": "Compute a double-precision (.f64 ) approximation of the square root reciprocal of a value. The\nleast significant 32 bits of the double-precision (.f64", "syntax": "rsqrt.approx.ftz.f64 d, a;", "syntax_forms": [{"syntax": "rsqrt.approx.ftz.f64 d, a;", "description": "Compute a double-precision (.f64 ) approximation of the square root reciprocal of a value. The\nleast significant 32 bits of the double-precision (.f64 ) destination d are all zeros.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 4.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "tmp = a[63:32]; // upper word of a, 1.11.20 format\nd[63:32] = 1.0 / sqrt(tmp);\nd[31:0] = 0x00000000;", "examples": "rsqrt.approx.ftz.f64 xi,x;", "description": "Compute a double-precision (.f64 ) approximation of the square root reciprocal of a value. The\nleast significant 32 bits of the double-precision (.f64 ) destination d are all zeros.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#floating-point-instructions-rsqrt-approx-ftz-f64", "introducedIn": "PTX ISA 4.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.sad", "mnemonic": "sad", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "sad", "category": "Integer Arithmetic Instructions", "summary": "Adds the absolute value of a-b to c and writes the resulting value into d.", "syntax": "sad.type  d, a, b, c;", "syntax_forms": [{"syntax": "sad.type  d, a, b, c;", "description": "Adds the absolute value of a-b to c and writes the resulting value into d.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c", "desc": "Source operand"}], "semantics": "d = c + ((a<b) ? b-a : a-b);", "examples": "sad.s32  d,a,b,c;\nsad.u32  d,a,b,d;  // running sum", "description": "Adds the absolute value of a-b to c and writes the resulting value into d.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-sad", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.selp", "mnemonic": "selp", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Select with Predicate", "category": "Comparison and Selection Instructions", "summary": "Select between two operands based on a predicate, without branching.", "syntax": "selp.type d, a, b, p;", "syntax_forms": [{"syntax": "selp.type d, a, b, p;", "description": "Branchless select.", "dataTypes": ["b16", "b32", "b64", "s16", "s32", "s64", "u16", "u32", "u64", "f32", "f64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["b16", "b32", "b64", "f32", "f64", "s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Value if p is true"}, {"name": "b", "desc": "Value if p is false"}, {"name": "p", "desc": "Predicate register"}], "semantics": "d = p ? a : b.", "examples": "selp.s32  r0,r,g,p;\n@q  selp.f32  f0,t,x,xp;", "description": "Conditional selection. If c is True, a is stored in d, b otherwise. Operands d, a, and b must be of the same type. Operand c is a predicate.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#comparison-and-selection-instructions-selp", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.set", "mnemonic": "set", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Set (Compare and Produce Value)", "category": "Comparison and Selection Instructions", "summary": "Compare two operands and write a numeric (not predicate) 0/1 or all-ones/all-zeros result.", "syntax": "set.CmpOp.dtype.stype d, a, b;", "syntax_forms": [{"syntax": "set.CmpOp.dtype.stype d, a, b;", "description": "Comparison producing a value, useful when the result feeds arithmetic rather than a guarded branch.", "dataTypes": ["u32", "s32", "f32"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32", "s32", "u32"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "First operand"}, {"name": "b", "desc": "Second operand"}], "semantics": "d = CmpOp(a, b) ? (all-ones or 1) : 0, encoding depends on dtype.", "examples": "@p  set.lt.and.f32.s32  d,a,b,r;\n    set.eq.u32.u32      d,i,n;\n\nset.lt.and.f16.f16  d,a,b,r;\nset.eq.f16x2.f16x2  d,i,n;\nset.eq.u32.f16x2    d,i,n;\nset.lt.and.u16.f16  d,a,b,r;\nset.ltu.or.bf16.f16    d,u,v,s;\nset.equ.bf16x2.bf16x2  d,j,m;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Compares two numeric values and optionally combines the result with another predicate value by\napplying a Boolean operator.\nResult of this computation is written in destination register in the following way:\nIf result is True, 0xffffffff is written for destination types.u32 /.s32. 0xffff is written for destination types.u16 /.s16. 1.0 in target precision floating point format is written for destination type.f16,.bf16. If result is False, 0x0 is written for all integer destination types. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#half-precision-comparison-instructions-set", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.setmaxnreg", "mnemonic": "setmaxnreg", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "setmaxnreg", "category": "Miscellaneous Instructions", "summary": "setmaxnreg provides a hint to the system to update the maximum number of per-thread registers owned by the executing warp to the value specified by the imm-reg-count operand.", "syntax": "setmaxnreg.action.sync.aligned.u32 imm-reg-count;", "syntax_forms": [{"syntax": "setmaxnreg.action.sync.aligned.u32 imm-reg-count;", "description": "setmaxnreg provides a hint to the system to update the maximum number of per-thread registers\nowned by the executing warp to the value specified by the imm-reg-count operand.\nQualifier. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90a"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "imm-reg-count", "desc": "Operand"}], "semantics": null, "examples": "setmaxnreg.dec.sync.aligned.u32 64;\nsetmaxnreg.inc.sync.aligned.u32 192;", "description": "setmaxnreg provides a hint to the system to update the maximum number of per-thread registers\nowned by the executing warp to the value specified by the imm-reg-count operand.\nQualifier.dec is used to release extra registers such that the absolute per-thread maximum\nregister count is reduced from its current value to imm-reg-count. Qualifier.inc is used to\nrequest additional registers such that the absolute per-thread maximum register count is increased\nfrom its current value to imm-reg-count.\nA pool of available registers is maintained per-CTA. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#miscellaneous-instructions-setmaxnreg", "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.setp", "mnemonic": "setp", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Set Predicate", "category": "Comparison and Selection Instructions", "summary": "Compare two operands and write the boolean result to a predicate register.", "syntax": "setp.CmpOp.type p, a, b;", "syntax_forms": [{"syntax": "setp.CmpOp.type p, a, b;", "description": "Comparison writing a predicate register, consumed by @p-guarded instructions.", "dataTypes": ["s32", "s64", "u32", "u64", "f32", "f64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32", "f64", "s32", "s64", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "p", "desc": "Destination predicate register"}, {"name": "a", "desc": "First operand"}, {"name": "b", "desc": "Second operand"}], "semantics": "p = CmpOp(a, b).", "examples": "setp.lt.and.s32  p|q,a,b,r;\n@q  setp.eq.u32      p,i,n;\n\nsetp.lt.and.f16x2  p|q,a,b,r;\n@q  setp.eq.f16    p,i,n;\n\nsetp.gt.or.bf16x2  u|v,c,d,s;\n@q  setp.eq.bf16   u,j,m;", "description": "Compares two values and combines the result with another predicate value by applying a Boolean\noperator. This result is written to the first destination operand. A related value computed using\nthe complement of the compare result is written to the second destination operand.\nApplies to all numeric types. Operands a and b have type.type; operands p, q,\nand c have type.pred. The sink symbol ‘_’ may be used in place of any one of the\ndestination operands.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#comparison-and-selection-instructions-setp", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.shf", "mnemonic": "shf", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "shf", "category": "Logic and Shift Instructions", "summary": "Shift the 64-bit value formed by concatenating operands a and b left or right by the amount specified by the unsigned 32-bit value in c.", "syntax": "shf.l.mode.b32  d, a, b, c;  // left shift", "syntax_forms": [{"syntax": "shf.l.mode.b32  d, a, b, c;  // left shift", "description": "Shift the 64-bit value formed by concatenating operands a and b left or right by the amount\nspecified by the unsigned 32-bit value in c. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_32"], "introducedIn": "PTX ISA 3.1"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c;  // left shift", "desc": "Operand"}], "semantics": "u32  n = (.mode == .clamp) ? min(c, 32) : c & 0x1f;\nswitch (shf.dir) {  // shift concatenation of [b, a]\n    case shf.l:     // extract 32 msbs\n           u32  d = (b << n)      | (a >> (32-n));\n    case shf.r:     // extract 32 lsbs\n           u32  d = (b << (32-n)) | (a >> n);\n}", "examples": null, "description": "Shift the 64-bit value formed by concatenating operands a and b left or right by the amount\nspecified by the unsigned 32-bit value in c. Operand b holds bits 63:32 and operand a\nholds bits 31:0 of the 64-bit source value. The source is shifted left or right by the clamped\nor wrapped value in c. For shf.l, the most-significant 32-bits of the result are written\ninto d; for shf.r, the least-significant 32-bits of the result are written into d.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#logic-and-shift-instructions-shf", "introducedIn": "PTX ISA 3.1", "requiredTargets": ["sm_32"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.shfl", "mnemonic": "shfl", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Shuffle", "category": "Data Movement and Conversion Instructions", "summary": "Exchange a value directly between lanes of the same warp.", "syntax": "shfl.mode.b32 d[|p], a, b, c;", "syntax_forms": [{"syntax": "shfl.mode.b32 d[|p], a, b, c;", "description": "Legacy (unsynchronized) warp shuffle; deprecated since PTX ISA 6.0 in favor of shfl.sync.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": ["up", "down", "bfly", "idx"], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 6.0"}, {"syntax": "shfl.sync.mode.b32 d[|p], a, b, c, membermask;", "description": "Warp shuffle that also synchronizes the specified member lanes before exchanging data.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": ["up", "down", "bfly", "idx"], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 6.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": ["bfly", "down", "idx", "up"], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Value to shuffle"}, {"name": "b", "desc": "Source-lane selector"}, {"name": "c", "desc": "Clamp/width control"}, {"name": "membermask", "desc": "Mask of participating lanes (sync form only)"}], "semantics": "d = value of operand a as seen by another lane in the warp, selected by mode/b; optional predicate p reports whether the source lane was valid.", "examples": "shfl.sync.up.b32  Ry|p, Rx, 0x1,  0x0, 0xffffffff;", "description": "Exchange register data between threads of a warp.\nshfl.sync will cause executing thread to wait until all non-exited threads corresponding to membermask have executed shfl.sync with the same qualifiers and same membermask value\nbefore resuming execution.\nOperand membermask specifies a 32-bit integer which is a mask indicating threads participating\nin barrier where the bit position corresponds to thread’s laneid.\nshfl.sync exchanges register data between threads in membermask.\nEach thread in the currently executing warp will compute a source lane index j based on input\noperands b and c and the mode. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-shfl-sync", "introducedIn": "PTX ISA 6.0", "requiredTargets": ["sm_30"], "deprecatedIn": "PTX ISA 6.0 (legacy non-sync form only)", "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.shl", "mnemonic": "shl", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Shift Left", "category": "Logic and Shift Instructions", "summary": "Shift bits left, filling with zero.", "syntax": "shl.type d, a, b;", "syntax_forms": [{"syntax": "shl.type d, a, b;", "description": "Logical left shift by an unsigned shift amount b.", "dataTypes": ["b16", "b32", "b64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["b16", "b32", "b64"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Value to shift"}, {"name": "b", "desc": "Shift amount (u32)"}], "semantics": "d = a << b.", "examples": null, "description": "Shift a left by the amount specified by unsigned 32-bit value in b.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#logic-and-shift-instructions-shl", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.shr", "mnemonic": "shr", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Shift Right", "category": "Logic and Shift Instructions", "summary": "Shift bits right, arithmetic or logical depending on the operand's signedness.", "syntax": "shr.type d, a, b;", "syntax_forms": [{"syntax": "shr.type d, a, b;", "description": "Right shift: arithmetic (sign-extending) for signed types, logical for unsigned types.", "dataTypes": ["s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Value to shift"}, {"name": "b", "desc": "Shift amount (u32)"}], "semantics": "d = a >> b.", "examples": null, "description": "Shift a right by the amount specified by unsigned 32-bit value in b. Signed shifts fill with\nthe sign bit, unsigned and untyped shifts fill with 0.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#logic-and-shift-instructions-shr", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.sin", "mnemonic": "sin", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Sine (Approximate)", "category": "Arithmetic", "summary": "Fast hardware approximation of sin(x).", "syntax": "sin.approx.f32 d, a;", "syntax_forms": [{"syntax": "sin.approx.f32 d, a;", "description": "Reduced-precision sine, valid over a hardware-defined input range.", "dataTypes": ["f32"], "stateSpaces": [], "scopes": [], "modifiers": ["approx"], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32"], "stateSpaces": [], "scopes": [], "modifiers": ["approx"], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand (radians)"}], "semantics": "d ≈ sin(a).", "examples": "sin.approx.ftz.f32  sa, a;", "description": "Find the sine of the angle a (in radians).", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#floating-point-instructions-sin", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.slct", "mnemonic": "slct", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "slct", "category": "Comparison and Selection Instructions", "summary": "Conditional selection.", "syntax": "slct.dtype.s32        d, a, b, c;", "syntax_forms": [{"syntax": "slct.dtype.s32        d, a, b, c;", "description": "Conditional selection. If c >= 0, a is stored in d, otherwise b is stored in d. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_13"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}, {"name": "c", "desc": "Source operand"}], "semantics": "d = (c >= 0) ? a : b;", "examples": "slct.u32.s32  x, y, z, val;\nslct.ftz.u64.f32  A, B, C, fval;", "description": "Conditional selection. If c >= 0, a is stored in d, otherwise b is stored in d. Operands d, a, and b are treated as a bitsize type of the same width as the first\ninstruction type; operand c must match the second instruction type (.s32 or.f32 ). The\nselected input is copied to the output without modification.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#comparison-and-selection-instructions-slct", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_13"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.sqrt", "mnemonic": "sqrt", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "sqrt", "category": "Floating-Point Instructions", "summary": "Compute sqrt( a ) and store the result in d.", "syntax": "sqrt.approx{.ftz}.f32  d, a; // fast, approximate square root", "syntax_forms": [{"syntax": "sqrt.approx{.ftz}.f32  d, a; // fast, approximate square root", "description": "Compute sqrt( a ) and store the result in d.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "d = sqrt(a);", "examples": "sqrt.approx.ftz.f32  r,x;\nsqrt.rn.ftz.f32      r,x;\nsqrt.rn.f64          r,x;", "description": "Compute sqrt( a ) and store the result in d.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#floating-point-instructions-sqrt", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.st", "mnemonic": "st", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Store", "category": "Data Movement and Conversion Instructions", "summary": "Store a register value into the specified state space.", "syntax": "st.space.type [a], b;", "syntax_forms": [{"syntax": "st.space.type [a], b;", "description": "Store to an explicit state space.", "dataTypes": ["b8", "b16", "b32", "b64", "s8", "s16", "s32", "s64", "u8", "u16", "u32", "u64", "f16", "f32", "f64"], "stateSpaces": ["global", "local", "shared", "param"], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["b16", "b32", "b64", "b8", "f16", "f32", "f64", "s16", "s32", "s64", "s8", "u16", "u32", "u64", "u8"], "stateSpaces": ["global", "local", "param", "shared"], "scopes": [], "modifiers": [], "operands": [{"name": "a", "desc": "Destination address"}, {"name": "b", "desc": "Value to store"}], "semantics": "*a = b, in the given state space.", "examples": "st.global.f32    [a],b;\nst.local.b32     [q+4],a;\nst.global.v4.s32 [p],Q;\nst.local.b32     [q+-8],a; // negative offset\nst.local.s32     [100],r7; // immediate address\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Store the value of operand b in the location specified by the destination address\noperand a in specified state space. If no state space is given, perform the store using Generic Addressing. Stores to const memory are illegal.\nIf no sub-qualifier is specified with.shared state space, then::cta is assumed by default.\nSupported addressing modes for operand a and alignment requirements are described in Addresses as Operands.\nIf.param is specified without any sub-qualifiers then it defaults to.param::func.\nInstruction st.param{::func} used for passing arguments to device function cannot be predicated. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-st", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.st.async", "mnemonic": "st.async", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "st.async", "category": "Data Movement and Conversion Instructions", "summary": "st.async is a non-blocking instruction which initiates an asynchronous store operation that stores the value specified by source operand b to the destination memory location specified by operand a.", "syntax": "st.async{.weak}{.ss}.completion_mechanism{.vec}.type [a], b, [mbar];", "syntax_forms": [{"syntax": "st.async{.weak}{.ss}.completion_mechanism{.vec}.type [a], b, [mbar];", "description": "st.async is a non-blocking instruction which initiates an asynchronous store operation that\nstores the value specified by source operand b to the destination memory location\nspecified by operand a. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.1"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "st.async.shared::cluster.mbarrier::complete_tx::bytes.u32 [addr], b, [mbar_addr];\n\nst.async.sys.release.global.u32 [addr], b;\n\nst.async.mbarrier::complete_tx::bytes.b128 [addr], b, [mbar_addr];\n// (truncated - see the official PTX ISA docs for the full example)", "description": "st.async is a non-blocking instruction which initiates an asynchronous store operation that\nstores the value specified by source operand b to the destination memory location\nspecified by operand a.\nst.async is performed in the generic proxy.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-st-async", "introducedIn": "PTX ISA 8.1", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.st.bulk", "mnemonic": "st.bulk", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "st.bulk", "category": "Data Movement and Conversion Instructions", "summary": "st.bulk instruction initializes a region of shared memory starting from the location specified by destination address operand a.", "syntax": "st.bulk{.weak}{.shared::cta}  [a], size, initval; // initval must be zero", "syntax_forms": [{"syntax": "st.bulk{.weak}{.shared::cta}  [a], size, initval; // initval must be zero", "description": "st.bulk instruction initializes a region of shared memory starting from the location specified\nby destination address operand a. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "st.bulk.weak.shared::cta  [dst], n, 0;\n\nst.bulk                   [gdst], 4096, 0;", "description": "st.bulk instruction initializes a region of shared memory starting from the location specified\nby destination address operand a.\nThe 32-bit or 64-bit integer operand size specifies the amount of memory to be initialized in terms of\nnumber of bytes. size must be a multiple of 8. If the value is not a multiple of 8, then the\nbehavior is undefined. The maximum value of size operand can be 16777216.\nThe integer immediate operand initval specifies the initialization value for the memory\nlocations. The only numeric value allowed for operand initval is 0.\nIf no state space is specified then Generic Addressing is used. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-st-bulk", "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.stackrestore", "mnemonic": "stackrestore", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "stackrestore", "category": "Stack Manipulation Instructions", "summary": "Sets the current stack pointer to source register a.", "syntax": "stackrestore.type  a;", "syntax_forms": [{"syntax": "stackrestore.type  a;", "description": "Sets the current stack pointer to source register a. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_52"], "introducedIn": "PTX ISA 7.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "a", "desc": "Source operand"}], "semantics": "stackptr = a;", "examples": ".reg .u32 ra;\nstacksave.u32 ra;\n// Code that may modify stack pointer\n...\nstackrestore.u32 ra;", "description": "Sets the current stack pointer to source register a.\nWhen stackrestore is used with operand a written by a prior stacksave instruction, it\nwill effectively restore the state of stack as it was before stacksave was executed. Note that\nif stackrestore is used with an arbitrary value of a, it may cause corruption of stack\npointer. This implies that the correct use of this feature requires that stackrestore.type a is\nused after stacksave.type a without redefining the value of a between them.\nOperand a has the same type as the instruction type.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#stack-manipulation-instructions-stackrestore", "introducedIn": "PTX ISA 7.3", "requiredTargets": ["sm_52"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.stacksave", "mnemonic": "stacksave", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "stacksave", "category": "Stack Manipulation Instructions", "summary": "Copies the current value of stack pointer into the destination register d.", "syntax": "stacksave.type  d;", "syntax_forms": [{"syntax": "stacksave.type  d;", "description": "Copies the current value of stack pointer into the destination register d. Pointer returned by stacksave can be used in a subsequent stackrestore instruction to restore the stack\npointer. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_52"], "introducedIn": "PTX ISA 7.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}], "semantics": "d = stackptr;", "examples": ".reg .u32 rd;\nstacksave.u32 rd;\n\n.reg .u64 rd1;\nstacksave.u64 rd1;", "description": "Copies the current value of stack pointer into the destination register d. Pointer returned by stacksave can be used in a subsequent stackrestore instruction to restore the stack\npointer. If d is modified prior to use in stackrestore instruction, it may corrupt data in\nthe stack.\nDestination operand d has the same type as the instruction type.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#stack-manipulation-instructions-stacksave", "introducedIn": "PTX ISA 7.3", "requiredTargets": ["sm_52"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.stmatrix", "mnemonic": "stmatrix", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "stmatrix", "category": "Warp Level Matrix Multiply-Accumulate Instructions", "summary": "Collectively store one or more matrices across all threads in a warp to the location indicated by the address operand p, in.shared state space.", "syntax": "stmatrix.sync.aligned.shape.num{.trans}{.ss}.type [p], r;", "syntax_forms": [{"syntax": "stmatrix.sync.aligned.shape.num{.trans}{.ss}.type [p], r;", "description": "Collectively store one or more matrices across all threads in a warp to the location indicated by\nthe address operand p, in.shared state space. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 7.8"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Store a single 8x8 matrix using 64-bit addressing\n.reg .b64 addr;\n.reg .b32 r;\nstmatrix.sync.aligned.m8n8.x1.shared.b16 [addr], {r};\n\n// Store two 8x8 matrices in column-major format\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Collectively store one or more matrices across all threads in a warp to the location indicated by\nthe address operand p, in.shared state space. If no state space is provided, generic\naddressing is used, such that the address in p points into.shared space. If the generic\naddress doesn’t fall in.shared state space, then the behavior is undefined.\nThe.shape qualifier indicates the dimensions of the matrices being loaded. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#warp-level-matrix-instructions-stmatrix", "introducedIn": "PTX ISA 7.8", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.sub", "mnemonic": "sub", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Subtract", "category": "Arithmetic", "summary": "Subtract the second operand from the first, with optional saturation for signed 32-bit integers.", "syntax": "sub.type d, a, b;", "syntax_forms": [{"syntax": "sub.type d, a, b;", "description": "Generic subtract across integer and floating-point types.", "dataTypes": ["s16", "s32", "s64", "u16", "u32", "u64", "f32", "f64"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}, {"syntax": "sub.sat.s32 d, a, b;", "description": "Signed 32-bit subtract with saturation.", "dataTypes": ["s32"], "stateSpaces": [], "scopes": [], "modifiers": ["sat"], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["f32", "f64", "s16", "s32", "s64", "u16", "u32", "u64"], "stateSpaces": [], "scopes": [], "modifiers": ["sat"], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Minuend"}, {"name": "b", "desc": "Subtrahend"}], "semantics": "d = a - b.", "examples": "sub.s32 c,a,b;\nsub.u8x4 p, q, r;\n\nsub.f32 c,a,b;\nsub.rn.ftz.f32  f1,f2,f3;\n\n// scalar f16 subtractions\nsub.f16        d0, a0, b0;\nsub.rn.f16     d1, a1, b1;\nsub.bf16       bd0, ba0, bb0;\nsub.rn.bf16    bd1, ba1, bb1;\n// (truncated - see the official PTX ISA docs for the full example)\n\n.reg .f32 fc, fd;\n.reg .f16 ha;\nsub.rz.f32.f16.sat   fd, ha, fc;", "description": "Performs subtraction and writes the resulting value into a destination register.\nFor.f16x2 and.bf16x2 instruction type, forms input vectors by half word values from source\noperands. Half-word operands are then subtracted in parallel to produce.f16x2 or.bf16x2 result in destination.\nFor.f16 instruction type, operands d, a and b have.f16 or.b16 type. For.f16x2 instruction type, operands d, a and b have.b32 type. For.bf16 instruction type, operands d, a, b have.b16 type. For.bf16x2 instruction type,\noperands d, a, b have.b32 type.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#half-precision-floating-point-instructions-sub", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.sub.cc", "mnemonic": "sub.cc", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "sub.cc", "category": "Extended-Precision Integer Arithmetic Instructions", "summary": "Performs integer subtraction and writes the borrow-out value into the condition code register.", "syntax": "sub.cc.type  d, a, b;", "syntax_forms": [{"syntax": "sub.cc.type  d, a, b;", "description": "Performs integer subtraction and writes the borrow-out value into the condition code register.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.2"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}], "semantics": "d = a - b;", "examples": "@p  sub.cc.u32   x1,y1,z1;   // extended-precision subtraction\n@p  subc.cc.u32  x2,y2,z2;   // of two 128-bit values\n@p  subc.cc.u32  x3,y3,z3;\n@p  subc.u32     x4,y4,z4;", "description": "Performs integer subtraction and writes the borrow-out value into the condition code register.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#extended-precision-arithmetic-instructions-sub-cc", "introducedIn": "PTX ISA 1.2", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.subc", "mnemonic": "subc", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "subc", "category": "Extended-Precision Integer Arithmetic Instructions", "summary": "Performs integer subtraction with borrow-in and optionally writes the borrow-out value into the\ncondition code register.", "syntax": "subc{.cc}.type  d, a, b;", "syntax_forms": [{"syntax": "subc{.cc}.type  d, a, b;", "description": "Performs integer subtraction with borrow-in and optionally writes the borrow-out value into the\ncondition code register.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.2"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}], "semantics": "d = a  - (b + CC.CF);", "examples": "@p  sub.cc.u32   x1,y1,z1;   // extended-precision subtraction\n@p  subc.cc.u32  x2,y2,z2;   // of two 128-bit values\n@p  subc.cc.u32  x3,y3,z3;\n@p  subc.u32     x4,y4,z4;", "description": "Performs integer subtraction with borrow-in and optionally writes the borrow-out value into the\ncondition code register.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#extended-precision-arithmetic-instructions-subc", "introducedIn": "PTX ISA 1.2", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.suld", "mnemonic": "suld", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "suld", "category": "Surface Instructions", "summary": "suld.b.{1d,2d,3d} Load from surface memory using a surface coordinate vector.", "syntax": "suld.b.geom{.cop}.vec.dtype.clamp  d, [a, b];  // unformatted", "syntax_forms": [{"syntax": "suld.b.geom{.cop}.vec.dtype.clamp  d, [a, b];  // unformatted", "description": "suld.b.{1d,2d,3d}\nLoad from surface memory using a surface coordinate vector. The instruction loads data from the\nsurface named by operand a at coordinates given by operand b into destination d. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.5"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "suld.b.1d.v4.b32.trap  {s1,s2,s3,s4}, [surf_B, {x}];\nsuld.b.3d.v2.b64.trap  {r1,r2}, [surf_A, {x,y,z,w}];\nsuld.b.a1d.v2.b32      {r0,r1}, [surf_C, {idx,x}];\nsuld.b.a2d.b32         r0, [surf_D, {idx,x,y,z}];  // z ignored", "description": "suld.b.{1d,2d,3d}\nLoad from surface memory using a surface coordinate vector. The instruction loads data from the\nsurface named by operand a at coordinates given by operand b into destination d. Operand a is a.surfref variable or.u64 register. Operand b is a scalar or singleton tuple\nfor 1d surfaces; is a two-element vector for 2d surfaces; and is a four-element vector for 3d\nsurfaces, where the fourth element is ignored. Coordinate elements are of type.s32.\nsuld.b performs an unformatted load of binary data. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#surface-instructions-suld", "introducedIn": "PTX ISA 1.5", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.suq", "mnemonic": "suq", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "suq", "category": "Surface Instructions", "summary": "Query an attribute of a surface.", "syntax": "suq.query.b32   d, [a];", "syntax_forms": [{"syntax": "suq.query.b32   d, [a];", "description": "Query an attribute of a surface. Operand a is a.surfref variable or a.u64 register.\nQuery Returns.width.height.depth value in elements. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.5"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "suq.width.b32       %r1, [surf_A];", "description": "Query an attribute of a surface. Operand a is a.surfref variable or a.u64 register.\nQuery Returns.width.height.depth value in elements.channel_data_type Unsigned integer corresponding to source language’s channel data\ntype enumeration. If the source language combines channel data\ntype and channel order into a single enumeration type, that value\nis returned for both channel_data_type and channel_order queries..channel_order Unsigned integer corresponding to source language’s channel order\nenumeration. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#surface-instructions-suq", "introducedIn": "PTX ISA 1.5", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.sured", "mnemonic": "sured", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "sured", "category": "Surface Instructions", "summary": "Reduction to surface memory using a surface coordinate vector.", "syntax": "sured.b.op.geom.ctype.clamp  [a,b],c; // byte addressing", "syntax_forms": [{"syntax": "sured.b.op.geom.ctype.clamp  [a,b],c; // byte addressing", "description": "Reduction to surface memory using a surface coordinate vector. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "sured.b.add.2d.u32.trap  [surf_A, {x,y}], r1;\nsured.p.min.1d.u32.trap  [surf_B, {x}], r1;\nsured.b.max.1d.u64.trap  [surf_C, {x}], r1;\nsured.p.min.1d.b64.trap  [surf_D, {x}], r1;", "description": "Reduction to surface memory using a surface coordinate vector. The instruction performs a reduction\noperation with data from operand c to the surface named by operand a at coordinates given by\noperand b. Operand a is a.surfref variable or.u64 register. Operand b is a\nscalar or singleton tuple for 1d surfaces; is a two-element vector for 2d surfaces; and is a\nfour-element vector for 3d surfaces, where the fourth element is ignored. Coordinate elements are of\ntype.s32.\nsured.b performs an unformatted reduction on.u32,.s32,.b32,.u64, or.s64 data. The lowest dimension coordinate represents a byte offset into the surface and is not\nscaled. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#surface-instructions-sured", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.sust", "mnemonic": "sust", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "sust", "category": "Surface Instructions", "summary": "sust.{1d,2d,3d} Store to surface memory using a surface coordinate vector.", "syntax": "sust.b.{1d,2d,3d}{.cop}.vec.ctype.clamp  [a, b], c;  // unformatted", "syntax_forms": [{"syntax": "sust.b.{1d,2d,3d}{.cop}.vec.ctype.clamp  [a, b], c;  // unformatted", "description": "sust.{1d,2d,3d}\nStore to surface memory using a surface coordinate vector. The instruction stores data from operand c to the surface named by operand a at coordinates given by operand b. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.5"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "sust.p.1d.v4.b32.trap  [surf_B, {x}], {f1,f2,f3,f4};\nsust.b.3d.v2.b64.trap  [surf_A, {x,y,z,w}], {r1,r2};\nsust.b.a1d.v2.b64      [surf_C, {idx,x}], {r1,r2};\nsust.b.a2d.b32         [surf_D, {idx,x,y,z}], r0;  // z ignored", "description": "sust.{1d,2d,3d}\nStore to surface memory using a surface coordinate vector. The instruction stores data from operand c to the surface named by operand a at coordinates given by operand b. Operand a is\na.surfref variable or.u64 register. Operand b is a scalar or singleton tuple for 1d\nsurfaces; is a two-element vector for 2d surfaces; and is a four-element vector for 3d surfaces,\nwhere the fourth element is ignored. Coordinate elements are of type.s32.\nsust.b performs an unformatted store of binary data. The lowest dimension coordinate represents\na byte offset into the surface and is not scaled. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#surface-instructions-sust", "introducedIn": "PTX ISA 1.5", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.szext", "mnemonic": "szext", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "szext", "category": "Integer Arithmetic Instructions", "summary": "Sign-extends or zero-extends an N-bit value from operand a where N is specified in operand b.", "syntax": "szext.mode.type  d, a, b;", "syntax_forms": [{"syntax": "szext.mode.type  d, a, b;", "description": "Sign-extends or zero-extends an N-bit value from operand a where N is specified in operand b. The resulting value is stored in the destination operand d.\nFor the. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_70"], "introducedIn": "PTX ISA 7.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}, {"name": "b", "desc": "Source operand"}], "semantics": "b1        = b & 0x1f;\ntoo_large = (b >= 32 && .mode == .clamp) ? true : false;\nmask      = too_large ? 0 : (~0) << b1;\nsign_pos  = (b1 - 1) & 0x1f;\n\nif (b1 == 0 || too_large || .type != .s32) {\n    sign_bit = false;\n} else {\n    sign_bit = (a >> sign_pos) & 1;\n}\nd = (a & ~mask) | (sign_bit ? mask | 0);", "examples": "szext.clamp.s32 rd, ra, rb;\nszext.wrap.u32  rd, 0xffffffff, 0; // Result is 0.", "description": "Sign-extends or zero-extends an N-bit value from operand a where N is specified in operand b. The resulting value is stored in the destination operand d.\nFor the.s32 instruction type, the value in a is treated as an N-bit signed value and the\nmost significant bit of this N-bit value is replicated up to bit 31. For the.u32 instruction\ntype, the value in a is treated as an N-bit unsigned number and is zero-extended to 32\nbits. Operand b is an unsigned 32-bit value.\nIf the value of N is 0, then the result of szext is 0. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#integer-arithmetic-instructions-szext", "introducedIn": "PTX ISA 7.6", "requiredTargets": ["sm_70"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tanh", "mnemonic": "tanh", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tanh", "category": "Half Precision Floating-Point Instructions", "summary": "Take hyperbolic tangent value of a.", "syntax": "tanh.approx.f32 d, a;", "syntax_forms": [{"syntax": "tanh.approx.f32 d, a;", "description": "Take hyperbolic tangent value of a.\nThe operands d and a are of type.f32.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_75"], "introducedIn": "PTX ISA 7.0"}, {"syntax": "tanh.approx.type d, a;", "description": "Take hyperbolic tangent value of a.\nThe type of operands d and a are as specified by.type.\nFor.f16x2 or. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_75"], "introducedIn": "PTX ISA 7.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "Source operand"}], "semantics": "if (.type == .f16 || .type == .bf16) {\n  d = tanh(a)\n} else if (.type == .f16x2 || .type == .bf16x2) {\n  fA[0] = a[0:15];\n  fA[1] = a[16:31];\n  d[0] = tanh(fA[0])\n  d[1] = tanh(fA[1])\n}", "examples": "tanh.approx.f32 ta, a;\n\ntanh.approx.f16    h1, h0;\ntanh.approx.f16x2  hd1, hd0;\ntanh.approx.bf16   b1, b0;\ntanh.approx.bf16x2 hb1, hb0;", "description": "Take hyperbolic tangent value of a.\nThe type of operands d and a are as specified by.type.\nFor.f16x2 or.bf16x2 instruction type, each of the half-word operands are operated in\nparallel and the results are packed appropriately into a.f16x2 or.bf16x2.\nFor.f16 instruction type, operands d and a have.f16 or.b16 type.\nFor.f16x2 instruction type, operands d and a have.f16x2 or.b32 type.\nFor.bf16 instruction type, operands d and a have.b16 type.\nFor.bf16x2 instruction type, operands d and a have.b32 type.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#half-precision-floating-point-instructions-tanh", "introducedIn": "PTX ISA 7.0", "requiredTargets": ["sm_75"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.alloc", "mnemonic": "tcgen05.alloc", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.alloc", "category": "Tensor Memory Allocation and Management Instructions", "summary": "tcgen05.alloc is a blocking instruction which dynamically allocates the specified number of columns in the Tensor Memory and writes the address of the allocated Tensor Memory into shared memory at the location specified by address operand dst.", "syntax": "tcgen05.alloc.cta_group.sync.aligned{.shared::cta}.b32  [dst], nCols;", "syntax_forms": [{"syntax": "tcgen05.alloc.cta_group.sync.aligned{.shared::cta}.b32  [dst], nCols;", "description": "tcgen05.alloc is a blocking instruction which dynamically allocates the specified number of columns in the Tensor Memory and writes the address of the allocated Tensor Memory into shared memory at the… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Example 1:\n\ntcgen05.alloc.cta_group::1.sync.aligned.shared::cta.b32 [sMemAddr1], 32;\nld.shared.b32 taddr, [sMemAddr1];\n// use taddr ...\n// more allocations and its usages ...\n// (truncated - see the official PTX ISA docs for the full example)", "description": "tcgen05.alloc is a blocking instruction which dynamically allocates\nthe specified number of columns in the Tensor Memory and writes\nthe address of the allocated Tensor Memory into shared memory\nat the location specified by address operand dst. The tcgen05.alloc blocks if the\nrequested amount of Tensor Memory is not available and unblocks\nas soon as the requested amount of Tensor Memory becomes\navailable for allocation.\ntcgen05.dealloc is a potentially blocking instruction which deallocates the Tensor Memory specified by the Tensor Memory address taddr. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.commit", "mnemonic": "tcgen05.commit", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.commit", "category": "TensorCore 5th Generation Family Instructions", "summary": "The instruction tcgen05.commit is an asynchronous instruction which makes the mbarrier object, specified by the address operand mbar, track the completion of all the prior asynchronous tcgen05 operations, as listed in mbarrier based completion mechanism, initiated by the executing thread.", "syntax": "tcgen05.commit.cta_group.completion_mechanism{.shared::cluster}{.multicast}.b64", "syntax_forms": [{"syntax": "tcgen05.commit.cta_group.completion_mechanism{.shared::cluster}{.multicast}.b64", "description": "The instruction tcgen05.commit is an asynchronous instruction which makes the mbarrier object, specified by the address operand mbar, track the completion of all the prior asynchronous tcgen05 operati… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "Example 1:\ntcgen05.cp.cta_group::1.128x256b                      [taddr0], sdesc0;\ntcgen05.commit.cta_group::1.mbarrier::arrive::one.b64 [mbarObj1];\n\nloop:\nmbarrier.try_wait.parity.b64 p, [mbarObj1], 0;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "The instruction tcgen05.commit is an asynchronous instruction which makes the mbarrier object,\nspecified by the address operand mbar, track the completion of all the prior asynchronous tcgen05 operations, as listed in mbarrier based completion mechanism,\ninitiated by the executing thread. Upon the completion of the tracked asynchronous tcgen05 operations, the signal specified by the.completion_mechanism is triggered by the system\non the mbarrier object.\nThis instruction accesses its mbarrier operand using generic-proxy.\nThe instruction tcgen05.commit.cta_group::1 tracks for the completion of all prior\nasynchronous tcgen05 operations with.cta_group::1 issued by the current thread. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#tcgen-async-sync-operations-commit", "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.cp", "mnemonic": "tcgen05.cp", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.cp", "category": "Tensor Memory Data Movement Instructions", "summary": "Instruction tcgen05.cp initiates an asynchronous copy operation from shared memory to the location specified by the address operand taddr in the Tensor Memory.", "syntax": "tcgen05.cp.cta_group.shape{.multicast}{.dst_fmt.src_fmt} [taddr], s-desc;", "syntax_forms": [{"syntax": "tcgen05.cp.cta_group.shape{.multicast}{.dst_fmt.src_fmt} [taddr], s-desc;", "description": "Instruction tcgen05.cp initiates an asynchronous copy operation from shared memory to the\nlocation specified by the address operand taddr in the Tensor Memory. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "tcgen05.cp.cta_group::1.128x256b                 [taddr0], sdesc0;\ntcgen05.cp.cta_group::2.128x128b.b8x16.b6x16_p32 [taddr1], sdesc1;\ntcgen05.cp.cta_group::1.64x128b.warpx2::02_13    [taddr2], sdesc2;", "description": "Instruction tcgen05.cp initiates an asynchronous copy operation from shared memory to the\nlocation specified by the address operand taddr in the Tensor Memory.\nThe 64-bit register operand s-desc is the matrix descriptor which represents the source\nmatrix in the shared memory that needs to be copied. The format of the matrix descriptor is\ndescribed in Matrix Descriptors.\nThe.shape qualifier indicates the dimension of data to be copied as described in the Data Movement Shape.\nQualifier.cta_group specifies the number of CTAs whose Tensor Memory is\naccessed when a single thread of a single CTA executes the tcgen05.cp instruction.\nWhen. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#tcgen05-instructions-tcgen05-cp", "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.dealloc", "mnemonic": "tcgen05.dealloc", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.dealloc", "category": "Tensor Memory Allocation and Management Instructions", "summary": "tcgen05.dealloc is a blocking instruction which de-allocates the Tensor Memory specified by the Tensor Memory address taddr. The operand nCols specifies the number of columns to be de-allocated.", "syntax": "tcgen05.dealloc.cta_group.sync.aligned.b32  taddr, nCols;", "syntax_forms": [{"syntax": "tcgen05.dealloc.cta_group.sync.aligned.b32  taddr, nCols;", "description": "tcgen05.dealloc is a blocking instruction which de-allocates the Tensor Memory specified by the Tensor Memory address taddr. The operand nCols specifies the number of columns to be de-allocated.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// de-allocate the columns previously allocated at taddr:\ntcgen05.dealloc.cta_group::1.sync.aligned.b32  taddr, 32;", "description": "tcgen05.dealloc is a blocking instruction which de-allocates the Tensor Memory specified by the Tensor Memory address taddr. The operand nCols specifies the number of columns to be de-allocated.", "sourceUrl": null, "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.fence", "mnemonic": "tcgen05.fence", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.fence", "category": "TensorCore 5th Generation Family Instructions", "summary": "The instruction tcgen05.fence::before_thread_sync orders all the prior asynchronous tcgen05 operations with respect to the subsequent tcgen05 and the execution ordering operations.", "syntax": "tcgen05.fence::before_thread_sync ;", "syntax_forms": [{"syntax": "tcgen05.fence::before_thread_sync ;", "description": "The instruction tcgen05.fence::before_thread_sync orders all the prior asynchronous tcgen05 operations with respect to the subsequent tcgen05 and the execution\nordering operations. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Producer thread:\n\ntcgen05.cp.cta_group::1.128x256b  [taddr0], sdesc0;\n\ntcgen05.fence::before_thread_sync;\nst.relaxed.b32 [flag], 1;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "The instruction tcgen05.fence::before_thread_sync orders all the prior asynchronous tcgen05 operations with respect to the subsequent tcgen05 and the execution\nordering operations.\nThe instruction tcgen05.fence::after_thread_sync orders all the subsequent asynchronous tcgen05 operations with respect to the prior tcgen05 and the execution ordering\noperations.\nThe tcgen05.fence::* instructions compose with execution ordering instructions across\na thread scope and provide ordering between tcgen05 instructions across the same scope.\nThe tcgen05.fence::before_thread_sync instructions behave as code motion fence for prior tcgen05 instructions as they cannot be hoisted across. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#tcgen05-special-sync-operations-fence", "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.ld", "mnemonic": "tcgen05.ld", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.ld", "category": "Tensor Memory and Register Load/Store Instructions", "summary": "Instruction tcgen05.ld asynchronously loads data from the Tensor Memory at the location specified by the 32-bit address operand taddr into the destination register r, collectively across all threads of the warps.", "syntax": "// Base load instruction:\ntcgen05.ld.sync.aligned.shape1.num{.pack}.b32    r, [taddr];", "syntax_forms": [{"syntax": "// Base load instruction:\ntcgen05.ld.sync.aligned.shape1.num{.pack}.b32    r, [taddr];", "description": "Instruction tcgen05.ld asynchronously loads data from the Tensor Memory at the location specified by the 32-bit address operand taddr into the destination register r, collectively across all threads o… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "tcgen05.ld.sync.aligned.32x32b.x2.b32     {r0, r1}, [taddr1];\n\ntcgen05.ld.sync.aligned.16x128b.x4.b32    {r0, r1, r2, r3, r4, r5, r6, r7}, [taddr2];\n\ntcgen05.ld.red.sync.aligned.16x32bx2.x8.u32.max {r0, r1, r2, r3, r4, r5, r6, r7},\n                                                 redVal, [taddr3], 16;", "description": "Instruction tcgen05.ld asynchronously loads data from the Tensor Memory at the location specified by the 32-bit address operand taddr into the destination\nregister r, collectively across all threads of the warps.\nAll the threads in the warp must specify the same value of taddr, which must be the\nbase address of the collective load operation. Otherwise, the behavior is undefined.\nThe.shape qualifier and the.num qualifier together determines the total\ndimension of the data which is loaded from the Tensor Memory. The.shape qualifier indicates the base dimension of data to be accessed as described in the Data Movement Shape. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#tcgen05-instructions-tcgen05-ld", "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.mma", "mnemonic": "tcgen05.mma", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.mma", "category": "TensorCore 5th Generation of MMA Instructions", "summary": "Instruction tcgen05.mma is an asynchronous instruction which initiates an MxNxK matrix multiply and accumulate operation, D = A*B+D where the A matrix is MxK, the B matrix is KxN, and the D matrix is MxN.", "syntax": "// 1. Floating-point type without block scaling:\ntcgen05.mma.cta_group.kind   [d-tmem],  a-desc,  b-desc, idesc,\n{ disable-output-lane }, enable-input-d {, scale-input-d};", "syntax_forms": [{"syntax": "// 1. Floating-point type without block scaling:\ntcgen05.mma.cta_group.kind   [d-tmem],  a-desc,  b-desc, idesc,\n{ disable-output-lane }, enable-input-d {, scale-input-d};", "description": "Instruction tcgen05.mma is an asynchronous instruction which initiates an MxNxK matrix multiply and accumulate operation, D = A*B+D where the A matrix is MxK, the B matrix is KxN, and the D matrix is… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "tcgen05.mma.cta_group::1.kind::tf32      [taddr0],  adesc,  bdesc, idesc, {m0, m1, m2, m3}, p;\ntcgen05.mma.cta_group::1.kind::mxf8f6f4  [taddr2],  [taddr1],  bdesc, idesc,\n                                         [tmem_scaleA], [tmem_scaleB], p;\n\ntcgen05.commit.cta_group::1.mbarrier::arrive::one.b64 [mbarObj0];\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Instruction tcgen05.mma is an asynchronous instruction which initiates an MxNxK matrix\nmultiply and accumulate operation, D = A*B+D where the A matrix is MxK, the B matrix is KxN, and the D matrix is MxN.\nThe operation of the form D = A*B is issued when the input predicate argument enable-input-d is false.\nThe optional immediate argument scale-input-d can be specified to scale the input\nmatrix D as follows: D = A*B+D * (2 ^ - scale-input-d)\nThe valid range of values for argument scale-input-d is [0, 15]. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#tcgen05-mma-instructions-mma", "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.mma.sp", "mnemonic": "tcgen05.mma.sp", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.mma.sp", "category": "TensorCore 5th Generation of MMA Instructions", "summary": "Instruction tcgen05.mma.sp is an asynchronous instruction which initiates an MxNxK matrix multiply and accumulate operation of the form D = A*B+D where the A matrix is Mx(K/2), the B matrix is KxN, and the D matrix is MxN.", "syntax": "// 1. Floating-point type without block scaling:\ntcgen05.mma.sp.cta_group.kind  [d-tmem],  a-desc,  b-desc, [sp-meta-tmem] ,  idesc,\n{ disable-output-lane }, enable-input-d{, scale-input-d};", "syntax_forms": [{"syntax": "// 1. Floating-point type without block scaling:\ntcgen05.mma.sp.cta_group.kind  [d-tmem],  a-desc,  b-desc, [sp-meta-tmem] ,  idesc,\n{ disable-output-lane }, enable-input-d{, scale-input-d};", "description": "Instruction tcgen05.mma.sp is an asynchronous instruction which initiates an MxNxK matrix multiply and accumulate operation of the form D = A*B+D where the A matrix is Mx(K/2), the B matrix is KxN, an… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "tcgen05.mma.sp.cta_group::1.kind::f16      [taddr0],  adesc,  bdesc, [tmem_spmeta0], idesc, p;\n\ntcgen05.mma.sp.cta_group::1.kind::mxf8f6f4.collector::a:fill\n                                           [taddr2],  [taddr1],  bdesc, [tmem_spmeta1], idesc,\n                                           [tmem_scaleA], [tmem_scaleB], p;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Instruction tcgen05.mma.sp is an asynchronous instruction which initiates an MxNxK matrix multiply and accumulate operation of the form D = A*B+D where the A matrix is Mx(K/2), the B matrix is KxN, and the D matrix is MxN. Sparse Matrices describes the details of the sparsity.\nThe operation of the form D = A*B is issued when the input predicate argument enable-input-d is false.\nThe optional immediate argument scale-input-d can be specified to scale the\ninput matrix D as follows: D = A*B+D * (2 ^ - scale-input-d)\nThe valid range of values for argument scale-input-d is [0, 15]. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#tcgen05-mma-instructions-mma-sp", "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.mma.ws", "mnemonic": "tcgen05.mma.ws", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.mma.ws", "category": "TensorCore 5th Generation of MMA Instructions", "summary": "Instruction tcgen05.mma.ws is an asynchronous instruction which initiates an MxNxK matrix multiply and accumulate operation, D = A*B+D where the A matrix is MxK, the B matrix is KxN, and the D matrix is MxN.", "syntax": "// 1. Floating-point type without block scaling:\ntcgen05.mma.ws.cta_group::1.kind{.collector_usage}    [d-tmem],  a-desc,  b-desc,  idesc,\nenable-input-d {, zero-column-mask-desc };", "syntax_forms": [{"syntax": "// 1. Floating-point type without block scaling:\ntcgen05.mma.ws.cta_group::1.kind{.collector_usage}    [d-tmem],  a-desc,  b-desc,  idesc,\nenable-input-d {, zero-column-mask-desc };", "description": "Instruction tcgen05.mma.ws is an asynchronous instruction which initiates an MxNxK matrix multiply and accumulate operation, D = A*B+D where the A matrix is MxK, the B matrix is KxN, and the D matrix… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "tcgen05.mma.ws.cta_group::1.kind::i8.collector::b2:use [taddr2], [taddr1], bdesc, idesc, p;\ntcgen05.commit.cta_group::1.mbarrier::arrive::one.b64 [mbarObj0];\n\nloop:\nmbarrier.try_wait.parity.b64 p, [mbarObj0], 0;\n@!p bra loop;", "description": "Instruction tcgen05.mma.ws is an asynchronous instruction which initiates an MxNxK matrix multiply and accumulate operation, D = A*B+D where the A matrix is MxK, the B matrix is KxN, and the D matrix is MxN.\nThe operation of the form D = A*B is issued when the input predicate argument enable-input-d is false.\nThe 32-bit register operand idesc is the instruction descriptor as described in Instruction descriptor, specifies the shapes, exact\ntypes, sparsity and other details of the input matrices, output matrix and the matrix\nmultiply and accumulate operation.\nThe qualifier. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#tcgen05-mma-instructions-mma-ws", "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.mma.ws.sp", "mnemonic": "tcgen05.mma.ws.sp", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.mma.ws.sp", "category": "TensorCore 5th Generation of MMA Instructions", "summary": "Instruction tcgen05.mma.ws.sp is an asynchronous instruction which initiates\nan MxNxK matrix multiply and accumulate operation, D = A*B+D where the A", "syntax": "// 1. Floating-point type without block scaling:\ntcgen05.mma.ws.sp.cta_group::1.kind{.collector_usage} [d-tmem],  a-desc,  b-desc,\n[sp-meta-tmem] ,  idesc,\nenable-input-d {, zero-column-mask-desc};", "syntax_forms": [{"syntax": "// 1. Floating-point type without block scaling:\ntcgen05.mma.ws.sp.cta_group::1.kind{.collector_usage} [d-tmem],  a-desc,  b-desc,\n[sp-meta-tmem] ,  idesc,\nenable-input-d {, zero-column-mask-desc};", "description": "Instruction tcgen05.mma.ws.sp is an asynchronous instruction which initiates\nan MxNxK matrix multiply and accumulate operation, D = A*B+D where the A matrix is Mx(K/2), the B matrix is KxN, and the D (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "tcgen05.mma.ws.sp.cta_group::1.kind::tf32.collector::b1::fill  [taddr1], [taddr0], bdesc,\n                                                               [tmem_spmeta0], idesc, p;\n\ntcgen05.commit.cta_group::1.mbarrier::arrive::one.b64 [mbarObj0];\n\nloop:\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Instruction tcgen05.mma.ws.sp is an asynchronous instruction which initiates\nan MxNxK matrix multiply and accumulate operation, D = A*B+D where the A matrix is Mx(K/2), the B matrix is KxN, and the D matrix\nis MxN. Sparse Matrices describes the details of the\nsparsity.\nThe operation of the form D = A*B is issued when the input predicate argument enable-input-d is false.\nThe 32-bit register operand idesc is the instruction descriptor as described in Instruction descriptor, specifies the shapes, exact\ntypes, sparsity and other details of the input matrices, output matrix and the matrix\nmultiply and accumulate operation.\nThe qualifier. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#tcgen05-mma-instructions-mma-ws-sp", "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.relinquish_alloc_permit", "mnemonic": "tcgen05.relinquish_alloc_permit", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.relinquish_alloc_permit", "category": "Tensor Memory Allocation and Management Instructions", "summary": "tcgen05.relinquish_alloc_permit specifies that the CTA of the executing thread is relinquishing the right to allocate Tensor Memory.", "syntax": "tcgen05.relinquish_alloc_permit.cta_group.sync.aligned;", "syntax_forms": [{"syntax": "tcgen05.relinquish_alloc_permit.cta_group.sync.aligned;", "description": "tcgen05.relinquish_alloc_permit specifies that the CTA of the executing thread is relinquishing the right to allocate Tensor Memory.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "tcgen05.relinquish_alloc_permit.cta_group::1.sync.aligned;", "description": "tcgen05.relinquish_alloc_permit specifies that the CTA of the executing thread is relinquishing the right to allocate Tensor Memory.", "sourceUrl": null, "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.shift", "mnemonic": "tcgen05.shift", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.shift", "category": "Tensor Memory Data Movement Instructions", "summary": "Instruction tcgen05.shift is an asynchronous instruction which initiates the shifting of 32-byte elements downwards across all the rows, except the last, by one row.", "syntax": "tcgen05.shift.cta_group.down  [taddr];", "syntax_forms": [{"syntax": "tcgen05.shift.cta_group.down  [taddr];", "description": "Instruction tcgen05.shift is an asynchronous instruction which initiates the shifting of 32-byte\nelements downwards across all the rows, except the last, by one row. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "tcgen05.shift.down.cta_group::1 [taddr0];\ntcgen05.shift.down.cta_group::2 [taddr1];", "description": "Instruction tcgen05.shift is an asynchronous instruction which initiates the shifting of 32-byte\nelements downwards across all the rows, except the last, by one row. The address operand taddr specifies the base address of the matrix in the Tensor Memory whose rows must\nbe down shifted.\nThe lane of the address operand taddr must be aligned to 32.\nQualifier.cta_group specifies the number of CTAs whose Tensor Memory is touched when a single thread of a single CTA executes the tcgen05.shift instruction.\nWhen.cta_group::1 is specified, the shift operation is performed in the Tensor Memory of the current CTA. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#tcgen05-instructions-tcgen05-shift", "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.st", "mnemonic": "tcgen05.st", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.st", "category": "Tensor Memory and Register Load/Store Instructions", "summary": "Instruction tcgen05.st asynchronously stores data from the source register r into the Tensor Memory at the location specified by the 32-bit address operand taddr, collectively across all threads of the warps.", "syntax": "tcgen05.st.sync.aligned.shape1.num{.unpack}.b32    [taddr], r;", "syntax_forms": [{"syntax": "tcgen05.st.sync.aligned.shape1.num{.unpack}.b32    [taddr], r;", "description": "Instruction tcgen05.st asynchronously stores data from the source register r into the Tensor Memory at the location specified by the 32-bit address operand taddr, collectively across all threads of th… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "tcgen05.st.sync.aligned.16x64b.x4.b32               [taddr0], {r0,  r1,  r2,  r3};\n\ntcgen05.st.sync.aligned.16x128b.x1.unpack::16b.b32  [taddr1], {r0,  r1};", "description": "Instruction tcgen05.st asynchronously stores data from the source register r into\nthe Tensor Memory at the location specified by the 32-bit address operand taddr,\ncollectively across all threads of the warps.\nAll the threads in the warp must specify the same value of taddr, which must be the base\naddress of the collective store operation. Otherwise, the behavior is undefined.\nThe.shape qualifier and the.num qualifier together determines the total dimension\nof the data which is stored to the Tensor Memory. The.shape qualifier indicates the base\ndimension of data to be accessed as described in the Data Movement Shape. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#tcgen05-instructions-tcgen05-st", "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tcgen05.wait", "mnemonic": "tcgen05.wait", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tcgen05.wait", "category": "Tensor Memory and Register Load/Store Instructions", "summary": "Instruction tcgen05.wait::st causes the executing thread to block until all prior tcgen05.st operations issued by the executing thread have completed.", "syntax": "tcgen05.wait_operation.sync.aligned;", "syntax_forms": [{"syntax": "tcgen05.wait_operation.sync.aligned;", "description": "Instruction tcgen05.wait::st causes the executing thread to block until all prior tcgen05.st operations issued by the executing thread have completed.\nInstruction tcgen05. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_100a"], "introducedIn": "PTX ISA 8.6"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "Example 1:\n\ntcgen05.ld.sync.aligned.32x32b.x2.b32     {r0, r1}, [taddr0];\n\n// Prevents subsequent tcgen05.mma from racing ahead of the tcgen05.ld\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Instruction tcgen05.wait::st causes the executing thread to block until all prior tcgen05.st operations issued by the executing thread have completed.\nInstruction tcgen05.wait::ld causes the executing thread to block until all prior tcgen05.ld operations issued by the executing thread have completed.\nThe mandatory.sync qualifier indicates that tcgen05.wait_operation causes the\nexecuting thread to wait until all threads in the warp execute the same tcgen05.wait_operation instruction before resuming execution.\nThe mandatory.aligned qualifier indicates that all threads in the warp must execute the\nsame tcgen05.wait_operation instruction.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#tcgen05-instructions-tcgen05-wait", "introducedIn": "PTX ISA 8.6", "requiredTargets": ["sm_100a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tensormap.cp_fenceproxy", "mnemonic": "tensormap.cp_fenceproxy", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tensormap.cp_fenceproxy", "category": "Parallel Synchronization and Communication Instructions", "summary": "The tensormap.cp_fenceproxy instructions perform the following operations in order: Copies data of size specified by the size argument, in bytes, from the location specified by the address operand…", "syntax": "tensormap.cp_fenceproxy.cp_qualifiers.fence_qualifiers.sync.aligned  [dst], [src], size;", "syntax_forms": [{"syntax": "tensormap.cp_fenceproxy.cp_qualifiers.fence_qualifiers.sync.aligned  [dst], [src], size;", "description": "The tensormap.cp_fenceproxy instructions perform the following operations in order: Copies data of size specified by the size argument, in bytes, from the location specified by the address operand src… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90"], "introducedIn": "PTX ISA 8.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Example: manipulate a tensor-map object and then consume it in cp.async.bulk.tensor\n\n.reg .b64 new_addr;\n.global .align 128 .b8 gbl[128];\n.shared .align 128 .b8 sMem[128];\n// (truncated - see the official PTX ISA docs for the full example)", "description": "The tensormap.cp_fenceproxy instructions perform the following operations in order:\nCopies data of size specified by the size argument, in bytes, from the location specified\nby the address operand src in shared memory to the location specified by the address operand dst in the global memory, in the generic proxy. Establishes a uni-directional proxy release pattern on the ordering from the copy operation\nto the subsequent access performed in the tensormap proxy on the address dst.\nThe valid value of immediate operand size is 128.\nThe operands src and dst specify non-generic addresses in shared::cta and global state space respectively.\nThe. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.3", "requiredTargets": ["sm_90"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tensormap.replace", "mnemonic": "tensormap.replace", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tensormap.replace", "category": "Data Movement and Conversion Instructions", "summary": "The tensormap.replace instruction replaces the field, specified by.field qualifier, of the tensor-map object at the location specified by the address operand addr with a new value.", "syntax": "tensormap.replace.mode.field1{.ss}.b1024.type  [addr], new_val;", "syntax_forms": [{"syntax": "tensormap.replace.mode.field1{.ss}.b1024.type  [addr], new_val;", "description": "The tensormap.replace instruction replaces the field, specified by.field qualifier,\nof the tensor-map object at the location specified by the address operand addr with a\nnew value. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90a"], "introducedIn": "PTX ISA 8.3"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "tensormap.replace.tile.global_address.shared::cta.b1024.b64   [sMem], new_val;", "description": "The tensormap.replace instruction replaces the field, specified by.field qualifier,\nof the tensor-map object at the location specified by the address operand addr with a\nnew value. The new value is specified by the argument new_val.\nQualifier.mode specifies the mode of the tensor-map object\nlocated at the address operand addr.\nInstruction type.b1024 indicates the size of the tensor-map object, which is 1024 bits.\nOperand new_val has the type.type. When.field is specified as.global_address or.global_stride,.type must be.b64. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#data-movement-and-conversion-instructions-tensormap-replace", "introducedIn": "PTX ISA 8.3", "requiredTargets": ["sm_90a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.testp", "mnemonic": "testp", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "testp", "category": "Floating-Point Instructions", "summary": "testp tests common properties of floating-point numbers and returns a predicate value of 1 if True and 0 if False.", "syntax": "testp.op.type  p, a;  // result is .pred", "syntax_forms": [{"syntax": "testp.op.type  p, a;  // result is .pred", "description": "testp tests common properties of floating-point numbers and returns a predicate value of 1 if True and 0 if False.\ntestp.finite True if the input is not infinite or NaN testp. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "testp.notanumber.f32  isnan, f0;\ntestp.infinite.f64    p, X;", "description": "testp tests common properties of floating-point numbers and returns a predicate value of 1 if True and 0 if False.\ntestp.finite True if the input is not infinite or NaN testp.infinite True if the input is positive or negative infinity testp.number True if the input is not NaN testp.notanumber True if the input is NaN testp.normal True if the input is a normal number (not NaN, not infinity) testp.subnormal True if the input is a subnormal number (not NaN, not infinity)\nAs a special case, positive and negative zero are considered normal numbers.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#floating-point-instructions-testp", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tex", "mnemonic": "tex", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tex", "category": "Texture Instructions", "summary": "tex.{1d,2d,3d} Texture lookup using a texture coordinate vector.", "syntax": "tex.geom.v4.dtype.ctype  d, [a, c] {, e} {, f};", "syntax_forms": [{"syntax": "tex.geom.v4.dtype.ctype  d, [a, c] {, e} {, f};", "description": "tex.{1d,2d,3d}\nTexture lookup using a texture coordinate vector. The instruction loads data from the texture named\nby operand a at coordinates given by operand c into destination d. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Example of unified mode texturing\n // - f4 is required to pad four-element tuple and is ignored\n tex.3d.v4.s32.s32  {r1,r2,r3,r4}, [tex_a,{f1,f2,f3,f4}];\n\n // Example of independent mode texturing\n tex.1d.v4.s32.f32  {r1,r2,r3,r4}, [tex_a,smpl_x,{f1}];\n// (truncated - see the official PTX ISA docs for the full example)", "description": "tex.{1d,2d,3d}\nTexture lookup using a texture coordinate vector. The instruction loads data from the texture named\nby operand a at coordinates given by operand c into destination d. Operand c is a\nscalar or singleton tuple for 1d textures; is a two-element vector for 2d textures; and is a\nfour-element vector for 3d textures, where the fourth element is ignored. An optional texture\nsampler b may be specified. If no sampler is specified, the sampler behavior is a property of\nthe named texture. The optional destination predicate p is set to True if data from texture\nat specified coordinates is resident in memory, False otherwise. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#texture-instructions-tex", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.tld4", "mnemonic": "tld4", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "tld4", "category": "Texture Instructions", "summary": "Texture fetch of the 4-texel bilerp footprint using a texture coordinate vector.", "syntax": "tld4.comp.2d.v4.dtype.f32    d[|p], [a, c] {, e} {, f};", "syntax_forms": [{"syntax": "tld4.comp.2d.v4.dtype.f32    d[|p], [a, c] {, e} {, f};", "description": "Texture fetch of the 4-texel bilerp footprint using a texture coordinate vector. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.2"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "//Example of unified mode texturing\ntld4.r.2d.v4.s32.f32  {r1,r2,r3,r4}, [tex_a,{f1,f2}];\n\n// Example of independent mode texturing\ntld4.r.2d.v4.u32.f32  {u1,u2,u3,u4}, [tex_a,smpl_x,{f1,f2}];\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Texture fetch of the 4-texel bilerp footprint using a texture coordinate vector. The instruction\nloads the bilerp footprint from the texture named by operand a at coordinates given by operand c into vector destination d. The texture component fetched for each texel sample is\nspecified by.comp. The four texel samples are placed into destination vector d in\ncounter-clockwise order starting at lower left.\nAn optional texture sampler b may be specified. If no sampler is specified, the sampler behavior\nis a property of the named texture.\nThe optional destination predicate p is set to True if data from texture at specified\ncoordinates is resident in memory, False otherwise. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#texture-instructions-tld4", "introducedIn": "PTX ISA 2.2", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.trap", "mnemonic": "trap", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "trap", "category": "Miscellaneous Instructions", "summary": "Abort execution and generate an interrupt to the host CPU.", "syntax": "trap;", "syntax_forms": [{"syntax": "trap;", "description": "Abort execution and generate an interrupt to the host CPU.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "trap;\n@p  trap;", "description": "Abort execution and generate an interrupt to the host CPU.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#miscellaneous-instructions-trap", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.txq", "mnemonic": "txq", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "txq", "category": "Texture Instructions", "summary": "Query an attribute of a texture or sampler.", "syntax": "txq.tquery.b32         d, [a];       // texture attributes", "syntax_forms": [{"syntax": "txq.tquery.b32         d, [a];       // texture attributes", "description": "Query an attribute of a texture or sampler. Operand a is either a.texref or.samplerref variable, or a.u64 register.\nQuery Returns.width.height.depth value in elements. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 1.5"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "txq.width.b32       %r1, [tex_A];\ntxq.filter_mode.b32 %r1, [tex_A];   // unified mode\ntxq.addr_mode_0.b32 %r1, [smpl_B];  // independent mode\ntxq.level.width.b32 %r1, [tex_A], %r_lod;", "description": "Query an attribute of a texture or sampler. Operand a is either a.texref or.samplerref variable, or a.u64 register.\nQuery Returns.width.height.depth value in elements.channel_data_type Unsigned integer corresponding to source language’s channel data type\nenumeration. If the source language combines channel data type and channel\norder into a single enumeration type, that value is returned for both channel_data_type and channel_order queries..channel_order Unsigned integer corresponding to source language’s channel order\nenumeration. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#texture-instructions-txq", "introducedIn": "PTX ISA 1.5", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vadd", "mnemonic": "vadd", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "vadd", "category": "Scalar Video Instructions", "summary": "Perform scalar arithmetic operation with optional saturate, and optional secondary arithmetic operation or subword data merge.", "syntax": "// 32-bit scalar operation, with optional secondary operation\nvadd.dtype.atype.btype{.sat}       d, a{.asel}, b{.bsel};", "syntax_forms": [{"syntax": "// 32-bit scalar operation, with optional secondary operation\nvadd.dtype.atype.btype{.sat}       d, a{.asel}, b{.bsel};", "description": "Perform scalar arithmetic operation with optional saturate, and optional secondary arithmetic operation or subword data merge.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "// extract byte/half-word/word and sign- or zero-extend\n// based on source operand type\nta = partSelectSignExtend( a, atype, asel );\ntb = partSelectSignExtend( b, btype, bsel );\n\nswitch ( vop ) {\n    case vadd:     tmp = ta + tb;\n    case vsub:     tmp = ta - tb;\n    case vabsdiff: tmp = | ta - tb |;\n    case vmin:     tmp = MIN( ta, tb );\n    case vmax:     tmp = MAX( ta, tb );\n}\n// saturate, taking into account destination type and merge operations\ntmp = optSaturate( tmp, sat, isSigned(dtype), dsel );\nd = optSecondaryOp( op2, tmp, c );  // optional secondary operation\nd = optMerge( dsel, tmp, c );       // optional merge with c operand", "examples": "vadd.s32.u32.s32.sat      r1, r2.b0, r3.h0;\nvsub.s32.s32.u32.sat      r1, r2.h1, r3.h1;\nvabsdiff.s32.s32.s32.sat  r1.h0, r2.b0, r3.b2, c;\nvmin.s32.s32.s32.sat.add  r1, r2, r3, c;", "description": "Perform scalar arithmetic operation with optional saturate, and optional secondary arithmetic operation or subword data merge.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#scalar-video-instructions-vadd-vsub-vabsdiff-vmin-vmax", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vadd2", "mnemonic": "vadd2", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "vadd2", "category": "SIMD Video Instructions", "summary": "Two-way SIMD parallel arithmetic operation with secondary operation.", "syntax": "// SIMD instruction with secondary SIMD merge operation\nvadd2.dtype.atype.btype{.sat}  d{.mask}, a{.asel}, b{.bsel}, c;", "syntax_forms": [{"syntax": "// SIMD instruction with secondary SIMD merge operation\nvadd2.dtype.atype.btype{.sat}  d{.mask}, a{.asel}, b{.bsel}, c;", "description": "Two-way SIMD parallel arithmetic operation with secondary operation. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 3.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "// extract pairs of half-words and sign- or zero-extend\n// based on operand type\nVa = extractAndSignExt_2( a, b, .asel, .atype );\nVb = extractAndSignExt_2( a, b, .bsel, .btype );\nVc = extractAndSignExt_2( c );\n\nfor (i=0; i<2; i++) {\n    switch ( vop2 ) {\n       case vadd2:             t[i] = Va[i] + Vb[i];\n       case vsub2:             t[i] = Va[i] - Vb[i];\n       case vavrg2:            if ( ( Va[i] + Vb[i] ) >= 0 ) {\n                                   t[i] = ( Va[i] + Vb[i] + 1 ) >> 1;\n                               } else {\n                                   t[i] = ( Va[i] + Vb[i] ) >> 1;\n                               }\n       case vabsdiff2:         t[i] = | Va[i] - Vb[i] |;\n       case vmin2:             t[i] = MIN( Va[i], Vb[i] );\n       case vmax2:             t[i] = MAX( Va[i], Vb[i] );\n    }\n    if (.sat) {\n        if ( .dtype == .s32 )  t[i] = CLAMP( t[i], S16_MAX, S16_MIN ); (see the official PTX ISA docs for the full semantics)", "examples": "vadd2.s32.s32.u32.sat  r1, r2, r3, r1;\nvsub2.s32.s32.s32.sat  r1.h0, r2.h10, r3.h32, r1;\nvmin2.s32.u32.u32.add  r1.h10, r2.h00, r3.h22, r1;", "description": "Two-way SIMD parallel arithmetic operation with secondary operation.\nElements of each dual half-word source to the operation are selected from any of the four half-words\nin the two source operands a and b using the asel and bsel modifiers.\nThe selected half-words are then operated on in parallel.\nThe results are optionally clamped to the appropriate range determined by the destination type\n(signed or unsigned). Saturation cannot be used with the secondary accumulate operation.\nFor instructions with a secondary SIMD merge operation:\nFor half-word positions indicated in mask, the selected half-word results are copied into\ndestination d. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#simd-video-instructions-vadd2-vsub2-vavrg2-vabsdiff2-vmin2-vmax2", "introducedIn": "PTX ISA 3.0", "requiredTargets": ["sm_30"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vadd4", "mnemonic": "vadd4", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "vadd4", "category": "SIMD Video Instructions", "summary": "Four-way SIMD parallel arithmetic operation with secondary operation.", "syntax": "// SIMD instruction with secondary SIMD merge operation\nvadd4.dtype.atype.btype{.sat}  d{.mask}, a{.asel}, b{.bsel}, c;", "syntax_forms": [{"syntax": "// SIMD instruction with secondary SIMD merge operation\nvadd4.dtype.atype.btype{.sat}  d{.mask}, a{.asel}, b{.bsel}, c;", "description": "Four-way SIMD parallel arithmetic operation with secondary operation. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 3.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "// extract quads of bytes and sign- or zero-extend\n// based on operand type\nVa = extractAndSignExt_4( a, b, .asel, .atype );\nVb = extractAndSignExt_4( a, b, .bsel, .btype );\nVc = extractAndSignExt_4( c );\nfor (i=0; i<4; i++) {\n    switch ( vop4 ) {\n        case vadd4:            t[i] = Va[i] + Vb[i];\n        case vsub4:            t[i] = Va[i] - Vb[i];\n        case vavrg4:           if ( ( Va[i] + Vb[i] ) >= 0 ) {\n                                   t[i] = ( Va[i] + Vb[i] + 1 ) >> 1;\n                               } else {\n                                   t[i] = ( Va[i] + Vb[i] ) >> 1;\n                               }\n        case vabsdiff4:        t[i] = | Va[i] - Vb[i] |;\n        case vmin4:            t[i] = MIN( Va[i], Vb[i] );\n        case vmax4:            t[i] = MAX( Va[i], Vb[i] );\n    }\n    if (.sat) {\n        if ( .dtype == .s32 )  t[i] = CLAMP( t[i], S8_MAX, S8_MIN ); (see the official PTX ISA docs for the full semantics)", "examples": "vadd4.s32.s32.u32.sat  r1, r2, r3, r1;\nvsub4.s32.s32.s32.sat  r1.b0, r2.b3210, r3.b7654, r1;\nvmin4.s32.u32.u32.add  r1.b00, r2.b0000, r3.b2222, r1;", "description": "Four-way SIMD parallel arithmetic operation with secondary operation.\nElements of each quad byte source to the operation are selected from any of the eight bytes in the\ntwo source operands a and b using the asel and bsel modifiers.\nThe selected bytes are then operated on in parallel.\nThe results are optionally clamped to the appropriate range determined by the destination type\n(signed or unsigned). Saturation cannot be used with the secondary accumulate operation.\nFor instructions with a secondary SIMD merge operation:\nFor byte positions indicated in mask, the selected byte results are copied into destination d. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#simd-video-instructions-vadd4-vsub4-vavrg4-vabsdiff4-vmin4-vmax4", "introducedIn": "PTX ISA 3.0", "requiredTargets": ["sm_30"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vmad", "mnemonic": "vmad", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "vmad", "category": "Scalar Video Instructions", "summary": "Calculate (a*b) + c, with optional operand negates, plus one mode, and scaling.\nThe source operands support optional negation with some restrictions.", "syntax": "// 32-bit scalar operation\nvmad.dtype.atype.btype{.sat}{.scale}     d, {-}a{.asel}, {-}b{.bsel},\n{-}c;", "syntax_forms": [{"syntax": "// 32-bit scalar operation\nvmad.dtype.atype.btype{.sat}{.scale}     d, {-}a{.asel}, {-}b{.bsel},\n{-}c;", "description": "Calculate (a*b) + c, with optional operand negates, plus one mode, and scaling.\nThe source operands support optional negation with some restrictions. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "// extract byte/half-word/word and sign- or zero-extend\n// based on source operand type\nta = partSelectSignExtend( a, atype, asel );\ntb = partSelectSignExtend( b, btype, bsel );\nsignedFinal = isSigned(atype) || isSigned(btype) ||\n                                 (a.negate ^ b.negate) || c.negate;\ntmp[127:0] = ta * tb;\n\nlsb = 0;\nif ( .po )                  {              lsb = 1; } else\nif ( a.negate ^ b.negate )  { tmp = ~tmp;  lsb = 1; } else\nif ( c.negate )             { c   = ~c;    lsb = 1; }\n\nc128[127:0] = (signedFinal) sext32( c ) : zext ( c );\ntmp = tmp + c128 + lsb;\nswitch( scale ) {\n   case .shr7:   result = (tmp >>  7) & 0xffffffffffffffff;\n   case .shr15:  result = (tmp >> 15) & 0xffffffffffffffff;\n}\nif ( .sat ) {\n     if (signedFinal) result = CLAMP(result, S32_MAX, S32_MIN);\n     else             result = CLAMP(result, U32_MAX, U32_MIN);\n}", "examples": "vmad.s32.s32.u32.sat    r0, r1, r2, -r3;\nvmad.u32.u32.u32.shr15  r0, r1.h0, r2.h0, r3;", "description": "Calculate (a*b) + c, with optional operand negates, plus one mode, and scaling.\nThe source operands support optional negation with some restrictions. Although PTX syntax allows\nseparate negation of the a and b operands, internally this is represented as negation of the\nproduct (a*b). That is, (a*b) is negated if and only if exactly one of a or b is\nnegated. PTX allows negation of either (a*b) or c.\nThe plus one mode (.po ) computes (a*b) + c + 1, which is used in computing averages. Source\noperands may not be negated in.po mode.\nThe intermediate result of (a*b) is unsigned if atype and btype are unsigned and the product (a*b) is not negated; otherwise, the intermediate result is signed. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#scalar-video-instructions-vmad", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vote", "mnemonic": "vote", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Vote", "category": "Parallel Synchronization and Communication Instructions", "summary": "Combine a per-lane predicate across the warp using any/all/ballot reduction.", "syntax": "vote.mode.pred d, {!}a;", "syntax_forms": [{"syntax": "vote.mode.pred d, {!}a;", "description": "Reduce predicate a across the warp: any true, all true, or all-lanes-agree.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": ["any", "all", "uni"], "requiredTargets": ["sm_12"], "introducedIn": "PTX ISA 6.0"}, {"syntax": "vote.ballot.b32 d, {!}a;", "description": "Collect per-lane predicate a into a 32-bit bitmask, one bit per lane.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": ["ballot"], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": ["all", "any", "ballot", "uni"], "operands": [{"name": "d", "desc": "Destination register or predicate"}, {"name": "a", "desc": "Per-lane predicate operand"}], "semantics": "d = reduction of predicate a across the active lanes of the warp, per the selected mode.", "examples": "vote.sync.all.pred    p,q,0xffffffff;\nvote.sync.ballot.b32  r1,p,0xffffffff;  // get 'ballot' across warp", "description": "vote.sync will cause executing thread to wait until all non-exited threads corresponding to membermask have executed vote.sync with the same qualifiers and same membermask value\nbefore resuming execution.\nOperand membermask specifies a 32-bit integer which is a mask indicating threads participating\nin this instruction where the bit position corresponds to thread’s laneid. Operand a is a\npredicate register.\nIn the mode form, vote.sync performs a reduction of the source predicate across all non-exited\nthreads in membermask. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#parallel-synchronization-and-communication-instructions-vote-sync", "introducedIn": "PTX ISA 6.0", "requiredTargets": ["sm_12"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vset", "mnemonic": "vset", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "vset", "category": "Scalar Video Instructions", "summary": "Compare input values using specified comparison, with optional secondary arithmetic operation or subword data merge.", "syntax": "// 32-bit scalar operation, with optional secondary operation\nvset.atype.btype.cmp       d, a{.asel}, b{.bsel};", "syntax_forms": [{"syntax": "// 32-bit scalar operation, with optional secondary operation\nvset.atype.btype.cmp       d, a{.asel}, b{.bsel};", "description": "Compare input values using specified comparison, with optional secondary arithmetic operation or\nsubword data merge. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "// extract byte/half-word/word and sign- or zero-extend\n// based on source operand type\nta = partSelectSignExtend( a, atype, asel );\ntb = partSelectSignExtend( b, btype, bsel );\ntmp = compare( ta, tb, cmp ) ? 1 : 0;\nd = optSecondaryOp( op2, tmp, c );    // optional secondary operation\nd = optMerge( dsel, tmp, c );         // optional merge with c operand", "examples": "vset.s32.u32.lt    r1, r2, r3;\nvset.u32.u32.ne    r1, r2, r3.h1;", "description": "Compare input values using specified comparison, with optional secondary arithmetic operation or\nsubword data merge.\nThe intermediate result of the comparison is always unsigned, and therefore destination d and\noperand c are also unsigned.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#scalar-video-instructions-vset", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vset2", "mnemonic": "vset2", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "vset2", "category": "SIMD Video Instructions", "summary": "Two-way SIMD parallel comparison with secondary operation.", "syntax": "// SIMD instruction with secondary SIMD merge operation\nvset2.atype.btype.cmp  d{.mask}, a{.asel}, b{.bsel}, c;", "syntax_forms": [{"syntax": "// SIMD instruction with secondary SIMD merge operation\nvset2.atype.btype.cmp  d{.mask}, a{.asel}, b{.bsel}, c;", "description": "Two-way SIMD parallel comparison with secondary operation. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 3.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "// extract pairs of half-words and sign- or zero-extend\n// based on operand type\nVa = extractAndSignExt_2( a, b, .asel, .atype );\nVb = extractAndSignExt_2( a, b, .bsel, .btype );\nVc = extractAndSignExt_2( c );\nfor (i=0; i<2; i++) {\n    t[i] = compare( Va[i], Vb[i], .cmp ) ? 1 : 0;\n}\n// secondary accumulate or SIMD merge\nmask = extractMaskBits( .mask );\nif (.add) {\n    d = c;\n    for (i=0; i<2; i++) {  d += mask[i] ? t[i] : 0;  }\n} else {\n    d = 0;\n    for (i=0; i<2; i++)  {  d |= mask[i] ? t[i] : Vc[i];  }\n}", "examples": "vset2.s32.u32.lt      r1, r2, r3, r0;\nvset2.u32.u32.ne.add  r1, r2, r3, r0;", "description": "Two-way SIMD parallel comparison with secondary operation.\nElements of each dual half-word source to the operation are selected from any of the four half-words\nin the two source operands a and b using the asel and bsel modifiers.\nThe selected half-words are then compared in parallel.\nThe intermediate result of the comparison is always unsigned, and therefore the half-words of\ndestination d and operand c are also unsigned.\nFor instructions with a secondary SIMD merge operation:\nFor half-word positions indicated in mask, the selected half-word results are copied into\ndestination d. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#simd-video-instructions-vset2", "introducedIn": "PTX ISA 3.0", "requiredTargets": ["sm_30"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vset4", "mnemonic": "vset4", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "vset4", "category": "SIMD Video Instructions", "summary": "Four-way SIMD parallel comparison with secondary operation.", "syntax": "// SIMD instruction with secondary SIMD merge operation\nvset4.atype.btype.cmp  d{.mask}, a{.asel}, b{.bsel}, c;", "syntax_forms": [{"syntax": "// SIMD instruction with secondary SIMD merge operation\nvset4.atype.btype.cmp  d{.mask}, a{.asel}, b{.bsel}, c;", "description": "Four-way SIMD parallel comparison with secondary operation. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 3.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "// extract quads of bytes and sign- or zero-extend\n// based on operand type\nVa = extractAndSignExt_4( a, b, .asel, .atype );\nVb = extractAndSignExt_4( a, b, .bsel, .btype );\nVc = extractAndSignExt_4( c );\nfor (i=0; i<4; i++) {\n    t[i] = compare( Va[i], Vb[i], cmp ) ? 1 : 0;\n}\n// secondary accumulate or SIMD merge\nmask = extractMaskBits( .mask );\nif (.add) {\n    d = c;\n    for (i=0; i<4; i++) {  d += mask[i] ? t[i] : 0;  }\n} else {\n    d = 0;\n    for (i=0; i<4; i++)  {  d |= mask[i] ? t[i] : Vc[i];  }\n}", "examples": "vset4.s32.u32.lt      r1, r2, r3, r0;\nvset4.u32.u32.ne.max  r1, r2, r3, r0;", "description": "Four-way SIMD parallel comparison with secondary operation.\nElements of each quad byte source to the operation are selected from any of the eight bytes in the\ntwo source operands a and b using the asel and bsel modifiers.\nThe selected bytes are then compared in parallel.\nThe intermediate result of the comparison is always unsigned, and therefore the bytes of destination d and operand c are also unsigned.\nFor instructions with a secondary SIMD merge operation:\nFor byte positions indicated in mask, the selected byte results are copied into destination d. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#simd-video-instructions-vset4", "introducedIn": "PTX ISA 3.0", "requiredTargets": ["sm_30"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vshl", "mnemonic": "vshl", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "vshl", "category": "Scalar Video Instructions", "summary": "vshl Shift a left by unsigned amount in b with optional saturate, and optional secondary arithmetic operation or subword data merge.", "syntax": "// 32-bit scalar operation, with optional secondary operation\nvshl.dtype.atype.u32{.sat}.mode       d, a{.asel}, b{.bsel};", "syntax_forms": [{"syntax": "// 32-bit scalar operation, with optional secondary operation\nvshl.dtype.atype.u32{.sat}.mode       d, a{.asel}, b{.bsel};", "description": "vshl Shift a left by unsigned amount in b with optional saturate, and optional secondary\narithmetic operation or subword data merge. Left shift fills with zero. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "// extract byte/half-word/word and sign- or zero-extend\n// based on source operand type\nta = partSelectSignExtend( a,atype, asel );\ntb = partSelectSignExtend( b, .u32, bsel );\nif ( mode == .clamp  && tb > 32 )  tb = 32;\nif ( mode == .wrap )                       tb = tb & 0x1f;\nswitch ( vop ){\n   case vshl:  tmp = ta << tb;\n   case vshr:  tmp = ta >> tb;\n}\n// saturate, taking into account destination type and merge operations\ntmp = optSaturate( tmp, sat, isSigned(dtype), dsel );\nd = optSecondaryOp( op2, tmp, c );  // optional secondary operation\nd = optMerge( dsel, tmp, c );       // optional merge with c operand", "examples": "vshl.s32.u32.u32.clamp  r1, r2, r3;\nvshr.u32.u32.u32.wrap   r1, r2, r3.h1;", "description": "vshl Shift a left by unsigned amount in b with optional saturate, and optional secondary\narithmetic operation or subword data merge. Left shift fills with zero. vshr Shift a right by unsigned amount in b with optional saturate, and optional secondary\narithmetic operation or subword data merge. Signed shift fills with the sign bit, unsigned shift\nfills with zero.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#scalar-video-instructions-vshl-vshr", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vshr", "mnemonic": "vshr", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "vshr", "category": "Scalar Video Instructions", "summary": "vshl Shift a left by unsigned amount in b with optional saturate, and optional secondary arithmetic operation or subword data merge.", "syntax": "// 32-bit scalar operation, with optional secondary operation\nvshr.dtype.atype.u32{.sat}.mode       d, a{.asel}, b{.bsel};", "syntax_forms": [{"syntax": "// 32-bit scalar operation, with optional secondary operation\nvshr.dtype.atype.u32{.sat}.mode       d, a{.asel}, b{.bsel};", "description": "vshl Shift a left by unsigned amount in b with optional saturate, and optional secondary\narithmetic operation or subword data merge. Left shift fills with zero. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "// extract byte/half-word/word and sign- or zero-extend\n// based on source operand type\nta = partSelectSignExtend( a,atype, asel );\ntb = partSelectSignExtend( b, .u32, bsel );\nif ( mode == .clamp  && tb > 32 )  tb = 32;\nif ( mode == .wrap )                       tb = tb & 0x1f;\nswitch ( vop ){\n   case vshl:  tmp = ta << tb;\n   case vshr:  tmp = ta >> tb;\n}\n// saturate, taking into account destination type and merge operations\ntmp = optSaturate( tmp, sat, isSigned(dtype), dsel );\nd = optSecondaryOp( op2, tmp, c );  // optional secondary operation\nd = optMerge( dsel, tmp, c );       // optional merge with c operand", "examples": "vshl.s32.u32.u32.clamp  r1, r2, r3;\nvshr.u32.u32.u32.wrap   r1, r2, r3.h1;", "description": "vshl Shift a left by unsigned amount in b with optional saturate, and optional secondary\narithmetic operation or subword data merge. Left shift fills with zero. vshr Shift a right by unsigned amount in b with optional saturate, and optional secondary\narithmetic operation or subword data merge. Signed shift fills with the sign bit, unsigned shift\nfills with zero.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#scalar-video-instructions-vshl-vshr", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vsub", "mnemonic": "vsub", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "vsub", "category": "Scalar Video Instructions", "summary": "Perform scalar arithmetic operation with optional saturate, and optional secondary arithmetic operation or subword data merge.", "syntax": "// 32-bit scalar operation, with optional secondary operation\nvsub.dtype.atype.btype{.sat}       d, a{.asel}, b{.bsel};", "syntax_forms": [{"syntax": "// 32-bit scalar operation, with optional secondary operation\nvsub.dtype.atype.btype{.sat}       d, a{.asel}, b{.bsel};", "description": "Perform scalar arithmetic operation with optional saturate, and optional secondary arithmetic operation or subword data merge.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_20"], "introducedIn": "PTX ISA 2.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "// extract byte/half-word/word and sign- or zero-extend\n// based on source operand type\nta = partSelectSignExtend( a, atype, asel );\ntb = partSelectSignExtend( b, btype, bsel );\n\nswitch ( vop ) {\n    case vadd:     tmp = ta + tb;\n    case vsub:     tmp = ta - tb;\n    case vabsdiff: tmp = | ta - tb |;\n    case vmin:     tmp = MIN( ta, tb );\n    case vmax:     tmp = MAX( ta, tb );\n}\n// saturate, taking into account destination type and merge operations\ntmp = optSaturate( tmp, sat, isSigned(dtype), dsel );\nd = optSecondaryOp( op2, tmp, c );  // optional secondary operation\nd = optMerge( dsel, tmp, c );       // optional merge with c operand", "examples": "vadd.s32.u32.s32.sat      r1, r2.b0, r3.h0;\nvsub.s32.s32.u32.sat      r1, r2.h1, r3.h1;\nvabsdiff.s32.s32.s32.sat  r1.h0, r2.b0, r3.b2, c;\nvmin.s32.s32.s32.sat.add  r1, r2, r3, c;", "description": "Perform scalar arithmetic operation with optional saturate, and optional secondary arithmetic operation or subword data merge.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#scalar-video-instructions-vadd-vsub-vabsdiff-vmin-vmax", "introducedIn": "PTX ISA 2.0", "requiredTargets": ["sm_20"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vsub2", "mnemonic": "vsub2", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "vsub2", "category": "SIMD Video Instructions", "summary": "Two-way SIMD parallel arithmetic operation with secondary operation.", "syntax": "// SIMD instruction with secondary SIMD merge operation\nvsub2.dtype.atype.btype{.sat}  d{.mask}, a{.asel}, b{.bsel}, c;", "syntax_forms": [{"syntax": "// SIMD instruction with secondary SIMD merge operation\nvsub2.dtype.atype.btype{.sat}  d{.mask}, a{.asel}, b{.bsel}, c;", "description": "Two-way SIMD parallel arithmetic operation with secondary operation. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 3.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "// extract pairs of half-words and sign- or zero-extend\n// based on operand type\nVa = extractAndSignExt_2( a, b, .asel, .atype );\nVb = extractAndSignExt_2( a, b, .bsel, .btype );\nVc = extractAndSignExt_2( c );\n\nfor (i=0; i<2; i++) {\n    switch ( vop2 ) {\n       case vadd2:             t[i] = Va[i] + Vb[i];\n       case vsub2:             t[i] = Va[i] - Vb[i];\n       case vavrg2:            if ( ( Va[i] + Vb[i] ) >= 0 ) {\n                                   t[i] = ( Va[i] + Vb[i] + 1 ) >> 1;\n                               } else {\n                                   t[i] = ( Va[i] + Vb[i] ) >> 1;\n                               }\n       case vabsdiff2:         t[i] = | Va[i] - Vb[i] |;\n       case vmin2:             t[i] = MIN( Va[i], Vb[i] );\n       case vmax2:             t[i] = MAX( Va[i], Vb[i] );\n    }\n    if (.sat) {\n        if ( .dtype == .s32 )  t[i] = CLAMP( t[i], S16_MAX, S16_MIN ); (see the official PTX ISA docs for the full semantics)", "examples": "vadd2.s32.s32.u32.sat  r1, r2, r3, r1;\nvsub2.s32.s32.s32.sat  r1.h0, r2.h10, r3.h32, r1;\nvmin2.s32.u32.u32.add  r1.h10, r2.h00, r3.h22, r1;", "description": "Two-way SIMD parallel arithmetic operation with secondary operation.\nElements of each dual half-word source to the operation are selected from any of the four half-words\nin the two source operands a and b using the asel and bsel modifiers.\nThe selected half-words are then operated on in parallel.\nThe results are optionally clamped to the appropriate range determined by the destination type\n(signed or unsigned). Saturation cannot be used with the secondary accumulate operation.\nFor instructions with a secondary SIMD merge operation:\nFor half-word positions indicated in mask, the selected half-word results are copied into\ndestination d. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#simd-video-instructions-vadd2-vsub2-vavrg2-vabsdiff2-vmin2-vmax2", "introducedIn": "PTX ISA 3.0", "requiredTargets": ["sm_30"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.vsub4", "mnemonic": "vsub4", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "vsub4", "category": "SIMD Video Instructions", "summary": "Four-way SIMD parallel arithmetic operation with secondary operation.", "syntax": "// SIMD instruction with secondary SIMD merge operation\nvsub4.dtype.atype.btype{.sat}  d{.mask}, a{.asel}, b{.bsel}, c;", "syntax_forms": [{"syntax": "// SIMD instruction with secondary SIMD merge operation\nvsub4.dtype.atype.btype{.sat}  d{.mask}, a{.asel}, b{.bsel}, c;", "description": "Four-way SIMD parallel arithmetic operation with secondary operation. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_30"], "introducedIn": "PTX ISA 3.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": "// extract quads of bytes and sign- or zero-extend\n// based on operand type\nVa = extractAndSignExt_4( a, b, .asel, .atype );\nVb = extractAndSignExt_4( a, b, .bsel, .btype );\nVc = extractAndSignExt_4( c );\nfor (i=0; i<4; i++) {\n    switch ( vop4 ) {\n        case vadd4:            t[i] = Va[i] + Vb[i];\n        case vsub4:            t[i] = Va[i] - Vb[i];\n        case vavrg4:           if ( ( Va[i] + Vb[i] ) >= 0 ) {\n                                   t[i] = ( Va[i] + Vb[i] + 1 ) >> 1;\n                               } else {\n                                   t[i] = ( Va[i] + Vb[i] ) >> 1;\n                               }\n        case vabsdiff4:        t[i] = | Va[i] - Vb[i] |;\n        case vmin4:            t[i] = MIN( Va[i], Vb[i] );\n        case vmax4:            t[i] = MAX( Va[i], Vb[i] );\n    }\n    if (.sat) {\n        if ( .dtype == .s32 )  t[i] = CLAMP( t[i], S8_MAX, S8_MIN ); (see the official PTX ISA docs for the full semantics)", "examples": "vadd4.s32.s32.u32.sat  r1, r2, r3, r1;\nvsub4.s32.s32.s32.sat  r1.b0, r2.b3210, r3.b7654, r1;\nvmin4.s32.u32.u32.add  r1.b00, r2.b0000, r3.b2222, r1;", "description": "Four-way SIMD parallel arithmetic operation with secondary operation.\nElements of each quad byte source to the operation are selected from any of the eight bytes in the\ntwo source operands a and b using the asel and bsel modifiers.\nThe selected bytes are then operated on in parallel.\nThe results are optionally clamped to the appropriate range determined by the destination type\n(signed or unsigned). Saturation cannot be used with the secondary accumulate operation.\nFor instructions with a secondary SIMD merge operation:\nFor byte positions indicated in mask, the selected byte results are copied into destination d. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#simd-video-instructions-vadd4-vsub4-vavrg4-vabsdiff4-vmin4-vmax4", "introducedIn": "PTX ISA 3.0", "requiredTargets": ["sm_30"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.wgmma.commit_group", "mnemonic": "wgmma.commit_group", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "wgmma.commit_group", "category": "Asynchronous Warpgroup Level Matrix Multiply-Accumulate Instructions", "summary": "wgmma.commit_group instruction creates a new wgmma-group per warpgroup and batches all prior wgmma.mma_async instructions initiated by the executing warp but not committed to any wgmma-group into the new wgmma-group.", "syntax": "wgmma.commit_group.sync.aligned;", "syntax_forms": [{"syntax": "wgmma.commit_group.sync.aligned;", "description": "wgmma.commit_group instruction creates a new wgmma-group per warpgroup and batches all prior wgmma. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90a"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "wgmma.commit_group.sync.aligned;", "description": "wgmma.commit_group instruction creates a new wgmma-group per warpgroup and batches all prior wgmma.mma_async instructions initiated by the executing warp but not committed to any\nwgmma-group into the new wgmma-group. If there are no uncommitted wgmma.mma_async instructions\nthen wgmma.commit_group results in an empty wgmma-group.\nAn executing thread can wait for the completion of all wgmma.mma_async operations in a\nwgmma-group by using wgmma.wait_group.\nThe mandatory.sync qualifier indicates that wgmma.commit_group instruction causes the\nexecuting thread to wait until all threads in the warp execute the same wgmma.commit_group instruction before resuming execution.\nThe mandatory. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.wgmma.fence", "mnemonic": "wgmma.fence", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "wgmma.fence", "category": "Asynchronous Warpgroup Level Matrix Multiply-Accumulate Instructions", "summary": "wgmma.fence instruction establishes an ordering between prior accesses to any warpgroup registers and subsequent accesses to the same registers by a wgmma.mma_async instruction.", "syntax": "wgmma.fence.sync.aligned;", "syntax_forms": [{"syntax": "wgmma.fence.sync.aligned;", "description": "wgmma.fence instruction establishes an ordering between prior accesses to any warpgroup\nregisters and subsequent accesses to the same registers by a wgmma.mma_async instruction. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90a"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [], "semantics": null, "examples": "// Example 1, first use example:\nwgmma.fence.sync.aligned;    // Establishes an ordering w.r.t. prior accesses to the registers s32d<0-3>\nwgmma.mma_async.sync.aligned.m64n8k32.s32.u8.u8  {s32d0, s32d1, s32d2, s32d3},\n                                                  descA, descB, scaleD;\nwgmma.commit_group.sync.aligned;\nwgmma.wait_group.sync.aligned 0;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "wgmma.fence instruction establishes an ordering between prior accesses to any warpgroup\nregisters and subsequent accesses to the same registers by a wgmma.mma_async instruction. Only\nthe accumulator register and the input registers containing the fragments of matrix A require this\nordering.\nThe wgmma.fence instruction must be issued by all warps of the warpgroup at the following\nlocations:\nBefore the first wgmma.mma_async operation in a warpgroup. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#asynchronous-warpgroup-level-matrix-instructions-wgmma-fence", "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.wgmma.mma_async", "mnemonic": "wgmma.mma_async", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "wgmma.mma_async", "category": "Asynchronous Warpgroup Level Matrix Multiply-Accumulate Instructions", "summary": "Instruction wgmma.mma_async issues a MxNxK matrix multiply and accumulate operation, D = A*B+D, where the A matrix is MxK, the B matrix is KxN, and the D matrix is MxN.", "syntax": "wgmma.mma_async.sync.aligned.shape.dtype.f16.f16  d, a-desc, b-desc, scale-d, imm-scale-a, imm-scale-b, imm-trans-a, imm-trans-b;", "syntax_forms": [{"syntax": "wgmma.mma_async.sync.aligned.shape.dtype.f16.f16  d, a-desc, b-desc, scale-d, imm-scale-a, imm-scale-b, imm-trans-a, imm-trans-b;", "description": "Instruction wgmma.mma_async issues a MxNxK matrix multiply and accumulate operation, D = A*B+D, where the A matrix is MxK, the B matrix is KxN, and the D matrix is MxN.\nThe operation of the form D = A (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90a"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a-desc", "desc": "Operand"}, {"name": "b-desc", "desc": "Operand"}, {"name": "scale-d", "desc": "Operand"}, {"name": "imm-scale-a", "desc": "Operand"}, {"name": "imm-scale-b", "desc": "Operand"}, {"name": "imm-trans-a", "desc": "Operand"}, {"name": "imm-trans-b", "desc": "Operand"}], "semantics": null, "examples": null, "description": "Instruction wgmma.mma_async issues a MxNxK matrix multiply and accumulate operation, D = A*B+D, where the A matrix is MxK, the B matrix is KxN, and the D matrix is MxN.\nThe operation of the form D = A*B is issued when the input predicate argument scale-d is\nfalse.\nwgmma.fence instruction must be used to fence the register accesses of wgmma.mma_async instruction from their prior accesses. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.wgmma.mma_async.sp", "mnemonic": "wgmma.mma_async.sp", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "wgmma.mma_async.sp", "category": "Asynchronous Warpgroup Level Matrix Multiply-Accumulate Instructions", "summary": "Instruction wgmma.mma_async issues a MxNxK matrix multiply and accumulate operation, D = A*B+D, where the A matrix is MxK, the B matrix is KxN, and the D matrix is MxN.", "syntax": "wgmma.mma_async.sp.sync.aligned.shape.dtype.f16.f16  d, a-desc, b-desc, sp-meta, sp-sel, scale-d, imm-scale-a, imm-scale-b, imm-trans-a, imm-trans-b;", "syntax_forms": [{"syntax": "wgmma.mma_async.sp.sync.aligned.shape.dtype.f16.f16  d, a-desc, b-desc, sp-meta, sp-sel, scale-d, imm-scale-a, imm-scale-b, imm-trans-a, imm-trans-b;", "description": "Instruction wgmma.mma_async issues a MxNxK matrix multiply and accumulate operation, D = A*B+D, where the A matrix is MxK, the B matrix is KxN, and the D matrix is MxN. (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90a"], "introducedIn": "PTX ISA 8.2"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a-desc", "desc": "Operand"}, {"name": "b-desc", "desc": "Operand"}, {"name": "sp-meta", "desc": "Operand"}, {"name": "sp-sel", "desc": "Operand"}, {"name": "scale-d", "desc": "Operand"}, {"name": "imm-scale-a", "desc": "Operand"}, {"name": "imm-scale-b", "desc": "Operand"}, {"name": "imm-trans-a", "desc": "Operand"}, {"name": "imm-trans-b", "desc": "Operand"}], "semantics": null, "examples": null, "description": "Instruction wgmma.mma_async issues a MxNxK matrix multiply and accumulate operation, D = A*B+D, where the A matrix is MxK, the B matrix is KxN, and the D matrix is MxN.\nThe matrix A is stored in the packed format Mx(K/2) as described in Sparse matrix storage.\nThe operation of the form D = A*B is issued when the input predicate argument scale-d is\nfalse.\nwgmma.fence instruction must be used to fence the register accesses of wgmma.mma_async instruction from their prior accesses. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.2", "requiredTargets": ["sm_90a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.wgmma.wait_group", "mnemonic": "wgmma.wait_group", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "wgmma.wait_group", "category": "Asynchronous Warpgroup Level Matrix Multiply-Accumulate Instructions", "summary": "wgmma.wait_group instruction will cause the executing thread to wait until only N or fewer of the most recent wgmma-groups are pending and all the prior wgmma-groups committed by the executing threads are complete.", "syntax": "wgmma.wait_group.sync.aligned N;", "syntax_forms": [{"syntax": "wgmma.wait_group.sync.aligned N;", "description": "wgmma.wait_group instruction will cause the executing thread to wait until only N or fewer of the most recent wgmma-groups are pending and all the prior wgmma-groups committed by the executing threads… (see the official PTX ISA docs for the full description)", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_90a"], "introducedIn": "PTX ISA 8.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "N", "desc": "Operand"}], "semantics": null, "examples": "wgmma.fence.sync.aligned;\n\nwgmma.mma_async.sync.aligned.m64n8k32.s32.u8.u8  {s32d0, s32d1, s32d2, s32d3},\n                                                  descA, descB, scaleD;\nwgmma.commit_group.sync.aligned;\n// (truncated - see the official PTX ISA docs for the full example)", "description": "wgmma.wait_group instruction will cause the executing thread to wait until only N or fewer of\nthe most recent wgmma-groups are pending and all the prior wgmma-groups committed by the executing\nthreads are complete. For example, when N is 0, the executing thread waits on all the prior\nwgmma-groups to complete. Operand N is an integer constant.\nAccessing the accumulator register or the input register containing the fragments of matrix A of a wgmma.mma_async instruction without first performing a wgmma.wait_group instruction that\nwaits on a wgmma-group including that wgmma.mma_async instruction is undefined behavior.\nThe mandatory.sync qualifier indicates that wgmma. (see the official PTX ISA docs for the full description)", "sourceUrl": null, "introducedIn": "PTX ISA 8.0", "requiredTargets": ["sm_90a"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.wmma", "mnemonic": "wmma", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Warp Matrix Multiply-Accumulate", "category": "Warp Level Matrix Multiply-Accumulate Instructions", "summary": "Higher-level warp matrix-multiply-accumulate built from explicit load/mma/store steps.", "syntax": "wmma.load.a.sync.aligned.layout.shape.type r, [p];", "syntax_forms": [{"syntax": "wmma.load.a.sync.aligned.layout.shape.type r, [p];", "description": "Load a matrix fragment cooperatively across the warp.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_70"], "introducedIn": "PTX ISA 6.0"}, {"syntax": "wmma.mma.sync.aligned.layout.shape.dtype.ctype d, a, b, c;", "description": "Perform the accumulate step on already-loaded fragments.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_70"], "introducedIn": "PTX ISA 6.0"}, {"syntax": "wmma.store.d.sync.aligned.layout.shape.type [p], r;", "description": "Store an accumulator fragment cooperatively across the warp.", "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_70"], "introducedIn": "PTX ISA 6.0"}], "dataTypes": [], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "r/d", "desc": "Fragment register(s)"}, {"name": "a", "desc": "Matrix A fragment"}, {"name": "b", "desc": "Matrix B fragment"}, {"name": "c", "desc": "Accumulator fragment (input)"}, {"name": "p", "desc": "Memory address for load/store forms"}], "semantics": "Together, the load/mma/store triplet compute D = A * B + C for a fixed tile shape, cooperatively across the warp.", "examples": "// Load elements from f16 row-major matrix B\n.reg .b32 x<8>;\n\nwmma.load.b.sync.aligned.m16n16k16.row.f16 {x0,x1,x2,x3,x4,x5,x,x7}, [ptr];\n// Now use {x0, ..., x7} for the actual wmma.mma\n// (truncated - see the official PTX ISA docs for the full example)\n\n.global .align 32 .f16 A[256], B[256];\n.global .align 32 .f32 C[256], D[256];\n.reg .b32 a<8> b<8> c<8> d<8>;\n\nwmma.load.a.sync.aligned.m16n16k16.global.row.f16\n        {a0, a1, a2, a3, a4, a5, a6, a7}, [A];\n// (truncated - see the official PTX ISA docs for the full example)\n\n// Storing f32 elements computed by a wmma.mma\n.reg .b32 x<8>;\n\nwmma.mma.sync.m16n16k16.row.col.f32.f32\n              {d0, d1, d2, d3, d4, d5, d6, d7}, ...;\nwmma.store.d.sync.m16n16k16.row.f32\n// (truncated - see the official PTX ISA docs for the full example)", "description": "Perform a warp-level matrix multiply-and-accumulate computation D = A * B + C using matrices A,\nB and C loaded in registers a, b and c respectively, and store the result matrix in\nregister d. The register arguments a, b, c and d hold unspecified fragments of\nthe corresponding matrices as described in Matrix Fragments for WMMA\nThe qualifiers.dtype,.atype,.btype and.ctype indicate the data-type of the\nelements in the matrices D, A, B and C respectively.\nFor wmma.mma without explicit.atype and.btype:.atype and.btype are\nimplicitly set to.f16.\nFor integer wmma,.ctype and.dtype must be specified as.s32. (see the official PTX ISA docs for the full description)", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#warp-level-matrix-instructions-wmma-mma", "introducedIn": "PTX ISA 6.0", "requiredTargets": ["sm_70"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "ptx.xor", "mnemonic": "xor", "architecture": "PTX", "vendor": "NVIDIA", "processorClass": "gpu", "isaLayer": "virtual", "executionModel": "SIMT", "full_name": "Bitwise Exclusive OR", "category": "Logic and Shift Instructions", "summary": "Bitwise XOR of two operands.", "syntax": "xor.type d, a, b;", "syntax_forms": [{"syntax": "xor.type d, a, b;", "description": "Bitwise XOR, including a predicate form.", "dataTypes": ["b16", "b32", "b64", "pred"], "stateSpaces": [], "scopes": [], "modifiers": [], "requiredTargets": ["sm_10"], "introducedIn": "PTX ISA 1.0"}], "dataTypes": ["b16", "b32", "b64", "pred"], "stateSpaces": [], "scopes": [], "modifiers": [], "operands": [{"name": "d", "desc": "Destination register"}, {"name": "a", "desc": "First operand"}, {"name": "b", "desc": "Second operand"}], "semantics": "d = a ^ b (bitwise).", "examples": "xor.b32  d,q,r;\nxor.b16  d,x,0x0001;", "description": "Compute the bit-wise exclusive-or operation for the bits in a and b.", "sourceUrl": "https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#logic-and-shift-instructions-xor", "introducedIn": "PTX ISA 1.0", "requiredTargets": ["sm_10"], "deprecatedIn": null, "encoding": {"format": "Virtual (PTX)"}, "sourceIds": ["nvidia-ptx-isa"]}
{"id": "amdgpu.buffer_atomic_add_f64", "mnemonic": "buffer_atomic_add_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC ADD F64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Add a double-precision float value in the data register to a location in a buffer surface.", "description": "Add a double-precision float value in the data register to a location in a buffer surface. Store the original value from buffer surface into a vector register iff the SC0 bit is set.", "syntax": "buffer_atomic_add_f64", "operands": [], "dataTypes": ["f64"], "semantics": "tmp = MEM[ADDR].f64;\nMEM[ADDR].f64 += DATA.f64;\nRETURN_DATA = tmp", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 472, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.buffer_atomic_add_u32", "mnemonic": "buffer_atomic_add_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC ADD U32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Add two unsigned 32-bit integer values stored in the data register and a location in a buffer surface.", "description": "Add two unsigned 32-bit integer values stored in the data register and a location in a buffer surface. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_add_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "buffer_atomic_add_u32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_add_u64", "mnemonic": "buffer_atomic_add_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC ADD U64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Add two unsigned 64-bit integer values stored in the data register and a location in a buffer surface.", "description": "Add two unsigned 64-bit integer values stored in the data register and a location in a buffer surface. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_add_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": "buffer_atomic_add_u64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_and_b32", "mnemonic": "buffer_atomic_and_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC AND B32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in a buffer surface.", "description": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in a buffer surface. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_and_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "buffer_atomic_and_b32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_and_b64", "mnemonic": "buffer_atomic_and_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC AND B64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 64-bit integer values stored in the data register and a location in a buffer surface.", "description": "Calculate bitwise AND given two unsigned 64-bit integer values stored in the data register and a location in a buffer surface. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_and_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "buffer_atomic_and_b64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_cmpswap_b32", "mnemonic": "buffer_atomic_cmpswap_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC CMPSWAP B32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Compare two unsigned 32-bit integer values stored in the data comparison register and a location in a buffer surface.", "description": "Compare two unsigned 32-bit integer values stored in the data comparison register and a location in a buffer surface. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_cmpswap_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "buffer_atomic_cmpswap_b32 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_cmpswap_b64", "mnemonic": "buffer_atomic_cmpswap_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC CMPSWAP B64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Compare two unsigned 64-bit integer values stored in the data comparison register and a location in a buffer surface.", "description": "Compare two unsigned 64-bit integer values stored in the data comparison register and a location in a buffer surface. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_cmpswap_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "buffer_atomic_cmpswap_b64 v[5:8], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_cmpswap_f32", "mnemonic": "buffer_atomic_cmpswap_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC CMPSWAP F32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Compare two single-precision float values stored in the data comparison register and a location in a buffer surface.", "description": "Compare two single-precision float values stored in the data comparison register and a location in a buffer surface. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from buffer surface into a vector register iff the GLC bit is set.", "syntax": "buffer_atomic_cmpswap_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "buffer_atomic_cmpswap_f32 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_dec_u32", "mnemonic": "buffer_atomic_dec_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC DEC U32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Decrement an unsigned 32-bit integer value from a location in a buffer surface with wraparound to a value in the data register if the decrement…", "description": "Decrement an unsigned 32-bit integer value from a location in a buffer surface with wraparound to a value in the data register if the decrement yields a negative value. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_dec_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "buffer_atomic_dec_u32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_dec_u64", "mnemonic": "buffer_atomic_dec_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC DEC U64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Decrement an unsigned 64-bit integer value from a location in a buffer surface with wraparound to a value in the data register if the decrement…", "description": "Decrement an unsigned 64-bit integer value from a location in a buffer surface with wraparound to a value in the data register if the decrement yields a negative value. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_dec_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": "buffer_atomic_dec_u64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_fmax_x2", "mnemonic": "buffer_atomic_fmax_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC FMAX X2", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the GLC bit is set.", "syntax": "buffer_atomic_fmax_x2", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.buffer_atomic_fmin_x2", "mnemonic": "buffer_atomic_fmin_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC FMIN X2", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the GLC bit is set.", "syntax": "buffer_atomic_fmin_x2", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.buffer_atomic_inc_u32", "mnemonic": "buffer_atomic_inc_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC INC U32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Increment an unsigned 32-bit integer value from a location in a buffer surface with wraparound to 0 if the value exceeds a value in the data register.", "description": "Increment an unsigned 32-bit integer value from a location in a buffer surface with wraparound to 0 if the value exceeds a value in the data register. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_inc_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "buffer_atomic_inc_u32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_inc_u64", "mnemonic": "buffer_atomic_inc_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC INC U64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Increment an unsigned 64-bit integer value from a location in a buffer surface with wraparound to 0 if the value exceeds a value in the data register.", "description": "Increment an unsigned 64-bit integer value from a location in a buffer surface with wraparound to 0 if the value exceeds a value in the data register. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_inc_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": "buffer_atomic_inc_u64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_max_f64", "mnemonic": "buffer_atomic_max_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MAX F64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the SC0 bit is set.", "syntax": "buffer_atomic_max_f64", "operands": [], "dataTypes": ["f64"], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src > tmp ? src : tmp;\nRETURN_DATA.f64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 473, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.buffer_atomic_max_i32", "mnemonic": "buffer_atomic_max_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MAX I32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_max_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": "buffer_atomic_max_i32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_max_i64", "mnemonic": "buffer_atomic_max_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MAX I64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the maximum of two signed 64-bit integer inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the maximum of two signed 64-bit integer inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_max_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": "buffer_atomic_max_i64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_max_num_f32", "mnemonic": "buffer_atomic_max_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MAX NUM F32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of two single-precision float inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the IEEE maximumNumber() of two single-precision float inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_max_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.buffer_atomic_max_num_f64", "mnemonic": "buffer_atomic_max_num_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MAX NUM F64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "AMDGPU MUBUF vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "buffer_atomic_max_num_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.buffer_atomic_max_u32", "mnemonic": "buffer_atomic_max_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MAX U32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_max_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "buffer_atomic_max_u32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_max_u64", "mnemonic": "buffer_atomic_max_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MAX U64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the maximum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_max_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": "buffer_atomic_max_u64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_min_f64", "mnemonic": "buffer_atomic_min_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MIN F64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the SC0 bit is set.", "syntax": "buffer_atomic_min_f64", "operands": [], "dataTypes": ["f64"], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src < tmp ? src : tmp;\nRETURN_DATA.f64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 472, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.buffer_atomic_min_i32", "mnemonic": "buffer_atomic_min_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MIN I32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_min_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": "buffer_atomic_min_i32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_min_i64", "mnemonic": "buffer_atomic_min_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MIN I64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the minimum of two signed 64-bit integer inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the minimum of two signed 64-bit integer inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_min_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": "buffer_atomic_min_i64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_min_num_f32", "mnemonic": "buffer_atomic_min_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MIN NUM F32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of two single-precision float inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the IEEE minimumNumber() of two single-precision float inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_min_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.buffer_atomic_min_num_f64", "mnemonic": "buffer_atomic_min_num_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MIN NUM F64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "AMDGPU MUBUF vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "buffer_atomic_min_num_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.buffer_atomic_min_u32", "mnemonic": "buffer_atomic_min_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MIN U32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_min_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "buffer_atomic_min_u32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_min_u64", "mnemonic": "buffer_atomic_min_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC MIN U64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in a buffer surface.", "description": "Select the minimum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in a buffer surface. Update the buffer surface with the selected value. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_min_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": "buffer_atomic_min_u64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_or_b32", "mnemonic": "buffer_atomic_or_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC OR B32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in a buffer surface.", "description": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in a buffer surface. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_or_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "buffer_atomic_or_b32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_or_b64", "mnemonic": "buffer_atomic_or_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC OR B64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 64-bit integer values stored in the data register and a location in a buffer surface.", "description": "Calculate bitwise OR given two unsigned 64-bit integer values stored in the data register and a location in a buffer surface. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_or_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "buffer_atomic_or_b64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_rsub", "mnemonic": "buffer_atomic_rsub", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC RSUB", "category": "Buffer Memory", "instructionClass": "vector", "summary": "AMDGPU MUBUF vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "buffer_atomic_rsub", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.buffer_atomic_rsub_x2", "mnemonic": "buffer_atomic_rsub_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC RSUB X2", "category": "Buffer Memory", "instructionClass": "vector", "summary": "AMDGPU MUBUF vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "buffer_atomic_rsub_x2", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.buffer_atomic_sub_clamp_u32", "mnemonic": "buffer_atomic_sub_clamp_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC SUB CLAMP U32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer location in a buffer surface from a value in the data register and clamp the result to zero.", "description": "Subtract an unsigned 32-bit integer location in a buffer surface from a value in the data register and clamp the result to zero. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_sub_clamp_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.buffer_atomic_sub_u32", "mnemonic": "buffer_atomic_sub_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC SUB U32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in a buffer surface.", "description": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in a buffer surface. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_sub_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "buffer_atomic_sub_u32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_sub_u64", "mnemonic": "buffer_atomic_sub_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC SUB U64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 64-bit integer value stored in the data register from a value stored in a location in a buffer surface.", "description": "Subtract an unsigned 64-bit integer value stored in the data register from a value stored in a location in a buffer surface. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_sub_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": "buffer_atomic_sub_u64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_swap_b32", "mnemonic": "buffer_atomic_swap_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC SWAP B32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Swap an unsigned 32-bit integer value in the data register with a location in a buffer surface.", "description": "Swap an unsigned 32-bit integer value in the data register with a location in a buffer surface. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_swap_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "buffer_atomic_swap_b32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_swap_b64", "mnemonic": "buffer_atomic_swap_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC SWAP B64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Swap an unsigned 64-bit integer value in the data register with a location in a buffer surface.", "description": "Swap an unsigned 64-bit integer value in the data register with a location in a buffer surface. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_swap_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "buffer_atomic_swap_b64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_xor_b32", "mnemonic": "buffer_atomic_xor_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC XOR B32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in a buffer surface.", "description": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in a buffer surface. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_xor_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "buffer_atomic_xor_b32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_atomic_xor_b64", "mnemonic": "buffer_atomic_xor_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER ATOMIC XOR B64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 64-bit integer values stored in the data register and a location in a buffer surface.", "description": "Calculate bitwise XOR given two unsigned 64-bit integer values stored in the data register and a location in a buffer surface. Store the original value from buffer surface into a vector register iff the temporal hint enables atomic return.", "syntax": "buffer_atomic_xor_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "buffer_atomic_xor_b64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_gl0_inv", "mnemonic": "buffer_gl0_inv", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER GL0 INV", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Write back and invalidate the shader L0. Returns ACK to shader.", "description": "Write back and invalidate the shader L0. Returns ACK to shader.", "syntax": "buffer_gl0_inv", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.buffer_gl1_inv", "mnemonic": "buffer_gl1_inv", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER GL1 INV", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Invalidate the GL1 cache only. Returns ACK to shader.", "description": "Invalidate the GL1 cache only. Returns ACK to shader.", "syntax": "buffer_gl1_inv", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.buffer_inv", "mnemonic": "buffer_inv", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER INV", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Invalidate CU and/or L2 cache depending on sc0 and sc1 bits. Returns ACK to shader.", "description": "Invalidate CU and/or L2 cache depending on sc0 and sc1 bits. Returns ACK to shader.", "syntax": "buffer_inv", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 468, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.buffer_invl2", "mnemonic": "buffer_invl2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER INVL2", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Invalidate L2 cache. Returns ACK to shader.", "description": "Invalidate L2 cache. Returns ACK to shader.", "syntax": "buffer_invl2", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.buffer_load_b128", "mnemonic": "buffer_load_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD B128", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 128 bits of data from a buffer surface into a vector register.", "description": "Load 128 bits of data from a buffer surface into a vector register.", "syntax": "buffer_load_b128", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_load_b128 v[5:8], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_b32", "mnemonic": "buffer_load_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD B32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 32 bits of data from a buffer surface into a vector register.", "description": "Load 32 bits of data from a buffer surface into a vector register.", "syntax": "buffer_load_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "buffer_load_b32 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_b64", "mnemonic": "buffer_load_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD B64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 64 bits of data from a buffer surface into a vector register.", "description": "Load 64 bits of data from a buffer surface into a vector register.", "syntax": "buffer_load_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "buffer_load_b64 v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_b96", "mnemonic": "buffer_load_b96", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD B96", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 96 bits of data from a buffer surface into a vector register.", "description": "Load 96 bits of data from a buffer surface into a vector register.", "syntax": "buffer_load_b96", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_load_b96 v[5:7], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_d16_b16", "mnemonic": "buffer_load_d16_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD D16 B16", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from a buffer surface and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 16 bits of unsigned data from a buffer surface and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "buffer_load_d16_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "buffer_load_d16_b16 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_d16_format_x", "mnemonic": "buffer_load_d16_format_x", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD D16 FORMAT X", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 1-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 1-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into the low 16 bits of a 32-bit vector register. The resource descriptor specifies the data format of the surface.", "syntax": "buffer_load_d16_format_x", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_load_d16_format_x v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_d16_format_xy", "mnemonic": "buffer_load_d16_format_xy", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD D16 FORMAT XY", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 2-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 2-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into a vector register. The resource descriptor specifies the data format of the surface.", "syntax": "buffer_load_d16_format_xy", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_load_d16_format_xy v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_d16_format_xyz", "mnemonic": "buffer_load_d16_format_xyz", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD D16 FORMAT XYZ", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 3-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 3-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into a vector register. The resource descriptor specifies the data format of the surface.", "syntax": "buffer_load_d16_format_xyz", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_load_d16_format_xyz v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_d16_format_xyzw", "mnemonic": "buffer_load_d16_format_xyzw", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD D16 FORMAT XYZW", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 4-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 4-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into a vector register. The resource descriptor specifies the data format of the surface.", "syntax": "buffer_load_d16_format_xyzw", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_load_d16_format_xyzw v[5:6], off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_d16_hi_b16", "mnemonic": "buffer_load_d16_hi_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD D16 HI B16", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from a buffer surface and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 16 bits of unsigned data from a buffer surface and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "buffer_load_d16_hi_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "buffer_load_d16_hi_b16 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_d16_hi_format_x", "mnemonic": "buffer_load_d16_hi_format_x", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD D16 HI FORMAT X", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 1-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 1-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into the high 16 bits of a 32-bit vector register. The resource descriptor specifies the data format of the surface.", "syntax": "buffer_load_d16_hi_format_x", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_load_d16_hi_format_x v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_d16_hi_i8", "mnemonic": "buffer_load_d16_hi_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD D16 HI I8", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from a buffer surface, sign extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 8 bits of signed data from a buffer surface, sign extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "buffer_load_d16_hi_i8", "operands": [], "dataTypes": ["i8"], "semantics": "", "example": "buffer_load_d16_hi_i8 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_d16_hi_u8", "mnemonic": "buffer_load_d16_hi_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD D16 HI U8", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from a buffer surface, zero extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 8 bits of unsigned data from a buffer surface, zero extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "buffer_load_d16_hi_u8", "operands": [], "dataTypes": ["u8"], "semantics": "", "example": "buffer_load_d16_hi_u8 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_d16_i8", "mnemonic": "buffer_load_d16_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD D16 I8", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from a buffer surface, sign extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 8 bits of signed data from a buffer surface, sign extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "buffer_load_d16_i8", "operands": [], "dataTypes": ["i8"], "semantics": "", "example": "buffer_load_d16_i8 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_d16_u8", "mnemonic": "buffer_load_d16_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD D16 U8", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from a buffer surface, zero extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 8 bits of unsigned data from a buffer surface, zero extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "buffer_load_d16_u8", "operands": [], "dataTypes": ["u8"], "semantics": "", "example": "buffer_load_d16_u8 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_dword", "mnemonic": "buffer_load_dword", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD DWORD", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load one 32-bit dword per lane through a buffer (raw/structured) resource descriptor.", "description": "Load 32 bits of data from a buffer surface into a vector register.", "syntax": "buffer_load_dword VDST, VADDR, SRSRC, offset", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "VADDR", "desc": "Per-lane offset (VGPR)"}, {"name": "SRSRC", "desc": "Buffer resource descriptor (SGPR x4)"}, {"name": "offset", "desc": "Immediate offset"}], "dataTypes": [], "semantics": "VDST[lane] = *(resource-relative address computed from SRSRC, VADDR[lane], offset) for each active lane; bounds-checked against the descriptor.", "example": "buffer_load_dword  v2, v0, s[4:7], 0 offen   // v2 = buffer[s[4:7]](v0)", "exampleSource": null, "encoding": {"format": "MUBUF", "widthBits": 32}, "executionUnit": "Vector Memory Unit", "registerClasses": ["VGPR", "SGPR"], "memorySegment": "buffer", "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.buffer_load_i16", "mnemonic": "buffer_load_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD I16", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 16 bits of signed data from a buffer surface, sign extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of signed data from a buffer surface, sign extend to 32 bits and store the result into a vector register.", "syntax": "buffer_load_i16", "operands": [], "dataTypes": ["i16"], "semantics": "", "example": "buffer_load_i16 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_i8", "mnemonic": "buffer_load_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD I8", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from a buffer surface, sign extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of signed data from a buffer surface, sign extend to 32 bits and store the result into a vector register.", "syntax": "buffer_load_i8", "operands": [], "dataTypes": ["i8"], "semantics": "", "example": "buffer_load_i8 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_u16", "mnemonic": "buffer_load_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD U16", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from a buffer surface, zero extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of unsigned data from a buffer surface, zero extend to 32 bits and store the result into a vector register.", "syntax": "buffer_load_u16", "operands": [], "dataTypes": ["u16"], "semantics": "", "example": "buffer_load_u16 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_load_u8", "mnemonic": "buffer_load_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER LOAD U8", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from a buffer surface, zero extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of unsigned data from a buffer surface, zero extend to 32 bits and store the result into a vector register.", "syntax": "buffer_load_u8", "operands": [], "dataTypes": ["u8"], "semantics": "", "example": "buffer_load_u8 v5, off, s[8:11], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_b128", "mnemonic": "buffer_store_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE B128", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Store 128 bits of data from vector input registers into a buffer surface.", "description": "Store 128 bits of data from vector input registers into a buffer surface.", "syntax": "buffer_store_b128", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_store_b128 v[1:4], off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_b16", "mnemonic": "buffer_store_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE B16", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Store 16 bits of data from a vector register into a buffer surface.", "description": "Store 16 bits of data from a vector register into a buffer surface.", "syntax": "buffer_store_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "buffer_store_b16 v1, off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_b32", "mnemonic": "buffer_store_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE B32", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Store 32 bits of data from vector input registers into a buffer surface.", "description": "Store 32 bits of data from vector input registers into a buffer surface.", "syntax": "buffer_store_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "buffer_store_b32 v1, off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_b64", "mnemonic": "buffer_store_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE B64", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Store 64 bits of data from vector input registers into a buffer surface.", "description": "Store 64 bits of data from vector input registers into a buffer surface.", "syntax": "buffer_store_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "buffer_store_b64 v[1:2], off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_b8", "mnemonic": "buffer_store_b8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE B8", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Store 8 bits of data from a vector register into a buffer surface.", "description": "Store 8 bits of data from a vector register into a buffer surface.", "syntax": "buffer_store_b8", "operands": [], "dataTypes": ["b8"], "semantics": "", "example": "buffer_store_b8 v1, off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_b96", "mnemonic": "buffer_store_b96", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE B96", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Store 96 bits of data from vector input registers into a buffer surface.", "description": "Store 96 bits of data from vector input registers into a buffer surface.", "syntax": "buffer_store_b96", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_store_b96 v[1:3], off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_d16_format_x", "mnemonic": "buffer_store_d16_format_x", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE D16 FORMAT X", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 16 bits of data from the low 16 bits of a 32-bit vector input register into 1-component formatted data and store the data into a buffer…", "description": "Convert 16 bits of data from the low 16 bits of a 32-bit vector input register into 1-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "buffer_store_d16_format_x", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_store_d16_format_x v1, off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_d16_format_xy", "mnemonic": "buffer_store_d16_format_xy", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE D16 FORMAT XY", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 32 bits of data from vector input registers into 2-component formatted data and store the data into a buffer surface.", "description": "Convert 32 bits of data from vector input registers into 2-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "buffer_store_d16_format_xy", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_store_d16_format_xy v1, off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_d16_format_xyz", "mnemonic": "buffer_store_d16_format_xyz", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE D16 FORMAT XYZ", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 48 bits of data from vector input registers into 3-component formatted data and store the data into a buffer surface.", "description": "Convert 48 bits of data from vector input registers into 3-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "buffer_store_d16_format_xyz", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_store_d16_format_xyz v[1:2], off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_d16_format_xyzw", "mnemonic": "buffer_store_d16_format_xyzw", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE D16 FORMAT XYZW", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 64 bits of data from vector input registers into 4-component formatted data and store the data into a buffer surface.", "description": "Convert 64 bits of data from vector input registers into 4-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "buffer_store_d16_format_xyzw", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_store_d16_format_xyzw v[1:2], off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_d16_hi_b16", "mnemonic": "buffer_store_d16_hi_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE D16 HI B16", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Store 16 bits of data from the high 16 bits of a 32-bit vector register into a buffer surface.", "description": "Store 16 bits of data from the high 16 bits of a 32-bit vector register into a buffer surface.", "syntax": "buffer_store_d16_hi_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "buffer_store_d16_hi_b16 v1, off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_d16_hi_b8", "mnemonic": "buffer_store_d16_hi_b8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE D16 HI B8", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Store 8 bits of data from the high 16 bits of a 32-bit vector register into a buffer surface.", "description": "Store 8 bits of data from the high 16 bits of a 32-bit vector register into a buffer surface.", "syntax": "buffer_store_d16_hi_b8", "operands": [], "dataTypes": ["b8"], "semantics": "", "example": "buffer_store_d16_hi_b8 v1, off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_d16_hi_format_x", "mnemonic": "buffer_store_d16_hi_format_x", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE D16 HI FORMAT X", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 16 bits of data from the high 16 bits of a 32-bit vector input register into 1-component formatted data and store the data into a buffer…", "description": "Convert 16 bits of data from the high 16 bits of a 32-bit vector input register into 1-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "buffer_store_d16_hi_format_x", "operands": [], "dataTypes": [], "semantics": "", "example": "buffer_store_d16_hi_format_x v1, off, s[12:15], s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.buffer_store_lds_dword", "mnemonic": "buffer_store_lds_dword", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER STORE LDS DWORD", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Store one DWORD from LDS memory to system memory without utilizing VGPRs.", "description": "Store one DWORD from LDS memory to system memory without utilizing VGPRs.", "syntax": "buffer_store_lds_dword", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.buffer_wbinvl1_sc", "mnemonic": "buffer_wbinvl1_sc", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER WBINVL1 SC", "category": "Buffer Memory", "instructionClass": "vector", "summary": "AMDGPU MUBUF vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "buffer_wbinvl1_sc", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.buffer_wbinvl1_vol", "mnemonic": "buffer_wbinvl1_vol", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER WBINVL1 VOL", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Write back and invalidate the shader L1 only for lines that are marked volatile. Returns ACK to shader.", "description": "Write back and invalidate the shader L1 only for lines that are marked volatile. Returns ACK to shader.", "syntax": "buffer_wbinvl1_vol", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.buffer_wbl2", "mnemonic": "buffer_wbl2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "BUFFER WBL2", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Write back L2 cache. Returns ACK to shader.", "description": "Write back L2 cache. Returns ACK to shader.", "syntax": "buffer_wbl2", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MUBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 468, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.cluster_load_async_to_lds_b128", "mnemonic": "cluster_load_async_to_lds_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "CLUSTER LOAD ASYNC TO LDS B128", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction operating on b128 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "cluster_load_async_to_lds_b128", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.cluster_load_async_to_lds_b32", "mnemonic": "cluster_load_async_to_lds_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "CLUSTER LOAD ASYNC TO LDS B32", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "cluster_load_async_to_lds_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.cluster_load_async_to_lds_b64", "mnemonic": "cluster_load_async_to_lds_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "CLUSTER LOAD ASYNC TO LDS B64", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "cluster_load_async_to_lds_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.cluster_load_async_to_lds_b8", "mnemonic": "cluster_load_async_to_lds_b8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "CLUSTER LOAD ASYNC TO LDS B8", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction operating on b8 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "cluster_load_async_to_lds_b8", "operands": [], "dataTypes": ["b8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.cluster_load_b128", "mnemonic": "cluster_load_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "CLUSTER LOAD B128", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction operating on b128 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "cluster_load_b128", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.cluster_load_b32", "mnemonic": "cluster_load_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "CLUSTER LOAD B32", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "cluster_load_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.cluster_load_b64", "mnemonic": "cluster_load_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "CLUSTER LOAD B64", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "cluster_load_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_add_f32", "mnemonic": "ds_add_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ADD F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Add two single-precision float values stored in the data register and a location in a data share.", "description": "Add two single-precision float values stored in the data register and a location in a data share.", "syntax": "ds_add_f32", "operands": [], "dataTypes": ["f32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nMEM[addr].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp", "example": "ds_add_f32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 424, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_add_f64", "mnemonic": "ds_add_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ADD F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Add a double-precision float value in the data register to a location in a data share.", "description": "Add a double-precision float value in the data register to a location in a data share.", "syntax": "ds_add_f64", "operands": [], "dataTypes": ["f64"], "semantics": "tmp = MEM[ADDR].f64;\nMEM[ADDR].f64 += DATA.f64;\nRETURN_DATA = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 445, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_add_gs_reg_rtn", "mnemonic": "ds_add_gs_reg_rtn", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ADD GS REG RTN", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Perform an atomic add to data in specific registers embedded in GDS rather than operating on GDS memory directly.", "description": "Perform an atomic add to data in specific registers embedded in GDS rather than operating on GDS memory directly. This instruction returns the pre-op value. This instruction is only used by the GS stage and is used to facilitate streamout.", "syntax": "ds_add_gs_reg_rtn", "operands": [], "dataTypes": [], "semantics": "", "example": "ds_add_gs_reg_rtn v[5:6], v1 gds", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_add_rtn_f32", "mnemonic": "ds_add_rtn_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ADD RTN F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Add two single-precision float values stored in the data register and a location in a data share.", "description": "Add two single-precision float values stored in the data register and a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_add_rtn_f32", "operands": [], "dataTypes": ["f32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nMEM[addr].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp", "example": "ds_add_rtn_f32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 431, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_add_rtn_f64", "mnemonic": "ds_add_rtn_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ADD RTN F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Add a double-precision float value in the data register to a location in a data share.", "description": "Add a double-precision float value in the data register to a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_add_rtn_f64", "operands": [], "dataTypes": ["f64"], "semantics": "tmp = MEM[ADDR].f64;\nMEM[ADDR].f64 += DATA.f64;\nRETURN_DATA = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 452, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_add_rtn_u32", "mnemonic": "ds_add_rtn_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ADD RTN U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Add two unsigned 32-bit integer values stored in the data register and a location in a data share.", "description": "Add two unsigned 32-bit integer values stored in the data register and a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_add_rtn_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp", "example": "ds_add_rtn_u32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 425, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_add_rtn_u64", "mnemonic": "ds_add_rtn_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ADD RTN U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Add two unsigned 64-bit integer values stored in the data register and a location in a data share.", "description": "Add two unsigned 64-bit integer values stored in the data register and a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_add_rtn_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp", "example": "ds_add_rtn_u64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 445, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_add_src2_f32", "mnemonic": "ds_add_src2_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ADD SRC2 F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_add_src2_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_add_src2_u32", "mnemonic": "ds_add_src2_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ADD SRC2 U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_add_src2_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_add_src2_u64", "mnemonic": "ds_add_src2_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ADD SRC2 U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_add_src2_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_add_u32", "mnemonic": "ds_add_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ADD U32", "category": "Atomics", "instructionClass": "vector", "summary": "Atomically add a per-lane value to an LDS location.", "description": "Add two unsigned 32-bit integer values stored in the data register and a location in a data share.", "syntax": "ds_add_u32 ADDR, DATA, offset", "operands": [{"name": "ADDR", "desc": "Per-lane LDS byte address"}, {"name": "DATA", "desc": "Per-lane value to add"}, {"name": "offset", "desc": "Immediate byte offset"}], "dataTypes": ["u32"], "semantics": "old = LDS[ADDR[lane] + offset]; LDS[...] = old + DATA[lane]; indivisible with respect to other lanes/waves in the workgroup.", "example": "ds_add_u32  v0, v1   // LDS[v0] += v1", "exampleSource": null, "encoding": {"format": "DS", "widthBits": 32}, "executionUnit": "LDS Unit", "registerClasses": ["VGPR"], "memorySegment": "LDS/shared", "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.ds_add_u64", "mnemonic": "ds_add_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ADD U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Add two unsigned 64-bit integer values stored in the data register and a location in a data share.", "description": "Add two unsigned 64-bit integer values stored in the data register and a location in a data share.", "syntax": "ds_add_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp", "example": "ds_add_u64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 438, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_and_b32", "mnemonic": "ds_and_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS AND B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in a data share.", "description": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in a data share.", "syntax": "ds_and_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp", "example": "ds_and_b32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 420, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_and_b64", "mnemonic": "ds_and_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS AND B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 64-bit integer values stored in the data register and a location in a data share.", "description": "Calculate bitwise AND given two unsigned 64-bit integer values stored in the data register and a location in a data share.", "syntax": "ds_and_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp", "example": "ds_and_b64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 440, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_and_rtn_b32", "mnemonic": "ds_and_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS AND RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in a data share.", "description": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_and_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp", "example": "ds_and_rtn_b32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 428, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_and_rtn_b64", "mnemonic": "ds_and_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS AND RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 64-bit integer values stored in the data register and a location in a data share.", "description": "Calculate bitwise AND given two unsigned 64-bit integer values stored in the data register and a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_and_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp", "example": "ds_and_rtn_b64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 447, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_and_src2_b32", "mnemonic": "ds_and_src2_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS AND SRC2 B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_and_src2_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_and_src2_b64", "mnemonic": "ds_and_src2_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS AND SRC2 B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_and_src2_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_append", "mnemonic": "ds_append", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS APPEND", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Add (count_bits(exec_mask)) to the value stored in DS memory at (M0.base + instr_offset) if GDS, or at instr_offset if LDS.", "description": "Add (count_bits(exec_mask)) to the value stored in DS memory at (M0.base + instr_offset) if GDS, or at instr_offset if LDS. Return the pre-operation value to VGPRs.", "syntax": "ds_append", "operands": [], "dataTypes": [], "semantics": "", "example": "ds_append v5", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 456, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_atomic_async_barrier_arrive_b64", "mnemonic": "ds_atomic_async_barrier_arrive_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ATOMIC ASYNC BARRIER ARRIVE B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_atomic_async_barrier_arrive_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_atomic_barrier_arrive_rtn_b64", "mnemonic": "ds_atomic_barrier_arrive_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ATOMIC BARRIER ARRIVE RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_atomic_barrier_arrive_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_bpermute_b32", "mnemonic": "ds_bpermute_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS BPERMUTE B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Backward permute.", "description": "Backward permute. This does not access LDS memory and may be called even if no LDS memory is allocated to the wave. It uses LDS hardware to implement an arbitrary swizzle across threads in a wavefront. Note the address passed in is the thread ID multiplied by 4. Note that EXEC mask is applied to both VGPR read and write. If src_lane selects a disabled thread then zero is returned. See also DS_PERMUTE_B32.", "syntax": "ds_bpermute_b32", "operands": [], "dataTypes": ["b32"], "semantics": "// VGPR[laneId][index] is the VGPR RAM\n// VDST, ADDR and DATA0 are from the microcode DS encoding\ndeclare tmp : 32'B[64];\ndeclare OFFSET : 16'U;\ndeclare DATA0 : 32'U;\ndeclare VDST : 32'U;\nfor i in 0 : 63 do\ntmp[i] = 0x0\nendfor;\nfor i in 0 : 63 do\n// ADDR needs to be divided by 4.\n// High-order bits are ignored.\nsrc_lane = (VGPR[i][ADDR].u32 + OFFSET.u32) / 4U % 64U;\n// EXEC is applied to the source VGPR reads.\nif EXEC[src_lane].u1 then\ntmp[i] = VGPR[src_lane][DATA0]\nendif\nendfor;\n// Copy data into destination VGPRs. Some source\n// data may be broadcast to multiple lanes.\nfor i in 0 : 63 do\nif EXEC[i].u1 then\nVGPR[i][VDST] = tmp[i]\nendif\nendfor", "example": "ds_bpermute_b32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Examples (simplified 4-thread wavefronts): VGPR[SRC0] = { A, B, C, D }\nVGPR[ADDR] = { 0, 0, 12, 4 }\nEXEC = 0xF, OFFSET = 0\nVGPR[VDST] = { A, A, D, B }\nVGPR[SRC0] = { A, B, C, D }\nVGPR[ADDR] = { 0, 0, 12, 4 }\nEXEC = 0xA, OFFSET = 0\nVGPR[VDST] = { -, 0, -, B }", "sourcePdfPage": 437, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_bpermute_fi_b32", "mnemonic": "ds_bpermute_fi_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS BPERMUTE FI B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Backward permute and fetch data for invalid lanes.", "description": "Backward permute and fetch data for invalid lanes. This does not access LDS memory and may be called even if no LDS memory is allocated to the wave. It uses LDS hardware to implement an arbitrary swizzle across threads in a wavefront.", "syntax": "ds_bpermute_fi_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_bvh_stack_rtn_b32", "mnemonic": "ds_bvh_stack_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS BVH STACK RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Ray tracing involves traversing a BVH which is a kind of tree where nodes have up to 4 children.", "description": "Ray tracing involves traversing a BVH which is a kind of tree where nodes have up to 4 children. Each shader thread processes one child at a time, and overflow nodes are stored temporarily in LDS using a stack. This instruction supports pushing/popping the stack to reduce the number of VALU instructions required per traversal and reduce VMEM bandwidth requirements.", "syntax": "ds_bvh_stack_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_bvh_stack_rtn_b32 v255, v254, v253, v[249:252]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_cmpst_b32", "mnemonic": "ds_cmpst_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPST B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare an unsigned 32-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare an unsigned 32-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpst_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nsrc = DATA2.b32;\ncmp = DATA.b32;\nMEM[addr].b32 = tmp == cmp ? src : tmp;\nRETURN_DATA.b32 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Caution, the order of src and cmp are the opposite of the BUFFER_ATOMIC_CMPSWAP opcode.", "sourcePdfPage": 422, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_cmpst_b64", "mnemonic": "ds_cmpst_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPST B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare an unsigned 64-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare an unsigned 64-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpst_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nsrc = DATA2.b64;\ncmp = DATA.b64;\nMEM[addr].b64 = tmp == cmp ? src : tmp;\nRETURN_DATA.b64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Caution, the order of src and cmp are the opposite of the BUFFER_ATOMIC_CMPSWAP opcode.", "sourcePdfPage": 442, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_cmpst_f32", "mnemonic": "ds_cmpst_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPST F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare a single-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare a single-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpst_f32", "operands": [], "dataTypes": ["f32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nsrc = DATA2.f32;\ncmp = DATA.f32;\nMEM[addr].f32 = tmp == cmp ? src : tmp;\nRETURN_DATA.f32 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Caution, the order of src and cmp are the opposite of the BUFFER_ATOMIC_CMPSWAP opcode.", "sourcePdfPage": 422, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_cmpst_f64", "mnemonic": "ds_cmpst_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPST F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare a double-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare a double-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpst_f64", "operands": [], "dataTypes": ["f64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f64;\nsrc = DATA2.f64;\ncmp = DATA.f64;\nMEM[addr].f64 = tmp == cmp ? src : tmp;\nRETURN_DATA.f64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Caution, the order of src and cmp are the opposite of the BUFFER_ATOMIC_CMPSWAP opcode.", "sourcePdfPage": 442, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_cmpst_rtn_b32", "mnemonic": "ds_cmpst_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPST RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare an unsigned 32-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare an unsigned 32-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpst_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nsrc = DATA2.b32;\ncmp = DATA.b32;\nMEM[addr].b32 = tmp == cmp ? src : tmp;\nRETURN_DATA.b32 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Caution, the order of src and cmp are the opposite of the BUFFER_ATOMIC_CMPSWAP opcode.", "sourcePdfPage": 429, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_cmpst_rtn_b64", "mnemonic": "ds_cmpst_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPST RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare an unsigned 64-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare an unsigned 64-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpst_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nsrc = DATA2.b64;\ncmp = DATA.b64;\nMEM[addr].b64 = tmp == cmp ? src : tmp;\nRETURN_DATA.b64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Caution, the order of src and cmp are the opposite of the BUFFER_ATOMIC_CMPSWAP opcode.", "sourcePdfPage": 449, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_cmpst_rtn_f32", "mnemonic": "ds_cmpst_rtn_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPST RTN F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare a single-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare a single-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpst_rtn_f32", "operands": [], "dataTypes": ["f32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nsrc = DATA2.f32;\ncmp = DATA.f32;\nMEM[addr].f32 = tmp == cmp ? src : tmp;\nRETURN_DATA.f32 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Caution, the order of src and cmp are the opposite of the BUFFER_ATOMIC_CMPSWAP opcode.", "sourcePdfPage": 430, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_cmpst_rtn_f64", "mnemonic": "ds_cmpst_rtn_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPST RTN F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare a double-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare a double-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpst_rtn_f64", "operands": [], "dataTypes": ["f64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f64;\nsrc = DATA2.f64;\ncmp = DATA.f64;\nMEM[addr].f64 = tmp == cmp ? src : tmp;\nRETURN_DATA.f64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Caution, the order of src and cmp are the opposite of the BUFFER_ATOMIC_CMPSWAP opcode.", "sourcePdfPage": 450, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_cmpstore_b32", "mnemonic": "ds_cmpstore_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPSTORE B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare an unsigned 32-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare an unsigned 32-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpstore_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_cmpstore_b32 v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_cmpstore_b64", "mnemonic": "ds_cmpstore_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPSTORE B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare an unsigned 64-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare an unsigned 64-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpstore_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "ds_cmpstore_b64 v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_cmpstore_f32", "mnemonic": "ds_cmpstore_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPSTORE F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare a single-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare a single-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpstore_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "ds_cmpstore_f32 v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_cmpstore_f64", "mnemonic": "ds_cmpstore_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPSTORE F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare a double-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare a double-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpstore_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": "ds_cmpstore_f64 v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_cmpstore_rtn_b32", "mnemonic": "ds_cmpstore_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPSTORE RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare an unsigned 32-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare an unsigned 32-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpstore_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_cmpstore_rtn_b32 v5, v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_cmpstore_rtn_b64", "mnemonic": "ds_cmpstore_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPSTORE RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare an unsigned 64-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare an unsigned 64-bit integer value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpstore_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "ds_cmpstore_rtn_b64 v[5:6], v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_cmpstore_rtn_f32", "mnemonic": "ds_cmpstore_rtn_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPSTORE RTN F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare a single-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare a single-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpstore_rtn_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "ds_cmpstore_rtn_f32 v5, v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_cmpstore_rtn_f64", "mnemonic": "ds_cmpstore_rtn_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CMPSTORE RTN F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Compare a double-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value…", "description": "Compare a double-precision float value in the data comparison register with a location in a data share, and modify the memory location with a value in the data source register if the comparison is equal.", "syntax": "ds_cmpstore_rtn_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": "ds_cmpstore_rtn_f64 v[5:6], v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_cond_sub_rtn_u32", "mnemonic": "ds_cond_sub_rtn_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS COND SUB RTN U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value in the data register from a location in a data share only if the memory value is greater than or equal to…", "description": "Subtract an unsigned 32-bit integer value in the data register from a location in a data share only if the memory value is greater than or equal to the data register value. Store the original value from data share into a vector register.", "syntax": "ds_cond_sub_rtn_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_cond_sub_u32", "mnemonic": "ds_cond_sub_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS COND SUB U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value in the data register from a location in a data share only if the memory value is greater than or equal to…", "description": "Subtract an unsigned 32-bit integer value in the data register from a location in a data share only if the memory value is greater than or equal to the data register value.", "syntax": "ds_cond_sub_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_condxchg32_rtn_b64", "mnemonic": "ds_condxchg32_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CONDXCHG32 RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Perform 2 conditional write exchanges, where each conditional write exchange writes a 32 bit value from a data register to a location in data share…", "description": "Perform 2 conditional write exchanges, where each conditional write exchange writes a 32 bit value from a data register to a location in data share iff the most significant bit of the data value is set.", "syntax": "ds_condxchg32_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "declare OFFSET0 : 8'U;\ndeclare OFFSET1 : 8'U;\ndeclare RETURN_DATA : 32'U[2];\nADDR = S0.u32;\nDATA = S1.u64;\noffset = { OFFSET1, OFFSET0 };\nADDR0 = ((ADDR + offset.u32) & 0xfff8U);\nADDR1 = ADDR0 + 4U;\nRETURN_DATA[0] = LDS[ADDR0].u32;\nif DATA[31] then\nLDS[ADDR0] = { 1'0, DATA[30 : 0] }\nendif;\nRETURN_DATA[1] = LDS[ADDR1].u32;\nif DATA[63] then\nLDS[ADDR1] = { 1'0, DATA[62 : 32] }\nendif", "example": "ds_condxchg32_rtn_b64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 452, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_consume", "mnemonic": "ds_consume", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS CONSUME", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract (count_bits(exec_mask)) from the value stored in DS memory at (M0.base + instr_offset) if GDS, or at instr_offset if LDS.", "description": "Subtract (count_bits(exec_mask)) from the value stored in DS memory at (M0.base + instr_offset) if GDS, or at instr_offset if LDS. Return the pre-operation value to VGPRs.", "syntax": "ds_consume", "operands": [], "dataTypes": [], "semantics": "", "example": "ds_consume v5", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 456, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_dec_rtn_u32", "mnemonic": "ds_dec_rtn_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS DEC RTN U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Decrement an unsigned 32-bit integer value from a location in a data share with wraparound to a value in the data register if the decrement yields a…", "description": "Decrement an unsigned 32-bit integer value from a location in a data share with wraparound to a value in the data register if the decrement yields a negative value. Store the original value from data share into a vector register.", "syntax": "ds_dec_rtn_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp", "example": "ds_dec_rtn_u32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 426, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_dec_rtn_u64", "mnemonic": "ds_dec_rtn_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS DEC RTN U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Decrement an unsigned 64-bit integer value from a location in a data share with wraparound to a value in the data register if the decrement yields a…", "description": "Decrement an unsigned 64-bit integer value from a location in a data share with wraparound to a value in the data register if the decrement yields a negative value. Store the original value from data share into a vector register.", "syntax": "ds_dec_rtn_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp", "example": "ds_dec_rtn_u64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 446, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_dec_src2_u32", "mnemonic": "ds_dec_src2_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS DEC SRC2 U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_dec_src2_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_dec_src2_u64", "mnemonic": "ds_dec_src2_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS DEC SRC2 U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_dec_src2_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_dec_u32", "mnemonic": "ds_dec_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS DEC U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Decrement an unsigned 32-bit integer value from a location in a data share with wraparound to a value in the data register if the decrement yields a…", "description": "Decrement an unsigned 32-bit integer value from a location in a data share with wraparound to a value in the data register if the decrement yields a negative value.", "syntax": "ds_dec_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp", "example": "ds_dec_u32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 419, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_dec_u64", "mnemonic": "ds_dec_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS DEC U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Decrement an unsigned 64-bit integer value from a location in a data share with wraparound to a value in the data register if the decrement yields a…", "description": "Decrement an unsigned 64-bit integer value from a location in a data share with wraparound to a value in the data register if the decrement yields a negative value.", "syntax": "ds_dec_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp", "example": "ds_dec_u64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 439, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_direct_load", "mnemonic": "ds_direct_load", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS DIRECT LOAD", "category": "LDS Direct / Parameter Fetch", "instructionClass": "vector", "summary": "Read a single 32-bit value from LDS to all lanes.", "description": "Read a single 32-bit value from LDS to all lanes. A single DWORD is read from LDS memory at ADDR[M0[15:0]], where M0[15:0] is a byte address and is dword-aligned. M0[18:16] specify the data type for the read and may be 0=UBYTE, 1=USHORT, 2=DWORD, 4=SBYTE, 5=SSHORT.", "syntax": "ds_direct_load", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DSDIR"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_gws_barrier", "mnemonic": "ds_gws_barrier", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS GWS BARRIER", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "GDS Only: The GWS resource indicated processes this opcode by queueing it until barrier is satisfied.", "description": "GDS Only: The GWS resource indicated processes this opcode by queueing it until barrier is satisfied. The number of waves needed is passed in as DATA of first valid thread.", "syntax": "ds_gws_barrier", "operands": [], "dataTypes": [], "semantics": "//Determine the GWS resource to work on\nrid[5:0] = gds_base[5:0] + OFFSET0[5:0];\nindex =  find first valid (vector mask);\nvalue = DATA[thread: index];\n// Input Decision Machine\nstate.type[rid] = BARRIER;\nif(state[rid].counter <= 0) then\nthread[rid].flag = state[rid].flag;\nENQUEUE;\nstate[rid].flag = !state.flag;\nstate[rid].counter = value;\nreturn rd_done;\nelse\nstate[rid].counter -= 1;\nthread.flag = state[rid].flag;\nENQUEUE;\nendif.\nSince the waves deliver the count for the next barrier, this function can have a different size barrier for each\noccurrence.\n// Release Machine\nif(state.type == BARRIER) then\nif(state.flag != thread.flag) then\nreturn rd_done;\nendif;\nendif.\nCAUTION: The VGPR operand MUST be even-aligned for this instruction. Only 32 bits are used but hardware\ntreats this instruction as a 64 bit read.", "example": "ds_gws_barrier v1 gds", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 454, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_gws_init", "mnemonic": "ds_gws_init", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS GWS INIT", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "GDS Only: Initialize a barrier or semaphore resource.", "description": "GDS Only: Initialize a barrier or semaphore resource.", "syntax": "ds_gws_init", "operands": [], "dataTypes": [], "semantics": "// Determine the GWS resource to work on\nrid[5:0] = gds_base[5:0] + offset0[5:0];\n// Get the value to use in init\nindex = find_first_valid(vector mask)\nvalue = DATA[thread: index]\n// Set the state of the resource\nstate.counter[rid] = lsb(value); //limit #waves\nstate.flag[rid] = 0;\nreturn rd_done; //release calling wave\nCAUTION: The VGPR operand MUST be even-aligned for this instruction. Only 32 bits are used but hardware\ntreats this instruction as a 64 bit read.", "example": "ds_gws_init v1 gds", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 453, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_gws_sema_br", "mnemonic": "ds_gws_sema_br", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS GWS SEMA BR", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "GDS Only: The GWS resource indicated processes this opcode by updating the counter by the bulk release delivered count and labeling the resource as a…", "description": "GDS Only: The GWS resource indicated processes this opcode by updating the counter by the bulk release delivered count and labeling the resource as a semaphore.", "syntax": "ds_gws_sema_br", "operands": [], "dataTypes": [], "semantics": "//Determine the GWS resource to work on\nrid[5:0] = gds_base[5:0] + offset0[5:0];\nindex =  find first valid (vector mask)\ncount = DATA[thread: index];\n//Add count to the resource state counter\nstate.counter[rid] += count;\nstate.type = SEMAPHORE;\nreturn rd_done; //release calling wave\nThis action releases count number of waves, promptly if queued, or as they arrive from the noted resource.\nCAUTION: The VGPR operand MUST be even-aligned for this instruction. Only 32 bits are used but hardware\ntreats this instruction as a 64 bit read.", "example": "ds_gws_sema_br v1 gds", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 453, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_gws_sema_p", "mnemonic": "ds_gws_sema_p", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS GWS SEMA P", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "GDS Only: The GWS resource indicated processes this opcode by queueing it until counter enables a release and then decrementing the counter of the…", "description": "GDS Only: The GWS resource indicated processes this opcode by queueing it until counter enables a release and then decrementing the counter of the resource as a semaphore.", "syntax": "ds_gws_sema_p", "operands": [], "dataTypes": [], "semantics": "//Determine the GWS resource to work on\nrid[5:0] = gds_base[5:0] + offset0[5:0];\nstate.type = SEMAPHORE;\nENQUEUE until(state[rid].counter > 0)\nstate[rid].counter -= 1;\nreturn rd_done;", "example": "ds_gws_sema_p gds", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 454, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_gws_sema_release_all", "mnemonic": "ds_gws_sema_release_all", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS GWS SEMA RELEASE ALL", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "GDS Only: The GWS resource (rid) indicated processes this opcode by updating the counter and labeling the specified resource as a semaphore.", "description": "GDS Only: The GWS resource (rid) indicated processes this opcode by updating the counter and labeling the specified resource as a semaphore.", "syntax": "ds_gws_sema_release_all", "operands": [], "dataTypes": [], "semantics": "// Determine the GWS resource to work on\nrid[5:0] = gds_base[5:0] + offset0[5:0];\n// Incr the state counter of the resource\nstate.counter[rid] = state.wave_in_queue;\nstate.type = SEMAPHORE;\nreturn rd_done; //release calling wave\nThis action releases ALL queued waves; it has no effect if no waves are present.", "example": "ds_gws_sema_release_all gds", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 452, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_gws_sema_v", "mnemonic": "ds_gws_sema_v", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS GWS SEMA V", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "GDS Only: The GWS resource indicated processes this opcode by updating the counter and labeling the resource as a semaphore.", "description": "GDS Only: The GWS resource indicated processes this opcode by updating the counter and labeling the resource as a semaphore.", "syntax": "ds_gws_sema_v", "operands": [], "dataTypes": [], "semantics": "//Determine the GWS resource to work on\nrid[5:0] = gds_base[5:0] + offset0[5:0];\n//Incr the state counter of the resource\nstate.counter[rid] += 1;\nstate.type = SEMAPHORE;\nreturn rd_done; //release calling wave\nThis action releases one wave if any are queued in this resource.", "example": "ds_gws_sema_v gds", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 453, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_inc_rtn_u32", "mnemonic": "ds_inc_rtn_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS INC RTN U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Increment an unsigned 32-bit integer value from a location in a data share with wraparound to 0 if the value exceeds a value in the data register.", "description": "Increment an unsigned 32-bit integer value from a location in a data share with wraparound to 0 if the value exceeds a value in the data register. Store the original value from data share into a vector register.", "syntax": "ds_inc_rtn_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp", "example": "ds_inc_rtn_u32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 426, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_inc_rtn_u64", "mnemonic": "ds_inc_rtn_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS INC RTN U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Increment an unsigned 64-bit integer value from a location in a data share with wraparound to 0 if the value exceeds a value in the data register.", "description": "Increment an unsigned 64-bit integer value from a location in a data share with wraparound to 0 if the value exceeds a value in the data register. Store the original value from data share into a vector register.", "syntax": "ds_inc_rtn_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp", "example": "ds_inc_rtn_u64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 446, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_inc_src2_u32", "mnemonic": "ds_inc_src2_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS INC SRC2 U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_inc_src2_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_inc_src2_u64", "mnemonic": "ds_inc_src2_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS INC SRC2 U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_inc_src2_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_inc_u32", "mnemonic": "ds_inc_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS INC U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Increment an unsigned 32-bit integer value from a location in a data share with wraparound to 0 if the value exceeds a value in the data register.", "description": "Increment an unsigned 32-bit integer value from a location in a data share with wraparound to 0 if the value exceeds a value in the data register.", "syntax": "ds_inc_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp", "example": "ds_inc_u32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 419, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_inc_u64", "mnemonic": "ds_inc_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS INC U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Increment an unsigned 64-bit integer value from a location in a data share with wraparound to 0 if the value exceeds a value in the data register.", "description": "Increment an unsigned 64-bit integer value from a location in a data share with wraparound to 0 if the value exceeds a value in the data register.", "syntax": "ds_inc_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp", "example": "ds_inc_u64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 438, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_2addr_b32", "mnemonic": "ds_load_2addr_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD 2ADDR B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 32 bits of data from one location in a data share and then 32 bits of data from a second location in a data share and store the results into a…", "description": "Load 32 bits of data from one location in a data share and then 32 bits of data from a second location in a data share and store the results into a 64-bit vector register.", "syntax": "ds_load_2addr_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_load_2addr_b32 v[5:6], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_2addr_b64", "mnemonic": "ds_load_2addr_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD 2ADDR B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 64 bits of data from one location in a data share and then 64 bits of data from a second location in a data share and store the results into a…", "description": "Load 64 bits of data from one location in a data share and then 64 bits of data from a second location in a data share and store the results into a 128-bit vector register.", "syntax": "ds_load_2addr_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "ds_load_2addr_b64 v[5:8], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_2addr_stride64_b32", "mnemonic": "ds_load_2addr_stride64_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD 2ADDR STRIDE64 B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 32 bits of data from one location in a data share and then 32 bits of data from a second location in a data share and store the results into a…", "description": "Load 32 bits of data from one location in a data share and then 32 bits of data from a second location in a data share and store the results into a 64-bit vector register. Treat each offset as an index and multiply by a stride of 64 elements (256 bytes) to generate an offset for each DS address.", "syntax": "ds_load_2addr_stride64_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_load_2addr_stride64_b32 v[5:6], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_2addr_stride64_b64", "mnemonic": "ds_load_2addr_stride64_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD 2ADDR STRIDE64 B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 64 bits of data from one location in a data share and then 64 bits of data from a second location in a data share and store the results into a…", "description": "Load 64 bits of data from one location in a data share and then 64 bits of data from a second location in a data share and store the results into a 128-bit vector register. Treat each offset as an index and multiply by a stride of 64 elements (256 bytes) to generate an offset for each DS address.", "syntax": "ds_load_2addr_stride64_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "ds_load_2addr_stride64_b64 v[5:8], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_addtid_b32", "mnemonic": "ds_load_addtid_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD ADDTID B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 32 bits of data from a data share into a vector register.", "description": "Load 32 bits of data from a data share into a vector register. The memory base address is provided as an immediate value and the lane ID is used as an offset.", "syntax": "ds_load_addtid_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_load_addtid_b32 v5", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_b128", "mnemonic": "ds_load_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD B128", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 128 bits of data from a data share into a vector register.", "description": "Load 128 bits of data from a data share into a vector register.", "syntax": "ds_load_b128", "operands": [], "dataTypes": [], "semantics": "", "example": "ds_load_b128 v[5:8], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_b32", "mnemonic": "ds_load_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 32 bits of data from a data share into a vector register.", "description": "Load 32 bits of data from a data share into a vector register.", "syntax": "ds_load_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_load_b32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_b64", "mnemonic": "ds_load_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 64 bits of data from a data share into a vector register.", "description": "Load 64 bits of data from a data share into a vector register.", "syntax": "ds_load_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "ds_load_b64 v[5:6], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_b96", "mnemonic": "ds_load_b96", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD B96", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 96 bits of data from a data share into a vector register.", "description": "Load 96 bits of data from a data share into a vector register.", "syntax": "ds_load_b96", "operands": [], "dataTypes": [], "semantics": "", "example": "ds_load_b96 v[5:7], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_i16", "mnemonic": "ds_load_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD I16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 16 bits of signed data from a data share, sign extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of signed data from a data share, sign extend to 32 bits and store the result into a vector register.", "syntax": "ds_load_i16", "operands": [], "dataTypes": ["i16"], "semantics": "", "example": "ds_load_i16 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_i8", "mnemonic": "ds_load_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD I8", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 8 bits of signed data from a data share, sign extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of signed data from a data share, sign extend to 32 bits and store the result into a vector register.", "syntax": "ds_load_i8", "operands": [], "dataTypes": ["i8"], "semantics": "", "example": "ds_load_i8 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_i8_d16", "mnemonic": "ds_load_i8_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD I8 D16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 8 bits of signed data from a data share, sign extend to 16 bits and store the result into the low 16 bits of a vector register.", "description": "Load 8 bits of signed data from a data share, sign extend to 16 bits and store the result into the low 16 bits of a vector register.", "syntax": "ds_load_i8_d16", "operands": [], "dataTypes": ["i8"], "semantics": "", "example": "ds_load_i8_d16 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_i8_d16_hi", "mnemonic": "ds_load_i8_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD I8 D16 HI", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 8 bits of signed data from a data share, sign extend to 16 bits and store the result into the high 16 bits of a vector register.", "description": "Load 8 bits of signed data from a data share, sign extend to 16 bits and store the result into the high 16 bits of a vector register.", "syntax": "ds_load_i8_d16_hi", "operands": [], "dataTypes": ["i8"], "semantics": "", "example": "ds_load_i8_d16_hi v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_tr16_b128", "mnemonic": "ds_load_tr16_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD TR16 B128", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b128 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_load_tr16_b128", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_load_tr4_b64", "mnemonic": "ds_load_tr4_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD TR4 B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_load_tr4_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_load_tr6_b96", "mnemonic": "ds_load_tr6_b96", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD TR6 B96", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b96 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_load_tr6_b96", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_load_tr8_b64", "mnemonic": "ds_load_tr8_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD TR8 B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_load_tr8_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_load_u16", "mnemonic": "ds_load_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD U16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from a data share, zero extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of unsigned data from a data share, zero extend to 32 bits and store the result into a vector register.", "syntax": "ds_load_u16", "operands": [], "dataTypes": ["u16"], "semantics": "", "example": "ds_load_u16 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_u16_d16", "mnemonic": "ds_load_u16_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD U16 D16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from a data share and store the result into the low 16 bits of a vector register.", "description": "Load 16 bits of unsigned data from a data share and store the result into the low 16 bits of a vector register.", "syntax": "ds_load_u16_d16", "operands": [], "dataTypes": ["u16"], "semantics": "", "example": "ds_load_u16_d16 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_u16_d16_hi", "mnemonic": "ds_load_u16_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD U16 D16 HI", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from a data share and store the result into the high 16 bits of a vector register.", "description": "Load 16 bits of unsigned data from a data share and store the result into the high 16 bits of a vector register.", "syntax": "ds_load_u16_d16_hi", "operands": [], "dataTypes": ["u16"], "semantics": "", "example": "ds_load_u16_d16_hi v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_u8", "mnemonic": "ds_load_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD U8", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from a data share, zero extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of unsigned data from a data share, zero extend to 32 bits and store the result into a vector register.", "syntax": "ds_load_u8", "operands": [], "dataTypes": ["u8"], "semantics": "", "example": "ds_load_u8 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_u8_d16", "mnemonic": "ds_load_u8_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD U8 D16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from a data share, zero extend to 16 bits and store the result into the low 16 bits of a vector register.", "description": "Load 8 bits of unsigned data from a data share, zero extend to 16 bits and store the result into the low 16 bits of a vector register.", "syntax": "ds_load_u8_d16", "operands": [], "dataTypes": ["u8"], "semantics": "", "example": "ds_load_u8_d16 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_load_u8_d16_hi", "mnemonic": "ds_load_u8_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS LOAD U8 D16 HI", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from a data share, zero extend to 16 bits and store the result into the high 16 bits of a vector register.", "description": "Load 8 bits of unsigned data from a data share, zero extend to 16 bits and store the result into the high 16 bits of a vector register.", "syntax": "ds_load_u8_d16_hi", "operands": [], "dataTypes": ["u8"], "semantics": "", "example": "ds_load_u8_d16_hi v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_max_f32", "mnemonic": "ds_max_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the maximum of two single-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the maximum of two single-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_max_f32", "operands": [], "dataTypes": ["f32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nsrc = DATA.f32;\nMEM[addr].f32 = src > tmp ? src : tmp;\nRETURN_DATA.f32 = tmp", "example": "ds_max_f32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Floating-point compare handles NAN/INF/denorm.", "sourcePdfPage": 423, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_max_f64", "mnemonic": "ds_max_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_max_f64", "operands": [], "dataTypes": ["f64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src > tmp ? src : tmp;\nRETURN_DATA.f64 = tmp", "example": "ds_max_f64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Floating-point compare handles NAN/INF/denorm.", "sourcePdfPage": 443, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_max_i32", "mnemonic": "ds_max_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX I32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_max_i32", "operands": [], "dataTypes": ["i32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp", "example": "ds_max_i32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 420, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_max_i64", "mnemonic": "ds_max_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX I64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the maximum of two signed 64-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the maximum of two signed 64-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_max_i64", "operands": [], "dataTypes": ["i64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp", "example": "ds_max_i64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 439, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_max_num_f32", "mnemonic": "ds_max_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX NUM F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of two single-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the IEEE maximumNumber() of two single-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_max_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_max_num_f64", "mnemonic": "ds_max_num_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX NUM F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of two double-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the IEEE maximumNumber() of two double-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_max_num_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_max_num_rtn_f32", "mnemonic": "ds_max_num_rtn_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX NUM RTN F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of two single-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the IEEE maximumNumber() of two single-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_max_num_rtn_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_max_num_rtn_f64", "mnemonic": "ds_max_num_rtn_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX NUM RTN F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of two double-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the IEEE maximumNumber() of two double-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_max_num_rtn_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_max_rtn_f32", "mnemonic": "ds_max_rtn_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX RTN F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the maximum of two single-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the maximum of two single-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_max_rtn_f32", "operands": [], "dataTypes": ["f32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nsrc = DATA.f32;\nMEM[addr].f32 = src > tmp ? src : tmp;\nRETURN_DATA.f32 = tmp", "example": "ds_max_rtn_f32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Floating-point compare handles NAN/INF/denorm.", "sourcePdfPage": 430, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_max_rtn_f64", "mnemonic": "ds_max_rtn_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX RTN F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_max_rtn_f64", "operands": [], "dataTypes": ["f64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src > tmp ? src : tmp;\nRETURN_DATA.f64 = tmp", "example": "ds_max_rtn_f64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Floating-point compare handles NAN/INF/denorm.", "sourcePdfPage": 450, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_max_rtn_i32", "mnemonic": "ds_max_rtn_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX RTN I32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_max_rtn_i32", "operands": [], "dataTypes": ["i32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp", "example": "ds_max_rtn_i32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 427, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_max_rtn_i64", "mnemonic": "ds_max_rtn_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX RTN I64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the maximum of two signed 64-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the maximum of two signed 64-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_max_rtn_i64", "operands": [], "dataTypes": ["i64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp", "example": "ds_max_rtn_i64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 447, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_max_rtn_u32", "mnemonic": "ds_max_rtn_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX RTN U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_max_rtn_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp", "example": "ds_max_rtn_u32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 427, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_max_rtn_u64", "mnemonic": "ds_max_rtn_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX RTN U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the maximum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_max_rtn_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp", "example": "ds_max_rtn_u64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 447, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_max_src2_f32", "mnemonic": "ds_max_src2_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX SRC2 F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_max_src2_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_max_src2_f64", "mnemonic": "ds_max_src2_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX SRC2 F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_max_src2_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_max_src2_i32", "mnemonic": "ds_max_src2_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX SRC2 I32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on i32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_max_src2_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_max_src2_i64", "mnemonic": "ds_max_src2_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX SRC2 I64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on i64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_max_src2_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_max_src2_u32", "mnemonic": "ds_max_src2_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX SRC2 U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_max_src2_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_max_src2_u64", "mnemonic": "ds_max_src2_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX SRC2 U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_max_src2_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_max_u32", "mnemonic": "ds_max_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_max_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp", "example": "ds_max_u32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 420, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_max_u64", "mnemonic": "ds_max_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MAX U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the maximum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_max_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp", "example": "ds_max_u64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 440, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_min_f32", "mnemonic": "ds_min_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the minimum of two single-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the minimum of two single-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_min_f32", "operands": [], "dataTypes": ["f32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nsrc = DATA.f32;\nMEM[addr].f32 = src < tmp ? src : tmp;\nRETURN_DATA.f32 = tmp", "example": "ds_min_f32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Floating-point compare handles NAN/INF/denorm.", "sourcePdfPage": 423, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_min_f64", "mnemonic": "ds_min_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_min_f64", "operands": [], "dataTypes": ["f64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src < tmp ? src : tmp;\nRETURN_DATA.f64 = tmp", "example": "ds_min_f64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Floating-point compare handles NAN/INF/denorm.", "sourcePdfPage": 442, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_min_i32", "mnemonic": "ds_min_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN I32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_min_i32", "operands": [], "dataTypes": ["i32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp", "example": "ds_min_i32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 419, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_min_i64", "mnemonic": "ds_min_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN I64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the minimum of two signed 64-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the minimum of two signed 64-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_min_i64", "operands": [], "dataTypes": ["i64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp", "example": "ds_min_i64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 439, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_min_num_f32", "mnemonic": "ds_min_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN NUM F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of two single-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the IEEE minimumNumber() of two single-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_min_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_min_num_f64", "mnemonic": "ds_min_num_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN NUM F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of two double-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the IEEE minimumNumber() of two double-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_min_num_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_min_num_rtn_f32", "mnemonic": "ds_min_num_rtn_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN NUM RTN F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of two single-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the IEEE minimumNumber() of two single-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_min_num_rtn_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_min_num_rtn_f64", "mnemonic": "ds_min_num_rtn_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN NUM RTN F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of two double-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the IEEE minimumNumber() of two double-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_min_num_rtn_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_min_rtn_f32", "mnemonic": "ds_min_rtn_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN RTN F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the minimum of two single-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the minimum of two single-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_min_rtn_f32", "operands": [], "dataTypes": ["f32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nsrc = DATA.f32;\nMEM[addr].f32 = src < tmp ? src : tmp;\nRETURN_DATA.f32 = tmp", "example": "ds_min_rtn_f32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Floating-point compare handles NAN/INF/denorm.", "sourcePdfPage": 430, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_min_rtn_f64", "mnemonic": "ds_min_rtn_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN RTN F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in a data share.", "description": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_min_rtn_f64", "operands": [], "dataTypes": ["f64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src < tmp ? src : tmp;\nRETURN_DATA.f64 = tmp", "example": "ds_min_rtn_f64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Floating-point compare handles NAN/INF/denorm.", "sourcePdfPage": 450, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_min_rtn_i32", "mnemonic": "ds_min_rtn_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN RTN I32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_min_rtn_i32", "operands": [], "dataTypes": ["i32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp", "example": "ds_min_rtn_i32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 426, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_min_rtn_i64", "mnemonic": "ds_min_rtn_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN RTN I64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the minimum of two signed 64-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the minimum of two signed 64-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_min_rtn_i64", "operands": [], "dataTypes": ["i64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp", "example": "ds_min_rtn_i64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 446, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_min_rtn_u32", "mnemonic": "ds_min_rtn_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN RTN U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_min_rtn_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp", "example": "ds_min_rtn_u32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 427, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_min_rtn_u64", "mnemonic": "ds_min_rtn_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN RTN U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the minimum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value. Store the original value from data share into a vector register.", "syntax": "ds_min_rtn_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp", "example": "ds_min_rtn_u64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 447, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_min_src2_f32", "mnemonic": "ds_min_src2_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN SRC2 F32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_min_src2_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_min_src2_f64", "mnemonic": "ds_min_src2_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN SRC2 F64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_min_src2_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_min_src2_i32", "mnemonic": "ds_min_src2_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN SRC2 I32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on i32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_min_src2_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_min_src2_i64", "mnemonic": "ds_min_src2_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN SRC2 I64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on i64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_min_src2_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_min_src2_u32", "mnemonic": "ds_min_src2_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN SRC2 U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_min_src2_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_min_src2_u64", "mnemonic": "ds_min_src2_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN SRC2 U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_min_src2_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_min_u32", "mnemonic": "ds_min_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_min_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp", "example": "ds_min_u32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 420, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_min_u64", "mnemonic": "ds_min_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MIN U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in a data share.", "description": "Select the minimum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in a data share. Update the data share with the selected value.", "syntax": "ds_min_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp", "example": "ds_min_u64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 439, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_mskor_b32", "mnemonic": "ds_mskor_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MSKOR B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate masked bitwise OR on an unsigned 32-bit integer location in a data share, given mask value and bits to OR in the data registers.", "description": "Calculate masked bitwise OR on an unsigned 32-bit integer location in a data share, given mask value and bits to OR in the data registers.", "syntax": "ds_mskor_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = ((tmp & ~DATA.b32) | DATA2.b32);\nRETURN_DATA.b32 = tmp", "example": "ds_mskor_b32 v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 421, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_mskor_b64", "mnemonic": "ds_mskor_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MSKOR B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate masked bitwise OR on an unsigned 64-bit integer location in a data share, given mask value and bits to OR in the data registers.", "description": "Calculate masked bitwise OR on an unsigned 64-bit integer location in a data share, given mask value and bits to OR in the data registers.", "syntax": "ds_mskor_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = ((tmp & ~DATA.b64) | DATA2.b64);\nRETURN_DATA.b64 = tmp", "example": "ds_mskor_b64 v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 441, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_mskor_rtn_b32", "mnemonic": "ds_mskor_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MSKOR RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate masked bitwise OR on an unsigned 32-bit integer location in a data share, given mask value and bits to OR in the data registers.", "description": "Calculate masked bitwise OR on an unsigned 32-bit integer location in a data share, given mask value and bits to OR in the data registers.", "syntax": "ds_mskor_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = ((tmp & ~DATA.b32) | DATA2.b32);\nRETURN_DATA.b32 = tmp", "example": "ds_mskor_rtn_b32 v5, v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 428, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_mskor_rtn_b64", "mnemonic": "ds_mskor_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS MSKOR RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate masked bitwise OR on an unsigned 64-bit integer location in a data share, given mask value and bits to OR in the data registers.", "description": "Calculate masked bitwise OR on an unsigned 64-bit integer location in a data share, given mask value and bits to OR in the data registers.", "syntax": "ds_mskor_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = ((tmp & ~DATA.b64) | DATA2.b64);\nRETURN_DATA.b64 = tmp", "example": "ds_mskor_rtn_b64 v[5:6], v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 448, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_nop", "mnemonic": "ds_nop", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS NOP", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Do nothing.", "description": "Do nothing.", "syntax": "ds_nop", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 423, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_or_b32", "mnemonic": "ds_or_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS OR B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in a data share.", "description": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in a data share.", "syntax": "ds_or_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp", "example": "ds_or_b32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 421, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_or_b64", "mnemonic": "ds_or_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS OR B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 64-bit integer values stored in the data register and a location in a data share.", "description": "Calculate bitwise OR given two unsigned 64-bit integer values stored in the data register and a location in a data share.", "syntax": "ds_or_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp", "example": "ds_or_b64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 440, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_or_rtn_b32", "mnemonic": "ds_or_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS OR RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in a data share.", "description": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_or_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp", "example": "ds_or_rtn_b32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 428, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_or_rtn_b64", "mnemonic": "ds_or_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS OR RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 64-bit integer values stored in the data register and a location in a data share.", "description": "Calculate bitwise OR given two unsigned 64-bit integer values stored in the data register and a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_or_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp", "example": "ds_or_rtn_b64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 448, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_or_src2_b32", "mnemonic": "ds_or_src2_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS OR SRC2 B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_or_src2_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_or_src2_b64", "mnemonic": "ds_or_src2_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS OR SRC2 B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_or_src2_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_ordered_count", "mnemonic": "ds_ordered_count", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS ORDERED COUNT", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "GDS-only.", "description": "GDS-only. Add (count_bits(exec_mask)) to one of 4 dedicated ordered-count counters (aka 'packers'). Additional bits of instr.offset field are overloaded to hold packer-id, 'last'.", "syntax": "ds_ordered_count", "operands": [], "dataTypes": [], "semantics": "", "example": "ds_ordered_count v5, v1 gds", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_param_load", "mnemonic": "ds_param_load", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS PARAM LOAD", "category": "LDS Direct / Parameter Fetch", "instructionClass": "vector", "summary": "Transfer parameter data from LDS to VGPRs and expand data in LDS using the NewPrimMask (provided in M0) to place per-quad data into lanes 0-3 of each…", "description": "Transfer parameter data from LDS to VGPRs and expand data in LDS using the NewPrimMask (provided in M0) to place per-quad data into lanes 0-3 of each quad as follows:", "syntax": "ds_param_load", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DSDIR"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_permute_b32", "mnemonic": "ds_permute_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS PERMUTE B32", "category": "Lane Operations", "instructionClass": "vector", "summary": "Forward-permute: each lane sends its value to a lane index computed by another lane, via the LDS crossbar (no LDS storage consumed).", "description": "Forward permute. This does not access LDS memory and may be called even if no LDS memory is allocated to the wave. It uses LDS to implement an arbitrary swizzle across threads in a wavefront.", "syntax": "ds_permute_b32 VDST, ADDR, DATA", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "ADDR", "desc": "Per-lane destination-lane selector"}, {"name": "DATA", "desc": "Per-lane value to send"}], "dataTypes": ["b32"], "semantics": "VDST[dst_lane(lane)] = DATA[lane], where dst_lane is computed per-lane from ADDR; lanes that receive no value read undefined/zero depending on target.", "example": "ds_permute_b32  v1, v0, v2   // v1[lane] = v2[dest_lane(v0[lane])]", "exampleSource": null, "encoding": {"format": "DS", "widthBits": 32}, "executionUnit": "LDS Unit", "registerClasses": ["VGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.ds_pk_add_bf16", "mnemonic": "ds_pk_add_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS PK ADD BF16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Add a packed 2-component BF16 float value in the data register to a location in a data share.", "description": "Add a packed 2-component BF16 float value in the data register to a location in a data share.", "syntax": "ds_pk_add_bf16", "operands": [], "dataTypes": [], "semantics": "tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].bf16 = tmp[31 : 16].bf16 + src[31 : 16].bf16;\ndst[15 : 0].bf16 = tmp[15 : 0].bf16 + src[15 : 0].bf16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 424, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_pk_add_f16", "mnemonic": "ds_pk_add_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS PK ADD F16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Add a packed 2-component half-precision float value in the data register to a location in a data share.", "description": "Add a packed 2-component half-precision float value in the data register to a location in a data share.", "syntax": "ds_pk_add_f16", "operands": [], "dataTypes": ["f16"], "semantics": "tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].f16 = tmp[31 : 16].f16 + src[31 : 16].f16;\ndst[15 : 0].f16 = tmp[15 : 0].f16 + src[15 : 0].f16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 424, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_pk_add_rtn_bf16", "mnemonic": "ds_pk_add_rtn_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS PK ADD RTN BF16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Add a packed 2-component BF16 float value in the data register to a location in a data share.", "description": "Add a packed 2-component BF16 float value in the data register to a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_pk_add_rtn_bf16", "operands": [], "dataTypes": [], "semantics": "tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].bf16 = tmp[31 : 16].bf16 + src[31 : 16].bf16;\ndst[15 : 0].bf16 = tmp[15 : 0].bf16 + src[15 : 0].bf16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 455, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_pk_add_rtn_f16", "mnemonic": "ds_pk_add_rtn_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS PK ADD RTN F16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Add a packed 2-component half-precision float value in the data register to a location in a data share.", "description": "Add a packed 2-component half-precision float value in the data register to a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_pk_add_rtn_f16", "operands": [], "dataTypes": ["f16"], "semantics": "tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].f16 = tmp[31 : 16].f16 + src[31 : 16].f16;\ndst[15 : 0].f16 = tmp[15 : 0].f16 + src[15 : 0].f16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 455, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.ds_read2_b32", "mnemonic": "ds_read2_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ2 B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 32 bits of data from one location in a data share and then 32 bits of data from a second location in a data share and store the results into a…", "description": "Load 32 bits of data from one location in a data share and then 32 bits of data from a second location in a data share and store the results into a 64-bit vector register.", "syntax": "ds_read2_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET0.u32 * 4U].b32;\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET1.u32 * 4U].b32", "example": "ds_read2_b32 v[5:6], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 432, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read2_b64", "mnemonic": "ds_read2_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ2 B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 64 bits of data from one location in a data share and then 64 bits of data from a second location in a data share and store the results into a…", "description": "Load 64 bits of data from one location in a data share and then 64 bits of data from a second location in a data share and store the results into a 128-bit vector register.", "syntax": "ds_read2_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET0.u32 * 8U].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET0.u32 * 8U + 4U].b32;\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[95 : 64] = MEM[addr + OFFSET1.u32 * 8U].b32;\nRETURN_DATA[127 : 96] = MEM[addr + OFFSET1.u32 * 8U + 4U].b32", "example": "ds_read2_b64 v[5:8], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 451, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read2st64_b32", "mnemonic": "ds_read2st64_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ2ST64 B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 32 bits of data from one location in a data share and then 32 bits of data from a second location in a data share and store the results into a…", "description": "Load 32 bits of data from one location in a data share and then 32 bits of data from a second location in a data share and store the results into a 64-bit vector register. Treat each offset as an index and multiply by a stride of 64 elements (256 bytes) to generate an offset for each DS address.", "syntax": "ds_read2st64_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET0.u32 * 256U].b32;\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET1.u32 * 256U].b32", "example": "ds_read2st64_b32 v[5:6], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 432, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read2st64_b64", "mnemonic": "ds_read2st64_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ2ST64 B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 64 bits of data from one location in a data share and then 64 bits of data from a second location in a data share and store the results into a…", "description": "Load 64 bits of data from one location in a data share and then 64 bits of data from a second location in a data share and store the results into a 128-bit vector register. Treat each offset as an index and multiply by a stride of 64 elements (256 bytes) to generate an offset for each DS address.", "syntax": "ds_read2st64_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET0.u32 * 512U].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET0.u32 * 512U + 4U].b32;\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[95 : 64] = MEM[addr + OFFSET1.u32 * 512U].b32;\nRETURN_DATA[127 : 96] = MEM[addr + OFFSET1.u32 * 512U + 4U].b32", "example": "ds_read2st64_b64 v[5:8], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 451, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_addtid_b32", "mnemonic": "ds_read_addtid_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ ADDTID B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 32 bits of data from a data share into a vector register.", "description": "Load 32 bits of data from a data share into a vector register. The memory base address is provided as an immediate value and the lane ID is used as an offset.", "syntax": "ds_read_addtid_b32", "operands": [], "dataTypes": ["b32"], "semantics": "declare OFFSET0 : 8'U;\ndeclare OFFSET1 : 8'U;\nRETURN_DATA.u32 = MEM[32'I({ OFFSET1, OFFSET0 } + M0[15 : 0]) + laneID.i32 * 4].u32", "example": "ds_read_addtid_b32 v5", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 455, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_b128", "mnemonic": "ds_read_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ B128", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 128 bits of data from a data share into a vector register.", "description": "Load 128 bits of data from a data share into a vector register.", "syntax": "ds_read_b128", "operands": [], "dataTypes": [], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET.u32].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET.u32 + 4U].b32;\nRETURN_DATA[95 : 64] = MEM[addr + OFFSET.u32 + 8U].b32;\nRETURN_DATA[127 : 96] = MEM[addr + OFFSET.u32 + 12U].b32", "example": "ds_read_b128 v[5:8], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 457, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_b32", "mnemonic": "ds_read_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Read one 32-bit value per lane from the Local Data Share (LDS).", "description": "Load 32 bits of data from a data share into a vector register.", "syntax": "ds_read_b32 VDST, ADDR, offset", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "ADDR", "desc": "Per-lane LDS byte address (VGPR)"}, {"name": "offset", "desc": "Immediate byte offset"}], "dataTypes": ["b32"], "semantics": "VDST[lane] = LDS[ADDR[lane] + offset] for each active lane.", "example": "ds_read_b32  v1, v0   // v1 = LDS[v0]", "exampleSource": null, "encoding": {"format": "DS", "widthBits": 32}, "executionUnit": "LDS Unit", "registerClasses": ["VGPR"], "memorySegment": "LDS/shared", "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.ds_read_b64", "mnemonic": "ds_read_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 64 bits of data from a data share into a vector register.", "description": "Load 64 bits of data from a data share into a vector register.", "syntax": "ds_read_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET.u32].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET.u32 + 4U].b32", "example": "ds_read_b64 v[5:6], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 451, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_b64_tr_b16", "mnemonic": "ds_read_b64_tr_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ B64 TR B16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Read 64 bits of data per lane from data share.", "description": "Read 64 bits of data per lane from data share. Interpret the data as a matrix with 16 bit elements and transpose the matrix. Store the result into vector registers.", "syntax": "ds_read_b64_tr_b16", "operands": [], "dataTypes": ["b16", "b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_read_b64_tr_b4", "mnemonic": "ds_read_b64_tr_b4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ B64 TR B4", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Read 64 bits of data per lane from data share.", "description": "Read 64 bits of data per lane from data share. Interpret the data as a matrix with 4 bit elements and transpose the matrix. Store the result into vector registers.", "syntax": "ds_read_b64_tr_b4", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_read_b64_tr_b8", "mnemonic": "ds_read_b64_tr_b8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ B64 TR B8", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Read 64 bits of data per lane from data share.", "description": "Read 64 bits of data per lane from data share. Interpret the data as a matrix with 8 bit elements and transpose the matrix. Store the result into vector registers.", "syntax": "ds_read_b64_tr_b8", "operands": [], "dataTypes": ["b64", "b8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_read_b96", "mnemonic": "ds_read_b96", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ B96", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 96 bits of data from a data share into a vector register.", "description": "Load 96 bits of data from a data share into a vector register.", "syntax": "ds_read_b96", "operands": [], "dataTypes": [], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET.u32].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET.u32 + 4U].b32;\nRETURN_DATA[95 : 64] = MEM[addr + OFFSET.u32 + 8U].b32", "example": "ds_read_b96 v[5:7], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 457, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_b96_tr_b6", "mnemonic": "ds_read_b96_tr_b6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ B96 TR B6", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Read 96 bits of data per lane from data share.", "description": "Read 96 bits of data per lane from data share. Interpret the data as a matrix with 6 bit elements and transpose the matrix. Store the result into vector registers.", "syntax": "ds_read_b96_tr_b6", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_read_i16", "mnemonic": "ds_read_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ I16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 16 bits of signed data from a data share, sign extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of signed data from a data share, sign extend to 32 bits and store the result into a vector register.", "syntax": "ds_read_i16", "operands": [], "dataTypes": ["i16"], "semantics": "RETURN_DATA.i32 = 32'I(signext(MEM[ADDR].i16))", "example": "ds_read_i16 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 433, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_i8", "mnemonic": "ds_read_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ I8", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 8 bits of signed data from a data share, sign extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of signed data from a data share, sign extend to 32 bits and store the result into a vector register.", "syntax": "ds_read_i8", "operands": [], "dataTypes": ["i8"], "semantics": "RETURN_DATA.i32 = 32'I(signext(MEM[ADDR].i8))", "example": "ds_read_i8 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 432, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_i8_d16", "mnemonic": "ds_read_i8_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ I8 D16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 8 bits of signed data from a data share, sign extend to 16 bits and store the result into the low 16 bits of a vector register.", "description": "Load 8 bits of signed data from a data share, sign extend to 16 bits and store the result into the low 16 bits of a vector register.", "syntax": "ds_read_i8_d16", "operands": [], "dataTypes": ["i8"], "semantics": "RETURN_DATA[15 : 0].i16 = 16'I(signext(MEM[ADDR].i8));\n// RETURN_DATA[31:16] is preserved.", "example": "ds_read_i8_d16 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 444, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_i8_d16_hi", "mnemonic": "ds_read_i8_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ I8 D16 HI", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 8 bits of signed data from a data share, sign extend to 16 bits and store the result into the high 16 bits of a vector register.", "description": "Load 8 bits of signed data from a data share, sign extend to 16 bits and store the result into the high 16 bits of a vector register.", "syntax": "ds_read_i8_d16_hi", "operands": [], "dataTypes": ["i8"], "semantics": "RETURN_DATA[31 : 16].i16 = 16'I(signext(MEM[ADDR].i8));\n// RETURN_DATA[15:0] is preserved.", "example": "ds_read_i8_d16_hi v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 444, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_u16", "mnemonic": "ds_read_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ U16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from a data share, zero extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of unsigned data from a data share, zero extend to 32 bits and store the result into a vector register.", "syntax": "ds_read_u16", "operands": [], "dataTypes": ["u16"], "semantics": "RETURN_DATA.u32 = 32'U({ 16'0U, MEM[ADDR].u16 })", "example": "ds_read_u16 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 433, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_u16_d16", "mnemonic": "ds_read_u16_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ U16 D16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from a data share and store the result into the low 16 bits of a vector register.", "description": "Load 16 bits of unsigned data from a data share and store the result into the low 16 bits of a vector register.", "syntax": "ds_read_u16_d16", "operands": [], "dataTypes": ["u16"], "semantics": "RETURN_DATA[15 : 0].u16 = MEM[ADDR].u16;\n// RETURN_DATA[31:16] is preserved.", "example": "ds_read_u16_d16 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 444, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_u16_d16_hi", "mnemonic": "ds_read_u16_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ U16 D16 HI", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from a data share and store the result into the high 16 bits of a vector register.", "description": "Load 16 bits of unsigned data from a data share and store the result into the high 16 bits of a vector register.", "syntax": "ds_read_u16_d16_hi", "operands": [], "dataTypes": ["u16"], "semantics": "RETURN_DATA[31 : 16].u16 = MEM[ADDR].u16;\n// RETURN_DATA[15:0] is preserved.", "example": "ds_read_u16_d16_hi v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 444, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_u8", "mnemonic": "ds_read_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ U8", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from a data share, zero extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of unsigned data from a data share, zero extend to 32 bits and store the result into a vector register.", "syntax": "ds_read_u8", "operands": [], "dataTypes": ["u8"], "semantics": "RETURN_DATA.u32 = 32'U({ 24'0U, MEM[ADDR].u8 })", "example": "ds_read_u8 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 432, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_u8_d16", "mnemonic": "ds_read_u8_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ U8 D16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from a data share, zero extend to 16 bits and store the result into the low 16 bits of a vector register.", "description": "Load 8 bits of unsigned data from a data share, zero extend to 16 bits and store the result into the low 16 bits of a vector register.", "syntax": "ds_read_u8_d16", "operands": [], "dataTypes": ["u8"], "semantics": "RETURN_DATA[15 : 0].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// RETURN_DATA[31:16] is preserved.", "example": "ds_read_u8_d16 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 443, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_read_u8_d16_hi", "mnemonic": "ds_read_u8_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS READ U8 D16 HI", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from a data share, zero extend to 16 bits and store the result into the high 16 bits of a vector register.", "description": "Load 8 bits of unsigned data from a data share, zero extend to 16 bits and store the result into the high 16 bits of a vector register.", "syntax": "ds_read_u8_d16_hi", "operands": [], "dataTypes": ["u8"], "semantics": "RETURN_DATA[31 : 16].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// RETURN_DATA[15:0] is preserved.", "example": "ds_read_u8_d16_hi v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 444, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_rsub_rtn_u32", "mnemonic": "ds_rsub_rtn_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS RSUB RTN U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value stored in a location in a data share from a value stored in the data register.", "description": "Subtract an unsigned 32-bit integer value stored in a location in a data share from a value stored in the data register. Store the original value from data share into a vector register.", "syntax": "ds_rsub_rtn_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 = DATA.u32 - MEM[addr].u32;\nRETURN_DATA.u32 = tmp", "example": "ds_rsub_rtn_u32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 426, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_rsub_rtn_u64", "mnemonic": "ds_rsub_rtn_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS RSUB RTN U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract an unsigned 64-bit integer value stored in a location in a data share from a value stored in the data register.", "description": "Subtract an unsigned 64-bit integer value stored in a location in a data share from a value stored in the data register. Store the original value from data share into a vector register.", "syntax": "ds_rsub_rtn_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 = DATA.u64 - MEM[addr].u64;\nRETURN_DATA.u64 = tmp", "example": "ds_rsub_rtn_u64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 445, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_rsub_src2_u32", "mnemonic": "ds_rsub_src2_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS RSUB SRC2 U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_rsub_src2_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_rsub_src2_u64", "mnemonic": "ds_rsub_src2_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS RSUB SRC2 U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_rsub_src2_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_rsub_u32", "mnemonic": "ds_rsub_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS RSUB U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value stored in a location in a data share from a value stored in the data register.", "description": "Subtract an unsigned 32-bit integer value stored in a location in a data share from a value stored in the data register.", "syntax": "ds_rsub_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 = DATA.u32 - MEM[addr].u32;\nRETURN_DATA.u32 = tmp", "example": "ds_rsub_u32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 419, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_rsub_u64", "mnemonic": "ds_rsub_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS RSUB U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract an unsigned 64-bit integer value stored in a location in a data share from a value stored in the data register.", "description": "Subtract an unsigned 64-bit integer value stored in a location in a data share from a value stored in the data register.", "syntax": "ds_rsub_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 = DATA.u64 - MEM[addr].u64;\nRETURN_DATA.u64 = tmp", "example": "ds_rsub_u64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 438, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_2addr_b32", "mnemonic": "ds_store_2addr_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE 2ADDR B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 32 bits of data from one vector input register and then 32 bits of data from a second vector input register into a data share.", "description": "Store 32 bits of data from one vector input register and then 32 bits of data from a second vector input register into a data share.", "syntax": "ds_store_2addr_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_store_2addr_b32 v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_2addr_b64", "mnemonic": "ds_store_2addr_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE 2ADDR B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 64 bits of data from one vector input register and then 64 bits of data from a second vector input register into a data share.", "description": "Store 64 bits of data from one vector input register and then 64 bits of data from a second vector input register into a data share.", "syntax": "ds_store_2addr_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "ds_store_2addr_b64 v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_2addr_stride64_b32", "mnemonic": "ds_store_2addr_stride64_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE 2ADDR STRIDE64 B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 32 bits of data from one vector input register and then 32 bits of data from a second vector input register into a data share.", "description": "Store 32 bits of data from one vector input register and then 32 bits of data from a second vector input register into a data share. Treat each offset as an index and multiply by a stride of 64 elements (256 bytes) to generate an offset for each DS address.", "syntax": "ds_store_2addr_stride64_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_store_2addr_stride64_b32 v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_2addr_stride64_b64", "mnemonic": "ds_store_2addr_stride64_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE 2ADDR STRIDE64 B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 64 bits of data from one vector input register and then 64 bits of data from a second vector input register into a data share.", "description": "Store 64 bits of data from one vector input register and then 64 bits of data from a second vector input register into a data share. Treat each offset as an index and multiply by a stride of 64 elements (256 bytes) to generate an offset for each DS address.", "syntax": "ds_store_2addr_stride64_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "ds_store_2addr_stride64_b64 v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_addtid_b32", "mnemonic": "ds_store_addtid_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE ADDTID B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 32 bits of data from a vector input register into a data share.", "description": "Store 32 bits of data from a vector input register into a data share. The memory base address is provided as an immediate value and the lane ID is used as an offset.", "syntax": "ds_store_addtid_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_store_addtid_b32 v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_b128", "mnemonic": "ds_store_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE B128", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 128 bits of data from a vector input register into a data share.", "description": "Store 128 bits of data from a vector input register into a data share.", "syntax": "ds_store_b128", "operands": [], "dataTypes": [], "semantics": "", "example": "ds_store_b128 v1, v[2:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_b16", "mnemonic": "ds_store_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE B16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 16 bits of data from a vector register into a data share.", "description": "Store 16 bits of data from a vector register into a data share.", "syntax": "ds_store_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "ds_store_b16 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_b16_d16_hi", "mnemonic": "ds_store_b16_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE B16 D16 HI", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 16 bits of data from the high bits of a vector register into a data share.", "description": "Store 16 bits of data from the high bits of a vector register into a data share.", "syntax": "ds_store_b16_d16_hi", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "ds_store_b16_d16_hi v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_b32", "mnemonic": "ds_store_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 32 bits of data from a vector input register into a data share.", "description": "Store 32 bits of data from a vector input register into a data share.", "syntax": "ds_store_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_store_b32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_b64", "mnemonic": "ds_store_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 64 bits of data from a vector input register into a data share.", "description": "Store 64 bits of data from a vector input register into a data share.", "syntax": "ds_store_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "ds_store_b64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_b8", "mnemonic": "ds_store_b8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE B8", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 8 bits of data from a vector register into a data share.", "description": "Store 8 bits of data from a vector register into a data share.", "syntax": "ds_store_b8", "operands": [], "dataTypes": ["b8"], "semantics": "", "example": "ds_store_b8 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_b8_d16_hi", "mnemonic": "ds_store_b8_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE B8 D16 HI", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 8 bits of data from the high bits of a vector register into a data share.", "description": "Store 8 bits of data from the high bits of a vector register into a data share.", "syntax": "ds_store_b8_d16_hi", "operands": [], "dataTypes": ["b8"], "semantics": "", "example": "ds_store_b8_d16_hi v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_store_b96", "mnemonic": "ds_store_b96", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STORE B96", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 96 bits of data from a vector input register into a data share.", "description": "Store 96 bits of data from a vector input register into a data share.", "syntax": "ds_store_b96", "operands": [], "dataTypes": [], "semantics": "", "example": "ds_store_b96 v1, v[2:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_storexchg_2addr_rtn_b32", "mnemonic": "ds_storexchg_2addr_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STOREXCHG 2ADDR RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Swap two unsigned 32-bit integer values in the data registers with two locations in a data share.", "description": "Swap two unsigned 32-bit integer values in the data registers with two locations in a data share.", "syntax": "ds_storexchg_2addr_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_storexchg_2addr_rtn_b32 v[5:6], v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_storexchg_2addr_rtn_b64", "mnemonic": "ds_storexchg_2addr_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STOREXCHG 2ADDR RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Swap two unsigned 64-bit integer values in the data registers with two locations in a data share.", "description": "Swap two unsigned 64-bit integer values in the data registers with two locations in a data share.", "syntax": "ds_storexchg_2addr_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "ds_storexchg_2addr_rtn_b64 v[5:8], v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_storexchg_2addr_stride64_rtn_b32", "mnemonic": "ds_storexchg_2addr_stride64_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STOREXCHG 2ADDR STRIDE64 RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Swap two unsigned 32-bit integer values in the data registers with two locations in a data share.", "description": "Swap two unsigned 32-bit integer values in the data registers with two locations in a data share. Treat each offset as an index and multiply by a stride of 64 elements (256 bytes) to generate an offset for each DS address.", "syntax": "ds_storexchg_2addr_stride64_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_storexchg_2addr_stride64_rtn_b32 v[5:6], v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_storexchg_2addr_stride64_rtn_b64", "mnemonic": "ds_storexchg_2addr_stride64_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STOREXCHG 2ADDR STRIDE64 RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Swap two unsigned 64-bit integer values in the data registers with two locations in a data share.", "description": "Swap two unsigned 64-bit integer values in the data registers with two locations in a data share. Treat each offset as an index and multiply by a stride of 64 elements (256 bytes) to generate an offset for each DS address.", "syntax": "ds_storexchg_2addr_stride64_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "ds_storexchg_2addr_stride64_rtn_b64 v[5:8], v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_storexchg_rtn_b32", "mnemonic": "ds_storexchg_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STOREXCHG RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Swap an unsigned 32-bit integer value in the data register with a location in a data share.", "description": "Swap an unsigned 32-bit integer value in the data register with a location in a data share.", "syntax": "ds_storexchg_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "ds_storexchg_rtn_b32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_storexchg_rtn_b64", "mnemonic": "ds_storexchg_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS STOREXCHG RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Swap an unsigned 64-bit integer value in the data register with a location in a data share.", "description": "Swap an unsigned 64-bit integer value in the data register with a location in a data share.", "syntax": "ds_storexchg_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "ds_storexchg_rtn_b64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_sub_clamp_rtn_u32", "mnemonic": "ds_sub_clamp_rtn_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS SUB CLAMP RTN U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer location in a data share from a value in the data register and clamp the result to zero.", "description": "Subtract an unsigned 32-bit integer location in a data share from a value in the data register and clamp the result to zero. Store the original value from data share into a vector register.", "syntax": "ds_sub_clamp_rtn_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_sub_clamp_u32", "mnemonic": "ds_sub_clamp_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS SUB CLAMP U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer location in a data share from a value in the data register and clamp the result to zero.", "description": "Subtract an unsigned 32-bit integer location in a data share from a value in the data register and clamp the result to zero.", "syntax": "ds_sub_clamp_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.ds_sub_gs_reg_rtn", "mnemonic": "ds_sub_gs_reg_rtn", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS SUB GS REG RTN", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Perform an atomic subtraction from data in specific registers embedded in GDS rather than operating on GDS memory directly.", "description": "Perform an atomic subtraction from data in specific registers embedded in GDS rather than operating on GDS memory directly. This instruction returns the pre-op value. This instruction is only used by the GS stage and is used to facilitate streamout.", "syntax": "ds_sub_gs_reg_rtn", "operands": [], "dataTypes": [], "semantics": "", "example": "ds_sub_gs_reg_rtn v[5:6], v1 gds", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_sub_rtn_u32", "mnemonic": "ds_sub_rtn_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS SUB RTN U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in a data share.", "description": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_sub_rtn_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp", "example": "ds_sub_rtn_u32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 425, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_sub_rtn_u64", "mnemonic": "ds_sub_rtn_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS SUB RTN U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract an unsigned 64-bit integer value stored in the data register from a value stored in a location in a data share.", "description": "Subtract an unsigned 64-bit integer value stored in the data register from a value stored in a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_sub_rtn_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp", "example": "ds_sub_rtn_u64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 445, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_sub_src2_u32", "mnemonic": "ds_sub_src2_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS SUB SRC2 U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_sub_src2_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_sub_src2_u64", "mnemonic": "ds_sub_src2_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS SUB SRC2 U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_sub_src2_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_sub_u32", "mnemonic": "ds_sub_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS SUB U32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in a data share.", "description": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in a data share.", "syntax": "ds_sub_u32", "operands": [], "dataTypes": ["u32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp", "example": "ds_sub_u32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 418, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_sub_u64", "mnemonic": "ds_sub_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS SUB U64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Subtract an unsigned 64-bit integer value stored in the data register from a value stored in a location in a data share.", "description": "Subtract an unsigned 64-bit integer value stored in the data register from a value stored in a location in a data share.", "syntax": "ds_sub_u64", "operands": [], "dataTypes": ["u64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp", "example": "ds_sub_u64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 438, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_swizzle_b32", "mnemonic": "ds_swizzle_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS SWIZZLE B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Dword swizzle, no data is written to LDS memory.", "description": "Dword swizzle, no data is written to LDS memory. Swizzles input thread data based on offset mask and returns; note does not read or write the DS memory banks. Note that reading from an invalid thread results in 0x0. This opcode supports two specific modes, FFT and rotate, plus two basic modes which swizzle in groups of 4 or 32 consecutive threads.", "syntax": "ds_swizzle_b32", "operands": [], "dataTypes": ["b32"], "semantics": "The FFT mode (offset >= 0xe000) swizzles the input based on offset[4:0] to support FFT calculation. Example\nswizzles using input {1, 2, … 20} are:\nOffset[4:0]: Swizzle\n0x00: {1,11,9,19,5,15,d,1d,3,13,b,1b,7,17,f,1f,2,12,a,1a,6,16,e,1e,4,14,c,1c,8,18,10,20}\n0x10: {1,9,5,d,3,b,7,f,2,a,6,e,4,c,8,10,11,19,15,1d,13,1b,17,1f,12,1a,16,1e,14,1c,18,20}\n0x1f: No swizzle\nThe rotate mode (offset >= 0xc000 and offset < 0xe000) rotates the input either left (offset[10] == 0) or right\n(offset[10] == 1) a number of threads equal to offset[9:5]. The rotate mode also uses a mask value which can\nalter the rotate result. For example, mask == 1 swaps the odd threads across every other even thread (rotate\nleft), or even threads across every other odd thread (rotate right).\nOffset[9:5]: Swizzle\n0x01, mask=0, rotate left:\n{2,3,4,5,6,7,8,9,a,b,c,d,e,f,10,11,12,13,14,15,16,17,18,19,1a,1b,1c,1d,1e,1f,20,1}\n0x01, mask=0, rotate right:\n{20,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,10,11,12,13,14,15,16,17,18,19,1a,1b,1c,1d,1e,1f}\n0x01, mask=1, rotate left:\n{1,4,3,6,5,8,7,a,9,c,b,e,d,10,f,12,11,14,13,16,15,18,17,1a,19,1c,1b,1e,1d,20,1f,2}\n0x01, mask=1, rotate right:\n{1f,2,1,4,3,6,5,8,7,a,9,c,b,e,d,10,f,12,11,14,13,16,15,18,17,1a,19,1c,1b,1e,1d,20}\nIf offset < 0xc000, one of the basic swizzle modes is used based on offset[15]. If offset[15] == 1, groups of 4\nconsecutive threads are swizzled together. If offset[15] == 0, all 32 threads are swizzled together.\nThe first basic swizzle mode (when offset[15] == 1) allows full data sharing between a group of 4 consecutive\nthreads. Any thread within the group of 4 can get data from any other thread within the group of 4, specified by\nthe corresponding offset bits --- [1:0] for the first thread, [3:2] for the second thread, [5:4] for the third thread,\n[7:6] for the fourth thread. Note that the offset bits apply to all groups of 4 within a wavefront; thus if offset[1:0]\n== 1, then thread0 grabs thread1, thread4 grabs thread5, etc.\nThe second basic swizzle mode (when offset[15] == 0) allows limited data sharing between 32 consecutive\nthreads. In this case, the offset is used to specify a 5-bit xor-mask, 5-bit or-mask, and 5-bit and-mask used to\ngenerate a thread mapping. Note that the offset bits apply to each group of 32 within a wavefront. The details of\nthe thread mapping are listed below. Some example usages:\nSWAPX16 : xor_mask = 0x10, or_mask = 0x00, and_mask = 0x1f\nSWAPX8 : xor_mask = 0x08, or_mask = 0x00, and_mask = 0x1f\nSWAPX4 : xor_mask = 0x04, or_mask = 0x00, and_mask = 0x1f\nSWAPX2 : xor_mask = 0x02, or_mask = 0x00, and_mask = 0x1f\nSWAPX1 : xor_mask = 0x01, or_mask = 0x00, and_mask = 0x1f\nREVERSEX32 : xor_mask = 0x1f, or_mask = 0x00, and_mask = 0x1f\nREVERSEX16 : xor_mask = 0x0f, or_mask = 0x00, and_mask = 0x1f\nREVERSEX8 : xor_mask = 0x07, or_mask = 0x00, and_mask = 0x1f\nREVERSEX4 : xor_mask = 0x03, or_mask = 0x00, and_mask = 0x1f\nREVERSEX2 : xor_mask = 0x01 or_mask = 0x00, and_mask = 0x1f\nBCASTX32: xor_mask = 0x00, or_mask = thread, and_mask = 0x00\nBCASTX16: xor_mask = 0x00, or_mask = thread, and_mask = 0x10\nBCASTX8: xor_mask = 0x00, or_mask = thread, and_mask = 0x18\nBCASTX4: xor_mask = 0x00, or_mask = thread, and_mask = 0x1c\nBCASTX2: xor_mask = 0x00, or_mask = thread, and_mask = 0x1e\nPseudocode follows:\noffset = offset1:offset0;\nif (offset >= 0xe000) {\n// FFT decomposition\nmask = offset[4:0];\nfor (i = 0; i < 64; i++) {\nj = reverse_bits(i & 0x1f);\nj = (j >> count_ones(mask));\nj |= (i & mask);\nj |= i & 0x20;\nthread_out[i] = thread_valid[j] ? thread_in[j] : 0;\n}\n} elsif (offset >= 0xc000) {\n// rotate\nrotate = offset[9:5];\nmask = offset[4:0];\nif (offset[10]) {\nrotate = -rotate;\n}\nfor (i = 0; i < 64; i++) {\nj = (i & mask) | ((i + rotate) & ~mask);\nj |= i & 0x20;\nthread_out[i] = thread_valid[j] ? thread_in[j] : 0;\n}\n} elsif (offset[15]) {\n// full data sharing within 4 consecutive threads\nfor (i = 0; i < 64; i+=4) {\nthread_out[i+0] = thread_valid[i+offset[1:0]]?thread_in[i+offset[1:0]]:0;\nthread_out[i+1] = thread_valid[i+offset[3:2]]?thread_in[i+offset[3:2]]:0;\nthread_out[i+2] = thread_valid[i+offset[5:4]]?thread_in[i+offset[5:4]]:0;\nthread_out[i+3] = thread_valid[i+offset[7:6]]?thread_in[i+offset[7:6]]:0;\n}\n} else { // offset[15] == 0\n// limited data sharing within 32 consecutive threads\nxor_mask = offset[14:10];\nor_mask = offset[9:5];\nand_mask = offset[4:0];\nfor (i = 0; i < 64; i++) {\nj = (((i & 0x1f) & and_mask) | or_mask) ^ xor_mask;\nj |= (i & 0x20); // which group of 32\nthread_out[i] = thread_valid[j] ? thread_in[j] : 0;\n}\n}", "example": "ds_swizzle_b32 v8, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 433, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_wrap_rtn_b32", "mnemonic": "ds_wrap_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRAP RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Given a minuend from a location in data share and a subtrahend from a vector register, subtract the two values iff the result is nonnegative…", "description": "Given a minuend from a location in data share and a subtrahend from a vector register, subtract the two values iff the result is nonnegative; otherwise add a value from a second vector register to the memory location. This calculation provides flexible wraparound semantics for subtraction.", "syntax": "ds_wrap_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 = tmp >= DATA.u32 ? tmp - DATA.u32 : tmp + DATA2.u32;\nRETURN_DATA = tmp", "example": "ds_wrap_rtn_b32 v5, v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This instruction is designed to for use in ring buffer management.", "sourcePdfPage": 431, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write2_b32", "mnemonic": "ds_write2_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE2 B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 32 bits of data from one vector input register and then 32 bits of data from a second vector input register into a data share.", "description": "Store 32 bits of data from one vector input register and then 32 bits of data from a second vector input register into a data share.", "syntax": "ds_write2_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET0.u32 * 4U].b32 = DATA[31 : 0];\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET1.u32 * 4U].b32 = DATA2[31 : 0]", "example": "ds_write2_b32 v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 422, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write2_b64", "mnemonic": "ds_write2_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE2 B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 64 bits of data from one vector input register and then 64 bits of data from a second vector input register into a data share.", "description": "Store 64 bits of data from one vector input register and then 64 bits of data from a second vector input register into a data share.", "syntax": "ds_write2_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET0.u32 * 8U].b32 = DATA[31 : 0];\nMEM[addr + OFFSET0.u32 * 8U + 4U].b32 = DATA[63 : 32];\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET1.u32 * 8U].b32 = DATA2[31 : 0];\nMEM[addr + OFFSET1.u32 * 8U + 4U].b32 = DATA2[63 : 32]", "example": "ds_write2_b64 v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 441, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write2st64_b32", "mnemonic": "ds_write2st64_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE2ST64 B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 32 bits of data from one vector input register and then 32 bits of data from a second vector input register into a data share.", "description": "Store 32 bits of data from one vector input register and then 32 bits of data from a second vector input register into a data share. Treat each offset as an index and multiply by a stride of 64 elements (256 bytes) to generate an offset for each DS address.", "syntax": "ds_write2st64_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET0.u32 * 256U].b32 = DATA[31 : 0];\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET1.u32 * 256U].b32 = DATA2[31 : 0]", "example": "ds_write2st64_b32 v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 422, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write2st64_b64", "mnemonic": "ds_write2st64_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE2ST64 B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 64 bits of data from one vector input register and then 64 bits of data from a second vector input register into a data share.", "description": "Store 64 bits of data from one vector input register and then 64 bits of data from a second vector input register into a data share. Treat each offset as an index and multiply by a stride of 64 elements (256 bytes) to generate an offset for each DS address.", "syntax": "ds_write2st64_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET0.u32 * 512U].b32 = DATA[31 : 0];\nMEM[addr + OFFSET0.u32 * 512U + 4U].b32 = DATA[63 : 32];\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET1.u32 * 512U].b32 = DATA2[31 : 0];\nMEM[addr + OFFSET1.u32 * 512U + 4U].b32 = DATA2[63 : 32]", "example": "ds_write2st64_b64 v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 441, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write_addtid_b32", "mnemonic": "ds_write_addtid_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE ADDTID B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 32 bits of data from a vector input register into a data share.", "description": "Store 32 bits of data from a vector input register into a data share. The memory base address is provided as an immediate value and the lane ID is used as an offset.", "syntax": "ds_write_addtid_b32", "operands": [], "dataTypes": ["b32"], "semantics": "declare OFFSET0 : 8'U;\ndeclare OFFSET1 : 8'U;\nMEM[32'I({ OFFSET1, OFFSET0 } + M0[15 : 0]) + laneID.i32 * 4].u32 = DATA0.u32", "example": "ds_write_addtid_b32 v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 425, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write_b128", "mnemonic": "ds_write_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE B128", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 128 bits of data from a vector input register into a data share.", "description": "Store 128 bits of data from a vector input register into a data share.", "syntax": "ds_write_b128", "operands": [], "dataTypes": [], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET.u32].b32 = DATA[31 : 0];\nMEM[addr + OFFSET.u32 + 4U].b32 = DATA[63 : 32];\nMEM[addr + OFFSET.u32 + 8U].b32 = DATA[95 : 64];\nMEM[addr + OFFSET.u32 + 12U].b32 = DATA[127 : 96]", "example": "ds_write_b128 v1, v[2:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 456, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write_b16", "mnemonic": "ds_write_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE B16", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 16 bits of data from a vector register into a data share.", "description": "Store 16 bits of data from a vector register into a data share.", "syntax": "ds_write_b16", "operands": [], "dataTypes": ["b16"], "semantics": "MEM[ADDR].b16 = DATA[15 : 0]", "example": "ds_write_b16 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 425, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write_b16_d16_hi", "mnemonic": "ds_write_b16_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE B16 D16 HI", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 16 bits of data from the high bits of a vector register into a data share.", "description": "Store 16 bits of data from the high bits of a vector register into a data share.", "syntax": "ds_write_b16_d16_hi", "operands": [], "dataTypes": ["b16"], "semantics": "MEM[ADDR].b16 = DATA[31 : 16]", "example": "ds_write_b16_d16_hi v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 443, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write_b32", "mnemonic": "ds_write_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Write one 32-bit value per lane to the Local Data Share (LDS).", "description": "Store 32 bits of data from a vector input register into a data share.", "syntax": "ds_write_b32 ADDR, DATA, offset", "operands": [{"name": "ADDR", "desc": "Per-lane LDS byte address (VGPR)"}, {"name": "DATA", "desc": "Per-lane value to write (VGPR)"}, {"name": "offset", "desc": "Immediate byte offset"}], "dataTypes": ["b32"], "semantics": "LDS[ADDR[lane] + offset] = DATA[lane] for each active lane.", "example": "ds_write_b32  v0, v1   // LDS[v0] = v1", "exampleSource": null, "encoding": {"format": "DS", "widthBits": 32}, "executionUnit": "LDS Unit", "registerClasses": ["VGPR"], "memorySegment": "LDS/shared", "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.ds_write_b64", "mnemonic": "ds_write_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 64 bits of data from a vector input register into a data share.", "description": "Store 64 bits of data from a vector input register into a data share.", "syntax": "ds_write_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET.u32].b32 = DATA[31 : 0];\nMEM[addr + OFFSET.u32 + 4U].b32 = DATA[63 : 32]", "example": "ds_write_b64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 441, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write_b8", "mnemonic": "ds_write_b8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE B8", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 8 bits of data from a vector register into a data share.", "description": "Store 8 bits of data from a vector register into a data share.", "syntax": "ds_write_b8", "operands": [], "dataTypes": ["b8"], "semantics": "MEM[ADDR].b8 = DATA[7 : 0]", "example": "ds_write_b8 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 425, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write_b8_d16_hi", "mnemonic": "ds_write_b8_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE B8 D16 HI", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 8 bits of data from the high bits of a vector register into a data share.", "description": "Store 8 bits of data from the high bits of a vector register into a data share.", "syntax": "ds_write_b8_d16_hi", "operands": [], "dataTypes": ["b8"], "semantics": "MEM[ADDR].b8 = DATA[23 : 16]", "example": "ds_write_b8_d16_hi v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 443, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write_b96", "mnemonic": "ds_write_b96", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE B96", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Store 96 bits of data from a vector input register into a data share.", "description": "Store 96 bits of data from a vector input register into a data share.", "syntax": "ds_write_b96", "operands": [], "dataTypes": [], "semantics": "addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET.u32].b32 = DATA[31 : 0];\nMEM[addr + OFFSET.u32 + 4U].b32 = DATA[63 : 32];\nMEM[addr + OFFSET.u32 + 8U].b32 = DATA[95 : 64]", "example": "ds_write_b96 v1, v[2:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 456, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_write_src2_b32", "mnemonic": "ds_write_src2_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE SRC2 B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_write_src2_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_write_src2_b64", "mnemonic": "ds_write_src2_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRITE SRC2 B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_write_src2_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_wrxchg2_rtn_b32", "mnemonic": "ds_wrxchg2_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRXCHG2 RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Swap two unsigned 32-bit integer values in the data registers with two locations in a data share.", "description": "Swap two unsigned 32-bit integer values in the data registers with two locations in a data share.", "syntax": "ds_wrxchg2_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 4U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 4U;\ntmp1 = MEM[addr1].b32;\ntmp2 = MEM[addr2].b32;\nMEM[addr1].b32 = DATA.b32;\nMEM[addr2].b32 = DATA2.b32;\n// Note DATA2 can be any other register\nRETURN_DATA[31 : 0] = tmp1;\nRETURN_DATA[63 : 32] = tmp2", "example": "ds_wrxchg2_rtn_b32 v[5:6], v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 429, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_wrxchg2_rtn_b64", "mnemonic": "ds_wrxchg2_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRXCHG2 RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Swap two unsigned 64-bit integer values in the data registers with two locations in a data share.", "description": "Swap two unsigned 64-bit integer values in the data registers with two locations in a data share.", "syntax": "ds_wrxchg2_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 8U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 8U;\ntmp1 = MEM[addr1].b64;\ntmp2 = MEM[addr2].b64;\nMEM[addr1].b64 = DATA.b64;\nMEM[addr2].b64 = DATA2.b64;\n// Note DATA2 can be any other register\nRETURN_DATA[63 : 0] = tmp1;\nRETURN_DATA[127 : 64] = tmp2", "example": "ds_wrxchg2_rtn_b64 v[5:8], v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 449, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_wrxchg2st64_rtn_b32", "mnemonic": "ds_wrxchg2st64_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRXCHG2ST64 RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Swap two unsigned 32-bit integer values in the data registers with two locations in a data share.", "description": "Swap two unsigned 32-bit integer values in the data registers with two locations in a data share. Treat each offset as an index and multiply by a stride of 64 elements (256 bytes) to generate an offset for each DS address.", "syntax": "ds_wrxchg2st64_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 256U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 256U;\ntmp1 = MEM[addr1].b32;\ntmp2 = MEM[addr2].b32;\nMEM[addr1].b32 = DATA.b32;\nMEM[addr2].b32 = DATA2.b32;\n// Note DATA2 can be any other register\nRETURN_DATA[31 : 0] = tmp1;\nRETURN_DATA[63 : 32] = tmp2", "example": "ds_wrxchg2st64_rtn_b32 v[5:6], v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 429, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_wrxchg2st64_rtn_b64", "mnemonic": "ds_wrxchg2st64_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRXCHG2ST64 RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Swap two unsigned 64-bit integer values in the data registers with two locations in a data share.", "description": "Swap two unsigned 64-bit integer values in the data registers with two locations in a data share. Treat each offset as an index and multiply by a stride of 64 elements (256 bytes) to generate an offset for each DS address.", "syntax": "ds_wrxchg2st64_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 512U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 512U;\ntmp1 = MEM[addr1].b64;\ntmp2 = MEM[addr2].b64;\nMEM[addr1].b64 = DATA.b64;\nMEM[addr2].b64 = DATA2.b64;\n// Note DATA2 can be any other register\nRETURN_DATA[63 : 0] = tmp1;\nRETURN_DATA[127 : 64] = tmp2", "example": "ds_wrxchg2st64_rtn_b64 v[5:8], v1, v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 449, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_wrxchg_rtn_b32", "mnemonic": "ds_wrxchg_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRXCHG RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Swap an unsigned 32-bit integer value in the data register with a location in a data share.", "description": "Swap an unsigned 32-bit integer value in the data register with a location in a data share.", "syntax": "ds_wrxchg_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp", "example": "ds_wrxchg_rtn_b32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 429, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_wrxchg_rtn_b64", "mnemonic": "ds_wrxchg_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS WRXCHG RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Swap an unsigned 64-bit integer value in the data register with a location in a data share.", "description": "Swap an unsigned 64-bit integer value in the data register with a location in a data share.", "syntax": "ds_wrxchg_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp", "example": "ds_wrxchg_rtn_b64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 448, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_xor_b32", "mnemonic": "ds_xor_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS XOR B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in a data share.", "description": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in a data share.", "syntax": "ds_xor_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp", "example": "ds_xor_b32 v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 421, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_xor_b64", "mnemonic": "ds_xor_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS XOR B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 64-bit integer values stored in the data register and a location in a data share.", "description": "Calculate bitwise XOR given two unsigned 64-bit integer values stored in the data register and a location in a data share.", "syntax": "ds_xor_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp", "example": "ds_xor_b64 v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 440, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_xor_rtn_b32", "mnemonic": "ds_xor_rtn_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS XOR RTN B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in a data share.", "description": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_xor_rtn_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp", "example": "ds_xor_rtn_b32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 428, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_xor_rtn_b64", "mnemonic": "ds_xor_rtn_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS XOR RTN B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 64-bit integer values stored in the data register and a location in a data share.", "description": "Calculate bitwise XOR given two unsigned 64-bit integer values stored in the data register and a location in a data share. Store the original value from data share into a vector register.", "syntax": "ds_xor_rtn_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp", "example": "ds_xor_rtn_b64 v[5:6], v1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 448, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.ds_xor_src2_b32", "mnemonic": "ds_xor_src2_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS XOR SRC2 B32", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_xor_src2_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.ds_xor_src2_b64", "mnemonic": "ds_xor_src2_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "DS XOR SRC2 B64", "category": "LDS / Data Share", "instructionClass": "vector", "summary": "AMDGPU DS vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "ds_xor_src2_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "DS"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.flat_atomic_add", "mnemonic": "flat_atomic_add", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC ADD", "category": "Flat Memory", "instructionClass": "vector", "summary": "Add two unsigned 32-bit integer values stored in the data register and a location in the flat aperture.", "description": "Add two unsigned 32-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_add", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp", "example": "flat_atomic_add v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 488, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_add_f32", "mnemonic": "flat_atomic_add_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC ADD F32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Add a single-precision float value in the data register to a location in the flat aperture.", "description": "Add a single-precision float value in the data register to a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_add_f32", "operands": [], "dataTypes": ["f32"], "semantics": "tmp = MEM[ADDR].f32;\nMEM[ADDR].f32 += DATA.f32;\nRETURN_DATA = tmp", "example": "flat_atomic_add_f32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 490, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_add_f64", "mnemonic": "flat_atomic_add_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC ADD F64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Add a double-precision float value in the data register to a location in the flat aperture.", "description": "Add a double-precision float value in the data register to a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_add_f64", "operands": [], "dataTypes": ["f64"], "semantics": "tmp = MEM[ADDR].f64;\nMEM[ADDR].f64 += DATA.f64;\nRETURN_DATA = tmp", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 491, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.flat_atomic_add_u32", "mnemonic": "flat_atomic_add_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC ADD U32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Add two unsigned 32-bit integer values stored in the data register and a location in the flat aperture.", "description": "Add two unsigned 32-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_add_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "flat_atomic_add_u32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_add_u64", "mnemonic": "flat_atomic_add_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC ADD U64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Add two unsigned 64-bit integer values stored in the data register and a location in the flat aperture.", "description": "Add two unsigned 64-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_add_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": "flat_atomic_add_u64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_add_x2", "mnemonic": "flat_atomic_add_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC ADD X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Add two unsigned 64-bit integer values stored in the data register and a location in the flat aperture.", "description": "Add two unsigned 64-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_add_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp", "example": "flat_atomic_add_x2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 493, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_and", "mnemonic": "flat_atomic_and", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC AND", "category": "Flat Memory", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in the flat aperture.", "description": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_and", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp", "example": "flat_atomic_and v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 489, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_and_b32", "mnemonic": "flat_atomic_and_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC AND B32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in the flat aperture.", "description": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_and_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "flat_atomic_and_b32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_and_b64", "mnemonic": "flat_atomic_and_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC AND B64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 64-bit integer values stored in the data register and a location in the flat aperture.", "description": "Calculate bitwise AND given two unsigned 64-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_and_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "flat_atomic_and_b64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_and_x2", "mnemonic": "flat_atomic_and_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC AND X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 64-bit integer values stored in the data register and a location in the flat aperture.", "description": "Calculate bitwise AND given two unsigned 64-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_and_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp", "example": "flat_atomic_and_x2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 495, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_cmpswap", "mnemonic": "flat_atomic_cmpswap", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC CMPSWAP", "category": "Flat Memory", "instructionClass": "vector", "summary": "Compare two unsigned 32-bit integer values stored in the data comparison register and a location in the flat aperture.", "description": "Compare two unsigned 32-bit integer values stored in the data comparison register and a location in the flat aperture. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from flat aperture into a vector register iff the SC0 bit is set. NOTE: RETURN_DATA[1] is not modified.", "syntax": "flat_atomic_cmpswap", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[addr].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp", "example": "flat_atomic_cmpswap v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 487, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_cmpswap_b32", "mnemonic": "flat_atomic_cmpswap_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC CMPSWAP B32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Compare two unsigned 32-bit integer values stored in the data comparison register and a location in the flat aperture.", "description": "Compare two unsigned 32-bit integer values stored in the data comparison register and a location in the flat aperture. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_cmpswap_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "flat_atomic_cmpswap_b32 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_cmpswap_b64", "mnemonic": "flat_atomic_cmpswap_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC CMPSWAP B64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Compare two unsigned 64-bit integer values stored in the data comparison register and a location in the flat aperture.", "description": "Compare two unsigned 64-bit integer values stored in the data comparison register and a location in the flat aperture. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_cmpswap_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "flat_atomic_cmpswap_b64 v[1:2], v[2:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_cmpswap_f32", "mnemonic": "flat_atomic_cmpswap_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC CMPSWAP F32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Compare two single-precision float values stored in the data comparison register and a location in the flat aperture.", "description": "Compare two single-precision float values stored in the data comparison register and a location in the flat aperture. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from flat aperture into a vector register iff the GLC bit is set.", "syntax": "flat_atomic_cmpswap_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "flat_atomic_cmpswap_f32 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_cmpswap_x2", "mnemonic": "flat_atomic_cmpswap_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC CMPSWAP X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Compare two unsigned 64-bit integer values stored in the data comparison register and a location in the flat aperture.", "description": "Compare two unsigned 64-bit integer values stored in the data comparison register and a location in the flat aperture. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from flat aperture into a vector register iff the SC0 bit is set. NOTE: RETURN_DATA[2:3] is not modified.", "syntax": "flat_atomic_cmpswap_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[addr].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp", "example": "flat_atomic_cmpswap_x2 v[1:2], v[2:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 493, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_cond_sub_u32", "mnemonic": "flat_atomic_cond_sub_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC COND SUB U32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value in the data register from a location in the flat aperture only if the memory value is greater than or equal…", "description": "Subtract an unsigned 32-bit integer value in the data register from a location in the flat aperture only if the memory value is greater than or equal to the data register value. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_cond_sub_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.flat_atomic_csub_u32", "mnemonic": "flat_atomic_csub_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC CSUB U32", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "flat_atomic_csub_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.flat_atomic_dec", "mnemonic": "flat_atomic_dec", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC DEC", "category": "Flat Memory", "instructionClass": "vector", "summary": "Decrement an unsigned 32-bit integer value from a location in the flat aperture with wraparound to a value in the data register if the decrement…", "description": "Decrement an unsigned 32-bit integer value from a location in the flat aperture with wraparound to a value in the data register if the decrement yields a negative value. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_dec", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp", "example": "flat_atomic_dec v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 490, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_dec_u32", "mnemonic": "flat_atomic_dec_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC DEC U32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Decrement an unsigned 32-bit integer value from a location in the flat aperture with wraparound to a value in the data register if the decrement…", "description": "Decrement an unsigned 32-bit integer value from a location in the flat aperture with wraparound to a value in the data register if the decrement yields a negative value. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_dec_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "flat_atomic_dec_u32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_dec_u64", "mnemonic": "flat_atomic_dec_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC DEC U64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Decrement an unsigned 64-bit integer value from a location in the flat aperture with wraparound to a value in the data register if the decrement…", "description": "Decrement an unsigned 64-bit integer value from a location in the flat aperture with wraparound to a value in the data register if the decrement yields a negative value. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_dec_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": "flat_atomic_dec_u64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_dec_x2", "mnemonic": "flat_atomic_dec_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC DEC X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Decrement an unsigned 64-bit integer value from a location in the flat aperture with wraparound to a value in the data register if the decrement…", "description": "Decrement an unsigned 64-bit integer value from a location in the flat aperture with wraparound to a value in the data register if the decrement yields a negative value. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_dec_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp\naddr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32", "example": "flat_atomic_dec_x2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 496, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_fcmpswap", "mnemonic": "flat_atomic_fcmpswap", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC FCMPSWAP", "category": "Flat Memory", "instructionClass": "vector", "summary": "Compare two single-precision float values stored in the data comparison register and a location in the flat aperture.", "description": "Compare two single-precision float values stored in the data comparison register and a location in the flat aperture. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from flat aperture into a vector register iff the GLC bit is set.", "syntax": "flat_atomic_fcmpswap", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.flat_atomic_fcmpswap_x2", "mnemonic": "flat_atomic_fcmpswap_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC FCMPSWAP X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Compare two double-precision float values stored in the data comparison register and a location in the flat aperture.", "description": "Compare two double-precision float values stored in the data comparison register and a location in the flat aperture. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from flat aperture into a vector register iff the GLC bit is set.", "syntax": "flat_atomic_fcmpswap_x2", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.flat_atomic_fmax", "mnemonic": "flat_atomic_fmax", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC FMAX", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the maximum of two single-precision float inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the maximum of two single-precision float inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the GLC bit is set.", "syntax": "flat_atomic_fmax", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.flat_atomic_fmax_x2", "mnemonic": "flat_atomic_fmax_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC FMAX X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the GLC bit is set.", "syntax": "flat_atomic_fmax_x2", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.flat_atomic_fmin", "mnemonic": "flat_atomic_fmin", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC FMIN", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the minimum of two single-precision float inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the minimum of two single-precision float inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the GLC bit is set.", "syntax": "flat_atomic_fmin", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.flat_atomic_fmin_x2", "mnemonic": "flat_atomic_fmin_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC FMIN X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the GLC bit is set.", "syntax": "flat_atomic_fmin_x2", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.flat_atomic_inc", "mnemonic": "flat_atomic_inc", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC INC", "category": "Flat Memory", "instructionClass": "vector", "summary": "Increment an unsigned 32-bit integer value from a location in the flat aperture with wraparound to 0 if the value exceeds a value in the data…", "description": "Increment an unsigned 32-bit integer value from a location in the flat aperture with wraparound to 0 if the value exceeds a value in the data register. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_inc", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp", "example": "flat_atomic_inc v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 490, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_inc_u32", "mnemonic": "flat_atomic_inc_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC INC U32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Increment an unsigned 32-bit integer value from a location in the flat aperture with wraparound to 0 if the value exceeds a value in the data…", "description": "Increment an unsigned 32-bit integer value from a location in the flat aperture with wraparound to 0 if the value exceeds a value in the data register. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_inc_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "flat_atomic_inc_u32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_inc_u64", "mnemonic": "flat_atomic_inc_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC INC U64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Increment an unsigned 64-bit integer value from a location in the flat aperture with wraparound to 0 if the value exceeds a value in the data…", "description": "Increment an unsigned 64-bit integer value from a location in the flat aperture with wraparound to 0 if the value exceeds a value in the data register. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_inc_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": "flat_atomic_inc_u64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_inc_x2", "mnemonic": "flat_atomic_inc_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC INC X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Increment an unsigned 64-bit integer value from a location in the flat aperture with wraparound to 0 if the value exceeds a value in the data…", "description": "Increment an unsigned 64-bit integer value from a location in the flat aperture with wraparound to 0 if the value exceeds a value in the data register. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_inc_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp", "example": "flat_atomic_inc_x2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 495, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_max_f32", "mnemonic": "flat_atomic_max_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC MAX F32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the maximum of two single-precision float inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the maximum of two single-precision float inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the GLC bit is set.", "syntax": "flat_atomic_max_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "flat_atomic_max_f32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_max_f64", "mnemonic": "flat_atomic_max_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC MAX F64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_max_f64", "operands": [], "dataTypes": ["f64"], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src > tmp ? src : tmp;\nRETURN_DATA.f64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 492, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.flat_atomic_max_i32", "mnemonic": "flat_atomic_max_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC MAX I32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_max_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": "flat_atomic_max_i32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_max_i64", "mnemonic": "flat_atomic_max_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC MAX I64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the maximum of two signed 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the maximum of two signed 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_max_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": "flat_atomic_max_i64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_max_u32", "mnemonic": "flat_atomic_max_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC MAX U32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_max_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "flat_atomic_max_u32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_max_u64", "mnemonic": "flat_atomic_max_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC MAX U64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the maximum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_max_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": "flat_atomic_max_u64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_min_f32", "mnemonic": "flat_atomic_min_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC MIN F32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the minimum of two single-precision float inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the minimum of two single-precision float inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the GLC bit is set.", "syntax": "flat_atomic_min_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "flat_atomic_min_f32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_min_f64", "mnemonic": "flat_atomic_min_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC MIN F64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_min_f64", "operands": [], "dataTypes": ["f64"], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src < tmp ? src : tmp;\nRETURN_DATA.f64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 491, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.flat_atomic_min_i32", "mnemonic": "flat_atomic_min_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC MIN I32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_min_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": "flat_atomic_min_i32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_min_i64", "mnemonic": "flat_atomic_min_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC MIN I64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the minimum of two signed 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the minimum of two signed 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_min_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": "flat_atomic_min_i64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_min_u32", "mnemonic": "flat_atomic_min_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC MIN U32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_min_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "flat_atomic_min_u32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_min_u64", "mnemonic": "flat_atomic_min_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC MIN U64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the minimum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_min_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": "flat_atomic_min_u64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_or", "mnemonic": "flat_atomic_or", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC OR", "category": "Flat Memory", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in the flat aperture.", "description": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_or", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp", "example": "flat_atomic_or v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 489, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_or_b32", "mnemonic": "flat_atomic_or_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC OR B32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in the flat aperture.", "description": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_or_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "flat_atomic_or_b32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_or_b64", "mnemonic": "flat_atomic_or_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC OR B64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 64-bit integer values stored in the data register and a location in the flat aperture.", "description": "Calculate bitwise OR given two unsigned 64-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_or_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "flat_atomic_or_b64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_or_x2", "mnemonic": "flat_atomic_or_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC OR X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 64-bit integer values stored in the data register and a location in the flat aperture.", "description": "Calculate bitwise OR given two unsigned 64-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_or_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp", "example": "flat_atomic_or_x2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 495, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_pk_add_bf16", "mnemonic": "flat_atomic_pk_add_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC PK ADD BF16", "category": "Flat Memory", "instructionClass": "vector", "summary": "Add a packed 2-component BF16 float value in the data register to a location in the flat aperture.", "description": "Add a packed 2-component BF16 float value in the data register to a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_pk_add_bf16", "operands": [], "dataTypes": [], "semantics": "tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].bf16 = tmp[31 : 16].bf16 + src[31 : 16].bf16;\ndst[15 : 0].bf16 = tmp[15 : 0].bf16 + src[15 : 0].bf16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 492, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.flat_atomic_pk_add_f16", "mnemonic": "flat_atomic_pk_add_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC PK ADD F16", "category": "Flat Memory", "instructionClass": "vector", "summary": "Add a packed 2-component half-precision float value in the data register to a location in the flat aperture.", "description": "Add a packed 2-component half-precision float value in the data register to a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_pk_add_f16", "operands": [], "dataTypes": ["f16"], "semantics": "tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].f16 = tmp[31 : 16].f16 + src[31 : 16].f16;\ndst[15 : 0].f16 = tmp[15 : 0].f16 + src[15 : 0].f16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 491, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.flat_atomic_smax", "mnemonic": "flat_atomic_smax", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC SMAX", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_smax", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp", "example": "flat_atomic_smax v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 489, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_smax_x2", "mnemonic": "flat_atomic_smax_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC SMAX X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the maximum of two signed 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the maximum of two signed 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_smax_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp", "example": "flat_atomic_smax_x2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 494, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_smin", "mnemonic": "flat_atomic_smin", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC SMIN", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_smin", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp", "example": "flat_atomic_smin v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 488, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_smin_x2", "mnemonic": "flat_atomic_smin_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC SMIN X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the minimum of two signed 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the minimum of two signed 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_smin_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp", "example": "flat_atomic_smin_x2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 493, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_sub", "mnemonic": "flat_atomic_sub", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC SUB", "category": "Flat Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in the flat aperture.", "description": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_sub", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp", "example": "flat_atomic_sub v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 488, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_sub_u32", "mnemonic": "flat_atomic_sub_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC SUB U32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in the flat aperture.", "description": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in the flat aperture. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_sub_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "flat_atomic_sub_u32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_sub_u64", "mnemonic": "flat_atomic_sub_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC SUB U64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 64-bit integer value stored in the data register from a value stored in a location in the flat aperture.", "description": "Subtract an unsigned 64-bit integer value stored in the data register from a value stored in a location in the flat aperture. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_sub_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": "flat_atomic_sub_u64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_sub_x2", "mnemonic": "flat_atomic_sub_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC SUB X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 64-bit integer value stored in the data register from a value stored in a location in the flat aperture.", "description": "Subtract an unsigned 64-bit integer value stored in the data register from a value stored in a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_sub_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp", "example": "flat_atomic_sub_x2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 493, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_swap", "mnemonic": "flat_atomic_swap", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC SWAP", "category": "Flat Memory", "instructionClass": "vector", "summary": "Swap an unsigned 32-bit integer value in the data register with a location in the flat aperture.", "description": "Swap an unsigned 32-bit integer value in the data register with a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_swap", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp", "example": "flat_atomic_swap v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 487, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_swap_b32", "mnemonic": "flat_atomic_swap_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC SWAP B32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Swap an unsigned 32-bit integer value in the data register with a location in the flat aperture.", "description": "Swap an unsigned 32-bit integer value in the data register with a location in the flat aperture. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_swap_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "flat_atomic_swap_b32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_swap_b64", "mnemonic": "flat_atomic_swap_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC SWAP B64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Swap an unsigned 64-bit integer value in the data register with a location in the flat aperture.", "description": "Swap an unsigned 64-bit integer value in the data register with a location in the flat aperture. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_swap_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "flat_atomic_swap_b64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_swap_x2", "mnemonic": "flat_atomic_swap_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC SWAP X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Swap an unsigned 64-bit integer value in the data register with a location in the flat aperture.", "description": "Swap an unsigned 64-bit integer value in the data register with a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_swap_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp", "example": "flat_atomic_swap_x2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 492, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_umax", "mnemonic": "flat_atomic_umax", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC UMAX", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_umax", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp", "example": "flat_atomic_umax v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 489, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_umax_x2", "mnemonic": "flat_atomic_umax_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC UMAX X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the maximum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_umax_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp", "example": "flat_atomic_umax_x2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 494, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_umin", "mnemonic": "flat_atomic_umin", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC UMIN", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_umin", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp", "example": "flat_atomic_umin v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 488, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_umin_x2", "mnemonic": "flat_atomic_umin_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC UMIN X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture.", "description": "Select the minimum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in the flat aperture. Update the flat aperture with the selected value. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_umin_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp", "example": "flat_atomic_umin_x2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 494, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_xor", "mnemonic": "flat_atomic_xor", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC XOR", "category": "Flat Memory", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in the flat aperture.", "description": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_xor", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp", "example": "flat_atomic_xor v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 490, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_xor_b32", "mnemonic": "flat_atomic_xor_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC XOR B32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in the flat aperture.", "description": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_xor_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "flat_atomic_xor_b32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_xor_b64", "mnemonic": "flat_atomic_xor_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC XOR B64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 64-bit integer values stored in the data register and a location in the flat aperture.", "description": "Calculate bitwise XOR given two unsigned 64-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "flat_atomic_xor_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "flat_atomic_xor_b64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_atomic_xor_x2", "mnemonic": "flat_atomic_xor_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT ATOMIC XOR X2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 64-bit integer values stored in the data register and a location in the flat aperture.", "description": "Calculate bitwise XOR given two unsigned 64-bit integer values stored in the data register and a location in the flat aperture. Store the original value from flat aperture into a vector register iff the SC0 bit is set.", "syntax": "flat_atomic_xor_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp", "example": "flat_atomic_xor_x2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 495, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_b128", "mnemonic": "flat_load_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD B128", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 128 bits of data from the flat aperture into a vector register.", "description": "Load 128 bits of data from the flat aperture into a vector register.", "syntax": "flat_load_b128", "operands": [], "dataTypes": [], "semantics": "", "example": "flat_load_b128 v[5:8], v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_b32", "mnemonic": "flat_load_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD B32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 32 bits of data from the flat aperture into a vector register.", "description": "Load 32 bits of data from the flat aperture into a vector register.", "syntax": "flat_load_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "flat_load_b32 v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_b64", "mnemonic": "flat_load_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD B64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 64 bits of data from the flat aperture into a vector register.", "description": "Load 64 bits of data from the flat aperture into a vector register.", "syntax": "flat_load_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "flat_load_b64 v[5:6], v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_b96", "mnemonic": "flat_load_b96", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD B96", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 96 bits of data from the flat aperture into a vector register.", "description": "Load 96 bits of data from the flat aperture into a vector register.", "syntax": "flat_load_b96", "operands": [], "dataTypes": [], "semantics": "", "example": "flat_load_b96 v[5:7], v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_d16_b16", "mnemonic": "flat_load_d16_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD D16 B16", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from the flat aperture and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 16 bits of unsigned data from the flat aperture and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "flat_load_d16_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "flat_load_d16_b16 v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_d16_hi_b16", "mnemonic": "flat_load_d16_hi_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD D16 HI B16", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from the flat aperture and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 16 bits of unsigned data from the flat aperture and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "flat_load_d16_hi_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "flat_load_d16_hi_b16 v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_d16_hi_i8", "mnemonic": "flat_load_d16_hi_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD D16 HI I8", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from the flat aperture, sign extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 8 bits of signed data from the flat aperture, sign extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "flat_load_d16_hi_i8", "operands": [], "dataTypes": ["i8"], "semantics": "", "example": "flat_load_d16_hi_i8 v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_d16_hi_u8", "mnemonic": "flat_load_d16_hi_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD D16 HI U8", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from the flat aperture, zero extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 8 bits of unsigned data from the flat aperture, zero extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "flat_load_d16_hi_u8", "operands": [], "dataTypes": ["u8"], "semantics": "", "example": "flat_load_d16_hi_u8 v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_d16_i8", "mnemonic": "flat_load_d16_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD D16 I8", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from the flat aperture, sign extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 8 bits of signed data from the flat aperture, sign extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "flat_load_d16_i8", "operands": [], "dataTypes": ["i8"], "semantics": "", "example": "flat_load_d16_i8 v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_d16_u8", "mnemonic": "flat_load_d16_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD D16 U8", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from the flat aperture, zero extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 8 bits of unsigned data from the flat aperture, zero extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "flat_load_d16_u8", "operands": [], "dataTypes": ["u8"], "semantics": "", "example": "flat_load_d16_u8 v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_dword", "mnemonic": "flat_load_dword", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD DWORD", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load one 32-bit dword per lane through the flat (generic) address space, resolved to global/scratch/LDS at runtime.", "description": "Load 32 bits of data from the flat aperture into a vector register.", "syntax": "flat_load_dword VDST, VADDR", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "VADDR", "desc": "Per-lane 64-bit generic address (VGPR pair)"}], "dataTypes": [], "semantics": "VDST[lane] = *(VADDR[lane]) for each active lane; the memory aperture (global, scratch, or LDS) is determined per-address at runtime rather than fixed by the instruction.", "example": "flat_load_dword  v2, v[0:1]   // v2 = *(v[0:1]), aperture resolved at runtime", "exampleSource": null, "encoding": {"format": "FLAT", "widthBits": 32}, "executionUnit": "Vector Memory Unit", "registerClasses": ["VGPR"], "memorySegment": "flat/generic", "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.flat_load_dwordx2", "mnemonic": "flat_load_dwordx2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD DWORDX2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 64 bits of data from the flat aperture into a vector register.", "description": "Load 64 bits of data from the flat aperture into a vector register.", "syntax": "flat_load_dwordx2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32", "example": "flat_load_dwordx2 v[5:6], v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 483, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_dwordx3", "mnemonic": "flat_load_dwordx3", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD DWORDX3", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 96 bits of data from the flat aperture into a vector register.", "description": "Load 96 bits of data from the flat aperture into a vector register.", "syntax": "flat_load_dwordx3", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32", "example": "flat_load_dwordx3 v[5:7], v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 483, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_dwordx4", "mnemonic": "flat_load_dwordx4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD DWORDX4", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 128 bits of data from the flat aperture into a vector register.", "description": "Load 128 bits of data from the flat aperture into a vector register.", "syntax": "flat_load_dwordx4", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32;\nVDATA[127 : 96] = MEM[addr + 12U].b32", "example": "flat_load_dwordx4 v[5:8], v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 484, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_i16", "mnemonic": "flat_load_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD I16", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 16 bits of signed data from the flat aperture, sign extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of signed data from the flat aperture, sign extend to 32 bits and store the result into a vector register.", "syntax": "flat_load_i16", "operands": [], "dataTypes": ["i16"], "semantics": "", "example": "flat_load_i16 v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_i8", "mnemonic": "flat_load_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD I8", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from the flat aperture, sign extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of signed data from the flat aperture, sign extend to 32 bits and store the result into a vector register.", "syntax": "flat_load_i8", "operands": [], "dataTypes": ["i8"], "semantics": "", "example": "flat_load_i8 v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_monitor_b128", "mnemonic": "flat_load_monitor_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD MONITOR B128", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction operating on b128 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "flat_load_monitor_b128", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.flat_load_monitor_b32", "mnemonic": "flat_load_monitor_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD MONITOR B32", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "flat_load_monitor_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.flat_load_monitor_b64", "mnemonic": "flat_load_monitor_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD MONITOR B64", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "flat_load_monitor_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.flat_load_sbyte", "mnemonic": "flat_load_sbyte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD SBYTE", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from the flat aperture, sign extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of signed data from the flat aperture, sign extend to 32 bits and store the result into a vector register.", "syntax": "flat_load_sbyte", "operands": [], "dataTypes": [], "semantics": "", "example": "flat_load_sbyte v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_sbyte_d16", "mnemonic": "flat_load_sbyte_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD SBYTE D16", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from the flat aperture, sign extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 8 bits of signed data from the flat aperture, sign extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "flat_load_sbyte_d16", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[15 : 0].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[31:16] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 486, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.flat_load_sbyte_d16_hi", "mnemonic": "flat_load_sbyte_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD SBYTE D16 HI", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from the flat aperture, sign extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 8 bits of signed data from the flat aperture, sign extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "flat_load_sbyte_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 16].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[15:0] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 486, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.flat_load_short_d16", "mnemonic": "flat_load_short_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD SHORT D16", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from the flat aperture and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 16 bits of unsigned data from the flat aperture and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "flat_load_short_d16", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = MEM[addr].b16;\n// VDATA[31:16] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 486, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.flat_load_short_d16_hi", "mnemonic": "flat_load_short_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD SHORT D16 HI", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from the flat aperture and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 16 bits of unsigned data from the flat aperture and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "flat_load_short_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 16].b16 = MEM[addr].b16;\n// VDATA[15:0] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 487, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.flat_load_sshort", "mnemonic": "flat_load_sshort", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD SSHORT", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 16 bits of signed data from the flat aperture, sign extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of signed data from the flat aperture, sign extend to 32 bits and store the result into a vector register.", "syntax": "flat_load_sshort", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA.i32 = 32'I(signext(MEM[addr].i16))", "example": "flat_load_sshort v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 483, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_u16", "mnemonic": "flat_load_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD U16", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from the flat aperture, zero extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of unsigned data from the flat aperture, zero extend to 32 bits and store the result into a vector register.", "syntax": "flat_load_u16", "operands": [], "dataTypes": ["u16"], "semantics": "", "example": "flat_load_u16 v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_u8", "mnemonic": "flat_load_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD U8", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from the flat aperture, zero extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of unsigned data from the flat aperture, zero extend to 32 bits and store the result into a vector register.", "syntax": "flat_load_u8", "operands": [], "dataTypes": ["u8"], "semantics": "", "example": "flat_load_u8 v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_ubyte", "mnemonic": "flat_load_ubyte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD UBYTE", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from the flat aperture, zero extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of unsigned data from the flat aperture, zero extend to 32 bits and store the result into a vector register.", "syntax": "flat_load_ubyte", "operands": [], "dataTypes": [], "semantics": "", "example": "flat_load_ubyte v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_load_ubyte_d16", "mnemonic": "flat_load_ubyte_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD UBYTE D16", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from the flat aperture, zero extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 8 bits of unsigned data from the flat aperture, zero extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "flat_load_ubyte_d16", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[31:16] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 486, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.flat_load_ubyte_d16_hi", "mnemonic": "flat_load_ubyte_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD UBYTE D16 HI", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from the flat aperture, zero extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 8 bits of unsigned data from the flat aperture, zero extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "flat_load_ubyte_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[15:0] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 486, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.flat_load_ushort", "mnemonic": "flat_load_ushort", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT LOAD USHORT", "category": "Flat Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from the flat aperture, zero extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of unsigned data from the flat aperture, zero extend to 32 bits and store the result into a vector register.", "syntax": "flat_load_ushort", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA.u32 = 32'U({ 16'0U, MEM[addr].u16 })", "example": "flat_load_ushort v5, v[1:2]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 483, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_prefetch_b8", "mnemonic": "flat_prefetch_b8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT PREFETCH B8", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction operating on b8 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "flat_prefetch_b8", "operands": [], "dataTypes": ["b8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.flat_store_b128", "mnemonic": "flat_store_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE B128", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 128 bits of data from vector input registers into the flat aperture.", "description": "Store 128 bits of data from vector input registers into the flat aperture.", "syntax": "flat_store_b128", "operands": [], "dataTypes": [], "semantics": "", "example": "flat_store_b128 v[1:2], v[2:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_b16", "mnemonic": "flat_store_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE B16", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 16 bits of data from a vector register into the flat aperture.", "description": "Store 16 bits of data from a vector register into the flat aperture.", "syntax": "flat_store_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "flat_store_b16 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_b32", "mnemonic": "flat_store_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE B32", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 32 bits of data from vector input registers into the flat aperture.", "description": "Store 32 bits of data from vector input registers into the flat aperture.", "syntax": "flat_store_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "flat_store_b32 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_b64", "mnemonic": "flat_store_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE B64", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 64 bits of data from vector input registers into the flat aperture.", "description": "Store 64 bits of data from vector input registers into the flat aperture.", "syntax": "flat_store_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "flat_store_b64 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_b8", "mnemonic": "flat_store_b8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE B8", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 8 bits of data from a vector register into the flat aperture.", "description": "Store 8 bits of data from a vector register into the flat aperture.", "syntax": "flat_store_b8", "operands": [], "dataTypes": ["b8"], "semantics": "", "example": "flat_store_b8 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_b96", "mnemonic": "flat_store_b96", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE B96", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 96 bits of data from vector input registers into the flat aperture.", "description": "Store 96 bits of data from vector input registers into the flat aperture.", "syntax": "flat_store_b96", "operands": [], "dataTypes": [], "semantics": "", "example": "flat_store_b96 v[1:2], v[2:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_byte", "mnemonic": "flat_store_byte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE BYTE", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 8 bits of data from a vector register into the flat aperture.", "description": "Store 8 bits of data from a vector register into the flat aperture.", "syntax": "flat_store_byte", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[7 : 0]", "example": "flat_store_byte v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 484, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_byte_d16_hi", "mnemonic": "flat_store_byte_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE BYTE D16 HI", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 8 bits of data from the high 16 bits of a 32-bit vector register into the flat aperture.", "description": "Store 8 bits of data from the high 16 bits of a 32-bit vector register into the flat aperture.", "syntax": "flat_store_byte_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[23 : 16]", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 484, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.flat_store_d16_hi_b16", "mnemonic": "flat_store_d16_hi_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE D16 HI B16", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 16 bits of data from the high 16 bits of a 32-bit vector register into the flat aperture.", "description": "Store 16 bits of data from the high 16 bits of a 32-bit vector register into the flat aperture.", "syntax": "flat_store_d16_hi_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "flat_store_d16_hi_b16 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_d16_hi_b8", "mnemonic": "flat_store_d16_hi_b8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE D16 HI B8", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 8 bits of data from the high 16 bits of a 32-bit vector register into the flat aperture.", "description": "Store 8 bits of data from the high 16 bits of a 32-bit vector register into the flat aperture.", "syntax": "flat_store_d16_hi_b8", "operands": [], "dataTypes": ["b8"], "semantics": "", "example": "flat_store_d16_hi_b8 v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_dword", "mnemonic": "flat_store_dword", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE DWORD", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 32 bits of data from vector input registers into the flat aperture.", "description": "Store 32 bits of data from vector input registers into the flat aperture.", "syntax": "flat_store_dword", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0]", "example": "flat_store_dword v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 485, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_dwordx2", "mnemonic": "flat_store_dwordx2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE DWORDX2", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 64 bits of data from vector input registers into the flat aperture.", "description": "Store 64 bits of data from vector input registers into the flat aperture.", "syntax": "flat_store_dwordx2", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32]", "example": "flat_store_dwordx2 v[1:2], v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 485, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_dwordx3", "mnemonic": "flat_store_dwordx3", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE DWORDX3", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 96 bits of data from vector input registers into the flat aperture.", "description": "Store 96 bits of data from vector input registers into the flat aperture.", "syntax": "flat_store_dwordx3", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64]", "example": "flat_store_dwordx3 v[1:2], v[2:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 485, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_dwordx4", "mnemonic": "flat_store_dwordx4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE DWORDX4", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 128 bits of data from vector input registers into the flat aperture.", "description": "Store 128 bits of data from vector input registers into the flat aperture.", "syntax": "flat_store_dwordx4", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64];\nMEM[addr + 12U].b32 = VDATA[127 : 96]", "example": "flat_store_dwordx4 v[1:2], v[2:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 485, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_short", "mnemonic": "flat_store_short", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE SHORT", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 16 bits of data from a vector register into the flat aperture.", "description": "Store 16 bits of data from a vector register into the flat aperture.", "syntax": "flat_store_short", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[15 : 0]", "example": "flat_store_short v[1:2], v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 484, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.flat_store_short_d16_hi", "mnemonic": "flat_store_short_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "FLAT STORE SHORT D16 HI", "category": "Flat Memory", "instructionClass": "vector", "summary": "Store 16 bits of data from the high 16 bits of a 32-bit vector register into the flat aperture.", "description": "Store 16 bits of data from the high 16 bits of a 32-bit vector register into the flat aperture.", "syntax": "flat_store_short_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[31 : 16]", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 484, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_atomic_add", "mnemonic": "global_atomic_add", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC ADD", "category": "Atomics", "instructionClass": "vector", "summary": "Atomically add a per-lane value to a global-memory location.", "description": "Add two unsigned 32-bit integer values stored in the data register and a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_add VDST, VADDR, VDATA, SADDR", "operands": [{"name": "VDST", "desc": "Optional destination VGPR (previous value)"}, {"name": "VADDR", "desc": "Per-lane 64-bit address"}, {"name": "VDATA", "desc": "Per-lane value to add"}, {"name": "SADDR", "desc": "Optional uniform base"}], "dataTypes": [], "semantics": "old = *(VADDR[lane] + SADDR + offset); *(...) = old + VDATA[lane]; indivisible with respect to other lanes/waves targeting the same address. VDST optionally receives old.", "example": "global_atomic_add  v2, v[0:1], v2, off   // *(v[0:1]) += v2 per lane, v2 <- old value", "exampleSource": null, "encoding": {"format": "GLOBAL", "widthBits": 32}, "executionUnit": "Vector Memory Unit", "registerClasses": ["VGPR", "SGPR"], "memorySegment": "global", "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.global_atomic_add_f64", "mnemonic": "global_atomic_add_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC ADD F64", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Add a double-precision float value in the data register to a location in the global aperture.", "description": "Add a double-precision float value in the data register to a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_add_f64", "operands": [], "dataTypes": ["f64"], "semantics": "tmp = MEM[ADDR].f64;\nMEM[ADDR].f64 += DATA.f64;\nRETURN_DATA = tmp", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 512, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_atomic_add_x2", "mnemonic": "global_atomic_add_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC ADD X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Add two unsigned 64-bit integer values stored in the data register and a location in the global aperture.", "description": "Add two unsigned 64-bit integer values stored in the data register and a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_add_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp", "example": "global_atomic_add_x2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 514, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_and", "mnemonic": "global_atomic_and", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC AND", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in the global aperture.", "description": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_and", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp", "example": "global_atomic_and v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 510, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_and_x2", "mnemonic": "global_atomic_and_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC AND X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 64-bit integer values stored in the data register and a location in the global aperture.", "description": "Calculate bitwise AND given two unsigned 64-bit integer values stored in the data register and a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_and_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp", "example": "global_atomic_and_x2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 516, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_cmpswap", "mnemonic": "global_atomic_cmpswap", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC CMPSWAP", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Compare two unsigned 32-bit integer values stored in the data comparison register and a location in the global aperture.", "description": "Compare two unsigned 32-bit integer values stored in the data comparison register and a location in the global aperture. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_cmpswap", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[addr].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp", "example": "global_atomic_cmpswap v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 508, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_cmpswap_x2", "mnemonic": "global_atomic_cmpswap_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC CMPSWAP X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Compare two unsigned 64-bit integer values stored in the data comparison register and a location in the global aperture.", "description": "Compare two unsigned 64-bit integer values stored in the data comparison register and a location in the global aperture. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_cmpswap_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[addr].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp", "example": "global_atomic_cmpswap_x2 v1, v[2:5], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 514, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_cond_sub_u32", "mnemonic": "global_atomic_cond_sub_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC COND SUB U32", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value in the data register from a location in the global aperture only if the memory value is greater than or…", "description": "Subtract an unsigned 32-bit integer value in the data register from a location in the global aperture only if the memory value is greater than or equal to the data register value. Store the original value from global aperture into a vector register iff the temporal hint enables atomic return.", "syntax": "global_atomic_cond_sub_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_atomic_csub", "mnemonic": "global_atomic_csub", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC CSUB", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer location in the global aperture from a value in the data register and clamp the result to zero.", "description": "Subtract an unsigned 32-bit integer location in the global aperture from a value in the data register and clamp the result to zero. Store the original value from global aperture into a vector register iff the GLC bit is set.", "syntax": "global_atomic_csub", "operands": [], "dataTypes": [], "semantics": "", "example": "global_atomic_csub v[1:2], v2, off", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_dec", "mnemonic": "global_atomic_dec", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC DEC", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Decrement an unsigned 32-bit integer value from a location in the global aperture with wraparound to a value in the data register if the decrement…", "description": "Decrement an unsigned 32-bit integer value from a location in the global aperture with wraparound to a value in the data register if the decrement yields a negative value. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_dec", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp", "example": "global_atomic_dec v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 511, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_dec_x2", "mnemonic": "global_atomic_dec_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC DEC X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Decrement an unsigned 64-bit integer value from a location in the global aperture with wraparound to a value in the data register if the decrement…", "description": "Decrement an unsigned 64-bit integer value from a location in the global aperture with wraparound to a value in the data register if the decrement yields a negative value. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_dec_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp", "example": "global_atomic_dec_x2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 517, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_fmax_x2", "mnemonic": "global_atomic_fmax_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC FMAX X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in the global aperture.", "description": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in the global aperture. Update the global aperture with the selected value. Store the original value from global aperture into a vector register iff the GLC bit is set.", "syntax": "global_atomic_fmax_x2", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_atomic_fmin_x2", "mnemonic": "global_atomic_fmin_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC FMIN X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in the global aperture.", "description": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in the global aperture. Update the global aperture with the selected value. Store the original value from global aperture into a vector register iff the GLC bit is set.", "syntax": "global_atomic_fmin_x2", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_atomic_inc", "mnemonic": "global_atomic_inc", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC INC", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Increment an unsigned 32-bit integer value from a location in the global aperture with wraparound to 0 if the value exceeds a value in the data…", "description": "Increment an unsigned 32-bit integer value from a location in the global aperture with wraparound to 0 if the value exceeds a value in the data register. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_inc", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp", "example": "global_atomic_inc v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 511, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_inc_x2", "mnemonic": "global_atomic_inc_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC INC X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Increment an unsigned 64-bit integer value from a location in the global aperture with wraparound to 0 if the value exceeds a value in the data…", "description": "Increment an unsigned 64-bit integer value from a location in the global aperture with wraparound to 0 if the value exceeds a value in the data register. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_inc_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp", "example": "global_atomic_inc_x2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 516, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_max_f64", "mnemonic": "global_atomic_max_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC MAX F64", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in the global aperture.", "description": "Select the maximum of two double-precision float inputs, given two values stored in the data register and a location in the global aperture. Update the global aperture with the selected value. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_max_f64", "operands": [], "dataTypes": ["f64"], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src > tmp ? src : tmp;\nRETURN_DATA.f64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 513, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_atomic_min_f64", "mnemonic": "global_atomic_min_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC MIN F64", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in the global aperture.", "description": "Select the minimum of two double-precision float inputs, given two values stored in the data register and a location in the global aperture. Update the global aperture with the selected value. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_min_f64", "operands": [], "dataTypes": ["f64"], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src < tmp ? src : tmp;\nRETURN_DATA.f64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 513, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_atomic_or", "mnemonic": "global_atomic_or", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC OR", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in the global aperture.", "description": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_or", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp", "example": "global_atomic_or v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 511, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_or_x2", "mnemonic": "global_atomic_or_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC OR X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 64-bit integer values stored in the data register and a location in the global aperture.", "description": "Calculate bitwise OR given two unsigned 64-bit integer values stored in the data register and a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_or_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp", "example": "global_atomic_or_x2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 516, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_ordered_add_b64", "mnemonic": "global_atomic_ordered_add_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC ORDERED ADD B64", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Given an (ID, value) pair in memory, increment the value by a given amount if the ID matches an ID provided by the shader.", "description": "Given an (ID, value) pair in memory, increment the value by a given amount if the ID matches an ID provided by the shader.", "syntax": "global_atomic_ordered_add_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_atomic_pk_add_bf16", "mnemonic": "global_atomic_pk_add_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC PK ADD BF16", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Add a packed 2-component BF16 float value in the data register to a location in the global aperture.", "description": "Add a packed 2-component BF16 float value in the data register to a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_pk_add_bf16", "operands": [], "dataTypes": [], "semantics": "tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].bf16 = tmp[31 : 16].bf16 + src[31 : 16].bf16;\ndst[15 : 0].bf16 = tmp[15 : 0].bf16 + src[15 : 0].bf16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Floating-point addition handles NAN/INF/denorm.", "sourcePdfPage": 513, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_atomic_smax", "mnemonic": "global_atomic_smax", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC SMAX", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in the global aperture.", "description": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in the global aperture. Update the global aperture with the selected value. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_smax", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp", "example": "global_atomic_smax v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 510, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_smax_x2", "mnemonic": "global_atomic_smax_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC SMAX X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Select the maximum of two signed 64-bit integer inputs, given two values stored in the data register and a location in the global aperture.", "description": "Select the maximum of two signed 64-bit integer inputs, given two values stored in the data register and a location in the global aperture. Update the global aperture with the selected value. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_smax_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp", "example": "global_atomic_smax_x2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 515, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_smin", "mnemonic": "global_atomic_smin", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC SMIN", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in the global aperture.", "description": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in the global aperture. Update the global aperture with the selected value. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_smin", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp", "example": "global_atomic_smin v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 509, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_smin_x2", "mnemonic": "global_atomic_smin_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC SMIN X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Select the minimum of two signed 64-bit integer inputs, given two values stored in the data register and a location in the global aperture.", "description": "Select the minimum of two signed 64-bit integer inputs, given two values stored in the data register and a location in the global aperture. Update the global aperture with the selected value. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_smin_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp", "example": "global_atomic_smin_x2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 515, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_sub", "mnemonic": "global_atomic_sub", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC SUB", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in the global aperture.", "description": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_sub", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp", "example": "global_atomic_sub v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 509, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_sub_x2", "mnemonic": "global_atomic_sub_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC SUB X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 64-bit integer value stored in the data register from a value stored in a location in the global aperture.", "description": "Subtract an unsigned 64-bit integer value stored in the data register from a value stored in a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_sub_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp", "example": "global_atomic_sub_x2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 514, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_swap", "mnemonic": "global_atomic_swap", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC SWAP", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Swap an unsigned 32-bit integer value in the data register with a location in the global aperture.", "description": "Swap an unsigned 32-bit integer value in the data register with a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_swap", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp", "example": "global_atomic_swap v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 508, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_swap_x2", "mnemonic": "global_atomic_swap_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC SWAP X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Swap an unsigned 64-bit integer value in the data register with a location in the global aperture.", "description": "Swap an unsigned 64-bit integer value in the data register with a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_swap_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp", "example": "global_atomic_swap_x2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 513, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_umax", "mnemonic": "global_atomic_umax", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC UMAX", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in the global aperture.", "description": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in the global aperture. Update the global aperture with the selected value. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_umax", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp", "example": "global_atomic_umax v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 510, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_umax_x2", "mnemonic": "global_atomic_umax_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC UMAX X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in the global aperture.", "description": "Select the maximum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in the global aperture. Update the global aperture with the selected value. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_umax_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp", "example": "global_atomic_umax_x2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 515, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_umin", "mnemonic": "global_atomic_umin", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC UMIN", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in the global aperture.", "description": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in the global aperture. Update the global aperture with the selected value. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_umin", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp", "example": "global_atomic_umin v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 509, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_umin_x2", "mnemonic": "global_atomic_umin_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC UMIN X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in the global aperture.", "description": "Select the minimum of two unsigned 64-bit integer inputs, given two values stored in the data register and a location in the global aperture. Update the global aperture with the selected value. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_umin_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp", "example": "global_atomic_umin_x2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 515, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_xor", "mnemonic": "global_atomic_xor", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC XOR", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in the global aperture.", "description": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_xor", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp", "example": "global_atomic_xor v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 511, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_atomic_xor_x2", "mnemonic": "global_atomic_xor_x2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL ATOMIC XOR X2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 64-bit integer values stored in the data register and a location in the global aperture.", "description": "Calculate bitwise XOR given two unsigned 64-bit integer values stored in the data register and a location in the global aperture. Store the original value from global aperture into a vector register iff the SC0 bit is set.", "syntax": "global_atomic_xor_x2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp", "example": "global_atomic_xor_x2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 516, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_inv", "mnemonic": "global_inv", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL INV", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Invalidate cache lines based on the SCOPE field. Increments/decrements LOAD_CNT.", "description": "Invalidate cache lines based on the SCOPE field. Increments/decrements LOAD_CNT.", "syntax": "global_inv", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_load_async_to_lds_b128", "mnemonic": "global_load_async_to_lds_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD ASYNC TO LDS B128", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b128 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_load_async_to_lds_b128", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_load_async_to_lds_b32", "mnemonic": "global_load_async_to_lds_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD ASYNC TO LDS B32", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_load_async_to_lds_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_load_async_to_lds_b64", "mnemonic": "global_load_async_to_lds_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD ASYNC TO LDS B64", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_load_async_to_lds_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_load_async_to_lds_b8", "mnemonic": "global_load_async_to_lds_b8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD ASYNC TO LDS B8", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b8 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_load_async_to_lds_b8", "operands": [], "dataTypes": ["b8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_load_block", "mnemonic": "global_load_block", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD BLOCK", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load a block of data from the global aperture.", "description": "Load a block of data from the global aperture.", "syntax": "global_load_block", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_load_dword", "mnemonic": "global_load_dword", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD DWORD", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load one 32-bit dword per lane from the global address space using a 64-bit per-lane address.", "description": "Load 32 bits of data from the global aperture into a vector register.", "syntax": "global_load_dword VDST, VADDR, SADDR, offset", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "VADDR", "desc": "Per-lane 64-bit address (VGPR pair)"}, {"name": "SADDR", "desc": "Optional uniform base (SGPR pair)"}, {"name": "offset", "desc": "Immediate offset"}], "dataTypes": [], "semantics": "VDST[lane] = *(VADDR[lane] + SADDR + offset) for each active lane.", "example": "global_load_dword  v2, v[0:1], off   // v2 = *(v[0:1]) per lane", "exampleSource": null, "encoding": {"format": "GLOBAL", "widthBits": 32}, "executionUnit": "Vector Memory Unit", "registerClasses": ["VGPR", "SGPR"], "memorySegment": "global", "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.global_load_dword_addtid", "mnemonic": "global_load_dword_addtid", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD DWORD ADDTID", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 32 bits of data from the global aperture into a vector register.", "description": "Load 32 bits of data from the global aperture into a vector register. The memory base address is provided in a scalar register and the lane ID is used as an offset.", "syntax": "global_load_dword_addtid", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_load_dwordx2", "mnemonic": "global_load_dwordx2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD DWORDX2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 64 bits of data from the global aperture into a vector register.", "description": "Load 64 bits of data from the global aperture into a vector register.", "syntax": "global_load_dwordx2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32", "example": "global_load_dwordx2 v[5:6], v1, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 504, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_load_dwordx3", "mnemonic": "global_load_dwordx3", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD DWORDX3", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 96 bits of data from the global aperture into a vector register.", "description": "Load 96 bits of data from the global aperture into a vector register.", "syntax": "global_load_dwordx3", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32", "example": "global_load_dwordx3 v[5:7], v1, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 504, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_load_dwordx4", "mnemonic": "global_load_dwordx4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD DWORDX4", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 128 bits of data from the global aperture into a vector register.", "description": "Load 128 bits of data from the global aperture into a vector register.", "syntax": "global_load_dwordx4", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32;\nVDATA[127 : 96] = MEM[addr + 12U].b32", "example": "global_load_dwordx4 v[5:8], v1, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 504, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_load_lds_dword", "mnemonic": "global_load_lds_dword", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD LDS DWORD", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 32 bits of untyped data from the global aperture and store the result into a data share.", "description": "Load 32 bits of untyped data from the global aperture and store the result into a data share.", "syntax": "global_load_lds_dword", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 508, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_load_lds_dwordx3", "mnemonic": "global_load_lds_dwordx3", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD LDS DWORDX3", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Untyped buffer load 3 dwords, store result into data share.", "description": "Untyped buffer load 3 dwords, store result into data share.", "syntax": "global_load_lds_dwordx3", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_load_lds_dwordx4", "mnemonic": "global_load_lds_dwordx4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD LDS DWORDX4", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Untyped buffer load 4 dwords, store result into data share.", "description": "Untyped buffer load 4 dwords, store result into data share.", "syntax": "global_load_lds_dwordx4", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_load_lds_sbyte", "mnemonic": "global_load_lds_sbyte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD LDS SBYTE", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 8 bits of untyped data from the global aperture, sign extend to 32 bits and store the result into a data share.", "description": "Load 8 bits of untyped data from the global aperture, sign extend to 32 bits and store the result into a data share.", "syntax": "global_load_lds_sbyte", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 508, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_load_lds_sshort", "mnemonic": "global_load_lds_sshort", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD LDS SSHORT", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 16 bits of untyped data from the global aperture, sign extend to 32 bits and store the result into a data share.", "description": "Load 16 bits of untyped data from the global aperture, sign extend to 32 bits and store the result into a data share.", "syntax": "global_load_lds_sshort", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 508, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_load_lds_ubyte", "mnemonic": "global_load_lds_ubyte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD LDS UBYTE", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 8 bits of untyped data from the global aperture, zero extend to 32 bits and store the result into a data share.", "description": "Load 8 bits of untyped data from the global aperture, zero extend to 32 bits and store the result into a data share.", "syntax": "global_load_lds_ubyte", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 507, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_load_lds_ushort", "mnemonic": "global_load_lds_ushort", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD LDS USHORT", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 16 bits of untyped data from the global aperture, zero extend to 32 bits and store the result into a data share.", "description": "Load 16 bits of untyped data from the global aperture, zero extend to 32 bits and store the result into a data share.", "syntax": "global_load_lds_ushort", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 508, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_load_monitor_b128", "mnemonic": "global_load_monitor_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD MONITOR B128", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b128 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_load_monitor_b128", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_load_monitor_b32", "mnemonic": "global_load_monitor_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD MONITOR B32", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_load_monitor_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_load_monitor_b64", "mnemonic": "global_load_monitor_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD MONITOR B64", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_load_monitor_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_load_sbyte", "mnemonic": "global_load_sbyte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD SBYTE", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from the global aperture, sign extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of signed data from the global aperture, sign extend to 32 bits and store the result into a vector register.", "syntax": "global_load_sbyte", "operands": [], "dataTypes": [], "semantics": "", "example": "global_load_sbyte v5, v1, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_load_sbyte_d16", "mnemonic": "global_load_sbyte_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD SBYTE D16", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from the global aperture, sign extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 8 bits of signed data from the global aperture, sign extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "global_load_sbyte_d16", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[15 : 0].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[31:16] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 506, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_load_sbyte_d16_hi", "mnemonic": "global_load_sbyte_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD SBYTE D16 HI", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from the global aperture, sign extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 8 bits of signed data from the global aperture, sign extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "global_load_sbyte_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 16].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[15:0] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 507, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_load_short_d16", "mnemonic": "global_load_short_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD SHORT D16", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from the global aperture and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 16 bits of unsigned data from the global aperture and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "global_load_short_d16", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = MEM[addr].b16;\n// VDATA[31:16] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 507, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_load_short_d16_hi", "mnemonic": "global_load_short_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD SHORT D16 HI", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from the global aperture and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 16 bits of unsigned data from the global aperture and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "global_load_short_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 16].b16 = MEM[addr].b16;\n// VDATA[15:0] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 507, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_load_sshort", "mnemonic": "global_load_sshort", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD SSHORT", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 16 bits of signed data from the global aperture, sign extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of signed data from the global aperture, sign extend to 32 bits and store the result into a vector register.", "syntax": "global_load_sshort", "operands": [], "dataTypes": [], "semantics": "", "example": "global_load_sshort v5, v1, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_load_tr4_b64", "mnemonic": "global_load_tr4_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD TR4 B64", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_load_tr4_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_load_tr6_b96", "mnemonic": "global_load_tr6_b96", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD TR6 B96", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b96 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_load_tr6_b96", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_load_tr_b128", "mnemonic": "global_load_tr_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD TR B128", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load a 16x16 matrix of 16-bit data from the global aperture, transpose data between row-major and column-major order, and store the result into a…", "description": "Load a 16x16 matrix of 16-bit data from the global aperture, transpose data between row-major and column-major order, and store the result into a 128-bit vector register.", "syntax": "global_load_tr_b128", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_load_tr_b128_w64", "mnemonic": "global_load_tr_b128_w64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD TR B128 W64", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b128 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_load_tr_b128_w64", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_load_tr_b64", "mnemonic": "global_load_tr_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD TR B64", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load a 16x16 matrix of 8-bit data from the global aperture, transpose data between row-major and column-major order, and store the result into a…", "description": "Load a 16x16 matrix of 8-bit data from the global aperture, transpose data between row-major and column-major order, and store the result into a 64-bit vector register.", "syntax": "global_load_tr_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_load_tr_b64_w64", "mnemonic": "global_load_tr_b64_w64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD TR B64 W64", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_load_tr_b64_w64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_load_ubyte", "mnemonic": "global_load_ubyte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD UBYTE", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from the global aperture, zero extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of unsigned data from the global aperture, zero extend to 32 bits and store the result into a vector register.", "syntax": "global_load_ubyte", "operands": [], "dataTypes": [], "semantics": "", "example": "global_load_ubyte v5, v1, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_load_ubyte_d16", "mnemonic": "global_load_ubyte_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD UBYTE D16", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from the global aperture, zero extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 8 bits of unsigned data from the global aperture, zero extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "global_load_ubyte_d16", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[31:16] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 506, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_load_ubyte_d16_hi", "mnemonic": "global_load_ubyte_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD UBYTE D16 HI", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from the global aperture, zero extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 8 bits of unsigned data from the global aperture, zero extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "global_load_ubyte_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[15:0] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 506, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_load_ushort", "mnemonic": "global_load_ushort", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL LOAD USHORT", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from the global aperture, zero extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of unsigned data from the global aperture, zero extend to 32 bits and store the result into a vector register.", "syntax": "global_load_ushort", "operands": [], "dataTypes": [], "semantics": "", "example": "global_load_ushort v5, v1, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_prefetch_b8", "mnemonic": "global_prefetch_b8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL PREFETCH B8", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b8 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_prefetch_b8", "operands": [], "dataTypes": ["b8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_store_async_from_lds_b128", "mnemonic": "global_store_async_from_lds_b128", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE ASYNC FROM LDS B128", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b128 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_store_async_from_lds_b128", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_store_async_from_lds_b32", "mnemonic": "global_store_async_from_lds_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE ASYNC FROM LDS B32", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_store_async_from_lds_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_store_async_from_lds_b64", "mnemonic": "global_store_async_from_lds_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE ASYNC FROM LDS B64", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_store_async_from_lds_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_store_async_from_lds_b8", "mnemonic": "global_store_async_from_lds_b8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE ASYNC FROM LDS B8", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "AMDGPU GLOBAL vector instruction operating on b8 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "global_store_async_from_lds_b8", "operands": [], "dataTypes": ["b8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.global_store_block", "mnemonic": "global_store_block", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE BLOCK", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Store a block of data to the global aperture.", "description": "Store a block of data to the global aperture.", "syntax": "global_store_block", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_store_byte", "mnemonic": "global_store_byte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE BYTE", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Store 8 bits of data from a vector register into the global aperture.", "description": "Store 8 bits of data from a vector register into the global aperture.", "syntax": "global_store_byte", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[7 : 0]", "example": "global_store_byte v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 504, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_store_byte_d16_hi", "mnemonic": "global_store_byte_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE BYTE D16 HI", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Store 8 bits of data from the high 16 bits of a 32-bit vector register into the global aperture.", "description": "Store 8 bits of data from the high 16 bits of a 32-bit vector register into the global aperture.", "syntax": "global_store_byte_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[23 : 16]", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 505, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_store_dword", "mnemonic": "global_store_dword", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE DWORD", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Store one 32-bit dword per lane to the global address space using a 64-bit per-lane address.", "description": "Store 32 bits of data from vector input registers into the global aperture.", "syntax": "global_store_dword VADDR, VDATA, SADDR, offset", "operands": [{"name": "VADDR", "desc": "Per-lane 64-bit address (VGPR pair)"}, {"name": "VDATA", "desc": "Per-lane value to store (VGPR)"}, {"name": "SADDR", "desc": "Optional uniform base (SGPR pair)"}, {"name": "offset", "desc": "Immediate offset"}], "dataTypes": [], "semantics": "*(VADDR[lane] + SADDR + offset) = VDATA[lane] for each active lane.", "example": "global_store_dword  v[0:1], v2, off   // *(v[0:1]) = v2 per lane", "exampleSource": null, "encoding": {"format": "GLOBAL", "widthBits": 32}, "executionUnit": "Vector Memory Unit", "registerClasses": ["VGPR", "SGPR"], "memorySegment": "global", "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.global_store_dword_addtid", "mnemonic": "global_store_dword_addtid", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE DWORD ADDTID", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Store 32 bits of data from a vector input register into the global aperture.", "description": "Store 32 bits of data from a vector input register into the global aperture. The memory base address is provided as an immediate value and the lane ID is used as an offset.", "syntax": "global_store_dword_addtid", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_store_dwordx2", "mnemonic": "global_store_dwordx2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE DWORDX2", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Store 64 bits of data from vector input registers into the global aperture.", "description": "Store 64 bits of data from vector input registers into the global aperture.", "syntax": "global_store_dwordx2", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32]", "example": "global_store_dwordx2 v1, v[2:3], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 505, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_store_dwordx3", "mnemonic": "global_store_dwordx3", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE DWORDX3", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Store 96 bits of data from vector input registers into the global aperture.", "description": "Store 96 bits of data from vector input registers into the global aperture.", "syntax": "global_store_dwordx3", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64]", "example": "global_store_dwordx3 v1, v[2:4], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 506, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_store_dwordx4", "mnemonic": "global_store_dwordx4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE DWORDX4", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Store 128 bits of data from vector input registers into the global aperture.", "description": "Store 128 bits of data from vector input registers into the global aperture.", "syntax": "global_store_dwordx4", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64];\nMEM[addr + 12U].b32 = VDATA[127 : 96]", "example": "global_store_dwordx4 v1, v[2:5], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 506, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_store_short", "mnemonic": "global_store_short", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE SHORT", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Store 16 bits of data from a vector register into the global aperture.", "description": "Store 16 bits of data from a vector register into the global aperture.", "syntax": "global_store_short", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[15 : 0]", "example": "global_store_short v1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 505, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.global_store_short_d16_hi", "mnemonic": "global_store_short_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL STORE SHORT D16 HI", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Store 16 bits of data from the high 16 bits of a 32-bit vector register into the global aperture.", "description": "Store 16 bits of data from the high 16 bits of a 32-bit vector register into the global aperture.", "syntax": "global_store_short_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[31 : 16]", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 505, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.global_wb", "mnemonic": "global_wb", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL WB", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Write back dirty cache lines based on the SCOPE field. Increments/decrements STORE_CNT.", "description": "Write back dirty cache lines based on the SCOPE field. Increments/decrements STORE_CNT.", "syntax": "global_wb", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.global_wbinv", "mnemonic": "global_wbinv", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "GLOBAL WBINV", "category": "Vector/Global Memory", "instructionClass": "vector", "summary": "Write back and invalidate cache lines based on the SCOPE field. Increments/decrements STORE_CNT.", "description": "Write back and invalidate cache lines based on the SCOPE field. Increments/decrements STORE_CNT.", "syntax": "global_wbinv", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "GLOBAL"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.image_atomic_add", "mnemonic": "image_atomic_add", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC ADD", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Add two unsigned 32-bit integer values stored in the data register and a location in an image surface.", "description": "Add two unsigned 32-bit integer values stored in the data register and a location in an image surface. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_add", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_add v0, v[10:11], s[16:23] dmask:0x1 dim:SQ_RSRC_IMG_2D", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_atomic_add_flt", "mnemonic": "image_atomic_add_flt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC ADD FLT", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Add two single-precision float values stored in the data register and a location in an image surface.", "description": "Add two single-precision float values stored in the data register and a location in an image surface. Store the original value from image surface into a vector register iff the temporal hint enables atomic return.", "syntax": "image_atomic_add_flt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.image_atomic_and", "mnemonic": "image_atomic_and", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC AND", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in an image surface.", "description": "Calculate bitwise AND given two unsigned 32-bit integer values stored in the data register and a location in an image surface. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_and", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_and v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_atomic_cmpswap", "mnemonic": "image_atomic_cmpswap", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC CMPSWAP", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Compare two unsigned 32-bit integer values stored in the data comparison register and a location in an image surface.", "description": "Compare two unsigned 32-bit integer values stored in the data comparison register and a location in an image surface. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_cmpswap", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_cmpswap v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_atomic_dec", "mnemonic": "image_atomic_dec", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC DEC", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Decrement an unsigned 32-bit integer value from a location in an image surface with wraparound to a value in the data register if the decrement…", "description": "Decrement an unsigned 32-bit integer value from a location in an image surface with wraparound to a value in the data register if the decrement yields a negative value. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_dec", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_dec v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_atomic_fcmpswap", "mnemonic": "image_atomic_fcmpswap", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC FCMPSWAP", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Compare two single-precision float values stored in the data comparison register and a location in an image surface.", "description": "Compare two single-precision float values stored in the data comparison register and a location in an image surface. Modify the memory location with a value in the data source register iff the comparison is equal. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_fcmpswap", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.image_atomic_fmax", "mnemonic": "image_atomic_fmax", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC FMAX", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Select the maximum of two single-precision float inputs, given two values stored in the data register and a location in an image surface.", "description": "Select the maximum of two single-precision float inputs, given two values stored in the data register and a location in an image surface. Update the image surface with the selected value. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_fmax", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.image_atomic_fmin", "mnemonic": "image_atomic_fmin", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC FMIN", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Select the minimum of two single-precision float inputs, given two values stored in the data register and a location in an image surface.", "description": "Select the minimum of two single-precision float inputs, given two values stored in the data register and a location in an image surface. Update the image surface with the selected value. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_fmin", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.image_atomic_inc", "mnemonic": "image_atomic_inc", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC INC", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Increment an unsigned 32-bit integer value from a location in an image surface with wraparound to 0 if the value exceeds a value in the data register.", "description": "Increment an unsigned 32-bit integer value from a location in an image surface with wraparound to 0 if the value exceeds a value in the data register. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_inc", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_inc v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_atomic_max_flt", "mnemonic": "image_atomic_max_flt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC MAX FLT", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of two single-precision float inputs, given two values stored in the data register and a location in an image surface.", "description": "Select the IEEE maximumNumber() of two single-precision float inputs, given two values stored in the data register and a location in an image surface. Update the image surface with the selected value. Store the original value from image surface into a vector register iff the temporal hint enables atomic return.", "syntax": "image_atomic_max_flt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.image_atomic_max_num_flt", "mnemonic": "image_atomic_max_num_flt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC MAX NUM FLT", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "AMDGPU MIMG vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "image_atomic_max_num_flt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.image_atomic_min_flt", "mnemonic": "image_atomic_min_flt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC MIN FLT", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of two single-precision float inputs, given two values stored in the data register and a location in an image surface.", "description": "Select the IEEE minimumNumber() of two single-precision float inputs, given two values stored in the data register and a location in an image surface. Update the image surface with the selected value. Store the original value from image surface into a vector register iff the temporal hint enables atomic return.", "syntax": "image_atomic_min_flt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.image_atomic_min_num_flt", "mnemonic": "image_atomic_min_num_flt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC MIN NUM FLT", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "AMDGPU MIMG vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "image_atomic_min_num_flt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.image_atomic_or", "mnemonic": "image_atomic_or", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC OR", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in an image surface.", "description": "Calculate bitwise OR given two unsigned 32-bit integer values stored in the data register and a location in an image surface. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_or", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_or v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_atomic_pk_add_bf16", "mnemonic": "image_atomic_pk_add_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC PK ADD BF16", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Add a packed 2-component BF16 float value from the data register to a location in an image surface.", "description": "Add a packed 2-component BF16 float value from the data register to a location in an image surface. Store the original value from image surface into a vector register iff the temporal hint enables atomic return.", "syntax": "image_atomic_pk_add_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.image_atomic_pk_add_f16", "mnemonic": "image_atomic_pk_add_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC PK ADD F16", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Add a packed 2-component half-precision float value from the data register to a location in an image surface.", "description": "Add a packed 2-component half-precision float value from the data register to a location in an image surface. Store the original value from image surface into a vector register iff the temporal hint enables atomic return.", "syntax": "image_atomic_pk_add_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.image_atomic_rsub", "mnemonic": "image_atomic_rsub", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC RSUB", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "AMDGPU MIMG vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "image_atomic_rsub", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.image_atomic_smax", "mnemonic": "image_atomic_smax", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC SMAX", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in an image surface.", "description": "Select the maximum of two signed 32-bit integer inputs, given two values stored in the data register and a location in an image surface. Update the image surface with the selected value. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_smax", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_smax v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_atomic_smin", "mnemonic": "image_atomic_smin", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC SMIN", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in an image surface.", "description": "Select the minimum of two signed 32-bit integer inputs, given two values stored in the data register and a location in an image surface. Update the image surface with the selected value. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_smin", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_smin v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_atomic_sub", "mnemonic": "image_atomic_sub", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC SUB", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in an image surface.", "description": "Subtract an unsigned 32-bit integer value stored in the data register from a value stored in a location in an image surface. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_sub", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_sub v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_atomic_swap", "mnemonic": "image_atomic_swap", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC SWAP", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Swap an unsigned 32-bit integer value in the data register with a location in an image surface.", "description": "Swap an unsigned 32-bit integer value in the data register with a location in an image surface. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_swap", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_swap v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_atomic_umax", "mnemonic": "image_atomic_umax", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC UMAX", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in an image surface.", "description": "Select the maximum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in an image surface. Update the image surface with the selected value. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_umax", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_umax v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_atomic_umin", "mnemonic": "image_atomic_umin", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC UMIN", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in an image surface.", "description": "Select the minimum of two unsigned 32-bit integer inputs, given two values stored in the data register and a location in an image surface. Update the image surface with the selected value. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_umin", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_umin v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_atomic_xor", "mnemonic": "image_atomic_xor", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE ATOMIC XOR", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in an image surface.", "description": "Calculate bitwise XOR given two unsigned 32-bit integer values stored in the data register and a location in an image surface. Store the original value from image surface into a vector register iff the GLC bit is set.", "syntax": "image_atomic_xor", "operands": [], "dataTypes": [], "semantics": "", "example": "image_atomic_xor v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_bvh64_intersect_ray", "mnemonic": "image_bvh64_intersect_ray", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE BVH64 INTERSECT RAY", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Test the intersection of rays with either box nodes or triangle nodes within a bounded volume hierarchy using 64 bit node pointers.", "description": "Test the intersection of rays with either box nodes or triangle nodes within a bounded volume hierarchy using 64 bit node pointers. Store the results of the test into a vector register. This instruction does not take a sampler constant.", "syntax": "image_bvh64_intersect_ray", "operands": [], "dataTypes": [], "semantics": "", "example": "image_bvh64_intersect_ray v[5:8], v[1:12], s[8:11]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_bvh8_intersect_ray", "mnemonic": "image_bvh8_intersect_ray", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE BVH8 INTERSECT RAY", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "This instruction supports testing one BVH8 node against one ray per lane using both intersection engines.", "description": "This instruction supports testing one BVH8 node against one ray per lane using both intersection engines.", "syntax": "image_bvh8_intersect_ray", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.image_bvh_dual_intersect_ray", "mnemonic": "image_bvh_dual_intersect_ray", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE BVH DUAL INTERSECT RAY", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "This instruction supports testing two QBVH nodes against the same ray per lane using both intersection engines.", "description": "This instruction supports testing two QBVH nodes against the same ray per lane using both intersection engines. It is typically used to implement the BVH4x2 traversal algorithm.", "syntax": "image_bvh_dual_intersect_ray", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.image_bvh_intersect_ray", "mnemonic": "image_bvh_intersect_ray", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE BVH INTERSECT RAY", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Test the intersection of rays with either box nodes or triangle nodes within a bounded volume hierarchy using 32 bit node pointers.", "description": "Test the intersection of rays with either box nodes or triangle nodes within a bounded volume hierarchy using 32 bit node pointers. Store the results of the test into a vector register. This instruction does not take a sampler constant.", "syntax": "image_bvh_intersect_ray", "operands": [], "dataTypes": [], "semantics": "", "example": "image_bvh_intersect_ray v[5:8], v[1:11], s[8:11]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_gather4h", "mnemonic": "image_gather4h", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE GATHER4H", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Gather 4 single-component texels from a 4x1 row vector on an image surface.", "description": "Gather 4 single-component texels from a 4x1 row vector on an image surface. Store the result into vector registers. The DMASK selects which channel to read from (R, G, B, A) and must only have one bit set to 1.", "syntax": "image_gather4h", "operands": [], "dataTypes": [], "semantics": "", "example": "image_gather4h v[5:8], v[1:2], s[8:15], s[12:15] dmask:0x4 dim:SQ_RSRC_IMG_2D", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_get_lod", "mnemonic": "image_get_lod", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE GET LOD", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Return the calculated level of detail (LOD) for the provided input as two single-precision float values. No memory access is performed.", "description": "Return the calculated level of detail (LOD) for the provided input as two single-precision float values. No memory access is performed.", "syntax": "image_get_lod", "operands": [], "dataTypes": [], "semantics": "", "example": "image_get_lod v[5:6], v1, s[8:15], s[12:15] dmask:0x3 dim:SQ_RSRC_IMG_1D", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_get_resinfo", "mnemonic": "image_get_resinfo", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE GET RESINFO", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Gather resource information for a given miplevel provided in the address register.", "description": "Gather resource information for a given miplevel provided in the address register. Returns 4 integer values into registers 3:0 as { num_mip_levels, depth, height, width }. No memory access is performed.", "syntax": "image_get_resinfo", "operands": [], "dataTypes": [], "semantics": "", "example": "image_get_resinfo v[5:6], v1, s[8:15] dmask:0x3 dim:SQ_RSRC_IMG_1D", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_load", "mnemonic": "image_load", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE LOAD", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Load a texel from the largest miplevel in an image surface and store the result into a vector register.", "description": "Load a texel from the largest miplevel in an image surface and store the result into a vector register. Perform the format conversion specified by the resource descriptor. No sampling is performed.", "syntax": "image_load", "operands": [], "dataTypes": [], "semantics": "", "example": "image_load v[5:6], v1, s[8:15] dmask:0x3 dim:SQ_RSRC_IMG_1D", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_load_mip", "mnemonic": "image_load_mip", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE LOAD MIP", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Load a texel from a user-specified miplevel in an image surface and store the result into a vector register.", "description": "Load a texel from a user-specified miplevel in an image surface and store the result into a vector register. Perform the format conversion specified by the resource descriptor. No sampling is performed.", "syntax": "image_load_mip", "operands": [], "dataTypes": [], "semantics": "", "example": "image_load_mip v[5:6], v[1:2], s[8:15] dmask:0x3 dim:SQ_RSRC_IMG_1D", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_load_mip_pck", "mnemonic": "image_load_mip_pck", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE LOAD MIP PCK", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Load a texel from a user-specified miplevel in an image surface and store the result into a vector register.", "description": "Load a texel from a user-specified miplevel in an image surface and store the result into a vector register. 8- and 16-bit components are zero-extended. The format specified in the resource descriptor is ignored. No sampling is performed.", "syntax": "image_load_mip_pck", "operands": [], "dataTypes": [], "semantics": "", "example": "image_load_mip_pck v[5:6], v[1:2], s[8:15] dmask:0x3 dim:SQ_RSRC_IMG_1D", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_load_mip_pck_sgn", "mnemonic": "image_load_mip_pck_sgn", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE LOAD MIP PCK SGN", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Load a texel from a user-specified miplevel in an image surface and store the result into a vector register.", "description": "Load a texel from a user-specified miplevel in an image surface and store the result into a vector register. 8- and 16-bit components are sign-extended. The format specified in the resource descriptor is ignored. No sampling is performed.", "syntax": "image_load_mip_pck_sgn", "operands": [], "dataTypes": [], "semantics": "", "example": "image_load_mip_pck_sgn v[5:6], v[1:2], s[8:15] dmask:0x3 dim:SQ_RSRC_IMG_1D", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_load_pck", "mnemonic": "image_load_pck", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE LOAD PCK", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Load a texel from the largest miplevel in an image surface and store the result into a vector register.", "description": "Load a texel from the largest miplevel in an image surface and store the result into a vector register. 8- and 16-bit components are zero-extended. The format specified in the resource descriptor is ignored. No sampling is performed.", "syntax": "image_load_pck", "operands": [], "dataTypes": [], "semantics": "", "example": "image_load_pck v[5:6], v1, s[8:15] dmask:0x3 dim:SQ_RSRC_IMG_1D", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_load_pck_sgn", "mnemonic": "image_load_pck_sgn", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE LOAD PCK SGN", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Load a texel from the largest miplevel in an image surface and store the result into a vector register.", "description": "Load a texel from the largest miplevel in an image surface and store the result into a vector register. 8- and 16-bit components are sign-extended. The format specified in the resource descriptor is ignored. No sampling is performed.", "syntax": "image_load_pck_sgn", "operands": [], "dataTypes": [], "semantics": "", "example": "image_load_pck_sgn v[5:6], v1, s[8:15] dmask:0x3 dim:SQ_RSRC_IMG_1D", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_msaa_load", "mnemonic": "image_msaa_load", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE MSAA LOAD", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Load up to 4 samples of 1 component from an MSAA resource with a user-specified fragment ID. No sampling is performed.", "description": "Load up to 4 samples of 1 component from an MSAA resource with a user-specified fragment ID. No sampling is performed.", "syntax": "image_msaa_load", "operands": [], "dataTypes": [], "semantics": "", "example": "image_msaa_load v[5:6], v[1:3], s[8:15] dmask:0x4 dim:SQ_RSRC_IMG_2D_MSAA d16", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_store", "mnemonic": "image_store", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE STORE", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Store a texel from a vector register to the largest miplevel in an image surface.", "description": "Store a texel from a vector register to the largest miplevel in an image surface. The texel data is converted using the format conversion specified by the resource descriptor prior to storage.", "syntax": "image_store", "operands": [], "dataTypes": [], "semantics": "", "example": "image_store v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_store_mip", "mnemonic": "image_store_mip", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE STORE MIP", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Store a texel from a vector register to a user-specified miplevel in an image surface.", "description": "Store a texel from a vector register to a user-specified miplevel in an image surface. The texel data is converted using the format conversion specified by the resource descriptor prior to storage.", "syntax": "image_store_mip", "operands": [], "dataTypes": [], "semantics": "", "example": "image_store_mip v[1:2], v[2:3], s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_store_mip_pck", "mnemonic": "image_store_mip_pck", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE STORE MIP PCK", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Store a texel from a vector register to a user-specified miplevel in an image surface.", "description": "Store a texel from a vector register to a user-specified miplevel in an image surface. The texel data is already packed and the format specified in the resource descriptor is ignored.", "syntax": "image_store_mip_pck", "operands": [], "dataTypes": [], "semantics": "", "example": "image_store_mip_pck v[1:2], v[2:3], s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.image_store_pck", "mnemonic": "image_store_pck", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "IMAGE STORE PCK", "category": "Image / Texture Memory", "instructionClass": "vector", "summary": "Store a texel from a vector register to the largest miplevel in an image surface.", "description": "Store a texel from a vector register to the largest miplevel in an image surface. The texel data is already packed and the format specified in the resource descriptor is ignored.", "syntax": "image_store_pck", "operands": [], "dataTypes": [], "semantics": "", "example": "image_store_pck v[1:2], v2, s[12:19] dmask:0x3 dim:SQ_RSRC_IMG_1D unorm", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MIMG"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.lds_direct_load", "mnemonic": "lds_direct_load", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "LDS DIRECT LOAD", "category": "LDS Direct / Parameter Fetch", "instructionClass": "vector", "summary": "Read a single 32-bit value from LDS to all lanes.", "description": "Read a single 32-bit value from LDS to all lanes. A single DWORD is read from LDS memory at ADDR[M0[15:0]], where M0[15:0] is a byte address and is dword-aligned. M0[18:16] specify the data type for the read and may be 0=UBYTE, 1=USHORT, 2=DWORD, 4=SBYTE, 5=SSHORT.", "syntax": "lds_direct_load", "operands": [], "dataTypes": [], "semantics": "", "example": "lds_direct_load v17", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DSDIR"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.lds_param_load", "mnemonic": "lds_param_load", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "LDS PARAM LOAD", "category": "LDS Direct / Parameter Fetch", "instructionClass": "vector", "summary": "Transfer parameter data from LDS to VGPRs and expand data in LDS using the NewPrimMask (provided in M0) to place per-quad data into lanes 0-3 of each…", "description": "Transfer parameter data from LDS to VGPRs and expand data in LDS using the NewPrimMask (provided in M0) to place per-quad data into lanes 0-3 of each quad as follows:", "syntax": "lds_param_load", "operands": [], "dataTypes": [], "semantics": "", "example": "lds_param_load v7, attr2.y wait_vdst:9", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "DSDIR"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_abs_i32", "mnemonic": "s_abs_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ABS I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Compute the absolute value of a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Compute the absolute value of a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_abs_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = S0.i32 < 0 ? -S0.i32 : S0.i32;\nSCC = D0.i32 != 0", "example": "S_ABS_I32(0x00000001) => 0x00000001\nS_ABS_I32(0x7fffffff) => 0x7fffffff\nS_ABS_I32(0x80000000) => 0x80000000     // Note this is negative!\nS_ABS_I32(0x80000001) => 0x7fffffff", "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 129, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_absdiff_i32", "mnemonic": "s_absdiff_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ABSDIFF I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate the absolute value of difference between two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Calculate the absolute value of difference between two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_absdiff_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = S0.i32 - S1.i32;\nif D0.i32 < 0 then\nD0.i32 = -D0.i32\nendif;\nSCC = D0.i32 != 0", "example": "S_ABSDIFF_I32(0x00000002, 0x00000005) => 0x00000003\nS_ABSDIFF_I32(0xffffffff, 0x00000000) => 0x00000001\nS_ABSDIFF_I32(0x80000000, 0x00000000) => 0x80000000     // Note: result is negative!\nS_ABSDIFF_I32(0x80000000, 0x00000001) => 0x7fffffff", "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 106, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_add_co_ci_u32", "mnemonic": "s_add_co_ci_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADD CO CI U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Add two unsigned 32-bit integer inputs and a carry-in bit from SCC, store the result into a scalar register and store the carry-out bit into SCC.", "description": "Add two unsigned 32-bit integer inputs and a carry-in bit from SCC, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_add_co_ci_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_add_co_i32", "mnemonic": "s_add_co_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADD CO I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Add two signed 32-bit integer inputs, store the result into a scalar register and store the carry-out bit into SCC.", "description": "Add two signed 32-bit integer inputs, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_add_co_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_add_co_u32", "mnemonic": "s_add_co_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADD CO U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Add two unsigned 32-bit integer inputs, store the result into a scalar register and store the carry-out bit into SCC.", "description": "Add two unsigned 32-bit integer inputs, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_add_co_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_add_f16", "mnemonic": "s_add_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADD F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Add two floating point inputs and store the result into a scalar register.", "description": "Add two floating point inputs and store the result into a scalar register.", "syntax": "s_add_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_add_f32", "mnemonic": "s_add_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADD F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Add two floating point inputs and store the result into a scalar register.", "description": "Add two floating point inputs and store the result into a scalar register.", "syntax": "s_add_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_add_i32", "mnemonic": "s_add_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADD I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Add two signed 32-bit integer inputs, store the result into a scalar register and store the carry-out bit into SCC.", "description": "Add two signed 32-bit integer inputs, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_add_i32", "operands": [], "dataTypes": ["i32"], "semantics": "tmp = S0.i32 + S1.i32;\nSCC = ((S0.u32[31] == S1.u32[31]) && (S0.u32[31] != tmp.u32[31]));\n// signed overflow.\nD0.i32 = tmp.i32", "example": "s_add_i32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This opcode is not suitable for use with S_ADDC_U32 for implementing 64-bit operations.", "sourcePdfPage": 97, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_add_nc_u64", "mnemonic": "s_add_nc_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADD NC U64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Add two unsigned 64-bit integer inputs and store the result into a scalar register.", "description": "Add two unsigned 64-bit integer inputs and store the result into a scalar register.", "syntax": "s_add_nc_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_add_pc_i64", "mnemonic": "s_add_pc_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADD PC I64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOP1 scalar instruction operating on i64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_add_pc_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_add_u32", "mnemonic": "s_add_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADD U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Add two 32-bit unsigned scalar operands, wavefront-uniform.", "description": "Add two unsigned 32-bit integer inputs, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_add_u32 SDST, S0, S1", "operands": [{"name": "SDST", "desc": "Destination SGPR"}, {"name": "S0", "desc": "First source SGPR/constant"}, {"name": "S1", "desc": "Second source SGPR/constant"}], "dataTypes": ["u32"], "semantics": "SDST = S0.u32 + S1.u32; SCC = carry-out.", "example": "s_add_u32  s2, s0, s1   // s2 = s0 + s1 (scalar, whole wavefront)", "exampleSource": null, "encoding": {"format": "SOP2", "widthBits": 32}, "executionUnit": "Scalar ALU", "registerClasses": ["SGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.s_add_u64", "mnemonic": "s_add_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADD U64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOP2 scalar instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_add_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_addc_u32", "mnemonic": "s_addc_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADDC U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Add two unsigned 32-bit integer inputs and a carry-in bit from SCC, store the result into a scalar register and store the carry-out bit into SCC.", "description": "Add two unsigned 32-bit integer inputs and a carry-in bit from SCC, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_addc_u32", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = 64'U(S0.u32) + 64'U(S1.u32) + SCC.u64;\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_ADDC_U32.\nD0.u32 = tmp.u32", "example": "s_addc_u32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 98, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_addk_co_i32", "mnemonic": "s_addk_co_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADDK CO I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Add a scalar input and the sign extension of a literal 16-bit constant, store the result into a scalar register and store the carry-out bit into SCC.", "description": "Add a scalar input and the sign extension of a literal 16-bit constant, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_addk_co_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_addk_i32", "mnemonic": "s_addk_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ADDK I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Add a scalar input and the sign extension of a literal 16-bit constant, store the result into a scalar register and store the carry-out bit into SCC.", "description": "Add a scalar input and the sign extension of a literal 16-bit constant, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_addk_i32", "operands": [], "dataTypes": ["i32"], "semantics": "tmp = D0.i32;\n// Save value to check sign bits for overflow later.\nD0.i32 = D0.i32 + 32'I(signext(S0.i16));\nSCC = ((tmp[31] == S0.i16[15]) && (tmp[31] != D0.i32[31]));\n// signed overflow.", "example": "s_addk_i32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 111, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_alloc_vgpr", "mnemonic": "s_alloc_vgpr", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ALLOC VGPR", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Attempt to set the wave's VGPR allocation to the specified number of VGPRs (or greater).", "description": "Attempt to set the wave's VGPR allocation to the specified number of VGPRs (or greater). The desired VGPR count may be specified as a constant or in an SGPR. The request is rounded up to the next block size so a successful allocation may include more than the requested number of VGPRs.", "syntax": "s_alloc_vgpr", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_and_b32", "mnemonic": "s_and_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Calculate bitwise AND on two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_and_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S0.u32 & S1.u32);\nSCC = D0.u32 != 0U", "example": "s_and_b32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 99, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_b64", "mnemonic": "s_and_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Calculate bitwise AND on two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_and_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = (S0.u64 & S1.u64);\nSCC = D0.u64 != 0ULL", "example": "s_and_b64 s[0:1], 0, s[4:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 100, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_not0_saveexec_b32", "mnemonic": "s_and_not0_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND NOT0 SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_and_not0_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_and_not0_saveexec_b32 s5, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_not0_saveexec_b64", "mnemonic": "s_and_not0_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND NOT0 SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_and_not0_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "s_and_not0_saveexec_b64 vcc, 0.5", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_not0_wrexec_b32", "mnemonic": "s_and_not0_wrexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND NOT0 WREXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask and also into the scalar…", "description": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask and also into the scalar destination register, and set SCC iff the calculated result is nonzero.", "syntax": "s_and_not0_wrexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_and_not0_wrexec_b32 s5, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_not0_wrexec_b64", "mnemonic": "s_and_not0_wrexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND NOT0 WREXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask and also into the scalar…", "description": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask and also into the scalar destination register, and set SCC iff the calculated result is nonzero.", "syntax": "s_and_not0_wrexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "s_and_not0_wrexec_b64 vcc, 0.5", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_not1_b32", "mnemonic": "s_and_not1_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND NOT1 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is…", "description": "Calculate bitwise AND with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_and_not1_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_and_not1_b32 s5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_not1_b64", "mnemonic": "s_and_not1_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND NOT1 B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is…", "description": "Calculate bitwise AND with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_and_not1_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "s_and_not1_b64 vcc, -1, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_not1_saveexec_b32", "mnemonic": "s_and_not1_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND NOT1 SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_and_not1_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_and_not1_saveexec_b32 s5, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_not1_saveexec_b64", "mnemonic": "s_and_not1_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND NOT1 SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_and_not1_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "s_and_not1_saveexec_b64 vcc, 0.5", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_not1_wrexec_b32", "mnemonic": "s_and_not1_wrexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND NOT1 WREXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask and also into the scalar…", "description": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask and also into the scalar destination register, and set SCC iff the calculated result is nonzero.", "syntax": "s_and_not1_wrexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_and_not1_wrexec_b32 s5, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_not1_wrexec_b64", "mnemonic": "s_and_not1_wrexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND NOT1 WREXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask and also into the scalar…", "description": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask and also into the scalar destination register, and set SCC iff the calculated result is nonzero.", "syntax": "s_and_not1_wrexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "s_and_not1_wrexec_b64 vcc, 0.5", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_saveexec_b32", "mnemonic": "s_and_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is…", "description": "Calculate bitwise AND on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_and_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_and_saveexec_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_and_saveexec_b64", "mnemonic": "s_and_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S AND SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is…", "description": "Calculate bitwise AND on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register. The original EXEC mask is saved to the destination SGPRs before the bitwise operation is performed.", "syntax": "s_and_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 & EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL", "example": "s_and_saveexec_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 124, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_andn1_saveexec_b32", "mnemonic": "s_andn1_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ANDN1 SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_andn1_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_andn1_saveexec_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_andn1_saveexec_b64", "mnemonic": "s_andn1_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ANDN1 SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register. The original EXEC mask is saved to the destination SGPRs before the bitwise operation is performed.", "syntax": "s_andn1_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "saveexec = EXEC.u64;\nEXEC.u64 = (~S0.u64 & EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL", "example": "s_andn1_saveexec_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 130, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_andn1_wrexec_b32", "mnemonic": "s_andn1_wrexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ANDN1 WREXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask and also into the scalar…", "description": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask and also into the scalar destination register, and set SCC iff the calculated result is nonzero.", "syntax": "s_andn1_wrexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_andn1_wrexec_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_andn1_wrexec_b64", "mnemonic": "s_andn1_wrexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ANDN1 WREXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask and also into the scalar…", "description": "Calculate bitwise AND on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask and also into the scalar destination register, and set SCC iff the calculated result is nonzero. Unlike the SAVEEXEC series of opcodes, the value written to destination SGPRs is the result of the bitwise-op result. EXEC and the destination SGPRs have the same value at the end of this instruction. This instruction is intended to help accelerate waterfalling.", "syntax": "s_andn1_wrexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "EXEC.u64 = (~S0.u64 & EXEC.u64);\nD0.u64 = EXEC.u64;\nSCC = EXEC.u64 != 0ULL", "example": "s_andn1_wrexec_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 130, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_andn2_b32", "mnemonic": "s_andn2_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ANDN2 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is…", "description": "Calculate bitwise AND with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_andn2_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S0.u32 & ~S1.u32);\nSCC = D0.u32 != 0U", "example": "s_andn2_b32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 101, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_andn2_b64", "mnemonic": "s_andn2_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ANDN2 B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is…", "description": "Calculate bitwise AND with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_andn2_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = (S0.u64 & ~S1.u64);\nSCC = D0.u64 != 0ULL", "example": "s_andn2_b64 s[0:1], 0, s[4:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 101, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_andn2_saveexec_b32", "mnemonic": "s_andn2_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ANDN2 SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_andn2_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_andn2_saveexec_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_andn2_saveexec_b64", "mnemonic": "s_andn2_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ANDN2 SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register. The original EXEC mask is saved to the destination SGPRs before the bitwise operation is performed.", "syntax": "s_andn2_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 & ~EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL", "example": "s_andn2_saveexec_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 125, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_andn2_wrexec_b32", "mnemonic": "s_andn2_wrexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ANDN2 WREXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask and also into the scalar…", "description": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask and also into the scalar destination register, and set SCC iff the calculated result is nonzero.", "syntax": "s_andn2_wrexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_andn2_wrexec_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_andn2_wrexec_b64", "mnemonic": "s_andn2_wrexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ANDN2 WREXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask and also into the scalar…", "description": "Calculate bitwise AND on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask and also into the scalar destination register, and set SCC iff the calculated result is nonzero. Unlike the SAVEEXEC series of opcodes, the value written to destination SGPRs is the result of the bitwise-op result. EXEC and the destination SGPRs have the same value at the end of this instruction. This instruction is intended to help accelerate waterfalling.", "syntax": "s_andn2_wrexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "EXEC.u64 = (S0.u64 & ~EXEC.u64);\nD0.u64 = EXEC.u64;\nSCC = EXEC.u64 != 0ULL", "example": "s_andn2_wrexec_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "In particular, the following sequence of waterfall code is optimized by using a WREXEC instead of two separate scalar ops: // V0 holds the index value per lane\n// save exec mask for restore at the end s_mov_b64 s2, exec // exec mask of remaining (unprocessed) threads s_mov_b64 s4, exec loop: // get the index value for the first active lane v_readfirstlane_b32  s0, v0 // find all other lanes with same index value v_cmpx_eq s0, v0 <OP>        // do the operation using the current EXEC mask. S0 holds the index. // mask out thread that was just executed\n// s_andn2_b64  s4, s4, exec\n// s_mov_b64    exec, s4 s_andn2_wrexec_b64 s4, s4     // replaces above 2 ops // repeat until EXEC==0 s_cbranch_scc1  loop s_mov_b64    exec, s2", "sourcePdfPage": 131, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_ashr_i32", "mnemonic": "s_ashr_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ASHR I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Given a shift count in the second scalar input, calculate the arithmetic shift right (preserving sign bit) of the first scalar input, store the…", "description": "Given a shift count in the second scalar input, calculate the arithmetic shift right (preserving sign bit) of the first scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_ashr_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = 32'I(signext(S0.i32) >> S1[4 : 0].u32);\nSCC = D0.i32 != 0", "example": "s_ashr_i32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 104, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_ashr_i64", "mnemonic": "s_ashr_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ASHR I64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Given a shift count in the second scalar input, calculate the arithmetic shift right (preserving sign bit) of the first scalar input, store the…", "description": "Given a shift count in the second scalar input, calculate the arithmetic shift right (preserving sign bit) of the first scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_ashr_i64", "operands": [], "dataTypes": ["i64"], "semantics": "D0.i64 = (signext(S0.i64) >> S1[5 : 0].u32);\nSCC = D0.i64 != 0LL", "example": "s_ashr_i64 s[0:1], 0, s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 104, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_barrier", "mnemonic": "s_barrier", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BARRIER", "category": "Barriers", "instructionClass": "scalar", "summary": "Synchronize all waves of the executing workgroup at this point.", "description": "Synchronize waves within a threadgroup.", "syntax": "s_barrier", "operands": [], "dataTypes": [], "semantics": "Every wave belonging to the workgroup blocks until all waves of that workgroup have executed s_barrier.", "example": "s_barrier   // block until every wave in the workgroup arrives here", "exampleSource": null, "encoding": {"format": "SOPP", "widthBits": 32}, "executionUnit": "Scalar ALU", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.s_barrier_init", "mnemonic": "s_barrier_init", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BARRIER INIT", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOP1 scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_barrier_init", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_barrier_join", "mnemonic": "s_barrier_join", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BARRIER JOIN", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOP1 scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_barrier_join", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_barrier_leave", "mnemonic": "s_barrier_leave", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BARRIER LEAVE", "category": "Branch & Control", "instructionClass": "scalar", "summary": "AMDGPU SOPP scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_barrier_leave", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_barrier_signal", "mnemonic": "s_barrier_signal", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BARRIER SIGNAL", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Signal that a wave has arrived at a barrier . The argument specifies which barrier to signal.", "description": "Signal that a wave has arrived at a barrier . The argument specifies which barrier to signal.", "syntax": "s_barrier_signal", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_barrier_signal_isfirst", "mnemonic": "s_barrier_signal_isfirst", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BARRIER SIGNAL ISFIRST", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Signal that a wave has arrived at a barrier and set SCC to indicate if this is the first wave to signal the barrier.", "description": "Signal that a wave has arrived at a barrier and set SCC to indicate if this is the first wave to signal the barrier. The argument specifies which barrier to signal.", "syntax": "s_barrier_signal_isfirst", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_barrier_wait", "mnemonic": "s_barrier_wait", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BARRIER WAIT", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Wait for a barrier to complete. The SIMM16 argument specifies which barrier to wait on.", "description": "Wait for a barrier to complete. The SIMM16 argument specifies which barrier to wait on.", "syntax": "s_barrier_wait", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_bcnt0_i32_b32", "mnemonic": "s_bcnt0_i32_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BCNT0 I32 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of \"0\" bits in a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Count the number of \"0\" bits in a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_bcnt0_i32_b32", "operands": [], "dataTypes": ["b32", "i32"], "semantics": "tmp = 0;\nfor i in 0 : 31 do\ntmp += S0.u32[i] == 1'0U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u32 != 0U", "example": "S_BCNT0_I32_B32(0x00000000) => 32\nS_BCNT0_I32_B32(0xcccccccc) => 16\nS_BCNT0_I32_B32(0xffffffff) => 0", "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 117, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_bcnt0_i32_b64", "mnemonic": "s_bcnt0_i32_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BCNT0 I32 B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of \"0\" bits in a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Count the number of \"0\" bits in a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_bcnt0_i32_b64", "operands": [], "dataTypes": ["b64", "i32"], "semantics": "tmp = 0;\nfor i in 0 : 63 do\ntmp += S0.u64[i] == 1'0U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u64 != 0ULL", "example": "s_bcnt0_i32_b64 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 117, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bcnt1_i32_b32", "mnemonic": "s_bcnt1_i32_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BCNT1 I32 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of \"1\" bits in a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Count the number of \"1\" bits in a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_bcnt1_i32_b32", "operands": [], "dataTypes": ["b32", "i32"], "semantics": "tmp = 0;\nfor i in 0 : 31 do\ntmp += S0.u32[i] == 1'1U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u32 != 0U", "example": "S_BCNT1_I32_B32(0x00000000) => 0\nS_BCNT1_I32_B32(0xcccccccc) => 16\nS_BCNT1_I32_B32(0xffffffff) => 32", "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 118, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_bcnt1_i32_b64", "mnemonic": "s_bcnt1_i32_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BCNT1 I32 B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of \"1\" bits in a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Count the number of \"1\" bits in a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_bcnt1_i32_b64", "operands": [], "dataTypes": ["b64", "i32"], "semantics": "tmp = 0;\nfor i in 0 : 63 do\ntmp += S0.u64[i] == 1'1U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u64 != 0ULL", "example": "s_bcnt1_i32_b64 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 118, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bfe_i32", "mnemonic": "s_bfe_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BFE I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Extract a signed bitfield from the first input using field offset and size encoded in the second input, store the result into a scalar register and…", "description": "Extract a signed bitfield from the first input using field offset and size encoded in the second input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_bfe_i32", "operands": [], "dataTypes": ["i32"], "semantics": "tmp.i32 = ((S0.i32 >> S1[4 : 0].u32) & ((1 << S1[22 : 16].u32) - 1));\nD0.i32 = signext_from_bit(tmp.i32, S1[22 : 16].u32);\nSCC = D0.i32 != 0", "example": "s_bfe_i32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 105, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bfe_i64", "mnemonic": "s_bfe_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BFE I64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Extract a signed bitfield from the first input using field offset and size encoded in the second input, store the result into a scalar register and…", "description": "Extract a signed bitfield from the first input using field offset and size encoded in the second input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_bfe_i64", "operands": [], "dataTypes": ["i64"], "semantics": "tmp.i64 = ((S0.i64 >> S1[5 : 0].u32) & ((1LL << S1[22 : 16].u32) - 1LL));\nD0.i64 = signext_from_bit(tmp.i64, S1[22 : 16].u32);\nSCC = D0.i64 != 0LL", "example": "s_bfe_i64 s[0:1], 0, s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 105, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bfe_u32", "mnemonic": "s_bfe_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BFE U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Extract an unsigned bitfield from the first input using field offset and size encoded in the second input, store the result into a scalar register…", "description": "Extract an unsigned bitfield from the first input using field offset and size encoded in the second input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_bfe_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = ((S0.u32 >> S1[4 : 0].u32) & ((1U << S1[22 : 16].u32) - 1U));\nSCC = D0.u32 != 0U", "example": "s_bfe_u32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 105, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bfe_u64", "mnemonic": "s_bfe_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BFE U64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Extract an unsigned bitfield from the first input using field offset and size encoded in the second input, store the result into a scalar register…", "description": "Extract an unsigned bitfield from the first input using field offset and size encoded in the second input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_bfe_u64", "operands": [], "dataTypes": ["u64"], "semantics": "D0.u64 = ((S0.u64 >> S1[5 : 0].u32) & ((1ULL << S1[22 : 16].u32) - 1ULL));\nSCC = D0.u64 != 0ULL", "example": "s_bfe_u64 s[0:1], 0, s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 105, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bfm_b32", "mnemonic": "s_bfm_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BFM B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate a bitfield mask given a field offset and size and store the result in a scalar register.", "description": "Calculate a bitfield mask given a field offset and size and store the result in a scalar register.", "syntax": "s_bfm_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (((1U << S0[4 : 0].u32) - 1U) << S1[4 : 0].u32)", "example": "s_bfm_b32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 104, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bfm_b64", "mnemonic": "s_bfm_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BFM B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate a bitfield mask given a field offset and size and store the result in a scalar register.", "description": "Calculate a bitfield mask given a field offset and size and store the result in a scalar register.", "syntax": "s_bfm_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = (((1ULL << S0[5 : 0].u32) - 1ULL) << S1[5 : 0].u32)", "example": "s_bfm_b64 vcc, s2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 104, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bitcmp0_b32", "mnemonic": "s_bitcmp0_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BITCMP0 B32", "category": "Comparison", "instructionClass": "scalar", "summary": "Extract a bit from the first scalar input based on an index in the second scalar input, and set SCC to 1 iff the extracted bit is equal to 0.", "description": "Extract a bit from the first scalar input based on an index in the second scalar input, and set SCC to 1 iff the extracted bit is equal to 0.", "syntax": "s_bitcmp0_b32", "operands": [], "dataTypes": ["b32"], "semantics": "SCC = S0.u32[S1.u32[4 : 0]] == 1'0U", "example": "s_bitcmp0_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 135, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bitcmp0_b64", "mnemonic": "s_bitcmp0_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BITCMP0 B64", "category": "Comparison", "instructionClass": "scalar", "summary": "Extract a bit from the first scalar input based on an index in the second scalar input, and set SCC to 1 iff the extracted bit is equal to 0.", "description": "Extract a bit from the first scalar input based on an index in the second scalar input, and set SCC to 1 iff the extracted bit is equal to 0.", "syntax": "s_bitcmp0_b64", "operands": [], "dataTypes": ["b64"], "semantics": "SCC = S0.u64[S1.u32[5 : 0]] == 1'0U", "example": "s_bitcmp0_b64 vcc, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 135, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bitcmp1_b32", "mnemonic": "s_bitcmp1_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BITCMP1 B32", "category": "Comparison", "instructionClass": "scalar", "summary": "Extract a bit from the first scalar input based on an index in the second scalar input, and set SCC to 1 iff the extracted bit is equal to 1.", "description": "Extract a bit from the first scalar input based on an index in the second scalar input, and set SCC to 1 iff the extracted bit is equal to 1.", "syntax": "s_bitcmp1_b32", "operands": [], "dataTypes": ["b32"], "semantics": "SCC = S0.u32[S1.u32[4 : 0]] == 1'1U", "example": "s_bitcmp1_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 135, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bitcmp1_b64", "mnemonic": "s_bitcmp1_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BITCMP1 B64", "category": "Comparison", "instructionClass": "scalar", "summary": "Extract a bit from the first scalar input based on an index in the second scalar input, and set SCC to 1 iff the extracted bit is equal to 1.", "description": "Extract a bit from the first scalar input based on an index in the second scalar input, and set SCC to 1 iff the extracted bit is equal to 1.", "syntax": "s_bitcmp1_b64", "operands": [], "dataTypes": ["b64"], "semantics": "SCC = S0.u64[S1.u32[5 : 0]] == 1'1U", "example": "s_bitcmp1_b64 vcc, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 136, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bitreplicate_b64_b32", "mnemonic": "s_bitreplicate_b64_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BITREPLICATE B64 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Substitute each bit of a 32 bit scalar input with two instances of itself and store the result into a 64 bit scalar register.", "description": "Substitute each bit of a 32 bit scalar input with two instances of itself and store the result into a 64 bit scalar register.", "syntax": "s_bitreplicate_b64_b32", "operands": [], "dataTypes": ["b32", "b64"], "semantics": "tmp = S0.u32;\nfor i in 0 : 31 do\nD0.u64[i * 2] = tmp[i];\nD0.u64[i * 2 + 1] = tmp[i]\nendfor", "example": "s_bitreplicate_b64_b32 vcc, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This opcode can be used to convert a quad mask into a pixel mask; given quad mask in s0, the following sequence produces a pixel mask in s2: s_bitreplicate_b64 s2, s0 s_bitreplicate_b64 s2, s2 To perform the inverse operation see S_QUADMASK_B64.", "sourcePdfPage": 131, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bitset0_b32", "mnemonic": "s_bitset0_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BITSET0 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Given a bit offset in a scalar input, set the indicated bit in the destination scalar register to 0.", "description": "Given a bit offset in a scalar input, set the indicated bit in the destination scalar register to 0.", "syntax": "s_bitset0_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32[S0.u32[4 : 0]] = 1'0U", "example": "s_bitset0_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 122, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bitset0_b64", "mnemonic": "s_bitset0_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BITSET0 B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Given a bit offset in a scalar input, set the indicated bit in the destination scalar register to 0.", "description": "Given a bit offset in a scalar input, set the indicated bit in the destination scalar register to 0.", "syntax": "s_bitset0_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64[S0.u32[5 : 0]] = 1'0U", "example": "s_bitset0_b64 vcc, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 123, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bitset1_b32", "mnemonic": "s_bitset1_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BITSET1 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Given a bit offset in a scalar input, set the indicated bit in the destination scalar register to 1.", "description": "Given a bit offset in a scalar input, set the indicated bit in the destination scalar register to 1.", "syntax": "s_bitset1_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32[S0.u32[4 : 0]] = 1'1U", "example": "s_bitset1_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 123, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_bitset1_b64", "mnemonic": "s_bitset1_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BITSET1 B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Given a bit offset in a scalar input, set the indicated bit in the destination scalar register to 1.", "description": "Given a bit offset in a scalar input, set the indicated bit in the destination scalar register to 1.", "syntax": "s_bitset1_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64[S0.u32[5 : 0]] = 1'1U", "example": "s_bitset1_b64 vcc, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 123, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_branch", "mnemonic": "s_branch", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BRANCH", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Unconditional relative branch.", "description": "Jump to a constant offset relative to the current PC.", "syntax": "s_branch offset", "operands": [{"name": "offset", "desc": "Signed word-granularity branch offset"}], "dataTypes": [], "semantics": "PC = PC + 4 + signed_offset * 4.", "example": "s_branch  label   // unconditional jump to label", "exampleSource": null, "encoding": {"format": "SOPP", "widthBits": 32}, "executionUnit": "Scalar ALU", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.s_brev_b32", "mnemonic": "s_brev_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BREV B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Reverse the order of bits in a scalar input and store the result into a scalar register.", "description": "Reverse the order of bits in a scalar input and store the result into a scalar register.", "syntax": "s_brev_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32[31 : 0] = S0.u32[0 : 31]", "example": "s_brev_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 117, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_brev_b64", "mnemonic": "s_brev_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BREV B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Reverse the order of bits in a scalar input and store the result into a scalar register.", "description": "Reverse the order of bits in a scalar input and store the result into a scalar register.", "syntax": "s_brev_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64[63 : 0] = S0.u64[0 : 63]", "example": "s_brev_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 117, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_buffer_prefetch_data", "mnemonic": "s_buffer_prefetch_data", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S BUFFER PREFETCH DATA", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Prefetch data into the scalar data cache, relative to a base address provided in a resource descriptor constant.", "description": "Prefetch data into the scalar data cache, relative to a base address provided in a resource descriptor constant.", "syntax": "s_buffer_prefetch_data", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_call_i64", "mnemonic": "s_call_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CALL I64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOPK scalar instruction operating on i64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_call_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_cbranch_join", "mnemonic": "s_cbranch_join", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CBRANCH JOIN", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Conditional branch join point (end of conditional branch block).", "description": "Conditional branch join point (end of conditional branch block). S0 is saved CSP value. See S_CBRANCH_G_FORK and S_CBRANCH_I_FORK for related instructions.", "syntax": "s_cbranch_join", "operands": [], "dataTypes": [], "semantics": "saved_csp = S0.u32;\nif WAVE_MODE.CSP.u32 == saved_csp then\nPC += 4LL;\n// Second time to JOIN: continue with program.\nelse\nWAVE_MODE.CSP -= 3'1U;\n// First time to JOIN; jump to other FORK path.\n{ PC, EXEC } = SGPR[WAVE_MODE.CSP.u32 * 4U].b128;\n// Read 128 bits from 4 consecutive SGPRs.\nendif", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 129, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_cbranch_scc1", "mnemonic": "s_cbranch_scc1", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CBRANCH SCC1", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Conditional relative branch, taken when the SCC (scalar condition code) flag is set.", "description": "If SCC is 1 then jump to a constant offset relative to the current PC.", "syntax": "s_cbranch_scc1 offset", "operands": [{"name": "offset", "desc": "Signed word-granularity branch offset"}], "dataTypes": [], "semantics": "if (SCC == 1) PC = PC + 4 + signed_offset * 4.", "example": "s_cbranch_scc1  label   // jump to label if SCC == 1", "exampleSource": null, "encoding": {"format": "SOPP", "widthBits": 32}, "executionUnit": "Scalar ALU", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.s_ceil_f16", "mnemonic": "s_ceil_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CEIL F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Round the half-precision float input up to next integer and store the result in floating point format into a scalar register.", "description": "Round the half-precision float input up to next integer and store the result in floating point format into a scalar register.", "syntax": "s_ceil_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_ceil_f32", "mnemonic": "s_ceil_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CEIL F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Round the single-precision float input up to next integer and store the result in floating point format into a scalar register.", "description": "Round the single-precision float input up to next integer and store the result in floating point format into a scalar register.", "syntax": "s_ceil_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cls_i32", "mnemonic": "s_cls_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CLS I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of leading bits that are the same as the sign bit of a scalar input and store the result into a scalar register.", "description": "Count the number of leading bits that are the same as the sign bit of a scalar input and store the result into a scalar register. Store -1 if all input bits are the same.", "syntax": "s_cls_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": "s_cls_i32 s5, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cls_i32_i64", "mnemonic": "s_cls_i32_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CLS I32 I64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of leading bits that are the same as the sign bit of a scalar input and store the result into a scalar register.", "description": "Count the number of leading bits that are the same as the sign bit of a scalar input and store the result into a scalar register. Store -1 if all input bits are the same.", "syntax": "s_cls_i32_i64", "operands": [], "dataTypes": ["i32", "i64"], "semantics": "", "example": "s_cls_i32_i64 s105, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_clz_i32_u32", "mnemonic": "s_clz_i32_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CLZ I32 U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of leading \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register.", "description": "Count the number of leading \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register. Store -1 if there are no \"1\" bits.", "syntax": "s_clz_i32_u32", "operands": [], "dataTypes": ["i32", "u32"], "semantics": "", "example": "s_clz_i32_u32 s5, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_clz_i32_u64", "mnemonic": "s_clz_i32_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CLZ I32 U64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of leading \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register.", "description": "Count the number of leading \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register. Store -1 if there are no \"1\" bits.", "syntax": "s_clz_i32_u64", "operands": [], "dataTypes": ["i32", "u64"], "semantics": "", "example": "s_clz_i32_u64 s105, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmov_b32", "mnemonic": "s_cmov_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMOV B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Move scalar input into a scalar register iff SCC is nonzero.", "description": "Move scalar input into a scalar register iff SCC is nonzero.", "syntax": "s_cmov_b32", "operands": [], "dataTypes": ["b32"], "semantics": "if SCC then\nD0.b32 = S0.b32\nendif", "example": "s_cmov_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 115, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmov_b64", "mnemonic": "s_cmov_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMOV B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Move scalar input into a scalar register iff SCC is nonzero.", "description": "Move scalar input into a scalar register iff SCC is nonzero.", "syntax": "s_cmov_b64", "operands": [], "dataTypes": ["b64"], "semantics": "if SCC then\nD0.b64 = S0.b64\nendif", "example": "s_cmov_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 115, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmovk_i32", "mnemonic": "s_cmovk_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMOVK I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Move the sign extension of a literal 16-bit constant into a scalar register iff SCC is nonzero.", "description": "Move the sign extension of a literal 16-bit constant into a scalar register iff SCC is nonzero.", "syntax": "s_cmovk_i32", "operands": [], "dataTypes": ["i32"], "semantics": "if SCC then\nD0.i32 = 32'I(signext(S0.i16))\nendif", "example": "s_cmovk_i32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 109, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_eq_f16", "mnemonic": "s_cmp_eq_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP EQ F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is equal to the second scalar input.", "syntax": "s_cmp_eq_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_eq_f32", "mnemonic": "s_cmp_eq_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP EQ F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is equal to the second scalar input.", "syntax": "s_cmp_eq_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_eq_i32", "mnemonic": "s_cmp_eq_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP EQ I32", "category": "Comparison", "instructionClass": "scalar", "summary": "Scalar signed-32-bit equality compare, result written to SCC.", "description": "Set SCC to 1 iff the first scalar input is equal to the second scalar input.", "syntax": "s_cmp_eq_i32 S0, S1", "operands": [{"name": "S0", "desc": "First source SGPR/constant"}, {"name": "S1", "desc": "Second source SGPR/constant"}], "dataTypes": ["i32"], "semantics": "SCC = (S0.i32 == S1.i32).", "example": "s_cmp_eq_i32  s0, s1   // SCC = (s0 == s1)", "exampleSource": null, "encoding": {"format": "SOPC", "widthBits": 32}, "executionUnit": "Scalar ALU", "registerClasses": ["SGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_eq_u32", "mnemonic": "s_cmp_eq_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP EQ U32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is equal to the second scalar input.", "syntax": "s_cmp_eq_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 == S1.u32", "example": "s_cmp_eq_u32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Note that S_CMP_EQ_I32 and S_CMP_EQ_U32 are identical opcodes, but both are provided for symmetry.", "sourcePdfPage": 134, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_eq_u64", "mnemonic": "s_cmp_eq_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP EQ U64", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is equal to the second scalar input.", "syntax": "s_cmp_eq_u64", "operands": [], "dataTypes": ["u64"], "semantics": "SCC = S0.u64 == S1.u64", "example": "s_cmp_eq_u64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 137, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_ge_f16", "mnemonic": "s_cmp_ge_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP GE F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is greater than or equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is greater than or equal to the second scalar input.", "syntax": "s_cmp_ge_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_ge_f32", "mnemonic": "s_cmp_ge_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP GE F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is greater than or equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is greater than or equal to the second scalar input.", "syntax": "s_cmp_ge_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_ge_i32", "mnemonic": "s_cmp_ge_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP GE I32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is greater than or equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is greater than or equal to the second scalar input.", "syntax": "s_cmp_ge_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 >= S1.i32", "example": "s_cmp_ge_i32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 133, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_ge_u32", "mnemonic": "s_cmp_ge_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP GE U32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is greater than or equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is greater than or equal to the second scalar input.", "syntax": "s_cmp_ge_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 >= S1.u32", "example": "s_cmp_ge_u32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 135, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_gt_f16", "mnemonic": "s_cmp_gt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP GT F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is greater than the second scalar input.", "syntax": "s_cmp_gt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_gt_f32", "mnemonic": "s_cmp_gt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP GT F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is greater than the second scalar input.", "syntax": "s_cmp_gt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_gt_i32", "mnemonic": "s_cmp_gt_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP GT I32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is greater than the second scalar input.", "syntax": "s_cmp_gt_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 > S1.i32", "example": "s_cmp_gt_i32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 133, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_gt_u32", "mnemonic": "s_cmp_gt_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP GT U32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is greater than the second scalar input.", "syntax": "s_cmp_gt_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 > S1.u32", "example": "s_cmp_gt_u32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 134, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_le_f16", "mnemonic": "s_cmp_le_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LE F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than or equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than or equal to the second scalar input.", "syntax": "s_cmp_le_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_le_f32", "mnemonic": "s_cmp_le_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LE F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than or equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than or equal to the second scalar input.", "syntax": "s_cmp_le_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_le_i32", "mnemonic": "s_cmp_le_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LE I32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than or equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than or equal to the second scalar input.", "syntax": "s_cmp_le_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 <= S1.i32", "example": "s_cmp_le_i32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 134, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_le_u32", "mnemonic": "s_cmp_le_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LE U32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than or equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than or equal to the second scalar input.", "syntax": "s_cmp_le_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 <= S1.u32", "example": "s_cmp_le_u32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 135, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_lg_f16", "mnemonic": "s_cmp_lg_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LG F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than or greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than or greater than the second scalar input.", "syntax": "s_cmp_lg_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_lg_f32", "mnemonic": "s_cmp_lg_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LG F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than or greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than or greater than the second scalar input.", "syntax": "s_cmp_lg_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_lg_i32", "mnemonic": "s_cmp_lg_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LG I32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than or greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than or greater than the second scalar input.", "syntax": "s_cmp_lg_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 <> S1.i32", "example": "s_cmp_lg_i32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Note that S_CMP_LG_I32 and S_CMP_LG_U32 are identical opcodes, but both are provided for symmetry.", "sourcePdfPage": 133, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_lg_u32", "mnemonic": "s_cmp_lg_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LG U32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than or greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than or greater than the second scalar input.", "syntax": "s_cmp_lg_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 <> S1.u32", "example": "s_cmp_lg_u32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Note that S_CMP_LG_I32 and S_CMP_LG_U32 are identical opcodes, but both are provided for symmetry.", "sourcePdfPage": 134, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_lg_u64", "mnemonic": "s_cmp_lg_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LG U64", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than or greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than or greater than the second scalar input.", "syntax": "s_cmp_lg_u64", "operands": [], "dataTypes": ["u64"], "semantics": "SCC = S0.u64 <> S1.u64", "example": "s_cmp_lg_u64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 137, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_lt_f16", "mnemonic": "s_cmp_lt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LT F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than the second scalar input.", "syntax": "s_cmp_lt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_lt_f32", "mnemonic": "s_cmp_lt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LT F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than the second scalar input.", "syntax": "s_cmp_lt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_lt_i32", "mnemonic": "s_cmp_lt_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LT I32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than the second scalar input.", "syntax": "s_cmp_lt_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 < S1.i32", "example": "s_cmp_lt_i32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 134, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_lt_u32", "mnemonic": "s_cmp_lt_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP LT U32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is less than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is less than the second scalar input.", "syntax": "s_cmp_lt_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 < S1.u32", "example": "s_cmp_lt_u32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 135, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmp_neq_f16", "mnemonic": "s_cmp_neq_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP NEQ F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not equal to the second scalar input.", "syntax": "s_cmp_neq_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_neq_f32", "mnemonic": "s_cmp_neq_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP NEQ F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not equal to the second scalar input.", "syntax": "s_cmp_neq_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_nge_f16", "mnemonic": "s_cmp_nge_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP NGE F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not greater than or equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not greater than or equal to the second scalar input.", "syntax": "s_cmp_nge_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_nge_f32", "mnemonic": "s_cmp_nge_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP NGE F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not greater than or equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not greater than or equal to the second scalar input.", "syntax": "s_cmp_nge_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_ngt_f16", "mnemonic": "s_cmp_ngt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP NGT F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not greater than the second scalar input.", "syntax": "s_cmp_ngt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_ngt_f32", "mnemonic": "s_cmp_ngt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP NGT F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not greater than the second scalar input.", "syntax": "s_cmp_ngt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_nle_f16", "mnemonic": "s_cmp_nle_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP NLE F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not less than or equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not less than or equal to the second scalar input.", "syntax": "s_cmp_nle_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_nle_f32", "mnemonic": "s_cmp_nle_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP NLE F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not less than or equal to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not less than or equal to the second scalar input.", "syntax": "s_cmp_nle_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_nlg_f16", "mnemonic": "s_cmp_nlg_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP NLG F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not less than or greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not less than or greater than the second scalar input.", "syntax": "s_cmp_nlg_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_nlg_f32", "mnemonic": "s_cmp_nlg_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP NLG F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not less than or greater than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not less than or greater than the second scalar input.", "syntax": "s_cmp_nlg_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_nlt_f16", "mnemonic": "s_cmp_nlt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP NLT F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not less than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not less than the second scalar input.", "syntax": "s_cmp_nlt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_nlt_f32", "mnemonic": "s_cmp_nlt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP NLT F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not less than the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not less than the second scalar input.", "syntax": "s_cmp_nlt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_o_f16", "mnemonic": "s_cmp_o_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP O F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is orderable to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is orderable to the second scalar input.", "syntax": "s_cmp_o_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_o_f32", "mnemonic": "s_cmp_o_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP O F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is orderable to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is orderable to the second scalar input.", "syntax": "s_cmp_o_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_u_f16", "mnemonic": "s_cmp_u_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP U F16", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not orderable to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not orderable to the second scalar input.", "syntax": "s_cmp_u_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmp_u_f32", "mnemonic": "s_cmp_u_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMP U F32", "category": "Comparison", "instructionClass": "scalar", "summary": "Set SCC to 1 iff the first scalar input is not orderable to the second scalar input.", "description": "Set SCC to 1 iff the first scalar input is not orderable to the second scalar input.", "syntax": "s_cmp_u_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cmpk_eq_i32", "mnemonic": "s_cmpk_eq_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMPK EQ I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set SCC to 1 iff scalar input is equal to the sign extension of a literal 16-bit constant.", "description": "Set SCC to 1 iff scalar input is equal to the sign extension of a literal 16-bit constant.", "syntax": "s_cmpk_eq_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 == 32'I(signext(S1.i16))", "example": "s_cmpk_eq_i32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 109, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmpk_eq_u32", "mnemonic": "s_cmpk_eq_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMPK EQ U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set SCC to 1 iff scalar input is equal to the zero extension of a literal 16-bit constant.", "description": "Set SCC to 1 iff scalar input is equal to the zero extension of a literal 16-bit constant.", "syntax": "s_cmpk_eq_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 == 32'U(S1.u16)", "example": "s_cmpk_eq_u32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 110, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmpk_ge_i32", "mnemonic": "s_cmpk_ge_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMPK GE I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set SCC to 1 iff scalar input is greater than or equal to the sign extension of a literal 16-bit constant.", "description": "Set SCC to 1 iff scalar input is greater than or equal to the sign extension of a literal 16-bit constant.", "syntax": "s_cmpk_ge_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 >= 32'I(signext(S1.i16))", "example": "s_cmpk_ge_i32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 110, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmpk_ge_u32", "mnemonic": "s_cmpk_ge_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMPK GE U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set SCC to 1 iff scalar input is greater than or equal to the zero extension of a literal 16-bit constant.", "description": "Set SCC to 1 iff scalar input is greater than or equal to the zero extension of a literal 16-bit constant.", "syntax": "s_cmpk_ge_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 >= 32'U(S1.u16)", "example": "s_cmpk_ge_u32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 111, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmpk_gt_i32", "mnemonic": "s_cmpk_gt_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMPK GT I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set SCC to 1 iff scalar input is greater than the sign extension of a literal 16-bit constant.", "description": "Set SCC to 1 iff scalar input is greater than the sign extension of a literal 16-bit constant.", "syntax": "s_cmpk_gt_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 > 32'I(signext(S1.i16))", "example": "s_cmpk_gt_i32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 109, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmpk_gt_u32", "mnemonic": "s_cmpk_gt_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMPK GT U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set SCC to 1 iff scalar input is greater than the zero extension of a literal 16-bit constant.", "description": "Set SCC to 1 iff scalar input is greater than the zero extension of a literal 16-bit constant.", "syntax": "s_cmpk_gt_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 > 32'U(S1.u16)", "example": "s_cmpk_gt_u32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 111, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmpk_le_i32", "mnemonic": "s_cmpk_le_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMPK LE I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set SCC to 1 iff scalar input is less than or equal to the sign extension of a literal 16-bit constant.", "description": "Set SCC to 1 iff scalar input is less than or equal to the sign extension of a literal 16-bit constant.", "syntax": "s_cmpk_le_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 <= 32'I(signext(S1.i16))", "example": "s_cmpk_le_i32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 110, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmpk_le_u32", "mnemonic": "s_cmpk_le_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMPK LE U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set SCC to 1 iff scalar input is less than or equal to the zero extension of a literal 16-bit constant.", "description": "Set SCC to 1 iff scalar input is less than or equal to the zero extension of a literal 16-bit constant.", "syntax": "s_cmpk_le_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 <= 32'U(S1.u16)", "example": "s_cmpk_le_u32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 111, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmpk_lg_i32", "mnemonic": "s_cmpk_lg_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMPK LG I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set SCC to 1 iff scalar input is less than or greater than the sign extension of a literal 16-bit constant.", "description": "Set SCC to 1 iff scalar input is less than or greater than the sign extension of a literal 16-bit constant.", "syntax": "s_cmpk_lg_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 != 32'I(signext(S1.i16))", "example": "s_cmpk_lg_i32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 109, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmpk_lg_u32", "mnemonic": "s_cmpk_lg_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMPK LG U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set SCC to 1 iff scalar input is less than or greater than the zero extension of a literal 16-bit constant.", "description": "Set SCC to 1 iff scalar input is less than or greater than the zero extension of a literal 16-bit constant.", "syntax": "s_cmpk_lg_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 != 32'U(S1.u16)", "example": "s_cmpk_lg_u32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 110, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmpk_lt_i32", "mnemonic": "s_cmpk_lt_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMPK LT I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set SCC to 1 iff scalar input is less than the sign extension of a literal 16-bit constant.", "description": "Set SCC to 1 iff scalar input is less than the sign extension of a literal 16-bit constant.", "syntax": "s_cmpk_lt_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 < 32'I(signext(S1.i16))", "example": "s_cmpk_lt_i32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 110, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cmpk_lt_u32", "mnemonic": "s_cmpk_lt_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CMPK LT U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set SCC to 1 iff scalar input is less than the zero extension of a literal 16-bit constant.", "description": "Set SCC to 1 iff scalar input is less than the zero extension of a literal 16-bit constant.", "syntax": "s_cmpk_lt_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 < 32'U(S1.u16)", "example": "s_cmpk_lt_u32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 111, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cselect_b32", "mnemonic": "s_cselect_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CSELECT B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the first input if SCC is true otherwise select the second input, then store the selected input into a scalar register.", "description": "Select the first input if SCC is true otherwise select the second input, then store the selected input into a scalar register.", "syntax": "s_cselect_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = SCC ? S0.u32 : S1.u32", "example": "s_cselect_b32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 99, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cselect_b64", "mnemonic": "s_cselect_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CSELECT B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the first input if SCC is true otherwise select the second input, then store the selected input into a scalar register.", "description": "Select the first input if SCC is true otherwise select the second input, then store the selected input into a scalar register.", "syntax": "s_cselect_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = SCC ? S0.u64 : S1.u64", "example": "s_cselect_b64 s[0:1], 0, s[4:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 99, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_ctz_i32_b32", "mnemonic": "s_ctz_i32_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CTZ I32 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of trailing \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register.", "description": "Count the number of trailing \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register. Store -1 if there are no \"1\" bits in the input.", "syntax": "s_ctz_i32_b32", "operands": [], "dataTypes": ["b32", "i32"], "semantics": "", "example": "s_ctz_i32_b32 s5, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_ctz_i32_b64", "mnemonic": "s_ctz_i32_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CTZ I32 B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of trailing \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register.", "description": "Count the number of trailing \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register. Store -1 if there are no \"1\" bits in the input.", "syntax": "s_ctz_i32_b64", "operands": [], "dataTypes": ["b64", "i32"], "semantics": "", "example": "s_ctz_i32_b64 s105, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_cvt_f16_f32", "mnemonic": "s_cvt_f16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CVT F16 F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Convert from a single-precision float input to a half-precision float value and store the result into a scalar register.", "description": "Convert from a single-precision float input to a half-precision float value and store the result into a scalar register.", "syntax": "s_cvt_f16_f32", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cvt_f32_f16", "mnemonic": "s_cvt_f32_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CVT F32 F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Convert from a half-precision float input to a single-precision float value and store the result into a scalar register.", "description": "Convert from a half-precision float input to a single-precision float value and store the result into a scalar register.", "syntax": "s_cvt_f32_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cvt_f32_i32", "mnemonic": "s_cvt_f32_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CVT F32 I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Convert from a signed 32-bit integer input to a single-precision float value and store the result into a scalar register.", "description": "Convert from a signed 32-bit integer input to a single-precision float value and store the result into a scalar register.", "syntax": "s_cvt_f32_i32", "operands": [], "dataTypes": ["f32", "i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cvt_f32_u32", "mnemonic": "s_cvt_f32_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CVT F32 U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Convert from an unsigned 32-bit integer input to a single-precision float value and store the result into a scalar register.", "description": "Convert from an unsigned 32-bit integer input to a single-precision float value and store the result into a scalar register.", "syntax": "s_cvt_f32_u32", "operands": [], "dataTypes": ["f32", "u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cvt_hi_f32_f16", "mnemonic": "s_cvt_hi_f32_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CVT HI F32 F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Convert from a half-precision float value in the high 16 bits of a scalar input to a single-precision float value and store the result into a scalar…", "description": "Convert from a half-precision float value in the high 16 bits of a scalar input to a single-precision float value and store the result into a scalar register.", "syntax": "s_cvt_hi_f32_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cvt_i32_f32", "mnemonic": "s_cvt_i32_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CVT I32 F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Convert from a single-precision float input to a signed 32-bit integer value and store the result into a scalar register.", "description": "Convert from a single-precision float input to a signed 32-bit integer value and store the result into a scalar register.", "syntax": "s_cvt_i32_f32", "operands": [], "dataTypes": ["f32", "i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cvt_pk_rtz_f16_f32", "mnemonic": "s_cvt_pk_rtz_f16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CVT PK RTZ F16 F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Convert two single-precision float inputs into a packed half-precision float result using round toward zero semantics (ignore the current rounding…", "description": "Convert two single-precision float inputs into a packed half-precision float result using round toward zero semantics (ignore the current rounding mode), and store the result into a scalar register.", "syntax": "s_cvt_pk_rtz_f16_f32", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_cvt_u32_f32", "mnemonic": "s_cvt_u32_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S CVT U32 F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Convert from a single-precision float input to an unsigned 32-bit integer value and store the result into a scalar register.", "description": "Convert from a single-precision float input to an unsigned 32-bit integer value and store the result into a scalar register.", "syntax": "s_cvt_u32_f32", "operands": [], "dataTypes": ["f32", "u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_dcache_inv", "mnemonic": "s_dcache_inv", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S DCACHE INV", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Invalidate the scalar (L0) data cache.", "description": "Invalidate the scalar (L0) data cache.", "syntax": "s_dcache_inv", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 154, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_dcache_inv_vol", "mnemonic": "s_dcache_inv_vol", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S DCACHE INV VOL", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Invalidate the scalar (L0) data cache volatile lines.", "description": "Invalidate the scalar (L0) data cache volatile lines.", "syntax": "s_dcache_inv_vol", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 154, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_dcache_wb", "mnemonic": "s_dcache_wb", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S DCACHE WB", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Write back dirty data in the scalar (L0) data cache.", "description": "Write back dirty data in the scalar (L0) data cache.", "syntax": "s_dcache_wb", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 154, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_dcache_wb_vol", "mnemonic": "s_dcache_wb_vol", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S DCACHE WB VOL", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Write back dirty data in the scalar (L0) data cache volatile lines.", "description": "Write back dirty data in the scalar (L0) data cache volatile lines.", "syntax": "s_dcache_wb_vol", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 154, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_decperflevel", "mnemonic": "s_decperflevel", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S DECPERFLEVEL", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Decrement performance counter specified in SIMM16[3:0] by 1.", "description": "Decrement performance counter specified in SIMM16[3:0] by 1.", "syntax": "s_decperflevel", "operands": [], "dataTypes": [], "semantics": "", "example": "s_decperflevel 0x0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 143, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_delay_alu", "mnemonic": "s_delay_alu", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S DELAY ALU", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Insert delay between dependent SALU/VALU instructions.", "description": "Insert delay between dependent SALU/VALU instructions.", "syntax": "s_delay_alu", "operands": [], "dataTypes": [], "semantics": "", "example": "s_delay_alu 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_endpgm", "mnemonic": "s_endpgm", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ENDPGM", "category": "Branch & Control", "instructionClass": "scalar", "summary": "End of program; terminate wavefront.", "description": "End of program; terminate wavefront. The hardware implicitly executes S_WAITCNT 0 before executing this instruction. See S_ENDPGM_SAVED for the context-switch version of this instruction.", "syntax": "s_endpgm", "operands": [], "dataTypes": [], "semantics": "", "example": "s_endpgm 1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 138, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_endpgm_saved", "mnemonic": "s_endpgm_saved", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ENDPGM SAVED", "category": "Branch & Control", "instructionClass": "scalar", "summary": "End of program; signal that a wave has been saved by the context-switch trap handler and terminate wavefront.", "description": "End of program; signal that a wave has been saved by the context-switch trap handler and terminate wavefront. The hardware implicitly executes S_WAITCNT 0 before executing this instruction. See S_ENDPGM for additional variants.", "syntax": "s_endpgm_saved", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 144, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_ff0_i32_b32", "mnemonic": "s_ff0_i32_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S FF0 I32 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of trailing \"1\" bits before the first \"0\" in a scalar input and store the result into a scalar register.", "description": "Count the number of trailing \"1\" bits before the first \"0\" in a scalar input and store the result into a scalar register. Store -1 if there are no \"0\" bits in the input.", "syntax": "s_ff0_i32_b32", "operands": [], "dataTypes": ["b32", "i32"], "semantics": "tmp = -1;\n// Set if no zeros are found\nfor i in 0 : 31 do\n// Search from LSB\nif S0.u32[i] == 1'0U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", "example": "S_FF0_I32_B32(0xaaaaaaaa) => 0\nS_FF0_I32_B32(0x55555555) => 1\nS_FF0_I32_B32(0x00000000) => 0\nS_FF0_I32_B32(0xffffffff) => 0xffffffff", "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 118, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_ff0_i32_b64", "mnemonic": "s_ff0_i32_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S FF0 I32 B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of trailing \"1\" bits before the first \"0\" in a scalar input and store the result into a scalar register.", "description": "Count the number of trailing \"1\" bits before the first \"0\" in a scalar input and store the result into a scalar register. Store -1 if there are no \"0\" bits in the input.", "syntax": "s_ff0_i32_b64", "operands": [], "dataTypes": ["b64", "i32"], "semantics": "tmp = -1;\n// Set if no zeros are found\nfor i in 0 : 63 do\n// Search from LSB\nif S0.u64[i] == 1'0U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 119, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_ff1_i32_b32", "mnemonic": "s_ff1_i32_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S FF1 I32 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of trailing \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register.", "description": "Count the number of trailing \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register. Store -1 if there are no \"1\" bits in the input.", "syntax": "s_ff1_i32_b32", "operands": [], "dataTypes": ["b32", "i32"], "semantics": "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from LSB\nif S0.u32[i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", "example": "S_FF1_I32_B32(0xaaaaaaaa) => 1\nS_FF1_I32_B32(0x55555555) => 0\nS_FF1_I32_B32(0x00000000) => 0xffffffff\nS_FF1_I32_B32(0xffffffff) => 0", "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 119, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_ff1_i32_b64", "mnemonic": "s_ff1_i32_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S FF1 I32 B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of trailing \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register.", "description": "Count the number of trailing \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register. Store -1 if there are no \"1\" bits in the input.", "syntax": "s_ff1_i32_b64", "operands": [], "dataTypes": ["b64", "i32"], "semantics": "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 63 do\n// Search from LSB\nif S0.u64[i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", "example": "s_ff1_i32_b64 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 120, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_flbit_i32", "mnemonic": "s_flbit_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S FLBIT I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of leading bits that are the same as the sign bit of a scalar input and store the result into a scalar register.", "description": "Count the number of leading bits that are the same as the sign bit of a scalar input and store the result into a scalar register. Store -1 if all input bits are the same.", "syntax": "s_flbit_i32", "operands": [], "dataTypes": ["i32"], "semantics": "tmp = -1;\n// Set if all bits are the same\nfor i in 1 : 31 do\n// Search from MSB\nif S0.u32[31 - i] != S0.u32[31] then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", "example": "S_FLBIT_I32(0x00000000) => 0xffffffff\nS_FLBIT_I32(0x0000cccc) => 16\nS_FLBIT_I32(0xffff3333) => 16\nS_FLBIT_I32(0x7fffffff) => 1", "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 121, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_flbit_i32_b32", "mnemonic": "s_flbit_i32_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S FLBIT I32 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of leading \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register.", "description": "Count the number of leading \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register. Store -1 if there are no \"1\" bits.", "syntax": "s_flbit_i32_b32", "operands": [], "dataTypes": ["b32", "i32"], "semantics": "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from MSB\nif S0.u32[31 - i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", "example": "S_FLBIT_I32_B32(0x00000000) => 0xffffffff\nS_FLBIT_I32_B32(0x0000cccc) => 16\nS_FLBIT_I32_B32(0xffff3333) => 0\nS_FLBIT_I32_B32(0x7fffffff) => 1", "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 120, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_flbit_i32_b64", "mnemonic": "s_flbit_i32_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S FLBIT I32 B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of leading \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register.", "description": "Count the number of leading \"0\" bits before the first \"1\" in a scalar input and store the result into a scalar register. Store -1 if there are no \"1\" bits.", "syntax": "s_flbit_i32_b64", "operands": [], "dataTypes": ["b64", "i32"], "semantics": "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 63 do\n// Search from MSB\nif S0.u64[63 - i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", "example": "s_flbit_i32_b64 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 121, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_flbit_i32_i64", "mnemonic": "s_flbit_i32_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S FLBIT I32 I64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Count the number of leading bits that are the same as the sign bit of a scalar input and store the result into a scalar register.", "description": "Count the number of leading bits that are the same as the sign bit of a scalar input and store the result into a scalar register. Store -1 if all input bits are the same.", "syntax": "s_flbit_i32_i64", "operands": [], "dataTypes": ["i32", "i64"], "semantics": "tmp = -1;\n// Set if all bits are the same\nfor i in 1 : 63 do\n// Search from MSB\nif S0.u64[63 - i] != S0.u64[63] then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", "example": "s_flbit_i32_i64 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 122, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_floor_f16", "mnemonic": "s_floor_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S FLOOR F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Round the half-precision float input down to previous integer and store the result in floating point format into a scalar register.", "description": "Round the half-precision float input down to previous integer and store the result in floating point format into a scalar register.", "syntax": "s_floor_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_floor_f32", "mnemonic": "s_floor_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S FLOOR F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Round the single-precision float input down to previous integer and store the result in floating point format into a scalar register.", "description": "Round the single-precision float input down to previous integer and store the result in floating point format into a scalar register.", "syntax": "s_floor_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_get_barrier_state", "mnemonic": "s_get_barrier_state", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S GET BARRIER STATE", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOP1 scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_get_barrier_state", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_get_pc_i64", "mnemonic": "s_get_pc_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S GET PC I64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOP1 scalar instruction operating on i64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_get_pc_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_get_shader_cycles_u64", "mnemonic": "s_get_shader_cycles_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S GET SHADER CYCLES U64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOP1 scalar instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_get_shader_cycles_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_get_waveid_in_workgroup", "mnemonic": "s_get_waveid_in_workgroup", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S GET WAVEID IN WORKGROUP", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Return the wave's ID within a workgroup 0-(N-1).", "description": "Return the wave's ID within a workgroup 0-(N-1). Return zero if wave is not in a workgroup. ID reflects the order in which waves were created within each workgroup.", "syntax": "s_get_waveid_in_workgroup", "operands": [], "dataTypes": [], "semantics": "", "example": "s_get_waveid_in_workgroup s0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_getpc_b64", "mnemonic": "s_getpc_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S GETPC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Store the address of the next instruction to a scalar register.", "description": "Store the address of the next instruction to a scalar register. The byte address of the instruction immediately following this instruction is saved to the destination.", "syntax": "s_getpc_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.i64 = PC + 4LL", "example": "s_getpc_b64 vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This instruction must be 4 bytes.", "sourcePdfPage": 123, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_gl1_inv", "mnemonic": "s_gl1_inv", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S GL1 INV", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Invalidate the GL1 cache only.", "description": "Invalidate the GL1 cache only.", "syntax": "s_gl1_inv", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_icache_inv", "mnemonic": "s_icache_inv", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ICACHE INV", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Invalidate entire first level instruction cache.", "description": "Invalidate entire first level instruction cache. There must be 16 separate S_NOP instructions or a jump/branch instruction after this instruction to ensure the internal instruction buffers are also invalidated.", "syntax": "s_icache_inv", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 143, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_incperflevel", "mnemonic": "s_incperflevel", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S INCPERFLEVEL", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Increment performance counter specified in SIMM16[3:0] by 1.", "description": "Increment performance counter specified in SIMM16[3:0] by 1.", "syntax": "s_incperflevel", "operands": [], "dataTypes": [], "semantics": "", "example": "s_incperflevel 0x0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 143, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_load_dword", "mnemonic": "s_load_dword", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S LOAD DWORD", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Load one 32-bit dword from memory into a scalar register, wavefront-uniform.", "description": "Load 32 bits of data from the scalar memory into a scalar register.", "syntax": "s_load_dword SDST, SBASE, offset", "operands": [{"name": "SDST", "desc": "Destination SGPR"}, {"name": "SBASE", "desc": "Base address (SGPR pair)"}, {"name": "offset", "desc": "Immediate or SGPR offset"}], "dataTypes": [], "semantics": "SDST = *(SBASE + offset); intended for uniform (not per-lane-varying) addresses such as descriptors and kernel arguments.", "example": "s_load_dword  s4, s[8:9], 0x10   // s4 = *(s[8:9] + 0x10)", "exampleSource": null, "encoding": {"format": "SMEM", "widthBits": 32}, "executionUnit": "Scalar Memory Unit", "registerClasses": ["SGPR"], "memorySegment": "uniform/constant", "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.s_lshl1_add_u32", "mnemonic": "s_lshl1_add_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S LSHL1 ADD U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate the logical shift left of the first input by 1, then add the second input, store the result into a scalar register and set SCC iff the…", "description": "Calculate the logical shift left of the first input by 1, then add the second input, store the result into a scalar register and set SCC iff the summation results in an unsigned overflow.", "syntax": "s_lshl1_add_u32", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = (64'U(S0.u32) << 1U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", "example": "s_lshl1_add_u32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 107, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_lshl2_add_u32", "mnemonic": "s_lshl2_add_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S LSHL2 ADD U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate the logical shift left of the first input by 2, then add the second input, store the result into a scalar register and set SCC iff the…", "description": "Calculate the logical shift left of the first input by 2, then add the second input, store the result into a scalar register and set SCC iff the summation results in an unsigned overflow.", "syntax": "s_lshl2_add_u32", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = (64'U(S0.u32) << 2U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", "example": "s_lshl2_add_u32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 107, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_lshl3_add_u32", "mnemonic": "s_lshl3_add_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S LSHL3 ADD U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate the logical shift left of the first input by 3, then add the second input, store the result into a scalar register and set SCC iff the…", "description": "Calculate the logical shift left of the first input by 3, then add the second input, store the result into a scalar register and set SCC iff the summation results in an unsigned overflow.", "syntax": "s_lshl3_add_u32", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = (64'U(S0.u32) << 3U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", "example": "s_lshl3_add_u32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 107, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_lshl4_add_u32", "mnemonic": "s_lshl4_add_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S LSHL4 ADD U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate the logical shift left of the first input by 4, then add the second input, store the result into a scalar register and set SCC iff the…", "description": "Calculate the logical shift left of the first input by 4, then add the second input, store the result into a scalar register and set SCC iff the summation results in an unsigned overflow.", "syntax": "s_lshl4_add_u32", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = (64'U(S0.u32) << 4U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", "example": "s_lshl4_add_u32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 108, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_lshl_b32", "mnemonic": "s_lshl_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S LSHL B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Given a shift count in the second scalar input, calculate the logical shift left of the first scalar input, store the result into a scalar register…", "description": "Given a shift count in the second scalar input, calculate the logical shift left of the first scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_lshl_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S0.u32 << S1[4 : 0].u32);\nSCC = D0.u32 != 0U", "example": "s_lshl_b32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 103, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_lshl_b64", "mnemonic": "s_lshl_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S LSHL B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Given a shift count in the second scalar input, calculate the logical shift left of the first scalar input, store the result into a scalar register…", "description": "Given a shift count in the second scalar input, calculate the logical shift left of the first scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_lshl_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = (S0.u64 << S1[5 : 0].u32);\nSCC = D0.u64 != 0ULL", "example": "s_lshl_b64 s[0:1], 0, s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 103, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_lshr_b32", "mnemonic": "s_lshr_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S LSHR B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Given a shift count in the second scalar input, calculate the logical shift right of the first scalar input, store the result into a scalar register…", "description": "Given a shift count in the second scalar input, calculate the logical shift right of the first scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_lshr_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S0.u32 >> S1[4 : 0].u32);\nSCC = D0.u32 != 0U", "example": "s_lshr_b32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 103, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_lshr_b64", "mnemonic": "s_lshr_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S LSHR B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Given a shift count in the second scalar input, calculate the logical shift right of the first scalar input, store the result into a scalar register…", "description": "Given a shift count in the second scalar input, calculate the logical shift right of the first scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_lshr_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = (S0.u64 >> S1[5 : 0].u32);\nSCC = D0.u64 != 0ULL", "example": "s_lshr_b64 s[0:1], 0, s4", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 103, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_max_f16", "mnemonic": "s_max_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MAX F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the maximum of two half-precision float inputs and store the selected value into a scalar register.", "description": "Select the maximum of two half-precision float inputs and store the selected value into a scalar register.", "syntax": "s_max_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_max_f32", "mnemonic": "s_max_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MAX F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the maximum of two single-precision float inputs and store the selected value into a scalar register.", "description": "Select the maximum of two single-precision float inputs and store the selected value into a scalar register.", "syntax": "s_max_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_max_i32", "mnemonic": "s_max_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MAX I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the maximum of two signed 32-bit integer inputs, store the selected value into a scalar register and set SCC iff the first value is selected.", "description": "Select the maximum of two signed 32-bit integer inputs, store the selected value into a scalar register and set SCC iff the first value is selected.", "syntax": "s_max_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 >= S1.i32;\nD0.i32 = SCC ? S0.i32 : S1.i32", "example": "s_max_i32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 98, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_max_num_f16", "mnemonic": "s_max_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MAX NUM F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the IEEE maximumNumber() of two half-precision float inputs and store the selected value into a scalar register.", "description": "Select the IEEE maximumNumber() of two half-precision float inputs and store the selected value into a scalar register.", "syntax": "s_max_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_max_num_f32", "mnemonic": "s_max_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MAX NUM F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the IEEE maximumNumber() of two single-precision float inputs and store the selected value into a scalar register.", "description": "Select the IEEE maximumNumber() of two single-precision float inputs and store the selected value into a scalar register.", "syntax": "s_max_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_max_u32", "mnemonic": "s_max_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MAX U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the maximum of two unsigned 32-bit integer inputs, store the selected value into a scalar register and set SCC iff the first value is selected.", "description": "Select the maximum of two unsigned 32-bit integer inputs, store the selected value into a scalar register and set SCC iff the first value is selected.", "syntax": "s_max_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 >= S1.u32;\nD0.u32 = SCC ? S0.u32 : S1.u32", "example": "s_max_u32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 99, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_maximum_f16", "mnemonic": "s_maximum_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MAXIMUM F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the IEEE maximum() of two half-precision float inputs and store the selected value into a scalar register.", "description": "Select the IEEE maximum() of two half-precision float inputs and store the selected value into a scalar register.", "syntax": "s_maximum_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_maximum_f32", "mnemonic": "s_maximum_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MAXIMUM F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the IEEE maximum() of two single-precision float inputs and store the selected value into a scalar register.", "description": "Select the IEEE maximum() of two single-precision float inputs and store the selected value into a scalar register.", "syntax": "s_maximum_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_memrealtime", "mnemonic": "s_memrealtime", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MEMREALTIME", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Return current 64-bit RTC.", "description": "Return current 64-bit RTC.", "syntax": "s_memrealtime", "operands": [], "dataTypes": [], "semantics": "", "example": "s_memrealtime vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 155, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_memtime", "mnemonic": "s_memtime", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MEMTIME", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Return current 64-bit timestamp.", "description": "Return current 64-bit timestamp.", "syntax": "s_memtime", "operands": [], "dataTypes": [], "semantics": "", "example": "s_memtime vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 154, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_min_f16", "mnemonic": "s_min_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MIN F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the minimum of two half-precision float inputs and store the selected value into a scalar register.", "description": "Select the minimum of two half-precision float inputs and store the selected value into a scalar register.", "syntax": "s_min_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_min_f32", "mnemonic": "s_min_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MIN F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the minimum of two single-precision float inputs and store the selected value into a scalar register.", "description": "Select the minimum of two single-precision float inputs and store the selected value into a scalar register.", "syntax": "s_min_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_min_i32", "mnemonic": "s_min_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MIN I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the minimum of two signed 32-bit integer inputs, store the selected value into a scalar register and set SCC iff the first value is selected.", "description": "Select the minimum of two signed 32-bit integer inputs, store the selected value into a scalar register and set SCC iff the first value is selected.", "syntax": "s_min_i32", "operands": [], "dataTypes": ["i32"], "semantics": "SCC = S0.i32 < S1.i32;\nD0.i32 = SCC ? S0.i32 : S1.i32", "example": "s_min_i32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 98, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_min_num_f16", "mnemonic": "s_min_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MIN NUM F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the IEEE minimumNumber() of two half-precision float inputs and store the selected value into a scalar register.", "description": "Select the IEEE minimumNumber() of two half-precision float inputs and store the selected value into a scalar register.", "syntax": "s_min_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_min_num_f32", "mnemonic": "s_min_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MIN NUM F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the IEEE minimumNumber() of two single-precision float inputs and store the selected value into a scalar register.", "description": "Select the IEEE minimumNumber() of two single-precision float inputs and store the selected value into a scalar register.", "syntax": "s_min_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_min_u32", "mnemonic": "s_min_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MIN U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the minimum of two unsigned 32-bit integer inputs, store the selected value into a scalar register and set SCC iff the first value is selected.", "description": "Select the minimum of two unsigned 32-bit integer inputs, store the selected value into a scalar register and set SCC iff the first value is selected.", "syntax": "s_min_u32", "operands": [], "dataTypes": ["u32"], "semantics": "SCC = S0.u32 < S1.u32;\nD0.u32 = SCC ? S0.u32 : S1.u32", "example": "s_min_u32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 98, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_minimum_f16", "mnemonic": "s_minimum_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MINIMUM F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the IEEE minimum() of two half-precision float inputs and store the selected value into a scalar register.", "description": "Select the IEEE minimum() of two half-precision float inputs and store the selected value into a scalar register.", "syntax": "s_minimum_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_minimum_f32", "mnemonic": "s_minimum_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MINIMUM F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Select the IEEE minimum() of two single-precision float inputs and store the selected value into a scalar register.", "description": "Select the IEEE minimum() of two single-precision float inputs and store the selected value into a scalar register.", "syntax": "s_minimum_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_monitor_sleep", "mnemonic": "s_monitor_sleep", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MONITOR SLEEP", "category": "Branch & Control", "instructionClass": "scalar", "summary": "AMDGPU SOPP scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_monitor_sleep", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_mov_b32", "mnemonic": "s_mov_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MOV B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Move scalar input into a scalar register.", "description": "Move scalar input into a scalar register.", "syntax": "s_mov_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.b32 = S0.b32", "example": "s_mov_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 115, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_mov_b64", "mnemonic": "s_mov_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MOV B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Move scalar input into a scalar register.", "description": "Move scalar input into a scalar register.", "syntax": "s_mov_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.b64 = S0.b64", "example": "s_mov_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 115, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_movk_i32", "mnemonic": "s_movk_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MOVK I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Sign extend a literal 16-bit constant and store the result into a scalar register.", "description": "Sign extend a literal 16-bit constant and store the result into a scalar register.", "syntax": "s_movk_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = 32'I(signext(S0.i16))", "example": "s_movk_i32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 109, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_movreld_b32", "mnemonic": "s_movreld_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MOVRELD B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Move data from a scalar input into a relatively-indexed scalar register.", "description": "Move data from a scalar input into a relatively-indexed scalar register.", "syntax": "s_movreld_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = DST.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nSGPR[addr].b32 = S0.b32", "example": "s_movreld_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Example: The following instruction sequence performs the move s15 <= s7: s_mov_b32 m0, 10 s_movreld_b32 s5, s7", "sourcePdfPage": 128, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_movreld_b64", "mnemonic": "s_movreld_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MOVRELD B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Move data from a scalar input into a relatively-indexed scalar register.", "description": "Move data from a scalar input into a relatively-indexed scalar register. The index in M0.u and the operand address in DST.u must be even for this operation.", "syntax": "s_movreld_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = DST.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nSGPR[addr].b64 = S0.b64", "example": "s_movreld_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 128, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_movrels_b32", "mnemonic": "s_movrels_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MOVRELS B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Move data from a relatively-indexed scalar register into another scalar register.", "description": "Move data from a relatively-indexed scalar register into another scalar register.", "syntax": "s_movrels_b32", "operands": [], "dataTypes": ["b32"], "semantics": "addr = SRC0.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nD0.b32 = SGPR[addr].b32", "example": "s_movrels_b32 s0, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Example: The following instruction sequence performs the move s5 <= s17: s_mov_b32 m0, 10 s_movrels_b32 s5, s7", "sourcePdfPage": 127, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_movrels_b64", "mnemonic": "s_movrels_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MOVRELS B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Move data from a relatively-indexed scalar register into another scalar register.", "description": "Move data from a relatively-indexed scalar register into another scalar register. The index in M0.u and the operand address in SRC0.u must be even for this operation.", "syntax": "s_movrels_b64", "operands": [], "dataTypes": ["b64"], "semantics": "addr = SRC0.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nD0.b64 = SGPR[addr].b64", "example": "s_movrels_b64 s[0:1], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 128, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_movrelsd_2_b32", "mnemonic": "s_movrelsd_2_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MOVRELSD 2 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Move data from a relatively-indexed scalar register into another relatively-indexed scalar register, using different offsets for each index.", "description": "Move data from a relatively-indexed scalar register into another relatively-indexed scalar register, using different offsets for each index.", "syntax": "s_movrelsd_2_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_movrelsd_2_b32 s0, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_mul_f16", "mnemonic": "s_mul_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MUL F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Multiply two floating point inputs and store the result into a scalar register.", "description": "Multiply two floating point inputs and store the result into a scalar register.", "syntax": "s_mul_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_mul_f32", "mnemonic": "s_mul_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MUL F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Multiply two floating point inputs and store the result into a scalar register.", "description": "Multiply two floating point inputs and store the result into a scalar register.", "syntax": "s_mul_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_mul_hi_i32", "mnemonic": "s_mul_hi_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MUL HI I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Multiply two signed integers and store the high 32 bits of the result into a scalar register.", "description": "Multiply two signed integers and store the high 32 bits of the result into a scalar register.", "syntax": "s_mul_hi_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = 32'I((64'I(S0.i32) * 64'I(S1.i32)) >> 32U)", "example": "s_mul_hi_i32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 107, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_mul_hi_u32", "mnemonic": "s_mul_hi_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MUL HI U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Multiply two unsigned integers and store the high 32 bits of the result into a scalar register.", "description": "Multiply two unsigned integers and store the high 32 bits of the result into a scalar register.", "syntax": "s_mul_hi_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = 32'U((64'U(S0.u32) * 64'U(S1.u32)) >> 32U)", "example": "s_mul_hi_u32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 106, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_mul_i32", "mnemonic": "s_mul_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MUL I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Multiply two 32-bit signed scalar operands, wavefront-uniform, low 32 bits of the product.", "description": "Multiply two signed 32-bit integer inputs and store the result into a scalar register.", "syntax": "s_mul_i32 SDST, S0, S1", "operands": [{"name": "SDST", "desc": "Destination SGPR"}, {"name": "S0", "desc": "First source SGPR/constant"}, {"name": "S1", "desc": "Second source SGPR/constant"}], "dataTypes": ["i32"], "semantics": "SDST = lo32(S0.i32 * S1.i32).", "example": "s_mul_i32  s2, s0, s1   // s2 = low32(s0 * s1)", "exampleSource": null, "encoding": {"format": "SOP2", "widthBits": 32}, "executionUnit": "Scalar ALU", "registerClasses": ["SGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.s_mul_u64", "mnemonic": "s_mul_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MUL U64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Multiply two unsigned 64-bit integer inputs and store the result into a scalar register.", "description": "Multiply two unsigned 64-bit integer inputs and store the result into a scalar register.", "syntax": "s_mul_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_mulk_i32", "mnemonic": "s_mulk_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S MULK I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Multiply a scalar input with the sign extension of a literal 16-bit constant and store the result into a scalar register.", "description": "Multiply a scalar input with the sign extension of a literal 16-bit constant and store the result into a scalar register.", "syntax": "s_mulk_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = D0.i32 * 32'I(signext(S0.i16))", "example": "s_mulk_i32 s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 111, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_nand_b32", "mnemonic": "s_nand_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S NAND B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise NAND on two scalar inputs, store the result into a scalar register and set SCC if the result is nonzero.", "description": "Calculate bitwise NAND on two scalar inputs, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_nand_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = ~(S0.u32 & S1.u32);\nSCC = D0.u32 != 0U", "example": "s_nand_b32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 101, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_nand_b64", "mnemonic": "s_nand_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S NAND B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise NAND on two scalar inputs, store the result into a scalar register and set SCC if the result is nonzero.", "description": "Calculate bitwise NAND on two scalar inputs, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_nand_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = ~(S0.u64 & S1.u64);\nSCC = D0.u64 != 0ULL", "example": "s_nand_b64 s[0:1], 0, s[4:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 102, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_nand_saveexec_b32", "mnemonic": "s_nand_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S NAND SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise NAND on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is…", "description": "Calculate bitwise NAND on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_nand_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_nand_saveexec_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_nand_saveexec_b64", "mnemonic": "s_nand_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S NAND SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise NAND on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is…", "description": "Calculate bitwise NAND on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_nand_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "saveexec = EXEC.u64;\nEXEC.u64 = ~(S0.u64 & EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL", "example": "s_nand_saveexec_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 126, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_nop", "mnemonic": "s_nop", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S NOP", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Do nothing.", "description": "Do nothing. Delay issue of next instruction by a small, fixed amount. Insert 0..15 wait states based on SIMM16[3:0]. 0x0 means the next instruction can issue on the next clock, 0xf means the next instruction can issue 16 clocks later.", "syntax": "s_nop", "operands": [], "dataTypes": [], "semantics": "for i in 0U : SIMM16.u16[3 : 0].u32 do\nnop()\nendfor", "example": "s_nop 0x0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Examples: s_nop 0         // Wait 1 cycle. s_nop 0xf       // Wait 16 cycles.", "sourcePdfPage": 138, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_nor_b32", "mnemonic": "s_nor_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S NOR B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise NOR on two scalar inputs, store the result into a scalar register and set SCC if the result is nonzero.", "description": "Calculate bitwise NOR on two scalar inputs, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_nor_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = ~(S0.u32 | S1.u32);\nSCC = D0.u32 != 0U", "example": "s_nor_b32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 102, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_nor_b64", "mnemonic": "s_nor_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S NOR B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise NOR on two scalar inputs, store the result into a scalar register and set SCC if the result is nonzero.", "description": "Calculate bitwise NOR on two scalar inputs, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_nor_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = ~(S0.u64 | S1.u64);\nSCC = D0.u64 != 0ULL", "example": "s_nor_b64 s[0:1], 0, s[4:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 102, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_nor_saveexec_b32", "mnemonic": "s_nor_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S NOR SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise NOR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is…", "description": "Calculate bitwise NOR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_nor_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_nor_saveexec_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_nor_saveexec_b64", "mnemonic": "s_nor_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S NOR SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise NOR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is…", "description": "Calculate bitwise NOR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_nor_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "saveexec = EXEC.u64;\nEXEC.u64 = ~(S0.u64 | EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL", "example": "s_nor_saveexec_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 126, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_not_b32", "mnemonic": "s_not_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S NOT B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise negation on a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Calculate bitwise negation on a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_not_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = ~S0.u32;\nSCC = D0.u32 != 0U", "example": "s_not_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 115, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_not_b64", "mnemonic": "s_not_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S NOT B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise negation on a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Calculate bitwise negation on a scalar input, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_not_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = ~S0.u64;\nSCC = D0.u64 != 0ULL", "example": "s_not_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 116, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_or_b32", "mnemonic": "s_or_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S OR B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR on two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Calculate bitwise OR on two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_or_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S0.u32 | S1.u32);\nSCC = D0.u32 != 0U", "example": "s_or_b32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 100, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_or_b64", "mnemonic": "s_or_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S OR B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR on two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Calculate bitwise OR on two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_or_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = (S0.u64 | S1.u64);\nSCC = D0.u64 != 0ULL", "example": "s_or_b64 s[0:1], 0, s[4:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 100, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_or_not0_saveexec_b32", "mnemonic": "s_or_not0_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S OR NOT0 SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise OR on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_or_not0_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_or_not0_saveexec_b32 s5, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_or_not0_saveexec_b64", "mnemonic": "s_or_not0_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S OR NOT0 SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise OR on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_or_not0_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "s_or_not0_saveexec_b64 vcc, 0.5", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_or_not1_b32", "mnemonic": "s_or_not1_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S OR NOT1 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is…", "description": "Calculate bitwise OR with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_or_not1_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_or_not1_b32 s5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_or_not1_b64", "mnemonic": "s_or_not1_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S OR NOT1 B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is…", "description": "Calculate bitwise OR with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_or_not1_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "s_or_not1_b64 vcc, -1, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_or_not1_saveexec_b32", "mnemonic": "s_or_not1_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S OR NOT1 SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise OR on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_or_not1_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_or_not1_saveexec_b32 s5, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_or_not1_saveexec_b64", "mnemonic": "s_or_not1_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S OR NOT1 SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise OR on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_or_not1_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "s_or_not1_saveexec_b64 vcc, 0.5", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_or_saveexec_b32", "mnemonic": "s_or_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S OR SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is…", "description": "Calculate bitwise OR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_or_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_or_saveexec_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_or_saveexec_b64", "mnemonic": "s_or_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S OR SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is…", "description": "Calculate bitwise OR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register. The original EXEC mask is saved to the destination SGPRs before the bitwise operation is performed.", "syntax": "s_or_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 | EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL", "example": "s_or_saveexec_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 125, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_orn1_saveexec_b32", "mnemonic": "s_orn1_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ORN1 SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise OR on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_orn1_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_orn1_saveexec_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_orn1_saveexec_b64", "mnemonic": "s_orn1_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ORN1 SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise OR on the EXEC mask and the negation of the scalar input, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register. The original EXEC mask is saved to the destination SGPRs before the bitwise operation is performed.", "syntax": "s_orn1_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "saveexec = EXEC.u64;\nEXEC.u64 = (~S0.u64 | EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL", "example": "s_orn1_saveexec_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 130, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_orn2_b32", "mnemonic": "s_orn2_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ORN2 B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is…", "description": "Calculate bitwise OR with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_orn2_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S0.u32 | ~S1.u32);\nSCC = D0.u32 != 0U", "example": "s_orn2_b32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 101, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_orn2_b64", "mnemonic": "s_orn2_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ORN2 B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is…", "description": "Calculate bitwise OR with the first input and the negation of the second input, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_orn2_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = (S0.u64 | ~S1.u64);\nSCC = D0.u64 != 0ULL", "example": "s_orn2_b64 s[0:1], 0, s[4:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 101, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_orn2_saveexec_b32", "mnemonic": "s_orn2_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ORN2 SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise OR on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_orn2_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_orn2_saveexec_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_orn2_saveexec_b64", "mnemonic": "s_orn2_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S ORN2 SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise OR on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the…", "description": "Calculate bitwise OR on the scalar input and the negation of the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register. The original EXEC mask is saved to the destination SGPRs before the bitwise operation is performed.", "syntax": "s_orn2_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 | ~EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL", "example": "s_orn2_saveexec_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 126, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_pack_hh_b32_b16", "mnemonic": "s_pack_hh_b32_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S PACK HH B32 B16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Pack two 16-bit scalar values into a scalar register.", "description": "Pack two 16-bit scalar values into a scalar register.", "syntax": "s_pack_hh_b32_b16", "operands": [], "dataTypes": ["b16", "b32"], "semantics": "D0 = { S1[31 : 16].u16, S0[31 : 16].u16 }", "example": "s_pack_hh_b32_b16 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 108, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_pack_hl_b32_b16", "mnemonic": "s_pack_hl_b32_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S PACK HL B32 B16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Pack two 16-bit scalar values into a scalar register.", "description": "Pack two 16-bit scalar values into a scalar register.", "syntax": "s_pack_hl_b32_b16", "operands": [], "dataTypes": ["b16", "b32"], "semantics": "", "example": "s_pack_hl_b32_b16 s5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_pack_lh_b32_b16", "mnemonic": "s_pack_lh_b32_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S PACK LH B32 B16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Pack two 16-bit scalar values into a scalar register.", "description": "Pack two 16-bit scalar values into a scalar register.", "syntax": "s_pack_lh_b32_b16", "operands": [], "dataTypes": ["b16", "b32"], "semantics": "D0 = { S1[31 : 16].u16, S0[15 : 0].u16 }", "example": "s_pack_lh_b32_b16 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 108, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_pack_ll_b32_b16", "mnemonic": "s_pack_ll_b32_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S PACK LL B32 B16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Pack two 16-bit scalar values into a scalar register.", "description": "Pack two 16-bit scalar values into a scalar register.", "syntax": "s_pack_ll_b32_b16", "operands": [], "dataTypes": ["b16", "b32"], "semantics": "D0 = { S1[15 : 0].u16, S0[15 : 0].u16 }", "example": "s_pack_ll_b32_b16 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 108, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_prefetch_data", "mnemonic": "s_prefetch_data", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S PREFETCH DATA", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Prefetch data into the scalar data cache, relative to a base address provided.", "description": "Prefetch data into the scalar data cache, relative to a base address provided.", "syntax": "s_prefetch_data", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_prefetch_data_pc_rel", "mnemonic": "s_prefetch_data_pc_rel", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S PREFETCH DATA PC REL", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Prefetch data into the scalar data cache, relative to the current PC address.", "description": "Prefetch data into the scalar data cache, relative to the current PC address.", "syntax": "s_prefetch_data_pc_rel", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_prefetch_inst", "mnemonic": "s_prefetch_inst", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S PREFETCH INST", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Prefetch instructions into the shader instruction cache, relative to a base address provided.", "description": "Prefetch instructions into the shader instruction cache, relative to a base address provided.", "syntax": "s_prefetch_inst", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_prefetch_inst_pc_rel", "mnemonic": "s_prefetch_inst_pc_rel", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S PREFETCH INST PC REL", "category": "Scalar Memory", "instructionClass": "scalar", "summary": "Prefetch instructions into the shader instruction cache, relative to the current PC address.", "description": "Prefetch instructions into the shader instruction cache, relative to the current PC address.", "syntax": "s_prefetch_inst_pc_rel", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SMEM"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_quadmask_b32", "mnemonic": "s_quadmask_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S QUADMASK B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Reduce a pixel mask from the scalar input into a quad mask, store the result in a scalar register and set SCC iff the result is nonzero.", "description": "Reduce a pixel mask from the scalar input into a quad mask, store the result in a scalar register and set SCC iff the result is nonzero.", "syntax": "s_quadmask_b32", "operands": [], "dataTypes": ["b32"], "semantics": "tmp = 0U;\nfor i in 0 : 7 do\ntmp[i] = S0.u32[i * 4 +: 4] != 0U\nendfor;\nD0.u32 = tmp;\nSCC = D0.u32 != 0U", "example": "s_quadmask_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "To perform the inverse operation see S_BITREPLICATE_B64_B32.", "sourcePdfPage": 127, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_quadmask_b64", "mnemonic": "s_quadmask_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S QUADMASK B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Reduce a pixel mask from the scalar input into a quad mask, store the result in a scalar register and set SCC iff the result is nonzero.", "description": "Reduce a pixel mask from the scalar input into a quad mask, store the result in a scalar register and set SCC iff the result is nonzero.", "syntax": "s_quadmask_b64", "operands": [], "dataTypes": ["b64"], "semantics": "tmp = 0ULL;\nfor i in 0 : 15 do\ntmp[i] = S0.u64[i * 4 +: 4] != 0ULL\nendfor;\nD0.u64 = tmp;\nSCC = D0.u64 != 0ULL", "example": "s_quadmask_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "To perform the inverse operation see S_BITREPLICATE_B64_B32.", "sourcePdfPage": 127, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_rfe_b64", "mnemonic": "s_rfe_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S RFE B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Return from the exception handler.", "description": "Return from the exception handler. Clear the wave's PRIV bit and then jump to an address specified by the scalar input. The argument is a byte address of the instruction to jump to; this address is likely derived from the state passed into the trap handler. This instruction may only be used within a trap handler.", "syntax": "s_rfe_b64", "operands": [], "dataTypes": ["b64"], "semantics": "WAVE_STATUS.PRIV = 1'0U;\nPC = S0.i64", "example": "s_rfe_b64 vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 124, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_rfe_i64", "mnemonic": "s_rfe_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S RFE I64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOP1 scalar instruction operating on i64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_rfe_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_rndne_f16", "mnemonic": "s_rndne_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S RNDNE F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Round the half-precision float input to the nearest even integer and store the result in floating point format into a scalar register.", "description": "Round the half-precision float input to the nearest even integer and store the result in floating point format into a scalar register.", "syntax": "s_rndne_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_rndne_f32", "mnemonic": "s_rndne_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S RNDNE F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Round the single-precision float input to the nearest even integer and store the result in floating point format into a scalar register.", "description": "Round the single-precision float input to the nearest even integer and store the result in floating point format into a scalar register.", "syntax": "s_rndne_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_sendmsg", "mnemonic": "s_sendmsg", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SENDMSG", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Send a message upstream to graphics control hardware. SIMM16[9:0] contains the message type.", "description": "Send a message upstream to graphics control hardware. SIMM16[9:0] contains the message type.", "syntax": "s_sendmsg", "operands": [], "dataTypes": [], "semantics": "", "example": "s_sendmsg 2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 142, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_sendmsghalt", "mnemonic": "s_sendmsghalt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SENDMSGHALT", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Send a message to upstream control hardware and then HALT the wavefront; see S_SENDMSG for details.", "description": "Send a message to upstream control hardware and then HALT the wavefront; see S_SENDMSG for details.", "syntax": "s_sendmsghalt", "operands": [], "dataTypes": [], "semantics": "", "example": "s_sendmsghalt 0x0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 142, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_set_gpr_idx_idx", "mnemonic": "s_set_gpr_idx_idx", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SET GPR IDX IDX", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Set the index used in vector GPR indexing. S_SET_GPR_IDX_ON, S_SET_GPR_IDX_OFF, S_SET_GPR_IDX_MODE and S_SET_GPR_IDX_IDX are related instructions.", "description": "Set the index used in vector GPR indexing. S_SET_GPR_IDX_ON, S_SET_GPR_IDX_OFF, S_SET_GPR_IDX_MODE and S_SET_GPR_IDX_IDX are related instructions.", "syntax": "s_set_gpr_idx_idx", "operands": [], "dataTypes": [], "semantics": "M0[7 : 0] = S0.u32[7 : 0].b8", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 130, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_set_gpr_idx_mode", "mnemonic": "s_set_gpr_idx_mode", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SET GPR IDX MODE", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Modify the mode used for vector GPR indexing.", "description": "Modify the mode used for vector GPR indexing.", "syntax": "s_set_gpr_idx_mode", "operands": [], "dataTypes": [], "semantics": "The raw contents of the source field are read and used to set the enable bits. SIMM16[0] = VSRC0_REL,\nSIMM16[1] = VSRC1_REL, SIMM16[2] = VSRC2_REL and SIMM16[3] = VDST_REL.\nS_SET_GPR_IDX_ON, S_SET_GPR_IDX_OFF, S_SET_GPR_IDX_MODE and S_SET_GPR_IDX_IDX are related\ninstructions.\nM0[15 : 12] = SIMM16.u16[3 : 0].b4", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 145, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_set_gpr_idx_off", "mnemonic": "s_set_gpr_idx_off", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SET GPR IDX OFF", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Clear GPR indexing mode.", "description": "Clear GPR indexing mode. Vector operations after this do not perform relative GPR addressing regardless of the contents of M0. This instruction does not modify M0. S_SET_GPR_IDX_ON, S_SET_GPR_IDX_OFF, S_SET_GPR_IDX_MODE and S_SET_GPR_IDX_IDX are related instructions.", "syntax": "s_set_gpr_idx_off", "operands": [], "dataTypes": [], "semantics": "WAVE_MODE.GPR_IDX_EN = 1'0U", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 145, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_set_inst_prefetch_distance", "mnemonic": "s_set_inst_prefetch_distance", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SET INST PREFETCH DISTANCE", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Change instruction prefetch mode. This controls how many cachelines ahead of the current PC the shader attempts to prefetch.", "description": "Change instruction prefetch mode. This controls how many cachelines ahead of the current PC the shader attempts to prefetch.", "syntax": "s_set_inst_prefetch_distance", "operands": [], "dataTypes": [], "semantics": "", "example": "s_set_inst_prefetch_distance 0xc1d1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_set_pc_i64", "mnemonic": "s_set_pc_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SET PC I64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOP1 scalar instruction operating on i64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_set_pc_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_set_vgpr_msb", "mnemonic": "s_set_vgpr_msb", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SET VGPR MSB", "category": "Branch & Control", "instructionClass": "scalar", "summary": "AMDGPU SOPP scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_set_vgpr_msb", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_sethalt", "mnemonic": "s_sethalt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SETHALT", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Set or clear the HALT status bit.", "description": "Set or clear the HALT status bit.", "syntax": "s_sethalt", "operands": [], "dataTypes": [], "semantics": "Set HALT bit to value of SIMM16[0]; 1 = halt, 0 = clear HALT bit. The halt flag is ignored while PRIV == 1 (inside\ntrap handlers) but the shader halts after the handler returns if HALT is still set at that time.", "example": "s_sethalt 0x0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 141, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_setkill", "mnemonic": "s_setkill", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SETKILL", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Kill this wave if the least significant bit of the immediate constant is 1. Used primarily for debugging kill wave host command behavior.", "description": "Kill this wave if the least significant bit of the immediate constant is 1. Used primarily for debugging kill wave host command behavior.", "syntax": "s_setkill", "operands": [], "dataTypes": [], "semantics": "", "example": "s_setkill 0x0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 141, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_setpc_b64", "mnemonic": "s_setpc_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SETPC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Jump to an address specified in a scalar register. The argument is a byte address of the instruction to jump to.", "description": "Jump to an address specified in a scalar register. The argument is a byte address of the instruction to jump to.", "syntax": "s_setpc_b64", "operands": [], "dataTypes": ["b64"], "semantics": "PC = S0.i64", "example": "s_setpc_b64 vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 123, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_setprio", "mnemonic": "s_setprio", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SETPRIO", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Change wave user priority.", "description": "Change wave user priority.", "syntax": "s_setprio", "operands": [], "dataTypes": [], "semantics": "User settable wave priority is set to SIMM16[1:0]. 0 = lowest, 3 = highest. The overall wave priority is\n{SPIPrio[1:0], UserPrio[1:0], WaveAge[3:0]}.", "example": "s_setprio 0x0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 142, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_setprio_inc_wg", "mnemonic": "s_setprio_inc_wg", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SETPRIO INC WG", "category": "Branch & Control", "instructionClass": "scalar", "summary": "AMDGPU SOPP scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_setprio_inc_wg", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_setvskip", "mnemonic": "s_setvskip", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SETVSKIP", "category": "Comparison", "instructionClass": "scalar", "summary": "Enables or disables VSKIP mode.", "description": "Enables or disables VSKIP mode. When VSKIP is enabled, no VOP*/M*BUF/MIMG/DS/FLAT instructions are issued. Note that VSKIPped memory instructions do not manipulate the waitcnt counters; as a result, if there are outstanding memory requests the shader may want to issue S_WAITCNT 0 prior to enabling VSKIP, otherwise the shader must be careful not to count VSKIPped instructions in waitcnt calculations.", "syntax": "s_setvskip", "operands": [], "dataTypes": [], "semantics": "VSKIP = S0.u32[S1.u32[4 : 0]]", "example": "s_setvskip 1, 0     // Enable vskip mode.\ns_setvskip 0, 0     // Disable vskip mode.", "exampleSource": null, "encoding": {"format": "SOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 136, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_sext_i32_i16", "mnemonic": "s_sext_i32_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SEXT I32 I16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Sign extend a signed 16 bit scalar input to 32 bits and store the result into a scalar register.", "description": "Sign extend a signed 16 bit scalar input to 32 bits and store the result into a scalar register.", "syntax": "s_sext_i32_i16", "operands": [], "dataTypes": ["i16", "i32"], "semantics": "D0.i32 = 32'I(signext(S0.i16))", "example": "s_sext_i32_i16 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 122, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_sext_i32_i8", "mnemonic": "s_sext_i32_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SEXT I32 I8", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Sign extend a signed 8 bit scalar input to 32 bits and store the result into a scalar register.", "description": "Sign extend a signed 8 bit scalar input to 32 bits and store the result into a scalar register.", "syntax": "s_sext_i32_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "D0.i32 = 32'I(signext(S0.i8))", "example": "s_sext_i32_i8 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 122, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_sleep", "mnemonic": "s_sleep", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SLEEP", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Cause a wave to sleep for up to ~8000 clocks.", "description": "Cause a wave to sleep for up to ~8000 clocks. The wave sleeps for (64*(SIMM16[6:0]-1) .. 64*SIMM16[6:0]) clocks. The exact amount of delay is approximate. Compare with S_NOP. When SIMM16[6:0] is zero then no sleep occurs.", "syntax": "s_sleep", "operands": [], "dataTypes": [], "semantics": "", "example": "s_sleep 0x0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Examples: s_sleep 0       // Wait for 0 clocks. s_sleep 1       // Wait for 1-64 clocks. s_sleep 2       // Wait for 65-128 clocks.", "sourcePdfPage": 142, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_sleep_var", "mnemonic": "s_sleep_var", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SLEEP VAR", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Cause a wave to sleep for up to ~8000 clocks, or to sleep until an external event wakes the wave up.", "description": "Cause a wave to sleep for up to ~8000 clocks, or to sleep until an external event wakes the wave up.", "syntax": "s_sleep_var", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_soft_wait_bvhcnt", "mnemonic": "s_soft_wait_bvhcnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SOFT WAIT BVHCNT", "category": "Branch & Control", "instructionClass": "scalar", "summary": "AMDGPU SOPP scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_soft_wait_bvhcnt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_soft_wait_dscnt", "mnemonic": "s_soft_wait_dscnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SOFT WAIT DSCNT", "category": "Branch & Control", "instructionClass": "scalar", "summary": "AMDGPU SOPP scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_soft_wait_dscnt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_soft_wait_kmcnt", "mnemonic": "s_soft_wait_kmcnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SOFT WAIT KMCNT", "category": "Branch & Control", "instructionClass": "scalar", "summary": "AMDGPU SOPP scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_soft_wait_kmcnt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_soft_wait_loadcnt", "mnemonic": "s_soft_wait_loadcnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SOFT WAIT LOADCNT", "category": "Branch & Control", "instructionClass": "scalar", "summary": "AMDGPU SOPP scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_soft_wait_loadcnt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_soft_wait_samplecnt", "mnemonic": "s_soft_wait_samplecnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SOFT WAIT SAMPLECNT", "category": "Branch & Control", "instructionClass": "scalar", "summary": "AMDGPU SOPP scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_soft_wait_samplecnt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_soft_wait_storecnt", "mnemonic": "s_soft_wait_storecnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SOFT WAIT STORECNT", "category": "Branch & Control", "instructionClass": "scalar", "summary": "AMDGPU SOPP scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_soft_wait_storecnt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_soft_waitcnt", "mnemonic": "s_soft_waitcnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SOFT WAITCNT", "category": "Branch & Control", "instructionClass": "scalar", "summary": "AMDGPU SOPP scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_soft_waitcnt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_soft_waitcnt_vscnt", "mnemonic": "s_soft_waitcnt_vscnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SOFT WAITCNT VSCNT", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOPK scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_soft_waitcnt_vscnt", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_sub_co_ci_u32", "mnemonic": "s_sub_co_ci_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SUB CO CI U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Subtract the second unsigned 32-bit integer input from the first input, subtract the carry-in bit, store the result into a scalar register and store…", "description": "Subtract the second unsigned 32-bit integer input from the first input, subtract the carry-in bit, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_sub_co_ci_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_sub_co_i32", "mnemonic": "s_sub_co_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SUB CO I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Subtract the second signed 32-bit integer input from the first input, store the result into a scalar register and store the carry-out bit into SCC.", "description": "Subtract the second signed 32-bit integer input from the first input, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_sub_co_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_sub_co_u32", "mnemonic": "s_sub_co_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SUB CO U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Subtract the second unsigned 32-bit integer input from the first input, store the result into a scalar register and store the carry-out bit into SCC.", "description": "Subtract the second unsigned 32-bit integer input from the first input, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_sub_co_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_sub_f16", "mnemonic": "s_sub_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SUB F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Subtract the second floating point input from the first input and store the result in a scalar register.", "description": "Subtract the second floating point input from the first input and store the result in a scalar register.", "syntax": "s_sub_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_sub_f32", "mnemonic": "s_sub_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SUB F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Subtract the second floating point input from the first input and store the result in a scalar register.", "description": "Subtract the second floating point input from the first input and store the result in a scalar register.", "syntax": "s_sub_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_sub_i32", "mnemonic": "s_sub_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SUB I32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Subtract the second signed 32-bit integer input from the first input, store the result into a scalar register and store the carry-out bit into SCC.", "description": "Subtract the second signed 32-bit integer input from the first input, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_sub_i32", "operands": [], "dataTypes": ["i32"], "semantics": "tmp = S0.i32 - S1.i32;\nSCC = ((S0.u32[31] != S1.u32[31]) && (S0.u32[31] != tmp.u32[31]));\n// signed overflow.\nD0.i32 = tmp.i32", "example": "s_sub_i32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This opcode is not suitable for use with S_SUBB_U32 for implementing 64-bit operations.", "sourcePdfPage": 97, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_sub_nc_u64", "mnemonic": "s_sub_nc_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SUB NC U64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Subtract the second unsigned 64-bit integer input from the first input and store the result into a scalar register.", "description": "Subtract the second unsigned 64-bit integer input from the first input and store the result into a scalar register.", "syntax": "s_sub_nc_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_sub_u32", "mnemonic": "s_sub_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SUB U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Subtract two 32-bit unsigned scalar operands, wavefront-uniform.", "description": "Subtract the second unsigned 32-bit integer input from the first input, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_sub_u32 SDST, S0, S1", "operands": [{"name": "SDST", "desc": "Destination SGPR"}, {"name": "S0", "desc": "Minuend SGPR/constant"}, {"name": "S1", "desc": "Subtrahend SGPR/constant"}], "dataTypes": ["u32"], "semantics": "SDST = S0.u32 - S1.u32; SCC = borrow-out.", "example": "s_sub_u32  s2, s0, s1   // s2 = s0 - s1", "exampleSource": null, "encoding": {"format": "SOP2", "widthBits": 32}, "executionUnit": "Scalar ALU", "registerClasses": ["SGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.s_sub_u64", "mnemonic": "s_sub_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SUB U64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOP2 scalar instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_sub_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_subb_u32", "mnemonic": "s_subb_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SUBB U32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Subtract the second unsigned 32-bit integer input from the first input, subtract the carry-in bit, store the result into a scalar register and store…", "description": "Subtract the second unsigned 32-bit integer input from the first input, subtract the carry-in bit, store the result into a scalar register and store the carry-out bit into SCC.", "syntax": "s_subb_u32", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = S0.u32 - S1.u32 - SCC.u32;\nSCC = 64'U(S1.u32) + SCC.u64 > 64'U(S0.u32) ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_SUBB_U32.\nD0.u32 = tmp.u32", "example": "s_subb_u32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 98, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_subvector_loop_begin", "mnemonic": "s_subvector_loop_begin", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SUBVECTOR LOOP BEGIN", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Begin execution of a subvector block of code.", "description": "Begin execution of a subvector block of code.", "syntax": "s_subvector_loop_begin", "operands": [], "dataTypes": [], "semantics": "", "example": "s_subvector_loop_begin s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_subvector_loop_end", "mnemonic": "s_subvector_loop_end", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SUBVECTOR LOOP END", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "End execution of a subvector block of code.", "description": "End execution of a subvector block of code.", "syntax": "s_subvector_loop_end", "operands": [], "dataTypes": [], "semantics": "", "example": "s_subvector_loop_end s0, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_swap_pc_i64", "mnemonic": "s_swap_pc_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SWAP PC I64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOP1 scalar instruction operating on i64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_swap_pc_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_swappc_b64", "mnemonic": "s_swappc_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S SWAPPC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Store the address of the next instruction to a scalar register and then jump to an address specified in the scalar input.", "description": "Store the address of the next instruction to a scalar register and then jump to an address specified in the scalar input. The argument is a byte address of the instruction to jump to. The byte address of the instruction immediately following this instruction is saved to the destination.", "syntax": "s_swappc_b64", "operands": [], "dataTypes": ["b64"], "semantics": "jump_addr = S0.i64;\nD0.i64 = PC + 4LL;\nPC = jump_addr.i64", "example": "s_swappc_b64 s[0:1], vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This instruction must be 4 bytes.", "sourcePdfPage": 124, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_trap", "mnemonic": "s_trap", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S TRAP", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Enter the trap handler.", "description": "Enter the trap handler.", "syntax": "s_trap", "operands": [], "dataTypes": [], "semantics": "This instruction may be generated internally as well in response to a host trap (HT = 1) or an exception. TrapID\n0 is reserved for hardware use and should not be used in a shader-generated trap.\nTrapID = SIMM16.u16[7 : 0];\n\"Wait for all instructions to complete\";\n// PC passed into trap handler points to S_TRAP itself,\n// *not* to the next instruction.\n{ TTMP[1], TTMP[0] } = { 3'0, PCRewind[3 : 0], HT[0], TrapID[7 : 0], PC[47 : 0] };\nPC = TBA.i64;\n// trap base address\nWAVE_STATUS.PRIV = 1'1U", "example": "s_trap 0x0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 142, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_trunc_f16", "mnemonic": "s_trunc_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S TRUNC F16", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Compute the integer part of a half-precision float input using round toward zero semantics and store the result in floating point format into a…", "description": "Compute the integer part of a half-precision float input using round toward zero semantics and store the result in floating point format into a scalar register.", "syntax": "s_trunc_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_trunc_f32", "mnemonic": "s_trunc_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S TRUNC F32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Compute the integer part of a single-precision float input using round toward zero semantics and store the result in floating point format into a…", "description": "Compute the integer part of a single-precision float input using round toward zero semantics and store the result in floating point format into a scalar register.", "syntax": "s_trunc_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_ttracedata", "mnemonic": "s_ttracedata", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S TTRACEDATA", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Send M0 as user data to the thread trace stream.", "description": "Send M0 as user data to the thread trace stream.", "syntax": "s_ttracedata", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 143, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_wait_alu", "mnemonic": "s_wait_alu", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S WAIT ALU", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Wait for one or more ALU-centric counters to fall below specified values.", "description": "Wait for one or more ALU-centric counters to fall below specified values.", "syntax": "s_wait_alu", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.s_wait_event", "mnemonic": "s_wait_event", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S WAIT EVENT", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Wait for an event to occur or a condition to be satisfied before continuing. The SIMM16 argument specifies which event(s) to wait on.", "description": "Wait for an event to occur or a condition to be satisfied before continuing. The SIMM16 argument specifies which event(s) to wait on.", "syntax": "s_wait_event", "operands": [], "dataTypes": [], "semantics": "", "example": "s_wait_event 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_waitcnt", "mnemonic": "s_waitcnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S WAITCNT", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Wait for the counts of outstanding local data share, vector memory and export instructions to be at or below the specified levels.", "description": "Wait for the counts of outstanding local data share, vector memory and export instructions to be at or below the specified levels.", "syntax": "s_waitcnt", "operands": [], "dataTypes": [], "semantics": "SIMM16[3:0] = vmcount (vector memory operations) lower bits [3:0],\nSIMM16[6:4] = export/mem-write-data count,\nSIMM16[11:8] = LGKMcnt (scalar-mem/GDS/LDS count),\nSIMM16[15:14] = vmcount (vector memory operations) upper bits [5:4].", "example": "s_waitcnt 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 141, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_waitcnt_expcnt", "mnemonic": "s_waitcnt_expcnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S WAITCNT EXPCNT", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Wait for the EXPCNT counter to be at or below the specified level. The EXPCNT counter tracks the number of outstanding export events.", "description": "Wait for the EXPCNT counter to be at or below the specified level. The EXPCNT counter tracks the number of outstanding export events.", "syntax": "s_waitcnt_expcnt", "operands": [], "dataTypes": [], "semantics": "", "example": "s_waitcnt_expcnt null, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_waitcnt_lgkmcnt", "mnemonic": "s_waitcnt_lgkmcnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S WAITCNT LGKMCNT", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Wait for the LGKMCNT counter to be at or below the specified level.", "description": "Wait for the LGKMCNT counter to be at or below the specified level. The LGKMCNT counter tracks the number of outstanding local data share (L), global data share (G), scalar memory (K) and message (M) events.", "syntax": "s_waitcnt_lgkmcnt", "operands": [], "dataTypes": [], "semantics": "", "example": "s_waitcnt_lgkmcnt null, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_waitcnt_vmcnt", "mnemonic": "s_waitcnt_vmcnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S WAITCNT VMCNT", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Wait for the VMCNT counter to be at or below the specified level.", "description": "Wait for the VMCNT counter to be at or below the specified level. The VMCNT counter tracks the number of outstanding vector memory loads and atomics that do return data. When in 'all-in-order' mode, wait for all load and store vector memory events.", "syntax": "s_waitcnt_vmcnt", "operands": [], "dataTypes": [], "semantics": "", "example": "s_waitcnt_vmcnt null, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_waitcnt_vscnt", "mnemonic": "s_waitcnt_vscnt", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S WAITCNT VSCNT", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Wait for the VSCNT counter to be at or below the specified level.", "description": "Wait for the VSCNT counter to be at or below the specified level. The VSCNT counter tracks the number of outstanding vector memory stores and atomics that do not return data. This counter is not used in 'all-in-order' mode.", "syntax": "s_waitcnt_vscnt", "operands": [], "dataTypes": [], "semantics": "", "example": "s_waitcnt_vscnt null, 0x1234", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOPK"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_wakeup", "mnemonic": "s_wakeup", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S WAKEUP", "category": "Branch & Control", "instructionClass": "scalar", "summary": "Allow a wave to 'ping' all the other waves in its threadgroup to force them to wake up early from an S_SLEEP instruction.", "description": "Allow a wave to 'ping' all the other waves in its threadgroup to force them to wake up early from an S_SLEEP instruction. The ping is ignored if the waves are not sleeping. This allows for efficient polling on a memory location. The waves which are polling can sit in a long S_SLEEP between memory reads, but the wave which writes the value can tell them all to wake up early now that the data is available. This method is also safe from races since any waves that miss the ping resume when they complete their S_SLEEP. If the wave executing S_WAKEUP is in a threadgroup (in_tg set), then it wakes up all waves associated with the same threadgroup ID. Otherwise, S_WAKEUP is treated as an S_NOP.", "syntax": "s_wakeup", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOPP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 139, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.s_wakeup_barrier", "mnemonic": "s_wakeup_barrier", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S WAKEUP BARRIER", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "AMDGPU SOP1 scalar instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "s_wakeup_barrier", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.s_wqm_b32", "mnemonic": "s_wqm_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S WQM B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Given an active pixel mask in a scalar input, calculate whole quad mode mask for that input, store the result into a scalar register and set SCC iff…", "description": "Given an active pixel mask in a scalar input, calculate whole quad mode mask for that input, store the result into a scalar register and set SCC iff the result is nonzero. In whole quad mode, if any pixel in a quad is active then all pixels of the quad are marked active.", "syntax": "s_wqm_b32", "operands": [], "dataTypes": ["b32"], "semantics": "tmp = 0U;\ndeclare i : 6'U;\nfor i in 6'0U : 6'31U do\ntmp[i] = S0.u32[i & 6'60U +: 6'4U] != 0U\nendfor;\nD0.u32 = tmp;\nSCC = D0.u32 != 0U", "example": "s_wqm_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 116, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_wqm_b64", "mnemonic": "s_wqm_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S WQM B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Given an active pixel mask in a scalar input, calculate whole quad mode mask for that input, store the result into a scalar register and set SCC iff…", "description": "Given an active pixel mask in a scalar input, calculate whole quad mode mask for that input, store the result into a scalar register and set SCC iff the result is nonzero. In whole quad mode, if any pixel in a quad is active then all pixels of the quad are marked active.", "syntax": "s_wqm_b64", "operands": [], "dataTypes": ["b64"], "semantics": "tmp = 0ULL;\ndeclare i : 6'U;\nfor i in 6'0U : 6'63U do\ntmp[i] = S0.u64[i & 6'60U +: 6'4U] != 0ULL\nendfor;\nD0.u64 = tmp;\nSCC = D0.u64 != 0ULL", "example": "s_wqm_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 116, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_xnor_b32", "mnemonic": "s_xnor_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S XNOR B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise XNOR on two scalar inputs, store the result into a scalar register and set SCC if the result is nonzero.", "description": "Calculate bitwise XNOR on two scalar inputs, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_xnor_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = ~(S0.u32 ^ S1.u32);\nSCC = D0.u32 != 0U", "example": "s_xnor_b32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 102, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_xnor_b64", "mnemonic": "s_xnor_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S XNOR B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise XNOR on two scalar inputs, store the result into a scalar register and set SCC if the result is nonzero.", "description": "Calculate bitwise XNOR on two scalar inputs, store the result into a scalar register and set SCC if the result is nonzero.", "syntax": "s_xnor_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = ~(S0.u64 ^ S1.u64);\nSCC = D0.u64 != 0ULL", "example": "s_xnor_b64 s[0:1], 0, s[4:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 103, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_xnor_saveexec_b32", "mnemonic": "s_xnor_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S XNOR SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise XNOR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is…", "description": "Calculate bitwise XNOR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_xnor_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_xnor_saveexec_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_xnor_saveexec_b64", "mnemonic": "s_xnor_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S XNOR SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise XNOR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is…", "description": "Calculate bitwise XNOR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_xnor_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "saveexec = EXEC.u64;\nEXEC.u64 = ~(S0.u64 ^ EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL", "example": "s_xnor_saveexec_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 126, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_xor_b32", "mnemonic": "s_xor_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S XOR B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise XOR on two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Calculate bitwise XOR on two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_xor_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S0.u32 ^ S1.u32);\nSCC = D0.u32 != 0U", "example": "s_xor_b32 s0, 0, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 100, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_xor_b64", "mnemonic": "s_xor_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S XOR B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise XOR on two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "description": "Calculate bitwise XOR on two scalar inputs, store the result into a scalar register and set SCC iff the result is nonzero.", "syntax": "s_xor_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = (S0.u64 ^ S1.u64);\nSCC = D0.u64 != 0ULL", "example": "s_xor_b64 s[0:1], 0, s[4:5]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 100, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_xor_saveexec_b32", "mnemonic": "s_xor_saveexec_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S XOR SAVEEXEC B32", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise XOR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is…", "description": "Calculate bitwise XOR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register.", "syntax": "s_xor_saveexec_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "s_xor_saveexec_b32 s0, 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.s_xor_saveexec_b64", "mnemonic": "s_xor_saveexec_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "S XOR SAVEEXEC B64", "category": "Scalar Arithmetic", "instructionClass": "scalar", "summary": "Calculate bitwise XOR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is…", "description": "Calculate bitwise XOR on the scalar input and the EXEC mask, store the calculated result into the EXEC mask, set SCC iff the calculated result is nonzero and store the original value of the EXEC mask into the scalar destination register. The original EXEC mask is saved to the destination SGPRs before the bitwise operation is performed.", "syntax": "s_xor_saveexec_b64", "operands": [], "dataTypes": ["b64"], "semantics": "saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 ^ EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL", "example": "s_xor_saveexec_b64 s[0:1], 0", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 125, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_load_block", "mnemonic": "scratch_load_block", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD BLOCK", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load a block of data from the scratch aperture.", "description": "Load a block of data from the scratch aperture.", "syntax": "scratch_load_block", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.scratch_load_dword", "mnemonic": "scratch_load_dword", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD DWORD", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 32 bits of data from the scratch aperture into a vector register.", "description": "Load 32 bits of data from the scratch aperture into a vector register.", "syntax": "scratch_load_dword", "operands": [], "dataTypes": [], "semantics": "", "example": "scratch_load_dword v5, v1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_load_dwordx2", "mnemonic": "scratch_load_dwordx2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD DWORDX2", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 64 bits of data from the scratch aperture into a vector register.", "description": "Load 64 bits of data from the scratch aperture into a vector register.", "syntax": "scratch_load_dwordx2", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32", "example": "scratch_load_dwordx2 v[5:6], v1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 498, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_load_dwordx3", "mnemonic": "scratch_load_dwordx3", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD DWORDX3", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 96 bits of data from the scratch aperture into a vector register.", "description": "Load 96 bits of data from the scratch aperture into a vector register.", "syntax": "scratch_load_dwordx3", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32", "example": "scratch_load_dwordx3 v[5:7], v1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 498, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_load_dwordx4", "mnemonic": "scratch_load_dwordx4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD DWORDX4", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 128 bits of data from the scratch aperture into a vector register.", "description": "Load 128 bits of data from the scratch aperture into a vector register.", "syntax": "scratch_load_dwordx4", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32;\nVDATA[127 : 96] = MEM[addr + 12U].b32", "example": "scratch_load_dwordx4 v[5:8], v1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 498, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_load_lds_dword", "mnemonic": "scratch_load_lds_dword", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD LDS DWORD", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 32 bits of untyped data from the scratch aperture and store the result into a data share.", "description": "Load 32 bits of untyped data from the scratch aperture and store the result into a data share.", "syntax": "scratch_load_lds_dword", "operands": [], "dataTypes": [], "semantics": "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 502, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.scratch_load_lds_sbyte", "mnemonic": "scratch_load_lds_sbyte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD LDS SBYTE", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 8 bits of untyped data from the scratch aperture, sign extend to 32 bits and store the result into a data share.", "description": "Load 8 bits of untyped data from the scratch aperture, sign extend to 32 bits and store the result into a data share.", "syntax": "scratch_load_lds_sbyte", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 502, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.scratch_load_lds_sshort", "mnemonic": "scratch_load_lds_sshort", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD LDS SSHORT", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 16 bits of untyped data from the scratch aperture, sign extend to 32 bits and store the result into a data share.", "description": "Load 16 bits of untyped data from the scratch aperture, sign extend to 32 bits and store the result into a data share.", "syntax": "scratch_load_lds_sshort", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 502, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.scratch_load_lds_ubyte", "mnemonic": "scratch_load_lds_ubyte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD LDS UBYTE", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 8 bits of untyped data from the scratch aperture, zero extend to 32 bits and store the result into a data share.", "description": "Load 8 bits of untyped data from the scratch aperture, zero extend to 32 bits and store the result into a data share.", "syntax": "scratch_load_lds_ubyte", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 501, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.scratch_load_lds_ushort", "mnemonic": "scratch_load_lds_ushort", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD LDS USHORT", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 16 bits of untyped data from the scratch aperture, zero extend to 32 bits and store the result into a data share.", "description": "Load 16 bits of untyped data from the scratch aperture, zero extend to 32 bits and store the result into a data share.", "syntax": "scratch_load_lds_ushort", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 502, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.scratch_load_sbyte", "mnemonic": "scratch_load_sbyte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD SBYTE", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from the scratch aperture, sign extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of signed data from the scratch aperture, sign extend to 32 bits and store the result into a vector register.", "syntax": "scratch_load_sbyte", "operands": [], "dataTypes": [], "semantics": "", "example": "scratch_load_sbyte v5, v1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_load_sbyte_d16", "mnemonic": "scratch_load_sbyte_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD SBYTE D16", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from the scratch aperture, sign extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 8 bits of signed data from the scratch aperture, sign extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "scratch_load_sbyte_d16", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[15 : 0].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[31:16] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 500, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.scratch_load_sbyte_d16_hi", "mnemonic": "scratch_load_sbyte_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD SBYTE D16 HI", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 8 bits of signed data from the scratch aperture, sign extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 8 bits of signed data from the scratch aperture, sign extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "scratch_load_sbyte_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 16].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[15:0] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 501, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.scratch_load_short_d16", "mnemonic": "scratch_load_short_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD SHORT D16", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from the scratch aperture and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 16 bits of unsigned data from the scratch aperture and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "scratch_load_short_d16", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = MEM[addr].b16;\n// VDATA[31:16] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 501, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.scratch_load_short_d16_hi", "mnemonic": "scratch_load_short_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD SHORT D16 HI", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from the scratch aperture and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 16 bits of unsigned data from the scratch aperture and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "scratch_load_short_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 16].b16 = MEM[addr].b16;\n// VDATA[15:0] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 501, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.scratch_load_sshort", "mnemonic": "scratch_load_sshort", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD SSHORT", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 16 bits of signed data from the scratch aperture, sign extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of signed data from the scratch aperture, sign extend to 32 bits and store the result into a vector register.", "syntax": "scratch_load_sshort", "operands": [], "dataTypes": [], "semantics": "", "example": "scratch_load_sshort v5, v1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_load_ubyte", "mnemonic": "scratch_load_ubyte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD UBYTE", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from the scratch aperture, zero extend to 32 bits and store the result into a vector register.", "description": "Load 8 bits of unsigned data from the scratch aperture, zero extend to 32 bits and store the result into a vector register.", "syntax": "scratch_load_ubyte", "operands": [], "dataTypes": [], "semantics": "", "example": "scratch_load_ubyte v5, v1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_load_ubyte_d16", "mnemonic": "scratch_load_ubyte_d16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD UBYTE D16", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from the scratch aperture, zero extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "description": "Load 8 bits of unsigned data from the scratch aperture, zero extend to 16 bits and store the result into the low 16 bits of a 32-bit vector register.", "syntax": "scratch_load_ubyte_d16", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[31:16] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 500, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.scratch_load_ubyte_d16_hi", "mnemonic": "scratch_load_ubyte_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD UBYTE D16 HI", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 8 bits of unsigned data from the scratch aperture, zero extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "description": "Load 8 bits of unsigned data from the scratch aperture, zero extend to 16 bits and store the result into the high 16 bits of a 32-bit vector register.", "syntax": "scratch_load_ubyte_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[15:0] is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 500, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.scratch_load_ushort", "mnemonic": "scratch_load_ushort", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH LOAD USHORT", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Load 16 bits of unsigned data from the scratch aperture, zero extend to 32 bits and store the result into a vector register.", "description": "Load 16 bits of unsigned data from the scratch aperture, zero extend to 32 bits and store the result into a vector register.", "syntax": "scratch_load_ushort", "operands": [], "dataTypes": [], "semantics": "", "example": "scratch_load_ushort v5, v1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_store_block", "mnemonic": "scratch_store_block", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH STORE BLOCK", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Store a block of data to the scratch aperture.", "description": "Store a block of data to the scratch aperture.", "syntax": "scratch_store_block", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.scratch_store_byte", "mnemonic": "scratch_store_byte", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH STORE BYTE", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Store 8 bits of data from a vector register into the scratch aperture.", "description": "Store 8 bits of data from a vector register into the scratch aperture.", "syntax": "scratch_store_byte", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[7 : 0]", "example": "scratch_store_byte v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 498, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_store_byte_d16_hi", "mnemonic": "scratch_store_byte_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH STORE BYTE D16 HI", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Store 8 bits of data from the high 16 bits of a 32-bit vector register into the scratch aperture.", "description": "Store 8 bits of data from the high 16 bits of a 32-bit vector register into the scratch aperture.", "syntax": "scratch_store_byte_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[23 : 16]", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 499, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.scratch_store_dword", "mnemonic": "scratch_store_dword", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH STORE DWORD", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Store 32 bits of data from vector input registers into the scratch aperture.", "description": "Store 32 bits of data from vector input registers into the scratch aperture.", "syntax": "scratch_store_dword", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0]", "example": "scratch_store_dword v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 499, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_store_dwordx2", "mnemonic": "scratch_store_dwordx2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH STORE DWORDX2", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Store 64 bits of data from vector input registers into the scratch aperture.", "description": "Store 64 bits of data from vector input registers into the scratch aperture.", "syntax": "scratch_store_dwordx2", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32]", "example": "scratch_store_dwordx2 v1, v[2:3], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 499, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_store_dwordx3", "mnemonic": "scratch_store_dwordx3", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH STORE DWORDX3", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Store 96 bits of data from vector input registers into the scratch aperture.", "description": "Store 96 bits of data from vector input registers into the scratch aperture.", "syntax": "scratch_store_dwordx3", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64]", "example": "scratch_store_dwordx3 v1, v[2:4], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 500, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_store_dwordx4", "mnemonic": "scratch_store_dwordx4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH STORE DWORDX4", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Store 128 bits of data from vector input registers into the scratch aperture.", "description": "Store 128 bits of data from vector input registers into the scratch aperture.", "syntax": "scratch_store_dwordx4", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64];\nMEM[addr + 12U].b32 = VDATA[127 : 96]", "example": "scratch_store_dwordx4 v1, v[2:5], s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 500, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_store_short", "mnemonic": "scratch_store_short", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH STORE SHORT", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Store 16 bits of data from a vector register into the scratch aperture.", "description": "Store 16 bits of data from a vector register into the scratch aperture.", "syntax": "scratch_store_short", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[15 : 0]", "example": "scratch_store_short v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 499, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.scratch_store_short_d16_hi", "mnemonic": "scratch_store_short_d16_hi", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "SCRATCH STORE SHORT D16 HI", "category": "Scratch Memory", "instructionClass": "vector", "summary": "Store 16 bits of data from the high 16 bits of a 32-bit vector register into the scratch aperture.", "description": "Store 16 bits of data from the high 16 bits of a 32-bit vector register into the scratch aperture.", "syntax": "scratch_store_short_d16_hi", "operands": [], "dataTypes": [], "semantics": "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[31 : 16]", "example": null, "exampleSource": null, "encoding": {"format": "SCRATCH"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 499, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.tbuffer_load_d16_format_x", "mnemonic": "tbuffer_load_d16_format_x", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER LOAD D16 FORMAT X", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 1-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 1-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into a vector register. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_load_d16_format_x", "operands": [], "dataTypes": [], "semantics": "", "example": "tbuffer_load_d16_format_x v255, off, s[8:11], s3, format:1 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_load_d16_format_xy", "mnemonic": "tbuffer_load_d16_format_xy", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER LOAD D16 FORMAT XY", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 2-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 2-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into a vector register. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_load_d16_format_xy", "operands": [], "dataTypes": [], "semantics": "", "example": "tbuffer_load_d16_format_xy v255, off, s[8:11], s3, format:6 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_load_d16_format_xyz", "mnemonic": "tbuffer_load_d16_format_xyz", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER LOAD D16 FORMAT XYZ", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 3-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 3-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into a vector register. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_load_d16_format_xyz", "operands": [], "dataTypes": [], "semantics": "", "example": "tbuffer_load_d16_format_xyz v[4:5], off, ttmp[4:7], 61, format:13 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_load_d16_format_xyzw", "mnemonic": "tbuffer_load_d16_format_xyzw", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER LOAD D16 FORMAT XYZW", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 4-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 4-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into a vector register. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_load_d16_format_xyzw", "operands": [], "dataTypes": [], "semantics": "", "example": "tbuffer_load_d16_format_xyzw v[4:5], off, ttmp[4:7], 61, format:18 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_load_format_d16_x", "mnemonic": "tbuffer_load_format_d16_x", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER LOAD FORMAT D16 X", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 1-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 1-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into a vector register. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_load_format_d16_x", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\n// VDATA[31:16].b16 is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 479, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.tbuffer_load_format_d16_xy", "mnemonic": "tbuffer_load_format_d16_xy", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER LOAD FORMAT D16 XY", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 2-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 2-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into a vector register. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_load_format_d16_xy", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]))", "example": null, "exampleSource": null, "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 479, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.tbuffer_load_format_d16_xyz", "mnemonic": "tbuffer_load_format_d16_xyz", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER LOAD FORMAT D16 XYZ", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 3-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 3-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into a vector register. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_load_format_d16_xyz", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetZ()]));\n// VDATA[63:48].b16 is preserved.", "example": null, "exampleSource": null, "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 480, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.tbuffer_load_format_d16_xyzw", "mnemonic": "tbuffer_load_format_d16_xyzw", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER LOAD FORMAT D16 XYZW", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 4-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result…", "description": "Load 4-component formatted data from a buffer surface, convert the data to packed 16 bit integral or floating point format, then store the result into a vector register. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_load_format_d16_xyzw", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetZ()]));\nVDATA[63 : 48].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetW()]))", "example": null, "exampleSource": null, "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 480, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.tbuffer_load_format_x", "mnemonic": "tbuffer_load_format_x", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER LOAD FORMAT X", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 1-component formatted data from a buffer surface, convert the data to 32 bit integral or floating point format, then store the result into a…", "description": "Load 1-component formatted data from a buffer surface, convert the data to 32 bit integral or floating point format, then store the result into a vector register. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_load_format_x", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format", "example": "tbuffer_load_format_x v255, off, s[8:11], s3, format:21 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 477, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_load_format_xy", "mnemonic": "tbuffer_load_format_xy", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER LOAD FORMAT XY", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 2-component formatted data from a buffer surface, convert the data to 32 bit integral or floating point format, then store the result into a…", "description": "Load 2-component formatted data from a buffer surface, convert the data to 32 bit integral or floating point format, then store the result into a vector register. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_load_format_xy", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()])", "example": "tbuffer_load_format_xy v[4:5], off, ttmp[4:7], 61, format:28 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 477, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_load_format_xyz", "mnemonic": "tbuffer_load_format_xyz", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER LOAD FORMAT XYZ", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 3-component formatted data from a buffer surface, convert the data to 32 bit integral or floating point format, then store the result into a…", "description": "Load 3-component formatted data from a buffer surface, convert the data to 32 bit integral or floating point format, then store the result into a vector register. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_load_format_xyz", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetZ()])", "example": "tbuffer_load_format_xyz v[4:6], off, ttmp[4:7], 61, format:33 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 478, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_load_format_xyzw", "mnemonic": "tbuffer_load_format_xyzw", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER LOAD FORMAT XYZW", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Load 4-component formatted data from a buffer surface, convert the data to 32 bit integral or floating point format, then store the result into a…", "description": "Load 4-component formatted data from a buffer surface, convert the data to 32 bit integral or floating point format, then store the result into a vector register. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_load_format_xyzw", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetZ()]);\nVDATA[127 : 96].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetW()])", "example": "tbuffer_load_format_xyzw v[4:7], off, ttmp[4:7], 61, format:38 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 478, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_store_d16_format_x", "mnemonic": "tbuffer_store_d16_format_x", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER STORE D16 FORMAT X", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 16 bits of data from vector input registers into 1-component formatted data and store the data into a buffer surface.", "description": "Convert 16 bits of data from vector input registers into 1-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_store_d16_format_x", "operands": [], "dataTypes": [], "semantics": "", "example": "tbuffer_store_d16_format_x v255, off, s[8:11], s3, format:41 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_store_d16_format_xy", "mnemonic": "tbuffer_store_d16_format_xy", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER STORE D16 FORMAT XY", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 32 bits of data from vector input registers into 2-component formatted data and store the data into a buffer surface.", "description": "Convert 32 bits of data from vector input registers into 2-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_store_d16_format_xy", "operands": [], "dataTypes": [], "semantics": "", "example": "tbuffer_store_d16_format_xy v255, off, s[8:11], s3, format:46 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_store_d16_format_xyz", "mnemonic": "tbuffer_store_d16_format_xyz", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER STORE D16 FORMAT XYZ", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 48 bits of data from vector input registers into 3-component formatted data and store the data into a buffer surface.", "description": "Convert 48 bits of data from vector input registers into 3-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_store_d16_format_xyz", "operands": [], "dataTypes": [], "semantics": "", "example": "tbuffer_store_d16_format_xyz v[4:5], off, ttmp[4:7], 61, format:53 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_store_d16_format_xyzw", "mnemonic": "tbuffer_store_d16_format_xyzw", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER STORE D16 FORMAT XYZW", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 64 bits of data from vector input registers into 4-component formatted data and store the data into a buffer surface.", "description": "Convert 64 bits of data from vector input registers into 4-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_store_d16_format_xyzw", "operands": [], "dataTypes": [], "semantics": "", "example": "tbuffer_store_d16_format_xyzw v[4:5], off, ttmp[4:7], 61, format:58 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_store_format_d16_x", "mnemonic": "tbuffer_store_format_d16_x", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER STORE FORMAT D16 X", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 16 bits of data from vector input registers into 1-component formatted data and store the data into a buffer surface.", "description": "Convert 16 bits of data from vector input registers into 1-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_store_format_d16_x", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format", "example": null, "exampleSource": null, "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 480, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.tbuffer_store_format_d16_xy", "mnemonic": "tbuffer_store_format_d16_xy", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER STORE FORMAT D16 XY", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 32 bits of data from vector input registers into 2-component formatted data and store the data into a buffer surface.", "description": "Convert 32 bits of data from vector input registers into 2-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_store_format_d16_xy", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16))", "example": null, "exampleSource": null, "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 481, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.tbuffer_store_format_d16_xyz", "mnemonic": "tbuffer_store_format_d16_xyz", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER STORE FORMAT D16 XYZ", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 48 bits of data from vector input registers into 3-component formatted data and store the data into a buffer surface.", "description": "Convert 48 bits of data from vector input registers into 3-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_store_format_d16_xyz", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(32'B(VDATA[47 : 32].b16))", "example": null, "exampleSource": null, "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 481, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.tbuffer_store_format_d16_xyzw", "mnemonic": "tbuffer_store_format_d16_xyzw", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER STORE FORMAT D16 XYZW", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 64 bits of data from vector input registers into 4-component formatted data and store the data into a buffer surface.", "description": "Convert 64 bits of data from vector input registers into 4-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_store_format_d16_xyzw", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(32'B(VDATA[47 : 32].b16));\nMEM[addr + ChannelOffsetW()] = ConvertToFormat(32'B(VDATA[63 : 48].b16))", "example": null, "exampleSource": null, "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 481, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.tbuffer_store_format_x", "mnemonic": "tbuffer_store_format_x", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER STORE FORMAT X", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 32 bits of data from vector input registers into 1-component formatted data and store the data into a buffer surface.", "description": "Convert 32 bits of data from vector input registers into 1-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_store_format_x", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format", "example": "tbuffer_store_format_x v255, off, s[8:11], s3, format:61 offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 478, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_store_format_xy", "mnemonic": "tbuffer_store_format_xy", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER STORE FORMAT XY", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 64 bits of data from vector input registers into 2-component formatted data and store the data into a buffer surface.", "description": "Convert 64 bits of data from vector input registers into 2-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_store_format_xy", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32)", "example": "tbuffer_store_format_xy v[4:5], off, s[8:11], 0, format:[BUF_FMT_16_SINT] offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 478, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_store_format_xyz", "mnemonic": "tbuffer_store_format_xyz", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER STORE FORMAT XYZ", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 96 bits of data from vector input registers into 3-component formatted data and store the data into a buffer surface.", "description": "Convert 96 bits of data from vector input registers into 3-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_store_format_xyz", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(VDATA[95 : 64].b32)", "example": "tbuffer_store_format_xyz v[4:6], off, s[8:11], s3, format:[BUF_FMT_32_FLOAT] offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 479, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tbuffer_store_format_xyzw", "mnemonic": "tbuffer_store_format_xyzw", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TBUFFER STORE FORMAT XYZW", "category": "Buffer Memory", "instructionClass": "vector", "summary": "Convert 128 bits of data from vector input registers into 4-component formatted data and store the data into a buffer surface.", "description": "Convert 128 bits of data from vector input registers into 4-component formatted data and store the data into a buffer surface. The instruction specifies the data format of the surface, overriding the resource descriptor.", "syntax": "tbuffer_store_format_xyzw", "operands": [], "dataTypes": [], "semantics": "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(VDATA[95 : 64].b32);\nMEM[addr + ChannelOffsetW()] = ConvertToFormat(VDATA[127 : 96].b32)", "example": "tbuffer_store_format_xyzw v[4:7], off, s[8:11], 0, format:[BUF_FMT_8_8_8_8_UNORM] offset:4095", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "MTBUF"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 479, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.tensor_save", "mnemonic": "tensor_save", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TENSOR SAVE", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "tensor_save", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.tensor_stop", "mnemonic": "tensor_stop", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "TENSOR STOP", "category": "Flat Memory", "instructionClass": "vector", "summary": "AMDGPU FLAT vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "tensor_stop", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "FLAT"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_accvgpr_mov_b32", "mnemonic": "v_accvgpr_mov_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ACCVGPR MOV B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Move data from one accumulator register to another accumulator register.", "description": "Move data from one accumulator register to another accumulator register.", "syntax": "v_accvgpr_mov_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 211, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_accvgpr_read_b32", "mnemonic": "v_accvgpr_read_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ACCVGPR READ B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_accvgpr_read_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_accvgpr_write_b32", "mnemonic": "v_accvgpr_write_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ACCVGPR WRITE B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_accvgpr_write_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_add3_u32", "mnemonic": "v_add3_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD3 U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Add three unsigned inputs and store the result into a vector register. No carry-in or carry-out support.", "description": "Add three unsigned inputs and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_add3_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = S0.u32 + S1.u32 + S2.u32", "example": "v_add3_u32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 356, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_add_co_u32", "mnemonic": "v_add_co_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD CO U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Add two unsigned 32-bit integer inputs, store the result into a vector register and store the carry-out mask into a scalar register.", "description": "Add two unsigned 32-bit integer inputs, store the result into a vector register and store the carry-out mask into a scalar register.", "syntax": "v_add_co_u32", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = 64'U(S0.u32) + 64'U(S1.u32);\nVCC.u64[laneId] = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_ADDC_CO_U32.\nD0.u32 = tmp.u32", "example": "v_add_co_u32 v5, s6, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "In VOP3 the VCC destination may be an arbitrary SGPR-pair. Supports saturation (unsigned 32-bit integer domain).", "sourcePdfPage": 175, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_add_f16", "mnemonic": "v_add_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Add two floating point inputs and store the result into a vector register.", "description": "Add two floating point inputs and store the result into a vector register.", "syntax": "v_add_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = S0.f16 + S1.f16", "example": "v_add_f16 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP precision. Supports denormals, round mode, exception flags and saturation.", "sourcePdfPage": 177, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_add_f32", "mnemonic": "v_add_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Per-lane single-precision floating-point add.", "description": "Add two floating point inputs and store the result into a vector register.", "syntax": "v_add_f32 VDST, S0, S1", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "S0", "desc": "First source (VGPR/SGPR/constant)"}, {"name": "S1", "desc": "Second source VGPR"}], "dataTypes": ["f32"], "semantics": "VDST[lane] = S0[lane].f32 + S1[lane].f32 for each active lane, per the EXEC mask.", "example": "v_add_f32  v2, v0, v1   // per-lane v2 = v0 + v1 (f32)", "exampleSource": null, "encoding": {"format": "VOP2", "widthBits": 32}, "executionUnit": "Vector ALU", "registerClasses": ["VGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_add_f64", "mnemonic": "v_add_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Add two floating point inputs and store the result into a vector register.", "description": "Add two floating point inputs and store the result into a vector register.", "syntax": "v_add_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": "v_add_f64 v[5:6], -1, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_add_f64_pseudo", "mnemonic": "v_add_f64_pseudo", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD F64 PSEUDO", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_add_f64_pseudo", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_add_i16", "mnemonic": "v_add_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Add two signed 16-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "description": "Add two signed 16-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_add_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.i16 = S0.i16 + S1.i16", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Supports saturation (signed 16-bit integer domain).", "sourcePdfPage": 368, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_add_i32", "mnemonic": "v_add_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Add two signed 32-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "description": "Add two signed 32-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_add_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_add_lshl_u32", "mnemonic": "v_add_lshl_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD LSHL U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Add the first two integer inputs, then given a shift count in the third input, calculate the logical shift left of the intermediate result, then…", "description": "Add the first two integer inputs, then given a shift count in the third input, calculate the logical shift left of the intermediate result, then store the final result into a vector register.", "syntax": "v_add_lshl_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = ((S0.u32 + S1.u32) << S2.u32[4 : 0].u32)", "example": "v_add_lshl_u32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 356, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_add_max_i32", "mnemonic": "v_add_max_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD MAX I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on i32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_add_max_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_add_max_u32", "mnemonic": "v_add_max_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD MAX U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_add_max_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_add_min_i32", "mnemonic": "v_add_min_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD MIN I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on i32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_add_min_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_add_min_u32", "mnemonic": "v_add_min_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD MIN U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_add_min_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_add_nc_i16", "mnemonic": "v_add_nc_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD NC I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Add two signed 16-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "description": "Add two signed 16-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_add_nc_i16", "operands": [], "dataTypes": ["i16"], "semantics": "", "example": "v_add_nc_i16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_add_nc_i32", "mnemonic": "v_add_nc_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD NC I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Add two signed 32-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "description": "Add two signed 32-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_add_nc_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": "v_add_nc_i32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_add_nc_u16", "mnemonic": "v_add_nc_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD NC U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Add two unsigned 16-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "description": "Add two unsigned 16-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_add_nc_u16", "operands": [], "dataTypes": ["u16"], "semantics": "", "example": "v_add_nc_u16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_add_nc_u64", "mnemonic": "v_add_nc_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD NC U64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_add_nc_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_add_u16", "mnemonic": "v_add_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Add two unsigned 16-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "description": "Add two unsigned 16-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_add_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u16 = S0.u16 + S1.u16", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Supports saturation (unsigned 16-bit integer domain).", "sourcePdfPage": 179, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_add_u32", "mnemonic": "v_add_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADD U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Per-lane add of two 32-bit unsigned vector operands.", "description": "Add two unsigned 32-bit integer inputs and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_add_u32 VDST, S0, S1", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "S0", "desc": "First source (VGPR/SGPR/constant)"}, {"name": "S1", "desc": "Second source VGPR"}], "dataTypes": ["u32"], "semantics": "VDST[lane] = S0[lane].u32 + S1[lane].u32 for each active lane, per the EXEC mask.", "example": "v_add_u32  v2, v0, v1   // per-lane v2 = v0 + v1", "exampleSource": null, "encoding": {"format": "VOP2", "widthBits": 32}, "executionUnit": "Vector ALU", "registerClasses": ["VGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_addc_co_u32", "mnemonic": "v_addc_co_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADDC CO U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Add two unsigned 32-bit integer inputs and a bit from a carry-in mask, store the result into a vector register and store the carry-out mask into a…", "description": "Add two unsigned 32-bit integer inputs and a bit from a carry-in mask, store the result into a vector register and store the carry-out mask into a scalar register.", "syntax": "v_addc_co_u32", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = 64'U(S0.u32) + 64'U(S1.u32) + VCC.u64[laneId].u64;\nVCC.u64[laneId] = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_ADDC_CO_U32.\nD0.u32 = tmp.u32", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "In VOP3 the VCC destination may be an arbitrary SGPR-pair, and the VCC source comes from the SGPR-pair at S2.u. Supports saturation (unsigned 32-bit integer domain).", "sourcePdfPage": 176, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_addc_u32", "mnemonic": "v_addc_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ADDC U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_addc_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_alignbit_b32", "mnemonic": "v_alignbit_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ALIGNBIT B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Align a 64-bit value encoded in the first two inputs to a bit position specified in the third input, then store the result into a 32-bit vector…", "description": "Align a 64-bit value encoded in the first two inputs to a bit position specified in the third input, then store the result into a 32-bit vector register.", "syntax": "v_alignbit_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = 32'U(({ S0.u32, S1.u32 } >> S2.u32[4 : 0]) & 0xffffffffLL)", "example": "v_alignbit_b32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": " S0 carries the MSBs and S1 carries the LSBs of the value being aligned.", "sourcePdfPage": 339, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_alignbit_b32_opsel", "mnemonic": "v_alignbit_b32_opsel", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ALIGNBIT B32 OPSEL", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_alignbit_b32_opsel", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_alignbyte_b32", "mnemonic": "v_alignbyte_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ALIGNBYTE B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Align a 64-bit value encoded in the first two inputs to a byte position specified in the third input, then store the result into a 32-bit vector…", "description": "Align a 64-bit value encoded in the first two inputs to a byte position specified in the third input, then store the result into a 32-bit vector register.", "syntax": "v_alignbyte_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = 32'U(({ S0.u32, S1.u32 } >> (S2.u32[1 : 0] * 8U)) & 0xffffffffLL)", "example": "v_alignbyte_b32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": " S0 carries the MSBs and S1 carries the LSBs of the value being aligned.", "sourcePdfPage": 340, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_alignbyte_b32_fake16", "mnemonic": "v_alignbyte_b32_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ALIGNBYTE B32 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_alignbyte_b32_fake16", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_alignbyte_b32_opsel", "mnemonic": "v_alignbyte_b32_opsel", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ALIGNBYTE B32 OPSEL", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_alignbyte_b32_opsel", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_alignbyte_b32_t16", "mnemonic": "v_alignbyte_b32_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ALIGNBYTE B32 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_alignbyte_b32_t16", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_and_b16", "mnemonic": "v_and_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V AND B16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate bitwise AND on two vector inputs and store the result into a vector register.", "description": "Calculate bitwise AND on two vector inputs and store the result into a vector register.", "syntax": "v_and_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "v_and_b16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_and_b16_fake16", "mnemonic": "v_and_b16_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V AND B16 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on b16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_and_b16_fake16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_and_b16_t16", "mnemonic": "v_and_b16_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V AND B16 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on b16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_and_b16_t16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_and_b32", "mnemonic": "v_and_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V AND B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate bitwise AND on two vector inputs and store the result into a vector register.", "description": "Calculate bitwise AND on two vector inputs and store the result into a vector register.", "syntax": "v_and_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S0.u32 & S1.u32)", "example": "v_and_b32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Input and output modifiers not supported.", "sourcePdfPage": 174, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_and_or_b32", "mnemonic": "v_and_or_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V AND OR B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate bitwise AND on the first two vector inputs, then compute the bitwise OR of the intermediate result and the third vector input, then store…", "description": "Calculate bitwise AND on the first two vector inputs, then compute the bitwise OR of the intermediate result and the third vector input, then store the final result into a vector register.", "syntax": "v_and_or_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = ((S0.u32 & S1.u32) | S2.u32)", "example": "v_and_or_b32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Input and output modifiers not supported.", "sourcePdfPage": 356, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_ashr_i32", "mnemonic": "v_ashr_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ASHR I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on i32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_ashr_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_ashr_i64", "mnemonic": "v_ashr_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ASHR I64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on i64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_ashr_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_ashr_pk_i8_i32", "mnemonic": "v_ashr_pk_i8_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ASHR PK I8 I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given two signed 32-bit integers and a shift count, calculate the arithmetic shift right (preserving sign bit) of the two integers, saturate the two…", "description": "Given two signed 32-bit integers and a shift count, calculate the arithmetic shift right (preserving sign bit) of the two integers, saturate the two results in the signed 8-bit interval [-128, 127], pack the bytes and store the result into a vector register.", "syntax": "v_ashr_pk_i8_i32", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_ashr_pk_u8_i32", "mnemonic": "v_ashr_pk_u8_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ASHR PK U8 I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given two signed 32-bit integers and a shift count, calculate the arithmetic shift right (preserving sign bit) of the two integers, saturate the two…", "description": "Given two signed 32-bit integers and a shift count, calculate the arithmetic shift right (preserving sign bit) of the two integers, saturate the two results in the unsigned 8-bit interval [0, 255], pack the bytes and store the result into a vector register.", "syntax": "v_ashr_pk_u8_i32", "operands": [], "dataTypes": ["i32", "u8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_ashrrev_i16", "mnemonic": "v_ashrrev_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ASHRREV I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a shift count in the first vector input, calculate the arithmetic shift right (preserving sign bit) of the second vector input and store the…", "description": "Given a shift count in the first vector input, calculate the arithmetic shift right (preserving sign bit) of the second vector input and store the result into a vector register.", "syntax": "v_ashrrev_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.i16 = (S1.i16 >> S0[3 : 0].u32)", "example": "v_ashrrev_i16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 180, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_ashrrev_i32", "mnemonic": "v_ashrrev_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ASHRREV I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a shift count in the first vector input, calculate the arithmetic shift right (preserving sign bit) of the second vector input and store the…", "description": "Given a shift count in the first vector input, calculate the arithmetic shift right (preserving sign bit) of the second vector input and store the result into a vector register.", "syntax": "v_ashrrev_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = (S1.i32 >> S0[4 : 0].u32)", "example": "v_ashrrev_i32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 173, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_ashrrev_i64", "mnemonic": "v_ashrrev_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V ASHRREV I64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a shift count in the first vector input, calculate the arithmetic shift right (preserving sign bit) of the second vector input and store the…", "description": "Given a shift count in the first vector input, calculate the arithmetic shift right (preserving sign bit) of the second vector input and store the result into a vector register.", "syntax": "v_ashrrev_i64", "operands": [], "dataTypes": ["i64"], "semantics": "D0.i64 = (S1.i64 >> S0[5 : 0].u32)", "example": "v_ashrrev_i64 v[5:6], -1, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 365, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_bcnt_u32_b32", "mnemonic": "v_bcnt_u32_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V BCNT U32 B32", "category": "Lane Operations", "instructionClass": "vector", "summary": "Per-lane accumulating population count.", "description": "Count the number of \"1\" bits in the vector input and store the result into a vector register.", "syntax": "v_bcnt_u32_b32 VDST, S0, S1", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "S0", "desc": "Value to count bits in"}, {"name": "S1", "desc": "Accumulator operand"}], "dataTypes": ["b32", "u32"], "semantics": "VDST[lane] = popcount(S0[lane]) + S1[lane] for each active lane; pass a zero S1 to match a plain population count.", "example": "v_bcnt_u32_b32  v1, v0, 0   // v1 = popcount(v0) + 0", "exampleSource": null, "encoding": {"format": "VOP3", "widthBits": 32}, "executionUnit": "Vector ALU", "registerClasses": ["VGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_bfe_i32", "mnemonic": "v_bfe_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V BFE I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Extract a signed bitfield from the first input using field offset from the second input and size from the third input, then store the result into a…", "description": "Extract a signed bitfield from the first input using field offset from the second input and size from the third input, then store the result into a vector register.", "syntax": "v_bfe_i32", "operands": [], "dataTypes": ["i32"], "semantics": "tmp.i32 = ((S0.i32 >> S1[4 : 0].u32) & ((1 << S2[4 : 0].u32) - 1));\nD0.i32 = signext_from_bit(tmp.i32, S2[4 : 0].u32)", "example": "v_bfe_i32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 338, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_bfe_u32", "mnemonic": "v_bfe_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V BFE U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Extract an unsigned bitfield from the first input using field offset from the second input and size from the third input, then store the result into…", "description": "Extract an unsigned bitfield from the first input using field offset from the second input and size from the third input, then store the result into a vector register.", "syntax": "v_bfe_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = ((S0.u32 >> S1[4 : 0].u32) & ((1U << S2[4 : 0].u32) - 1U))", "example": "v_bfe_u32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 338, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_bfi_b32", "mnemonic": "v_bfi_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V BFI B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Overwrite a bitfield in the third input with a bitfield from the second input using a mask from the first input, then store the result into a vector…", "description": "Overwrite a bitfield in the third input with a bitfield from the second input using a mask from the first input, then store the result into a vector register.", "syntax": "v_bfi_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = ((S0.u32 & S1.u32) | (~S0.u32 & S2.u32))", "example": "v_bfi_b32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 338, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_bfm_b32", "mnemonic": "v_bfm_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V BFM B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate a bitfield mask given a field offset and size and store the result into a vector register.", "description": "Calculate a bitfield mask given a field offset and size and store the result into a vector register.", "syntax": "v_bfm_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "v_bfm_b32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_bfrev_b32", "mnemonic": "v_bfrev_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V BFREV B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Reverse the order of bits in a vector input and store the result into a vector register.", "description": "Reverse the order of bits in a vector input and store the result into a vector register.", "syntax": "v_bfrev_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32[31 : 0] = S0.u32[0 : 31]", "example": "v_bfrev_b32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Input and output modifiers not supported.", "sourcePdfPage": 199, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_bitop3_b16", "mnemonic": "v_bitop3_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V BITOP3 B16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the generic bitwise operation of three 16-bit vector inputs using a truth table encoded in the instruction and store the result into a…", "description": "Calculate the generic bitwise operation of three 16-bit vector inputs using a truth table encoded in the instruction and store the result into a vector register.", "syntax": "v_bitop3_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_bitop3_b16_gfx1250", "mnemonic": "v_bitop3_b16_gfx1250", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V BITOP3 B16 GFX1250", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_bitop3_b16_gfx1250", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_bitop3_b32", "mnemonic": "v_bitop3_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V BITOP3 B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the generic bitwise operation of three 32-bit vector inputs using a truth table encoded in the instruction and store the result into a…", "description": "Calculate the generic bitwise operation of three 32-bit vector inputs using a truth table encoded in the instruction and store the result into a vector register.", "syntax": "v_bitop3_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_ceil_f16", "mnemonic": "v_ceil_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CEIL F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Round the half-precision float input up to next integer and store the result in floating point format into a vector register.", "description": "Round the half-precision float input up to next integer and store the result in floating point format into a vector register.", "syntax": "v_ceil_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = trunc(S0.f16);\nif ((S0.f16 > 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += 16'1.0\nendif", "example": "v_ceil_f16 v5, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 208, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_ceil_f32", "mnemonic": "v_ceil_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CEIL F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Round the single-precision float input up to next integer and store the result in floating point format into a vector register.", "description": "Round the single-precision float input up to next integer and store the result in floating point format into a vector register.", "syntax": "v_ceil_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = trunc(S0.f32);\nif ((S0.f32 > 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += 1.0F\nendif", "example": "v_ceil_f32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 194, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_ceil_f64", "mnemonic": "v_ceil_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CEIL F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Round the double-precision float input up to next integer and store the result in floating point format into a vector register.", "description": "Round the double-precision float input up to next integer and store the result in floating point format into a vector register.", "syntax": "v_ceil_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.f64 = trunc(S0.f64);\nif ((S0.f64 > 0.0) && (S0.f64 != D0.f64)) then\nD0.f64 += 1.0\nendif", "example": "v_ceil_f64 v[5:6], -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 193, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_clrexcp", "mnemonic": "v_clrexcp", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CLREXCP", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Clear this wave's exception state in the vector ALU.", "description": "Clear this wave's exception state in the vector ALU.", "syntax": "v_clrexcp", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 203, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cmp_class_f16", "mnemonic": "v_cmp_class_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP CLASS F16", "category": "Comparison", "instructionClass": "vector", "summary": "Evaluate the IEEE numeric class function specified as a 10 bit mask in the second input on the first input, a half-precision float, and set the…", "description": "Evaluate the IEEE numeric class function specified as a 10 bit mask in the second input on the first input, a half-precision float, and set the per-lane condition code to the result. Store the result into VCC or a scalar register. The function reports true if the floating point value is any of the numeric types selected in the 10 bit mask according to the following list: S1.u[0] value is a signaling NAN. S1.u[1] value is a quiet NAN. S1.u[2] value is negative infinity. S1.u[3] value is a negative normal value. S1.u[4] value is a negative denormal value. S1.u[5] value is negative zero. S1.u[6] value is positive zero. S1.u[7] value is a positive denormal value. S1.u[8] value is a positive normal value. S1.u[9] value is positive infinity.", "syntax": "v_cmp_class_f16", "operands": [], "dataTypes": ["f16"], "semantics": "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_class_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Note that the S1 has a format of f16 since floating point literal constants are interpreted as 16 bit value for this opcode.", "sourcePdfPage": 219, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_class_f32", "mnemonic": "v_cmp_class_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP CLASS F32", "category": "Comparison", "instructionClass": "vector", "summary": "Evaluate the IEEE numeric class function specified as a 10 bit mask in the second input on the first input, a single-precision float, and set the…", "description": "Evaluate the IEEE numeric class function specified as a 10 bit mask in the second input on the first input, a single-precision float, and set the per-lane condition code to the result. Store the result into VCC or a scalar register. The function reports true if the floating point value is any of the numeric types selected in the 10 bit mask according to the following list: S1.u[0] value is a signaling NAN. S1.u[1] value is a quiet NAN. S1.u[2] value is negative infinity. S1.u[3] value is a negative normal value. S1.u[4] value is a negative denormal value. S1.u[5] value is negative zero. S1.u[6] value is positive zero. S1.u[7] value is a positive denormal value. S1.u[8] value is a positive normal value. S1.u[9] value is positive infinity.", "syntax": "v_cmp_class_f32", "operands": [], "dataTypes": ["f32"], "semantics": "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_class_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 216, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_class_f64", "mnemonic": "v_cmp_class_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP CLASS F64", "category": "Comparison", "instructionClass": "vector", "summary": "Evaluate the IEEE numeric class function specified as a 10 bit mask in the second input on the first input, a double-precision float, and set the…", "description": "Evaluate the IEEE numeric class function specified as a 10 bit mask in the second input on the first input, a double-precision float, and set the per-lane condition code to the result. Store the result into VCC or a scalar register. The function reports true if the floating point value is any of the numeric types selected in the 10 bit mask according to the following list: S1.u[0] value is a signaling NAN. S1.u[1] value is a quiet NAN. S1.u[2] value is negative infinity. S1.u[3] value is a negative normal value. S1.u[4] value is a negative denormal value. S1.u[5] value is negative zero. S1.u[6] value is positive zero. S1.u[7] value is a positive denormal value. S1.u[8] value is a positive normal value. S1.u[9] value is positive infinity.", "syntax": "v_cmp_class_f64", "operands": [], "dataTypes": ["f64"], "semantics": "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_class_f64 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 217, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_eq_f16", "mnemonic": "v_cmp_eq_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP EQ F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_eq_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = S0.f16 == S1.f16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_eq_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 221, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_eq_f32", "mnemonic": "v_cmp_eq_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP EQ F32", "category": "Comparison", "instructionClass": "vector", "summary": "Per-lane single-precision equality compare, result written as an execution-mask-width bitmask.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_eq_f32 VCC, S0, S1", "operands": [{"name": "VCC", "desc": "Destination mask (VCC, or an arbitrary SGPR pair for the _e64 encoding)"}, {"name": "S0", "desc": "First source"}, {"name": "S1", "desc": "Second source"}], "dataTypes": ["f32"], "semantics": "VCC[lane] = (S0[lane].f32 == S1[lane].f32) for each active lane; VCC is 32 bits wide in wave32 mode, 64 bits in wave64 mode.", "example": "v_cmp_eq_f32  vcc, v0, v1   // vcc[lane] = (v0[lane] == v1[lane])", "exampleSource": null, "encoding": {"format": "VOPC", "widthBits": 32}, "executionUnit": "Vector ALU", "registerClasses": ["VGPR", "VCC"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_cmp_eq_f64", "mnemonic": "v_cmp_eq_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP EQ F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_eq_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = S0.f64 == S1.f64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_eq_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 235, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_eq_i16", "mnemonic": "v_cmp_eq_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP EQ I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_eq_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.u64[laneId] = S0.i16 == S1.i16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_eq_i16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 242, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_eq_i32", "mnemonic": "v_cmp_eq_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP EQ I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_eq_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.u64[laneId] = S0.i32 == S1.i32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_eq_i32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 249, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_eq_i64", "mnemonic": "v_cmp_eq_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP EQ I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_eq_i64", "operands": [], "dataTypes": ["i64"], "semantics": "D0.u64[laneId] = S0.i64 == S1.i64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_eq_i64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 255, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_eq_u16", "mnemonic": "v_cmp_eq_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP EQ U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_eq_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u64[laneId] = S0.u16 == S1.u16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_eq_u16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 244, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_eq_u32", "mnemonic": "v_cmp_eq_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP EQ U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_eq_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u64[laneId] = S0.u32 == S1.u32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_eq_u32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 250, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_eq_u64", "mnemonic": "v_cmp_eq_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP EQ U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_eq_u64", "operands": [], "dataTypes": ["u64"], "semantics": "D0.u64[laneId] = S0.u64 == S1.u64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_eq_u64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 257, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_f_f16", "mnemonic": "v_cmp_f_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP F F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "syntax": "v_cmp_f_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_f_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 221, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_f_f32", "mnemonic": "v_cmp_f_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP F F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "syntax": "v_cmp_f_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_f_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 227, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_f_f64", "mnemonic": "v_cmp_f_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP F F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "syntax": "v_cmp_f_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_f_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 234, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_f_i16", "mnemonic": "v_cmp_f_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP F I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "syntax": "v_cmp_f_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 241, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cmp_f_i32", "mnemonic": "v_cmp_f_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP F I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "syntax": "v_cmp_f_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_f_i32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 248, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_f_i64", "mnemonic": "v_cmp_f_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP F I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "syntax": "v_cmp_f_i64", "operands": [], "dataTypes": ["i64"], "semantics": "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_f_i64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 255, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_f_u16", "mnemonic": "v_cmp_f_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP F U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "syntax": "v_cmp_f_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 243, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cmp_f_u32", "mnemonic": "v_cmp_f_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP F U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "syntax": "v_cmp_f_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_f_u32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 250, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_f_u64", "mnemonic": "v_cmp_f_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP F U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into VCC or a scalar register.", "syntax": "v_cmp_f_u64", "operands": [], "dataTypes": ["u64"], "semantics": "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_f_u64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 257, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ge_f16", "mnemonic": "v_cmp_ge_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GE F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ge_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = S0.f16 >= S1.f16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ge_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 222, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ge_f32", "mnemonic": "v_cmp_ge_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GE F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ge_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = S0.f32 >= S1.f32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ge_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 229, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ge_f64", "mnemonic": "v_cmp_ge_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GE F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ge_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = S0.f64 >= S1.f64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ge_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 236, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ge_i16", "mnemonic": "v_cmp_ge_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GE I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ge_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.u64[laneId] = S0.i16 >= S1.i16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ge_i16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 243, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ge_i32", "mnemonic": "v_cmp_ge_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GE I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ge_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.u64[laneId] = S0.i32 >= S1.i32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ge_i32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 249, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ge_i64", "mnemonic": "v_cmp_ge_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GE I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ge_i64", "operands": [], "dataTypes": ["i64"], "semantics": "D0.u64[laneId] = S0.i64 >= S1.i64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ge_i64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 256, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ge_u16", "mnemonic": "v_cmp_ge_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GE U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ge_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u64[laneId] = S0.u16 >= S1.u16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ge_u16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 244, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ge_u32", "mnemonic": "v_cmp_ge_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GE U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ge_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u64[laneId] = S0.u32 >= S1.u32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ge_u32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 251, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ge_u64", "mnemonic": "v_cmp_ge_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GE U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ge_u64", "operands": [], "dataTypes": ["u64"], "semantics": "D0.u64[laneId] = S0.u64 >= S1.u64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ge_u64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 258, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_gt_f16", "mnemonic": "v_cmp_gt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GT F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_gt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = S0.f16 > S1.f16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_gt_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 221, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_gt_f32", "mnemonic": "v_cmp_gt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GT F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_gt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = S0.f32 > S1.f32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_gt_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 228, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_gt_f64", "mnemonic": "v_cmp_gt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GT F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_gt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = S0.f64 > S1.f64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_gt_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 235, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_gt_i16", "mnemonic": "v_cmp_gt_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GT I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_gt_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.u64[laneId] = S0.i16 > S1.i16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_gt_i16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 242, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_gt_i32", "mnemonic": "v_cmp_gt_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GT I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_gt_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.u64[laneId] = S0.i32 > S1.i32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_gt_i32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 249, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_gt_i64", "mnemonic": "v_cmp_gt_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GT I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_gt_i64", "operands": [], "dataTypes": ["i64"], "semantics": "D0.u64[laneId] = S0.i64 > S1.i64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_gt_i64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 256, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_gt_u16", "mnemonic": "v_cmp_gt_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GT U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_gt_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u64[laneId] = S0.u16 > S1.u16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_gt_u16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 244, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_gt_u32", "mnemonic": "v_cmp_gt_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GT U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_gt_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u64[laneId] = S0.u32 > S1.u32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_gt_u32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 251, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_gt_u64", "mnemonic": "v_cmp_gt_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP GT U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_gt_u64", "operands": [], "dataTypes": ["u64"], "semantics": "D0.u64[laneId] = S0.u64 > S1.u64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_gt_u64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 257, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_le_f16", "mnemonic": "v_cmp_le_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LE F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_le_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = S0.f16 <= S1.f16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_le_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 221, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_le_f32", "mnemonic": "v_cmp_le_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LE F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_le_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = S0.f32 <= S1.f32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_le_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 228, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_le_f64", "mnemonic": "v_cmp_le_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LE F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_le_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = S0.f64 <= S1.f64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_le_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 235, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_le_i16", "mnemonic": "v_cmp_le_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LE I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_le_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.u64[laneId] = S0.i16 <= S1.i16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_le_i16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 242, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_le_i32", "mnemonic": "v_cmp_le_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LE I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_le_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.u64[laneId] = S0.i32 <= S1.i32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_le_i32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 249, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_le_i64", "mnemonic": "v_cmp_le_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LE I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_le_i64", "operands": [], "dataTypes": ["i64"], "semantics": "D0.u64[laneId] = S0.i64 <= S1.i64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_le_i64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 255, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_le_u16", "mnemonic": "v_cmp_le_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LE U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_le_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u64[laneId] = S0.u16 <= S1.u16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_le_u16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 244, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_le_u32", "mnemonic": "v_cmp_le_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LE U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_le_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u64[laneId] = S0.u32 <= S1.u32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_le_u32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 250, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_le_u64", "mnemonic": "v_cmp_le_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LE U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_le_u64", "operands": [], "dataTypes": ["u64"], "semantics": "D0.u64[laneId] = S0.u64 <= S1.u64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_le_u64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 257, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_lg_f16", "mnemonic": "v_cmp_lg_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LG F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_lg_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = S0.f16 <> S1.f16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_lg_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 222, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_lg_f32", "mnemonic": "v_cmp_lg_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LG F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_lg_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = S0.f32 <> S1.f32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_lg_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 229, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_lg_f64", "mnemonic": "v_cmp_lg_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LG F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_lg_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = S0.f64 <> S1.f64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_lg_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 236, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_lt_f16", "mnemonic": "v_cmp_lt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LT F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_lt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = S0.f16 < S1.f16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_lt_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 221, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_lt_f32", "mnemonic": "v_cmp_lt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LT F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_lt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = S0.f32 < S1.f32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_lt_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 228, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_lt_f64", "mnemonic": "v_cmp_lt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LT F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_lt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = S0.f64 < S1.f64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_lt_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 235, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_lt_i16", "mnemonic": "v_cmp_lt_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LT I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_lt_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.u64[laneId] = S0.i16 < S1.i16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_lt_i16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 242, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_lt_i32", "mnemonic": "v_cmp_lt_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LT I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_lt_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.u64[laneId] = S0.i32 < S1.i32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_lt_i32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 248, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_lt_i64", "mnemonic": "v_cmp_lt_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LT I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_lt_i64", "operands": [], "dataTypes": ["i64"], "semantics": "D0.u64[laneId] = S0.i64 < S1.i64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_lt_i64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 255, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_lt_u16", "mnemonic": "v_cmp_lt_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LT U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_lt_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u64[laneId] = S0.u16 < S1.u16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_lt_u16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 243, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_lt_u32", "mnemonic": "v_cmp_lt_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LT U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_lt_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u64[laneId] = S0.u32 < S1.u32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_lt_u32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 250, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_lt_u64", "mnemonic": "v_cmp_lt_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP LT U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_lt_u64", "operands": [], "dataTypes": ["u64"], "semantics": "D0.u64[laneId] = S0.u64 < S1.u64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_lt_u64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 257, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ne_i16", "mnemonic": "v_cmp_ne_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NE I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ne_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.u64[laneId] = S0.i16 <> S1.i16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ne_i16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 243, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ne_i32", "mnemonic": "v_cmp_ne_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NE I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ne_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.u64[laneId] = S0.i32 <> S1.i32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ne_i32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 249, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ne_i64", "mnemonic": "v_cmp_ne_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NE I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ne_i64", "operands": [], "dataTypes": ["i64"], "semantics": "D0.u64[laneId] = S0.i64 <> S1.i64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ne_i64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 256, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ne_u16", "mnemonic": "v_cmp_ne_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NE U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ne_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u64[laneId] = S0.u16 <> S1.u16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ne_u16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 244, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ne_u32", "mnemonic": "v_cmp_ne_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NE U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ne_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u64[laneId] = S0.u32 <> S1.u32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ne_u32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 251, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ne_u64", "mnemonic": "v_cmp_ne_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NE U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ne_u64", "operands": [], "dataTypes": ["u64"], "semantics": "D0.u64[laneId] = S0.u64 <> S1.u64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ne_u64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 258, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_neq_f16", "mnemonic": "v_cmp_neq_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NEQ F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_neq_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_neq_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 223, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_neq_f32", "mnemonic": "v_cmp_neq_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NEQ F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_neq_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_neq_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 230, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_neq_f64", "mnemonic": "v_cmp_neq_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NEQ F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_neq_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_neq_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 237, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_nge_f16", "mnemonic": "v_cmp_nge_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NGE F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not greater than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_nge_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_nge_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 222, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_nge_f32", "mnemonic": "v_cmp_nge_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NGE F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not greater than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_nge_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_nge_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 229, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_nge_f64", "mnemonic": "v_cmp_nge_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NGE F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not greater than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_nge_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_nge_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 236, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ngt_f16", "mnemonic": "v_cmp_ngt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NGT F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not greater than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ngt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ngt_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 223, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ngt_f32", "mnemonic": "v_cmp_ngt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NGT F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not greater than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ngt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ngt_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 230, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_ngt_f64", "mnemonic": "v_cmp_ngt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NGT F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not greater than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_ngt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_ngt_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 237, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_nle_f16", "mnemonic": "v_cmp_nle_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NLE F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_nle_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_nle_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 223, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_nle_f32", "mnemonic": "v_cmp_nle_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NLE F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_nle_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_nle_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 230, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_nle_f64", "mnemonic": "v_cmp_nle_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NLE F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than or equal to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_nle_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_nle_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 237, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_nlg_f16", "mnemonic": "v_cmp_nlg_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NLG F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than or greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than or greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_nlg_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_nlg_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 223, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_nlg_f32", "mnemonic": "v_cmp_nlg_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NLG F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than or greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than or greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_nlg_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_nlg_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 230, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_nlg_f64", "mnemonic": "v_cmp_nlg_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NLG F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than or greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than or greater than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_nlg_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_nlg_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 237, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_nlt_f16", "mnemonic": "v_cmp_nlt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NLT F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not less than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_nlt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_nlt_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 224, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_nlt_f32", "mnemonic": "v_cmp_nlt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NLT F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not less than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_nlt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_nlt_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 231, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_nlt_f64", "mnemonic": "v_cmp_nlt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP NLT F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not less than the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_nlt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_nlt_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 238, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_o_f16", "mnemonic": "v_cmp_o_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP O F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is orderable to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is orderable to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_o_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_o_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 222, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_o_f32", "mnemonic": "v_cmp_o_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP O F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is orderable to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is orderable to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_o_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_o_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 229, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_o_f64", "mnemonic": "v_cmp_o_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP O F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is orderable to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is orderable to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_o_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_o_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 236, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_t_f16", "mnemonic": "v_cmp_t_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP T F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "syntax": "v_cmp_t_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": "v_cmp_t_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_t_f32", "mnemonic": "v_cmp_t_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP T F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "syntax": "v_cmp_t_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_cmp_t_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_t_f64", "mnemonic": "v_cmp_t_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP T F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "syntax": "v_cmp_t_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": "v_cmp_t_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_t_i16", "mnemonic": "v_cmp_t_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP T I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "syntax": "v_cmp_t_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 243, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cmp_t_i32", "mnemonic": "v_cmp_t_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP T I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "syntax": "v_cmp_t_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_t_i32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 250, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_t_i64", "mnemonic": "v_cmp_t_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP T I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "syntax": "v_cmp_t_i64", "operands": [], "dataTypes": ["i64"], "semantics": "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_t_i64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 256, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_t_u16", "mnemonic": "v_cmp_t_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP T U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "syntax": "v_cmp_t_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 245, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cmp_t_u32", "mnemonic": "v_cmp_t_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP T U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "syntax": "v_cmp_t_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_t_u32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 251, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_t_u64", "mnemonic": "v_cmp_t_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP T U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "syntax": "v_cmp_t_u64", "operands": [], "dataTypes": ["u64"], "semantics": "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_t_u64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 258, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_tru_f16", "mnemonic": "v_cmp_tru_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP TRU F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "syntax": "v_cmp_tru_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_tru_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 224, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_tru_f32", "mnemonic": "v_cmp_tru_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP TRU F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "syntax": "v_cmp_tru_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_tru_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 231, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_tru_f64", "mnemonic": "v_cmp_tru_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP TRU F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into VCC or a scalar register.", "syntax": "v_cmp_tru_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_tru_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 238, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_u_f16", "mnemonic": "v_cmp_u_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP U F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not orderable to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not orderable to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_u_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_u_f16 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 222, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_u_f32", "mnemonic": "v_cmp_u_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP U F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not orderable to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not orderable to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_u_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_u_f32 vcc, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 229, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmp_u_f64", "mnemonic": "v_cmp_u_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMP U F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not orderable to the second input. Store the result into VCC or a scalar register.", "description": "Set the per-lane condition code to 1 iff the first input is not orderable to the second input. Store the result into VCC or a scalar register.", "syntax": "v_cmp_u_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.", "example": "v_cmp_u_f64 vcc, -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 236, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmps_eq_f32", "mnemonic": "v_cmps_eq_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS EQ F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_eq_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_eq_f64", "mnemonic": "v_cmps_eq_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS EQ F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_eq_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_f_f32", "mnemonic": "v_cmps_f_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS F F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_f_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_f_f64", "mnemonic": "v_cmps_f_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS F F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_f_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_ge_f32", "mnemonic": "v_cmps_ge_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS GE F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_ge_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_ge_f64", "mnemonic": "v_cmps_ge_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS GE F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_ge_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_gt_f32", "mnemonic": "v_cmps_gt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS GT F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_gt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_gt_f64", "mnemonic": "v_cmps_gt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS GT F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_gt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_le_f32", "mnemonic": "v_cmps_le_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS LE F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_le_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_le_f64", "mnemonic": "v_cmps_le_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS LE F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_le_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_lg_f32", "mnemonic": "v_cmps_lg_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS LG F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_lg_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_lg_f64", "mnemonic": "v_cmps_lg_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS LG F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_lg_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_lt_f32", "mnemonic": "v_cmps_lt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS LT F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_lt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_lt_f64", "mnemonic": "v_cmps_lt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS LT F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_lt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_neq_f32", "mnemonic": "v_cmps_neq_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS NEQ F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_neq_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_neq_f64", "mnemonic": "v_cmps_neq_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS NEQ F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_neq_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_nge_f32", "mnemonic": "v_cmps_nge_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS NGE F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_nge_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_nge_f64", "mnemonic": "v_cmps_nge_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS NGE F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_nge_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_ngt_f32", "mnemonic": "v_cmps_ngt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS NGT F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_ngt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_ngt_f64", "mnemonic": "v_cmps_ngt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS NGT F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_ngt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_nle_f32", "mnemonic": "v_cmps_nle_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS NLE F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_nle_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_nle_f64", "mnemonic": "v_cmps_nle_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS NLE F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_nle_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_nlg_f32", "mnemonic": "v_cmps_nlg_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS NLG F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_nlg_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_nlg_f64", "mnemonic": "v_cmps_nlg_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS NLG F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_nlg_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_nlt_f32", "mnemonic": "v_cmps_nlt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS NLT F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_nlt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_nlt_f64", "mnemonic": "v_cmps_nlt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS NLT F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_nlt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_o_f32", "mnemonic": "v_cmps_o_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS O F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_o_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_o_f64", "mnemonic": "v_cmps_o_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS O F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_o_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_tru_f32", "mnemonic": "v_cmps_tru_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS TRU F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_tru_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_tru_f64", "mnemonic": "v_cmps_tru_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS TRU F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_tru_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_u_f32", "mnemonic": "v_cmps_u_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS U F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_u_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmps_u_f64", "mnemonic": "v_cmps_u_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPS U F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmps_u_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_eq_f32", "mnemonic": "v_cmpsx_eq_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX EQ F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_eq_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_eq_f64", "mnemonic": "v_cmpsx_eq_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX EQ F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_eq_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_f_f32", "mnemonic": "v_cmpsx_f_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX F F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_f_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_f_f64", "mnemonic": "v_cmpsx_f_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX F F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_f_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_ge_f32", "mnemonic": "v_cmpsx_ge_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX GE F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_ge_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_ge_f64", "mnemonic": "v_cmpsx_ge_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX GE F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_ge_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_gt_f32", "mnemonic": "v_cmpsx_gt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX GT F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_gt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_gt_f64", "mnemonic": "v_cmpsx_gt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX GT F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_gt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_le_f32", "mnemonic": "v_cmpsx_le_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX LE F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_le_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_le_f64", "mnemonic": "v_cmpsx_le_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX LE F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_le_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_lg_f32", "mnemonic": "v_cmpsx_lg_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX LG F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_lg_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_lg_f64", "mnemonic": "v_cmpsx_lg_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX LG F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_lg_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_lt_f32", "mnemonic": "v_cmpsx_lt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX LT F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_lt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_lt_f64", "mnemonic": "v_cmpsx_lt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX LT F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_lt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_neq_f32", "mnemonic": "v_cmpsx_neq_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX NEQ F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_neq_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_neq_f64", "mnemonic": "v_cmpsx_neq_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX NEQ F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_neq_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_nge_f32", "mnemonic": "v_cmpsx_nge_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX NGE F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_nge_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_nge_f64", "mnemonic": "v_cmpsx_nge_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX NGE F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_nge_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_ngt_f32", "mnemonic": "v_cmpsx_ngt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX NGT F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_ngt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_ngt_f64", "mnemonic": "v_cmpsx_ngt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX NGT F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_ngt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_nle_f32", "mnemonic": "v_cmpsx_nle_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX NLE F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_nle_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_nle_f64", "mnemonic": "v_cmpsx_nle_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX NLE F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_nle_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_nlg_f32", "mnemonic": "v_cmpsx_nlg_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX NLG F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_nlg_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_nlg_f64", "mnemonic": "v_cmpsx_nlg_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX NLG F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_nlg_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_nlt_f32", "mnemonic": "v_cmpsx_nlt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX NLT F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_nlt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_nlt_f64", "mnemonic": "v_cmpsx_nlt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX NLT F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_nlt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_o_f32", "mnemonic": "v_cmpsx_o_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX O F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_o_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_o_f64", "mnemonic": "v_cmpsx_o_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX O F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_o_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_tru_f32", "mnemonic": "v_cmpsx_tru_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX TRU F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_tru_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_tru_f64", "mnemonic": "v_cmpsx_tru_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX TRU F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_tru_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_u_f32", "mnemonic": "v_cmpsx_u_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX U F32", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_u_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpsx_u_f64", "mnemonic": "v_cmpsx_u_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPSX U F64", "category": "Comparison", "instructionClass": "vector", "summary": "AMDGPU VOPC vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cmpsx_u_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cmpx_class_f16", "mnemonic": "v_cmpx_class_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX CLASS F16", "category": "Comparison", "instructionClass": "vector", "summary": "Evaluate the IEEE numeric class function specified as a 10 bit mask in the second input on the first input, a half-precision float, and set the…", "description": "Evaluate the IEEE numeric class function specified as a 10 bit mask in the second input on the first input, a half-precision float, and set the per-lane condition code to the result. Store the result into the EXEC mask and to VCC or a scalar register. The function reports true if the floating point value is any of the numeric types selected in the 10 bit mask according to the following list: S1.u[0] value is a signaling NAN. S1.u[1] value is a quiet NAN. S1.u[2] value is negative infinity. S1.u[3] value is a negative normal value. S1.u[4] value is a negative denormal value. S1.u[5] value is negative zero. S1.u[6] value is positive zero. S1.u[7] value is a positive denormal value. S1.u[8] value is a positive normal value. S1.u[9] value is positive infinity.", "syntax": "v_cmpx_class_f16", "operands": [], "dataTypes": ["f16"], "semantics": "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = D0.u64[laneId] = result", "example": "v_cmpx_class_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Note that the S1 has a format of f16 since floating point literal constants are interpreted as 16 bit value for this opcode.", "sourcePdfPage": 220, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_class_f32", "mnemonic": "v_cmpx_class_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX CLASS F32", "category": "Comparison", "instructionClass": "vector", "summary": "Evaluate the IEEE numeric class function specified as a 10 bit mask in the second input on the first input, a single-precision float, and set the…", "description": "Evaluate the IEEE numeric class function specified as a 10 bit mask in the second input on the first input, a single-precision float, and set the per-lane condition code to the result. Store the result into the EXEC mask and to VCC or a scalar register. The function reports true if the floating point value is any of the numeric types selected in the 10 bit mask according to the following list: S1.u[0] value is a signaling NAN. S1.u[1] value is a quiet NAN. S1.u[2] value is negative infinity. S1.u[3] value is a negative normal value. S1.u[4] value is a negative denormal value. S1.u[5] value is negative zero. S1.u[6] value is positive zero. S1.u[7] value is a positive denormal value. S1.u[8] value is a positive normal value. S1.u[9] value is positive infinity.", "syntax": "v_cmpx_class_f32", "operands": [], "dataTypes": ["f32"], "semantics": "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = D0.u64[laneId] = result", "example": "v_cmpx_class_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 216, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_class_f64", "mnemonic": "v_cmpx_class_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX CLASS F64", "category": "Comparison", "instructionClass": "vector", "summary": "Evaluate the IEEE numeric class function specified as a 10 bit mask in the second input on the first input, a double-precision float, and set the…", "description": "Evaluate the IEEE numeric class function specified as a 10 bit mask in the second input on the first input, a double-precision float, and set the per-lane condition code to the result. Store the result into the EXEC mask and to VCC or a scalar register. The function reports true if the floating point value is any of the numeric types selected in the 10 bit mask according to the following list: S1.u[0] value is a signaling NAN. S1.u[1] value is a quiet NAN. S1.u[2] value is negative infinity. S1.u[3] value is a negative normal value. S1.u[4] value is a negative denormal value. S1.u[5] value is negative zero. S1.u[6] value is positive zero. S1.u[7] value is a positive denormal value. S1.u[8] value is a positive normal value. S1.u[9] value is positive infinity.", "syntax": "v_cmpx_class_f64", "operands": [], "dataTypes": ["f64"], "semantics": "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = D0.u64[laneId] = result", "example": "v_cmpx_class_f64 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 218, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_eq_f16", "mnemonic": "v_cmpx_eq_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX EQ F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_eq_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 == S1.f16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_eq_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 224, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_eq_f32", "mnemonic": "v_cmpx_eq_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX EQ F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_eq_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 == S1.f32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_eq_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 231, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_eq_f64", "mnemonic": "v_cmpx_eq_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX EQ F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_eq_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 == S1.f64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_eq_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 238, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_eq_i16", "mnemonic": "v_cmpx_eq_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX EQ I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_eq_i16", "operands": [], "dataTypes": ["i16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 == S1.i16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_eq_i16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 245, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_eq_i32", "mnemonic": "v_cmpx_eq_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX EQ I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_eq_i32", "operands": [], "dataTypes": ["i32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 == S1.i32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_eq_i32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 252, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_eq_i64", "mnemonic": "v_cmpx_eq_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX EQ I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_eq_i64", "operands": [], "dataTypes": ["i64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 == S1.i64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_eq_i64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 259, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_eq_u16", "mnemonic": "v_cmpx_eq_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX EQ U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_eq_u16", "operands": [], "dataTypes": ["u16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 == S1.u16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_eq_u16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 247, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_eq_u32", "mnemonic": "v_cmpx_eq_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX EQ U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_eq_u32", "operands": [], "dataTypes": ["u32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 == S1.u32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_eq_u32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 254, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_eq_u64", "mnemonic": "v_cmpx_eq_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX EQ U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_eq_u64", "operands": [], "dataTypes": ["u64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 == S1.u64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_eq_u64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 260, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_f_f16", "mnemonic": "v_cmpx_f_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX F F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_f_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_f_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 224, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_f_f32", "mnemonic": "v_cmpx_f_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX F F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_f_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_f_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 231, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_f_f64", "mnemonic": "v_cmpx_f_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX F F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_f_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_f_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 238, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_f_i16", "mnemonic": "v_cmpx_f_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX F I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_f_i16", "operands": [], "dataTypes": ["i16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 245, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cmpx_f_i32", "mnemonic": "v_cmpx_f_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX F I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_f_i32", "operands": [], "dataTypes": ["i32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_f_i32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 252, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_f_i64", "mnemonic": "v_cmpx_f_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX F I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_f_i64", "operands": [], "dataTypes": ["i64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_f_i64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 258, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_f_u16", "mnemonic": "v_cmpx_f_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX F U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_f_u16", "operands": [], "dataTypes": ["u16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 247, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cmpx_f_u32", "mnemonic": "v_cmpx_f_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX F U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_f_u32", "operands": [], "dataTypes": ["u32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_f_u32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 253, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_f_u64", "mnemonic": "v_cmpx_f_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX F U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 0. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_f_u64", "operands": [], "dataTypes": ["u64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_f_u64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 260, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ge_f16", "mnemonic": "v_cmpx_ge_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GE F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ge_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 >= S1.f16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ge_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 225, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ge_f32", "mnemonic": "v_cmpx_ge_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GE F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ge_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 >= S1.f32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ge_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 232, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ge_f64", "mnemonic": "v_cmpx_ge_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GE F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ge_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 >= S1.f64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ge_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 239, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ge_i16", "mnemonic": "v_cmpx_ge_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GE I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ge_i16", "operands": [], "dataTypes": ["i16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 >= S1.i16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ge_i16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 246, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ge_i32", "mnemonic": "v_cmpx_ge_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GE I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ge_i32", "operands": [], "dataTypes": ["i32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 >= S1.i32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ge_i32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 253, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ge_i64", "mnemonic": "v_cmpx_ge_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GE I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ge_i64", "operands": [], "dataTypes": ["i64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 >= S1.i64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ge_i64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 259, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ge_u16", "mnemonic": "v_cmpx_ge_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GE U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ge_u16", "operands": [], "dataTypes": ["u16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 >= S1.u16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ge_u16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 248, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ge_u32", "mnemonic": "v_cmpx_ge_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GE U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ge_u32", "operands": [], "dataTypes": ["u32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 >= S1.u32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ge_u32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 254, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ge_u64", "mnemonic": "v_cmpx_ge_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GE U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ge_u64", "operands": [], "dataTypes": ["u64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 >= S1.u64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ge_u64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 261, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_gt_f16", "mnemonic": "v_cmpx_gt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GT F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_gt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 > S1.f16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_gt_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 225, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_gt_f32", "mnemonic": "v_cmpx_gt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GT F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_gt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 > S1.f32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_gt_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 232, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_gt_f64", "mnemonic": "v_cmpx_gt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GT F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_gt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 > S1.f64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_gt_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 239, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_gt_i16", "mnemonic": "v_cmpx_gt_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GT I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_gt_i16", "operands": [], "dataTypes": ["i16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 > S1.i16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_gt_i16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 246, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_gt_i32", "mnemonic": "v_cmpx_gt_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GT I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_gt_i32", "operands": [], "dataTypes": ["i32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 > S1.i32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_gt_i32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 252, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_gt_i64", "mnemonic": "v_cmpx_gt_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GT I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_gt_i64", "operands": [], "dataTypes": ["i64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 > S1.i64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_gt_i64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 259, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_gt_u16", "mnemonic": "v_cmpx_gt_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GT U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_gt_u16", "operands": [], "dataTypes": ["u16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 > S1.u16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_gt_u16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 247, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_gt_u32", "mnemonic": "v_cmpx_gt_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GT U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_gt_u32", "operands": [], "dataTypes": ["u32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 > S1.u32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_gt_u32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 254, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_gt_u64", "mnemonic": "v_cmpx_gt_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX GT U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_gt_u64", "operands": [], "dataTypes": ["u64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 > S1.u64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_gt_u64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 261, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_le_f16", "mnemonic": "v_cmpx_le_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LE F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_le_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 <= S1.f16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_le_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 225, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_le_f32", "mnemonic": "v_cmpx_le_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LE F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_le_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 <= S1.f32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_le_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 232, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_le_f64", "mnemonic": "v_cmpx_le_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LE F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_le_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 <= S1.f64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_le_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 239, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_le_i16", "mnemonic": "v_cmpx_le_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LE I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_le_i16", "operands": [], "dataTypes": ["i16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 <= S1.i16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_le_i16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 245, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_le_i32", "mnemonic": "v_cmpx_le_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LE I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_le_i32", "operands": [], "dataTypes": ["i32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 <= S1.i32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_le_i32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 252, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_le_i64", "mnemonic": "v_cmpx_le_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LE I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_le_i64", "operands": [], "dataTypes": ["i64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 <= S1.i64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_le_i64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 259, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_le_u16", "mnemonic": "v_cmpx_le_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LE U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_le_u16", "operands": [], "dataTypes": ["u16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 <= S1.u16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_le_u16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 247, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_le_u32", "mnemonic": "v_cmpx_le_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LE U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_le_u32", "operands": [], "dataTypes": ["u32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 <= S1.u32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_le_u32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 254, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_le_u64", "mnemonic": "v_cmpx_le_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LE U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_le_u64", "operands": [], "dataTypes": ["u64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 <= S1.u64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_le_u64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 260, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_lg_f16", "mnemonic": "v_cmpx_lg_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LG F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_lg_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 <> S1.f16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_lg_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 225, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_lg_f32", "mnemonic": "v_cmpx_lg_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LG F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_lg_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 <> S1.f32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_lg_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 232, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_lg_f64", "mnemonic": "v_cmpx_lg_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LG F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than or greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than or greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_lg_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 <> S1.f64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_lg_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 239, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_lt_f16", "mnemonic": "v_cmpx_lt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LT F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_lt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 < S1.f16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_lt_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 224, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_lt_f32", "mnemonic": "v_cmpx_lt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LT F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_lt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 < S1.f32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_lt_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 231, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_lt_f64", "mnemonic": "v_cmpx_lt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LT F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_lt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 < S1.f64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_lt_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 238, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_lt_i16", "mnemonic": "v_cmpx_lt_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LT I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_lt_i16", "operands": [], "dataTypes": ["i16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 < S1.i16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_lt_i16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 245, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_lt_i32", "mnemonic": "v_cmpx_lt_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LT I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_lt_i32", "operands": [], "dataTypes": ["i32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 < S1.i32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_lt_i32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 252, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_lt_i64", "mnemonic": "v_cmpx_lt_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LT I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_lt_i64", "operands": [], "dataTypes": ["i64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 < S1.i64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_lt_i64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 258, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_lt_u16", "mnemonic": "v_cmpx_lt_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LT U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_lt_u16", "operands": [], "dataTypes": ["u16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 < S1.u16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_lt_u16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 247, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_lt_u32", "mnemonic": "v_cmpx_lt_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LT U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_lt_u32", "operands": [], "dataTypes": ["u32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 < S1.u32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_lt_u32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 253, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_lt_u64", "mnemonic": "v_cmpx_lt_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX LT U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is less than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is less than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_lt_u64", "operands": [], "dataTypes": ["u64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 < S1.u64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_lt_u64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 260, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ne_i16", "mnemonic": "v_cmpx_ne_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NE I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ne_i16", "operands": [], "dataTypes": ["i16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 <> S1.i16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ne_i16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 246, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ne_i32", "mnemonic": "v_cmpx_ne_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NE I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ne_i32", "operands": [], "dataTypes": ["i32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 <> S1.i32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ne_i32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 253, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ne_i64", "mnemonic": "v_cmpx_ne_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NE I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ne_i64", "operands": [], "dataTypes": ["i64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 <> S1.i64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ne_i64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 259, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ne_u16", "mnemonic": "v_cmpx_ne_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NE U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ne_u16", "operands": [], "dataTypes": ["u16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 <> S1.u16;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ne_u16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 248, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ne_u32", "mnemonic": "v_cmpx_ne_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NE U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ne_u32", "operands": [], "dataTypes": ["u32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 <> S1.u32;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ne_u32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 254, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ne_u64", "mnemonic": "v_cmpx_ne_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NE U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ne_u64", "operands": [], "dataTypes": ["u64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 <> S1.u64;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ne_u64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 261, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_neq_f16", "mnemonic": "v_cmpx_neq_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NEQ F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_neq_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_neq_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 227, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_neq_f32", "mnemonic": "v_cmpx_neq_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NEQ F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_neq_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_neq_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 234, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_neq_f64", "mnemonic": "v_cmpx_neq_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NEQ F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_neq_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_neq_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 241, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_nge_f16", "mnemonic": "v_cmpx_nge_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NGE F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not greater than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_nge_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_nge_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 226, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_nge_f32", "mnemonic": "v_cmpx_nge_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NGE F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not greater than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_nge_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_nge_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 233, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_nge_f64", "mnemonic": "v_cmpx_nge_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NGE F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not greater than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not greater than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_nge_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_nge_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 240, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ngt_f16", "mnemonic": "v_cmpx_ngt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NGT F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ngt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ngt_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 226, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ngt_f32", "mnemonic": "v_cmpx_ngt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NGT F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ngt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ngt_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 233, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_ngt_f64", "mnemonic": "v_cmpx_ngt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NGT F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_ngt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_ngt_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 240, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_nle_f16", "mnemonic": "v_cmpx_nle_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NLE F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_nle_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_nle_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 227, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_nle_f32", "mnemonic": "v_cmpx_nle_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NLE F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_nle_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_nle_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 234, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_nle_f64", "mnemonic": "v_cmpx_nle_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NLE F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than or equal to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than or equal to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_nle_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_nle_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 241, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_nlg_f16", "mnemonic": "v_cmpx_nlg_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NLG F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than or greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than or greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_nlg_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_nlg_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 226, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_nlg_f32", "mnemonic": "v_cmpx_nlg_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NLG F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than or greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than or greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_nlg_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_nlg_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 233, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_nlg_f64", "mnemonic": "v_cmpx_nlg_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NLG F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than or greater than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than or greater than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_nlg_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_nlg_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 240, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_nlt_f16", "mnemonic": "v_cmpx_nlt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NLT F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_nlt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_nlt_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 227, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_nlt_f32", "mnemonic": "v_cmpx_nlt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NLT F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_nlt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_nlt_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 234, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_nlt_f64", "mnemonic": "v_cmpx_nlt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX NLT F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not less than the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not less than the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_nlt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_nlt_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 241, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_o_f16", "mnemonic": "v_cmpx_o_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX O F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is orderable to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is orderable to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_o_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_o_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 225, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_o_f32", "mnemonic": "v_cmpx_o_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX O F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is orderable to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is orderable to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_o_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_o_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 232, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_o_f64", "mnemonic": "v_cmpx_o_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX O F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is orderable to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is orderable to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_o_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_o_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 239, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_t_f16", "mnemonic": "v_cmpx_t_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX T F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into the EXEC mask.", "description": "Set the per-lane condition code to 1. Store the result into the EXEC mask.", "syntax": "v_cmpx_t_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": "v_cmpx_t_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_t_f32", "mnemonic": "v_cmpx_t_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX T F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into the EXEC mask.", "description": "Set the per-lane condition code to 1. Store the result into the EXEC mask.", "syntax": "v_cmpx_t_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_cmpx_t_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_t_f64", "mnemonic": "v_cmpx_t_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX T F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into the EXEC mask.", "description": "Set the per-lane condition code to 1. Store the result into the EXEC mask.", "syntax": "v_cmpx_t_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": "v_cmpx_t_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_t_i16", "mnemonic": "v_cmpx_t_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX T I16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_t_i16", "operands": [], "dataTypes": ["i16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 246, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cmpx_t_i32", "mnemonic": "v_cmpx_t_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX T I32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_t_i32", "operands": [], "dataTypes": ["i32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_t_i32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 253, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_t_i64", "mnemonic": "v_cmpx_t_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX T I64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_t_i64", "operands": [], "dataTypes": ["i64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_t_i64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 260, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_t_u16", "mnemonic": "v_cmpx_t_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX T U16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_t_u16", "operands": [], "dataTypes": ["u16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": null, "exampleSource": null, "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 248, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cmpx_t_u32", "mnemonic": "v_cmpx_t_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX T U32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_t_u32", "operands": [], "dataTypes": ["u32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_t_u32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 255, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_t_u64", "mnemonic": "v_cmpx_t_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX T U64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_t_u64", "operands": [], "dataTypes": ["u64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_t_u64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 261, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_tru_f16", "mnemonic": "v_cmpx_tru_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX TRU F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_tru_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_tru_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 227, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_tru_f32", "mnemonic": "v_cmpx_tru_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX TRU F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_tru_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_tru_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 234, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_tru_f64", "mnemonic": "v_cmpx_tru_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX TRU F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "description": "Set the per-lane condition code to 1. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_tru_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_tru_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 241, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_u_f16", "mnemonic": "v_cmpx_u_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX U F16", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not orderable to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not orderable to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_u_f16", "operands": [], "dataTypes": ["f16"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_u_f16 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 226, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_u_f32", "mnemonic": "v_cmpx_u_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX U F32", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not orderable to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not orderable to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_u_f32", "operands": [], "dataTypes": ["f32"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_u_f32 -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 233, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cmpx_u_f64", "mnemonic": "v_cmpx_u_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CMPX U F64", "category": "Comparison", "instructionClass": "vector", "summary": "Set the per-lane condition code to 1 iff the first input is not orderable to the second input.", "description": "Set the per-lane condition code to 1 iff the first input is not orderable to the second input. Store the result into the EXEC mask and to VCC or a scalar register.", "syntax": "v_cmpx_u_f64", "operands": [], "dataTypes": ["f64"], "semantics": "EXEC.u64[laneId] = D0.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.", "example": "v_cmpx_u_f64 -1, v[2:3]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOPC"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 240, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cndmask_b16", "mnemonic": "v_cndmask_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CNDMASK B16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Copy data from one of two inputs based on the per-lane condition code and store the result into a vector register.", "description": "Copy data from one of two inputs based on the per-lane condition code and store the result into a vector register.", "syntax": "v_cndmask_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "v_cndmask_b16 v5, 0.5, -1, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cndmask_b16_fake16", "mnemonic": "v_cndmask_b16_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CNDMASK B16 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on b16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cndmask_b16_fake16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cndmask_b16_t16", "mnemonic": "v_cndmask_b16_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CNDMASK B16 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on b16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cndmask_b16_t16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cndmask_b32", "mnemonic": "v_cndmask_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CNDMASK B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Copy data from one of two inputs based on the per-lane condition code and store the result into a vector register.", "description": "Copy data from one of two inputs based on the per-lane condition code and store the result into a vector register.", "syntax": "v_cndmask_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = VCC.u64[laneId] ? S1.u32 : S0.u32", "example": "v_cndmask_b32 v5, -1, v2, vcc", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "In VOP3 the VCC source may be a scalar GPR specified in S2. Floating-point modifiers are valid for this instruction if S0 and S1 are 32-bit floating point values. This instruction is suitable for negating or taking the absolute value of a floating-point value.", "sourcePdfPage": 169, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cos_bf16", "mnemonic": "v_cos_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V COS BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cos_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cos_f16", "mnemonic": "v_cos_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V COS F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the trigonometric cosine of a half-precision float value using IEEE rules and store the result into a vector register.", "description": "Calculate the trigonometric cosine of a half-precision float value using IEEE rules and store the result into a vector register. The operand is calculated by scaling the vector input by 2 PI.", "syntax": "v_cos_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = cos(S0.f16 * 16'F(PI * 2.0))", "example": "V_COS_F16(0xfc00) => 0xfe00     // cos(-INF) = NAN\nV_COS_F16(0xfbff) => 0x3c00     // Most negative finite FP16\nV_COS_F16(0x8000) => 0x3c00     // cos(-0.0) = 1\nV_COS_F16(0x3400) => 0x0000     // cos(0.25) = 0", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Denormals are supported. Full range input is supported.", "sourcePdfPage": 210, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cos_f32", "mnemonic": "v_cos_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V COS F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the trigonometric cosine of a single-precision float value using IEEE rules and store the result into a vector register.", "description": "Calculate the trigonometric cosine of a single-precision float value using IEEE rules and store the result into a vector register. The operand is calculated by scaling the vector input by 2 PI.", "syntax": "v_cos_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = cos(S0.f32 * 32'F(PI * 2.0))", "example": "V_COS_F32(0xff800000) => 0xffc00000     // cos(-INF) = NAN\nV_COS_F32(0xff7fffff) => 0x3f800000     // -MaxFloat, finite\nV_COS_F32(0x80000000) => 0x3f800000     // cos(-0.0) = 1\nV_COS_F32(0x3e800000) => 0x00000000     // cos(0.25) = 0", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Denormals are supported. Full range input is supported.", "sourcePdfPage": 199, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cubeid_f32", "mnemonic": "v_cubeid_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CUBEID F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the cubemap face ID of a 3D coordinate specified as three single-precision float inputs.", "description": "Compute the cubemap face ID of a 3D coordinate specified as three single-precision float inputs. Store the result in single-precision float format into a vector register.", "syntax": "v_cubeid_f32", "operands": [], "dataTypes": ["f32"], "semantics": "// Set D0.f = cubemap face ID ({0.0, 1.0, ..., 5.0}).\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nif S2.f32 < 0.0F then\nD0.f32 = 5.0F\nelse\nD0.f32 = 4.0F\nendif\nelsif abs(S1.f32) >= abs(S0.f32) then\nif S1.f32 < 0.0F then\nD0.f32 = 3.0F\nelse\nD0.f32 = 2.0F\nendif\nelse\nif S0.f32 < 0.0F then\nD0.f32 = 1.0F\nelse\nD0.f32 = 0.0F\nendif\nendif", "example": "v_cubeid_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 336, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cubema_f32", "mnemonic": "v_cubema_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CUBEMA F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the cubemap major axis of a 3D coordinate specified as three single-precision float inputs.", "description": "Compute the cubemap major axis of a 3D coordinate specified as three single-precision float inputs. Store the result in single-precision float format into a vector register.", "syntax": "v_cubema_f32", "operands": [], "dataTypes": ["f32"], "semantics": "// D0.f = 2.0 * cubemap major axis.\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nD0.f32 = S2.f32 * 2.0F\nelsif abs(S1.f32) >= abs(S0.f32) then\nD0.f32 = S1.f32 * 2.0F\nelse\nD0.f32 = S0.f32 * 2.0F\nendif", "example": "v_cubema_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 337, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cubesc_f32", "mnemonic": "v_cubesc_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CUBESC F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the cubemap S coordinate of a 3D coordinate specified as three single-precision float inputs.", "description": "Compute the cubemap S coordinate of a 3D coordinate specified as three single-precision float inputs. Store the result in single-precision float format into a vector register.", "syntax": "v_cubesc_f32", "operands": [], "dataTypes": ["f32"], "semantics": "// D0.f = cubemap S coordinate.\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nif S2.f32 < 0.0F then\nD0.f32 = -S0.f32\nelse\nD0.f32 = S0.f32\nendif\nelsif abs(S1.f32) >= abs(S0.f32) then\nD0.f32 = S0.f32\nelse\nif S0.f32 < 0.0F then\nD0.f32 = S2.f32\nelse\nD0.f32 = -S2.f32\nendif\nendif", "example": "v_cubesc_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 336, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cubetc_f32", "mnemonic": "v_cubetc_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CUBETC F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the cubemap T coordinate of a 3D coordinate specified as three single-precision float inputs.", "description": "Compute the cubemap T coordinate of a 3D coordinate specified as three single-precision float inputs. Store the result in single-precision float format into a vector register.", "syntax": "v_cubetc_f32", "operands": [], "dataTypes": ["f32"], "semantics": "// D0.f = cubemap T coordinate.\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nD0.f32 = -S1.f32\nelsif abs(S1.f32) >= abs(S0.f32) then\nif S1.f32 < 0.0F then\nD0.f32 = -S2.f32\nelse\nD0.f32 = S2.f32\nendif\nelse\nD0.f32 = -S1.f32\nendif", "example": "v_cubetc_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 337, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f16_bf8", "mnemonic": "v_cvt_f16_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F16 BF8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_f16_bf8", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_f16_f32", "mnemonic": "v_cvt_f16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a single-precision float input to a half-precision float value and store the result into a vector register.", "description": "Convert from a single-precision float input to a half-precision float value and store the result into a vector register.", "syntax": "v_cvt_f16_f32", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "D0.f16 = f32_to_f16(S0.f32)", "example": "v_cvt_f16_f32 v5.l, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, supports input modifiers and creates FP16 denormals when appropriate. Flush denorms on output if specified based on DP denorm mode. Output rounding based on DP rounding mode.", "sourcePdfPage": 189, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f16_f32_fake16", "mnemonic": "v_cvt_f16_f32_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F16 F32 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f16/f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_f16_f32_fake16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_f16_f32_t16", "mnemonic": "v_cvt_f16_f32_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F16 F32 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f16/f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_f16_f32_t16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_f16_fp8", "mnemonic": "v_cvt_f16_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F16 FP8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_f16_fp8", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_f16_i16", "mnemonic": "v_cvt_f16_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F16 I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a signed 16-bit integer input to a half-precision float value and store the result into a vector register.", "description": "Convert from a signed 16-bit integer input to a half-precision float value and store the result into a vector register.", "syntax": "v_cvt_f16_i16", "operands": [], "dataTypes": ["f16", "i16"], "semantics": "D0.f16 = i16_to_f16(S0.i16)", "example": "v_cvt_f16_i16 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, supports denormals, rounding, exception flags and saturation.", "sourcePdfPage": 204, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f16_u16", "mnemonic": "v_cvt_f16_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F16 U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from an unsigned 16-bit integer input to a half-precision float value and store the result into a vector register.", "description": "Convert from an unsigned 16-bit integer input to a half-precision float value and store the result into a vector register.", "syntax": "v_cvt_f16_u16", "operands": [], "dataTypes": ["f16", "u16"], "semantics": "D0.f16 = u16_to_f16(S0.u16)", "example": "v_cvt_f16_u16 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, supports denormals, rounding, exception flags and saturation.", "sourcePdfPage": 204, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f32_bf16", "mnemonic": "v_cvt_f32_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a BF16 float input to a single-precision float value and store the result into a vector register.", "description": "Convert from a BF16 float input to a single-precision float value and store the result into a vector register.", "syntax": "v_cvt_f32_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_f32_bf8", "mnemonic": "v_cvt_f32_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 BF8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a BF8 float input to a single-precision float value and store the result into a vector register.", "description": "Convert from a BF8 float input to a single-precision float value and store the result into a vector register.", "syntax": "v_cvt_f32_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "if SDWA_SRC0_SEL == BYTE1.b3 then\nD0.f32 = bf8_to_f32(S0[15 : 8].bf8)\nelsif SDWA_SRC0_SEL == BYTE2.b3 then\nD0.f32 = bf8_to_f32(S0[23 : 16].bf8)\nelsif SDWA_SRC0_SEL == BYTE3.b3 then\nD0.f32 = bf8_to_f32(S0[31 : 24].bf8)\nelse\n// BYTE0 implied\nD0.f32 = bf8_to_f32(S0[7 : 0].bf8)\nendif", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "SDWA encoding allows SRC0_SEL to control which byte of S0 is converted. Only the BYTE selects of SRC0_SEL are legal. If this instruction is not encoded in SDWA then BYTE0 is implied.", "sourcePdfPage": 212, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cvt_f32_bf8_op_sel", "mnemonic": "v_cvt_f32_bf8_op_sel", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 BF8 OP SEL", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_f32_bf8_op_sel", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_f32_f16", "mnemonic": "v_cvt_f32_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a half-precision float input to a single-precision float value and store the result into a vector register.", "description": "Convert from a half-precision float input to a single-precision float value and store the result into a vector register.", "syntax": "v_cvt_f32_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "D0.f32 = f16_to_f32(S0.f16)", "example": "v_cvt_f32_f16 v5, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0ULP accuracy, FP16 denormal inputs are accepted. Flush denorms on input if specified based on DP denorm mode.", "sourcePdfPage": 189, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f32_f16_fake16", "mnemonic": "v_cvt_f32_f16_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 F16 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f16/f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_f32_f16_fake16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_f32_f16_t16", "mnemonic": "v_cvt_f32_f16_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 F16 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f16/f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_f32_f16_t16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_f32_f64", "mnemonic": "v_cvt_f32_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a double-precision float input to a single-precision float value and store the result into a vector register.", "description": "Convert from a double-precision float input to a single-precision float value and store the result into a vector register.", "syntax": "v_cvt_f32_f64", "operands": [], "dataTypes": ["f32", "f64"], "semantics": "D0.f32 = f64_to_f32(S0.f64)", "example": "v_cvt_f32_f64 v5, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, denormals are supported.", "sourcePdfPage": 191, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f32_fp8", "mnemonic": "v_cvt_f32_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 FP8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from an FP8 float input to a single-precision float value and store the result into a vector register.", "description": "Convert from an FP8 float input to a single-precision float value and store the result into a vector register.", "syntax": "v_cvt_f32_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "if SDWA_SRC0_SEL == BYTE1.b3 then\nD0.f32 = fp8_to_f32(S0[15 : 8].fp8)\nelsif SDWA_SRC0_SEL == BYTE2.b3 then\nD0.f32 = fp8_to_f32(S0[23 : 16].fp8)\nelsif SDWA_SRC0_SEL == BYTE3.b3 then\nD0.f32 = fp8_to_f32(S0[31 : 24].fp8)\nelse\n// BYTE0 implied\nD0.f32 = fp8_to_f32(S0[7 : 0].fp8)\nendif", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "SDWA encoding allows SRC0_SEL to control which byte of S0 is converted. Only the BYTE selects of SRC0_SEL are legal. If this instruction is not encoded in SDWA then BYTE0 is implied.", "sourcePdfPage": 211, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cvt_f32_fp8_gfx1250", "mnemonic": "v_cvt_f32_fp8_gfx1250", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 FP8 GFX1250", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_f32_fp8_gfx1250", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_f32_fp8_op_sel", "mnemonic": "v_cvt_f32_fp8_op_sel", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 FP8 OP SEL", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_f32_fp8_op_sel", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_f32_i32", "mnemonic": "v_cvt_f32_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Per-lane conversion from signed 32-bit integer to single-precision float.", "description": "Convert from a signed 32-bit integer input to a single-precision float value and store the result into a vector register.", "syntax": "v_cvt_f32_i32 VDST, S0", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "S0", "desc": "Source VGPR (i32)"}], "dataTypes": ["f32", "i32"], "semantics": "VDST[lane] = convert_i32_to_f32(S0[lane]) for each active lane.", "example": "v_cvt_f32_i32  v1, v0   // per-lane v1 = (float) v0", "exampleSource": null, "encoding": {"format": "VOP1", "widthBits": 32}, "executionUnit": "Vector ALU", "registerClasses": ["VGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_f32_u32", "mnemonic": "v_cvt_f32_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from an unsigned 32-bit integer input to a single-precision float value and store the result into a vector register.", "description": "Convert from an unsigned 32-bit integer input to a single-precision float value and store the result into a vector register.", "syntax": "v_cvt_f32_u32", "operands": [], "dataTypes": ["f32", "u32"], "semantics": "D0.f32 = u32_to_f32(S0.u32)", "example": "v_cvt_f32_u32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy.", "sourcePdfPage": 188, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f32_ubyte0", "mnemonic": "v_cvt_f32_ubyte0", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 UBYTE0", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert an unsigned byte in byte 0 of the input to a single-precision float value and store the result into a vector register.", "description": "Convert an unsigned byte in byte 0 of the input to a single-precision float value and store the result into a vector register.", "syntax": "v_cvt_f32_ubyte0", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = u32_to_f32(S0[7 : 0].u32)", "example": "v_cvt_f32_ubyte0 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 191, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f32_ubyte1", "mnemonic": "v_cvt_f32_ubyte1", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 UBYTE1", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert an unsigned byte in byte 1 of the input to a single-precision float value and store the result into a vector register.", "description": "Convert an unsigned byte in byte 1 of the input to a single-precision float value and store the result into a vector register.", "syntax": "v_cvt_f32_ubyte1", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = u32_to_f32(S0[15 : 8].u32)", "example": "v_cvt_f32_ubyte1 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 191, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f32_ubyte2", "mnemonic": "v_cvt_f32_ubyte2", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 UBYTE2", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert an unsigned byte in byte 2 of the input to a single-precision float value and store the result into a vector register.", "description": "Convert an unsigned byte in byte 2 of the input to a single-precision float value and store the result into a vector register.", "syntax": "v_cvt_f32_ubyte2", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = u32_to_f32(S0[23 : 16].u32)", "example": "v_cvt_f32_ubyte2 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 191, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f32_ubyte3", "mnemonic": "v_cvt_f32_ubyte3", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F32 UBYTE3", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert an unsigned byte in byte 3 of the input to a single-precision float value and store the result into a vector register.", "description": "Convert an unsigned byte in byte 3 of the input to a single-precision float value and store the result into a vector register.", "syntax": "v_cvt_f32_ubyte3", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = u32_to_f32(S0[31 : 24].u32)", "example": "v_cvt_f32_ubyte3 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 192, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f64_f32", "mnemonic": "v_cvt_f64_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F64 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a single-precision float input to a double-precision float value and store the result into a vector register.", "description": "Convert from a single-precision float input to a double-precision float value and store the result into a vector register.", "syntax": "v_cvt_f64_f32", "operands": [], "dataTypes": ["f32", "f64"], "semantics": "D0.f64 = f32_to_f64(S0.f32)", "example": "v_cvt_f64_f32 v[5:6], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0ULP accuracy, denormals are supported.", "sourcePdfPage": 191, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f64_i32", "mnemonic": "v_cvt_f64_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F64 I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a signed 32-bit integer input to a double-precision float value and store the result into a vector register.", "description": "Convert from a signed 32-bit integer input to a double-precision float value and store the result into a vector register.", "syntax": "v_cvt_f64_i32", "operands": [], "dataTypes": ["f64", "i32"], "semantics": "D0.f64 = i32_to_f64(S0.i32)", "example": "v_cvt_f64_i32 v[5:6], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0ULP accuracy.", "sourcePdfPage": 187, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_f64_u32", "mnemonic": "v_cvt_f64_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT F64 U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from an unsigned 32-bit integer input to a double-precision float value and store the result into a vector register.", "description": "Convert from an unsigned 32-bit integer input to a double-precision float value and store the result into a vector register.", "syntax": "v_cvt_f64_u32", "operands": [], "dataTypes": ["f64", "u32"], "semantics": "D0.f64 = u32_to_f64(S0.u32)", "example": "v_cvt_f64_u32 v[5:6], v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0ULP accuracy.", "sourcePdfPage": 192, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_flr_i32_f32", "mnemonic": "v_cvt_flr_i32_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT FLR I32 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a single-precision float input to a signed 32-bit integer value using round-down semantics (ignore the default rounding mode) and store…", "description": "Convert from a single-precision float input to a signed 32-bit integer value using round-down semantics (ignore the default rounding mode) and store the result into a vector register.", "syntax": "v_cvt_flr_i32_f32", "operands": [], "dataTypes": ["f32", "i32"], "semantics": "D0.i32 = f32_to_i32(floor(S0.f32))", "example": "v_cvt_flr_i32_f32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy, denormals are supported.", "sourcePdfPage": 190, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_i16_f16", "mnemonic": "v_cvt_i16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT I16 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a half-precision float input to a signed 16-bit integer value and store the result into a vector register.", "description": "Convert from a half-precision float input to a signed 16-bit integer value and store the result into a vector register.", "syntax": "v_cvt_i16_f16", "operands": [], "dataTypes": ["f16", "i16"], "semantics": "D0.i16 = f16_to_i16(S0.f16)", "example": "v_cvt_i16_f16 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy, supports rounding, exception flags and saturation. FP16 denormals are accepted. Conversion is done with truncation. Generation of the INEXACT exception is controlled by the CLAMP bit. INEXACT exceptions are enabled for this conversion iff CLAMP == 1.", "sourcePdfPage": 205, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_i32_f32", "mnemonic": "v_cvt_i32_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT I32 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a single-precision float input to a signed 32-bit integer value and store the result into a vector register.", "description": "Convert from a single-precision float input to a signed 32-bit integer value and store the result into a vector register.", "syntax": "v_cvt_i32_f32", "operands": [], "dataTypes": ["f32", "i32"], "semantics": "D0.i32 = f32_to_i32(S0.f32)", "example": "v_cvt_i32_f32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy, out-of-range floating point values (including infinity) saturate. NAN is converted to 0. Generation of the INEXACT exception is controlled by the CLAMP bit. INEXACT exceptions are enabled for this conversion iff CLAMP == 1.", "sourcePdfPage": 189, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_i32_f64", "mnemonic": "v_cvt_i32_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT I32 F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a double-precision float input to a signed 32-bit integer value and store the result into a vector register.", "description": "Convert from a double-precision float input to a signed 32-bit integer value and store the result into a vector register.", "syntax": "v_cvt_i32_f64", "operands": [], "dataTypes": ["f64", "i32"], "semantics": "D0.i32 = f64_to_i32(S0.f64)", "example": "v_cvt_i32_f64 v5, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, out-of-range floating point values (including infinity) saturate. NAN is converted to 0. Generation of the INEXACT exception is controlled by the CLAMP bit. INEXACT exceptions are enabled for this conversion iff CLAMP == 1.", "sourcePdfPage": 187, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_i32_i16", "mnemonic": "v_cvt_i32_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT I32 I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a signed 16-bit integer input to a signed 32-bit integer value using sign extension and store the result into a vector register.", "description": "Convert from a signed 16-bit integer input to a signed 32-bit integer value using sign extension and store the result into a vector register.", "syntax": "v_cvt_i32_i16", "operands": [], "dataTypes": ["i16", "i32"], "semantics": "", "example": "v_cvt_i32_i16 v5, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_norm_i16_f16", "mnemonic": "v_cvt_norm_i16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT NORM I16 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a half-precision float input to a signed normalized short and store the result into a vector register.", "description": "Convert from a half-precision float input to a signed normalized short and store the result into a vector register.", "syntax": "v_cvt_norm_i16_f16", "operands": [], "dataTypes": ["f16", "i16"], "semantics": "D0.i16 = f16_to_snorm(S0.f16)", "example": "v_cvt_norm_i16_f16 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, supports rounding, exception flags and saturation, denormals are supported.", "sourcePdfPage": 210, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_norm_u16_f16", "mnemonic": "v_cvt_norm_u16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT NORM U16 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a half-precision float input to an unsigned normalized short and store the result into a vector register.", "description": "Convert from a half-precision float input to an unsigned normalized short and store the result into a vector register.", "syntax": "v_cvt_norm_u16_f16", "operands": [], "dataTypes": ["f16", "u16"], "semantics": "D0.u16 = f16_to_unorm(S0.f16)", "example": "v_cvt_norm_u16_f16 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, supports rounding, exception flags and saturation, denormals are supported.", "sourcePdfPage": 210, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_off_f32_i4", "mnemonic": "v_cvt_off_f32_i4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT OFF F32 I4", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a signed 4-bit integer input to a single-precision float value using an offset table and store the result into a vector register.", "description": "Convert from a signed 4-bit integer input to a single-precision float value using an offset table and store the result into a vector register. Used for interpolation in shader. Lookup table on S0[3:0]: S0 binary Result 1000 -0.5000f 1001 -0.4375f 1010 -0.3750f 1011 -0.3125f 1100 -0.2500f 1101 -0.1875f 1110 -0.1250f 1111 -0.0625f 0000 +0.0000f 0001 +0.0625f 0010 +0.1250f 0011 +0.1875f 0100 +0.2500f 0101 +0.3125f 0110 +0.3750f 0111 +0.4375f", "syntax": "v_cvt_off_f32_i4", "operands": [], "dataTypes": ["f32"], "semantics": "declare CVT_OFF_TABLE : 32'F[16];\nD0.f32 = CVT_OFF_TABLE[S0.u32[3 : 0]]", "example": "v_cvt_off_f32_i4 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 190, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_pk_bf16_f32", "mnemonic": "v_cvt_pk_bf16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK BF16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two single-precision float inputs to a packed BF16 value and store the result into a vector register.", "description": "Convert from two single-precision float inputs to a packed BF16 value and store the result into a vector register.", "syntax": "v_cvt_pk_bf16_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_pk_bf8_f16", "mnemonic": "v_cvt_pk_bf8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK BF8 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_pk_bf8_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_pk_bf8_f32", "mnemonic": "v_cvt_pk_bf8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK BF8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two single-precision float inputs to a packed BF8 float value with round to nearest even semantics and store the result into 16 bits of…", "description": "Convert from two single-precision float inputs to a packed BF8 float value with round to nearest even semantics and store the result into 16 bits of a vector register using OPSEL.", "syntax": "v_cvt_pk_bf8_f32", "operands": [], "dataTypes": ["f32"], "semantics": "prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\nif OPSEL[3].u32 == 0U then\nVGPR[laneId][VDST.u32][15 : 0].b16 = { f32_to_bf8(S1.f32), f32_to_bf8(S0.f32) };\n// D0[31:16] are preserved\nelse\nVGPR[laneId][VDST.u32][31 : 16].b16 = { f32_to_bf8(S1.f32), f32_to_bf8(S0.f32) };\n// D0[15:0] are preserved\nendif;\nROUND_MODE = prev_mode", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Round to nearest even. Ignores OMOD and clamp.", "sourcePdfPage": 370, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cvt_pk_f16_bf8", "mnemonic": "v_cvt_pk_f16_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK F16 BF8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_pk_f16_bf8", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_pk_f16_f32", "mnemonic": "v_cvt_pk_f16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK F16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two single-precision float inputs to a packed half-precision value and store the result into a vector register.", "description": "Convert from two single-precision float inputs to a packed half-precision value and store the result into a vector register.", "syntax": "v_cvt_pk_f16_f32", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_pk_f16_fp8", "mnemonic": "v_cvt_pk_f16_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK F16 FP8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_pk_f16_fp8", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_pk_f32_bf8", "mnemonic": "v_cvt_pk_f32_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK F32 BF8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 2-component BF8 float input to a packed single-precision float value and store the result into a vector register.", "description": "Convert from a packed 2-component BF8 float input to a packed single-precision float value and store the result into a vector register.", "syntax": "v_cvt_pk_f32_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "tmp = SDWA_SRC0_SEL[1 : 0] == WORD1.b2 ? S0[31 : 16] : S0[15 : 0];\nD0[31 : 0].f32 = bf8_to_f32(tmp[7 : 0].bf8);\nD0[63 : 32].f32 = bf8_to_f32(tmp[15 : 8].bf8)", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "SDWA encoding allows SRC0_SEL to control which word of S0 is converted. Only the WORD selects of SRC0_SEL are legal. If this instruction is not encoded in SDWA then WORD0 is implied.", "sourcePdfPage": 213, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cvt_pk_f32_bf8_fake16", "mnemonic": "v_cvt_pk_f32_bf8_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK F32 BF8 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_pk_f32_bf8_fake16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_pk_f32_bf8_t16", "mnemonic": "v_cvt_pk_f32_bf8_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK F32 BF8 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_pk_f32_bf8_t16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_pk_f32_fp8", "mnemonic": "v_cvt_pk_f32_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK F32 FP8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 2-component FP8 float input to a packed single-precision float value and store the result into a vector register.", "description": "Convert from a packed 2-component FP8 float input to a packed single-precision float value and store the result into a vector register.", "syntax": "v_cvt_pk_f32_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "tmp = SDWA_SRC0_SEL[1 : 0] == WORD1.b2 ? S0[31 : 16] : S0[15 : 0];\nD0[31 : 0].f32 = fp8_to_f32(tmp[7 : 0].fp8);\nD0[63 : 32].f32 = fp8_to_f32(tmp[15 : 8].fp8)", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "SDWA encoding allows SRC0_SEL to control which word of S0 is converted. Only the WORD selects of SRC0_SEL are legal. If this instruction is not encoded in SDWA then WORD0 is implied.", "sourcePdfPage": 212, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cvt_pk_f32_fp8_fake16", "mnemonic": "v_cvt_pk_f32_fp8_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK F32 FP8 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_pk_f32_fp8_fake16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_pk_f32_fp8_t16", "mnemonic": "v_cvt_pk_f32_fp8_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK F32 FP8 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_pk_f32_fp8_t16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_pk_fp8_f16", "mnemonic": "v_cvt_pk_fp8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK FP8 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_pk_fp8_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_pk_fp8_f32", "mnemonic": "v_cvt_pk_fp8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK FP8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two single-precision float inputs to a packed FP8 float value with round to nearest even semantics and store the result into 16 bits of…", "description": "Convert from two single-precision float inputs to a packed FP8 float value with round to nearest even semantics and store the result into 16 bits of a vector register using OPSEL.", "syntax": "v_cvt_pk_fp8_f32", "operands": [], "dataTypes": ["f32"], "semantics": "prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\nif OPSEL[3].u32 == 0U then\nVGPR[laneId][VDST.u32][15 : 0].b16 = { f32_to_fp8(S1.f32), f32_to_fp8(S0.f32) };\n// D0[31:16] are preserved\nelse\nVGPR[laneId][VDST.u32][31 : 16].b16 = { f32_to_fp8(S1.f32), f32_to_fp8(S0.f32) };\n// D0[15:0] are preserved\nendif;\nROUND_MODE = prev_mode", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Round to nearest even. Ignores OMOD and clamp.", "sourcePdfPage": 369, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cvt_pk_fp8_f32_gfx1250", "mnemonic": "v_cvt_pk_fp8_f32_gfx1250", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK FP8 F32 GFX1250", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_pk_fp8_f32_gfx1250", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_pk_i16_f32", "mnemonic": "v_cvt_pk_i16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK I16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert two single-precision float inputs into a packed signed 16-bit integer value and store the result into a vector register.", "description": "Convert two single-precision float inputs into a packed signed 16-bit integer value and store the result into a vector register.", "syntax": "v_cvt_pk_i16_f32", "operands": [], "dataTypes": ["f32", "i16"], "semantics": "", "example": "v_cvt_pk_i16_f32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_pk_i16_i32", "mnemonic": "v_cvt_pk_i16_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK I16 I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two signed 32-bit integer inputs to a packed signed 16-bit integer value and store the result into a vector register.", "description": "Convert from two signed 32-bit integer inputs to a packed signed 16-bit integer value and store the result into a vector register.", "syntax": "v_cvt_pk_i16_i32", "operands": [], "dataTypes": ["i16", "i32"], "semantics": "", "example": "v_cvt_pk_i16_i32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_pk_norm_i16_f16", "mnemonic": "v_cvt_pk_norm_i16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK NORM I16 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two half-precision float inputs to a packed signed normalized short and store the result into a vector register.", "description": "Convert from two half-precision float inputs to a packed signed normalized short and store the result into a vector register.", "syntax": "v_cvt_pk_norm_i16_f16", "operands": [], "dataTypes": ["f16", "i16"], "semantics": "", "example": "v_cvt_pk_norm_i16_f16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_pk_norm_i16_f32", "mnemonic": "v_cvt_pk_norm_i16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK NORM I16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two single-precision float inputs to a packed signed normalized short and store the result into a vector register.", "description": "Convert from two single-precision float inputs to a packed signed normalized short and store the result into a vector register.", "syntax": "v_cvt_pk_norm_i16_f32", "operands": [], "dataTypes": ["f32", "i16"], "semantics": "", "example": "v_cvt_pk_norm_i16_f32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_pk_norm_u16_f16", "mnemonic": "v_cvt_pk_norm_u16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK NORM U16 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two half-precision float inputs to a packed unsigned normalized short and store the result into a vector register.", "description": "Convert from two half-precision float inputs to a packed unsigned normalized short and store the result into a vector register.", "syntax": "v_cvt_pk_norm_u16_f16", "operands": [], "dataTypes": ["f16", "u16"], "semantics": "", "example": "v_cvt_pk_norm_u16_f16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_pk_norm_u16_f32", "mnemonic": "v_cvt_pk_norm_u16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK NORM U16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two single-precision float inputs to a packed unsigned normalized short and store the result into a vector register.", "description": "Convert from two single-precision float inputs to a packed unsigned normalized short and store the result into a vector register.", "syntax": "v_cvt_pk_norm_u16_f32", "operands": [], "dataTypes": ["f32", "u16"], "semantics": "", "example": "v_cvt_pk_norm_u16_f32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_pk_u16_f32", "mnemonic": "v_cvt_pk_u16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK U16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert two single-precision float inputs into a packed unsigned 16-bit integer value and store the result into a vector register.", "description": "Convert two single-precision float inputs into a packed unsigned 16-bit integer value and store the result into a vector register.", "syntax": "v_cvt_pk_u16_f32", "operands": [], "dataTypes": ["f32", "u16"], "semantics": "", "example": "v_cvt_pk_u16_f32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_pk_u16_u32", "mnemonic": "v_cvt_pk_u16_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK U16 U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two unsigned 32-bit integer inputs to a packed unsigned 16-bit integer value and store the result into a vector register.", "description": "Convert from two unsigned 32-bit integer inputs to a packed unsigned 16-bit integer value and store the result into a vector register.", "syntax": "v_cvt_pk_u16_u32", "operands": [], "dataTypes": ["u16", "u32"], "semantics": "", "example": "v_cvt_pk_u16_u32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_pk_u8_f32", "mnemonic": "v_cvt_pk_u8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PK U8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert a single-precision float value from the first input to an unsigned 8-bit integer value and pack the result into one byte of the third input…", "description": "Convert a single-precision float value from the first input to an unsigned 8-bit integer value and pack the result into one byte of the third input using the second input as a byte select. Store the result into a vector register.", "syntax": "v_cvt_pk_u8_f32", "operands": [], "dataTypes": ["f32", "u8"], "semantics": "tmp = (S2.u32 & 32'U(~(0xff << (S1.u32[1 : 0].u32 * 8U))));\ntmp = (tmp | ((32'U(f32_to_u8(S0.f32)) & 255U) << (S1.u32[1 : 0].u32 * 8U)));\nD0.u32 = tmp", "example": "v_cvt_pk_u8_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 343, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_pkaccum_u8_f32", "mnemonic": "v_cvt_pkaccum_u8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PKACCUM U8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert a single-precision float value in the first input to an unsigned 8-bit integer value and store the result into one byte of the destination…", "description": "Convert a single-precision float value in the first input to an unsigned 8-bit integer value and store the result into one byte of the destination register using the second input as a byte select.", "syntax": "v_cvt_pkaccum_u8_f32", "operands": [], "dataTypes": ["f32", "u8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_pknorm_i16_f16", "mnemonic": "v_cvt_pknorm_i16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PKNORM I16 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two half-precision float inputs to a packed signed normalized short and store the result into a vector register.", "description": "Convert from two half-precision float inputs to a packed signed normalized short and store the result into a vector register.", "syntax": "v_cvt_pknorm_i16_f16", "operands": [], "dataTypes": ["f16", "i16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].i16 = f16_to_snorm(S0.f16);\ntmp[31 : 16].i16 = f16_to_snorm(S1.f16);\nD0 = tmp.b32", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 367, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cvt_pknorm_i16_f32", "mnemonic": "v_cvt_pknorm_i16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PKNORM I16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two single-precision float inputs to a packed signed normalized short and store the result into a vector register.", "description": "Convert from two single-precision float inputs to a packed signed normalized short and store the result into a vector register.", "syntax": "v_cvt_pknorm_i16_f32", "operands": [], "dataTypes": ["f32", "i16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_pknorm_u16_f16", "mnemonic": "v_cvt_pknorm_u16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PKNORM U16 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two half-precision float inputs to a packed unsigned normalized short and store the result into a vector register.", "description": "Convert from two half-precision float inputs to a packed unsigned normalized short and store the result into a vector register.", "syntax": "v_cvt_pknorm_u16_f16", "operands": [], "dataTypes": ["f16", "u16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].u16 = f16_to_unorm(S0.f16);\ntmp[31 : 16].u16 = f16_to_unorm(S1.f16);\nD0 = tmp.b32", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 367, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cvt_pknorm_u16_f32", "mnemonic": "v_cvt_pknorm_u16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PKNORM U16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from two single-precision float inputs to a packed unsigned normalized short and store the result into a vector register.", "description": "Convert from two single-precision float inputs to a packed unsigned normalized short and store the result into a vector register.", "syntax": "v_cvt_pknorm_u16_f32", "operands": [], "dataTypes": ["f32", "u16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_pkrtz_f16_f32", "mnemonic": "v_cvt_pkrtz_f16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT PKRTZ F16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert two single-precision float inputs to a packed half-precision float value using round toward zero semantics (ignore the current rounding…", "description": "Convert two single-precision float inputs to a packed half-precision float value using round toward zero semantics (ignore the current rounding mode), and store the result into a vector register.", "syntax": "v_cvt_pkrtz_f16_f32", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": "v_cvt_pkrtz_f16_f32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_rpi_i32_f32", "mnemonic": "v_cvt_rpi_i32_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT RPI I32 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a single-precision float input to a signed 32-bit integer value using round to nearest integer semantics (ignore the default rounding…", "description": "Convert from a single-precision float input to a signed 32-bit integer value using round to nearest integer semantics (ignore the default rounding mode) and store the result into a vector register.", "syntax": "v_cvt_rpi_i32_f32", "operands": [], "dataTypes": ["f32", "i32"], "semantics": "D0.i32 = f32_to_i32(floor(S0.f32 + 0.5F))", "example": "v_cvt_rpi_i32_f32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, denormals are supported.", "sourcePdfPage": 189, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_scale_pk16_bf16_bf6", "mnemonic": "v_cvt_scale_pk16_bf16_bf6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK16 BF16 BF6", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk16_bf16_bf6", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk16_bf16_fp6", "mnemonic": "v_cvt_scale_pk16_bf16_fp6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK16 BF16 FP6", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk16_bf16_fp6", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk16_f16_bf6", "mnemonic": "v_cvt_scale_pk16_f16_bf6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK16 F16 BF6", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk16_f16_bf6", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk16_f16_fp6", "mnemonic": "v_cvt_scale_pk16_f16_fp6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK16 F16 FP6", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk16_f16_fp6", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk16_f32_bf6", "mnemonic": "v_cvt_scale_pk16_f32_bf6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK16 F32 BF6", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk16_f32_bf6", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk16_f32_fp6", "mnemonic": "v_cvt_scale_pk16_f32_fp6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK16 F32 FP6", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk16_f32_fp6", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk8_bf16_bf8", "mnemonic": "v_cvt_scale_pk8_bf16_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK8 BF16 BF8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk8_bf16_bf8", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk8_bf16_fp4", "mnemonic": "v_cvt_scale_pk8_bf16_fp4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK8 BF16 FP4", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk8_bf16_fp4", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk8_bf16_fp8", "mnemonic": "v_cvt_scale_pk8_bf16_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK8 BF16 FP8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk8_bf16_fp8", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk8_f16_bf8", "mnemonic": "v_cvt_scale_pk8_f16_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK8 F16 BF8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk8_f16_bf8", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk8_f16_fp4", "mnemonic": "v_cvt_scale_pk8_f16_fp4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK8 F16 FP4", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk8_f16_fp4", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk8_f16_fp8", "mnemonic": "v_cvt_scale_pk8_f16_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK8 F16 FP8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk8_f16_fp8", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk8_f32_bf8", "mnemonic": "v_cvt_scale_pk8_f32_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK8 F32 BF8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk8_f32_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk8_f32_fp4", "mnemonic": "v_cvt_scale_pk8_f32_fp4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK8 F32 FP4", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk8_f32_fp4", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scale_pk8_f32_fp8", "mnemonic": "v_cvt_scale_pk8_f32_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALE PK8 F32 FP8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scale_pk8_f32_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_2xpk16_bf6_f32", "mnemonic": "v_cvt_scalef32_2xpk16_bf6_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 2XPK16 BF6 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale packed 16-component single-precision float vectors from two source inputs using the exponent provided by the third single-precision float…", "description": "Scale packed 16-component single-precision float vectors from two source inputs using the exponent provided by the third single-precision float input, then convert the values to a packed 32-component BF6 float value. Store the result into a vector register.", "syntax": "v_cvt_scalef32_2xpk16_bf6_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_2xpk16_fp6_f32", "mnemonic": "v_cvt_scalef32_2xpk16_fp6_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 2XPK16 FP6 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale packed 16-component single-precision float vectors from two source inputs using the exponent provided by the third single-precision float…", "description": "Scale packed 16-component single-precision float vectors from two source inputs using the exponent provided by the third single-precision float input, then convert the values to a packed 32-component FP6 float value. Store the result into a vector register.", "syntax": "v_cvt_scalef32_2xpk16_fp6_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_f16_bf8", "mnemonic": "v_cvt_scalef32_f16_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 F16 BF8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a BF8 float input to a half-precision float value, then scale the value using the exponent provided by the second single-precision float…", "description": "Convert from a BF8 float input to a half-precision float value, then scale the value using the exponent provided by the second single-precision float input. Store the result into a vector register. The value to convert is loaded from 8 bits of the input using OPSEL[1:0] to determine which byte to read.", "syntax": "v_cvt_scalef32_f16_bf8", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_f16_fp8", "mnemonic": "v_cvt_scalef32_f16_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 F16 FP8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from an FP8 float input to a half-precision float value, then scale the value using the exponent provided by the second single-precision…", "description": "Convert from an FP8 float input to a half-precision float value, then scale the value using the exponent provided by the second single-precision float input. Store the result into a vector register. The value to convert is loaded from 8 bits of the input using OPSEL[1:0] to determine which byte to read.", "syntax": "v_cvt_scalef32_f16_fp8", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_f32_bf8", "mnemonic": "v_cvt_scalef32_f32_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 F32 BF8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a BF8 float input to a single-precision float value, then scale the value using the exponent provided by the second single-precision…", "description": "Convert from a BF8 float input to a single-precision float value, then scale the value using the exponent provided by the second single-precision float input. Store the result into a vector register. The value to convert is loaded from 8 bits of the input using OPSEL[1:0] to determine which byte to read.", "syntax": "v_cvt_scalef32_f32_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_f32_fp8", "mnemonic": "v_cvt_scalef32_f32_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 F32 FP8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from an FP8 float input to a single-precision float value, then scale the value using the exponent provided by the second single-precision…", "description": "Convert from an FP8 float input to a single-precision float value, then scale the value using the exponent provided by the second single-precision float input. Store the result into a vector register. The value to convert is loaded from 8 bits of the input using OPSEL[1:0] to determine which byte to read.", "syntax": "v_cvt_scalef32_f32_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk16_bf6_bf16", "mnemonic": "v_cvt_scalef32_pk16_bf6_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK16 BF6 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk16_bf6_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk16_bf6_f16", "mnemonic": "v_cvt_scalef32_pk16_bf6_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK16 BF6 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk16_bf6_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk16_bf6_f32", "mnemonic": "v_cvt_scalef32_pk16_bf6_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK16 BF6 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk16_bf6_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk16_fp6_bf16", "mnemonic": "v_cvt_scalef32_pk16_fp6_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK16 FP6 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk16_fp6_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk16_fp6_f16", "mnemonic": "v_cvt_scalef32_pk16_fp6_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK16 FP6 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk16_fp6_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk16_fp6_f32", "mnemonic": "v_cvt_scalef32_pk16_fp6_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK16 FP6 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk16_fp6_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk32_bf16_bf6", "mnemonic": "v_cvt_scalef32_pk32_bf16_bf6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK32 BF16 BF6", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 32-component BF6 float input to a packed BF16 float value, then scale the packed values using the exponent provided by the…", "description": "Convert from a packed 32-component BF6 float input to a packed BF16 float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk32_bf16_bf6", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk32_bf16_fp6", "mnemonic": "v_cvt_scalef32_pk32_bf16_fp6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK32 BF16 FP6", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 32-component FP6 float input to a packed BF16 float value, then scale the packed values using the exponent provided by the…", "description": "Convert from a packed 32-component FP6 float input to a packed BF16 float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk32_bf16_fp6", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk32_bf6_bf16", "mnemonic": "v_cvt_scalef32_pk32_bf6_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK32 BF6 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 32-component BF16 float input using the exponent provided by the second single-precision float input, then convert the values to a…", "description": "Scale a packed 32-component BF16 float input using the exponent provided by the second single-precision float input, then convert the values to a packed 32-component BF6 float value. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk32_bf6_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk32_bf6_f16", "mnemonic": "v_cvt_scalef32_pk32_bf6_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK32 BF6 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 32-component half-precision float input using the exponent provided by the second single-precision float input, then convert the…", "description": "Scale a packed 32-component half-precision float input using the exponent provided by the second single-precision float input, then convert the values to a packed 32-component BF6 float value. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk32_bf6_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk32_bf6_f32", "mnemonic": "v_cvt_scalef32_pk32_bf6_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK32 BF6 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk32_bf6_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk32_f16_bf6", "mnemonic": "v_cvt_scalef32_pk32_f16_bf6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK32 F16 BF6", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 32-component BF6 float input to a packed half-precision float value, then scale the packed values using the exponent provided…", "description": "Convert from a packed 32-component BF6 float input to a packed half-precision float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk32_f16_bf6", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk32_f16_fp6", "mnemonic": "v_cvt_scalef32_pk32_f16_fp6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK32 F16 FP6", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 32-component FP6 float input to a packed half-precision float value, then scale the packed values using the exponent provided…", "description": "Convert from a packed 32-component FP6 float input to a packed half-precision float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk32_f16_fp6", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk32_f32_bf6", "mnemonic": "v_cvt_scalef32_pk32_f32_bf6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK32 F32 BF6", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 32-component BF6 float input to a packed single-precision float value, then scale the packed values using the exponent provided…", "description": "Convert from a packed 32-component BF6 float input to a packed single-precision float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk32_f32_bf6", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk32_f32_fp6", "mnemonic": "v_cvt_scalef32_pk32_f32_fp6", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK32 F32 FP6", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 32-component FP6 float input to a packed single-precision float value, then scale the packed values using the exponent provided…", "description": "Convert from a packed 32-component FP6 float input to a packed single-precision float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk32_f32_fp6", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk32_fp6_bf16", "mnemonic": "v_cvt_scalef32_pk32_fp6_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK32 FP6 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 32-component BF16 float input using the exponent provided by the second single-precision float input, then convert the values to a…", "description": "Scale a packed 32-component BF16 float input using the exponent provided by the second single-precision float input, then convert the values to a packed 32-component FP6 float value. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk32_fp6_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk32_fp6_f16", "mnemonic": "v_cvt_scalef32_pk32_fp6_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK32 FP6 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 32-component half-precision float input using the exponent provided by the second single-precision float input, then convert the…", "description": "Scale a packed 32-component half-precision float input using the exponent provided by the second single-precision float input, then convert the values to a packed 32-component FP6 float value. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk32_fp6_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk32_fp6_f32", "mnemonic": "v_cvt_scalef32_pk32_fp6_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK32 FP6 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk32_fp6_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk8_bf8_bf16", "mnemonic": "v_cvt_scalef32_pk8_bf8_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK8 BF8 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk8_bf8_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk8_bf8_f16", "mnemonic": "v_cvt_scalef32_pk8_bf8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK8 BF8 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk8_bf8_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk8_bf8_f32", "mnemonic": "v_cvt_scalef32_pk8_bf8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK8 BF8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk8_bf8_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk8_fp4_bf16", "mnemonic": "v_cvt_scalef32_pk8_fp4_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK8 FP4 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk8_fp4_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk8_fp4_f16", "mnemonic": "v_cvt_scalef32_pk8_fp4_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK8 FP4 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk8_fp4_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk8_fp4_f32", "mnemonic": "v_cvt_scalef32_pk8_fp4_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK8 FP4 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk8_fp4_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk8_fp8_bf16", "mnemonic": "v_cvt_scalef32_pk8_fp8_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK8 FP8 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk8_fp8_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk8_fp8_f16", "mnemonic": "v_cvt_scalef32_pk8_fp8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK8 FP8 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk8_fp8_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk8_fp8_f32", "mnemonic": "v_cvt_scalef32_pk8_fp8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK8 FP8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_pk8_fp8_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_pk_bf16_bf8", "mnemonic": "v_cvt_scalef32_pk_bf16_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK BF16 BF8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 2-component BF8 float input to a packed BF16 float value, then scale the packed values using the exponent provided by the…", "description": "Convert from a packed 2-component BF8 float input to a packed BF16 float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk_bf16_bf8", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_bf16_fp4", "mnemonic": "v_cvt_scalef32_pk_bf16_fp4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK BF16 FP4", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 2-component FP4 float input to a packed BF16 float value, then scale the packed values using the exponent provided by the…", "description": "Convert from a packed 2-component FP4 float input to a packed BF16 float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register. The value to convert is loaded from 8 bits of the input using OPSEL[1:0] to determine which byte to read.", "syntax": "v_cvt_scalef32_pk_bf16_fp4", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_bf16_fp8", "mnemonic": "v_cvt_scalef32_pk_bf16_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK BF16 FP8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 2-component FP8 float input to a packed BF16 float value, then scale the packed values using the exponent provided by the…", "description": "Convert from a packed 2-component FP8 float input to a packed BF16 float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk_bf16_fp8", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_bf8_bf16", "mnemonic": "v_cvt_scalef32_pk_bf8_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK BF8 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 2-component BF16 float input using the exponent provided by the second single-precision float input, then convert the values to a…", "description": "Scale a packed 2-component BF16 float input using the exponent provided by the second single-precision float input, then convert the values to a packed BF8 float value with round toward nearest even semantics. Store the result into 16 bits of a vector register using OPSEL.", "syntax": "v_cvt_scalef32_pk_bf8_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_bf8_f16", "mnemonic": "v_cvt_scalef32_pk_bf8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK BF8 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 2-component half-precision float input using the exponent provided by the second single-precision float input, then convert the values…", "description": "Scale a packed 2-component half-precision float input using the exponent provided by the second single-precision float input, then convert the values to a packed BF8 float value with round toward nearest even semantics. Store the result into 16 bits of a vector register using OPSEL.", "syntax": "v_cvt_scalef32_pk_bf8_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_bf8_f32", "mnemonic": "v_cvt_scalef32_pk_bf8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK BF8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale two single-precision float inputs using the exponent provided by the third single-precision float input, then convert the values to a packed…", "description": "Scale two single-precision float inputs using the exponent provided by the third single-precision float input, then convert the values to a packed BF8 float value with round toward nearest even semantics. Store the result into 16 bits of a vector register using OPSEL.", "syntax": "v_cvt_scalef32_pk_bf8_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_f16_bf8", "mnemonic": "v_cvt_scalef32_pk_f16_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK F16 BF8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 2-component BF8 float input to a packed half-precision float value, then scale the packed values using the exponent provided by…", "description": "Convert from a packed 2-component BF8 float input to a packed half-precision float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk_f16_bf8", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_f16_fp4", "mnemonic": "v_cvt_scalef32_pk_f16_fp4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK F16 FP4", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 2-component FP4 float input to a packed half-precision float value, then scale the packed values using the exponent provided by…", "description": "Convert from a packed 2-component FP4 float input to a packed half-precision float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register. The value to convert is loaded from 8 bits of the input using OPSEL[1:0] to determine which byte to read.", "syntax": "v_cvt_scalef32_pk_f16_fp4", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_f16_fp8", "mnemonic": "v_cvt_scalef32_pk_f16_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK F16 FP8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 2-component FP8 float input to a packed half-precision float value, then scale the packed values using the exponent provided by…", "description": "Convert from a packed 2-component FP8 float input to a packed half-precision float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk_f16_fp8", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_f32_bf8", "mnemonic": "v_cvt_scalef32_pk_f32_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK F32 BF8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 2-component BF8 float input to a packed single-precision float value, then scale the packed values using the exponent provided…", "description": "Convert from a packed 2-component BF8 float input to a packed single-precision float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk_f32_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_f32_fp4", "mnemonic": "v_cvt_scalef32_pk_f32_fp4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK F32 FP4", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 2-component FP4 float input to a packed single-precision float value, then scale the packed values using the exponent provided…", "description": "Convert from a packed 2-component FP4 float input to a packed single-precision float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register. The value to convert is loaded from 8 bits of the input using OPSEL[1:0] to determine which byte to read.", "syntax": "v_cvt_scalef32_pk_f32_fp4", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_f32_fp8", "mnemonic": "v_cvt_scalef32_pk_f32_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK F32 FP8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a packed 2-component FP8 float input to a packed single-precision float value, then scale the packed values using the exponent provided…", "description": "Convert from a packed 2-component FP8 float input to a packed single-precision float value, then scale the packed values using the exponent provided by the second single-precision float input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_pk_f32_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_fp4_bf16", "mnemonic": "v_cvt_scalef32_pk_fp4_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK FP4 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 2-component BF16 float input using the exponent provided by the second single-precision float input, then convert the values to a…", "description": "Scale a packed 2-component BF16 float input using the exponent provided by the second single-precision float input, then convert the values to a packed FP4 float value with round toward nearest even semantics. Store the result into 8 bits of a vector register using OPSEL[3:2] to determine which byte of the destination to overwrite.", "syntax": "v_cvt_scalef32_pk_fp4_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_fp4_f16", "mnemonic": "v_cvt_scalef32_pk_fp4_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK FP4 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 2-component half-precision float input using the exponent provided by the second single-precision float input, then convert the values…", "description": "Scale a packed 2-component half-precision float input using the exponent provided by the second single-precision float input, then convert the values to a packed FP4 float value with round toward nearest even semantics. Store the result into 8 bits of a vector register using OPSEL[3:2] to determine which byte of the destination to overwrite.", "syntax": "v_cvt_scalef32_pk_fp4_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_fp4_f32", "mnemonic": "v_cvt_scalef32_pk_fp4_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK FP4 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale two single-precision float inputs using the exponent provided by the third single-precision float input, then convert the values to a packed…", "description": "Scale two single-precision float inputs using the exponent provided by the third single-precision float input, then convert the values to a packed FP4 float value with round toward nearest even semantics. Store the result into 8 bits of a vector register using OPSEL[3:2] to determine which byte of the destination to overwrite.", "syntax": "v_cvt_scalef32_pk_fp4_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_fp8_bf16", "mnemonic": "v_cvt_scalef32_pk_fp8_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK FP8 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 2-component BF16 float input using the exponent provided by the second single-precision float input, then convert the values to a…", "description": "Scale a packed 2-component BF16 float input using the exponent provided by the second single-precision float input, then convert the values to a packed FP8 float value with round toward nearest even semantics. Store the result into 16 bits of a vector register using OPSEL.", "syntax": "v_cvt_scalef32_pk_fp8_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_fp8_f16", "mnemonic": "v_cvt_scalef32_pk_fp8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK FP8 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 2-component half-precision float input using the exponent provided by the second single-precision float input, then convert the values…", "description": "Scale a packed 2-component half-precision float input using the exponent provided by the second single-precision float input, then convert the values to a packed FP8 float value with round toward nearest even semantics. Store the result into 16 bits of a vector register using OPSEL.", "syntax": "v_cvt_scalef32_pk_fp8_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_pk_fp8_f32", "mnemonic": "v_cvt_scalef32_pk_fp8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 PK FP8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale two single-precision float inputs using the exponent provided by the third single-precision float input, then convert the values to a packed…", "description": "Scale two single-precision float inputs using the exponent provided by the third single-precision float input, then convert the values to a packed FP8 float value with round toward nearest even semantics. Store the result into 16 bits of a vector register using OPSEL.", "syntax": "v_cvt_scalef32_pk_fp8_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_bf8_bf16", "mnemonic": "v_cvt_scalef32_sr_bf8_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR BF8 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a BF16 float input using the exponent provided by the third single-precision float input, then convert the values to a BF8 float value with…", "description": "Scale a BF16 float input using the exponent provided by the third single-precision float input, then convert the values to a BF8 float value with stochastic rounding using seed data from the second input. Store the result into 8 bits of a vector register using OPSEL[3:2] to determine which byte of the destination to overwrite.", "syntax": "v_cvt_scalef32_sr_bf8_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_bf8_f16", "mnemonic": "v_cvt_scalef32_sr_bf8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR BF8 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a half-precision float input using the exponent provided by the third single-precision float input, then convert the values to a BF8 float…", "description": "Scale a half-precision float input using the exponent provided by the third single-precision float input, then convert the values to a BF8 float value with stochastic rounding using seed data from the second input. Store the result into 8 bits of a vector register using OPSEL[3:2] to determine which byte of the destination to overwrite.", "syntax": "v_cvt_scalef32_sr_bf8_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_bf8_f32", "mnemonic": "v_cvt_scalef32_sr_bf8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR BF8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a single-precision float input using the exponent provided by the third single-precision float input, then convert the values to a BF8 float…", "description": "Scale a single-precision float input using the exponent provided by the third single-precision float input, then convert the values to a BF8 float value with stochastic rounding using seed data from the second input. Store the result into 8 bits of a vector register using OPSEL[3:2] to determine which byte of the destination to overwrite.", "syntax": "v_cvt_scalef32_sr_bf8_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_fp8_bf16", "mnemonic": "v_cvt_scalef32_sr_fp8_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR FP8 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a BF16 float input using the exponent provided by the third single-precision float input, then convert the values to an FP8 float value with…", "description": "Scale a BF16 float input using the exponent provided by the third single-precision float input, then convert the values to an FP8 float value with stochastic rounding using seed data from the second input. Store the result into 8 bits of a vector register using OPSEL[3:2] to determine which byte of the destination to overwrite.", "syntax": "v_cvt_scalef32_sr_fp8_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_fp8_f16", "mnemonic": "v_cvt_scalef32_sr_fp8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR FP8 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a half-precision float input using the exponent provided by the third single-precision float input, then convert the values to an FP8 float…", "description": "Scale a half-precision float input using the exponent provided by the third single-precision float input, then convert the values to an FP8 float value with stochastic rounding using seed data from the second input. Store the result into 8 bits of a vector register using OPSEL[3:2] to determine which byte of the destination to overwrite.", "syntax": "v_cvt_scalef32_sr_fp8_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_fp8_f32", "mnemonic": "v_cvt_scalef32_sr_fp8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR FP8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a single-precision float input using the exponent provided by the third single-precision float input, then convert the values to an FP8 float…", "description": "Scale a single-precision float input using the exponent provided by the third single-precision float input, then convert the values to an FP8 float value with stochastic rounding using seed data from the second input. Store the result into 8 bits of a vector register using OPSEL[3:2] to determine which byte of the destination to overwrite.", "syntax": "v_cvt_scalef32_sr_fp8_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk16_bf6_bf16", "mnemonic": "v_cvt_scalef32_sr_pk16_bf6_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK16 BF6 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk16_bf6_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk16_bf6_f16", "mnemonic": "v_cvt_scalef32_sr_pk16_bf6_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK16 BF6 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk16_bf6_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk16_bf6_f32", "mnemonic": "v_cvt_scalef32_sr_pk16_bf6_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK16 BF6 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk16_bf6_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk16_fp6_bf16", "mnemonic": "v_cvt_scalef32_sr_pk16_fp6_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK16 FP6 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk16_fp6_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk16_fp6_f16", "mnemonic": "v_cvt_scalef32_sr_pk16_fp6_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK16 FP6 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk16_fp6_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk16_fp6_f32", "mnemonic": "v_cvt_scalef32_sr_pk16_fp6_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK16 FP6 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk16_fp6_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk32_bf6_bf16", "mnemonic": "v_cvt_scalef32_sr_pk32_bf6_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK32 BF6 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 32-component BF16 float input using the exponent provided by the third single-precision float input, then convert the values to a…", "description": "Scale a packed 32-component BF16 float input using the exponent provided by the third single-precision float input, then convert the values to a packed 32-component BF6 float value with stochastic rounding using seed data from the second input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_sr_pk32_bf6_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk32_bf6_f16", "mnemonic": "v_cvt_scalef32_sr_pk32_bf6_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK32 BF6 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 32-component half-precision float input using the exponent provided by the third single-precision float input, then convert the values…", "description": "Scale a packed 32-component half-precision float input using the exponent provided by the third single-precision float input, then convert the values to a packed 32-component BF6 float value with stochastic rounding using seed data from the second input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_sr_pk32_bf6_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk32_bf6_f32", "mnemonic": "v_cvt_scalef32_sr_pk32_bf6_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK32 BF6 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 32-component single-precision float input using the exponent provided by the third single-precision float input, then convert the…", "description": "Scale a packed 32-component single-precision float input using the exponent provided by the third single-precision float input, then convert the values to a packed 32-component BF6 float value with stochastic rounding using seed data from the second input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_sr_pk32_bf6_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk32_fp6_bf16", "mnemonic": "v_cvt_scalef32_sr_pk32_fp6_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK32 FP6 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 32-component BF16 float input using the exponent provided by the third single-precision float input, then convert the values to a…", "description": "Scale a packed 32-component BF16 float input using the exponent provided by the third single-precision float input, then convert the values to a packed 32-component FP6 float value with stochastic rounding using seed data from the second input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_sr_pk32_fp6_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk32_fp6_f16", "mnemonic": "v_cvt_scalef32_sr_pk32_fp6_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK32 FP6 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 32-component half-precision float input using the exponent provided by the third single-precision float input, then convert the values…", "description": "Scale a packed 32-component half-precision float input using the exponent provided by the third single-precision float input, then convert the values to a packed 32-component FP6 float value with stochastic rounding using seed data from the second input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_sr_pk32_fp6_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk32_fp6_f32", "mnemonic": "v_cvt_scalef32_sr_pk32_fp6_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK32 FP6 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 32-component single-precision float input using the exponent provided by the third single-precision float input, then convert the…", "description": "Scale a packed 32-component single-precision float input using the exponent provided by the third single-precision float input, then convert the values to a packed 32-component FP6 float value with stochastic rounding using seed data from the second input. Store the result into a vector register.", "syntax": "v_cvt_scalef32_sr_pk32_fp6_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk8_bf8_bf16", "mnemonic": "v_cvt_scalef32_sr_pk8_bf8_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK8 BF8 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk8_bf8_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk8_bf8_f16", "mnemonic": "v_cvt_scalef32_sr_pk8_bf8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK8 BF8 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk8_bf8_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk8_bf8_f32", "mnemonic": "v_cvt_scalef32_sr_pk8_bf8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK8 BF8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk8_bf8_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk8_fp4_bf16", "mnemonic": "v_cvt_scalef32_sr_pk8_fp4_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK8 FP4 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk8_fp4_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk8_fp4_f16", "mnemonic": "v_cvt_scalef32_sr_pk8_fp4_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK8 FP4 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk8_fp4_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk8_fp4_f32", "mnemonic": "v_cvt_scalef32_sr_pk8_fp4_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK8 FP4 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk8_fp4_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk8_fp8_bf16", "mnemonic": "v_cvt_scalef32_sr_pk8_fp8_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK8 FP8 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk8_fp8_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk8_fp8_f16", "mnemonic": "v_cvt_scalef32_sr_pk8_fp8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK8 FP8 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk8_fp8_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk8_fp8_f32", "mnemonic": "v_cvt_scalef32_sr_pk8_fp8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK8 FP8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_scalef32_sr_pk8_fp8_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk_fp4_bf16", "mnemonic": "v_cvt_scalef32_sr_pk_fp4_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK FP4 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 2-component BF16 float input using the exponent provided by the third single-precision float input, then convert the values to a…", "description": "Scale a packed 2-component BF16 float input using the exponent provided by the third single-precision float input, then convert the values to a packed FP4 float value with stochastic rounding using seed data from the second input. Store the result into 8 bits of a vector register using OPSEL[3:2] to determine which byte of the destination to overwrite.", "syntax": "v_cvt_scalef32_sr_pk_fp4_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_scalef32_sr_pk_fp4_f16", "mnemonic": "v_cvt_scalef32_sr_pk_fp4_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SCALEF32 SR PK FP4 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Scale a packed 2-component half-precision float input using the exponent provided by the third single-precision float input, then convert the values…", "description": "Scale a packed 2-component half-precision float input using the exponent provided by the third single-precision float input, then convert the values to a packed FP4 float value with stochastic rounding using seed data from the second input. Store the result into 8 bits of a vector register using OPSEL[3:2] to determine which byte of the destination to overwrite.", "syntax": "v_cvt_scalef32_sr_pk_fp4_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_sr_bf16_f32", "mnemonic": "v_cvt_sr_bf16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SR BF16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a single-precision float input to a BF16 value with stochastic rounding using seed data from the second input.", "description": "Convert from a single-precision float input to a BF16 value with stochastic rounding using seed data from the second input. Store the result into 16 bits of a vector register using OPSEL to determine which word of the destination to overwrite.", "syntax": "v_cvt_sr_bf16_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_sr_bf8_f16", "mnemonic": "v_cvt_sr_bf8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SR BF8 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_sr_bf8_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_sr_bf8_f32", "mnemonic": "v_cvt_sr_bf8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SR BF8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a single-precision float input to a BF8 value with stochastic rounding using seed data from the second input.", "description": "Convert from a single-precision float input to a BF8 value with stochastic rounding using seed data from the second input. Store the result into 8 bits of a vector register using OPSEL to determine which byte of the destination to overwrite.", "syntax": "v_cvt_sr_bf8_f32", "operands": [], "dataTypes": ["f32"], "semantics": "prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\ns = sign(S0.f32);\ne = exponent(S0.f32);\nm = 23'U(32'U(23'B(mantissa(S0.f32))) + S1[31 : 11].u32);\ntmp = float32(s, e, m);\n// Add stochastic value to mantissa, wrap around on overflow\nif OPSEL[3 : 2].u2 == 2'0U then\nVGPR[laneId][VDST.u32][7 : 0].bf8 = f32_to_bf8(tmp.f32)\nelsif OPSEL[3 : 2].u2 == 2'1U then\nVGPR[laneId][VDST.u32][15 : 8].bf8 = f32_to_bf8(tmp.f32)\nelsif OPSEL[3 : 2].u2 == 2'2U then\nVGPR[laneId][VDST.u32][23 : 16].bf8 = f32_to_bf8(tmp.f32)\nelse\nVGPR[laneId][VDST.u32][31 : 24].bf8 = f32_to_bf8(tmp.f32)\nendif;\n// Unwritten bytes of D are preserved.\nROUND_MODE = prev_mode", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Stochastic rounding. Ignores OMOD and clamp.", "sourcePdfPage": 371, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cvt_sr_bf8_f32_gfx12", "mnemonic": "v_cvt_sr_bf8_f32_gfx12", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SR BF8 F32 GFX12", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_sr_bf8_f32_gfx12", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_sr_f16_f32", "mnemonic": "v_cvt_sr_f16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SR F16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a single-precision float input to a half-precision value with stochastic rounding using seed data from the second input.", "description": "Convert from a single-precision float input to a half-precision value with stochastic rounding using seed data from the second input. Store the result into 16 bits of a vector register using OPSEL to determine which word of the destination to overwrite.", "syntax": "v_cvt_sr_f16_f32", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_cvt_sr_fp8_f16", "mnemonic": "v_cvt_sr_fp8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SR FP8 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_sr_fp8_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_sr_fp8_f32", "mnemonic": "v_cvt_sr_fp8_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SR FP8 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a single-precision float input to an FP8 value with stochastic rounding using seed data from the second input.", "description": "Convert from a single-precision float input to an FP8 value with stochastic rounding using seed data from the second input. Store the result into 8 bits of a vector register using OPSEL to determine which byte of the destination to overwrite.", "syntax": "v_cvt_sr_fp8_f32", "operands": [], "dataTypes": ["f32"], "semantics": "prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\ns = sign(S0.f32);\ne = exponent(S0.f32);\nm = 23'U(32'U(23'B(mantissa(S0.f32))) + S1[31 : 12].u32);\ntmp = float32(s, e, m);\n// Add stochastic value to mantissa, wrap around on overflow\nif OPSEL[3 : 2].u2 == 2'0U then\nVGPR[laneId][VDST.u32][7 : 0].fp8 = f32_to_fp8(tmp.f32)\nelsif OPSEL[3 : 2].u2 == 2'1U then\nVGPR[laneId][VDST.u32][15 : 8].fp8 = f32_to_fp8(tmp.f32)\nelsif OPSEL[3 : 2].u2 == 2'2U then\nVGPR[laneId][VDST.u32][23 : 16].fp8 = f32_to_fp8(tmp.f32)\nelse\nVGPR[laneId][VDST.u32][31 : 24].fp8 = f32_to_fp8(tmp.f32)\nendif;\n// Unwritten bytes of D are preserved.\nROUND_MODE = prev_mode", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Stochastic rounding. Ignores OMOD and clamp.", "sourcePdfPage": 370, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_cvt_sr_fp8_f32_gfx12", "mnemonic": "v_cvt_sr_fp8_f32_gfx12", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SR FP8 F32 GFX12", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_sr_fp8_f32_gfx12", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_sr_fp8_f32_gfx1250", "mnemonic": "v_cvt_sr_fp8_f32_gfx1250", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SR FP8 F32 GFX1250", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_sr_fp8_f32_gfx1250", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_sr_pk_bf16_f32", "mnemonic": "v_cvt_sr_pk_bf16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SR PK BF16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_sr_pk_bf16_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_sr_pk_f16_f32", "mnemonic": "v_cvt_sr_pk_f16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT SR PK F16 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16/f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_cvt_sr_pk_f16_f32", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_cvt_u16_f16", "mnemonic": "v_cvt_u16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT U16 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a half-precision float input to an unsigned 16-bit integer value and store the result into a vector register.", "description": "Convert from a half-precision float input to an unsigned 16-bit integer value and store the result into a vector register.", "syntax": "v_cvt_u16_f16", "operands": [], "dataTypes": ["f16", "u16"], "semantics": "D0.u16 = f16_to_u16(S0.f16)", "example": "v_cvt_u16_f16 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy, supports rounding, exception flags and saturation. FP16 denormals are accepted. Conversion is done with truncation. Generation of the INEXACT exception is controlled by the CLAMP bit. INEXACT exceptions are enabled for this conversion iff CLAMP == 1.", "sourcePdfPage": 204, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_u32_f32", "mnemonic": "v_cvt_u32_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT U32 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a single-precision float input to an unsigned 32-bit integer value and store the result into a vector register.", "description": "Convert from a single-precision float input to an unsigned 32-bit integer value and store the result into a vector register.", "syntax": "v_cvt_u32_f32", "operands": [], "dataTypes": ["f32", "u32"], "semantics": "D0.u32 = f32_to_u32(S0.f32)", "example": "v_cvt_u32_f32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy, out-of-range floating point values (including infinity) saturate. NAN is converted to 0. Generation of the INEXACT exception is controlled by the CLAMP bit. INEXACT exceptions are enabled for this conversion iff CLAMP == 1.", "sourcePdfPage": 188, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_u32_f64", "mnemonic": "v_cvt_u32_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT U32 F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from a double-precision float input to an unsigned 32-bit integer value and store the result into a vector register.", "description": "Convert from a double-precision float input to an unsigned 32-bit integer value and store the result into a vector register.", "syntax": "v_cvt_u32_f64", "operands": [], "dataTypes": ["f64", "u32"], "semantics": "D0.u32 = f64_to_u32(S0.f64)", "example": "v_cvt_u32_f64 v5, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, out-of-range floating point values (including infinity) saturate. NAN is converted to 0. Generation of the INEXACT exception is controlled by the CLAMP bit. INEXACT exceptions are enabled for this conversion iff CLAMP == 1.", "sourcePdfPage": 192, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_cvt_u32_u16", "mnemonic": "v_cvt_u32_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V CVT U32 U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Convert from an unsigned 16-bit integer input to an unsigned 32-bit integer value using zero extension and store the result into a vector register.", "description": "Convert from an unsigned 16-bit integer input to an unsigned 32-bit integer value using zero extension and store the result into a vector register.", "syntax": "v_cvt_u32_u16", "operands": [], "dataTypes": ["u16", "u32"], "semantics": "", "example": "v_cvt_u32_u16 v5, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_div_fixup_f16", "mnemonic": "v_div_fixup_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DIV FIXUP F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a half-precision float quotient in the first input, a denominator in the second input and a numerator in the third input, detect and apply…", "description": "Given a half-precision float quotient in the first input, a denominator in the second input and a numerator in the third input, detect and apply corner cases related to division, including divide by zero, NaN inputs and overflow, and modify the quotient accordingly. Generate any invalid, denormal and divide-by-zero exceptions that are a result of the division. Store the modified quotient into a vector register. This operation handles corner cases in a division macro such as divide by zero and NaN inputs. This operation is well defined when the quotient is approximately equal to the numerator divided by the denominator. Other inputs produce a predictable result but may not be mathematically useful.", "syntax": "v_div_fixup_f16", "operands": [], "dataTypes": ["f16"], "semantics": "sign_out = (sign(S1.f16) ^ sign(S2.f16));\nif isNAN(64'F(S2.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S2.f16)))\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif ((64'F(S1.f16) == 0.0) && (64'F(S2.f16) == 0.0)) then\n// 0/0\nD0.f16 = 16'F(0xfe00)\nelsif ((64'F(abs(S1.f16)) == +INF) && (64'F(abs(S2.f16)) == +INF)) then\n// inf/inf\nD0.f16 = 16'F(0xfe00)\nelsif ((64'F(S1.f16) == 0.0) || (64'F(abs(S2.f16)) == +INF)) then\n// x/0, or inf/y\nD0.f16 = sign_out ? -INF.f16 : +INF.f16\nelsif ((64'F(abs(S1.f16)) == +INF) || (64'F(S2.f16) == 0.0)) then\n// x/inf, 0/y\nD0.f16 = sign_out ? -16'0.0 : 16'0.0\nelse\nD0.f16 = sign_out ? -abs(S0.f16) : abs(S0.f16)\nendif", "example": "v_div_fixup_f16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This operation is the final step of a high precision division macro and handles all exceptional cases of division. If OPSEL[3] is 0 Result is written to 16 LSBs of destination VGPR and hi 16 bits are preserved. If OPSEL[3] is 1 Result is written to 16 MSBs of destination VGPR and lo 16 bits are preserved.", "sourcePdfPage": 358, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_div_fixup_f16_gfx9", "mnemonic": "v_div_fixup_f16_gfx9", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DIV FIXUP F16 GFX9", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_div_fixup_f16_gfx9", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_div_fixup_f32", "mnemonic": "v_div_fixup_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DIV FIXUP F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a single-precision float quotient in the first input, a denominator in the second input and a numerator in the third input, detect and apply…", "description": "Given a single-precision float quotient in the first input, a denominator in the second input and a numerator in the third input, detect and apply corner cases related to division, including divide by zero, NaN inputs and overflow, and modify the quotient accordingly. Generate any invalid, denormal and divide-by-zero exceptions that are a result of the division. Store the modified quotient into a vector register. This operation handles corner cases in a division macro such as divide by zero and NaN inputs. This operation is well defined when the quotient is approximately equal to the numerator divided by the denominator. Other inputs produce a predictable result but may not be mathematically useful.", "syntax": "v_div_fixup_f32", "operands": [], "dataTypes": ["f32"], "semantics": "sign_out = (sign(S1.f32) ^ sign(S2.f32));\nif isNAN(64'F(S2.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S2.f32)))\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif ((64'F(S1.f32) == 0.0) && (64'F(S2.f32) == 0.0)) then\n// 0/0\nD0.f32 = 32'F(0xffc00000)\nelsif ((64'F(abs(S1.f32)) == +INF) && (64'F(abs(S2.f32)) == +INF)) then\n// inf/inf\nD0.f32 = 32'F(0xffc00000)\nelsif ((64'F(S1.f32) == 0.0) || (64'F(abs(S2.f32)) == +INF)) then\n// x/0, or inf/y\nD0.f32 = sign_out ? -INF.f32 : +INF.f32\nelsif ((64'F(abs(S1.f32)) == +INF) || (64'F(S2.f32) == 0.0)) then\n// x/inf, 0/y\nD0.f32 = sign_out ? -0.0F : 0.0F\nelsif exponent(S2.f32) - exponent(S1.f32) < -150 then\nD0.f32 = sign_out ? -UNDERFLOW_F32 : UNDERFLOW_F32\nelsif exponent(S1.f32) == 255 then\nD0.f32 = sign_out ? -OVERFLOW_F32 : OVERFLOW_F32\nelse\nD0.f32 = sign_out ? -abs(S0.f32) : abs(S0.f32)\nendif", "example": "v_div_fixup_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This operation is the final step of a high precision division macro and handles all exceptional cases of division.", "sourcePdfPage": 343, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_div_fixup_f64", "mnemonic": "v_div_fixup_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DIV FIXUP F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a double-precision float quotient in the first input, a denominator in the second input and a numerator in the third input, detect and apply…", "description": "Given a double-precision float quotient in the first input, a denominator in the second input and a numerator in the third input, detect and apply corner cases related to division, including divide by zero, NaN inputs and overflow, and modify the quotient accordingly. Generate any invalid, denormal and divide-by-zero exceptions that are a result of the division. Store the modified quotient into a vector register. This operation handles corner cases in a division macro such as divide by zero and NaN inputs. This operation is well defined when the quotient is approximately equal to the numerator divided by the denominator. Other inputs produce a predictable result but may not be mathematically useful.", "syntax": "v_div_fixup_f64", "operands": [], "dataTypes": ["f64"], "semantics": "sign_out = (sign(S1.f64) ^ sign(S2.f64));\nif isNAN(S2.f64) then\nD0.f64 = cvtToQuietNAN(S2.f64)\nelsif isNAN(S1.f64) then\nD0.f64 = cvtToQuietNAN(S1.f64)\nelsif ((S1.f64 == 0.0) && (S2.f64 == 0.0)) then\n// 0/0\nD0.f64 = 64'F(0xfff8000000000000LL)\nelsif ((abs(S1.f64) == +INF) && (abs(S2.f64) == +INF)) then\n// inf/inf\nD0.f64 = 64'F(0xfff8000000000000LL)\nelsif ((S1.f64 == 0.0) || (abs(S2.f64) == +INF)) then\n// x/0, or inf/y\nD0.f64 = sign_out ? -INF : +INF\nelsif ((abs(S1.f64) == +INF) || (S2.f64 == 0.0)) then\n// x/inf, 0/y\nD0.f64 = sign_out ? -0.0 : 0.0\nelsif exponent(S2.f64) - exponent(S1.f64) < -1075 then\nD0.f64 = sign_out ? -UNDERFLOW_F64 : UNDERFLOW_F64\nelsif exponent(S1.f64) == 2047 then\nD0.f64 = sign_out ? -OVERFLOW_F64 : OVERFLOW_F64\nelse\nD0.f64 = sign_out ? -abs(S0.f64) : abs(S0.f64)\nendif", "example": "v_div_fixup_f64 v[5:6], v[1:2], v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This operation is the final step of a high precision division macro and handles all exceptional cases of division.", "sourcePdfPage": 344, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_div_fixup_legacy_f16", "mnemonic": "v_div_fixup_legacy_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DIV FIXUP LEGACY F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Half precision division fixup. Has non-standard rule for OPSEL.", "description": "Half precision division fixup. Has non-standard rule for OPSEL.", "syntax": "v_div_fixup_legacy_f16", "operands": [], "dataTypes": ["f16"], "semantics": "S0 = Quotient, S1 = Denominator, S2 = Numerator.\nGiven a numerator, denominator, and quotient from a divide, this opcode detects and applies specific case\nnumerics, touching up the quotient if necessary. This opcode also generates invalid, denorm and divide by\nzero exceptions caused by the division.\nsign_out = (sign(S1.f16) ^ sign(S2.f16));\nif isNAN(64'F(S2.f16)) then\ntmp = cvtToQuietNAN(64'F(S2.f16))\nelsif isNAN(64'F(S1.f16)) then\ntmp = cvtToQuietNAN(64'F(S1.f16))\nelsif ((64'F(S1.f16) == 0.0) && (64'F(S2.f16) == 0.0)) then\n// 0/0\ntmp = 16'F(0xfe00)\nelsif ((64'F(abs(S1.f16)) == +INF) && (64'F(abs(S2.f16)) == +INF)) then\n// inf/inf\ntmp = 16'F(0xfe00)\nelsif ((64'F(S1.f16) == 0.0) || (64'F(abs(S2.f16)) == +INF)) then\n// x/0, or inf/y\ntmp = sign_out ? -INF : +INF\nelsif ((64'F(abs(S1.f16)) == +INF) || (64'F(S2.f16) == 0.0)) then\n// x/inf, 0/y\ntmp = sign_out ? -0.0 : 0.0\nelse\ntmp = sign_out ? -abs(S0.f16) : abs(S0.f16)\nendif;\nif OPSEL.u4[3] then\nD0 = { tmp.f16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.f16 }\nendif", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 352, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_div_fmas_f32", "mnemonic": "v_div_fmas_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DIV FMAS F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two single-precision float inputs and add a third input using fused multiply add, then scale the exponent of the result by a fixed factor if…", "description": "Multiply two single-precision float inputs and add a third input using fused multiply add, then scale the exponent of the result by a fixed factor if the vector condition code is set. Store the result into a vector register. This operation is designed for use in floating point division macros and relies on V_DIV_SCALE_F32 to set the vector condition code iff the quotient requires post-scaling.", "syntax": "v_div_fmas_f32", "operands": [], "dataTypes": ["f32"], "semantics": "if VCC.u64[laneId] then\nD0.f32 = 2.0F ** 32 * fma(S0.f32, S1.f32, S2.f32)\nelse\nD0.f32 = fma(S0.f32, S1.f32, S2.f32)\nendif", "example": "v_div_fmas_f32 v5, s105, s105, s105", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Input denormals are not flushed but output flushing is allowed. V_DIV_SCALE_F32, V_DIV_FMAS_F32 and V_DIV_FIXUP_F32 are all designed for use in a high precision division macro that utilizes V_RCP_F32 and V_MUL_F32 to compute the approximate result and then applies two steps of the Newton-Raphson method to converge to the quotient. If subnormal terms appear during this calculation then a loss of precision occurs. This loss of precision can be avoided by scaling the inputs and then post-scaling the quotient after Newton-Raphson is applied.", "sourcePdfPage": 347, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_div_fmas_f64", "mnemonic": "v_div_fmas_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DIV FMAS F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two double-precision float inputs and add a third input using fused multiply add, then scale the exponent of the result by a fixed factor if…", "description": "Multiply two double-precision float inputs and add a third input using fused multiply add, then scale the exponent of the result by a fixed factor if the vector condition code is set. Store the result into a vector register. This operation is designed for use in floating point division macros and relies on V_DIV_SCALE_F64 to set the vector condition code iff the quotient requires post-scaling.", "syntax": "v_div_fmas_f64", "operands": [], "dataTypes": ["f64"], "semantics": "if VCC.u64[laneId] then\nD0.f64 = 2.0 ** 64 * fma(S0.f64, S1.f64, S2.f64)\nelse\nD0.f64 = fma(S0.f64, S1.f64, S2.f64)\nendif", "example": "v_div_fmas_f64 v[5:6], -1, -exec, |exec|", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Input denormals are not flushed but output flushing is allowed. V_DIV_SCALE_F64, V_DIV_FMAS_F64 and V_DIV_FIXUP_F64 are all designed for use in a high precision division macro that utilizes V_RCP_F64 and V_MUL_F64 to compute the approximate result and then applies two steps of the Newton-Raphson method to converge to the quotient. If subnormal terms appear during this calculation then a loss of precision occurs. This loss of precision can be avoided by scaling the inputs and then post-scaling the quotient after Newton-Raphson is applied.", "sourcePdfPage": 347, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_div_scale_f32", "mnemonic": "v_div_scale_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DIV SCALE F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a single-precision float value to scale in the first input, a denominator in the second input and a numerator in the third input, scale the…", "description": "Given a single-precision float value to scale in the first input, a denominator in the second input and a numerator in the third input, scale the first input for division if required to avoid subnormal terms appearing during application of the Newton-Raphson correction method. Store the scaled result into a vector register and set the vector condition code iff post-scaling is required. This operation is designed for use in a high precision division macro. The first input should be the same value as either the second or third input; other scale values produce predictable results but may not be mathematically useful. The vector condition code is used by V_DIV_FMAS_F32 to determine if the quotient requires post-scaling.", "syntax": "v_div_scale_f32", "operands": [], "dataTypes": ["f32"], "semantics": "VCC = 0x0LL;\nif ((64'F(S2.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\nD0.f32 = NAN.f32\nelsif exponent(S2.f32) - exponent(S1.f32) >= 96 then\n// N/D near MAX_FLOAT_F32\nVCC = 0x1LL;\nif S0.f32 == S1.f32 then\n// Only scale the denominator\nD0.f32 = ldexp(S0.f32, 64)\nendif\nelsif S1.f32 == DENORM.f32 then\nD0.f32 = ldexp(S0.f32, 64)\nelsif ((1.0 / 64'F(S1.f32) == DENORM.f64) && (S2.f32 / S1.f32 == DENORM.f32)) then\nVCC = 0x1LL;\nif S0.f32 == S1.f32 then\n// Only scale the denominator\nD0.f32 = ldexp(S0.f32, 64)\nendif\nelsif 1.0 / 64'F(S1.f32) == DENORM.f64 then\nD0.f32 = ldexp(S0.f32, -64)\nelsif S2.f32 / S1.f32 == DENORM.f32 then\nVCC = 0x1LL;\nif S0.f32 == S2.f32 then\n// Only scale the numerator\nD0.f32 = ldexp(S0.f32, 64)\nendif\nelsif exponent(S2.f32) <= 23 then\n// Numerator is tiny\nD0.f32 = ldexp(S0.f32, 64)\nendif", "example": "v_div_scale_f32 v5, vcc, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "V_DIV_SCALE_F32, V_DIV_FMAS_F32 and V_DIV_FIXUP_F32 are all designed for use in a high precision division macro that utilizes V_RCP_F32 and V_MUL_F32 to compute the approximate result and then applies two steps of the Newton-Raphson method to converge to the quotient. If subnormal terms appear during this calculation then a loss of precision occurs. This loss of precision can be avoided by scaling the inputs and then post-scaling the quotient after Newton-Raphson is applied.", "sourcePdfPage": 345, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_div_scale_f64", "mnemonic": "v_div_scale_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DIV SCALE F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a double-precision float value to scale in the first input, a denominator in the second input and a numerator in the third input, scale the…", "description": "Given a double-precision float value to scale in the first input, a denominator in the second input and a numerator in the third input, scale the first input for division if required to avoid subnormal terms appearing during application of the Newton-Raphson correction method. Store the scaled result into a vector register and set the vector condition code iff post-scaling is required. This operation is designed for use in a high precision division macro. The first input should be the same value as either the second or third input; other scale values produce predictable results but may not be mathematically useful. The vector condition code is used by V_DIV_FMAS_F64 to determine if the quotient requires post-scaling.", "syntax": "v_div_scale_f64", "operands": [], "dataTypes": ["f64"], "semantics": "VCC = 0x0LL;\nif ((S2.f64 == 0.0) || (S1.f64 == 0.0)) then\nD0.f64 = NAN.f64\nelsif exponent(S2.f64) - exponent(S1.f64) >= 768 then\n// N/D near MAX_FLOAT_F64\nVCC = 0x1LL;\nif S0.f64 == S1.f64 then\n// Only scale the denominator\nD0.f64 = ldexp(S0.f64, 128)\nendif\nelsif S1.f64 == DENORM.f64 then\nD0.f64 = ldexp(S0.f64, 128)\nelsif ((1.0 / S1.f64 == DENORM.f64) && (S2.f64 / S1.f64 == DENORM.f64)) then\nVCC = 0x1LL;\nif S0.f64 == S1.f64 then\n// Only scale the denominator\nD0.f64 = ldexp(S0.f64, 128)\nendif\nelsif 1.0 / S1.f64 == DENORM.f64 then\nD0.f64 = ldexp(S0.f64, -128)\nelsif S2.f64 / S1.f64 == DENORM.f64 then\nVCC = 0x1LL;\nif S0.f64 == S2.f64 then\n// Only scale the numerator\nD0.f64 = ldexp(S0.f64, 128)\nendif\nelsif exponent(S2.f64) <= 53 then\n// Numerator is tiny\nD0.f64 = ldexp(S0.f64, 128)\nendif", "example": "v_div_scale_f64 v[5:6], vcc, v[1:2], v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "V_DIV_SCALE_F64, V_DIV_FMAS_F64 and V_DIV_FIXUP_F64 are all designed for use in a high precision division macro that utilizes V_RCP_F64 and V_MUL_F64 to compute the approximate result and then applies two steps of the Newton-Raphson method to converge to the quotient. If subnormal terms appear during this calculation then a loss of precision occurs. This loss of precision can be avoided by scaling the inputs and then post-scaling the quotient after Newton-Raphson is applied.", "sourcePdfPage": 346, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_dot2_bf16_bf16", "mnemonic": "v_dot2_bf16_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT2 BF16 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 2-D BF16 float inputs, add the third input and store the result into a vector register.", "description": "Compute the dot product of two packed 2-D BF16 float inputs, add the third input and store the result into a vector register.", "syntax": "v_dot2_bf16_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": "v_dot2_bf16_bf16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_dot2_f16_f16", "mnemonic": "v_dot2_f16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT2 F16 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 2-D half-precision float inputs, add the third input and store the result into a vector register.", "description": "Compute the dot product of two packed 2-D half-precision float inputs, add the third input and store the result into a vector register.", "syntax": "v_dot2_f16_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": "v_dot2_f16_f16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_dot2_i32_i16", "mnemonic": "v_dot2_i32_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT2 I32 I16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 2-D signed 16-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer value from…", "description": "Compute the dot product of two packed 2-D signed 16-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_dot2_i32_i16", "operands": [], "dataTypes": ["i16", "i32"], "semantics": "tmp = S2.i32;\ntmp += i16_to_i32(S0[15 : 0].i16) * i16_to_i32(S1[15 : 0].i16);\ntmp += i16_to_i32(S0[31 : 16].i16) * i16_to_i32(S1[31 : 16].i16);\nD0.i32 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 269, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_dot2_u32_u16", "mnemonic": "v_dot2_u32_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT2 U32 U16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 2-D unsigned 16-bit integer inputs in the unsigned 32-bit integer domain, add an unsigned 32-bit integer value…", "description": "Compute the dot product of two packed 2-D unsigned 16-bit integer inputs in the unsigned 32-bit integer domain, add an unsigned 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_dot2_u32_u16", "operands": [], "dataTypes": ["u16", "u32"], "semantics": "tmp = S2.u32;\ntmp += u16_to_u32(S0[15 : 0].u16) * u16_to_u32(S1[15 : 0].u16);\ntmp += u16_to_u32(S0[31 : 16].u16) * u16_to_u32(S1[31 : 16].u16);\nD0.u32 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 269, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_dot2c_f32_bf16", "mnemonic": "v_dot2c_f32_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT2C F32 BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 2-D BF16 float inputs in the single-precision float domain and accumulate with the single-precision float value…", "description": "Compute the dot product of two packed 2-D BF16 float inputs in the single-precision float domain and accumulate with the single-precision float value in the destination register.", "syntax": "v_dot2c_f32_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_dot2c_f32_f16", "mnemonic": "v_dot2c_f32_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT2C F32 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 2-D half-precision float inputs in the single-precision float domain and accumulate with the single-precision…", "description": "Compute the dot product of two packed 2-D half-precision float inputs in the single-precision float domain and accumulate with the single-precision float value in the destination register.", "syntax": "v_dot2c_f32_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "tmp = D0.f32;\ntmp += f16_to_f32(S0[15 : 0].f16) * f16_to_f32(S1[15 : 0].f16);\ntmp += f16_to_f32(S0[31 : 16].f16) * f16_to_f32(S1[31 : 16].f16);\nD0.f32 = tmp", "example": "v_dot2c_f32_f16 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 184, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_dot2c_i32_i16", "mnemonic": "v_dot2c_i32_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT2C I32 I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 2-D signed 16-bit integer inputs in the signed 32-bit integer domain and accumulate with the signed 32-bit…", "description": "Compute the dot product of two packed 2-D signed 16-bit integer inputs in the signed 32-bit integer domain and accumulate with the signed 32-bit integer value in the destination register.", "syntax": "v_dot2c_i32_i16", "operands": [], "dataTypes": ["i16", "i32"], "semantics": "tmp = D0.i32;\ntmp += i16_to_i32(S0[15 : 0].i16) * i16_to_i32(S1[15 : 0].i16);\ntmp += i16_to_i32(S0[31 : 16].i16) * i16_to_i32(S1[31 : 16].i16);\nD0.i32 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 184, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_dot4_f32_bf8_bf8", "mnemonic": "v_dot4_f32_bf8_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT4 F32 BF8 BF8", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 4-D BF8 float inputs in the single-precision float domain, add a single-precision float value from the third…", "description": "Compute the dot product of two packed 4-D BF8 float inputs in the single-precision float domain, add a single-precision float value from the third input and store the result into a vector register.", "syntax": "v_dot4_f32_bf8_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_dot4_f32_bf8_fp8", "mnemonic": "v_dot4_f32_bf8_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT4 F32 BF8 FP8", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of a packed 4-D BF8 float input and a packed 4-D FP8 float input in the single-precision float domain, add a single-precision…", "description": "Compute the dot product of a packed 4-D BF8 float input and a packed 4-D FP8 float input in the single-precision float domain, add a single-precision float value from the third input and store the result into a vector register.", "syntax": "v_dot4_f32_bf8_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_dot4_f32_fp8_bf8", "mnemonic": "v_dot4_f32_fp8_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT4 F32 FP8 BF8", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of a packed 4-D FP8 float input and a packed 4-D BF8 float input in the single-precision float domain, add a single-precision…", "description": "Compute the dot product of a packed 4-D FP8 float input and a packed 4-D BF8 float input in the single-precision float domain, add a single-precision float value from the third input and store the result into a vector register.", "syntax": "v_dot4_f32_fp8_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_dot4_f32_fp8_fp8", "mnemonic": "v_dot4_f32_fp8_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT4 F32 FP8 FP8", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 4-D FP8 float inputs in the single-precision float domain, add a single-precision float value from the third…", "description": "Compute the dot product of two packed 4-D FP8 float inputs in the single-precision float domain, add a single-precision float value from the third input and store the result into a vector register.", "syntax": "v_dot4_f32_fp8_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_dot4_i32_i8", "mnemonic": "v_dot4_i32_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT4 I32 I8", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 4-D signed 8-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer value from the…", "description": "Compute the dot product of two packed 4-D signed 8-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_dot4_i32_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "tmp = S2.i32;\ntmp += i8_to_i32(S0[7 : 0].i8) * i8_to_i32(S1[7 : 0].i8);\ntmp += i8_to_i32(S0[15 : 8].i8) * i8_to_i32(S1[15 : 8].i8);\ntmp += i8_to_i32(S0[23 : 16].i8) * i8_to_i32(S1[23 : 16].i8);\ntmp += i8_to_i32(S0[31 : 24].i8) * i8_to_i32(S1[31 : 24].i8);\nD0.i32 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 269, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_dot4_i32_iu8", "mnemonic": "v_dot4_i32_iu8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT4 I32 IU8", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 4-D signed or unsigned 8-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer…", "description": "Compute the dot product of two packed 4-D signed or unsigned 8-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_dot4_i32_iu8", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": "v_dot4_i32_iu8 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_dot4_u32_u8", "mnemonic": "v_dot4_u32_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT4 U32 U8", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 4-D unsigned 8-bit integer inputs in the unsigned 32-bit integer domain, add an unsigned 32-bit integer value…", "description": "Compute the dot product of two packed 4-D unsigned 8-bit integer inputs in the unsigned 32-bit integer domain, add an unsigned 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_dot4_u32_u8", "operands": [], "dataTypes": ["u32", "u8"], "semantics": "tmp = S2.u32;\ntmp += u8_to_u32(S0[7 : 0].u8) * u8_to_u32(S1[7 : 0].u8);\ntmp += u8_to_u32(S0[15 : 8].u8) * u8_to_u32(S1[15 : 8].u8);\ntmp += u8_to_u32(S0[23 : 16].u8) * u8_to_u32(S1[23 : 16].u8);\ntmp += u8_to_u32(S0[31 : 24].u8) * u8_to_u32(S1[31 : 24].u8);\nD0.u32 = tmp", "example": "v_dot4_u32_u8 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 269, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_dot4c_i32_i8", "mnemonic": "v_dot4c_i32_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT4C I32 I8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 4-D signed 8-bit integer inputs in the signed 32-bit integer domain and accumulate with the signed 32-bit…", "description": "Compute the dot product of two packed 4-D signed 8-bit integer inputs in the signed 32-bit integer domain and accumulate with the signed 32-bit integer value in the destination register.", "syntax": "v_dot4c_i32_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "tmp = D0.i32;\ntmp += i8_to_i32(S0[7 : 0].i8) * i8_to_i32(S1[7 : 0].i8);\ntmp += i8_to_i32(S0[15 : 8].i8) * i8_to_i32(S1[15 : 8].i8);\ntmp += i8_to_i32(S0[23 : 16].i8) * i8_to_i32(S1[23 : 16].i8);\ntmp += i8_to_i32(S0[31 : 24].i8) * i8_to_i32(S1[31 : 24].i8);\nD0.i32 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 184, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_dot8_i32_i4", "mnemonic": "v_dot8_i32_i4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT8 I32 I4", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 8-D signed 4-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer value from the…", "description": "Compute the dot product of two packed 8-D signed 4-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_dot8_i32_i4", "operands": [], "dataTypes": ["i32"], "semantics": "tmp = S2.i32;\ntmp += i4_to_i32(S0[3 : 0].i4) * i4_to_i32(S1[3 : 0].i4);\ntmp += i4_to_i32(S0[7 : 4].i4) * i4_to_i32(S1[7 : 4].i4);\ntmp += i4_to_i32(S0[11 : 8].i4) * i4_to_i32(S1[11 : 8].i4);\ntmp += i4_to_i32(S0[15 : 12].i4) * i4_to_i32(S1[15 : 12].i4);\ntmp += i4_to_i32(S0[19 : 16].i4) * i4_to_i32(S1[19 : 16].i4);\ntmp += i4_to_i32(S0[23 : 20].i4) * i4_to_i32(S1[23 : 20].i4);\ntmp += i4_to_i32(S0[27 : 24].i4) * i4_to_i32(S1[27 : 24].i4);\ntmp += i4_to_i32(S0[31 : 28].i4) * i4_to_i32(S1[31 : 28].i4);\nD0.i32 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 270, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_dot8_i32_iu4", "mnemonic": "v_dot8_i32_iu4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT8 I32 IU4", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 8-D signed or unsigned 4-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer…", "description": "Compute the dot product of two packed 8-D signed or unsigned 4-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_dot8_i32_iu4", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": "v_dot8_i32_iu4 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_dot8_u32_u4", "mnemonic": "v_dot8_u32_u4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT8 U32 U4", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 8-D unsigned 4-bit integer inputs in the unsigned 32-bit integer domain, add an unsigned 32-bit integer value…", "description": "Compute the dot product of two packed 8-D unsigned 4-bit integer inputs in the unsigned 32-bit integer domain, add an unsigned 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_dot8_u32_u4", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = S2.u32;\ntmp += u4_to_u32(S0[3 : 0].u4) * u4_to_u32(S1[3 : 0].u4);\ntmp += u4_to_u32(S0[7 : 4].u4) * u4_to_u32(S1[7 : 4].u4);\ntmp += u4_to_u32(S0[11 : 8].u4) * u4_to_u32(S1[11 : 8].u4);\ntmp += u4_to_u32(S0[15 : 12].u4) * u4_to_u32(S1[15 : 12].u4);\ntmp += u4_to_u32(S0[19 : 16].u4) * u4_to_u32(S1[19 : 16].u4);\ntmp += u4_to_u32(S0[23 : 20].u4) * u4_to_u32(S1[23 : 20].u4);\ntmp += u4_to_u32(S0[27 : 24].u4) * u4_to_u32(S1[27 : 24].u4);\ntmp += u4_to_u32(S0[31 : 28].u4) * u4_to_u32(S1[31 : 28].u4);\nD0.u32 = tmp", "example": "v_dot8_u32_u4 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 270, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_dot8c_i32_i4", "mnemonic": "v_dot8c_i32_i4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V DOT8C I32 I4", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the dot product of two packed 8-D signed 4-bit integer inputs in the signed 32-bit integer domain and accumulate with the signed 32-bit…", "description": "Compute the dot product of two packed 8-D signed 4-bit integer inputs in the signed 32-bit integer domain and accumulate with the signed 32-bit integer value in the destination register.", "syntax": "v_dot8c_i32_i4", "operands": [], "dataTypes": ["i32"], "semantics": "tmp = D0.i32;\ntmp += i4_to_i32(S0[3 : 0].i4) * i4_to_i32(S1[3 : 0].i4);\ntmp += i4_to_i32(S0[7 : 4].i4) * i4_to_i32(S1[7 : 4].i4);\ntmp += i4_to_i32(S0[11 : 8].i4) * i4_to_i32(S1[11 : 8].i4);\ntmp += i4_to_i32(S0[15 : 12].i4) * i4_to_i32(S1[15 : 12].i4);\ntmp += i4_to_i32(S0[19 : 16].i4) * i4_to_i32(S1[19 : 16].i4);\ntmp += i4_to_i32(S0[23 : 20].i4) * i4_to_i32(S1[23 : 20].i4);\ntmp += i4_to_i32(S0[27 : 24].i4) * i4_to_i32(S1[27 : 24].i4);\ntmp += i4_to_i32(S0[31 : 28].i4) * i4_to_i32(S1[31 : 28].i4);\nD0.i32 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 184, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_exp_bf16", "mnemonic": "v_exp_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V EXP BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_exp_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_exp_f16", "mnemonic": "v_exp_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V EXP F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate 2 raised to the power of the half-precision float input and store the result into a vector register.", "description": "Calculate 2 raised to the power of the half-precision float input and store the result into a vector register.", "syntax": "v_exp_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = pow(16'2.0, S0.f16)", "example": "V_EXP_F16(0xfc00) => 0x0000     // exp(-INF) = 0\nV_EXP_F16(0x8000) => 0x3c00     // exp(-0.0) = 1\nV_EXP_F16(0x7c00) => 0x7c00     // exp(+INF) = +INF", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy, denormals are supported.", "sourcePdfPage": 207, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_exp_f32", "mnemonic": "v_exp_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V EXP F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate 2 raised to the power of the single-precision float input and store the result into a vector register.", "description": "Calculate 2 raised to the power of the single-precision float input and store the result into a vector register.", "syntax": "v_exp_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = pow(2.0F, S0.f32)", "example": "V_EXP_F32(0xff800000) => 0x00000000     // exp(-INF) = 0\nV_EXP_F32(0x80000000) => 0x3f800000     // exp(-0.0) = 1\nV_EXP_F32(0x7f800000) => 0x7f800000     // exp(+INF) = +INF", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy, denormals are flushed.", "sourcePdfPage": 195, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_exp_legacy_f32", "mnemonic": "v_exp_legacy_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V EXP LEGACY F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_exp_legacy_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_ffbh_i32", "mnemonic": "v_ffbh_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FFBH I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Count the number of leading bits that are the same as the sign bit of a vector input and store the result into a vector register.", "description": "Count the number of leading bits that are the same as the sign bit of a vector input and store the result into a vector register. Store -1 if all input bits are the same.", "syntax": "v_ffbh_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = -1;\n// Set if all bits are the same\nfor i in 1 : 31 do\n// Search from MSB\nif S0.i32[31 - i] != S0.i32[31] then\nD0.i32 = i;\nbreak\nendif\nendfor", "example": "V_FFBH_I32(0x00000000) => 0xffffffff\nV_FFBH_I32(0x40000000) => 1\nV_FFBH_I32(0x80000000) => 1\nV_FFBH_I32(0x0fffffff) => 4", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 201, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_ffbh_u32", "mnemonic": "v_ffbh_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FFBH U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Count the number of leading \"0\" bits before the first \"1\" in a vector input and store the result into a vector register.", "description": "Count the number of leading \"0\" bits before the first \"1\" in a vector input and store the result into a vector register. Store -1 if there are no \"1\" bits.", "syntax": "v_ffbh_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.i32 = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from MSB\nif S0.u32[31 - i] == 1'1U then\nD0.i32 = i;\nbreak\nendif\nendfor", "example": "V_FFBH_U32(0x00000000) => 0xffffffff\nV_FFBH_U32(0x800000ff) => 0\nV_FFBH_U32(0x100000ff) => 3\nV_FFBH_U32(0x0000ffff) => 16", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 200, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_ffbl_b32", "mnemonic": "v_ffbl_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FFBL B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Count the number of trailing \"0\" bits before the first \"1\" in a vector input and store the result into a vector register.", "description": "Count the number of trailing \"0\" bits before the first \"1\" in a vector input and store the result into a vector register. Store -1 if there are no \"1\" bits in the input.", "syntax": "v_ffbl_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.i32 = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from LSB\nif S0.u32[i] == 1'1U then\nD0.i32 = i;\nbreak\nendif\nendfor", "example": "V_FFBL_B32(0x00000000) => 0xffffffff\nV_FFBL_B32(0xff000001) => 0\nV_FFBL_B32(0xff000008) => 3\nV_FFBL_B32(0xffff0000) => 16", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 200, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_floor_f16", "mnemonic": "v_floor_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FLOOR F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Round the half-precision float input down to previous integer and store the result in floating point format into a vector register.", "description": "Round the half-precision float input down to previous integer and store the result in floating point format into a vector register.", "syntax": "v_floor_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = trunc(S0.f16);\nif ((S0.f16 < 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += -16'1.0\nendif", "example": "v_floor_f16 v5, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 208, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_floor_f32", "mnemonic": "v_floor_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FLOOR F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Round the single-precision float input down to previous integer and store the result in floating point format into a vector register.", "description": "Round the single-precision float input down to previous integer and store the result in floating point format into a vector register.", "syntax": "v_floor_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = trunc(S0.f32);\nif ((S0.f32 < 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += -1.0F\nendif", "example": "v_floor_f32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 195, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_floor_f64", "mnemonic": "v_floor_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FLOOR F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Round the double-precision float input down to previous integer and store the result in floating point format into a vector register.", "description": "Round the double-precision float input down to previous integer and store the result in floating point format into a vector register.", "syntax": "v_floor_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.f64 = trunc(S0.f64);\nif ((S0.f64 < 0.0) && (S0.f64 != D0.f64)) then\nD0.f64 += -1.0\nendif", "example": "v_floor_f64 v[5:6], -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 193, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fma_dx9_zero_f32", "mnemonic": "v_fma_dx9_zero_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA DX9 ZERO F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply and add single-precision values. Follows DX9 rules where 0.0 times anything produces 0.0.", "description": "Multiply and add single-precision values. Follows DX9 rules where 0.0 times anything produces 0.0.", "syntax": "v_fma_dx9_zero_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_fma_dx9_zero_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fma_f16", "mnemonic": "v_fma_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two half-precision float inputs and add a third input using fused multiply add, and store the result into a vector register.", "description": "Multiply two half-precision float inputs and add a third input using fused multiply add, and store the result into a vector register.", "syntax": "v_fma_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = fma(S0.f16, S1.f16, S2.f16)", "example": "v_fma_f16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, denormals are supported. If OPSEL[3] is 0 Result is written to 16 LSBs of destination VGPR and hi 16 bits are preserved. If OPSEL[3] is 1 Result is written to 16 MSBs of destination VGPR and lo 16 bits are preserved.", "sourcePdfPage": 358, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fma_f16_gfx9", "mnemonic": "v_fma_f16_gfx9", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA F16 GFX9", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fma_f16_gfx9", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fma_f32", "mnemonic": "v_fma_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Per-lane single-precision fused multiply-add.", "description": "Multiply two single-precision float inputs and add a third input using fused multiply add, and store the result into a vector register.", "syntax": "v_fma_f32 VDST, S0, S1, S2", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "S0", "desc": "Multiplicand"}, {"name": "S1", "desc": "Multiplier"}, {"name": "S2", "desc": "Addend"}], "dataTypes": ["f32"], "semantics": "VDST[lane] = round_once(S0[lane].f32 * S1[lane].f32 + S2[lane].f32) for each active lane.", "example": "v_fma_f32  v3, v0, v1, v2   // per-lane v3 = v0 * v1 + v2", "exampleSource": null, "encoding": {"format": "VOP3", "widthBits": 32}, "executionUnit": "Vector ALU", "registerClasses": ["VGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_fma_f64", "mnemonic": "v_fma_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two double-precision float inputs and add a third input using fused multiply add, and store the result into a vector register.", "description": "Multiply two double-precision float inputs and add a third input using fused multiply add, and store the result into a vector register.", "syntax": "v_fma_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.f64 = fma(S0.f64, S1.f64, S2.f64)", "example": "v_fma_f64 v[5:6], v[1:2], v[2:3], v[3:4]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, denormals are supported.", "sourcePdfPage": 339, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fma_legacy_f16", "mnemonic": "v_fma_legacy_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA LEGACY F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Fused half precision multiply add. Implements IEEE rules and non-standard rule for OPSEL.", "description": "Fused half precision multiply add. Implements IEEE rules and non-standard rule for OPSEL.", "syntax": "v_fma_legacy_f16", "operands": [], "dataTypes": ["f16"], "semantics": "tmp = fma(S0.f16, S1.f16, S2.f16);\nif OPSEL.u4[3] then\nD0 = { tmp.f16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.f16 }\nendif", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 352, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_fma_legacy_f32", "mnemonic": "v_fma_legacy_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA LEGACY F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply and add single-precision values. Follows DX9 rules where 0.0 times anything produces 0.0.", "description": "Multiply and add single-precision values. Follows DX9 rules where 0.0 times anything produces 0.0.", "syntax": "v_fma_legacy_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_fma_legacy_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fma_mix_bf16_t16", "mnemonic": "v_fma_mix_bf16_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA MIX BF16 T16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fma_mix_bf16_t16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fma_mix_f16_t16", "mnemonic": "v_fma_mix_f16_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA MIX F16 T16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fma_mix_f16_t16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fma_mix_f32", "mnemonic": "v_fma_mix_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA MIX F32", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two inputs and add a third input using fused multiply add where the inputs are a mix of half-precision float and single-precision float…", "description": "Multiply two inputs and add a third input using fused multiply add where the inputs are a mix of half-precision float and single-precision float values. Store the result into a vector register.", "syntax": "v_fma_mix_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_fma_mix_f32 v5, s1, s2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fma_mix_f32_bf16", "mnemonic": "v_fma_mix_f32_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA MIX F32 BF16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fma_mix_f32_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fma_mixhi_bf16", "mnemonic": "v_fma_mixhi_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA MIXHI BF16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fma_mixhi_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fma_mixhi_f16", "mnemonic": "v_fma_mixhi_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA MIXHI F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two inputs and add a third input using fused multiply add where the inputs are a mix of half-precision float and single-precision float…", "description": "Multiply two inputs and add a third input using fused multiply add where the inputs are a mix of half-precision float and single-precision float values. Convert the result to a half-precision float. Store the result into the high bits of a vector register.", "syntax": "v_fma_mixhi_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": "v_fma_mixhi_f16 v5, s1, s2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fma_mixlo_bf16", "mnemonic": "v_fma_mixlo_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA MIXLO BF16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fma_mixlo_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fma_mixlo_f16", "mnemonic": "v_fma_mixlo_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMA MIXLO F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two inputs and add a third input using fused multiply add where the inputs are a mix of half-precision float and single-precision float…", "description": "Multiply two inputs and add a third input using fused multiply add where the inputs are a mix of half-precision float and single-precision float values. Convert the result to a half-precision float. Store the result into the low bits of a vector register.", "syntax": "v_fma_mixlo_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": "v_fma_mixlo_f16 v5, s1, s2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fmaak_f16", "mnemonic": "v_fmaak_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAAK F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two half-precision float inputs and add a literal constant using fused multiply add, and store the result into a vector register.", "description": "Multiply two half-precision float inputs and add a literal constant using fused multiply add, and store the result into a vector register.", "syntax": "v_fmaak_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": "v_fmaak_f16 v5, -1, v2, 0xfe0b", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fmaak_f16_fake16", "mnemonic": "v_fmaak_f16_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAAK F16 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fmaak_f16_fake16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fmaak_f16_t16", "mnemonic": "v_fmaak_f16_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAAK F16 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fmaak_f16_t16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fmaak_f32", "mnemonic": "v_fmaak_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAAK F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two single-precision float inputs and add a literal constant using fused multiply add, and store the result into a vector register.", "description": "Multiply two single-precision float inputs and add a literal constant using fused multiply add, and store the result into a vector register.", "syntax": "v_fmaak_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = fma(S0.f32, S1.f32, SIMM32.f32)", "example": "v_fmaak_f32 v5, -1, v2, 0xaf123456", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100", "gfx942"], "unsupportedTargets": [], "architecturalNotes": "This opcode cannot use the VOP3 encoding and cannot use input/output modifiers.", "sourcePdfPage": 175, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fmaak_f64", "mnemonic": "v_fmaak_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAAK F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fmaak_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fmac_f16", "mnemonic": "v_fmac_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAC F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two half-precision float inputs and accumulate the result into the destination register using fused multiply add.", "description": "Multiply two half-precision float inputs and accumulate the result into the destination register using fused multiply add.", "syntax": "v_fmac_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": "v_fmac_f16 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fmac_f16_fake16", "mnemonic": "v_fmac_f16_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAC F16 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fmac_f16_fake16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fmac_f16_t16", "mnemonic": "v_fmac_f16_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAC F16 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fmac_f16_t16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fmac_f32", "mnemonic": "v_fmac_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAC F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two floating point inputs and accumulate the result into the destination register using fused multiply add.", "description": "Multiply two floating point inputs and accumulate the result into the destination register using fused multiply add.", "syntax": "v_fmac_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = fma(S0.f32, S1.f32, D0.f32)", "example": "v_fmac_f32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 185, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fmac_f64", "mnemonic": "v_fmac_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAC F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two floating point inputs and accumulate the result into the destination register using fused multiply add.", "description": "Multiply two floating point inputs and accumulate the result into the destination register using fused multiply add.", "syntax": "v_fmac_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.f64 = fma(S0.f64, S1.f64, D0.f64)", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 170, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_fmac_legacy_f32", "mnemonic": "v_fmac_legacy_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAC LEGACY F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two single-precision values and accumulate the result with the destination. Follows DX9 rules where 0.0 times anything produces 0.0.", "description": "Multiply two single-precision values and accumulate the result with the destination. Follows DX9 rules where 0.0 times anything produces 0.0.", "syntax": "v_fmac_legacy_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_fmac_legacy_f32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fmamk_f16", "mnemonic": "v_fmamk_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAMK F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply a half-precision float input with a literal constant and add a second half-precision float input using fused multiply add, and store the…", "description": "Multiply a half-precision float input with a literal constant and add a second half-precision float input using fused multiply add, and store the result into a vector register.", "syntax": "v_fmamk_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": "v_fmamk_f16 v5, -1, 0xfe0b, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fmamk_f16_fake16", "mnemonic": "v_fmamk_f16_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAMK F16 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fmamk_f16_fake16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fmamk_f16_t16", "mnemonic": "v_fmamk_f16_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAMK F16 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fmamk_f16_t16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fmamk_f32", "mnemonic": "v_fmamk_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAMK F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply a single-precision float input with a literal constant and add a second single-precision float input using fused multiply add, and store the…", "description": "Multiply a single-precision float input with a literal constant and add a second single-precision float input using fused multiply add, and store the result into a vector register.", "syntax": "v_fmamk_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = fma(S0.f32, SIMM32.f32, S1.f32)", "example": "v_fmamk_f32 v5, -1, 0xaf123456, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100", "gfx942"], "unsupportedTargets": [], "architecturalNotes": "This opcode cannot use the VOP3 encoding and cannot use input/output modifiers.", "sourcePdfPage": 174, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fmamk_f64", "mnemonic": "v_fmamk_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FMAMK F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_fmamk_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_fract_f16", "mnemonic": "v_fract_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FRACT F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the fractional portion of a half-precision float input and store the result in floating point format into a vector register.", "description": "Compute the fractional portion of a half-precision float input and store the result in floating point format into a vector register.", "syntax": "v_fract_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = S0.f16 + -floor(S0.f16)", "example": "v_fract_f16 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, denormals are accepted. This is intended to comply with the DX specification of fract where the function behaves like an extension of integer modulus; be aware this may differ from how fract() is defined in other domains. For example: fract(- 1.2) = 0.8 in DX.", "sourcePdfPage": 209, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fract_f32", "mnemonic": "v_fract_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FRACT F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the fractional portion of a single-precision float input and store the result in floating point format into a vector register.", "description": "Compute the fractional portion of a single-precision float input and store the result in floating point format into a vector register.", "syntax": "v_fract_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = S0.f32 + -floor(S0.f32)", "example": "v_fract_f32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, denormals are accepted. This is intended to comply with the DX specification of fract where the function behaves like an extension of integer modulus; be aware this may differ from how fract() is defined in other domains. For example: fract(- 1.2) = 0.8 in DX. Obey round mode, result clamped to 0x3f7fffff.", "sourcePdfPage": 193, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_fract_f64", "mnemonic": "v_fract_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FRACT F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the fractional portion of a double-precision float input and store the result in floating point format into a vector register.", "description": "Compute the fractional portion of a double-precision float input and store the result in floating point format into a vector register.", "syntax": "v_fract_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.f64 = S0.f64 + -floor(S0.f64)", "example": "v_fract_f64 v[5:6], -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP accuracy, denormals are accepted. This is intended to comply with the DX specification of fract where the function behaves like an extension of integer modulus; be aware this may differ from how fract() is defined in other domains. For example: fract(- 1.2) = 0.8 in DX. Obey round mode, result clamped to 0x3fefffffffffffff.", "sourcePdfPage": 202, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_frexp_exp_i16_f16", "mnemonic": "v_frexp_exp_i16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FREXP EXP I16 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Extract the exponent of a half-precision float input and store the result as a signed 16-bit integer into a vector register.", "description": "Extract the exponent of a half-precision float input and store the result as a signed 16-bit integer into a vector register.", "syntax": "v_frexp_exp_i16_f16", "operands": [], "dataTypes": ["f16", "i16"], "semantics": "if ((64'F(S0.f16) == +INF) || (64'F(S0.f16) == -INF) || isNAN(64'F(S0.f16))) then\nD0.i16 = 16'0\nelse\nD0.i16 = 16'I(exponent(S0.f16) - 15 + 1)\nendif", "example": "v_frexp_exp_i16_f16 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This operation satisfies the invariant S0.f16 = significand * (2 ** exponent). See also V_FREXP_MANT_F16, which returns the significand. See the C library function frexp() for more information.", "sourcePdfPage": 207, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_frexp_exp_i32_f32", "mnemonic": "v_frexp_exp_i32_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FREXP EXP I32 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Extract the exponent of a single-precision float input and store the result as a signed 32-bit integer into a vector register.", "description": "Extract the exponent of a single-precision float input and store the result as a signed 32-bit integer into a vector register.", "syntax": "v_frexp_exp_i32_f32", "operands": [], "dataTypes": ["f32", "i32"], "semantics": "if ((64'F(S0.f32) == +INF) || (64'F(S0.f32) == -INF) || isNAN(64'F(S0.f32))) then\nD0.i32 = 0\nelse\nD0.i32 = exponent(S0.f32) - 127 + 1\nendif", "example": "v_frexp_exp_i32_f32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This operation satisfies the invariant S0.f32 = significand * (2 ** exponent). See also V_FREXP_MANT_F32, which returns the significand. See the C library function frexp() for more information.", "sourcePdfPage": 203, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_frexp_exp_i32_f64", "mnemonic": "v_frexp_exp_i32_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FREXP EXP I32 F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Extract the exponent of a double-precision float input and store the result as a signed 32-bit integer into a vector register.", "description": "Extract the exponent of a double-precision float input and store the result as a signed 32-bit integer into a vector register.", "syntax": "v_frexp_exp_i32_f64", "operands": [], "dataTypes": ["f64", "i32"], "semantics": "if ((S0.f64 == +INF) || (S0.f64 == -INF) || isNAN(S0.f64)) then\nD0.i32 = 0\nelse\nD0.i32 = exponent(S0.f64) - 1023 + 1\nendif", "example": "v_frexp_exp_i32_f64 v5, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This operation satisfies the invariant S0.f64 = significand * (2 ** exponent). See also V_FREXP_MANT_F64, which returns the significand. See the C library function frexp() for more information.", "sourcePdfPage": 201, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_frexp_mant_f16", "mnemonic": "v_frexp_mant_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FREXP MANT F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Extract the binary significand, or mantissa, of a half-precision float input and store the result as a half- precision float into a vector register.", "description": "Extract the binary significand, or mantissa, of a half-precision float input and store the result as a half- precision float into a vector register.", "syntax": "v_frexp_mant_f16", "operands": [], "dataTypes": ["f16"], "semantics": "if ((64'F(S0.f16) == +INF) || (64'F(S0.f16) == -INF) || isNAN(64'F(S0.f16))) then\nD0.f16 = S0.f16\nelse\nD0.f16 = mantissa(S0.f16)\nendif", "example": "v_frexp_mant_f16 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This operation satisfies the invariant S0.f16 = significand * (2 ** exponent). Result range is in (-1.0,-0.5][0.5,1.0) in normal cases. See also V_FREXP_EXP_I16_F16, which returns integer exponent. See the C library function frexp() for more information.", "sourcePdfPage": 207, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_frexp_mant_f32", "mnemonic": "v_frexp_mant_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FREXP MANT F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Extract the binary significand, or mantissa, of a single-precision float input and store the result as a single- precision float into a vector…", "description": "Extract the binary significand, or mantissa, of a single-precision float input and store the result as a single- precision float into a vector register.", "syntax": "v_frexp_mant_f32", "operands": [], "dataTypes": ["f32"], "semantics": "if ((64'F(S0.f32) == +INF) || (64'F(S0.f32) == -INF) || isNAN(64'F(S0.f32))) then\nD0.f32 = S0.f32\nelse\nD0.f32 = mantissa(S0.f32)\nendif", "example": "v_frexp_mant_f32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This operation satisfies the invariant S0.f32 = significand * (2 ** exponent). Result range is in (-1.0,-0.5][0.5,1.0) in normal cases. See also V_FREXP_EXP_I32_F32, which returns integer exponent. See the C library function frexp() for more information.", "sourcePdfPage": 203, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_frexp_mant_f64", "mnemonic": "v_frexp_mant_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V FREXP MANT F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Extract the binary significand, or mantissa, of a double-precision float input and store the result as a double- precision float into a vector…", "description": "Extract the binary significand, or mantissa, of a double-precision float input and store the result as a double- precision float into a vector register.", "syntax": "v_frexp_mant_f64", "operands": [], "dataTypes": ["f64"], "semantics": "if ((S0.f64 == +INF) || (S0.f64 == -INF) || isNAN(S0.f64)) then\nD0.f64 = S0.f64\nelse\nD0.f64 = mantissa(S0.f64)\nendif", "example": "v_frexp_mant_f64 v[5:6], -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This operation satisfies the invariant S0.f64 = significand * (2 ** exponent). Result range is in (-1.0,-0.5][0.5,1.0) in normal cases. See also V_FREXP_EXP_I32_F64, which returns integer exponent. See the C library function frexp() for more information.", "sourcePdfPage": 202, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_interp_mov_f32", "mnemonic": "v_interp_mov_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP MOV F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given an attribute specifier and a parameter ID (P0, P10 or P20), load one of the parameter values from the local data share into a vector register.", "description": "Given an attribute specifier and a parameter ID (P0, P10 or P20), load one of the parameter values from the local data share into a vector register.", "syntax": "v_interp_mov_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_interp_p10_f16_f32", "mnemonic": "v_interp_p10_f16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP P10 F16 F32", "category": "Vector Interpolation", "instructionClass": "vector", "summary": "Given a half-precision float P10 parameter of an attribute, a single-precision float I coordinate and a half-precision float P0 parameter as inputs…", "description": "Given a half-precision float P10 parameter of an attribute, a single-precision float I coordinate and a half-precision float P0 parameter as inputs, compute the first part of parameter interpolation and store the intermediate result in single-precision float format into a vector register. Use V_INTERP_P2_F16_F32 to complete the operation.", "syntax": "v_interp_p10_f16_f32", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": "v_interp_p10_f16_f32 v0, -v1.l, v2, v3.l", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VINTERP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_interp_p10_f32", "mnemonic": "v_interp_p10_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP P10 F32", "category": "Vector Interpolation", "instructionClass": "vector", "summary": "Given the P10 parameter of an attribute, the I coordinate and the P0 parameter as single-precision float inputs, compute the first part of parameter…", "description": "Given the P10 parameter of an attribute, the I coordinate and the P0 parameter as single-precision float inputs, compute the first part of parameter interpolation and store the intermediate result into a vector register. Use V_INTERP_P2_F32 to complete the operation.", "syntax": "v_interp_p10_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_interp_p10_f32 v0, -v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VINTERP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_interp_p10_rtz_f16_f32", "mnemonic": "v_interp_p10_rtz_f16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP P10 RTZ F16 F32", "category": "Vector Interpolation", "instructionClass": "vector", "summary": "Given a half-precision float P10 parameter of an attribute, a single-precision float I coordinate and a half-precision float P0 parameter as inputs…", "description": "Given a half-precision float P10 parameter of an attribute, a single-precision float I coordinate and a half-precision float P0 parameter as inputs, compute the first part of parameter interpolation using round toward zero semantics and store the intermediate result in single-precision float format into a vector register. Use V_INTERP_P2_RTZ_F16_F32 to complete the operation.", "syntax": "v_interp_p10_rtz_f16_f32", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": "v_interp_p10_rtz_f16_f32 v0, -v1.l, v2, v3.l", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VINTERP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_interp_p1_f32", "mnemonic": "v_interp_p1_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP P1 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given the I coordinate in a vector register and an attribute specifier, load parameter data from the local data share, compute the first part of…", "description": "Given the I coordinate in a vector register and an attribute specifier, load parameter data from the local data share, compute the first part of parameter interpolation and store the intermediate result into a vector register. Use V_INTERP_P2_F32 to complete the operation.", "syntax": "v_interp_p1_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_interp_p1ll_f16", "mnemonic": "v_interp_p1ll_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP P1LL F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a single-precision float I coordinate in a vector register and an attribute specifier, load two half-precision float parameter values from the…", "description": "Given a single-precision float I coordinate in a vector register and an attribute specifier, load two half-precision float parameter values from the local data share, compute the first part of parameter interpolation and store the intermediate result into a vector register. Use V_INTERP_P2_F16 to complete the operation.", "syntax": "v_interp_p1ll_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_interp_p1lv_f16", "mnemonic": "v_interp_p1lv_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP P1LV F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a single-precision float I coordinate in a vector register, a half-precision float P0 value in another vector register, and an attribute…", "description": "Given a single-precision float I coordinate in a vector register, a half-precision float P0 value in another vector register, and an attribute specifier, load a half-precision float parameter value from the local data share, compute the first part of parameter interpolation and store the intermediate result into a vector register. Use V_INTERP_P2_F16 to complete the operation.", "syntax": "v_interp_p1lv_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_interp_p2_f16", "mnemonic": "v_interp_p2_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP P2 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a single-precision float J coordinate in a vector register, an attribute specifier and the result of a prior V_INTERP_P1_F32 in another vector…", "description": "Given a single-precision float J coordinate in a vector register, an attribute specifier and the result of a prior V_INTERP_P1_F32 in another vector register, load a half-precision float parameter value from the local data share, compute the second part of parameter interpolation and store the final result as a half-precision float value into a vector register.", "syntax": "v_interp_p2_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_interp_p2_f16_f32", "mnemonic": "v_interp_p2_f16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP P2 F16 F32", "category": "Vector Interpolation", "instructionClass": "vector", "summary": "Given a half-precision float P20 parameter of an attribute, a single-precision float J coordinate and the result of a prior V_INTERP_P10_F16_F32…", "description": "Given a half-precision float P20 parameter of an attribute, a single-precision float J coordinate and the result of a prior V_INTERP_P10_F16_F32 instruction as inputs, compute the second part of parameter interpolation and store the final result into a vector register.", "syntax": "v_interp_p2_f16_f32", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": "v_interp_p2_f16_f32 v0.l, -v1.l, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VINTERP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_interp_p2_f16_opsel", "mnemonic": "v_interp_p2_f16_opsel", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP P2 F16 OPSEL", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_interp_p2_f16_opsel", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_interp_p2_f32", "mnemonic": "v_interp_p2_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP P2 F32", "category": "Vector Interpolation", "instructionClass": "vector", "summary": "Given the J coordinate in a vector register, an attribute specifier and the result of a prior V_INTERP_P1_F32 in the destination vector register…", "description": "Given the J coordinate in a vector register, an attribute specifier and the result of a prior V_INTERP_P1_F32 in the destination vector register, load parameter data from the local data share, compute the second part of parameter interpolation and store the final result into a vector register.", "syntax": "v_interp_p2_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_interp_p2_f32 v0, -v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VINTERP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_interp_p2_legacy_f16", "mnemonic": "v_interp_p2_legacy_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP P2 LEGACY F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Half-precision interpolation.", "description": "Half-precision interpolation.", "syntax": "v_interp_p2_legacy_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_interp_p2_rtz_f16_f32", "mnemonic": "v_interp_p2_rtz_f16_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V INTERP P2 RTZ F16 F32", "category": "Vector Interpolation", "instructionClass": "vector", "summary": "Given a half-precision float P20 parameter of an attribute, a single-precision float J coordinate and the result of a prior V_INTERP_P10_RTZ_F16_F32…", "description": "Given a half-precision float P20 parameter of an attribute, a single-precision float J coordinate and the result of a prior V_INTERP_P10_RTZ_F16_F32 instruction as inputs, compute the second part of parameter interpolation using round toward zero semantics and store the final result into a vector register.", "syntax": "v_interp_p2_rtz_f16_f32", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": "v_interp_p2_rtz_f16_f32 v0.l, -v1.l, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VINTERP"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_ldexp_f16", "mnemonic": "v_ldexp_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LDEXP F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply the first input, a floating point value, by an integral power of 2 specified in the second input, a signed integer value, and store the…", "description": "Multiply the first input, a floating point value, by an integral power of 2 specified in the second input, a signed integer value, and store the floating point result into a vector register.", "syntax": "v_ldexp_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = S0.f16 * 16'F(2.0F ** 32'I(S1.i16))", "example": "v_ldexp_f16 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Compare with the ldexp() function in C. Note that the S1 has a format of f16 since floating point literal constants are interpreted as 16 bit value for this opcode.", "sourcePdfPage": 182, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_ldexp_f16_fake16", "mnemonic": "v_ldexp_f16_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LDEXP F16 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_ldexp_f16_fake16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_ldexp_f16_t16", "mnemonic": "v_ldexp_f16_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LDEXP F16 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_ldexp_f16_t16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_ldexp_f32", "mnemonic": "v_ldexp_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LDEXP F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply the first input, a floating point value, by an integral power of 2 specified in the second input, a signed integer value, and store the…", "description": "Multiply the first input, a floating point value, by an integral power of 2 specified in the second input, a signed integer value, and store the floating point result into a vector register.", "syntax": "v_ldexp_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_ldexp_f32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_ldexp_f64", "mnemonic": "v_ldexp_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LDEXP F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply the first input, a floating point value, by an integral power of 2 specified in the second input, a signed integer value, and store the…", "description": "Multiply the first input, a floating point value, by an integral power of 2 specified in the second input, a signed integer value, and store the floating point result into a vector register.", "syntax": "v_ldexp_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.f64 = S0.f64 * 2.0 ** S1.i32", "example": "v_ldexp_f64 v[5:6], -1, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Compare with the ldexp() function in C.", "sourcePdfPage": 361, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_lerp_u8", "mnemonic": "v_lerp_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LERP U8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Average two 4-D vectors stored as packed bytes in the first two inputs with rounding control provided by the third input, then store the result into…", "description": "Average two 4-D vectors stored as packed bytes in the first two inputs with rounding control provided by the third input, then store the result into a vector register. Each byte in the third input acts as a rounding mode for the corresponding element; if the LSB is set then 0.5 rounds up, otherwise 0.5 truncates.", "syntax": "v_lerp_u8", "operands": [], "dataTypes": ["u8"], "semantics": "tmp = ((S0.u32[31 : 24] + S1.u32[31 : 24] + S2.u32[24].u8) >> 1U << 24U);\ntmp += ((S0.u32[23 : 16] + S1.u32[23 : 16] + S2.u32[16].u8) >> 1U << 16U);\ntmp += ((S0.u32[15 : 8] + S1.u32[15 : 8] + S2.u32[8].u8) >> 1U << 8U);\ntmp += ((S0.u32[7 : 0] + S1.u32[7 : 0] + S2.u32[0].u8) >> 1U);\nD0.u32 = tmp.u32", "example": "v_lerp_u8 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 339, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_log_bf16", "mnemonic": "v_log_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LOG BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_log_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_log_f16", "mnemonic": "v_log_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LOG F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the base 2 logarithm of the half-precision float input and store the result into a vector register.", "description": "Calculate the base 2 logarithm of the half-precision float input and store the result into a vector register.", "syntax": "v_log_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = log2(S0.f16)", "example": "V_LOG_F16(0xfc00) => 0xfe00     // log(-INF) = NAN\nV_LOG_F16(0xbc00) => 0xfe00     // log(-1.0) = NAN\nV_LOG_F16(0x8000) => 0xfc00     // log(-0.0) = -INF\nV_LOG_F16(0x0000) => 0xfc00     // log(+0.0) = -INF", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy, denormals are supported.", "sourcePdfPage": 206, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_log_f32", "mnemonic": "v_log_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LOG F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the base 2 logarithm of the single-precision float input and store the result into a vector register.", "description": "Calculate the base 2 logarithm of the single-precision float input and store the result into a vector register.", "syntax": "v_log_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = log2(S0.f32)", "example": "V_LOG_F32(0xff800000) => 0xffc00000     // log(-INF) = NAN\nV_LOG_F32(0xbf800000) => 0xffc00000     // log(-1.0) = NAN\nV_LOG_F32(0x80000000) => 0xff800000     // log(-0.0) = -INF\nV_LOG_F32(0x00000000) => 0xff800000     // log(+0.0) = -INF", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy, denormals are flushed.", "sourcePdfPage": 195, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_log_legacy_f32", "mnemonic": "v_log_legacy_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LOG LEGACY F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_log_legacy_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_lshl_add_u32", "mnemonic": "v_lshl_add_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHL ADD U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a shift count in the second input, calculate the logical shift left of the first input, then add the third input to the intermediate result…", "description": "Given a shift count in the second input, calculate the logical shift left of the first input, then add the third input to the intermediate result, then store the final result into a vector register.", "syntax": "v_lshl_add_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = (S0.u32 << S1.u32[4 : 0].u32) + S2.u32", "example": "v_lshl_add_u32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 356, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_lshl_add_u64", "mnemonic": "v_lshl_add_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHL ADD U64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a shift count in the second input, calculate the logical shift left of the first input, then add the third input to the intermediate result…", "description": "Given a shift count in the second input, calculate the logical shift left of the first input, then add the third input to the intermediate result, then store the final result into a vector register. For this opcode the shift count must be between 0 and 4, higher shift counts are unsupported.", "syntax": "v_lshl_add_u64", "operands": [], "dataTypes": ["u64"], "semantics": "D0.u64 = (S0.u64 << S1.u32[2 : 0].u32) + S2.u64", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "The design treats unsupported shift counts as a shift of zero.", "sourcePdfPage": 359, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_lshl_b32", "mnemonic": "v_lshl_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHL B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_lshl_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_lshl_b64", "mnemonic": "v_lshl_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHL B64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_lshl_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_lshl_or_b32", "mnemonic": "v_lshl_or_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHL OR B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a shift count in the second input, calculate the logical shift left of the first input, then calculate the bitwise OR of the intermediate…", "description": "Given a shift count in the second input, calculate the logical shift left of the first input, then calculate the bitwise OR of the intermediate result and the third input, then store the final result into a vector register.", "syntax": "v_lshl_or_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = ((S0.u32 << S1.u32[4 : 0].u32) | S2.u32)", "example": "v_lshl_or_b32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 356, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_lshlrev_b16", "mnemonic": "v_lshlrev_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHLREV B16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a shift count in the first vector input, calculate the logical shift left of the second vector input and store the result into a vector…", "description": "Given a shift count in the first vector input, calculate the logical shift left of the second vector input and store the result into a vector register.", "syntax": "v_lshlrev_b16", "operands": [], "dataTypes": ["b16"], "semantics": "D0.u16 = (S1.u16 << S0[3 : 0].u32)", "example": "v_lshlrev_b16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 180, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_lshlrev_b32", "mnemonic": "v_lshlrev_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHLREV B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a shift count in the first vector input, calculate the logical shift left of the second vector input and store the result into a vector…", "description": "Given a shift count in the first vector input, calculate the logical shift left of the second vector input and store the result into a vector register.", "syntax": "v_lshlrev_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S1.u32 << S0[4 : 0].u32)", "example": "v_lshlrev_b32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 173, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_lshlrev_b64", "mnemonic": "v_lshlrev_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHLREV B64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a shift count in the first vector input, calculate the logical shift left of the second vector input and store the result into a vector…", "description": "Given a shift count in the first vector input, calculate the logical shift left of the second vector input and store the result into a vector register.", "syntax": "v_lshlrev_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": "v_lshlrev_b64 v[5:6], -1, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_lshlrev_b64_pseudo", "mnemonic": "v_lshlrev_b64_pseudo", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHLREV B64 PSEUDO", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_lshlrev_b64_pseudo", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_lshr_b32", "mnemonic": "v_lshr_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHR B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_lshr_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_lshr_b64", "mnemonic": "v_lshr_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHR B64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_lshr_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_lshrrev_b16", "mnemonic": "v_lshrrev_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHRREV B16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a shift count in the first vector input, calculate the logical shift right of the second vector input and store the result into a vector…", "description": "Given a shift count in the first vector input, calculate the logical shift right of the second vector input and store the result into a vector register.", "syntax": "v_lshrrev_b16", "operands": [], "dataTypes": ["b16"], "semantics": "D0.u16 = (S1.u16 >> S0[3 : 0].u32)", "example": "v_lshrrev_b16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 180, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_lshrrev_b32", "mnemonic": "v_lshrrev_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHRREV B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a shift count in the first vector input, calculate the logical shift right of the second vector input and store the result into a vector…", "description": "Given a shift count in the first vector input, calculate the logical shift right of the second vector input and store the result into a vector register.", "syntax": "v_lshrrev_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S1.u32 >> S0[4 : 0].u32)", "example": "v_lshrrev_b32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 173, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_lshrrev_b64", "mnemonic": "v_lshrrev_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V LSHRREV B64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given a shift count in the first vector input, calculate the logical shift right of the second vector input and store the result into a vector…", "description": "Given a shift count in the first vector input, calculate the logical shift right of the second vector input and store the result into a vector register.", "syntax": "v_lshrrev_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.u64 = (S1.u64 >> S0[5 : 0].u32)", "example": "v_lshrrev_b64 v[5:6], -1, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 364, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mac_f16", "mnemonic": "v_mac_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAC F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two floating point inputs and accumulate the result into the destination register. Implements IEEE rules and non-standard rule for OPSEL.", "description": "Multiply two floating point inputs and accumulate the result into the destination register. Implements IEEE rules and non-standard rule for OPSEL.", "syntax": "v_mac_f16", "operands": [], "dataTypes": ["f16"], "semantics": "tmp = S0.f16 * S1.f16 + D0.f16;\nif OPSEL.u4[3] then\nD0 = { tmp.f16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.f16 }\nendif", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Supports round mode, exception flags, saturation.", "sourcePdfPage": 178, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mac_f32", "mnemonic": "v_mac_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAC F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two floating point inputs and accumulate the result into the destination register.", "description": "Multiply two floating point inputs and accumulate the result into the destination register.", "syntax": "v_mac_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mac_legacy_f32", "mnemonic": "v_mac_legacy_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAC LEGACY F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply and add single-precision values, accumulate with destination. Follows DX9 rules where 0.0 times anything produces 0.0.", "description": "Multiply and add single-precision values, accumulate with destination. Follows DX9 rules where 0.0 times anything produces 0.0.", "syntax": "v_mac_legacy_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mad_co_i64_i32", "mnemonic": "v_mad_co_i64_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD CO I64 I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two signed integer inputs, add a third signed integer input, store the result into a 64-bit vector register and store the overflow/carryout…", "description": "Multiply two signed integer inputs, add a third signed integer input, store the result into a 64-bit vector register and store the overflow/carryout into a scalar mask register.", "syntax": "v_mad_co_i64_i32", "operands": [], "dataTypes": ["i32", "i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mad_co_u64_u32", "mnemonic": "v_mad_co_u64_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD CO U64 U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two unsigned integer inputs, add a third unsigned integer input, store the result into a 64-bit vector register and store the…", "description": "Multiply two unsigned integer inputs, add a third unsigned integer input, store the result into a 64-bit vector register and store the overflow/carryout into a scalar mask register.", "syntax": "v_mad_co_u64_u32", "operands": [], "dataTypes": ["u32", "u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mad_f16", "mnemonic": "v_mad_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two half-precision float inputs and add a third input, and store the result into a vector register.", "description": "Multiply two half-precision float inputs and add a third input, and store the result into a vector register.", "syntax": "v_mad_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = S0.f16 * S1.f16 + S2.f16", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Supports round mode, exception flags, saturation. 1ULP accuracy, denormals are flushed. If OPSEL[3] is 0 Result is written to 16 LSBs of destination VGPR and hi 16 bits are preserved. If OPSEL[3] is 1 Result is written to 16 MSBs of destination VGPR and lo 16 bits are preserved.", "sourcePdfPage": 357, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mad_f16_gfx9", "mnemonic": "v_mad_f16_gfx9", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD F16 GFX9", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_mad_f16_gfx9", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_mad_f32", "mnemonic": "v_mad_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two single-precision float inputs and add a third input, and store the result into a vector register.", "description": "Multiply two single-precision float inputs and add a third input, and store the result into a vector register.", "syntax": "v_mad_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mad_i16", "mnemonic": "v_mad_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two signed 16-bit integer inputs, add a signed 16-bit integer value from a third input, and store the result into a vector register.", "description": "Multiply two signed 16-bit integer inputs, add a signed 16-bit integer value from a third input, and store the result into a vector register.", "syntax": "v_mad_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.i16 = S0.i16 * S1.i16 + S2.i16", "example": "v_mad_i16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Supports saturation (signed 16-bit integer domain). If OPSEL[3] is 0 the result is written to 16 LSBs of destination VGPR and the high 16 bits are preserved. If OPSEL[3] is 1 the result is written to 16 MSBs of destination VGPR and the low 16 bits are preserved.", "sourcePdfPage": 358, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mad_i16_gfx9", "mnemonic": "v_mad_i16_gfx9", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD I16 GFX9", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on i16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_mad_i16_gfx9", "operands": [], "dataTypes": ["i16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_mad_i32_i16", "mnemonic": "v_mad_i32_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD I32 I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two signed 16-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer value from a third input, and store the…", "description": "Multiply two signed 16-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer value from a third input, and store the result as a signed 32-bit integer into a vector register.", "syntax": "v_mad_i32_i16", "operands": [], "dataTypes": ["i16", "i32"], "semantics": "D0.i32 = 32'I(S0.i16) * 32'I(S1.i16) + S2.i32", "example": "v_mad_i32_i16 v5, v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 353, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mad_i32_i24", "mnemonic": "v_mad_i32_i24", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD I32 I24", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two signed 24-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer value from a third input, and store the…", "description": "Multiply two signed 24-bit integer inputs in the signed 32-bit integer domain, add a signed 32-bit integer value from a third input, and store the result as a signed 32-bit integer into a vector register.", "syntax": "v_mad_i32_i24", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = 32'I(S0.i24) * 32'I(S1.i24) + S2.i32", "example": "v_mad_i32_i24 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 335, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mad_i64_i32", "mnemonic": "v_mad_i64_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD I64 I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two signed integer inputs, add a third signed integer input, store the result into a 64-bit vector register and store the overflow/carryout…", "description": "Multiply two signed integer inputs, add a third signed integer input, store the result into a 64-bit vector register and store the overflow/carryout into a scalar mask register.", "syntax": "v_mad_i64_i32", "operands": [], "dataTypes": ["i32", "i64"], "semantics": "{ D1.i1, D0.i64 } = 65'B(65'I(S0.i32) * 65'I(S1.i32) + 65'I(S2.i64))", "example": "v_mad_i64_i32 v[5:6], s6, s105, s105, s[6:7]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "In VOP3 the VCC destination may be an arbitrary SGPR-pair.", "sourcePdfPage": 349, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mad_legacy_f16", "mnemonic": "v_mad_legacy_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD LEGACY F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply add of FP16 values. Implements IEEE rules and non-standard rule for OPSEL.", "description": "Multiply add of FP16 values. Implements IEEE rules and non-standard rule for OPSEL.", "syntax": "v_mad_legacy_f16", "operands": [], "dataTypes": ["f16"], "semantics": "tmp = S0.f16 * S1.f16 + S2.f16;\nif OPSEL.u4[3] then\nD0 = { tmp.f16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.f16 }\nendif", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Supports round mode, exception flags, saturation. If OPSEL[3] is 0 Result is written to 16 LSBs of destination VGPR and hi 16 bits are written as 0 (this is different from V_MAD_F16). If OPSEL[3] is 1 Result is written to 16 MSBs of destination VGPR and lo 16 bits are preserved.", "sourcePdfPage": 350, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mad_legacy_f32", "mnemonic": "v_mad_legacy_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD LEGACY F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply and add single-precision values. Follows DX9 rules where 0.0 times anything produces 0.0.", "description": "Multiply and add single-precision values. Follows DX9 rules where 0.0 times anything produces 0.0.", "syntax": "v_mad_legacy_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mad_legacy_i16", "mnemonic": "v_mad_legacy_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD LEGACY I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply add of signed short values. Has non-standard rule for OPSEL.", "description": "Multiply add of signed short values. Has non-standard rule for OPSEL.", "syntax": "v_mad_legacy_i16", "operands": [], "dataTypes": ["i16"], "semantics": "tmp = S0.i16 * S1.i16 + S2.i16;\nif OPSEL.u4[3] then\nD0 = { tmp.i16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.i16 }\nendif", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Supports saturation (signed 16-bit integer domain). If OPSEL[3] is 0 Result is written to 16 LSBs of destination VGPR and hi 16 bits are written as 0 (this is different from V_MAD_I16). If OPSEL[3] is 1 Result is written to 16 MSBs of destination VGPR and lo 16 bits are preserved.", "sourcePdfPage": 351, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mad_legacy_u16", "mnemonic": "v_mad_legacy_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD LEGACY U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply add of unsigned short values. Has non-standard rule for OPSEL.", "description": "Multiply add of unsigned short values. Has non-standard rule for OPSEL.", "syntax": "v_mad_legacy_u16", "operands": [], "dataTypes": ["u16"], "semantics": "tmp = S0.u16 * S1.u16 + S2.u16;\nif OPSEL.u4[3] then\nD0 = { tmp.u16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.u16 }\nendif", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Supports saturation (unsigned 16-bit integer domain). If OPSEL[3] is 0 Result is written to 16 LSBs of destination VGPR and hi 16 bits are written as 0 (this is different from V_MAD_U16). If OPSEL[3] is 1 Result is written to 16 MSBs of destination VGPR and lo 16 bits are preserved.", "sourcePdfPage": 350, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mad_mix_f32", "mnemonic": "v_mad_mix_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD MIX F32", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two inputs and add a third input where the inputs are a mix of half-precision float and single- precision float values.", "description": "Multiply two inputs and add a third input where the inputs are a mix of half-precision float and single- precision float values. Store the result into a vector register.", "syntax": "v_mad_mix_f32", "operands": [], "dataTypes": ["f32"], "semantics": "Size and location of the three inputs are controlled by { OPSEL_HI[i], OPSEL[i] }: 0=src[31:0], 1=src[31:0],\n2=src[15:0], 3=src[31:16]. For MIX opcodes the NEG_HI instruction field acts as an absolute-value modifier\nfor the three inputs.\ndeclare in : 32'F[3];\ndeclare S : 32'B[3];\nfor i in 0 : 2 do\nif !OPSEL_HI.u3[i] then\nin[i] = S[i].f32\nelsif OPSEL.u3[i] then\nin[i] = f16_to_f32(S[i][31 : 16].f16)\nelse\nin[i] = f16_to_f32(S[i][15 : 0].f16)\nendif\nendfor;\nD0[31 : 0].f32 = in[0] * in[1] + in[2]", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 267, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mad_mixhi_f16", "mnemonic": "v_mad_mixhi_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD MIXHI F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two inputs and add a third input where the inputs are a mix of half-precision float and single- precision float values.", "description": "Multiply two inputs and add a third input where the inputs are a mix of half-precision float and single- precision float values. Convert the result to a half-precision float. Store the result into the high bits of a vector register.", "syntax": "v_mad_mixhi_f16", "operands": [], "dataTypes": ["f16"], "semantics": "Size and location of the three inputs are controlled by { OPSEL_HI[i], OPSEL[i] }: 0=src[31:0], 1=src[31:0],\n2=src[15:0], 3=src[31:16]. For MIX opcodes the NEG_HI instruction field acts as an absolute-value modifier\nfor the three inputs.\ndeclare in : 32'F[3];\ndeclare S : 32'B[3];\nfor i in 0 : 2 do\nif !OPSEL_HI.u3[i] then\nin[i] = S[i].f32\nelsif OPSEL.u3[i] then\nin[i] = f16_to_f32(S[i][31 : 16].f16)\nelse\nin[i] = f16_to_f32(S[i][15 : 0].f16)\nendif\nendfor;\nD0[31 : 16].f16 = f32_to_f16(in[0] * in[1] + in[2])", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 268, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mad_mixlo_f16", "mnemonic": "v_mad_mixlo_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD MIXLO F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two inputs and add a third input where the inputs are a mix of half-precision float and single- precision float values.", "description": "Multiply two inputs and add a third input where the inputs are a mix of half-precision float and single- precision float values. Convert the result to a half-precision float. Store the result into the low bits of a vector register.", "syntax": "v_mad_mixlo_f16", "operands": [], "dataTypes": ["f16"], "semantics": "Size and location of the three inputs are controlled by { OPSEL_HI[i], OPSEL[i] }: 0=src[31:0], 1=src[31:0],\n2=src[15:0], 3=src[31:16]. For MIX opcodes the NEG_HI instruction field acts as an absolute-value modifier\nfor the three inputs.\ndeclare in : 32'F[3];\ndeclare S : 32'B[3];\nfor i in 0 : 2 do\nif !OPSEL_HI.u3[i] then\nin[i] = S[i].f32\nelsif OPSEL.u3[i] then\nin[i] = f16_to_f32(S[i][31 : 16].f16)\nelse\nin[i] = f16_to_f32(S[i][15 : 0].f16)\nendif\nendfor;\nD0[15 : 0].f16 = f32_to_f16(in[0] * in[1] + in[2])", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 267, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mad_nc_i64_i32", "mnemonic": "v_mad_nc_i64_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD NC I64 I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on i32/i64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_mad_nc_i64_i32", "operands": [], "dataTypes": ["i32", "i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_mad_nc_u64_u32", "mnemonic": "v_mad_nc_u64_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD NC U64 U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on u32/u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_mad_nc_u64_u32", "operands": [], "dataTypes": ["u32", "u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_mad_u16", "mnemonic": "v_mad_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two unsigned 16-bit integer inputs, add an unsigned 16-bit integer value from a third input, and store the result into a vector register.", "description": "Multiply two unsigned 16-bit integer inputs, add an unsigned 16-bit integer value from a third input, and store the result into a vector register.", "syntax": "v_mad_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u16 = S0.u16 * S1.u16 + S2.u16", "example": "v_mad_u16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Supports saturation (unsigned 16-bit integer domain). If OPSEL[3] is 0 the result is written to 16 LSBs of destination VGPR and the high 16 bits are preserved. If OPSEL[3] is 1 the result is written to 16 MSBs of destination VGPR and the low 16 bits are preserved.", "sourcePdfPage": 357, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mad_u16_gfx9", "mnemonic": "v_mad_u16_gfx9", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD U16 GFX9", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on u16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_mad_u16_gfx9", "operands": [], "dataTypes": ["u16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_mad_u32", "mnemonic": "v_mad_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_mad_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_mad_u32_u16", "mnemonic": "v_mad_u32_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD U32 U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two unsigned 16-bit integer inputs in the unsigned 32-bit integer domain, add an unsigned 32-bit integer value from a third input, and store…", "description": "Multiply two unsigned 16-bit integer inputs in the unsigned 32-bit integer domain, add an unsigned 32-bit integer value from a third input, and store the result as an unsigned 32-bit integer into a vector register.", "syntax": "v_mad_u32_u16", "operands": [], "dataTypes": ["u16", "u32"], "semantics": "D0.u32 = 32'U(S0.u16) * 32'U(S1.u16) + S2.u32", "example": "v_mad_u32_u16 v5, v1, v2, v3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 353, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mad_u32_u24", "mnemonic": "v_mad_u32_u24", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD U32 U24", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two unsigned 24-bit integer inputs in the unsigned 32-bit integer domain, add a unsigned 32-bit integer value from a third input, and store…", "description": "Multiply two unsigned 24-bit integer inputs in the unsigned 32-bit integer domain, add a unsigned 32-bit integer value from a third input, and store the result as an unsigned 32-bit integer into a vector register.", "syntax": "v_mad_u32_u24", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = 32'U(S0.u24) * 32'U(S1.u24) + S2.u32", "example": "v_mad_u32_u24 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 336, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mad_u64_u32", "mnemonic": "v_mad_u64_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAD U64 U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two unsigned integer inputs, add a third unsigned integer input, store the result into a 64-bit vector register and store the…", "description": "Multiply two unsigned integer inputs, add a third unsigned integer input, store the result into a 64-bit vector register and store the overflow/carryout into a scalar mask register.", "syntax": "v_mad_u64_u32", "operands": [], "dataTypes": ["u32", "u64"], "semantics": "{ D1.u1, D0.u64 } = 65'B(65'U(S0.u32) * 65'U(S1.u32) + 65'U(S2.u64))", "example": "v_mad_u64_u32 v[5:6], s6, s105, s105, s[6:7]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "In VOP3 the VCC destination may be an arbitrary SGPR-pair.", "sourcePdfPage": 349, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_madak_f16", "mnemonic": "v_madak_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MADAK F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two floating point inputs and add a literal constant, and store the result into a vector register. Implements IEEE rules.", "description": "Multiply two floating point inputs and add a literal constant, and store the result into a vector register. Implements IEEE rules.", "syntax": "v_madak_f16", "operands": [], "dataTypes": ["f16"], "semantics": "tmp = S0.f16 * S1.f16 + SIMM16.f16;\nD0 = { 16'0, tmp.f16 }", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This opcode cannot use the VOP3 encoding and cannot use input/output modifiers. Supports round mode, exception flags, saturation.", "sourcePdfPage": 179, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_madak_f32", "mnemonic": "v_madak_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MADAK F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two floating point inputs and add a literal constant, and store the result into a vector register.", "description": "Multiply two floating point inputs and add a literal constant, and store the result into a vector register.", "syntax": "v_madak_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_madmk_f16", "mnemonic": "v_madmk_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MADMK F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply a floating point input with a literal constant and add a second floating point input, and store the result into a vector register.", "description": "Multiply a floating point input with a literal constant and add a second floating point input, and store the result into a vector register. Implements IEEE rules.", "syntax": "v_madmk_f16", "operands": [], "dataTypes": ["f16"], "semantics": "tmp = S0.f16 * SIMM16.f16 + S1.f16;\nD0 = { 16'0, tmp.f16 }", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This opcode cannot use the VOP3 encoding and cannot use input/output modifiers. Supports round mode, exception flags, saturation.", "sourcePdfPage": 178, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_madmk_f32", "mnemonic": "v_madmk_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MADMK F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply a floating point input with a literal constant and add a second floating point input, and store the result into a vector register.", "description": "Multiply a floating point input with a literal constant and add a second floating point input, and store the result into a vector register.", "syntax": "v_madmk_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_max3_f16", "mnemonic": "v_max3_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX3 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of three half-precision float inputs and store the selected value into a vector register.", "description": "Select the maximum of three half-precision float inputs and store the selected value into a vector register.", "syntax": "v_max3_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = v_max_f16(v_max_f16(S0.f16, S1.f16), S2.f16)", "example": "v_max3_f16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 354, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max3_f32", "mnemonic": "v_max3_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX3 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of three single-precision float inputs and store the selected value into a vector register.", "description": "Select the maximum of three single-precision float inputs and store the selected value into a vector register.", "syntax": "v_max3_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = v_max_f32(v_max_f32(S0.f32, S1.f32), S2.f32)", "example": "v_max3_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 340, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max3_i16", "mnemonic": "v_max3_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX3 I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of three signed 16-bit integer inputs and store the selected value into a vector register.", "description": "Select the maximum of three signed 16-bit integer inputs and store the selected value into a vector register.", "syntax": "v_max3_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.i16 = v_max_i16(v_max_i16(S0.i16, S1.i16), S2.i16)", "example": "v_max3_i16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 354, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max3_i32", "mnemonic": "v_max3_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX3 I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of three signed 32-bit integer inputs and store the selected value into a vector register.", "description": "Select the maximum of three signed 32-bit integer inputs and store the selected value into a vector register.", "syntax": "v_max3_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = v_max_i32(v_max_i32(S0.i32, S1.i32), S2.i32)", "example": "v_max3_i32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 341, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max3_num_f16", "mnemonic": "v_max3_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX3 NUM F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of three half-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE maximumNumber() of three half-precision float inputs and store the selected value into a vector register.", "syntax": "v_max3_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_max3_num_f32", "mnemonic": "v_max3_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX3 NUM F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of three single-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE maximumNumber() of three single-precision float inputs and store the selected value into a vector register.", "syntax": "v_max3_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_max3_u16", "mnemonic": "v_max3_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX3 U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of three unsigned 16-bit integer inputs and store the selected value into a vector register.", "description": "Select the maximum of three unsigned 16-bit integer inputs and store the selected value into a vector register.", "syntax": "v_max3_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u16 = v_max_u16(v_max_u16(S0.u16, S1.u16), S2.u16)", "example": "v_max3_u16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 355, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max3_u32", "mnemonic": "v_max3_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX3 U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of three unsigned 32-bit integer inputs and store the selected value into a vector register.", "description": "Select the maximum of three unsigned 32-bit integer inputs and store the selected value into a vector register.", "syntax": "v_max3_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = v_max_u32(v_max_u32(S0.u32, S1.u32), S2.u32)", "example": "v_max3_u32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 341, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max_bf16", "mnemonic": "v_max_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_max_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_max_f16", "mnemonic": "v_max_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of two half-precision float inputs and store the result into a vector register.", "description": "Select the maximum of two half-precision float inputs and store the result into a vector register.", "syntax": "v_max_f16", "operands": [], "dataTypes": ["f16"], "semantics": "if (WAVE_MODE.IEEE && isSignalNAN(64'F(S0.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif (WAVE_MODE.IEEE && isSignalNAN(64'F(S1.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif ((64'F(S0.f16) == +0.0) && (64'F(S1.f16) == -0.0)) then\nD0.f16 = S0.f16\nelsif ((64'F(S0.f16) == -0.0) && (64'F(S1.f16) == +0.0)) then\nD0.f16 = S1.f16\nelsif WAVE_MODE.IEEE then\nD0.f16 = S0.f16 >= S1.f16 ? S0.f16 : S1.f16\nelse\nD0.f16 = S0.f16 > S1.f16 ? S0.f16 : S1.f16\nendif", "example": "v_max_f16 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "IEEE compliant. Supports denormals, round mode, exception flags, saturation.", "sourcePdfPage": 181, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max_f32", "mnemonic": "v_max_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of two single-precision float inputs and store the result into a vector register.", "description": "Select the maximum of two single-precision float inputs and store the result into a vector register.", "syntax": "v_max_f32", "operands": [], "dataTypes": ["f32"], "semantics": "if (WAVE_MODE.IEEE && isSignalNAN(64'F(S0.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif (WAVE_MODE.IEEE && isSignalNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((64'F(S0.f32) == +0.0) && (64'F(S1.f32) == -0.0)) then\nD0.f32 = S0.f32\nelsif ((64'F(S0.f32) == -0.0) && (64'F(S1.f32) == +0.0)) then\nD0.f32 = S1.f32\nelsif WAVE_MODE.IEEE then\nD0.f32 = S0.f32 >= S1.f32 ? S0.f32 : S1.f32\nelse\nD0.f32 = S0.f32 > S1.f32 ? S0.f32 : S1.f32\nendif", "example": "v_max_f32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 172, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max_f64", "mnemonic": "v_max_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of two double-precision float inputs and store the selected value into a vector register.", "description": "Select the maximum of two double-precision float inputs and store the selected value into a vector register.", "syntax": "v_max_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": "v_max_f64 v[5:6], -1, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max_i16", "mnemonic": "v_max_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of two signed 16-bit integer inputs and store the selected value into a vector register.", "description": "Select the maximum of two signed 16-bit integer inputs and store the selected value into a vector register.", "syntax": "v_max_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.i16 = S0.i16 >= S1.i16 ? S0.i16 : S1.i16", "example": "v_max_i16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 182, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max_i32", "mnemonic": "v_max_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of two signed 32-bit integer inputs and store the selected value into a vector register.", "description": "Select the maximum of two signed 32-bit integer inputs and store the selected value into a vector register.", "syntax": "v_max_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = S0.i32 >= S1.i32 ? S0.i32 : S1.i32", "example": "v_max_i32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 172, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max_i64", "mnemonic": "v_max_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX I64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on i64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_max_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_max_legacy_f32", "mnemonic": "v_max_legacy_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX LEGACY F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_max_legacy_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_max_num_f16", "mnemonic": "v_max_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX NUM F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of two half-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE maximumNumber() of two half-precision float inputs and store the selected value into a vector register.", "syntax": "v_max_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": "v_max_num_f16 v255, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max_num_f32", "mnemonic": "v_max_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX NUM F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of two single-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE maximumNumber() of two single-precision float inputs and store the selected value into a vector register.", "syntax": "v_max_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_max_num_f64", "mnemonic": "v_max_num_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX NUM F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of two double-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE maximumNumber() of two double-precision float inputs and store the selected value into a vector register.", "syntax": "v_max_num_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_max_u16", "mnemonic": "v_max_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 16-bit integer inputs and store the selected value into a vector register.", "description": "Select the maximum of two unsigned 16-bit integer inputs and store the selected value into a vector register.", "syntax": "v_max_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u16 = S0.u16 >= S1.u16 ? S0.u16 : S1.u16", "example": "v_max_u16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 182, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max_u32", "mnemonic": "v_max_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of two unsigned 32-bit integer inputs and store the selected value into a vector register.", "description": "Select the maximum of two unsigned 32-bit integer inputs and store the selected value into a vector register.", "syntax": "v_max_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = S0.u32 >= S1.u32 ? S0.u32 : S1.u32", "example": "v_max_u32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 173, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_max_u64", "mnemonic": "v_max_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAX U64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_max_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_maximum3_f16", "mnemonic": "v_maximum3_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXIMUM3 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximum() of three half-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE maximum() of three half-precision float inputs and store the selected value into a vector register.", "syntax": "v_maximum3_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_maximum3_f32", "mnemonic": "v_maximum3_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXIMUM3 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximum() of three single-precision float inputs and store the result into a vector register.", "description": "Select the IEEE maximum() of three single-precision float inputs and store the result into a vector register.", "syntax": "v_maximum3_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_maximum_f16", "mnemonic": "v_maximum_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXIMUM F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximum() of two half-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE maximum() of two half-precision float inputs and store the selected value into a vector register.", "syntax": "v_maximum_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_maximum_f32", "mnemonic": "v_maximum_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXIMUM F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximum() of two single-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE maximum() of two single-precision float inputs and store the selected value into a vector register.", "syntax": "v_maximum_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_maximum_f64", "mnemonic": "v_maximum_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXIMUM F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximum() of two double-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE maximum() of two double-precision float inputs and store the selected value into a vector register.", "syntax": "v_maximum_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_maximumminimum_f16", "mnemonic": "v_maximumminimum_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXIMUMMINIMUM F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximum() of the first two half-precision float inputs and then select the IEEE minimum() of that result and third half-precision…", "description": "Select the IEEE maximum() of the first two half-precision float inputs and then select the IEEE minimum() of that result and third half-precision float input. Store the final result into a vector register.", "syntax": "v_maximumminimum_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_maximumminimum_f32", "mnemonic": "v_maximumminimum_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXIMUMMINIMUM F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximum() of the first two single-precision float inputs and then select the IEEE minimum() of that result and third single-precision…", "description": "Select the IEEE maximum() of the first two single-precision float inputs and then select the IEEE minimum() of that result and third single-precision float input. Store the final result into a vector register.", "syntax": "v_maximumminimum_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_maxmin_f16", "mnemonic": "v_maxmin_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXMIN F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of the first two half-precision float inputs and then select the minimum of that result and third half-precision float input.", "description": "Select the maximum of the first two half-precision float inputs and then select the minimum of that result and third half-precision float input. Store the final result into a vector register.", "syntax": "v_maxmin_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": "v_maxmin_f16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_maxmin_f32", "mnemonic": "v_maxmin_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXMIN F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of the first two single-precision float inputs and then select the minimum of that result and third single-precision float input.", "description": "Select the maximum of the first two single-precision float inputs and then select the minimum of that result and third single-precision float input. Store the final result into a vector register.", "syntax": "v_maxmin_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_maxmin_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_maxmin_i32", "mnemonic": "v_maxmin_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXMIN I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of the first two signed 32-bit integer inputs and then select the minimum of that result and third signed 32-bit integer input.", "description": "Select the maximum of the first two signed 32-bit integer inputs and then select the minimum of that result and third signed 32-bit integer input. Store the final result into a vector register.", "syntax": "v_maxmin_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": "v_maxmin_i32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_maxmin_num_f16", "mnemonic": "v_maxmin_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXMIN NUM F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of the first two half-precision float inputs and then select the IEEE minimumNumber() of that result and third…", "description": "Select the IEEE maximumNumber() of the first two half-precision float inputs and then select the IEEE minimumNumber() of that result and third half-precision float input. Store the final result into a vector register.", "syntax": "v_maxmin_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_maxmin_num_f32", "mnemonic": "v_maxmin_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXMIN NUM F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE maximumNumber() of the first two single-precision float inputs and then select the IEEE minimumNumber() of that result and third…", "description": "Select the IEEE maximumNumber() of the first two single-precision float inputs and then select the IEEE minimumNumber() of that result and third single-precision float input. Store the final result into a vector register.", "syntax": "v_maxmin_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_maxmin_u32", "mnemonic": "v_maxmin_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MAXMIN U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the maximum of the first two unsigned 32-bit integer inputs and then select the minimum of that result and third unsigned 32-bit integer input.", "description": "Select the maximum of the first two unsigned 32-bit integer inputs and then select the minimum of that result and third unsigned 32-bit integer input. Store the final result into a vector register.", "syntax": "v_maxmin_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "v_maxmin_u32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mbcnt_hi_u32_b32", "mnemonic": "v_mbcnt_hi_u32_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MBCNT HI U32 B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "For each lane 32 <= N < 64, examine the N least significant bits of the first input and count how many of those bits are \"1\".", "description": "For each lane 32 <= N < 64, examine the N least significant bits of the first input and count how many of those bits are \"1\". For lane positions 0 <= N < 32 no bits are examined and the count is zero. Add this count to the value in the second input and store the result into a vector register.", "syntax": "v_mbcnt_hi_u32_b32", "operands": [], "dataTypes": ["b32", "u32"], "semantics": "", "example": "v_mbcnt_hi_u32_b32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mbcnt_lo_u32_b32", "mnemonic": "v_mbcnt_lo_u32_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MBCNT LO U32 B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "For each lane 0 <= N < 32, examine the N least significant bits of the first input and count how many of those bits are \"1\".", "description": "For each lane 0 <= N < 32, examine the N least significant bits of the first input and count how many of those bits are \"1\". For each lane 32 <= N < 64, all \"1\" bits in the first input are counted. Add this count to the value in the second input and store the result into a vector register.", "syntax": "v_mbcnt_lo_u32_b32", "operands": [], "dataTypes": ["b32", "u32"], "semantics": "", "example": "v_mbcnt_lo_u32_b32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_med3_f16", "mnemonic": "v_med3_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MED3 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the median of three half-precision float values and store the selected value into a vector register.", "description": "Select the median of three half-precision float values and store the selected value into a vector register.", "syntax": "v_med3_f16", "operands": [], "dataTypes": ["f16"], "semantics": "if (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)) || isNAN(64'F(S2.f16))) then\nD0.f16 = v_min3_f16(S0.f16, S1.f16, S2.f16)\nelsif v_max3_f16(S0.f16, S1.f16, S2.f16) == S0.f16 then\nD0.f16 = v_max_f16(S1.f16, S2.f16)\nelsif v_max3_f16(S0.f16, S1.f16, S2.f16) == S1.f16 then\nD0.f16 = v_max_f16(S0.f16, S2.f16)\nelse\nD0.f16 = v_max_f16(S0.f16, S1.f16)\nendif", "example": "v_med3_f16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 355, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_med3_f32", "mnemonic": "v_med3_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MED3 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the median of three single-precision float values and store the selected value into a vector register.", "description": "Select the median of three single-precision float values and store the selected value into a vector register.", "syntax": "v_med3_f32", "operands": [], "dataTypes": ["f32"], "semantics": "if (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)) || isNAN(64'F(S2.f32))) then\nD0.f32 = v_min3_f32(S0.f32, S1.f32, S2.f32)\nelsif v_max3_f32(S0.f32, S1.f32, S2.f32) == S0.f32 then\nD0.f32 = v_max_f32(S1.f32, S2.f32)\nelsif v_max3_f32(S0.f32, S1.f32, S2.f32) == S1.f32 then\nD0.f32 = v_max_f32(S0.f32, S2.f32)\nelse\nD0.f32 = v_max_f32(S0.f32, S1.f32)\nendif", "example": "v_med3_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 341, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_med3_i16", "mnemonic": "v_med3_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MED3 I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the median of three signed 16-bit integer values and store the selected value into a vector register.", "description": "Select the median of three signed 16-bit integer values and store the selected value into a vector register.", "syntax": "v_med3_i16", "operands": [], "dataTypes": ["i16"], "semantics": "if v_max3_i16(S0.i16, S1.i16, S2.i16) == S0.i16 then\nD0.i16 = v_max_i16(S1.i16, S2.i16)\nelsif v_max3_i16(S0.i16, S1.i16, S2.i16) == S1.i16 then\nD0.i16 = v_max_i16(S0.i16, S2.i16)\nelse\nD0.i16 = v_max_i16(S0.i16, S1.i16)\nendif", "example": "v_med3_i16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 355, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_med3_i32", "mnemonic": "v_med3_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MED3 I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the median of three signed 32-bit integer values and store the selected value into a vector register.", "description": "Select the median of three signed 32-bit integer values and store the selected value into a vector register.", "syntax": "v_med3_i32", "operands": [], "dataTypes": ["i32"], "semantics": "if v_max3_i32(S0.i32, S1.i32, S2.i32) == S0.i32 then\nD0.i32 = v_max_i32(S1.i32, S2.i32)\nelsif v_max3_i32(S0.i32, S1.i32, S2.i32) == S1.i32 then\nD0.i32 = v_max_i32(S0.i32, S2.i32)\nelse\nD0.i32 = v_max_i32(S0.i32, S1.i32)\nendif", "example": "v_med3_i32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 341, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_med3_num_f16", "mnemonic": "v_med3_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MED3 NUM F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the median of three half-precision float inputs and store the selected value into a vector register.", "description": "Select the median of three half-precision float inputs and store the selected value into a vector register.", "syntax": "v_med3_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_med3_num_f32", "mnemonic": "v_med3_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MED3 NUM F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the median of three single-precision float inputs and store the selected value into a vector register.", "description": "Select the median of three single-precision float inputs and store the selected value into a vector register.", "syntax": "v_med3_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_med3_u16", "mnemonic": "v_med3_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MED3 U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the median of three unsigned 16-bit integer values and store the selected value into a vector register.", "description": "Select the median of three unsigned 16-bit integer values and store the selected value into a vector register.", "syntax": "v_med3_u16", "operands": [], "dataTypes": ["u16"], "semantics": "if v_max3_u16(S0.u16, S1.u16, S2.u16) == S0.u16 then\nD0.u16 = v_max_u16(S1.u16, S2.u16)\nelsif v_max3_u16(S0.u16, S1.u16, S2.u16) == S1.u16 then\nD0.u16 = v_max_u16(S0.u16, S2.u16)\nelse\nD0.u16 = v_max_u16(S0.u16, S1.u16)\nendif", "example": "v_med3_u16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 355, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_med3_u32", "mnemonic": "v_med3_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MED3 U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the median of three unsigned 32-bit integer values and store the selected value into a vector register.", "description": "Select the median of three unsigned 32-bit integer values and store the selected value into a vector register.", "syntax": "v_med3_u32", "operands": [], "dataTypes": ["u32"], "semantics": "if v_max3_u32(S0.u32, S1.u32, S2.u32) == S0.u32 then\nD0.u32 = v_max_u32(S1.u32, S2.u32)\nelsif v_max3_u32(S0.u32, S1.u32, S2.u32) == S1.u32 then\nD0.u32 = v_max_u32(S0.u32, S2.u32)\nelse\nD0.u32 = v_max_u32(S0.u32, S1.u32)\nendif", "example": "v_med3_u32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 341, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mfma_f32_16x16x128_f8f6f4", "mnemonic": "v_mfma_f32_16x16x128_f8f6f4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 16X16X128 F8F6F4", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x128 matrix in the first input by the 128x16 matrix in the second input and add the 16x16 matrix in the third input using fused…", "description": "Multiply the 16x128 matrix in the first input by the 128x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_16x16x128_f8f6f4", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mfma_f32_16x16x16_bf16", "mnemonic": "v_mfma_f32_16x16x16_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 16X16X16 BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x16 matrix in the first input by the 16x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x16 matrix in the first input by the 16x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_16x16x16_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (16x16) * B (16x16) + C (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrices A and B are BF16 float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 4 passes.", "sourcePdfPage": 280, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_16x16x16_f16", "mnemonic": "v_mfma_f32_16x16x16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 16X16X16 F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x16 matrix in the first input by the 16x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x16 matrix in the first input by the 16x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_16x16x16_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "D = A (16x16) * B (16x16) + C (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrices A and B are half-precision float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 4 passes.", "sourcePdfPage": 276, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_16x16x16f16", "mnemonic": "v_mfma_f32_16x16x16f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 16X16X16F16", "category": "Matrix Core Operations", "instructionClass": "matrix", "summary": "Matrix-fused-multiply-add: cooperative 16x16x16 matrix-multiply-accumulate on matrix-core hardware, fp16 inputs, fp32 accumulate.", "description": "Multiply the 16x16 matrix in the first input by the 16x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_16x16x16f16 D, A, B, C", "operands": [{"name": "D", "desc": "Accumulator fragment (destination, VGPR range)"}, {"name": "A", "desc": "Matrix A fragment (VGPR range)"}, {"name": "B", "desc": "Matrix B fragment (VGPR range)"}, {"name": "C", "desc": "Accumulator fragment (input, VGPR range)"}], "dataTypes": ["f32"], "semantics": "D = A * B + C for a 16x16x16 tile, computed cooperatively across the wavefront; operand fragments are distributed across lanes per a hardware-defined layout specific to the MFMA family and target.", "example": "v_mfma_f32_16x16x16f16  a[0:3], v[0:3], v[4:7], a[0:3]   // 16x16x16 MFMA accumulate", "exampleSource": null, "encoding": {"format": "VOP3P-MAI", "widthBits": 32}, "executionUnit": "Matrix Core Unit", "registerClasses": ["VGPR", "AGPR"], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": ["gfx1100"], "architecturalNotes": "Matrix-core (MFMA) instructions are a CDNA-family feature; gfx1100 (RDNA3) does not implement this specific MFMA variant - see the AMDGPU landing page's target compatibility notes.", "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_mfma_f32_16x16x1_4b_f32", "mnemonic": "v_mfma_f32_16x16x1_4b_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 16X16X1 4B F32", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x1 matrix in the first input by the 1x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x1 matrix in the first input by the 1x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_16x16x1_4b_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (16x1) * B (1x16) + C (16x16)\nThis instruction performs 4 matrix multiplies. Each operand contains 4 matrices back to back, and each matrix\nhas elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column\ndot products are distributed across the vector ALU for higher performance. The result matrices are stored\nback-to-back in the destination vector registers.\nMatrices A and B are single-precision float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 273, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_16x16x32_bf16", "mnemonic": "v_mfma_f32_16x16x32_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 16X16X32 BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x32 matrix in the first input by the 32x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x32 matrix in the first input by the 32x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_16x16x32_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mfma_f32_16x16x32_f16", "mnemonic": "v_mfma_f32_16x16x32_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 16X16X32 F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x32 matrix in the first input by the 32x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x32 matrix in the first input by the 32x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_16x16x32_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mfma_f32_16x16x4_4b_bf16", "mnemonic": "v_mfma_f32_16x16x4_4b_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 16X16X4 4B BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x4 matrix in the first input by the 4x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x4 matrix in the first input by the 4x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_16x16x4_4b_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (16x4) * B (4x16) + C (16x16)\nThis instruction performs 4 matrix multiplies. Each operand contains 4 matrices back to back, and each matrix\nhas elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column\ndot products are distributed across the vector ALU for higher performance. The result matrices are stored\nback-to-back in the destination vector registers.\nMatrices A and B are BF16 float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 279, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_16x16x4_4b_f16", "mnemonic": "v_mfma_f32_16x16x4_4b_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 16X16X4 4B F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x4 matrix in the first input by the 4x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x4 matrix in the first input by the 4x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_16x16x4_4b_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "D = A (16x4) * B (4x16) + C (16x16)\nThis instruction performs 4 matrix multiplies. Each operand contains 4 matrices back to back, and each matrix\nhas elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column\ndot products are distributed across the vector ALU for higher performance. The result matrices are stored\nback-to-back in the destination vector registers.\nMatrices A and B are half-precision float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 275, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_16x16x4_f32", "mnemonic": "v_mfma_f32_16x16x4_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 16X16X4 F32", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x4 matrix in the first input by the 4x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x4 matrix in the first input by the 4x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_16x16x4_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (16x4) * B (4x16) + C (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrices A and B are single-precision float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 274, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_16x16x8_xf32", "mnemonic": "v_mfma_f32_16x16x8_xf32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 16X16X8 XF32", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x8 matrix in the first input by the 8x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x8 matrix in the first input by the 8x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_16x16x8_xf32", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (16x8) * B (8x16) + C (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrices A and B are single-precision float format. Matrices C and D are single-precision float format. XF32 is a\nFP32 operation with FP32 inputs and outputs but implemented at reduced intermediate precision where\nmantissa is truncated to 10 bits (not including leading 1 for non-zero values) and results are accumulated into\nFP32 value with 23 bit mantissa.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 4 passes.", "sourcePdfPage": 272, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_32x32x16_bf16", "mnemonic": "v_mfma_f32_32x32x16_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 32X32X16 BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x16 matrix in the first input by the 16x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x16 matrix in the first input by the 16x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_32x32x16_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mfma_f32_32x32x16_f16", "mnemonic": "v_mfma_f32_32x32x16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 32X32X16 F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x16 matrix in the first input by the 16x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x16 matrix in the first input by the 16x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_32x32x16_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mfma_f32_32x32x1_2b_f32", "mnemonic": "v_mfma_f32_32x32x1_2b_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 32X32X1 2B F32", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x1 matrix in the first input by the 1x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x1 matrix in the first input by the 1x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_32x32x1_2b_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (32x1) * B (1x32) + C (32x32)\nThis instruction performs 2 matrix multiplies. Each operand contains 2 matrices back to back, and each matrix\nhas elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column\ndot products are distributed across the vector ALU for higher performance. The result matrices are stored\nback-to-back in the destination vector registers.\nMatrices A and B are single-precision float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 16 passes.", "sourcePdfPage": 273, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_32x32x2_f32", "mnemonic": "v_mfma_f32_32x32x2_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 32X32X2 F32", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x2 matrix in the first input by the 2x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x2 matrix in the first input by the 2x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_32x32x2_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (32x2) * B (2x32) + C (32x32)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrices A and B are single-precision float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 16 passes.", "sourcePdfPage": 274, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_32x32x4_2b_bf16", "mnemonic": "v_mfma_f32_32x32x4_2b_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 32X32X4 2B BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x4 matrix in the first input by the 4x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x4 matrix in the first input by the 4x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_32x32x4_2b_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (32x4) * B (4x32) + C (32x32)\nThis instruction performs 2 matrix multiplies. Each operand contains 2 matrices back to back, and each matrix\nhas elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column\ndot products are distributed across the vector ALU for higher performance. The result matrices are stored\nback-to-back in the destination vector registers.\nMatrices A and B are BF16 float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 16 passes.", "sourcePdfPage": 279, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_32x32x4_2b_f16", "mnemonic": "v_mfma_f32_32x32x4_2b_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 32X32X4 2B F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x4 matrix in the first input by the 4x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x4 matrix in the first input by the 4x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_32x32x4_2b_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "D = A (32x4) * B (4x32) + C (32x32)\nThis instruction performs 2 matrix multiplies. Each operand contains 2 matrices back to back, and each matrix\nhas elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column\ndot products are distributed across the vector ALU for higher performance. The result matrices are stored\nback-to-back in the destination vector registers.\nMatrices A and B are half-precision float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 16 passes.", "sourcePdfPage": 275, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_32x32x4_xf32", "mnemonic": "v_mfma_f32_32x32x4_xf32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 32X32X4 XF32", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x4 matrix in the first input by the 4x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x4 matrix in the first input by the 4x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_32x32x4_xf32", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (32x4) * B (4x32) + C (32x32)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrices A and B are single-precision float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 272, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_32x32x64_f8f6f4", "mnemonic": "v_mfma_f32_32x32x64_f8f6f4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 32X32X64 F8F6F4", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x64 matrix in the first input by the 64x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x64 matrix in the first input by the 64x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_32x32x64_f8f6f4", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mfma_f32_32x32x8_bf16", "mnemonic": "v_mfma_f32_32x32x8_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 32X32X8 BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x8 matrix in the first input by the 8x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x8 matrix in the first input by the 8x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_32x32x8_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (32x8) * B (8x32) + C (32x32)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrices A and B are BF16 float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 280, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_32x32x8_f16", "mnemonic": "v_mfma_f32_32x32x8_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 32X32X8 F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x8 matrix in the first input by the 8x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x8 matrix in the first input by the 8x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_32x32x8_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "D = A (32x8) * B (8x32) + C (32x32)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrices A and B are half-precision float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 276, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_4x4x1_16b_f32", "mnemonic": "v_mfma_f32_4x4x1_16b_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 4X4X1 16B F32", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 4x1 matrix in the first input by the 1x4 matrix in the second input and add the 4x4 matrix in the third input using fused multiply add.", "description": "Multiply the 4x1 matrix in the first input by the 1x4 matrix in the second input and add the 4x4 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_4x4x1_16b_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (4x1) * B (1x4) + C (4x4)\nThis instruction performs 16 matrix multiplies. Each operand contains 16 matrices back to back, and each\nmatrix has elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column dot products are distributed across the vector ALU for higher performance. The result matrices are\nstored back-to-back in the destination vector registers.\nMatrices A and B are single-precision float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 2 passes.", "sourcePdfPage": 273, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_4x4x4_16b_bf16", "mnemonic": "v_mfma_f32_4x4x4_16b_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 4X4X4 16B BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 4x4 matrix in the first input by the 4x4 matrix in the second input and add the 4x4 matrix in the third input using fused multiply add.", "description": "Multiply the 4x4 matrix in the first input by the 4x4 matrix in the second input and add the 4x4 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_4x4x4_16b_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (4x4) * B (4x4) + C (4x4)\nThis instruction performs 16 matrix multiplies. Each operand contains 16 matrices back to back, and each\nmatrix has elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column dot products are distributed across the vector ALU for higher performance. The result matrices are\nstored back-to-back in the destination vector registers.\nMatrices A and B are BF16 float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 2 passes.", "sourcePdfPage": 280, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f32_4x4x4_16b_f16", "mnemonic": "v_mfma_f32_4x4x4_16b_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F32 4X4X4 16B F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 4x4 matrix in the first input by the 4x4 matrix in the second input and add the 4x4 matrix in the third input using fused multiply add.", "description": "Multiply the 4x4 matrix in the first input by the 4x4 matrix in the second input and add the 4x4 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f32_4x4x4_16b_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "D = A (4x4) * B (4x4) + C (4x4)\nThis instruction performs 16 matrix multiplies. Each operand contains 16 matrices back to back, and each\nmatrix has elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column dot products are distributed across the vector ALU for higher performance. The result matrices are\nstored back-to-back in the destination vector registers.\nMatrices A and B are half-precision float format. Matrices C and D are single-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 2 passes.", "sourcePdfPage": 275, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f64_16x16x4_f64", "mnemonic": "v_mfma_f64_16x16x4_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F64 16X16X4 F64", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x4 matrix in the first input by the 4x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x4 matrix in the first input by the 4x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f64_16x16x4_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D = A (16x4) * B (4x16) + C (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrices A and B are double-precision float format. Matrices C and D are double-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 284, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_f64_4x4x4_4b_f64", "mnemonic": "v_mfma_f64_4x4x4_4b_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA F64 4X4X4 4B F64", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 4x4 matrix in the first input by the 4x4 matrix in the second input and add the 4x4 matrix in the third input using fused multiply add.", "description": "Multiply the 4x4 matrix in the first input by the 4x4 matrix in the second input and add the 4x4 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_f64_4x4x4_4b_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D = A (4x4) * B (4x4) + C (4x4)\nThis instruction performs 4 matrix multiplies. Each operand contains 4 matrices back to back, and each matrix\nhas elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column\ndot products are distributed across the vector ALU for higher performance. The result matrices are stored\nback-to-back in the destination vector registers.\nMatrices A and B are double-precision float format. Matrices C and D are double-precision float format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 4 passes.", "sourcePdfPage": 284, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_i32_16x16x32_i8", "mnemonic": "v_mfma_i32_16x16x32_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA I32 16X16X32 I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x32 matrix in the first input by the 32x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x32 matrix in the first input by the 32x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_i32_16x16x32_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "D = A (16x32) * B (32x16) + C (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrices A and B are signed 8-bit integer format. Matrices C and D are signed 32-bit integer format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 4 passes.", "sourcePdfPage": 278, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_i32_16x16x4_4b_i8", "mnemonic": "v_mfma_i32_16x16x4_4b_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA I32 16X16X4 4B I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x4 matrix in the first input by the 4x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x4 matrix in the first input by the 4x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_i32_16x16x4_4b_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "D = A (16x4) * B (4x16) + C (16x16)\nThis instruction performs 4 matrix multiplies. Each operand contains 4 matrices back to back, and each matrix\nhas elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column\ndot products are distributed across the vector ALU for higher performance. The result matrices are stored\nback-to-back in the destination vector registers.\nMatrices A and B are signed 8-bit integer format. Matrices C and D are signed 32-bit integer format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 277, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_i32_16x16x64_i8", "mnemonic": "v_mfma_i32_16x16x64_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA I32 16X16X64 I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x64 matrix in the first input by the 64x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply…", "description": "Multiply the 16x64 matrix in the first input by the 64x16 matrix in the second input and add the 16x16 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_i32_16x16x64_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mfma_i32_32x32x16_i8", "mnemonic": "v_mfma_i32_32x32x16_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA I32 32X32X16 I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x16 matrix in the first input by the 16x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x16 matrix in the first input by the 16x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_i32_32x32x16_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "D = A (32x16) * B (16x32) + C (32x32)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrices A and B are signed 8-bit integer format. Matrices C and D are signed 32-bit integer format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx942"], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 278, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_i32_32x32x32_i8", "mnemonic": "v_mfma_i32_32x32x32_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA I32 32X32X32 I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x32 matrix in the first input by the 32x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x32 matrix in the first input by the 32x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_i32_32x32x32_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_mfma_i32_32x32x4_2b_i8", "mnemonic": "v_mfma_i32_32x32x4_2b_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA I32 32X32X4 2B I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x4 matrix in the first input by the 4x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply…", "description": "Multiply the 32x4 matrix in the first input by the 4x32 matrix in the second input and add the 32x32 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_i32_32x32x4_2b_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "D = A (32x4) * B (4x32) + C (32x32)\nThis instruction performs 2 matrix multiplies. Each operand contains 2 matrices back to back, and each matrix\nhas elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column\ndot products are distributed across the vector ALU for higher performance. The result matrices are stored\nback-to-back in the destination vector registers.\nMatrices A and B are signed 8-bit integer format. Matrices C and D are signed 32-bit integer format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 16 passes.", "sourcePdfPage": 277, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_i32_4x4x4_16b_i8", "mnemonic": "v_mfma_i32_4x4x4_16b_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA I32 4X4X4 16B I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 4x4 matrix in the first input by the 4x4 matrix in the second input and add the 4x4 matrix in the third input using fused multiply add.", "description": "Multiply the 4x4 matrix in the first input by the 4x4 matrix in the second input and add the 4x4 matrix in the third input using fused multiply add. Store the resulting matrix into vector registers.", "syntax": "v_mfma_i32_4x4x4_16b_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "D = A (4x4) * B (4x4) + C (4x4)\nThis instruction performs 16 matrix multiplies. Each operand contains 16 matrices back to back, and each\nmatrix has elements distributed across all lanes of the wave. Each matrix multiple is computed and the row-column dot products are distributed across the vector ALU for higher performance. The result matrices are\nstored back-to-back in the destination vector registers.\nMatrices A and B are signed 8-bit integer format. Matrices C and D are signed 32-bit integer format.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 2 passes.", "sourcePdfPage": 277, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mfma_ld_scale_b32", "mnemonic": "v_mfma_ld_scale_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MFMA LD SCALE B32", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_mfma_ld_scale_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_min3_f16", "mnemonic": "v_min3_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN3 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of three half-precision float inputs and store the selected value into a vector register.", "description": "Select the minimum of three half-precision float inputs and store the selected value into a vector register.", "syntax": "v_min3_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = v_min_f16(v_min_f16(S0.f16, S1.f16), S2.f16)", "example": "v_min3_f16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 354, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min3_f32", "mnemonic": "v_min3_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN3 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of three single-precision float inputs and store the selected value into a vector register.", "description": "Select the minimum of three single-precision float inputs and store the selected value into a vector register.", "syntax": "v_min3_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = v_min_f32(v_min_f32(S0.f32, S1.f32), S2.f32)", "example": "v_min3_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 340, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min3_i16", "mnemonic": "v_min3_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN3 I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of three signed 16-bit integer inputs and store the selected value into a vector register.", "description": "Select the minimum of three signed 16-bit integer inputs and store the selected value into a vector register.", "syntax": "v_min3_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.i16 = v_min_i16(v_min_i16(S0.i16, S1.i16), S2.i16)", "example": "v_min3_i16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 354, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min3_i32", "mnemonic": "v_min3_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN3 I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of three signed 32-bit integer inputs and store the selected value into a vector register.", "description": "Select the minimum of three signed 32-bit integer inputs and store the selected value into a vector register.", "syntax": "v_min3_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = v_min_i32(v_min_i32(S0.i32, S1.i32), S2.i32)", "example": "v_min3_i32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 340, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min3_num_f16", "mnemonic": "v_min3_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN3 NUM F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of three half-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE minimumNumber() of three half-precision float inputs and store the selected value into a vector register.", "syntax": "v_min3_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_min3_num_f32", "mnemonic": "v_min3_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN3 NUM F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of three single-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE minimumNumber() of three single-precision float inputs and store the selected value into a vector register.", "syntax": "v_min3_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_min3_u16", "mnemonic": "v_min3_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN3 U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of three unsigned 16-bit integer inputs and store the selected value into a vector register.", "description": "Select the minimum of three unsigned 16-bit integer inputs and store the selected value into a vector register.", "syntax": "v_min3_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u16 = v_min_u16(v_min_u16(S0.u16, S1.u16), S2.u16)", "example": "v_min3_u16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 354, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min3_u32", "mnemonic": "v_min3_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN3 U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of three unsigned 32-bit integer inputs and store the selected value into a vector register.", "description": "Select the minimum of three unsigned 32-bit integer inputs and store the selected value into a vector register.", "syntax": "v_min3_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = v_min_u32(v_min_u32(S0.u32, S1.u32), S2.u32)", "example": "v_min3_u32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 340, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min_f16", "mnemonic": "v_min_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of two half-precision float inputs and store the result into a vector register.", "description": "Select the minimum of two half-precision float inputs and store the result into a vector register.", "syntax": "v_min_f16", "operands": [], "dataTypes": ["f16"], "semantics": "if (WAVE_MODE.IEEE && isSignalNAN(64'F(S0.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif (WAVE_MODE.IEEE && isSignalNAN(64'F(S1.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif ((64'F(S0.f16) == +0.0) && (64'F(S1.f16) == -0.0)) then\nD0.f16 = S1.f16\nelsif ((64'F(S0.f16) == -0.0) && (64'F(S1.f16) == +0.0)) then\nD0.f16 = S0.f16\nelse\n// Note: there's no IEEE case here like there is for V_MAX_F16.\nD0.f16 = S0.f16 < S1.f16 ? S0.f16 : S1.f16\nendif", "example": "v_min_f16 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "IEEE compliant. Supports denormals, round mode, exception flags, saturation.", "sourcePdfPage": 181, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min_f32", "mnemonic": "v_min_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of two single-precision float inputs and store the result into a vector register.", "description": "Select the minimum of two single-precision float inputs and store the result into a vector register.", "syntax": "v_min_f32", "operands": [], "dataTypes": ["f32"], "semantics": "if (WAVE_MODE.IEEE && isSignalNAN(64'F(S0.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif (WAVE_MODE.IEEE && isSignalNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((64'F(S0.f32) == +0.0) && (64'F(S1.f32) == -0.0)) then\nD0.f32 = S1.f32\nelsif ((64'F(S0.f32) == -0.0) && (64'F(S1.f32) == +0.0)) then\nD0.f32 = S0.f32\nelse\n// Note: there's no IEEE case here like there is for V_MAX_F32.\nD0.f32 = S0.f32 < S1.f32 ? S0.f32 : S1.f32\nendif", "example": "v_min_f32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 171, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min_f64", "mnemonic": "v_min_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of two double-precision float inputs and store the selected value into a vector register.", "description": "Select the minimum of two double-precision float inputs and store the selected value into a vector register.", "syntax": "v_min_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": "v_min_f64 v[5:6], -1, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min_i16", "mnemonic": "v_min_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of two signed 16-bit integer inputs and store the selected value into a vector register.", "description": "Select the minimum of two signed 16-bit integer inputs and store the selected value into a vector register.", "syntax": "v_min_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.i16 = S0.i16 < S1.i16 ? S0.i16 : S1.i16", "example": "v_min_i16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 182, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min_i32", "mnemonic": "v_min_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of two signed 32-bit integer inputs and store the selected value into a vector register.", "description": "Select the minimum of two signed 32-bit integer inputs and store the selected value into a vector register.", "syntax": "v_min_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = S0.i32 < S1.i32 ? S0.i32 : S1.i32", "example": "v_min_i32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 172, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min_i64", "mnemonic": "v_min_i64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN I64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on i64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_min_i64", "operands": [], "dataTypes": ["i64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_min_legacy_f32", "mnemonic": "v_min_legacy_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN LEGACY F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_min_legacy_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_min_num_f16", "mnemonic": "v_min_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN NUM F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of two half-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE minimumNumber() of two half-precision float inputs and store the selected value into a vector register.", "syntax": "v_min_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": "v_min_num_f16 v255, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min_num_f32", "mnemonic": "v_min_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN NUM F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of two single-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE minimumNumber() of two single-precision float inputs and store the selected value into a vector register.", "syntax": "v_min_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_min_num_f64", "mnemonic": "v_min_num_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN NUM F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of two double-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE minimumNumber() of two double-precision float inputs and store the selected value into a vector register.", "syntax": "v_min_num_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_min_u16", "mnemonic": "v_min_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 16-bit integer inputs and store the selected value into a vector register.", "description": "Select the minimum of two unsigned 16-bit integer inputs and store the selected value into a vector register.", "syntax": "v_min_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u16 = S0.u16 < S1.u16 ? S0.u16 : S1.u16", "example": "v_min_u16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 182, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min_u32", "mnemonic": "v_min_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of two unsigned 32-bit integer inputs and store the selected value into a vector register.", "description": "Select the minimum of two unsigned 32-bit integer inputs and store the selected value into a vector register.", "syntax": "v_min_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = S0.u32 < S1.u32 ? S0.u32 : S1.u32", "example": "v_min_u32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 173, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_min_u64", "mnemonic": "v_min_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MIN U64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_min_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_minimum3_f16", "mnemonic": "v_minimum3_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINIMUM3 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimum() of three half-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE minimum() of three half-precision float inputs and store the selected value into a vector register.", "syntax": "v_minimum3_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_minimum3_f32", "mnemonic": "v_minimum3_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINIMUM3 F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimum() of three single-precision float inputs and store the result into a vector register.", "description": "Select the IEEE minimum() of three single-precision float inputs and store the result into a vector register.", "syntax": "v_minimum3_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_minimum_f16", "mnemonic": "v_minimum_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINIMUM F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimum() of two half-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE minimum() of two half-precision float inputs and store the selected value into a vector register.", "syntax": "v_minimum_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_minimum_f32", "mnemonic": "v_minimum_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINIMUM F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimum() of two single-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE minimum() of two single-precision float inputs and store the selected value into a vector register.", "syntax": "v_minimum_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_minimum_f64", "mnemonic": "v_minimum_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINIMUM F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimum() of two double-precision float inputs and store the selected value into a vector register.", "description": "Select the IEEE minimum() of two double-precision float inputs and store the selected value into a vector register.", "syntax": "v_minimum_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_minimummaximum_f16", "mnemonic": "v_minimummaximum_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINIMUMMAXIMUM F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimum() of the first two half-precision float inputs and then select the IEEE maximum() of that result and third half-precision…", "description": "Select the IEEE minimum() of the first two half-precision float inputs and then select the IEEE maximum() of that result and third half-precision float input. Store the final result into a vector register.", "syntax": "v_minimummaximum_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_minimummaximum_f32", "mnemonic": "v_minimummaximum_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINIMUMMAXIMUM F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimum() of the first two single-precision float inputs and then select the IEEE maximum() of that result and third single-precision…", "description": "Select the IEEE minimum() of the first two single-precision float inputs and then select the IEEE maximum() of that result and third single-precision float input. Store the final result into a vector register.", "syntax": "v_minimummaximum_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_minmax_f16", "mnemonic": "v_minmax_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINMAX F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of the first two half-precision float inputs and then select the maximum of that result and third half-precision float input.", "description": "Select the minimum of the first two half-precision float inputs and then select the maximum of that result and third half-precision float input. Store the final result into a vector register.", "syntax": "v_minmax_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": "v_minmax_f16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_minmax_f32", "mnemonic": "v_minmax_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINMAX F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of the first two single-precision float inputs and then select the maximum of that result and third single-precision float input.", "description": "Select the minimum of the first two single-precision float inputs and then select the maximum of that result and third single-precision float input. Store the final result into a vector register.", "syntax": "v_minmax_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_minmax_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_minmax_i32", "mnemonic": "v_minmax_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINMAX I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of the first two signed 32-bit integer inputs and then select the maximum of that result and third signed 32-bit integer input.", "description": "Select the minimum of the first two signed 32-bit integer inputs and then select the maximum of that result and third signed 32-bit integer input. Store the final result into a vector register.", "syntax": "v_minmax_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": "v_minmax_i32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_minmax_num_f16", "mnemonic": "v_minmax_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINMAX NUM F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of the first two half-precision float inputs and then select the IEEE maximumNumber() of that result and third…", "description": "Select the IEEE minimumNumber() of the first two half-precision float inputs and then select the IEEE maximumNumber() of that result and third half-precision float input. Store the final result into a vector register.", "syntax": "v_minmax_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_minmax_num_f32", "mnemonic": "v_minmax_num_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINMAX NUM F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the IEEE minimumNumber() of the first two single-precision float inputs and then select the IEEE maximumNumber() of that result and third…", "description": "Select the IEEE minimumNumber() of the first two single-precision float inputs and then select the IEEE maximumNumber() of that result and third single-precision float input. Store the final result into a vector register.", "syntax": "v_minmax_num_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_minmax_u32", "mnemonic": "v_minmax_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MINMAX U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Select the minimum of the first two unsigned 32-bit integer inputs and then select the maximum of that result and third unsigned 32-bit integer input.", "description": "Select the minimum of the first two unsigned 32-bit integer inputs and then select the maximum of that result and third unsigned 32-bit integer input. Store the final result into a vector register.", "syntax": "v_minmax_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": "v_minmax_u32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mov_b16", "mnemonic": "v_mov_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MOV B16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Move 16-bit data from a vector input into a vector register.", "description": "Move 16-bit data from a vector input into a vector register.", "syntax": "v_mov_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "v_mov_b16_e32 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mov_b32", "mnemonic": "v_mov_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MOV B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Move 32-bit data from a vector input into a vector register.", "description": "Move 32-bit data from a vector input into a vector register.", "syntax": "v_mov_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.b32 = S0.b32", "example": "v_mov_b32 v0, v1    // Move into v0 from v1\nv_mov_b32 v0, -v1   // Set v0 to the negation of v1\nv_mov_b32 v0, abs(v1)   // Set v0 to the absolute value of v1", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Floating-point modifiers are valid for this instruction if S0 is a 32-bit floating point value. This instruction is suitable for negating or taking the absolute value of a floating-point value.", "sourcePdfPage": 186, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_mov_b64", "mnemonic": "v_mov_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MOV B64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Move data from a 64-bit vector input into a vector register.", "description": "Move data from a 64-bit vector input into a vector register.", "syntax": "v_mov_b64", "operands": [], "dataTypes": ["b64"], "semantics": "D0.b64 = S0.b64", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Floating-point modifiers are valid for this instruction if S0.u64 is a 64-bit floating point value. This instruction is suitable for negating or taking the absolute value of a floating-point value.", "sourcePdfPage": 203, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_movreld_b32", "mnemonic": "v_movreld_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MOVRELD B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Move data from a vector input into a relatively-indexed vector register.", "description": "Move data from a vector input into a relatively-indexed vector register.", "syntax": "v_movreld_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "v_movreld_b32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_movrels_b32", "mnemonic": "v_movrels_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MOVRELS B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Move data from a relatively-indexed vector register into another vector register.", "description": "Move data from a relatively-indexed vector register into another vector register.", "syntax": "v_movrels_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "v_movrels_b32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_movrelsd_b32", "mnemonic": "v_movrelsd_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MOVRELSD B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Move data from a relatively-indexed vector register into another relatively-indexed vector register.", "description": "Move data from a relatively-indexed vector register into another relatively-indexed vector register.", "syntax": "v_movrelsd_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "v_movrelsd_b32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mqsad_pk_u16_u8", "mnemonic": "v_mqsad_pk_u16_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MQSAD PK U16 U8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Perform the V_MSAD_U8 operation four times using different slices of the first array, all entries of the second array and each entry of the third…", "description": "Perform the V_MSAD_U8 operation four times using different slices of the first array, all entries of the second array and each entry of the third array. Truncate each result to 16 bits, pack the values into a 4-entry array and store the array into a vector register. The first input is an 8-entry array of unsigned 8-bit integers, the second input is a 4-entry array of unsigned 8-bit integers and the third input is a 4-entry array of unsigned 16-bit integers.", "syntax": "v_mqsad_pk_u16_u8", "operands": [], "dataTypes": ["u16", "u8"], "semantics": "tmp[63 : 48] = 16'B(v_msad_u8(S0[55 : 24], S1[31 : 0], S2[63 : 48].u32));\ntmp[47 : 32] = 16'B(v_msad_u8(S0[47 : 16], S1[31 : 0], S2[47 : 32].u32));\ntmp[31 : 16] = 16'B(v_msad_u8(S0[39 : 8], S1[31 : 0], S2[31 : 16].u32));\ntmp[15 : 0] = 16'B(v_msad_u8(S0[31 : 0], S1[31 : 0], S2[15 : 0].u32));\nD0.b64 = tmp.b64", "example": "v_mqsad_pk_u16_u8 v[5:6], v[1:2], v2, ttmp[14:15]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 349, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mqsad_u32_u8", "mnemonic": "v_mqsad_u32_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MQSAD U32 U8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Perform the V_MSAD_U8 operation four times using different slices of the first array, all entries of the second array and each entry of the third…", "description": "Perform the V_MSAD_U8 operation four times using different slices of the first array, all entries of the second array and each entry of the third array. Pack each 32-bit value into a 4-entry array and store the array into a vector register. The first input is an 8-entry array of unsigned 8-bit integers, the second input is a 4-entry array of unsigned 8-bit integers and the third input is a 4-entry array of unsigned 32-bit integers.", "syntax": "v_mqsad_u32_u8", "operands": [], "dataTypes": ["u32", "u8"], "semantics": "tmp[127 : 96] = 32'B(v_msad_u8(S0[55 : 24], S1[31 : 0], S2[127 : 96].u32));\ntmp[95 : 64] = 32'B(v_msad_u8(S0[47 : 16], S1[31 : 0], S2[95 : 64].u32));\ntmp[63 : 32] = 32'B(v_msad_u8(S0[39 : 8], S1[31 : 0], S2[63 : 32].u32));\ntmp[31 : 0] = 32'B(v_msad_u8(S0[31 : 0], S1[31 : 0], S2[31 : 0].u32));\nD0.b128 = tmp.b128", "example": "v_mqsad_u32_u8 v[5:8], -1, -1, v[252:255]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 349, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_msad_u8", "mnemonic": "v_msad_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MSAD U8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the sum of absolute differences of elements in two packed 4-component unsigned 8-bit integer inputs, except that elements where the second…", "description": "Calculate the sum of absolute differences of elements in two packed 4-component unsigned 8-bit integer inputs, except that elements where the second input (known as the reference input) is zero are not included in the sum. Add an unsigned 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_msad_u8", "operands": [], "dataTypes": ["u8"], "semantics": "ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\ntmp = S2.u32;\ntmp += S1.u32[7 : 0] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[7 : 0], S1.u32[7 : 0]));\ntmp += S1.u32[15 : 8] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[15 : 8], S1.u32[15 : 8]));\ntmp += S1.u32[23 : 16] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[23 : 16], S1.u32[23 : 16]));\ntmp += S1.u32[31 : 24] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[31 : 24], S1.u32[31 : 24]));\nD0.u32 = tmp", "example": "v_msad_u8 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Overflow into the upper bits is allowed.", "sourcePdfPage": 348, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mul_f16", "mnemonic": "v_mul_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two floating point inputs and store the result into a vector register.", "description": "Multiply two floating point inputs and store the result into a vector register.", "syntax": "v_mul_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = S0.f16 * S1.f16", "example": "v_mul_f16 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP precision. Supports denormals, round mode, exception flags and saturation.", "sourcePdfPage": 178, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mul_f32", "mnemonic": "v_mul_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Per-lane single-precision floating-point multiply.", "description": "Multiply two floating point inputs and store the result into a vector register.", "syntax": "v_mul_f32 VDST, S0, S1", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "S0", "desc": "First source"}, {"name": "S1", "desc": "Second source"}], "dataTypes": ["f32"], "semantics": "VDST[lane] = S0[lane].f32 * S1[lane].f32 for each active lane.", "example": "v_mul_f32  v2, v0, v1   // per-lane v2 = v0 * v1", "exampleSource": null, "encoding": {"format": "VOP2", "widthBits": 32}, "executionUnit": "Vector ALU", "registerClasses": ["VGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_mul_f64", "mnemonic": "v_mul_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two floating point inputs and store the result into a vector register.", "description": "Multiply two floating point inputs and store the result into a vector register.", "syntax": "v_mul_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": "v_mul_f64 v[5:6], -1, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mul_f64_pseudo", "mnemonic": "v_mul_f64_pseudo", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL F64 PSEUDO", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_mul_f64_pseudo", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_mul_hi_i32", "mnemonic": "v_mul_hi_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL HI I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two signed 32-bit integer inputs and store the high 32 bits of the result into a vector register.", "description": "Multiply two signed 32-bit integer inputs and store the high 32 bits of the result into a vector register.", "syntax": "v_mul_hi_i32", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = 32'I((64'I(S0.i32) * 64'I(S1.i32)) >> 32U)", "example": "v_mul_hi_i32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "To multiply integers with small magnitudes consider V_MUL_HI_I32_I24, which is intended to be a more efficient implementation.", "sourcePdfPage": 362, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mul_hi_i32_i24", "mnemonic": "v_mul_hi_i32_i24", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL HI I32 I24", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two signed 24-bit integer inputs and store the high 32 bits of the result as a signed 32-bit integer into a vector register.", "description": "Multiply two signed 24-bit integer inputs and store the high 32 bits of the result as a signed 32-bit integer into a vector register.", "syntax": "v_mul_hi_i32_i24", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = 32'I((64'I(S0.i24) * 64'I(S1.i24)) >> 32U)", "example": "v_mul_hi_i32_i24 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "See also V_MUL_I32_I24.", "sourcePdfPage": 170, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mul_hi_u32", "mnemonic": "v_mul_hi_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL HI U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two unsigned 32-bit integer inputs and store the high 32 bits of the result into a vector register.", "description": "Multiply two unsigned 32-bit integer inputs and store the high 32 bits of the result into a vector register.", "syntax": "v_mul_hi_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = 32'U((64'U(S0.u32) * 64'U(S1.u32)) >> 32U)", "example": "v_mul_hi_u32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "To multiply integers with small magnitudes consider V_MUL_HI_U32_U24, which is intended to be a more efficient implementation.", "sourcePdfPage": 361, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mul_hi_u32_u24", "mnemonic": "v_mul_hi_u32_u24", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL HI U32 U24", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two unsigned 24-bit integer inputs and store the high 32 bits of the result as an unsigned 32-bit integer into a vector register.", "description": "Multiply two unsigned 24-bit integer inputs and store the high 32 bits of the result as an unsigned 32-bit integer into a vector register.", "syntax": "v_mul_hi_u32_u24", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = 32'U((64'U(S0.u24) * 64'U(S1.u24)) >> 32U)", "example": "v_mul_hi_u32_u24 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "See also V_MUL_U32_U24.", "sourcePdfPage": 171, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mul_i32_i24", "mnemonic": "v_mul_i32_i24", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL I32 I24", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two signed 24-bit integer inputs and store the result as a signed 32-bit integer into a vector register.", "description": "Multiply two signed 24-bit integer inputs and store the result as a signed 32-bit integer into a vector register.", "syntax": "v_mul_i32_i24", "operands": [], "dataTypes": ["i32"], "semantics": "D0.i32 = 32'I(S0.i24) * 32'I(S1.i24)", "example": "v_mul_i32_i24 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This opcode is expected to be as efficient as basic single-precision opcodes since it utilizes the single-precision floating point multiplier. See also V_MUL_HI_I32_I24.", "sourcePdfPage": 170, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mul_legacy_f32", "mnemonic": "v_mul_legacy_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL LEGACY F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two floating point inputs and store the result into a vector register.", "description": "Multiply two floating point inputs and store the result into a vector register. Follows DX9 rules where 0.0 times anything produces 0.0 (this differs from other APIs when the other input is infinity or NaN).", "syntax": "v_mul_legacy_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_mul_legacy_f32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mul_lo_i32", "mnemonic": "v_mul_lo_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL LO I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on i32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_mul_lo_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_mul_lo_u16", "mnemonic": "v_mul_lo_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL LO U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two unsigned 16-bit integer inputs and store the low bits of the result into a vector register.", "description": "Multiply two unsigned 16-bit integer inputs and store the low bits of the result into a vector register.", "syntax": "v_mul_lo_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u16 = S0.u16 * S1.u16", "example": "v_mul_lo_u16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Supports saturation (unsigned 16-bit integer domain).", "sourcePdfPage": 180, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mul_lo_u32", "mnemonic": "v_mul_lo_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL LO U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Per-lane 32-bit unsigned multiply, low half of the product.", "description": "Multiply two unsigned 32-bit integer inputs and store the result into a vector register.", "syntax": "v_mul_lo_u32 VDST, S0, S1", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "S0", "desc": "First source"}, {"name": "S1", "desc": "Second source"}], "dataTypes": ["u32"], "semantics": "VDST[lane] = lo32(S0[lane].u32 * S1[lane].u32) for each active lane.", "example": "v_mul_lo_u32  v2, v0, v1   // per-lane low 32 bits of v0 * v1", "exampleSource": null, "encoding": {"format": "VOP3", "widthBits": 32}, "executionUnit": "Vector ALU", "registerClasses": ["VGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_mul_u32_u24", "mnemonic": "v_mul_u32_u24", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL U32 U24", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two unsigned 24-bit integer inputs and store the result as an unsigned 32-bit integer into a vector register.", "description": "Multiply two unsigned 24-bit integer inputs and store the result as an unsigned 32-bit integer into a vector register.", "syntax": "v_mul_u32_u24", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = 32'U(S0.u24) * 32'U(S1.u24)", "example": "v_mul_u32_u24 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This opcode is expected to be as efficient as basic single-precision opcodes since it utilizes the single-precision floating point multiplier. See also V_MUL_HI_U32_U24.", "sourcePdfPage": 171, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_mul_u64", "mnemonic": "v_mul_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MUL U64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_mul_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_mullit_f32", "mnemonic": "v_mullit_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V MULLIT F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two floating point inputs and store the result into a vector register.", "description": "Multiply two floating point inputs and store the result into a vector register. Specific rules apply to accommodate lighting calculations: 0.0 * x = 0.0 and alternate INF, NAN, overflow rules apply.", "syntax": "v_mullit_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": "v_mullit_f32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_nop", "mnemonic": "v_nop", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V NOP", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Do nothing.", "description": "Do nothing.", "syntax": "v_nop", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This instruction can be used to insert a single-cycle bubble in the vector ALU pipeline. For multiple cycles repeat this opcode.", "sourcePdfPage": 186, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_not_b16", "mnemonic": "v_not_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V NOT B16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate bitwise negation on a vector input and store the result into a vector register.", "description": "Calculate bitwise negation on a vector input and store the result into a vector register.", "syntax": "v_not_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "v_not_b16 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_not_b32", "mnemonic": "v_not_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V NOT B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate bitwise negation on a vector input and store the result into a vector register.", "description": "Calculate bitwise negation on a vector input and store the result into a vector register.", "syntax": "v_not_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = ~S0.u32", "example": "v_not_b32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Input and output modifiers not supported.", "sourcePdfPage": 199, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_or3_b32", "mnemonic": "v_or3_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V OR3 B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the bitwise OR of three vector inputs and store the result into a vector register.", "description": "Calculate the bitwise OR of three vector inputs and store the result into a vector register.", "syntax": "v_or3_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S0.u32 | S1.u32 | S2.u32)", "example": "v_or3_b32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Input and output modifiers not supported.", "sourcePdfPage": 357, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_or_b16", "mnemonic": "v_or_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V OR B16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate bitwise OR on two vector inputs and store the result into a vector register.", "description": "Calculate bitwise OR on two vector inputs and store the result into a vector register.", "syntax": "v_or_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "v_or_b16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_or_b16_fake16", "mnemonic": "v_or_b16_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V OR B16 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on b16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_or_b16_fake16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_or_b16_t16", "mnemonic": "v_or_b16_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V OR B16 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on b16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_or_b16_t16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_or_b32", "mnemonic": "v_or_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V OR B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate bitwise OR on two vector inputs and store the result into a vector register.", "description": "Calculate bitwise OR on two vector inputs and store the result into a vector register.", "syntax": "v_or_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S0.u32 | S1.u32)", "example": "v_or_b32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Input and output modifiers not supported.", "sourcePdfPage": 174, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pack_b32_f16", "mnemonic": "v_pack_b32_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PACK B32 F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Pack two half-precision float values into a single 32-bit value and store the result into a vector register.", "description": "Pack two half-precision float values into a single 32-bit value and store the result into a vector register.", "syntax": "v_pack_b32_f16", "operands": [], "dataTypes": ["b32", "f16"], "semantics": "D0[31 : 16].f16 = S1.f16;\nD0[15 : 0].f16 = S0.f16", "example": "v_pack_b32_f16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 369, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_perm_b32", "mnemonic": "v_perm_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERM B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Permute a 64-bit value constructed from two vector inputs (most significant bits come from the first input) using a per-lane selector from the third…", "description": "Permute a 64-bit value constructed from two vector inputs (most significant bits come from the first input) using a per-lane selector from the third input. The lane selector allows each byte of the result to choose from any of the 8 input bytes, perform sign extension or pad with 0/1 bits. Store the result into a vector register.", "syntax": "v_perm_b32", "operands": [], "dataTypes": ["b32"], "semantics": "BYTE_PERMUTE = lambda(data, sel) (\ndeclare in : 8'B[8];\nfor i in 0 : 7 do\nin[i] = data[i * 8 + 7 : i * 8].b8\nendfor;\nif sel.u32 >= 13U then\nreturn 8'0xff\nelsif sel.u32 == 12U then\nreturn 8'0x0\nelsif sel.u32 == 11U then\nreturn in[7][7].b8 * 8'0xff\nelsif sel.u32 == 10U then\nreturn in[5][7].b8 * 8'0xff\nelsif sel.u32 == 9U then\nreturn in[3][7].b8 * 8'0xff\nelsif sel.u32 == 8U then\nreturn in[1][7].b8 * 8'0xff\nelse\nreturn in[sel]\nendif);\nD0[31 : 24] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[31 : 24]);\nD0[23 : 16] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[23 : 16]);\nD0[15 : 8] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[15 : 8]);\nD0[7 : 0] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[7 : 0])", "example": "v_perm_b32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Selects 0 through 7 select the corresponding byte of the 64-bit input value. Selects 8 through 11 are useful in modeling sign extension of a smaller-precision signed integer to a larger- precision result by replicating the leading bit of a selected byte. Selects 12 and 13 return padding values of 0 and 1 bits respectively. Note the MSBs of the 64-bit value being selected are stored in S0. This is counterintuitive for a little-endian architecture.", "sourcePdfPage": 351, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_perm_pk16_b4_u4", "mnemonic": "v_perm_pk16_b4_u4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERM PK16 B4 U4", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_perm_pk16_b4_u4", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_perm_pk16_b6_u4", "mnemonic": "v_perm_pk16_b6_u4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERM PK16 B6 U4", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_perm_pk16_b6_u4", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_perm_pk16_b8_u4", "mnemonic": "v_perm_pk16_b8_u4", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERM PK16 B8 U4", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b8 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_perm_pk16_b8_u4", "operands": [], "dataTypes": ["b8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_permlane16_b32", "mnemonic": "v_permlane16_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERMLANE16 B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Perform arbitrary gather-style operation within a row (16 contiguous lanes).", "description": "Perform arbitrary gather-style operation within a row (16 contiguous lanes).", "syntax": "v_permlane16_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "v_permlane16_b32 v5, v1, s2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_permlane16_swap_b32", "mnemonic": "v_permlane16_swap_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERMLANE16 SWAP B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Swap data between two vector registers. Odd rows of the first operand are swapped with even rows of the second operand (one row is 16 lanes).", "description": "Swap data between two vector registers. Odd rows of the first operand are swapped with even rows of the second operand (one row is 16 lanes).", "syntax": "v_permlane16_swap_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_permlane16_var_b32", "mnemonic": "v_permlane16_var_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERMLANE16 VAR B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Perform arbitrary gather-style operation within a row (16 contiguous lanes).", "description": "Perform arbitrary gather-style operation within a row (16 contiguous lanes).", "syntax": "v_permlane16_var_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_permlane32_swap_b32", "mnemonic": "v_permlane32_swap_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERMLANE32 SWAP B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Swap data between two vector registers. Rows 2 and 3 of the first operand are swapped with rows 0 and 1 of the second operand (one row is 16 lanes).", "description": "Swap data between two vector registers. Rows 2 and 3 of the first operand are swapped with rows 0 and 1 of the second operand (one row is 16 lanes).", "syntax": "v_permlane32_swap_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_permlane64_b32", "mnemonic": "v_permlane64_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERMLANE64 B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Perform a specific permutation across lanes where the high half and low half of a wave64 are swapped. Performs no operation in wave32 mode.", "description": "Perform a specific permutation across lanes where the high half and low half of a wave64 are swapped. Performs no operation in wave32 mode.", "syntax": "v_permlane64_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "v_permlane64_b32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_permlane_bcast_b32", "mnemonic": "v_permlane_bcast_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERMLANE BCAST B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_permlane_bcast_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_permlane_down_b32", "mnemonic": "v_permlane_down_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERMLANE DOWN B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_permlane_down_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_permlane_idx_gen_b32", "mnemonic": "v_permlane_idx_gen_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERMLANE IDX GEN B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_permlane_idx_gen_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_permlane_up_b32", "mnemonic": "v_permlane_up_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERMLANE UP B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_permlane_up_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_permlane_xor_b32", "mnemonic": "v_permlane_xor_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERMLANE XOR B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3 vector instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_permlane_xor_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_permlanex16_b32", "mnemonic": "v_permlanex16_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERMLANEX16 B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Perform arbitrary gather-style operation across two rows (each row is 16 contiguous lanes).", "description": "Perform arbitrary gather-style operation across two rows (each row is 16 contiguous lanes).", "syntax": "v_permlanex16_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "v_permlanex16_b32 v5, v1, s2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_permlanex16_var_b32", "mnemonic": "v_permlanex16_var_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PERMLANEX16 VAR B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Perform arbitrary gather-style operation across two rows (each row is 16 contiguous lanes).", "description": "Perform arbitrary gather-style operation across two rows (each row is 16 contiguous lanes).", "syntax": "v_permlanex16_var_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_pipeflush", "mnemonic": "v_pipeflush", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PIPEFLUSH", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Flush the vector ALU pipeline through the destination cache.", "description": "Flush the vector ALU pipeline through the destination cache.", "syntax": "v_pipeflush", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_pk_add_bf16", "mnemonic": "v_pk_add_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK ADD BF16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_add_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_add_f16", "mnemonic": "v_pk_add_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK ADD F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Add two packed half-precision float inputs component-wise and store the result into a vector register. No carry- in or carry-out support.", "description": "Add two packed half-precision float inputs component-wise and store the result into a vector register. No carry- in or carry-out support.", "syntax": "v_pk_add_f16", "operands": [], "dataTypes": ["f16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].f16 = S0[15 : 0].f16 + S1[15 : 0].f16;\ntmp[31 : 16].f16 = S0[31 : 16].f16 + S1[31 : 16].f16;\nD0.b32 = tmp", "example": "v_pk_add_f16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 266, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_add_f32", "mnemonic": "v_pk_add_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK ADD F32", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Add two packed single-precision float inputs component-wise and store the result into a vector register. No carry-in or carry-out support.", "description": "Add two packed single-precision float inputs component-wise and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_pk_add_f32", "operands": [], "dataTypes": ["f32"], "semantics": "declare tmp : 64'B;\ntmp[31 : 0].f32 = S0[31 : 0].f32 + S1[31 : 0].f32;\ntmp[63 : 32].f32 = S0[63 : 32].f32 + S1[63 : 32].f32;\nD0.b64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 271, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_pk_add_f64", "mnemonic": "v_pk_add_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK ADD F64", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_add_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_add_i16", "mnemonic": "v_pk_add_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK ADD I16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Add two packed signed 16-bit integer inputs component-wise and store the result into a vector register. No carry-in or carry-out support.", "description": "Add two packed signed 16-bit integer inputs component-wise and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_pk_add_i16", "operands": [], "dataTypes": ["i16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 + S1[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 + S1[31 : 16].i16;\nD0.b32 = tmp", "example": "v_pk_add_i16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 263, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_add_max_i16", "mnemonic": "v_pk_add_max_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK ADD MAX I16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on i16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_add_max_i16", "operands": [], "dataTypes": ["i16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_add_max_u16", "mnemonic": "v_pk_add_max_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK ADD MAX U16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on u16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_add_max_u16", "operands": [], "dataTypes": ["u16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_add_min_i16", "mnemonic": "v_pk_add_min_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK ADD MIN I16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on i16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_add_min_i16", "operands": [], "dataTypes": ["i16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_add_min_u16", "mnemonic": "v_pk_add_min_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK ADD MIN U16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on u16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_add_min_u16", "operands": [], "dataTypes": ["u16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_add_nc_u64", "mnemonic": "v_pk_add_nc_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK ADD NC U64", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_add_nc_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_add_u16", "mnemonic": "v_pk_add_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK ADD U16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Add two packed unsigned 16-bit integer inputs component-wise and store the result into a vector register. No carry-in or carry-out support.", "description": "Add two packed unsigned 16-bit integer inputs component-wise and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_pk_add_u16", "operands": [], "dataTypes": ["u16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 + S1[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 + S1[31 : 16].u16;\nD0.b32 = tmp", "example": "v_pk_add_u16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 265, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_ashrrev_i16", "mnemonic": "v_pk_ashrrev_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK ASHRREV I16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Given a packed shift count in the first vector input, calculate the component-wise arithmetic shift right (preserving sign bit) of the second packed…", "description": "Given a packed shift count in the first vector input, calculate the component-wise arithmetic shift right (preserving sign bit) of the second packed vector input and store the result into a vector register.", "syntax": "v_pk_ashrrev_i16", "operands": [], "dataTypes": ["i16"], "semantics": "tmp[31 : 16].i16 = (S1[31 : 16].i16 >> S0.u32[19 : 16].u32);\ntmp[15 : 0].i16 = (S1[15 : 0].i16 >> S0.u32[3 : 0].u32);\nD0.b32 = tmp.b32", "example": "v_pk_ashrrev_i16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 264, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_fma_bf16", "mnemonic": "v_pk_fma_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK FMA BF16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_fma_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_fma_f16", "mnemonic": "v_pk_fma_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK FMA F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two packed half-precision float inputs component-wise and add a third input component-wise using fused multiply add, and store the result…", "description": "Multiply two packed half-precision float inputs component-wise and add a third input component-wise using fused multiply add, and store the result into a vector register.", "syntax": "v_pk_fma_f16", "operands": [], "dataTypes": ["f16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].f16 = fma(S0[15 : 0].f16, S1[15 : 0].f16, S2[15 : 0].f16);\ntmp[31 : 16].f16 = fma(S0[31 : 16].f16, S1[31 : 16].f16, S2[31 : 16].f16);\nD0.b32 = tmp", "example": "v_pk_fma_f16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 266, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_fma_f32", "mnemonic": "v_pk_fma_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK FMA F32", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two packed single-precision float inputs component-wise and add a third input component-wise using fused multiply add, and store the result…", "description": "Multiply two packed single-precision float inputs component-wise and add a third input component-wise using fused multiply add, and store the result into a vector register.", "syntax": "v_pk_fma_f32", "operands": [], "dataTypes": ["f32"], "semantics": "declare tmp : 64'B;\ntmp[31 : 0].f32 = fma(S0[31 : 0].f32, S1[31 : 0].f32, S2[31 : 0].f32);\ntmp[63 : 32].f32 = fma(S0[63 : 32].f32, S1[63 : 32].f32, S2[63 : 32].f32);\nD0.b64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 270, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_pk_fma_f64", "mnemonic": "v_pk_fma_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK FMA F64", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_fma_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_fmac_f16", "mnemonic": "v_pk_fmac_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK FMAC F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Multiply two packed half-precision float inputs component-wise and accumulate the result into the destination register using fused multiply add.", "description": "Multiply two packed half-precision float inputs component-wise and accumulate the result into the destination register using fused multiply add.", "syntax": "v_pk_fmac_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0[15 : 0].f16 = fma(S0[15 : 0].f16, S1[15 : 0].f16, D0[15 : 0].f16);\nD0[31 : 16].f16 = fma(S0[31 : 16].f16, S1[31 : 16].f16, D0[31 : 16].f16)", "example": "v_pk_fmac_f16 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 185, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_lshl_add_u64", "mnemonic": "v_pk_lshl_add_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK LSHL ADD U64", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_lshl_add_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_lshlrev_b16", "mnemonic": "v_pk_lshlrev_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK LSHLREV B16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Given a packed shift count in the first vector input, calculate the component-wise logical shift left of the second packed vector input and store the…", "description": "Given a packed shift count in the first vector input, calculate the component-wise logical shift left of the second packed vector input and store the result into a vector register.", "syntax": "v_pk_lshlrev_b16", "operands": [], "dataTypes": ["b16"], "semantics": "tmp[31 : 16].u16 = (S1[31 : 16].u16 << S0.u32[19 : 16].u32);\ntmp[15 : 0].u16 = (S1[15 : 0].u16 << S0.u32[3 : 0].u32);\nD0.b32 = tmp.b32", "example": "v_pk_lshlrev_b16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 263, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_lshrrev_b16", "mnemonic": "v_pk_lshrrev_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK LSHRREV B16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Given a packed shift count in the first vector input, calculate the component-wise logical shift right of the second packed vector input and store…", "description": "Given a packed shift count in the first vector input, calculate the component-wise logical shift right of the second packed vector input and store the result into a vector register.", "syntax": "v_pk_lshrrev_b16", "operands": [], "dataTypes": ["b16"], "semantics": "tmp[31 : 16].u16 = (S1[31 : 16].u16 >> S0.u32[19 : 16].u32);\ntmp[15 : 0].u16 = (S1[15 : 0].u16 >> S0.u32[3 : 0].u32);\nD0.b32 = tmp.b32", "example": "v_pk_lshrrev_b16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 263, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_mad_i16", "mnemonic": "v_pk_mad_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAD I16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two packed signed 16-bit integer inputs component-wise, add a packed signed 16-bit integer value from a third input component-wise, and…", "description": "Multiply two packed signed 16-bit integer inputs component-wise, add a packed signed 16-bit integer value from a third input component-wise, and store the result into a vector register.", "syntax": "v_pk_mad_i16", "operands": [], "dataTypes": ["i16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 * S1[15 : 0].i16 + S2[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 * S1[31 : 16].i16 + S2[31 : 16].i16;\nD0.b32 = tmp", "example": "v_pk_mad_i16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 262, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_mad_u16", "mnemonic": "v_pk_mad_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAD U16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two packed unsigned 16-bit integer inputs component-wise, add a packed unsigned 16-bit integer value from a third input component-wise, and…", "description": "Multiply two packed unsigned 16-bit integer inputs component-wise, add a packed unsigned 16-bit integer value from a third input component-wise, and store the result into a vector register.", "syntax": "v_pk_mad_u16", "operands": [], "dataTypes": ["u16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 * S1[15 : 0].u16 + S2[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 * S1[31 : 16].u16 + S2[31 : 16].u16;\nD0.b32 = tmp", "example": "v_pk_mad_u16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 264, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_max3_i16", "mnemonic": "v_pk_max3_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAX3 I16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on i16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_max3_i16", "operands": [], "dataTypes": ["i16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_max3_num_f16", "mnemonic": "v_pk_max3_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAX3 NUM F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_max3_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_max3_u16", "mnemonic": "v_pk_max3_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAX3 U16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on u16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_max3_u16", "operands": [], "dataTypes": ["u16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_max_f16", "mnemonic": "v_pk_max_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAX F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Select the component-wise maximum of two packed half-precision float inputs and store the result into a vector register.", "description": "Select the component-wise maximum of two packed half-precision float inputs and store the result into a vector register.", "syntax": "v_pk_max_f16", "operands": [], "dataTypes": ["f16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].f16 = v_max_f16(S0[15 : 0].f16, S1[15 : 0].f16);\ntmp[31 : 16].f16 = v_max_f16(S0[31 : 16].f16, S1[31 : 16].f16);\nD0.b32 = tmp", "example": "v_pk_max_f16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 267, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_max_i16", "mnemonic": "v_pk_max_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAX I16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Select the component-wise maximum of two packed signed 16-bit integer inputs and store the selected values into a vector register.", "description": "Select the component-wise maximum of two packed signed 16-bit integer inputs and store the selected values into a vector register.", "syntax": "v_pk_max_i16", "operands": [], "dataTypes": ["i16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 >= S1[15 : 0].i16 ? S0[15 : 0].i16 : S1[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 >= S1[31 : 16].i16 ? S0[31 : 16].i16 : S1[31 : 16].i16;\nD0.b32 = tmp", "example": "v_pk_max_i16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 264, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_max_num_bf16", "mnemonic": "v_pk_max_num_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAX NUM BF16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_max_num_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_max_num_f16", "mnemonic": "v_pk_max_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAX NUM F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Select the component-wise IEEE maximumNumber() of two packed half-precision float inputs and store the selected values into a vector register.", "description": "Select the component-wise IEEE maximumNumber() of two packed half-precision float inputs and store the selected values into a vector register.", "syntax": "v_pk_max_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_pk_max_num_f64", "mnemonic": "v_pk_max_num_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAX NUM F64", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_max_num_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_max_u16", "mnemonic": "v_pk_max_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAX U16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Select the component-wise maximum of two packed unsigned 16-bit integer inputs and store the selected values into a vector register.", "description": "Select the component-wise maximum of two packed unsigned 16-bit integer inputs and store the selected values into a vector register.", "syntax": "v_pk_max_u16", "operands": [], "dataTypes": ["u16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 >= S1[15 : 0].u16 ? S0[15 : 0].u16 : S1[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 >= S1[31 : 16].u16 ? S0[31 : 16].u16 : S1[31 : 16].u16;\nD0.b32 = tmp", "example": "v_pk_max_u16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 265, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_maximum3_f16", "mnemonic": "v_pk_maximum3_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAXIMUM3 F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Select the component-wise IEEE maximum() of three half-precision float inputs and store the result into a vector register.", "description": "Select the component-wise IEEE maximum() of three half-precision float inputs and store the result into a vector register.", "syntax": "v_pk_maximum3_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_pk_maximum_f16", "mnemonic": "v_pk_maximum_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MAXIMUM F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Select the component-wise IEEE maximum() of two packed half-precision float inputs and store the selected values into a vector register.", "description": "Select the component-wise IEEE maximum() of two packed half-precision float inputs and store the selected values into a vector register.", "syntax": "v_pk_maximum_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_pk_min3_i16", "mnemonic": "v_pk_min3_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MIN3 I16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on i16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_min3_i16", "operands": [], "dataTypes": ["i16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_min3_num_f16", "mnemonic": "v_pk_min3_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MIN3 NUM F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_min3_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_min3_u16", "mnemonic": "v_pk_min3_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MIN3 U16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on u16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_min3_u16", "operands": [], "dataTypes": ["u16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_min_f16", "mnemonic": "v_pk_min_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MIN F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Select the component-wise minimum of two packed half-precision float inputs and store the result into a vector register.", "description": "Select the component-wise minimum of two packed half-precision float inputs and store the result into a vector register.", "syntax": "v_pk_min_f16", "operands": [], "dataTypes": ["f16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].f16 = v_min_f16(S0[15 : 0].f16, S1[15 : 0].f16);\ntmp[31 : 16].f16 = v_min_f16(S0[31 : 16].f16, S1[31 : 16].f16);\nD0.b32 = tmp", "example": "v_pk_min_f16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 266, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_min_i16", "mnemonic": "v_pk_min_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MIN I16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Select the component-wise minimum of two packed signed 16-bit integer inputs and store the selected values into a vector register.", "description": "Select the component-wise minimum of two packed signed 16-bit integer inputs and store the selected values into a vector register.", "syntax": "v_pk_min_i16", "operands": [], "dataTypes": ["i16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 < S1[15 : 0].i16 ? S0[15 : 0].i16 : S1[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 < S1[31 : 16].i16 ? S0[31 : 16].i16 : S1[31 : 16].i16;\nD0.b32 = tmp", "example": "v_pk_min_i16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 264, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_min_num_bf16", "mnemonic": "v_pk_min_num_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MIN NUM BF16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_min_num_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_min_num_f16", "mnemonic": "v_pk_min_num_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MIN NUM F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Select the component-wise IEEE minimumNumber() of two packed half-precision float inputs and store the selected values into a vector register.", "description": "Select the component-wise IEEE minimumNumber() of two packed half-precision float inputs and store the selected values into a vector register.", "syntax": "v_pk_min_num_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_pk_min_num_f64", "mnemonic": "v_pk_min_num_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MIN NUM F64", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_min_num_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_min_u16", "mnemonic": "v_pk_min_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MIN U16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Select the component-wise minimum of two packed unsigned 16-bit integer inputs and store the selected values into a vector register.", "description": "Select the component-wise minimum of two packed unsigned 16-bit integer inputs and store the selected values into a vector register.", "syntax": "v_pk_min_u16", "operands": [], "dataTypes": ["u16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 < S1[15 : 0].u16 ? S0[15 : 0].u16 : S1[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 < S1[31 : 16].u16 ? S0[31 : 16].u16 : S1[31 : 16].u16;\nD0.b32 = tmp", "example": "v_pk_min_u16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 265, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_minimum3_f16", "mnemonic": "v_pk_minimum3_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MINIMUM3 F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Select the component-wise IEEE minimum() of three half-precision float inputs and store the result into a vector register.", "description": "Select the component-wise IEEE minimum() of three half-precision float inputs and store the result into a vector register.", "syntax": "v_pk_minimum3_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_pk_minimum_f16", "mnemonic": "v_pk_minimum_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MINIMUM F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Select the component-wise IEEE minimum() of two packed half-precision float inputs and store the selected values into a vector register.", "description": "Select the component-wise IEEE minimum() of two packed half-precision float inputs and store the selected values into a vector register.", "syntax": "v_pk_minimum_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_pk_mov_b32", "mnemonic": "v_pk_mov_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MOV B32", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Move data from two vector inputs into two vector registers.", "description": "Move data from two vector inputs into two vector registers.", "syntax": "v_pk_mov_b32", "operands": [], "dataTypes": ["b32"], "semantics": "tmp0.u32 = S0.u32[OPSEL[0].i32 * 32 + 31 : OPSEL[0].i32 * 32];\ntmp1.u32 = S1.u32[OPSEL[1].i32 * 32 + 31 : OPSEL[1].i32 * 32];\nD0.u32[31 : 0] = tmp0.u32;\nD0.u32[63 : 32] = tmp1.u32", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "The source operands are treated as 64 bit and are subject to alignment restrictions for both SGPR and VGPR. For two VGPR inputs this opcode can be used as an arbitrary gather by using OP_SEL to select either the even VGPR specified or the next odd VGPR. v_pk_mov_b32 v0, v2, v4 op_sel:[0,1] // evaluates v0 <- v2 and v1 <- v5. Due to scalar broadcast restrictions if two SGPRs are specified as operands, they must be the same SGPR. v_pk_mov_b32 v0, s6, s6 op_sel:[0,1] // 64-bit move from scalar s[6:7].", "sourcePdfPage": 271, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_pk_mul_bf16", "mnemonic": "v_pk_mul_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MUL BF16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_mul_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_mul_f16", "mnemonic": "v_pk_mul_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MUL F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two packed half-precision float inputs component-wise and store the result into a vector register.", "description": "Multiply two packed half-precision float inputs component-wise and store the result into a vector register.", "syntax": "v_pk_mul_f16", "operands": [], "dataTypes": ["f16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].f16 = S0[15 : 0].f16 * S1[15 : 0].f16;\ntmp[31 : 16].f16 = S0[31 : 16].f16 * S1[31 : 16].f16;\nD0.b32 = tmp", "example": "v_pk_mul_f16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 266, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_mul_f32", "mnemonic": "v_pk_mul_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MUL F32", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two packed single-precision float inputs component-wise and store the result into a vector register.", "description": "Multiply two packed single-precision float inputs component-wise and store the result into a vector register.", "syntax": "v_pk_mul_f32", "operands": [], "dataTypes": ["f32"], "semantics": "declare tmp : 64'B;\ntmp[31 : 0].f32 = S0[31 : 0].f32 * S1[31 : 0].f32;\ntmp[63 : 32].f32 = S0[63 : 32].f32 * S1[63 : 32].f32;\nD0.b64 = tmp", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 271, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_pk_mul_f64", "mnemonic": "v_pk_mul_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MUL F64", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on f64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_mul_f64", "operands": [], "dataTypes": ["f64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_mul_lo_u16", "mnemonic": "v_pk_mul_lo_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK MUL LO U16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Multiply two packed unsigned 16-bit integer inputs component-wise and store the low bits of each resulting component into a vector register.", "description": "Multiply two packed unsigned 16-bit integer inputs component-wise and store the low bits of each resulting component into a vector register.", "syntax": "v_pk_mul_lo_u16", "operands": [], "dataTypes": ["u16"], "semantics": "tmp[31 : 16].u16 = S0[31 : 16].u16 * S1[31 : 16].u16;\ntmp[15 : 0].u16 = S0[15 : 0].u16 * S1[15 : 0].u16;\nD0.b32 = tmp.b32", "example": "v_pk_mul_lo_u16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 263, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_sub_i16", "mnemonic": "v_pk_sub_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK SUB I16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Subtract the second packed signed 16-bit integer input from the first input component-wise and store the result into a vector register.", "description": "Subtract the second packed signed 16-bit integer input from the first input component-wise and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_pk_sub_i16", "operands": [], "dataTypes": ["i16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 - S1[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 - S1[31 : 16].i16;\nD0.b32 = tmp", "example": "v_pk_sub_i16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 263, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_pk_sub_nc_u64", "mnemonic": "v_pk_sub_nc_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK SUB NC U64", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP3P vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_pk_sub_nc_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_pk_sub_u16", "mnemonic": "v_pk_sub_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PK SUB U16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Subtract the second packed unsigned 16-bit integer input from the first input component-wise and store the result into a vector register.", "description": "Subtract the second packed unsigned 16-bit integer input from the first input component-wise and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_pk_sub_u16", "operands": [], "dataTypes": ["u16"], "semantics": "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 - S1[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 - S1[31 : 16].u16;\nD0.b32 = tmp", "example": "v_pk_sub_u16 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 265, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_prng_b32", "mnemonic": "v_prng_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V PRNG B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Generate a pseudorandom number using an LFSR (linear feedback shift register) seeded with the vector input, then store the result into a vector…", "description": "Generate a pseudorandom number using an LFSR (linear feedback shift register) seeded with the vector input, then store the result into a vector register.", "syntax": "v_prng_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_qsad_pk_u16_u8", "mnemonic": "v_qsad_pk_u16_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V QSAD PK U16 U8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Perform the V_SAD_U8 operation four times using different slices of the first array, all entries of the second array and each entry of the third…", "description": "Perform the V_SAD_U8 operation four times using different slices of the first array, all entries of the second array and each entry of the third array. Truncate each result to 16 bits, pack the values into a 4-entry array and store the array into a vector register. The first input is an 8-entry array of unsigned 8-bit integers, the second input is a 4-entry array of unsigned 8-bit integers and the third input is a 4-entry array of unsigned 16-bit integers.", "syntax": "v_qsad_pk_u16_u8", "operands": [], "dataTypes": ["u16", "u8"], "semantics": "tmp[63 : 48] = 16'B(v_sad_u8(S0[55 : 24], S1[31 : 0], S2[63 : 48].u32));\ntmp[47 : 32] = 16'B(v_sad_u8(S0[47 : 16], S1[31 : 0], S2[47 : 32].u32));\ntmp[31 : 16] = 16'B(v_sad_u8(S0[39 : 8], S1[31 : 0], S2[31 : 16].u32));\ntmp[15 : 0] = 16'B(v_sad_u8(S0[31 : 0], S1[31 : 0], S2[15 : 0].u32));\nD0.b64 = tmp.b64", "example": "v_qsad_pk_u16_u8 v[5:6], v[1:2], v2, ttmp[14:15]", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 348, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_rcp_bf16", "mnemonic": "v_rcp_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V RCP BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_rcp_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_rcp_f16", "mnemonic": "v_rcp_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V RCP F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the reciprocal of the half-precision float input using IEEE rules and store the result into a vector register.", "description": "Calculate the reciprocal of the half-precision float input using IEEE rules and store the result into a vector register.", "syntax": "v_rcp_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = 16'1.0 / S0.f16", "example": "V_RCP_F16(0xfc00) => 0x8000     // rcp(-INF) = -0\nV_RCP_F16(0xc000) => 0xb800     // rcp(-2.0) = -0.5\nV_RCP_F16(0x8000) => 0xfc00     // rcp(-0.0) = -INF\nV_RCP_F16(0x0000) => 0x7c00     // rcp(+0.0) = +INF", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy.", "sourcePdfPage": 205, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_rcp_f32", "mnemonic": "v_rcp_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V RCP F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the reciprocal of the single-precision float input using IEEE rules and store the result into a vector register.", "description": "Calculate the reciprocal of the single-precision float input using IEEE rules and store the result into a vector register.", "syntax": "v_rcp_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = 1.0F / S0.f32", "example": "V_RCP_F32(0xff800000) => 0x80000000     // rcp(-INF) = -0\nV_RCP_F32(0xc0000000) => 0xbf000000     // rcp(-2.0) = -0.5\nV_RCP_F32(0x80000000) => 0xff800000     // rcp(-0.0) = -INF\nV_RCP_F32(0x00000000) => 0x7f800000     // rcp(+0.0) = +INF", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy. Accuracy converges to < 0.5ULP when using the Newton-Raphson method and 2 FMA operations. Denormals are flushed.", "sourcePdfPage": 196, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_rcp_f64", "mnemonic": "v_rcp_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V RCP F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the reciprocal of the double-precision float input using IEEE rules and store the result into a vector register.", "description": "Calculate the reciprocal of the double-precision float input using IEEE rules and store the result into a vector register.", "syntax": "v_rcp_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.f64 = 1.0 / S0.f64", "example": "v_rcp_f64 v[5:6], -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This opcode has (2**29)ULP accuracy and supports denormals.", "sourcePdfPage": 197, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_rcp_iflag_f32", "mnemonic": "v_rcp_iflag_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V RCP IFLAG F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the reciprocal of the vector float input in a manner suitable for integer division and store the result into a vector register.", "description": "Calculate the reciprocal of the vector float input in a manner suitable for integer division and store the result into a vector register. This opcode is intended for use as part of an integer division macro.", "syntax": "v_rcp_iflag_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = 1.0F / S0.f32;\n// Can only raise integer DIV_BY_ZERO exception", "example": "v_rcp_iflag_f32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Can raise integer DIV_BY_ZERO exception but cannot raise floating-point exceptions. To be used in an integer reciprocal macro by the compiler with one of the sequences listed below (depending on signed or unsigned operation). Unsigned usage: CVT_F32_U32 RCP_IFLAG_F32 MUL_F32 (2**32 - 1) CVT_U32_F32 Signed usage: CVT_F32_I32 RCP_IFLAG_F32 MUL_F32 (2**31 - 1) CVT_I32_F32", "sourcePdfPage": 196, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_readfirstlane_b32", "mnemonic": "v_readfirstlane_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V READFIRSTLANE B32", "category": "Lane Operations", "instructionClass": "vector", "summary": "Read the value of a VGPR from the first active lane into a scalar register.", "description": "Read the scalar value in the lowest active lane of the input vector register and store it into a scalar register.", "syntax": "v_readfirstlane_b32 SDST, S0", "operands": [{"name": "SDST", "desc": "Destination SGPR"}, {"name": "S0", "desc": "Source VGPR"}], "dataTypes": ["b32"], "semantics": "SDST = S0[first active lane in EXEC]; used to move a per-lane value into scalar (wavefront-uniform) state when all active lanes are known to agree.", "example": "v_readfirstlane_b32  s0, v0   // s0 = v0 from the first active lane", "exampleSource": null, "encoding": {"format": "VOP1", "widthBits": 32}, "executionUnit": "Vector ALU", "registerClasses": ["VGPR", "SGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_readlane_b32", "mnemonic": "v_readlane_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V READLANE B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Read the scalar value in the specified lane of the first input where the lane select is in the second input. Store the result into a scalar register.", "description": "Read the scalar value in the specified lane of the first input where the lane select is in the second input. Store the result into a scalar register.", "syntax": "v_readlane_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "v_readlane_b32 s5, v1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_rndne_f16", "mnemonic": "v_rndne_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V RNDNE F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Round the half-precision float input to the nearest even integer and store the result in floating point format into a vector register.", "description": "Round the half-precision float input to the nearest even integer and store the result in floating point format into a vector register.", "syntax": "v_rndne_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = floor(S0.f16 + 16'0.5);\nif (isEven(64'F(floor(S0.f16))) && (fract(S0.f16) == 16'0.5)) then\nD0.f16 -= 16'1.0\nendif", "example": "v_rndne_f16 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 208, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_rndne_f32", "mnemonic": "v_rndne_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V RNDNE F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Round the single-precision float input to the nearest even integer and store the result in floating point format into a vector register.", "description": "Round the single-precision float input to the nearest even integer and store the result in floating point format into a vector register.", "syntax": "v_rndne_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = floor(S0.f32 + 0.5F);\nif (isEven(64'F(floor(S0.f32))) && (fract(S0.f32) == 0.5F)) then\nD0.f32 -= 1.0F\nendif", "example": "v_rndne_f32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 194, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_rndne_f64", "mnemonic": "v_rndne_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V RNDNE F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Round the double-precision float input to the nearest even integer and store the result in floating point format into a vector register.", "description": "Round the double-precision float input to the nearest even integer and store the result in floating point format into a vector register.", "syntax": "v_rndne_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.f64 = floor(S0.f64 + 0.5);\nif (isEven(floor(S0.f64)) && (fract(S0.f64) == 0.5)) then\nD0.f64 -= 1.0\nendif", "example": "v_rndne_f64 v[5:6], -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 193, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_rsq_bf16", "mnemonic": "v_rsq_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V RSQ BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_rsq_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_rsq_f16", "mnemonic": "v_rsq_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V RSQ F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the reciprocal of the square root of the half-precision float input using IEEE rules and store the result into a vector register.", "description": "Calculate the reciprocal of the square root of the half-precision float input using IEEE rules and store the result into a vector register.", "syntax": "v_rsq_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = 16'1.0 / sqrt(S0.f16)", "example": "V_RSQ_F16(0xfc00) => 0xfe00     // rsq(-INF) = NAN\nV_RSQ_F16(0x8000) => 0xfc00     // rsq(-0.0) = -INF\nV_RSQ_F16(0x0000) => 0x7c00     // rsq(+0.0) = +INF\nV_RSQ_F16(0x4400) => 0x3800     // rsq(+4.0) = +0.5", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy, denormals are supported.", "sourcePdfPage": 206, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_rsq_f32", "mnemonic": "v_rsq_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V RSQ F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Per-lane fast approximate reciprocal square root.", "description": "Calculate the reciprocal of the square root of the single-precision float input using IEEE rules and store the result into a vector register.", "syntax": "v_rsq_f32 VDST, S0", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "S0", "desc": "Source operand"}], "dataTypes": ["f32"], "semantics": "VDST[lane] ≈ 1 / sqrt(S0[lane].f32) for each active lane, with a hardware-specific ULP error bound.", "example": "v_rsq_f32  v1, v0   // v1 = approx(1 / sqrt(v0))", "exampleSource": null, "encoding": {"format": "VOP1", "widthBits": 32}, "executionUnit": "Vector ALU", "registerClasses": ["VGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_rsq_f64", "mnemonic": "v_rsq_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V RSQ F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the reciprocal of the square root of the double-precision float input using IEEE rules and store the result into a vector register.", "description": "Calculate the reciprocal of the square root of the double-precision float input using IEEE rules and store the result into a vector register.", "syntax": "v_rsq_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.f64 = 1.0 / sqrt(S0.f64)", "example": "v_rsq_f64 v[5:6], -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This opcode has (2**29)ULP accuracy and supports denormals.", "sourcePdfPage": 197, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_s_exp_f16", "mnemonic": "v_s_exp_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V S EXP F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Calculate 2 raised to the power of the half-precision float input and store the result into a scalar register.", "description": "Calculate 2 raised to the power of the half-precision float input and store the result into a scalar register.", "syntax": "v_s_exp_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_s_exp_f32", "mnemonic": "v_s_exp_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V S EXP F32", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Calculate 2 raised to the power of the single-precision float input and store the result into a scalar register.", "description": "Calculate 2 raised to the power of the single-precision float input and store the result into a scalar register.", "syntax": "v_s_exp_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_s_log_f16", "mnemonic": "v_s_log_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V S LOG F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Calculate the base 2 logarithm of the half-precision float input and store the result into a scalar register.", "description": "Calculate the base 2 logarithm of the half-precision float input and store the result into a scalar register.", "syntax": "v_s_log_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_s_log_f32", "mnemonic": "v_s_log_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V S LOG F32", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Calculate the base 2 logarithm of the single-precision float input and store the result into a scalar register.", "description": "Calculate the base 2 logarithm of the single-precision float input and store the result into a scalar register.", "syntax": "v_s_log_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_s_rcp_f16", "mnemonic": "v_s_rcp_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V S RCP F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Calculate the reciprocal of the half-precision float input using IEEE rules and store the result into a scalar register.", "description": "Calculate the reciprocal of the half-precision float input using IEEE rules and store the result into a scalar register.", "syntax": "v_s_rcp_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_s_rcp_f32", "mnemonic": "v_s_rcp_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V S RCP F32", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Calculate the reciprocal of the single-precision float input using IEEE rules and store the result into a scalar register.", "description": "Calculate the reciprocal of the single-precision float input using IEEE rules and store the result into a scalar register.", "syntax": "v_s_rcp_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_s_rsq_f16", "mnemonic": "v_s_rsq_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V S RSQ F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Calculate the reciprocal of the square root of the half-precision float input using IEEE rules and store the result into a scalar register.", "description": "Calculate the reciprocal of the square root of the half-precision float input using IEEE rules and store the result into a scalar register.", "syntax": "v_s_rsq_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_s_rsq_f32", "mnemonic": "v_s_rsq_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V S RSQ F32", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Calculate the reciprocal of the square root of the single-precision float input using IEEE rules and store the result into a scalar register.", "description": "Calculate the reciprocal of the square root of the single-precision float input using IEEE rules and store the result into a scalar register.", "syntax": "v_s_rsq_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_s_sqrt_f16", "mnemonic": "v_s_sqrt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V S SQRT F16", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Calculate the square root of the half-precision float input using IEEE rules and store the result into a scalar register.", "description": "Calculate the square root of the half-precision float input using IEEE rules and store the result into a scalar register.", "syntax": "v_s_sqrt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_s_sqrt_f32", "mnemonic": "v_s_sqrt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V S SQRT F32", "category": "Vector Packed Arithmetic", "instructionClass": "vector", "summary": "Calculate the square root of the single-precision float input using IEEE rules and store the result into a scalar register.", "description": "Calculate the square root of the single-precision float input using IEEE rules and store the result into a scalar register.", "syntax": "v_s_sqrt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_sad_hi_u8", "mnemonic": "v_sad_hi_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SAD HI U8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the sum of absolute differences of elements in two packed 4-component unsigned 8-bit integer inputs, shift the sum left by 16 bits, add an…", "description": "Calculate the sum of absolute differences of elements in two packed 4-component unsigned 8-bit integer inputs, shift the sum left by 16 bits, add an unsigned 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_sad_hi_u8", "operands": [], "dataTypes": ["u8"], "semantics": "D0.u32 = (32'U(v_sad_u8(S0, S1, 0U)) << 16U) + S2.u32", "example": "v_sad_hi_u8 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Overflow into the upper bits is allowed.", "sourcePdfPage": 342, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_sad_u16", "mnemonic": "v_sad_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SAD U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the sum of absolute differences of elements in two packed 2-component unsigned 16-bit integer inputs, add an unsigned 32-bit integer value…", "description": "Calculate the sum of absolute differences of elements in two packed 2-component unsigned 16-bit integer inputs, add an unsigned 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_sad_u16", "operands": [], "dataTypes": ["u16"], "semantics": "ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\ntmp = S2.u32;\ntmp += ABSDIFF(S0[15 : 0].u16, S1[15 : 0].u16);\ntmp += ABSDIFF(S0[31 : 16].u16, S1[31 : 16].u16);\nD0.u32 = tmp", "example": "v_sad_u16 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 342, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_sad_u32", "mnemonic": "v_sad_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SAD U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the absolute difference of two unsigned 32-bit integer inputs, add an unsigned 32-bit integer value from the third input and store the…", "description": "Calculate the absolute difference of two unsigned 32-bit integer inputs, add an unsigned 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_sad_u32", "operands": [], "dataTypes": ["u32"], "semantics": "ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\nD0.u32 = ABSDIFF(S0.u32, S1.u32) + S2.u32", "example": "v_sad_u32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 343, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_sad_u8", "mnemonic": "v_sad_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SAD U8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the sum of absolute differences of elements in two packed 4-component unsigned 8-bit integer inputs, add an unsigned 32-bit integer value…", "description": "Calculate the sum of absolute differences of elements in two packed 4-component unsigned 8-bit integer inputs, add an unsigned 32-bit integer value from the third input and store the result into a vector register.", "syntax": "v_sad_u8", "operands": [], "dataTypes": ["u8"], "semantics": "ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\ntmp = S2.u32;\ntmp += 32'U(ABSDIFF(S0.u32[7 : 0], S1.u32[7 : 0]));\ntmp += 32'U(ABSDIFF(S0.u32[15 : 8], S1.u32[15 : 8]));\ntmp += 32'U(ABSDIFF(S0.u32[23 : 16], S1.u32[23 : 16]));\ntmp += 32'U(ABSDIFF(S0.u32[31 : 24], S1.u32[31 : 24]));\nD0.u32 = tmp", "example": "v_sad_u8 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Overflow into the upper bits is allowed.", "sourcePdfPage": 342, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_sat_pk4_i4_i8", "mnemonic": "v_sat_pk4_i4_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SAT PK4 I4 I8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on i8 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_sat_pk4_i4_i8", "operands": [], "dataTypes": ["i8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_sat_pk4_u4_u8", "mnemonic": "v_sat_pk4_u4_u8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SAT PK4 U4 U8", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on u8 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_sat_pk4_u4_u8", "operands": [], "dataTypes": ["u8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_sat_pk_u8_i16", "mnemonic": "v_sat_pk_u8_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SAT PK U8 I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Given 2 signed 16-bit integer inputs, saturate each input over an unsigned 8-bit integer range, pack the resulting values into a packed 16-bit value…", "description": "Given 2 signed 16-bit integer inputs, saturate each input over an unsigned 8-bit integer range, pack the resulting values into a packed 16-bit value and store the result into a vector register.", "syntax": "v_sat_pk_u8_i16", "operands": [], "dataTypes": ["i16", "u8"], "semantics": "SAT8 = lambda(n) (\nif n <= 16'0 then\nreturn 8'0U\nelsif n >= 16'255 then\nreturn 8'255U\nelse\nreturn n[7 : 0].u8\nendif);\ntmp = 16'0;\ntmp[7 : 0].u8 = SAT8(S0[15 : 0].i16);\ntmp[15 : 8].u8 = SAT8(S0[31 : 16].i16);\nD0.b16 = tmp.b16", "example": "v_sat_pk_u8_i16 v5.l, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Used for 4x16bit data packed as 4x8bit data.", "sourcePdfPage": 211, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_screen_partition_4se_b32", "mnemonic": "v_screen_partition_4se_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SCREEN PARTITION 4SE B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "4SE version of LUT instruction for screen partitioning/filtering.", "description": "4SE version of LUT instruction for screen partitioning/filtering. This opcode is intended to help accelerate screen partitioning in the 4SE case only. 2SE and 1SE cases use normal ALU instructions.", "syntax": "v_screen_partition_4se_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_sin_bf16", "mnemonic": "v_sin_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SIN BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_sin_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_sin_f16", "mnemonic": "v_sin_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SIN F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the trigonometric sine of a half-precision float value using IEEE rules and store the result into a vector register.", "description": "Calculate the trigonometric sine of a half-precision float value using IEEE rules and store the result into a vector register. The operand is calculated by scaling the vector input by 2 PI.", "syntax": "v_sin_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = sin(S0.f16 * 16'F(PI * 2.0))", "example": "V_SIN_F16(0xfc00) => 0xfe00     // sin(-INF) = NAN\nV_SIN_F16(0xfbff) => 0x0000     // Most negative finite FP16\nV_SIN_F16(0x8000) => 0x8000     // sin(-0.0) = -0\nV_SIN_F16(0x3400) => 0x3c00     // sin(0.25) = 1", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Denormals are supported. Full range input is supported.", "sourcePdfPage": 209, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_sin_f32", "mnemonic": "v_sin_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SIN F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Per-lane fast approximate sine.", "description": "Calculate the trigonometric sine of a single-precision float value using IEEE rules and store the result into a vector register. The operand is calculated by scaling the vector input by 2 PI.", "syntax": "v_sin_f32 VDST, S0", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "S0", "desc": "Source operand (radians, pre-scaled per hardware convention)"}], "dataTypes": ["f32"], "semantics": "VDST[lane] ≈ sin(S0[lane].f32) for each active lane, valid over a hardware-defined input range.", "example": "v_sin_f32  v1, v0   // v1 = approx(sin(v0))", "exampleSource": null, "encoding": {"format": "VOP1", "widthBits": 32}, "executionUnit": "Vector ALU", "registerClasses": ["VGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x128_bf8_bf8", "mnemonic": "v_smfmac_f32_16x16x128_bf8_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X128 BF8 BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x128 sparse matrix in the first input by the 128x16 matrix in the second input and accumulate the result into the 16x16 matrix stored…", "description": "Multiply the 16x128 sparse matrix in the first input by the 128x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_16x16x128_bf8_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x128_bf8_fp8", "mnemonic": "v_smfmac_f32_16x16x128_bf8_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X128 BF8 FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x128 sparse matrix in the first input by the 128x16 matrix in the second input and accumulate the result into the 16x16 matrix stored…", "description": "Multiply the 16x128 sparse matrix in the first input by the 128x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_16x16x128_bf8_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x128_fp8_bf8", "mnemonic": "v_smfmac_f32_16x16x128_fp8_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X128 FP8 BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x128 sparse matrix in the first input by the 128x16 matrix in the second input and accumulate the result into the 16x16 matrix stored…", "description": "Multiply the 16x128 sparse matrix in the first input by the 128x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_16x16x128_fp8_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x128_fp8_fp8", "mnemonic": "v_smfmac_f32_16x16x128_fp8_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X128 FP8 FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x128 sparse matrix in the first input by the 128x16 matrix in the second input and accumulate the result into the 16x16 matrix stored…", "description": "Multiply the 16x128 sparse matrix in the first input by the 128x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_16x16x128_fp8_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x128bf8bf8", "mnemonic": "v_smfmac_f32_16x16x128bf8bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X128BF8BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_16x16x128bf8bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_16x16x128bf8fp8", "mnemonic": "v_smfmac_f32_16x16x128bf8fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X128BF8FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_16x16x128bf8fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_16x16x128fp8bf8", "mnemonic": "v_smfmac_f32_16x16x128fp8bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X128FP8BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_16x16x128fp8bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_16x16x128fp8fp8", "mnemonic": "v_smfmac_f32_16x16x128fp8fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X128FP8FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_16x16x128fp8fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_16x16x32_bf16", "mnemonic": "v_smfmac_f32_16x16x32_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X32 BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x32 sparse matrix in the first input by the 32x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in…", "description": "Multiply the 16x32 sparse matrix in the first input by the 32x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_16x16x32_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (sparse 16x32) * B (32x16) + D (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in BF16 float format, consuming half the physical storage of a dense matrix with\nsame dimensions. Matrix B is a dense matrix in BF16 float format. Matrix D is single-precision float format and\nis both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 4 passes.", "sourcePdfPage": 282, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x32_f16", "mnemonic": "v_smfmac_f32_16x16x32_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X32 F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x32 sparse matrix in the first input by the 32x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in…", "description": "Multiply the 16x32 sparse matrix in the first input by the 32x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_16x16x32_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "D = A (sparse 16x32) * B (32x16) + D (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in half-precision float format, consuming half the physical storage of a dense\nmatrix with same dimensions. Matrix B is a dense matrix in half-precision float format. Matrix D is single-precision float format and is both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 4 passes.", "sourcePdfPage": 281, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x32bf16", "mnemonic": "v_smfmac_f32_16x16x32bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X32BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_16x16x32bf16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_16x16x32f16", "mnemonic": "v_smfmac_f32_16x16x32f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X32F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_16x16x32f16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_16x16x64_bf16", "mnemonic": "v_smfmac_f32_16x16x64_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X64 BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in…", "description": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_16x16x64_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x64_bf8_bf8", "mnemonic": "v_smfmac_f32_16x16x64_bf8_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X64 BF8 BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in…", "description": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_16x16x64_bf8_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (sparse 16x64) * B (64x16) + D (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in BF8 float format, consuming half the physical storage of a dense matrix with\nsame dimensions. Matrix B is a dense matrix in BF8 float format. Matrix D is single-precision float format and\nis both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 4 passes.", "sourcePdfPage": 288, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x64_bf8_fp8", "mnemonic": "v_smfmac_f32_16x16x64_bf8_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X64 BF8 FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in…", "description": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_16x16x64_bf8_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (sparse 16x64) * B (64x16) + D (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in BF8 float format, consuming half the physical storage of a dense matrix with\nsame dimensions. Matrix B is a dense matrix in FP8 float format. Matrix D is single-precision float format and\nis both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 4 passes.", "sourcePdfPage": 288, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x64_f16", "mnemonic": "v_smfmac_f32_16x16x64_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X64 F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in…", "description": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_16x16x64_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x64_fp8_bf8", "mnemonic": "v_smfmac_f32_16x16x64_fp8_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X64 FP8 BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in…", "description": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_16x16x64_fp8_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (sparse 16x64) * B (64x16) + D (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in FP8 float format, consuming half the physical storage of a dense matrix with\nsame dimensions. Matrix B is a dense matrix in BF8 float format. Matrix D is single-precision float format and\nis both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 4 passes.", "sourcePdfPage": 289, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x64_fp8_fp8", "mnemonic": "v_smfmac_f32_16x16x64_fp8_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X64 FP8 FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in…", "description": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_16x16x64_fp8_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (sparse 16x64) * B (64x16) + D (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in FP8 float format, consuming half the physical storage of a dense matrix with\nsame dimensions. Matrix B is a dense matrix in FP8 float format. Matrix D is single-precision float format and\nis both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 4 passes.", "sourcePdfPage": 289, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_f32_16x16x64bf16", "mnemonic": "v_smfmac_f32_16x16x64bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X64BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_16x16x64bf16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_16x16x64bf8bf8", "mnemonic": "v_smfmac_f32_16x16x64bf8bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X64BF8BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_16x16x64bf8bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_16x16x64bf8fp8", "mnemonic": "v_smfmac_f32_16x16x64bf8fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X64BF8FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_16x16x64bf8fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_16x16x64f16", "mnemonic": "v_smfmac_f32_16x16x64f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X64F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_16x16x64f16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_16x16x64fp8bf8", "mnemonic": "v_smfmac_f32_16x16x64fp8bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X64FP8BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_16x16x64fp8bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_16x16x64fp8fp8", "mnemonic": "v_smfmac_f32_16x16x64fp8fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 16X16X64FP8FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_16x16x64fp8fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_32x32x16_bf16", "mnemonic": "v_smfmac_f32_32x32x16_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X16 BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x16 sparse matrix in the first input by the 16x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x16 sparse matrix in the first input by the 16x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_32x32x16_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (sparse 32x16) * B (16x32) + D (32x32)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in BF16 float format, consuming half the physical storage of a dense matrix with\nsame dimensions. Matrix B is a dense matrix in BF16 float format. Matrix D is single-precision float format and\nis both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 282, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_f32_32x32x16_f16", "mnemonic": "v_smfmac_f32_32x32x16_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X16 F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x16 sparse matrix in the first input by the 16x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x16 sparse matrix in the first input by the 16x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_32x32x16_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "D = A (sparse 32x16) * B (16x32) + D (32x32)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in half-precision float format, consuming half the physical storage of a dense\nmatrix with same dimensions. Matrix B is a dense matrix in half-precision float format. Matrix D is single-precision float format and is both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 281, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_f32_32x32x16bf16", "mnemonic": "v_smfmac_f32_32x32x16bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X16BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_32x32x16bf16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_32x32x16f16", "mnemonic": "v_smfmac_f32_32x32x16f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X16F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_32x32x16f16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_32x32x32_bf16", "mnemonic": "v_smfmac_f32_32x32x32_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X32 BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_32x32x32_bf16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_32x32x32_bf8_bf8", "mnemonic": "v_smfmac_f32_32x32x32_bf8_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X32 BF8 BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_32x32x32_bf8_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (sparse 32x32) * B (32x32) + D (32x32)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in BF8 float format, consuming half the physical storage of a dense matrix with\nsame dimensions. Matrix B is a dense matrix in BF8 float format. Matrix D is single-precision float format and\nis both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 290, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_f32_32x32x32_bf8_fp8", "mnemonic": "v_smfmac_f32_32x32x32_bf8_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X32 BF8 FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_32x32x32_bf8_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (sparse 32x32) * B (32x32) + D (32x32)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in BF8 float format, consuming half the physical storage of a dense matrix with\nsame dimensions. Matrix B is a dense matrix in FP8 float format. Matrix D is single-precision float format and\nis both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 290, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_f32_32x32x32_f16", "mnemonic": "v_smfmac_f32_32x32x32_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X32 F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_32x32x32_f16", "operands": [], "dataTypes": ["f16", "f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_32x32x32_fp8_bf8", "mnemonic": "v_smfmac_f32_32x32x32_fp8_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X32 FP8 BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_32x32x32_fp8_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (sparse 32x32) * B (32x32) + D (32x32)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in FP8 float format, consuming half the physical storage of a dense matrix with\nsame dimensions. Matrix B is a dense matrix in BF8 float format. Matrix D is single-precision float format and\nis both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 291, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_f32_32x32x32_fp8_fp8", "mnemonic": "v_smfmac_f32_32x32x32_fp8_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X32 FP8 FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_32x32x32_fp8_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "D = A (sparse 32x32) * B (32x32) + D (32x32)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in FP8 float format, consuming half the physical storage of a dense matrix with\nsame dimensions. Matrix B is a dense matrix in FP8 float format. Matrix D is single-precision float format and\nis both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 291, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_f32_32x32x32bf16", "mnemonic": "v_smfmac_f32_32x32x32bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X32BF16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_32x32x32bf16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_32x32x32bf8bf8", "mnemonic": "v_smfmac_f32_32x32x32bf8bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X32BF8BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_32x32x32bf8bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_32x32x32bf8fp8", "mnemonic": "v_smfmac_f32_32x32x32bf8fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X32BF8FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_32x32x32bf8fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_32x32x32f16", "mnemonic": "v_smfmac_f32_32x32x32f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X32F16", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_32x32x32f16", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_32x32x32fp8bf8", "mnemonic": "v_smfmac_f32_32x32x32fp8bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X32FP8BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_32x32x32fp8bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_32x32x32fp8fp8", "mnemonic": "v_smfmac_f32_32x32x32fp8fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X32FP8FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_32x32x32fp8fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_32x32x64_bf8_bf8", "mnemonic": "v_smfmac_f32_32x32x64_bf8_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X64 BF8 BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x64 sparse matrix in the first input by the 64x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x64 sparse matrix in the first input by the 64x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_32x32x64_bf8_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_32x32x64_bf8_fp8", "mnemonic": "v_smfmac_f32_32x32x64_bf8_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X64 BF8 FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x64 sparse matrix in the first input by the 64x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x64 sparse matrix in the first input by the 64x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_32x32x64_bf8_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_32x32x64_fp8_bf8", "mnemonic": "v_smfmac_f32_32x32x64_fp8_bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X64 FP8 BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x64 sparse matrix in the first input by the 64x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x64 sparse matrix in the first input by the 64x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_32x32x64_fp8_bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_32x32x64_fp8_fp8", "mnemonic": "v_smfmac_f32_32x32x64_fp8_fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X64 FP8 FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x64 sparse matrix in the first input by the 64x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x64 sparse matrix in the first input by the 64x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_f32_32x32x64_fp8_fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_f32_32x32x64bf8bf8", "mnemonic": "v_smfmac_f32_32x32x64bf8bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X64BF8BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_32x32x64bf8bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_32x32x64bf8fp8", "mnemonic": "v_smfmac_f32_32x32x64bf8fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X64BF8FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_32x32x64bf8fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_32x32x64fp8bf8", "mnemonic": "v_smfmac_f32_32x32x64fp8bf8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X64FP8BF8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_32x32x64fp8bf8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_f32_32x32x64fp8fp8", "mnemonic": "v_smfmac_f32_32x32x64fp8fp8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC F32 32X32X64FP8FP8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_f32_32x32x64fp8fp8", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_i32_16x16x128_i8", "mnemonic": "v_smfmac_i32_16x16x128_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC I32 16X16X128 I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x128 sparse matrix in the first input by the 128x16 matrix in the second input and accumulate the result into the 16x16 matrix stored…", "description": "Multiply the 16x128 sparse matrix in the first input by the 128x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_i32_16x16x128_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_i32_16x16x128i8", "mnemonic": "v_smfmac_i32_16x16x128i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC I32 16X16X128I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on i32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_i32_16x16x128i8", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_i32_16x16x64_i8", "mnemonic": "v_smfmac_i32_16x16x64_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC I32 16X16X64 I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in…", "description": "Multiply the 16x64 sparse matrix in the first input by the 64x16 matrix in the second input and accumulate the result into the 16x16 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_i32_16x16x64_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "D = A (sparse 16x64) * B (64x16) + D (16x16)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in signed 8-bit integer format, consuming half the physical storage of a dense\nmatrix with same dimensions. Matrix B is a dense matrix in signed 8-bit integer format. Matrix D is signed 32-\nbit integer format and is both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 4 passes.", "sourcePdfPage": 283, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_i32_16x16x64i8", "mnemonic": "v_smfmac_i32_16x16x64i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC I32 16X16X64I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on i32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_i32_16x16x64i8", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_i32_32x32x32_i8", "mnemonic": "v_smfmac_i32_32x32x32_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC I32 32X32X32 I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x32 sparse matrix in the first input by the 32x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_i32_32x32x32_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "D = A (sparse 32x32) * B (32x32) + D (32x32)\nEach operand contains a single matrix whose elements are distributed across all lanes of the wave. A single\nmatrix multiply is computed and the row-column dot products are distributed across the vector ALU for higher\nperformance.\nMatrix A is a sparse matrix in signed 8-bit integer format, consuming half the physical storage of a dense\nmatrix with same dimensions. Matrix B is a dense matrix in signed 8-bit integer format. Matrix D is signed 32-\nbit integer format and is both the output and the accumulate input.\n2 out of every 4 elements on the K axis of matrix A are zero. The sparse indexes are used to determine which 2\nelements are zero.", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "This instruction performs 8 passes.", "sourcePdfPage": 283, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_smfmac_i32_32x32x32i8", "mnemonic": "v_smfmac_i32_32x32x32i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC I32 32X32X32I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on i32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_i32_32x32x32i8", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_smfmac_i32_32x32x64_i8", "mnemonic": "v_smfmac_i32_32x32x64_i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC I32 32X32X64 I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "Multiply the 32x64 sparse matrix in the first input by the 64x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in…", "description": "Multiply the 32x64 sparse matrix in the first input by the 64x32 matrix in the second input and accumulate the result into the 32x32 matrix stored in the destination registers using fused multiply add. Sparse indexes for the first matrix are given in the third input.", "syntax": "v_smfmac_i32_32x32x64_i8", "operands": [], "dataTypes": ["i32", "i8"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_smfmac_i32_32x32x64i8", "mnemonic": "v_smfmac_i32_32x32x64i8", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SMFMAC I32 32X32X64I8", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on i32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_smfmac_i32_32x32x64i8", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_sqrt_bf16", "mnemonic": "v_sqrt_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SQRT BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_sqrt_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_sqrt_f16", "mnemonic": "v_sqrt_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SQRT F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the square root of the half-precision float input using IEEE rules and store the result into a vector register.", "description": "Calculate the square root of the half-precision float input using IEEE rules and store the result into a vector register.", "syntax": "v_sqrt_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = sqrt(S0.f16)", "example": "V_SQRT_F16(0xfc00) => 0xfe00     // sqrt(-INF) = NAN\nV_SQRT_F16(0x8000) => 0x8000     // sqrt(-0.0) = -0\nV_SQRT_F16(0x0000) => 0x0000     // sqrt(+0.0) = +0\nV_SQRT_F16(0x4400) => 0x4000     // sqrt(+4.0) = +2.0", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy, denormals are supported.", "sourcePdfPage": 205, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_sqrt_f32", "mnemonic": "v_sqrt_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SQRT F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the square root of the single-precision float input using IEEE rules and store the result into a vector register.", "description": "Calculate the square root of the single-precision float input using IEEE rules and store the result into a vector register.", "syntax": "v_sqrt_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = sqrt(S0.f32)", "example": "V_SQRT_F32(0xff800000) => 0xffc00000     // sqrt(-INF) = NAN\nV_SQRT_F32(0x80000000) => 0x80000000     // sqrt(-0.0) = -0\nV_SQRT_F32(0x00000000) => 0x00000000     // sqrt(+0.0) = +0\nV_SQRT_F32(0x40800000) => 0x40000000     // sqrt(+4.0) = +2.0", "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "1ULP accuracy, denormals are flushed.", "sourcePdfPage": 198, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_sqrt_f64", "mnemonic": "v_sqrt_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SQRT F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the square root of the double-precision float input using IEEE rules and store the result into a vector register.", "description": "Calculate the square root of the double-precision float input using IEEE rules and store the result into a vector register.", "syntax": "v_sqrt_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.f64 = sqrt(S0.f64)", "example": "v_sqrt_f64 v[5:6], -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "This opcode has (2**29)ULP accuracy and supports denormals.", "sourcePdfPage": 198, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_sub_co_u32", "mnemonic": "v_sub_co_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUB CO U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the second unsigned 32-bit integer input from the first input, store the result into a vector register and store the carry-out mask into a…", "description": "Subtract the second unsigned 32-bit integer input from the first input, store the result into a vector register and store the carry-out mask into a scalar register.", "syntax": "v_sub_co_u32", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = S0.u32 - S1.u32;\nVCC.u64[laneId] = S1.u32 > S0.u32 ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUBB_CO_U32.\nD0.u32 = tmp.u32", "example": "v_sub_co_u32 v5, s6, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "In VOP3 the VCC destination may be an arbitrary SGPR-pair. Supports saturation (unsigned 32-bit integer domain).", "sourcePdfPage": 175, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_sub_f16", "mnemonic": "v_sub_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUB F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the second floating point input from the first input and store the result into a vector register.", "description": "Subtract the second floating point input from the first input and store the result into a vector register.", "syntax": "v_sub_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = S0.f16 - S1.f16", "example": "v_sub_f16 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP precision. Supports denormals, round mode, exception flags and saturation.", "sourcePdfPage": 177, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_sub_f32", "mnemonic": "v_sub_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUB F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Per-lane single-precision floating-point subtract.", "description": "Subtract the second floating point input from the first input and store the result into a vector register.", "syntax": "v_sub_f32 VDST, S0, S1", "operands": [{"name": "VDST", "desc": "Destination VGPR"}, {"name": "S0", "desc": "Minuend"}, {"name": "S1", "desc": "Subtrahend"}], "dataTypes": ["f32"], "semantics": "VDST[lane] = S0[lane].f32 - S1[lane].f32 for each active lane.", "example": "v_sub_f32  v2, v0, v1   // per-lane v2 = v0 - v1", "exampleSource": null, "encoding": {"format": "VOP2", "widthBits": 32}, "executionUnit": "Vector ALU", "registerClasses": ["VGPR"], "memorySegment": null, "supportedTargets": ["gfx942", "gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["amd-machine-readable-isa"]}
{"id": "amdgpu.v_sub_i16", "mnemonic": "v_sub_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUB I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the second signed 16-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "description": "Subtract the second signed 16-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_sub_i16", "operands": [], "dataTypes": ["i16"], "semantics": "D0.i16 = S0.i16 - S1.i16", "example": null, "exampleSource": null, "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Supports saturation (signed 16-bit integer domain).", "sourcePdfPage": 368, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_sub_i32", "mnemonic": "v_sub_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUB I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the second signed 32-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "description": "Subtract the second signed 32-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_sub_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa"]}
{"id": "amdgpu.v_sub_nc_i16", "mnemonic": "v_sub_nc_i16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUB NC I16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the second signed 16-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "description": "Subtract the second signed 16-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_sub_nc_i16", "operands": [], "dataTypes": ["i16"], "semantics": "", "example": "v_sub_nc_i16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_sub_nc_i32", "mnemonic": "v_sub_nc_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUB NC I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the second signed 32-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "description": "Subtract the second signed 32-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_sub_nc_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": "v_sub_nc_i32 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_sub_nc_u16", "mnemonic": "v_sub_nc_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUB NC U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the second unsigned 16-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "description": "Subtract the second unsigned 16-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_sub_nc_u16", "operands": [], "dataTypes": ["u16"], "semantics": "", "example": "v_sub_nc_u16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_sub_nc_u64", "mnemonic": "v_sub_nc_u64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUB NC U64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on u64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_sub_nc_u64", "operands": [], "dataTypes": ["u64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_sub_u16", "mnemonic": "v_sub_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUB U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the second unsigned 16-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "description": "Subtract the second unsigned 16-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_sub_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u16 = S0.u16 - S1.u16", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Supports saturation (unsigned 16-bit integer domain).", "sourcePdfPage": 179, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_sub_u32", "mnemonic": "v_sub_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUB U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the second unsigned 32-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "description": "Subtract the second unsigned 32-bit integer input from the first input and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_sub_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = S0.u32 - S1.u32", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Supports saturation (unsigned 32-bit integer domain).", "sourcePdfPage": 183, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_subb_co_u32", "mnemonic": "v_subb_co_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUBB CO U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the second unsigned 32-bit integer input from the first input, subtract a bit from the carry-in mask, store the result into a vector…", "description": "Subtract the second unsigned 32-bit integer input from the first input, subtract a bit from the carry-in mask, store the result into a vector register and store the carry-out mask into a scalar register.", "syntax": "v_subb_co_u32", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = S0.u32 - S1.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S1.u32) + VCC.u64[laneId].u64 > 64'U(S0.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUBB_CO_U32.\nD0.u32 = tmp.u32", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "In VOP3 the VCC destination may be an arbitrary SGPR-pair, and the VCC source comes from the SGPR-pair at S2.u. Supports saturation (unsigned 32-bit integer domain).", "sourcePdfPage": 176, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_subb_u32", "mnemonic": "v_subb_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUBB U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_subb_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_subbrev_co_u32", "mnemonic": "v_subbrev_co_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUBBREV CO U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the first unsigned 32-bit integer input from the second input, subtract a bit from the carry-in mask, store the result into a vector…", "description": "Subtract the first unsigned 32-bit integer input from the second input, subtract a bit from the carry-in mask, store the result into a vector register and store the carry-out mask into a scalar register.", "syntax": "v_subbrev_co_u32", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = S1.u32 - S0.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S0.u32) + VCC.u64[laneId].u64 > 64'U(S1.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUBB_CO_U32.\nD0.u32 = tmp.u32", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "In VOP3 the VCC destination may be an arbitrary SGPR-pair, and the VCC source comes from the SGPR-pair at S2.u. Supports saturation (unsigned 32-bit integer domain).", "sourcePdfPage": 177, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_subbrev_u32", "mnemonic": "v_subbrev_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUBBREV U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on u32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_subbrev_u32", "operands": [], "dataTypes": ["u32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_subrev_co_u32", "mnemonic": "v_subrev_co_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUBREV CO U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the first unsigned 32-bit integer input from the second input, store the result into a vector register and store the carry-out mask into a…", "description": "Subtract the first unsigned 32-bit integer input from the second input, store the result into a vector register and store the carry-out mask into a scalar register.", "syntax": "v_subrev_co_u32", "operands": [], "dataTypes": ["u32"], "semantics": "tmp = S1.u32 - S0.u32;\nVCC.u64[laneId] = S0.u32 > S1.u32 ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUBB_CO_U32.\nD0.u32 = tmp.u32", "example": "v_subrev_co_u32 v5, s6, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "In VOP3 the VCC destination may be an arbitrary SGPR-pair. Supports saturation (unsigned 32-bit integer domain).", "sourcePdfPage": 176, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_subrev_f16", "mnemonic": "v_subrev_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUBREV F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the first floating point input from the second input and store the result into a vector register.", "description": "Subtract the first floating point input from the second input and store the result into a vector register.", "syntax": "v_subrev_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = S1.f16 - S0.f16", "example": "v_subrev_f16 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP precision. Supports denormals, round mode, exception flags and saturation.", "sourcePdfPage": 178, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_subrev_f32", "mnemonic": "v_subrev_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUBREV F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the first floating point input from the second input and store the result into a vector register.", "description": "Subtract the first floating point input from the second input and store the result into a vector register.", "syntax": "v_subrev_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = S1.f32 - S0.f32", "example": "v_subrev_f32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "0.5ULP precision, denormals are supported.", "sourcePdfPage": 170, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_subrev_i32", "mnemonic": "v_subrev_i32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUBREV I32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on i32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_subrev_i32", "operands": [], "dataTypes": ["i32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_subrev_u16", "mnemonic": "v_subrev_u16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUBREV U16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the first unsigned 16-bit integer input from the second input and store the result into a vector register. No carry-in or carry-out support.", "description": "Subtract the first unsigned 16-bit integer input from the second input and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_subrev_u16", "operands": [], "dataTypes": ["u16"], "semantics": "D0.u16 = S1.u16 - S0.u16", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Supports saturation (unsigned 16-bit integer domain).", "sourcePdfPage": 180, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_subrev_u32", "mnemonic": "v_subrev_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SUBREV U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Subtract the first unsigned 32-bit integer input from the second input and store the result into a vector register. No carry-in or carry-out support.", "description": "Subtract the first unsigned 32-bit integer input from the second input and store the result into a vector register. No carry-in or carry-out support.", "syntax": "v_subrev_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = S1.u32 - S0.u32", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": "Supports saturation (unsigned 32-bit integer domain).", "sourcePdfPage": 183, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa"]}
{"id": "amdgpu.v_swap_b16", "mnemonic": "v_swap_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SWAP B16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Swap the values in two vector registers.", "description": "Swap the values in two vector registers.", "syntax": "v_swap_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "v_swap_b16 v5.l, v1.h", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_swap_b32", "mnemonic": "v_swap_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SWAP B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Swap the values in two vector registers.", "description": "Swap the values in two vector registers.", "syntax": "v_swap_b32", "operands": [], "dataTypes": ["b32"], "semantics": "tmp = D0.b32;\nD0.b32 = S0.b32;\nS0.b32 = tmp", "example": "v_swap_b32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Input and output modifiers not supported; this is an untyped operation.", "sourcePdfPage": 211, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_swaprel_b32", "mnemonic": "v_swaprel_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V SWAPREL B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Swap the values in two relatively-indexed vector registers.", "description": "Swap the values in two relatively-indexed vector registers.", "syntax": "v_swaprel_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "v_swaprel_b32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_tanh_bf16", "mnemonic": "v_tanh_bf16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V TANH BF16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_tanh_bf16", "operands": [], "dataTypes": [], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_tanh_f16", "mnemonic": "v_tanh_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V TANH F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_tanh_f16", "operands": [], "dataTypes": ["f16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_tanh_f32", "mnemonic": "v_tanh_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V TANH F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP1 vector instruction operating on f32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_tanh_f32", "operands": [], "dataTypes": ["f32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_trig_preop_f64", "mnemonic": "v_trig_preop_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V TRIG PREOP F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Look up a 53-bit segment of 2/PI using an integer segment select in the second input.", "description": "Look up a 53-bit segment of 2/PI using an integer segment select in the second input. Scale the intermediate result by the exponent from the first double-precision float input and store the double-precision float result into a vector register. This operation returns an aligned, double precision segment of 2/PI needed to do trigonometric argument reduction on the floating point input. Multiple segments can be accessed using the first input. Rounding is toward zero. Large floating point inputs (with an exponent > 1968) are scaled to avoid loss of precision through denormalization.", "syntax": "v_trig_preop_f64", "operands": [], "dataTypes": ["f64"], "semantics": "shift = 32'I(S1[4 : 0].u32) * 53;\nif exponent(S0.f64) > 1077 then\nshift += exponent(S0.f64) - 1077\nendif;\n// (2.0/PI) == 0.{b_1200, b_1199, b_1198, ..., b_1, b_0}\n// b_1200 is the MSB of the fractional part of 2.0/PI\n// Left shift operation indicates which bits are brought\n// into the whole part of the number.\n// Only whole part of result is kept.\nresult = 64'F((1201'B(2.0 / PI)[1200 : 0] << shift.u32) & 1201'0x1fffffffffffff);\nscale = -53 - shift;\nif exponent(S0.f64) >= 1968 then\nscale += 128\nendif;\nD0.f64 = ldexp(result, scale)", "example": "v_trig_preop_f64 v[5:6], -1, -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "For a more complete treatment of trigonometric argument reduction refer to Argument Reduction for Huge Arguments: Good to the Last Bit, K. C. Ng et.al., March 1992, available online.", "sourcePdfPage": 365, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_trunc_f16", "mnemonic": "v_trunc_f16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V TRUNC F16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the integer part of a half-precision float input using round toward zero semantics and store the result in floating point format into a…", "description": "Compute the integer part of a half-precision float input using round toward zero semantics and store the result in floating point format into a vector register.", "syntax": "v_trunc_f16", "operands": [], "dataTypes": ["f16"], "semantics": "D0.f16 = trunc(S0.f16)", "example": "v_trunc_f16 v5.l, s1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 208, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_trunc_f32", "mnemonic": "v_trunc_f32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V TRUNC F32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the integer part of a single-precision float input using round toward zero semantics and store the result in floating point format into a…", "description": "Compute the integer part of a single-precision float input using round toward zero semantics and store the result in floating point format into a vector register.", "syntax": "v_trunc_f32", "operands": [], "dataTypes": ["f32"], "semantics": "D0.f32 = trunc(S0.f32)", "example": "v_trunc_f32 v5, v1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 194, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_trunc_f64", "mnemonic": "v_trunc_f64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V TRUNC F64", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Compute the integer part of a double-precision float input using round toward zero semantics and store the result in floating point format into a…", "description": "Compute the integer part of a double-precision float input using round toward zero semantics and store the result in floating point format into a vector register.", "syntax": "v_trunc_f64", "operands": [], "dataTypes": ["f64"], "semantics": "D0.f64 = trunc(S0.f64)", "example": "v_trunc_f64 v[5:6], -1", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP1"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": 192, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_wmma_ld_scale16_paired_b64", "mnemonic": "v_wmma_ld_scale16_paired_b64", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V WMMA LD SCALE16 PAIRED B64", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on b64 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_wmma_ld_scale16_paired_b64", "operands": [], "dataTypes": ["b64"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_wmma_ld_scale_paired_b32", "mnemonic": "v_wmma_ld_scale_paired_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V WMMA LD SCALE PAIRED B32", "category": "Vector Packed Arithmetic", "instructionClass": "matrix", "summary": "AMDGPU VOP3P matrix instruction operating on b32 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_wmma_ld_scale_paired_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP3P"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_writelane_b32", "mnemonic": "v_writelane_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V WRITELANE B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Write the scalar value in the first input into the specified lane of a vector register where the lane select is in the second input.", "description": "Write the scalar value in the first input into the specified lane of a vector register where the lane select is in the second input.", "syntax": "v_writelane_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "v_writelane_b32 v5, s1, s2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_xad_u32", "mnemonic": "v_xad_u32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V XAD U32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate bitwise XOR of the first two vector inputs, then add the third vector input to the intermediate result, then store the final result into a…", "description": "Calculate bitwise XOR of the first two vector inputs, then add the third vector input to the intermediate result, then store the final result into a vector register.", "syntax": "v_xad_u32", "operands": [], "dataTypes": ["u32"], "semantics": "D0.u32 = (S0.u32 ^ S1.u32) + S2.u32", "example": "v_xad_u32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "No carryin/carryout and no saturation. This opcode is designed to help accelerate the SHA256 hash algorithm.", "sourcePdfPage": 353, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_xnor_b32", "mnemonic": "v_xnor_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V XNOR B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate bitwise XNOR on two vector inputs and store the result into a vector register.", "description": "Calculate bitwise XNOR on two vector inputs and store the result into a vector register.", "syntax": "v_xnor_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = ~(S0.u32 ^ S1.u32)", "example": "v_xnor_b32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Input and output modifiers not supported.", "sourcePdfPage": 185, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_xor3_b32", "mnemonic": "v_xor3_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V XOR3 B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate the bitwise XOR of three vector inputs and store the result into a vector register.", "description": "Calculate the bitwise XOR of three vector inputs and store the result into a vector register.", "syntax": "v_xor3_b32", "operands": [], "dataTypes": ["b32"], "semantics": "", "example": "v_xor3_b32 v5, v1, v2, s3", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_xor_b16", "mnemonic": "v_xor_b16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V XOR B16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate bitwise XOR on two vector inputs and store the result into a vector register.", "description": "Calculate bitwise XOR on two vector inputs and store the result into a vector register.", "syntax": "v_xor_b16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": "v_xor_b16 v5, v1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP3"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage", "amd-machine-readable-isa", "llvm-mc-amdgpu-tests"]}
{"id": "amdgpu.v_xor_b16_fake16", "mnemonic": "v_xor_b16_fake16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V XOR B16 FAKE16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on b16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_xor_b16_fake16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_xor_b16_t16", "mnemonic": "v_xor_b16_t16", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V XOR B16 T16", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "AMDGPU VOP2 vector instruction operating on b16 data. (Format and name extracted from LLVM's AMDGPU backend source - semantics not yet curated.)", "description": "", "syntax": "v_xor_b16_t16", "operands": [], "dataTypes": ["b16"], "semantics": "", "example": null, "exampleSource": null, "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": [], "unsupportedTargets": [], "architecturalNotes": null, "sourcePdfPage": null, "sourceIds": ["llvm-amdgpu-usage"]}
{"id": "amdgpu.v_xor_b32", "mnemonic": "v_xor_b32", "architecture": "AMDGPU", "vendor": "AMD", "processorClass": "gpu", "isaLayer": "native", "executionModel": "Wavefront-based SIMT/SIMD", "full_name": "V XOR B32", "category": "Vector Arithmetic", "instructionClass": "vector", "summary": "Calculate bitwise XOR on two vector inputs and store the result into a vector register.", "description": "Calculate bitwise XOR on two vector inputs and store the result into a vector register.", "syntax": "v_xor_b32", "operands": [], "dataTypes": ["b32"], "semantics": "D0.u32 = (S0.u32 ^ S1.u32)", "example": "v_xor_b32 v5, -1, v2", "exampleSource": "llvm-mc-amdgpu-tests", "encoding": {"format": "VOP2"}, "executionUnit": "", "registerClasses": [], "memorySegment": null, "supportedTargets": ["gfx1100"], "unsupportedTargets": [], "architecturalNotes": "Input and output modifiers not supported.", "sourcePdfPage": 174, "sourceIds": ["llvm-amdgpu-usage", "amd-instinct-mi300-isa", "llvm-mc-amdgpu-tests"]}
