Mercurial > hg > CbC > CbC_llvm
comparison docs/AMDGPUInstructionSyntax.rst @ 148:63bd29f05246
merged
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Aug 2019 19:46:37 +0900 |
parents | c2174574ed3a |
children |
comparison
equal
deleted
inserted
replaced
146:3fc4d5c3e21e | 148:63bd29f05246 |
---|---|
1 ========================= | |
2 AMDGPU Instruction Syntax | |
3 ========================= | |
4 | |
5 .. contents:: | |
6 :local: | |
7 | |
8 .. _amdgpu_syn_instructions: | |
9 | |
10 Instructions | |
11 ============ | |
12 | |
13 Syntax | |
14 ~~~~~~ | |
15 | |
16 An instruction has the following syntax: | |
17 | |
18 ``<``\ *opcode mnemonic*\ ``> <``\ *operand0*\ ``>, <``\ *operand1*\ ``>,... <``\ *modifier0*\ ``> <``\ *modifier1*\ ``>...`` | |
19 | |
20 :doc:`Operands<AMDGPUOperandSyntax>` are normally comma-separated while | |
21 :doc:`modifiers<AMDGPUModifierSyntax>` are space-separated. | |
22 | |
23 The order of *operands* and *modifiers* is fixed. | |
24 Most *modifiers* are optional and may be omitted. | |
25 | |
26 .. _amdgpu_syn_instruction_mnemo: | |
27 | |
28 Opcode Mnemonic | |
29 ~~~~~~~~~~~~~~~ | |
30 | |
31 Opcode mnemonic describes opcode semantics and may include one or more suffices in this order: | |
32 | |
33 * :ref:`Destination operand type suffix<amdgpu_syn_instruction_type>`. | |
34 * :ref:`Source operand type suffix<amdgpu_syn_instruction_type>`. | |
35 * :ref:`Encoding suffix<amdgpu_syn_instruction_enc>`. | |
36 | |
37 .. _amdgpu_syn_instruction_type: | |
38 | |
39 Type and Size Suffices | |
40 ~~~~~~~~~~~~~~~~~~~~~~ | |
41 | |
42 Instructions which operate with data have an implied type of *data* operands. | |
43 This data type is specified as a suffix of instruction mnemonic. | |
44 | |
45 There are instructions which have 2 type suffices: | |
46 the first is the data type of the destination operand, | |
47 the second is the data type of source *data* operand(s). | |
48 | |
49 Note that data type specified by an instruction does not apply | |
50 to other kinds of operands such as *addresses*, *offsets* and so on. | |
51 | |
52 The following table enumerates the most frequently used type suffices. | |
53 | |
54 ============================================ ======================= ================= | |
55 Type Suffices Packed instruction? Data Type | |
56 ============================================ ======================= ================= | |
57 _b512, _b256, _b128, _b64, _b32, _b16, _b8 No Bits. | |
58 _u64, _u32, _u16, _u8 No Unsigned integer. | |
59 _i64, _i32, _i16, _i8 No Signed integer. | |
60 _f64, _f32, _f16 No Floating-point. | |
61 _b16, _u16, _i16, _f16 Yes Packed. | |
62 ============================================ ======================= ================= | |
63 | |
64 Instructions which have no type suffices are assumed to operate with typeless data. | |
65 The size of data is specified by size suffices: | |
66 | |
67 ================= =================== ===================================== | |
68 Size Suffix Implied data type Required register size in dwords | |
69 ================= =================== ===================================== | |
70 \- b32 1 | |
71 x2 b64 2 | |
72 x3 b96 3 | |
73 x4 b128 4 | |
74 x8 b256 8 | |
75 x16 b512 16 | |
76 x b32 1 | |
77 xy b64 2 | |
78 xyz b96 3 | |
79 xyzw b128 4 | |
80 d16_x b16 1 | |
81 d16_xy b16x2 2 for GFX8.0, 1 for GFX8.1 and GFX9 | |
82 d16_xyz b16x3 3 for GFX8.0, 2 for GFX8.1 and GFX9 | |
83 d16_xyzw b16x4 4 for GFX8.0, 2 for GFX8.1 and GFX9 | |
84 ================= =================== ===================================== | |
85 | |
86 .. WARNING:: | |
87 There are exceptions from rules described above. | |
88 Operands which have type different from type specified by the opcode are | |
89 :ref:`tagged<amdgpu_syn_instruction_operand_tags>` in the description. | |
90 | |
91 Examples of instructions with different types of source and destination operands: | |
92 | |
93 .. parsed-literal:: | |
94 | |
95 s_bcnt0_i32_b64 | |
96 v_cvt_f32_u32 | |
97 | |
98 Examples of instructions with one data type: | |
99 | |
100 .. parsed-literal:: | |
101 | |
102 v_max3_f32 | |
103 v_max3_i16 | |
104 | |
105 Examples of instructions which operate with packed data: | |
106 | |
107 .. parsed-literal:: | |
108 | |
109 v_pk_add_u16 | |
110 v_pk_add_i16 | |
111 v_pk_add_f16 | |
112 | |
113 Examples of typeless instructions which operate on b128 data: | |
114 | |
115 .. parsed-literal:: | |
116 | |
117 buffer_store_dwordx4 | |
118 flat_load_dwordx4 | |
119 | |
120 .. _amdgpu_syn_instruction_enc: | |
121 | |
122 Encoding Suffices | |
123 ~~~~~~~~~~~~~~~~~ | |
124 | |
125 Most *VOP1*, *VOP2* and *VOPC* instructions have several variants: | |
126 they may also be encoded in *VOP3*, *DPP* and *SDWA* formats. | |
127 | |
128 The assembler will automatically use optimal encoding based on instruction operands. | |
129 To force specific encoding, one can add a suffix to the opcode of the instruction: | |
130 | |
131 =================================================== ================= | |
132 Encoding Encoding Suffix | |
133 =================================================== ================= | |
134 Native 32-bit encoding (*VOP1*, *VOP2* or *VOPC*) _e32 | |
135 *VOP3* (64-bit) encoding _e64 | |
136 *DPP* encoding _dpp | |
137 *SDWA* encoding _sdwa | |
138 =================================================== ================= | |
139 | |
140 These suffices are used in this reference to indicate the assumed encoding. | |
141 When no suffix is specified, a native encoding is implied. | |
142 | |
143 Operands | |
144 ======== | |
145 | |
146 Syntax | |
147 ~~~~~~ | |
148 | |
149 Syntax of most operands is described :doc:`in this document<AMDGPUOperandSyntax>`. | |
150 | |
151 For detailed information about operands follow *operand links* in GPU-specific documents: | |
152 | |
153 * :doc:`GFX7<AMDGPU/AMDGPUAsmGFX7>` | |
154 * :doc:`GFX8<AMDGPU/AMDGPUAsmGFX8>` | |
155 * :doc:`GFX9<AMDGPU/AMDGPUAsmGFX9>` | |
156 * :doc:`GFX10<AMDGPU/AMDGPUAsmGFX10>` | |
157 | |
158 Modifiers | |
159 ========= | |
160 | |
161 Syntax | |
162 ~~~~~~ | |
163 | |
164 Syntax of modifiers is described :doc:`in this document<AMDGPUModifierSyntax>`. | |
165 | |
166 Information about modifiers supported for individual instructions may be found in GPU-specific documents: | |
167 | |
168 * :doc:`GFX7<AMDGPU/AMDGPUAsmGFX7>` | |
169 * :doc:`GFX8<AMDGPU/AMDGPUAsmGFX8>` | |
170 * :doc:`GFX9<AMDGPU/AMDGPUAsmGFX9>` | |
171 * :doc:`GFX10<AMDGPU/AMDGPUAsmGFX10>` | |
172 |