123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- =========================
- AMDGPU Instruction Syntax
- =========================
- .. contents::
- :local:
- .. _amdgpu_syn_instructions:
- Instructions
- ============
- Syntax
- ~~~~~~
- An instruction has the following syntax:
- ``<``\ *opcode mnemonic*\ ``> <``\ *operand0*\ ``>, <``\ *operand1*\ ``>,... <``\ *modifier0*\ ``> <``\ *modifier1*\ ``>...``
- :doc:`Operands<AMDGPUOperandSyntax>` are normally comma-separated while
- :doc:`modifiers<AMDGPUModifierSyntax>` are space-separated.
- The order of *operands* and *modifiers* is fixed.
- Most *modifiers* are optional and may be omitted.
- .. _amdgpu_syn_instruction_mnemo:
- Opcode Mnemonic
- ~~~~~~~~~~~~~~~
- Opcode mnemonic describes opcode semantics and may include one or more suffices in this order:
- * :ref:`Destination operand type suffix<amdgpu_syn_instruction_type>`.
- * :ref:`Source operand type suffix<amdgpu_syn_instruction_type>`.
- * :ref:`Encoding suffix<amdgpu_syn_instruction_enc>`.
- .. _amdgpu_syn_instruction_type:
- Type and Size Suffices
- ~~~~~~~~~~~~~~~~~~~~~~
- Instructions which operate with data have an implied type of *data* operands.
- This data type is specified as a suffix of instruction mnemonic.
- There are instructions which have 2 type suffices:
- the first is the data type of the destination operand,
- the second is the data type of source *data* operand(s).
- Note that data type specified by an instruction does not apply
- to other kinds of operands such as *addresses*, *offsets* and so on.
- The following table enumerates the most frequently used type suffices.
- ============================================ ======================= =================
- Type Suffices Packed instruction? Data Type
- ============================================ ======================= =================
- _b512, _b256, _b128, _b64, _b32, _b16, _b8 No Bits.
- _u64, _u32, _u16, _u8 No Unsigned integer.
- _i64, _i32, _i16, _i8 No Signed integer.
- _f64, _f32, _f16 No Floating-point.
- _b16, _u16, _i16, _f16 Yes Packed.
- ============================================ ======================= =================
- Instructions which have no type suffices are assumed to operate with typeless data.
- The size of data is specified by size suffices:
- ================= =================== =====================================
- Size Suffix Implied data type Required register size in dwords
- ================= =================== =====================================
- \- b32 1
- x2 b64 2
- x3 b96 3
- x4 b128 4
- x8 b256 8
- x16 b512 16
- x b32 1
- xy b64 2
- xyz b96 3
- xyzw b128 4
- d16_x b16 1
- d16_xy b16x2 2 for GFX8.0, 1 for GFX8.1 and GFX9
- d16_xyz b16x3 3 for GFX8.0, 2 for GFX8.1 and GFX9
- d16_xyzw b16x4 4 for GFX8.0, 2 for GFX8.1 and GFX9
- ================= =================== =====================================
- .. WARNING::
- There are exceptions from rules described above.
- Operands which have type different from type specified by the opcode are
- :ref:`tagged<amdgpu_syn_instruction_operand_tags>` in the description.
- Examples of instructions with different types of source and destination operands:
- .. parsed-literal::
- s_bcnt0_i32_b64
- v_cvt_f32_u32
- Examples of instructions with one data type:
- .. parsed-literal::
- v_max3_f32
- v_max3_i16
- Examples of instructions which operate with packed data:
- .. parsed-literal::
- v_pk_add_u16
- v_pk_add_i16
- v_pk_add_f16
- Examples of typeless instructions which operate on b128 data:
- .. parsed-literal::
- buffer_store_dwordx4
- flat_load_dwordx4
- .. _amdgpu_syn_instruction_enc:
- Encoding Suffices
- ~~~~~~~~~~~~~~~~~
- Most *VOP1*, *VOP2* and *VOPC* instructions have several variants:
- they may also be encoded in *VOP3*, *DPP* and *SDWA* formats.
- The assembler will automatically use optimal encoding based on instruction operands.
- To force specific encoding, one can add a suffix to the opcode of the instruction:
- =================================================== =================
- Encoding Encoding Suffix
- =================================================== =================
- Native 32-bit encoding (*VOP1*, *VOP2* or *VOPC*) _e32
- *VOP3* (64-bit) encoding _e64
- *DPP* encoding _dpp
- *SDWA* encoding _sdwa
- =================================================== =================
- These suffices are used in this reference to indicate the assumed encoding.
- When no suffix is specified, a native encoding is implied.
- Operands
- ========
- Syntax
- ~~~~~~
- Syntax of most operands is described :doc:`in this document<AMDGPUOperandSyntax>`.
- For detailed information about operands follow *operand links* in GPU-specific documents:
- * :doc:`GFX7<AMDGPU/AMDGPUAsmGFX7>`
- * :doc:`GFX8<AMDGPU/AMDGPUAsmGFX8>`
- * :doc:`GFX9<AMDGPU/AMDGPUAsmGFX9>`
- * :doc:`GFX10<AMDGPU/AMDGPUAsmGFX10>`
- Modifiers
- =========
- Syntax
- ~~~~~~
- Syntax of modifiers is described :doc:`in this document<AMDGPUModifierSyntax>`.
- Information about modifiers supported for individual instructions may be found in GPU-specific documents:
- * :doc:`GFX7<AMDGPU/AMDGPUAsmGFX7>`
- * :doc:`GFX8<AMDGPU/AMDGPUAsmGFX8>`
- * :doc:`GFX9<AMDGPU/AMDGPUAsmGFX9>`
- * :doc:`GFX10<AMDGPU/AMDGPUAsmGFX10>`
|