2018-12-18 01:38:11 +08:00
|
|
|
============================
|
|
|
|
AMDGPU Instructions Notation
|
|
|
|
============================
|
|
|
|
|
|
|
|
.. contents::
|
|
|
|
:local:
|
|
|
|
|
|
|
|
.. _amdgpu_syn_instruction_notation:
|
|
|
|
|
|
|
|
Introduction
|
|
|
|
============
|
|
|
|
|
2020-08-21 19:22:25 +08:00
|
|
|
This is an overview of notation used to describe syntax of AMDGPU assembler instructions.
|
2018-12-18 01:38:11 +08:00
|
|
|
|
|
|
|
This notation mimics the :ref:`syntax of assembler instructions<amdgpu_syn_instructions>`
|
|
|
|
except that instead of real operands and modifiers it provides references to their description.
|
|
|
|
|
|
|
|
Instructions
|
|
|
|
============
|
|
|
|
|
|
|
|
Notation
|
|
|
|
~~~~~~~~
|
|
|
|
|
|
|
|
This is the notation used to describe AMDGPU instructions:
|
|
|
|
|
|
|
|
``<``\ :ref:`opcode description<amdgpu_syn_opcode_notation>`\ ``> <``\ :ref:`operands description<amdgpu_syn_instruction_operands_notation>`\ ``> <``\ :ref:`modifiers description<amdgpu_syn_instruction_modifiers_notation>`\ ``>``
|
|
|
|
|
|
|
|
.. _amdgpu_syn_opcode_notation:
|
|
|
|
|
|
|
|
Opcode
|
|
|
|
======
|
|
|
|
|
|
|
|
Notation
|
|
|
|
~~~~~~~~
|
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
.. _amdgpu_syn_instruction_operands_notation:
|
|
|
|
|
|
|
|
Operands
|
|
|
|
========
|
|
|
|
|
|
|
|
An instruction may have zero or more *operands*. They are comma-separated in the description:
|
|
|
|
|
|
|
|
``<``\ :ref:`description of operand 0<amdgpu_syn_instruction_operand_notation>`\ ``>, <``\ :ref:`description of operand 1<amdgpu_syn_instruction_operand_notation>`\ ``>, ...``
|
|
|
|
|
|
|
|
The order of *operands* is fixed. *Operands* cannot be omitted
|
|
|
|
except for special cases described below.
|
|
|
|
|
|
|
|
.. _amdgpu_syn_instruction_operand_notation:
|
|
|
|
|
|
|
|
Notation
|
|
|
|
~~~~~~~~
|
|
|
|
|
|
|
|
An operand is described using the following notation:
|
|
|
|
|
|
|
|
*<name><tag0><tag1>...*
|
|
|
|
|
|
|
|
Where:
|
|
|
|
|
|
|
|
* *name* is a link to a description of the operand.
|
|
|
|
* *tags* are optional. They are used to indicate special operand properties:
|
|
|
|
|
|
|
|
.. _amdgpu_syn_instruction_operand_tags:
|
|
|
|
|
|
|
|
============== =================================================================================
|
|
|
|
Operand tag Meaning
|
|
|
|
============== =================================================================================
|
|
|
|
:opt An optional operand.
|
|
|
|
:m An operand which may be used with
|
|
|
|
:ref:`VOP3 operand modifiers<amdgpu_synid_vop3_operand_modifiers>` or
|
|
|
|
:ref:`SDWA operand modifiers<amdgpu_synid_sdwa_operand_modifiers>`.
|
|
|
|
:dst An input operand which may also serve as a destination
|
|
|
|
if :ref:`glc<amdgpu_synid_glc>` modifier is specified.
|
|
|
|
:fx This is an *f32* or *f16* operand depending on
|
2018-12-28 19:48:23 +08:00
|
|
|
:ref:`m_op_sel_hi<amdgpu_synid_mad_mix_op_sel_hi>` modifier.
|
2018-12-18 01:38:11 +08:00
|
|
|
:<type> Operand *type* differs from *type*
|
|
|
|
:ref:`implied by the opcode name<amdgpu_syn_instruction_type>`.
|
|
|
|
This tag specifies actual operand *type*.
|
|
|
|
============== =================================================================================
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
2018-12-18 02:53:10 +08:00
|
|
|
.. parsed-literal::
|
2018-12-18 01:38:11 +08:00
|
|
|
|
|
|
|
src1:m // src1 operand may be used with operand modifiers
|
|
|
|
vdata:dst // vdata operand may be used as both source and destination
|
|
|
|
vdst:u32 // vdst operand has u32 type
|
|
|
|
|
|
|
|
.. _amdgpu_syn_instruction_modifiers_notation:
|
|
|
|
|
|
|
|
Modifiers
|
|
|
|
=========
|
|
|
|
|
|
|
|
An instruction may have zero or more optional *modifiers*. They are space-separated in the description:
|
|
|
|
|
|
|
|
``<``\ :ref:`description of modifier 0<amdgpu_syn_instruction_modifier_notation>`\ ``> <``\ :ref:`description of modifier 1<amdgpu_syn_instruction_modifier_notation>`\ ``> ...``
|
|
|
|
|
|
|
|
The order of *modifiers* is fixed.
|
|
|
|
|
|
|
|
.. _amdgpu_syn_instruction_modifier_notation:
|
|
|
|
|
|
|
|
Notation
|
|
|
|
~~~~~~~~
|
|
|
|
|
|
|
|
A *modifier* is described using the following notation:
|
|
|
|
|
|
|
|
*<name>*
|
|
|
|
|
|
|
|
Where *name* is a link to a description of the *modifier*.
|