xref: /llvm-project/llvm/docs/AMDGPUOperandSyntax.rst (revision b8e1071a29035f5f7314bccfc1259a5a4935a8bc)
147eb6368SDmitry Preobrazhensky=====================================
247eb6368SDmitry PreobrazhenskySyntax of AMDGPU Instruction Operands
347eb6368SDmitry Preobrazhensky=====================================
4c6d31e6fSDmitry Preobrazhensky
5c6d31e6fSDmitry Preobrazhensky.. contents::
6c6d31e6fSDmitry Preobrazhensky   :local:
7c6d31e6fSDmitry Preobrazhensky
8c6d31e6fSDmitry PreobrazhenskyConventions
9c6d31e6fSDmitry Preobrazhensky===========
10c6d31e6fSDmitry Preobrazhensky
1147eb6368SDmitry PreobrazhenskyThe following notation is used throughout this document:
12c6d31e6fSDmitry Preobrazhensky
1347eb6368SDmitry Preobrazhensky    =================== =============================================================================
14c6d31e6fSDmitry Preobrazhensky    Notation            Description
1547eb6368SDmitry Preobrazhensky    =================== =============================================================================
16c6d31e6fSDmitry Preobrazhensky    {0..N}              Any integer value in the range from 0 to N (inclusive).
17d9daee5aSDmitry Preobrazhensky    <x>                 Syntax and meaning of *x* are explained elsewhere.
1847eb6368SDmitry Preobrazhensky    =================== =============================================================================
19c6d31e6fSDmitry Preobrazhensky
20c6d31e6fSDmitry Preobrazhensky.. _amdgpu_syn_operands:
21c6d31e6fSDmitry Preobrazhensky
22c6d31e6fSDmitry PreobrazhenskyOperands
23c6d31e6fSDmitry Preobrazhensky========
24c6d31e6fSDmitry Preobrazhensky
2547eb6368SDmitry Preobrazhensky.. _amdgpu_synid_v:
26c6d31e6fSDmitry Preobrazhensky
27*b8e1071aSDmitry Preobrazhenskyv (32-bit)
28*b8e1071aSDmitry Preobrazhensky----------
29c6d31e6fSDmitry Preobrazhensky
3047eb6368SDmitry PreobrazhenskyVector registers. There are 256 32-bit vector registers.
31c6d31e6fSDmitry Preobrazhensky
3247eb6368SDmitry PreobrazhenskyA sequence of *vector* registers may be used to operate with more than 32 bits of data.
3347eb6368SDmitry Preobrazhensky
34d9daee5aSDmitry PreobrazhenskyAssembler currently supports tuples with 1 to 12, 16 and 32 *vector* registers.
3547eb6368SDmitry Preobrazhensky
3647eb6368SDmitry Preobrazhensky    =================================================== ====================================================================
3747eb6368SDmitry Preobrazhensky    Syntax                                              Description
3847eb6368SDmitry Preobrazhensky    =================================================== ====================================================================
3947eb6368SDmitry Preobrazhensky    **v**\<N>                                           A single 32-bit *vector* register.
4047eb6368SDmitry Preobrazhensky
41b9683d3cSDmitry Preobrazhensky                                                        *N* must be a decimal
42b9683d3cSDmitry Preobrazhensky                                                        :ref:`integer number<amdgpu_synid_integer_number>`.
4347eb6368SDmitry Preobrazhensky    **v[**\ <N>\ **]**                                  A single 32-bit *vector* register.
4447eb6368SDmitry Preobrazhensky
4547eb6368SDmitry Preobrazhensky                                                        *N* may be specified as an
4647eb6368SDmitry Preobrazhensky                                                        :ref:`integer number<amdgpu_synid_integer_number>`
4747eb6368SDmitry Preobrazhensky                                                        or an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
4847eb6368SDmitry Preobrazhensky    **v[**\ <N>:<K>\ **]**                              A sequence of (\ *K-N+1*\ ) *vector* registers.
4947eb6368SDmitry Preobrazhensky
5047eb6368SDmitry Preobrazhensky                                                        *N* and *K* may be specified as
5147eb6368SDmitry Preobrazhensky                                                        :ref:`integer numbers<amdgpu_synid_integer_number>`
5247eb6368SDmitry Preobrazhensky                                                        or :ref:`absolute expressions<amdgpu_synid_absolute_expression>`.
5347eb6368SDmitry Preobrazhensky    **[v**\ <N>, \ **v**\ <N+1>, ... **v**\ <K>\ **]**  A sequence of (\ *K-N+1*\ ) *vector* registers.
5447eb6368SDmitry Preobrazhensky
55b9683d3cSDmitry Preobrazhensky                                                        Register indices must be specified as decimal
56b9683d3cSDmitry Preobrazhensky                                                        :ref:`integer numbers<amdgpu_synid_integer_number>`.
5747eb6368SDmitry Preobrazhensky    =================================================== ====================================================================
5847eb6368SDmitry Preobrazhensky
59b9683d3cSDmitry PreobrazhenskyNote: *N* and *K* must satisfy the following conditions:
6047eb6368SDmitry Preobrazhensky
6147eb6368SDmitry Preobrazhensky* *N* <= *K*.
6247eb6368SDmitry Preobrazhensky* 0 <= *N* <= 255.
6347eb6368SDmitry Preobrazhensky* 0 <= *K* <= 255.
64d9daee5aSDmitry Preobrazhensky* *K-N+1* must be in the range from 1 to 12 or equal to 16 or 32.
65434b278cSDmitry Preobrazhensky
66d9daee5aSDmitry PreobrazhenskyGFX90A and GFX940 have an additional alignment requirement:
67d9daee5aSDmitry Preobrazhenskypairs of *vector* registers must be even-aligned
68434b278cSDmitry Preobrazhensky(first register must be even).
6947eb6368SDmitry Preobrazhensky
7047eb6368SDmitry PreobrazhenskyExamples:
7147eb6368SDmitry Preobrazhensky
721fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
7347eb6368SDmitry Preobrazhensky
7447eb6368SDmitry Preobrazhensky  v255
7547eb6368SDmitry Preobrazhensky  v[0]
7647eb6368SDmitry Preobrazhensky  v[0:1]
7747eb6368SDmitry Preobrazhensky  v[1:1]
7847eb6368SDmitry Preobrazhensky  v[0:3]
7947eb6368SDmitry Preobrazhensky  v[2*2]
8047eb6368SDmitry Preobrazhensky  v[1-1:2-1]
8147eb6368SDmitry Preobrazhensky  [v252]
8247eb6368SDmitry Preobrazhensky  [v252,v253,v254,v255]
8347eb6368SDmitry Preobrazhensky
84cef9d421SDmitry Preobrazhensky.. _amdgpu_synid_nsa:
85cef9d421SDmitry Preobrazhensky
86*b8e1071aSDmitry Preobrazhensky**Non-Sequential Address (NSA) Syntax**
87*b8e1071aSDmitry Preobrazhensky
88d9daee5aSDmitry PreobrazhenskyGFX10+ *image* instructions may use special *NSA* (Non-Sequential Address)
89d9daee5aSDmitry Preobrazhenskysyntax for *image addresses*:
90cef9d421SDmitry Preobrazhensky
91b9683d3cSDmitry Preobrazhensky    ===================================== =================================================
92cef9d421SDmitry Preobrazhensky    Syntax                                Description
93b9683d3cSDmitry Preobrazhensky    ===================================== =================================================
94b9683d3cSDmitry Preobrazhensky    **[Vm**, \ **Vn**, ... **Vk**\ **]**  A sequence of 32-bit *vector* registers.
95d9daee5aSDmitry Preobrazhensky                                          Each register may be specified using the syntax
96b9683d3cSDmitry Preobrazhensky                                          defined :ref:`above<amdgpu_synid_v>`.
97cef9d421SDmitry Preobrazhensky
98d9daee5aSDmitry Preobrazhensky                                          In contrast with the standard syntax, registers
99b9683d3cSDmitry Preobrazhensky                                          in *NSA* sequence are not required to have
100b9683d3cSDmitry Preobrazhensky                                          consecutive indices. Moreover, the same register
101d9daee5aSDmitry Preobrazhensky                                          may appear in the sequence more than once.
102*b8e1071aSDmitry Preobrazhensky
103*b8e1071aSDmitry Preobrazhensky                                          GFX11+ has an additional limitation: if address
104*b8e1071aSDmitry Preobrazhensky                                          size occupies more than 5 dwords, registers
105*b8e1071aSDmitry Preobrazhensky                                          starting from the 5th element must be contiguous.
106b9683d3cSDmitry Preobrazhensky    ===================================== =================================================
107cef9d421SDmitry Preobrazhensky
108cef9d421SDmitry PreobrazhenskyExamples:
109cef9d421SDmitry Preobrazhensky
110cef9d421SDmitry Preobrazhensky.. parsed-literal::
111cef9d421SDmitry Preobrazhensky
112b9683d3cSDmitry Preobrazhensky  [v32,v1,v[2]]
113b9683d3cSDmitry Preobrazhensky  [v[32],v[1:1],[v2]]
114cef9d421SDmitry Preobrazhensky  [v4,v4,v4,v4]
115cef9d421SDmitry Preobrazhensky
116*b8e1071aSDmitry Preobrazhensky.. _amdgpu_synid_v16:
117*b8e1071aSDmitry Preobrazhensky
118*b8e1071aSDmitry Preobrazhenskyv (16-bit)
119*b8e1071aSDmitry Preobrazhensky----------
120*b8e1071aSDmitry Preobrazhensky
121*b8e1071aSDmitry Preobrazhensky16-bit vector registers. Each :ref:`32-bit vector register<amdgpu_synid_v>` is divided into two 16-bit low and high registers, so there are 512 16-bit vector registers.
122*b8e1071aSDmitry Preobrazhensky
123*b8e1071aSDmitry PreobrazhenskyOnly VOP3, VOP3P and VINTERP instructions may access all 512 registers (using :ref:`op_sel<amdgpu_synid_op_sel>` modifier).
124*b8e1071aSDmitry PreobrazhenskyVOP1, VOP2 and VOPC instructions may currently access only 128 low 16-bit registers using the syntax described below.
125*b8e1071aSDmitry Preobrazhensky
126*b8e1071aSDmitry Preobrazhensky.. WARNING:: This section is incomplete. The support of 16-bit registers in the assembler is still WIP.
127*b8e1071aSDmitry Preobrazhensky
128*b8e1071aSDmitry Preobrazhensky\
129*b8e1071aSDmitry Preobrazhensky    =================================================== ====================================================================
130*b8e1071aSDmitry Preobrazhensky    Syntax                                              Description
131*b8e1071aSDmitry Preobrazhensky    =================================================== ====================================================================
132*b8e1071aSDmitry Preobrazhensky    **v**\<N>                                           A single 16-bit *vector* register (low half).
133*b8e1071aSDmitry Preobrazhensky    =================================================== ====================================================================
134*b8e1071aSDmitry Preobrazhensky
135*b8e1071aSDmitry PreobrazhenskyNote: *N* must satisfy the following conditions:
136*b8e1071aSDmitry Preobrazhensky
137*b8e1071aSDmitry Preobrazhensky* 0 <= *N* <= 127.
138*b8e1071aSDmitry Preobrazhensky
139*b8e1071aSDmitry PreobrazhenskyExamples:
140*b8e1071aSDmitry Preobrazhensky
141*b8e1071aSDmitry Preobrazhensky.. parsed-literal::
142*b8e1071aSDmitry Preobrazhensky
143*b8e1071aSDmitry Preobrazhensky  v127
144*b8e1071aSDmitry Preobrazhensky
14580c45e49SDmitry Preobrazhensky.. _amdgpu_synid_a:
14680c45e49SDmitry Preobrazhensky
14780c45e49SDmitry Preobrazhenskya
14880c45e49SDmitry Preobrazhensky-
14980c45e49SDmitry Preobrazhensky
15080c45e49SDmitry PreobrazhenskyAccumulator registers. There are 256 32-bit accumulator registers.
15180c45e49SDmitry Preobrazhensky
15280c45e49SDmitry PreobrazhenskyA sequence of *accumulator* registers may be used to operate with more than 32 bits of data.
15380c45e49SDmitry Preobrazhensky
154d9daee5aSDmitry PreobrazhenskyAssembler currently supports tuples with 1 to 12, 16 and 32 *accumulator* registers.
15580c45e49SDmitry Preobrazhensky
15680c45e49SDmitry Preobrazhensky    =================================================== ========================================================= ====================================================================
157d9daee5aSDmitry Preobrazhensky    Syntax                                              Alternative Syntax (SP3)                                  Description
15880c45e49SDmitry Preobrazhensky    =================================================== ========================================================= ====================================================================
15980c45e49SDmitry Preobrazhensky    **a**\<N>                                           **acc**\<N>                                               A single 32-bit *accumulator* register.
16080c45e49SDmitry Preobrazhensky
16180c45e49SDmitry Preobrazhensky                                                                                                                  *N* must be a decimal
16280c45e49SDmitry Preobrazhensky                                                                                                                  :ref:`integer number<amdgpu_synid_integer_number>`.
16380c45e49SDmitry Preobrazhensky    **a[**\ <N>\ **]**                                  **acc[**\ <N>\ **]**                                      A single 32-bit *accumulator* register.
16480c45e49SDmitry Preobrazhensky
16580c45e49SDmitry Preobrazhensky                                                                                                                  *N* may be specified as an
16680c45e49SDmitry Preobrazhensky                                                                                                                  :ref:`integer number<amdgpu_synid_integer_number>`
16780c45e49SDmitry Preobrazhensky                                                                                                                  or an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
16880c45e49SDmitry Preobrazhensky    **a[**\ <N>:<K>\ **]**                              **acc[**\ <N>:<K>\ **]**                                  A sequence of (\ *K-N+1*\ ) *accumulator* registers.
16980c45e49SDmitry Preobrazhensky
17080c45e49SDmitry Preobrazhensky                                                                                                                  *N* and *K* may be specified as
17180c45e49SDmitry Preobrazhensky                                                                                                                  :ref:`integer numbers<amdgpu_synid_integer_number>`
17280c45e49SDmitry Preobrazhensky                                                                                                                  or :ref:`absolute expressions<amdgpu_synid_absolute_expression>`.
17380c45e49SDmitry Preobrazhensky    **[a**\ <N>, \ **a**\ <N+1>, ... **a**\ <K>\ **]**  **[acc**\ <N>, \ **acc**\ <N+1>, ... **acc**\ <K>\ **]**  A sequence of (\ *K-N+1*\ ) *accumulator* registers.
17480c45e49SDmitry Preobrazhensky
17580c45e49SDmitry Preobrazhensky                                                                                                                  Register indices must be specified as decimal
17680c45e49SDmitry Preobrazhensky                                                                                                                  :ref:`integer numbers<amdgpu_synid_integer_number>`.
17780c45e49SDmitry Preobrazhensky    =================================================== ========================================================= ====================================================================
17880c45e49SDmitry Preobrazhensky
17980c45e49SDmitry PreobrazhenskyNote: *N* and *K* must satisfy the following conditions:
18080c45e49SDmitry Preobrazhensky
18180c45e49SDmitry Preobrazhensky* *N* <= *K*.
18280c45e49SDmitry Preobrazhensky* 0 <= *N* <= 255.
18380c45e49SDmitry Preobrazhensky* 0 <= *K* <= 255.
184d9daee5aSDmitry Preobrazhensky* *K-N+1* must be in the range from 1 to 12 or equal to 16 or 32.
185434b278cSDmitry Preobrazhensky
186d9daee5aSDmitry PreobrazhenskyGFX90A and GFX940 have an additional alignment requirement:
187d9daee5aSDmitry Preobrazhenskypairs of *accumulator* registers must be even-aligned
188434b278cSDmitry Preobrazhensky(first register must be even).
18980c45e49SDmitry Preobrazhensky
19080c45e49SDmitry PreobrazhenskyExamples:
19180c45e49SDmitry Preobrazhensky
19280c45e49SDmitry Preobrazhensky.. parsed-literal::
19380c45e49SDmitry Preobrazhensky
19480c45e49SDmitry Preobrazhensky  a255
19580c45e49SDmitry Preobrazhensky  a[0]
19680c45e49SDmitry Preobrazhensky  a[0:1]
19780c45e49SDmitry Preobrazhensky  a[1:1]
19880c45e49SDmitry Preobrazhensky  a[0:3]
19980c45e49SDmitry Preobrazhensky  a[2*2]
20080c45e49SDmitry Preobrazhensky  a[1-1:2-1]
20180c45e49SDmitry Preobrazhensky  [a252]
20280c45e49SDmitry Preobrazhensky  [a252,a253,a254,a255]
20380c45e49SDmitry Preobrazhensky
20480c45e49SDmitry Preobrazhensky  acc0
20580c45e49SDmitry Preobrazhensky  acc[1]
20680c45e49SDmitry Preobrazhensky  [acc250]
20780c45e49SDmitry Preobrazhensky  [acc2,acc3]
20880c45e49SDmitry Preobrazhensky
20947eb6368SDmitry Preobrazhensky.. _amdgpu_synid_s:
21047eb6368SDmitry Preobrazhensky
21147eb6368SDmitry Preobrazhenskys
21247eb6368SDmitry Preobrazhensky-
21347eb6368SDmitry Preobrazhensky
214d9daee5aSDmitry PreobrazhenskyScalar 32-bit registers. The number of available *scalar* registers depends on the GPU:
21547eb6368SDmitry Preobrazhensky
21647eb6368SDmitry Preobrazhensky    ======= ============================
21747eb6368SDmitry Preobrazhensky    GPU     Number of *scalar* registers
21847eb6368SDmitry Preobrazhensky    ======= ============================
21947eb6368SDmitry Preobrazhensky    GFX7    104
22047eb6368SDmitry Preobrazhensky    GFX8    102
22147eb6368SDmitry Preobrazhensky    GFX9    102
222d9daee5aSDmitry Preobrazhensky    GFX10+  106
22347eb6368SDmitry Preobrazhensky    ======= ============================
22447eb6368SDmitry Preobrazhensky
22547eb6368SDmitry PreobrazhenskyA sequence of *scalar* registers may be used to operate with more than 32 bits of data.
226d9daee5aSDmitry PreobrazhenskyAssembler currently supports tuples with 1 to 12, 16 and 32 *scalar* registers.
22747eb6368SDmitry Preobrazhensky
228434b278cSDmitry PreobrazhenskyPairs of *scalar* registers must be even-aligned (first register must be even).
22947eb6368SDmitry PreobrazhenskySequences of 4 and more *scalar* registers must be quad-aligned.
23047eb6368SDmitry Preobrazhensky
23147eb6368SDmitry Preobrazhensky    ======================================================== ====================================================================
23247eb6368SDmitry Preobrazhensky    Syntax                                                   Description
23347eb6368SDmitry Preobrazhensky    ======================================================== ====================================================================
23447eb6368SDmitry Preobrazhensky    **s**\ <N>                                               A single 32-bit *scalar* register.
23547eb6368SDmitry Preobrazhensky
236b9683d3cSDmitry Preobrazhensky                                                             *N* must be a decimal
237b9683d3cSDmitry Preobrazhensky                                                             :ref:`integer number<amdgpu_synid_integer_number>`.
238b9683d3cSDmitry Preobrazhensky
23947eb6368SDmitry Preobrazhensky    **s[**\ <N>\ **]**                                       A single 32-bit *scalar* register.
24047eb6368SDmitry Preobrazhensky
24147eb6368SDmitry Preobrazhensky                                                             *N* may be specified as an
24247eb6368SDmitry Preobrazhensky                                                             :ref:`integer number<amdgpu_synid_integer_number>`
24347eb6368SDmitry Preobrazhensky                                                             or an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
24447eb6368SDmitry Preobrazhensky    **s[**\ <N>:<K>\ **]**                                   A sequence of (\ *K-N+1*\ ) *scalar* registers.
24547eb6368SDmitry Preobrazhensky
24647eb6368SDmitry Preobrazhensky                                                             *N* and *K* may be specified as
24747eb6368SDmitry Preobrazhensky                                                             :ref:`integer numbers<amdgpu_synid_integer_number>`
24847eb6368SDmitry Preobrazhensky                                                             or :ref:`absolute expressions<amdgpu_synid_absolute_expression>`.
249b9683d3cSDmitry Preobrazhensky
25047eb6368SDmitry Preobrazhensky    **[s**\ <N>, \ **s**\ <N+1>, ... **s**\ <K>\ **]**       A sequence of (\ *K-N+1*\ ) *scalar* registers.
25147eb6368SDmitry Preobrazhensky
252b9683d3cSDmitry Preobrazhensky                                                             Register indices must be specified as decimal
253b9683d3cSDmitry Preobrazhensky                                                             :ref:`integer numbers<amdgpu_synid_integer_number>`.
25447eb6368SDmitry Preobrazhensky    ======================================================== ====================================================================
25547eb6368SDmitry Preobrazhensky
256b9683d3cSDmitry PreobrazhenskyNote: *N* and *K* must satisfy the following conditions:
25747eb6368SDmitry Preobrazhensky
258d9daee5aSDmitry Preobrazhensky* *N* must be properly aligned based on the sequence size.
25947eb6368SDmitry Preobrazhensky* *N* <= *K*.
26047eb6368SDmitry Preobrazhensky* 0 <= *N* < *SMAX*\ , where *SMAX* is the number of available *scalar* registers.
26147eb6368SDmitry Preobrazhensky* 0 <= *K* < *SMAX*\ , where *SMAX* is the number of available *scalar* registers.
262d9daee5aSDmitry Preobrazhensky* *K-N+1* must be in the range from 1 to 12 or equal to 16 or 32.
26347eb6368SDmitry Preobrazhensky
26447eb6368SDmitry PreobrazhenskyExamples:
26547eb6368SDmitry Preobrazhensky
2661fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
26747eb6368SDmitry Preobrazhensky
26847eb6368SDmitry Preobrazhensky  s0
26947eb6368SDmitry Preobrazhensky  s[0]
27047eb6368SDmitry Preobrazhensky  s[0:1]
27147eb6368SDmitry Preobrazhensky  s[1:1]
27247eb6368SDmitry Preobrazhensky  s[0:3]
27347eb6368SDmitry Preobrazhensky  s[2*2]
27447eb6368SDmitry Preobrazhensky  s[1-1:2-1]
27547eb6368SDmitry Preobrazhensky  [s4]
27647eb6368SDmitry Preobrazhensky  [s4,s5,s6,s7]
27747eb6368SDmitry Preobrazhensky
27847eb6368SDmitry PreobrazhenskyExamples of *scalar* registers with an invalid alignment:
27947eb6368SDmitry Preobrazhensky
2801fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
28147eb6368SDmitry Preobrazhensky
28247eb6368SDmitry Preobrazhensky  s[1:2]
28347eb6368SDmitry Preobrazhensky  s[2:5]
28447eb6368SDmitry Preobrazhensky
28547eb6368SDmitry Preobrazhensky.. _amdgpu_synid_trap:
28647eb6368SDmitry Preobrazhensky
28747eb6368SDmitry Preobrazhenskytrap
28847eb6368SDmitry Preobrazhensky----
28947eb6368SDmitry Preobrazhensky
29047eb6368SDmitry PreobrazhenskyA set of trap handler registers:
29147eb6368SDmitry Preobrazhensky
29247eb6368SDmitry Preobrazhensky* :ref:`ttmp<amdgpu_synid_ttmp>`
29347eb6368SDmitry Preobrazhensky* :ref:`tba<amdgpu_synid_tba>`
29447eb6368SDmitry Preobrazhensky* :ref:`tma<amdgpu_synid_tma>`
29547eb6368SDmitry Preobrazhensky
29647eb6368SDmitry Preobrazhensky.. _amdgpu_synid_ttmp:
29747eb6368SDmitry Preobrazhensky
29847eb6368SDmitry Preobrazhenskyttmp
29947eb6368SDmitry Preobrazhensky----
30047eb6368SDmitry Preobrazhensky
30147eb6368SDmitry PreobrazhenskyTrap handler temporary scalar registers, 32-bits wide.
302d9daee5aSDmitry PreobrazhenskyThe number of available *ttmp* registers depends on the GPU:
30347eb6368SDmitry Preobrazhensky
30447eb6368SDmitry Preobrazhensky    ======= ===========================
30547eb6368SDmitry Preobrazhensky    GPU     Number of *ttmp* registers
30647eb6368SDmitry Preobrazhensky    ======= ===========================
30747eb6368SDmitry Preobrazhensky    GFX7    12
30847eb6368SDmitry Preobrazhensky    GFX8    12
30947eb6368SDmitry Preobrazhensky    GFX9    16
310d9daee5aSDmitry Preobrazhensky    GFX10+  16
31147eb6368SDmitry Preobrazhensky    ======= ===========================
31247eb6368SDmitry Preobrazhensky
31347eb6368SDmitry PreobrazhenskyA sequence of *ttmp* registers may be used to operate with more than 32 bits of data.
314d9daee5aSDmitry PreobrazhenskyAssembler currently supports tuples with 1 to 12 and 16 *ttmp* registers.
31547eb6368SDmitry Preobrazhensky
316434b278cSDmitry PreobrazhenskyPairs of *ttmp* registers must be even-aligned (first register must be even).
31747eb6368SDmitry PreobrazhenskySequences of 4 and more *ttmp* registers must be quad-aligned.
31847eb6368SDmitry Preobrazhensky
31947eb6368SDmitry Preobrazhensky    ============================================================= ====================================================================
32047eb6368SDmitry Preobrazhensky    Syntax                                                        Description
32147eb6368SDmitry Preobrazhensky    ============================================================= ====================================================================
32247eb6368SDmitry Preobrazhensky    **ttmp**\ <N>                                                 A single 32-bit *ttmp* register.
32347eb6368SDmitry Preobrazhensky
324b9683d3cSDmitry Preobrazhensky                                                                  *N* must be a decimal
325b9683d3cSDmitry Preobrazhensky                                                                  :ref:`integer number<amdgpu_synid_integer_number>`.
32647eb6368SDmitry Preobrazhensky    **ttmp[**\ <N>\ **]**                                         A single 32-bit *ttmp* register.
32747eb6368SDmitry Preobrazhensky
32847eb6368SDmitry Preobrazhensky                                                                  *N* may be specified as an
32947eb6368SDmitry Preobrazhensky                                                                  :ref:`integer number<amdgpu_synid_integer_number>`
33047eb6368SDmitry Preobrazhensky                                                                  or an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
33147eb6368SDmitry Preobrazhensky    **ttmp[**\ <N>:<K>\ **]**                                     A sequence of (\ *K-N+1*\ ) *ttmp* registers.
33247eb6368SDmitry Preobrazhensky
33347eb6368SDmitry Preobrazhensky                                                                  *N* and *K* may be specified as
33447eb6368SDmitry Preobrazhensky                                                                  :ref:`integer numbers<amdgpu_synid_integer_number>`
33547eb6368SDmitry Preobrazhensky                                                                  or :ref:`absolute expressions<amdgpu_synid_absolute_expression>`.
33647eb6368SDmitry Preobrazhensky    **[ttmp**\ <N>, \ **ttmp**\ <N+1>, ... **ttmp**\ <K>\ **]**   A sequence of (\ *K-N+1*\ ) *ttmp* registers.
33747eb6368SDmitry Preobrazhensky
338b9683d3cSDmitry Preobrazhensky                                                                  Register indices must be specified as decimal
339b9683d3cSDmitry Preobrazhensky                                                                  :ref:`integer numbers<amdgpu_synid_integer_number>`.
34047eb6368SDmitry Preobrazhensky    ============================================================= ====================================================================
34147eb6368SDmitry Preobrazhensky
342b9683d3cSDmitry PreobrazhenskyNote: *N* and *K* must satisfy the following conditions:
34347eb6368SDmitry Preobrazhensky
344d9daee5aSDmitry Preobrazhensky* *N* must be properly aligned based on the sequence size.
34547eb6368SDmitry Preobrazhensky* *N* <= *K*.
34647eb6368SDmitry Preobrazhensky* 0 <= *N* < *TMAX*, where *TMAX* is the number of available *ttmp* registers.
34747eb6368SDmitry Preobrazhensky* 0 <= *K* < *TMAX*, where *TMAX* is the number of available *ttmp* registers.
348d9daee5aSDmitry Preobrazhensky* *K-N+1* must be in the range from 1 to 12 or equal to 16.
34947eb6368SDmitry Preobrazhensky
35047eb6368SDmitry PreobrazhenskyExamples:
35147eb6368SDmitry Preobrazhensky
3521fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
35347eb6368SDmitry Preobrazhensky
35447eb6368SDmitry Preobrazhensky  ttmp0
35547eb6368SDmitry Preobrazhensky  ttmp[0]
35647eb6368SDmitry Preobrazhensky  ttmp[0:1]
35747eb6368SDmitry Preobrazhensky  ttmp[1:1]
35847eb6368SDmitry Preobrazhensky  ttmp[0:3]
35947eb6368SDmitry Preobrazhensky  ttmp[2*2]
36047eb6368SDmitry Preobrazhensky  ttmp[1-1:2-1]
36147eb6368SDmitry Preobrazhensky  [ttmp4]
36247eb6368SDmitry Preobrazhensky  [ttmp4,ttmp5,ttmp6,ttmp7]
36347eb6368SDmitry Preobrazhensky
36447eb6368SDmitry PreobrazhenskyExamples of *ttmp* registers with an invalid alignment:
36547eb6368SDmitry Preobrazhensky
3661fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
36747eb6368SDmitry Preobrazhensky
36847eb6368SDmitry Preobrazhensky  ttmp[1:2]
36947eb6368SDmitry Preobrazhensky  ttmp[2:5]
37047eb6368SDmitry Preobrazhensky
37147eb6368SDmitry Preobrazhensky.. _amdgpu_synid_tba:
37247eb6368SDmitry Preobrazhensky
37347eb6368SDmitry Preobrazhenskytba
37447eb6368SDmitry Preobrazhensky---
37547eb6368SDmitry Preobrazhensky
376d9daee5aSDmitry PreobrazhenskyTrap base address, 64-bits wide. Holds the pointer to the current
377d9daee5aSDmitry Preobrazhenskytrap handler program.
37847eb6368SDmitry Preobrazhensky
37947eb6368SDmitry Preobrazhensky    ================== ======================================================================= =============
38047eb6368SDmitry Preobrazhensky    Syntax             Description                                                             Availability
38147eb6368SDmitry Preobrazhensky    ================== ======================================================================= =============
38247eb6368SDmitry Preobrazhensky    tba                64-bit *trap base address* register.                                    GFX7, GFX8
383b9683d3cSDmitry Preobrazhensky    [tba]              64-bit *trap base address* register (an SP3 syntax).                    GFX7, GFX8
384b9683d3cSDmitry Preobrazhensky    [tba_lo,tba_hi]    64-bit *trap base address* register (an SP3 syntax).                    GFX7, GFX8
38547eb6368SDmitry Preobrazhensky    ================== ======================================================================= =============
38647eb6368SDmitry Preobrazhensky
38747eb6368SDmitry PreobrazhenskyHigh and low 32 bits of *trap base address* may be accessed as separate registers:
38847eb6368SDmitry Preobrazhensky
38947eb6368SDmitry Preobrazhensky    ================== ======================================================================= =============
39047eb6368SDmitry Preobrazhensky    Syntax             Description                                                             Availability
39147eb6368SDmitry Preobrazhensky    ================== ======================================================================= =============
39247eb6368SDmitry Preobrazhensky    tba_lo             Low 32 bits of *trap base address* register.                            GFX7, GFX8
39347eb6368SDmitry Preobrazhensky    tba_hi             High 32 bits of *trap base address* register.                           GFX7, GFX8
394b9683d3cSDmitry Preobrazhensky    [tba_lo]           Low 32 bits of *trap base address* register (an SP3 syntax).            GFX7, GFX8
395b9683d3cSDmitry Preobrazhensky    [tba_hi]           High 32 bits of *trap base address* register (an SP3 syntax).           GFX7, GFX8
39647eb6368SDmitry Preobrazhensky    ================== ======================================================================= =============
39747eb6368SDmitry Preobrazhensky
39847eb6368SDmitry Preobrazhensky.. _amdgpu_synid_tma:
39947eb6368SDmitry Preobrazhensky
40047eb6368SDmitry Preobrazhenskytma
40147eb6368SDmitry Preobrazhensky---
40247eb6368SDmitry Preobrazhensky
40347eb6368SDmitry PreobrazhenskyTrap memory address, 64-bits wide.
40447eb6368SDmitry Preobrazhensky
40547eb6368SDmitry Preobrazhensky    ================= ======================================================================= ==================
40647eb6368SDmitry Preobrazhensky    Syntax            Description                                                             Availability
40747eb6368SDmitry Preobrazhensky    ================= ======================================================================= ==================
40847eb6368SDmitry Preobrazhensky    tma               64-bit *trap memory address* register.                                  GFX7, GFX8
409b9683d3cSDmitry Preobrazhensky    [tma]             64-bit *trap memory address* register (an SP3 syntax).                  GFX7, GFX8
410b9683d3cSDmitry Preobrazhensky    [tma_lo,tma_hi]   64-bit *trap memory address* register (an SP3 syntax).                  GFX7, GFX8
41147eb6368SDmitry Preobrazhensky    ================= ======================================================================= ==================
41247eb6368SDmitry Preobrazhensky
41347eb6368SDmitry PreobrazhenskyHigh and low 32 bits of *trap memory address* may be accessed as separate registers:
41447eb6368SDmitry Preobrazhensky
41547eb6368SDmitry Preobrazhensky    ================= ======================================================================= ==================
41647eb6368SDmitry Preobrazhensky    Syntax            Description                                                             Availability
41747eb6368SDmitry Preobrazhensky    ================= ======================================================================= ==================
41847eb6368SDmitry Preobrazhensky    tma_lo            Low 32 bits of *trap memory address* register.                          GFX7, GFX8
41947eb6368SDmitry Preobrazhensky    tma_hi            High 32 bits of *trap memory address* register.                         GFX7, GFX8
420b9683d3cSDmitry Preobrazhensky    [tma_lo]          Low 32 bits of *trap memory address* register (an SP3 syntax).          GFX7, GFX8
421b9683d3cSDmitry Preobrazhensky    [tma_hi]          High 32 bits of *trap memory address* register (an SP3 syntax).         GFX7, GFX8
42247eb6368SDmitry Preobrazhensky    ================= ======================================================================= ==================
42347eb6368SDmitry Preobrazhensky
42447eb6368SDmitry Preobrazhensky.. _amdgpu_synid_flat_scratch:
42547eb6368SDmitry Preobrazhensky
42647eb6368SDmitry Preobrazhenskyflat_scratch
427c6d31e6fSDmitry Preobrazhensky------------
428c6d31e6fSDmitry Preobrazhensky
42947eb6368SDmitry PreobrazhenskyFlat scratch address, 64-bits wide. Holds the base address of scratch memory.
430c6d31e6fSDmitry Preobrazhensky
43147eb6368SDmitry Preobrazhensky    ================================== ================================================================
432c6d31e6fSDmitry Preobrazhensky    Syntax                             Description
43347eb6368SDmitry Preobrazhensky    ================================== ================================================================
43447eb6368SDmitry Preobrazhensky    flat_scratch                       64-bit *flat scratch* address register.
435b9683d3cSDmitry Preobrazhensky    [flat_scratch]                     64-bit *flat scratch* address register (an SP3 syntax).
436b9683d3cSDmitry Preobrazhensky    [flat_scratch_lo,flat_scratch_hi]  64-bit *flat scratch* address register (an SP3 syntax).
43747eb6368SDmitry Preobrazhensky    ================================== ================================================================
438c6d31e6fSDmitry Preobrazhensky
43947eb6368SDmitry PreobrazhenskyHigh and low 32 bits of *flat scratch* address may be accessed as separate registers:
440c6d31e6fSDmitry Preobrazhensky
44147eb6368SDmitry Preobrazhensky    ========================= =========================================================================
442c6d31e6fSDmitry Preobrazhensky    Syntax                    Description
44347eb6368SDmitry Preobrazhensky    ========================= =========================================================================
44447eb6368SDmitry Preobrazhensky    flat_scratch_lo           Low 32 bits of *flat scratch* address register.
44547eb6368SDmitry Preobrazhensky    flat_scratch_hi           High 32 bits of *flat scratch* address register.
446b9683d3cSDmitry Preobrazhensky    [flat_scratch_lo]         Low 32 bits of *flat scratch* address register (an SP3 syntax).
447b9683d3cSDmitry Preobrazhensky    [flat_scratch_hi]         High 32 bits of *flat scratch* address register (an SP3 syntax).
44847eb6368SDmitry Preobrazhensky    ========================= =========================================================================
449c6d31e6fSDmitry Preobrazhensky
45047eb6368SDmitry Preobrazhensky.. _amdgpu_synid_xnack:
451434b278cSDmitry Preobrazhensky.. _amdgpu_synid_xnack_mask:
452c6d31e6fSDmitry Preobrazhensky
453434b278cSDmitry Preobrazhenskyxnack_mask
454434b278cSDmitry Preobrazhensky----------
455c6d31e6fSDmitry Preobrazhensky
45647eb6368SDmitry PreobrazhenskyXnack mask, 64-bits wide. Holds a 64-bit mask of which threads
45747eb6368SDmitry Preobrazhenskyreceived an *XNACK* due to a vector memory operation.
458c6d31e6fSDmitry Preobrazhensky
459d9daee5aSDmitry PreobrazhenskyFor availability of *xnack* feature, refer to :ref:`this table<amdgpu-processors>`.
46047eb6368SDmitry Preobrazhensky
46147eb6368SDmitry Preobrazhensky    ============================== =====================================================
462c6d31e6fSDmitry Preobrazhensky    Syntax                         Description
46347eb6368SDmitry Preobrazhensky    ============================== =====================================================
46447eb6368SDmitry Preobrazhensky    xnack_mask                     64-bit *xnack mask* register.
465b9683d3cSDmitry Preobrazhensky    [xnack_mask]                   64-bit *xnack mask* register (an SP3 syntax).
466b9683d3cSDmitry Preobrazhensky    [xnack_mask_lo,xnack_mask_hi]  64-bit *xnack mask* register (an SP3 syntax).
46747eb6368SDmitry Preobrazhensky    ============================== =====================================================
468c6d31e6fSDmitry Preobrazhensky
46947eb6368SDmitry PreobrazhenskyHigh and low 32 bits of *xnack mask* may be accessed as separate registers:
470c6d31e6fSDmitry Preobrazhensky
47147eb6368SDmitry Preobrazhensky    ===================== ==============================================================
472c6d31e6fSDmitry Preobrazhensky    Syntax                Description
47347eb6368SDmitry Preobrazhensky    ===================== ==============================================================
47447eb6368SDmitry Preobrazhensky    xnack_mask_lo         Low 32 bits of *xnack mask* register.
47547eb6368SDmitry Preobrazhensky    xnack_mask_hi         High 32 bits of *xnack mask* register.
476b9683d3cSDmitry Preobrazhensky    [xnack_mask_lo]       Low 32 bits of *xnack mask* register (an SP3 syntax).
477b9683d3cSDmitry Preobrazhensky    [xnack_mask_hi]       High 32 bits of *xnack mask* register (an SP3 syntax).
47847eb6368SDmitry Preobrazhensky    ===================== ==============================================================
479c6d31e6fSDmitry Preobrazhensky
48047eb6368SDmitry Preobrazhensky.. _amdgpu_synid_vcc:
481cef9d421SDmitry Preobrazhensky.. _amdgpu_synid_vcc_lo:
482c6d31e6fSDmitry Preobrazhensky
48347eb6368SDmitry Preobrazhenskyvcc
48447eb6368SDmitry Preobrazhensky---
485c6d31e6fSDmitry Preobrazhensky
48647eb6368SDmitry PreobrazhenskyVector condition code, 64-bits wide. A bit mask with one bit per thread;
48747eb6368SDmitry Preobrazhenskyit holds the result of a vector compare operation.
488c6d31e6fSDmitry Preobrazhensky
489d9daee5aSDmitry PreobrazhenskyNote that GFX10+ H/W does not use high 32 bits of *vcc* in *wave32* mode.
490cef9d421SDmitry Preobrazhensky
49147eb6368SDmitry Preobrazhensky    ================ =========================================================================
492c6d31e6fSDmitry Preobrazhensky    Syntax           Description
49347eb6368SDmitry Preobrazhensky    ================ =========================================================================
49447eb6368SDmitry Preobrazhensky    vcc              64-bit *vector condition code* register.
495b9683d3cSDmitry Preobrazhensky    [vcc]            64-bit *vector condition code* register (an SP3 syntax).
496b9683d3cSDmitry Preobrazhensky    [vcc_lo,vcc_hi]  64-bit *vector condition code* register (an SP3 syntax).
49747eb6368SDmitry Preobrazhensky    ================ =========================================================================
498c6d31e6fSDmitry Preobrazhensky
49947eb6368SDmitry PreobrazhenskyHigh and low 32 bits of *vector condition code* may be accessed as separate registers:
500c6d31e6fSDmitry Preobrazhensky
50147eb6368SDmitry Preobrazhensky    ================ =========================================================================
502c6d31e6fSDmitry Preobrazhensky    Syntax           Description
50347eb6368SDmitry Preobrazhensky    ================ =========================================================================
50447eb6368SDmitry Preobrazhensky    vcc_lo           Low 32 bits of *vector condition code* register.
50547eb6368SDmitry Preobrazhensky    vcc_hi           High 32 bits of *vector condition code* register.
506b9683d3cSDmitry Preobrazhensky    [vcc_lo]         Low 32 bits of *vector condition code* register (an SP3 syntax).
507b9683d3cSDmitry Preobrazhensky    [vcc_hi]         High 32 bits of *vector condition code* register (an SP3 syntax).
50847eb6368SDmitry Preobrazhensky    ================ =========================================================================
509c6d31e6fSDmitry Preobrazhensky
51047eb6368SDmitry Preobrazhensky.. _amdgpu_synid_m0:
511c6d31e6fSDmitry Preobrazhensky
51247eb6368SDmitry Preobrazhenskym0
51347eb6368SDmitry Preobrazhensky--
514c6d31e6fSDmitry Preobrazhensky
51547eb6368SDmitry PreobrazhenskyA 32-bit memory register. It has various uses,
51647eb6368SDmitry Preobrazhenskyincluding register indexing and bounds checking.
517c6d31e6fSDmitry Preobrazhensky
51847eb6368SDmitry Preobrazhensky    =========== ===================================================
519c6d31e6fSDmitry Preobrazhensky    Syntax      Description
52047eb6368SDmitry Preobrazhensky    =========== ===================================================
52147eb6368SDmitry Preobrazhensky    m0          A 32-bit *memory* register.
522b9683d3cSDmitry Preobrazhensky    [m0]        A 32-bit *memory* register (an SP3 syntax).
52347eb6368SDmitry Preobrazhensky    =========== ===================================================
524c6d31e6fSDmitry Preobrazhensky
52547eb6368SDmitry Preobrazhensky.. _amdgpu_synid_exec:
526c6d31e6fSDmitry Preobrazhensky
52747eb6368SDmitry Preobrazhenskyexec
52847eb6368SDmitry Preobrazhensky----
529c6d31e6fSDmitry Preobrazhensky
53047eb6368SDmitry PreobrazhenskyExecute mask, 64-bits wide. A bit mask with one bit per thread,
53147eb6368SDmitry Preobrazhenskywhich is applied to vector instructions and controls which threads execute
53247eb6368SDmitry Preobrazhenskyand which ignore the instruction.
533c6d31e6fSDmitry Preobrazhensky
534d9daee5aSDmitry PreobrazhenskyNote that GFX10+ H/W does not use high 32 bits of *exec* in *wave32* mode.
535cef9d421SDmitry Preobrazhensky
53647eb6368SDmitry Preobrazhensky    ===================== =================================================================
537c6d31e6fSDmitry Preobrazhensky    Syntax                Description
53847eb6368SDmitry Preobrazhensky    ===================== =================================================================
53947eb6368SDmitry Preobrazhensky    exec                  64-bit *execute mask* register.
540b9683d3cSDmitry Preobrazhensky    [exec]                64-bit *execute mask* register (an SP3 syntax).
541b9683d3cSDmitry Preobrazhensky    [exec_lo,exec_hi]     64-bit *execute mask* register (an SP3 syntax).
54247eb6368SDmitry Preobrazhensky    ===================== =================================================================
543c6d31e6fSDmitry Preobrazhensky
54447eb6368SDmitry PreobrazhenskyHigh and low 32 bits of *execute mask* may be accessed as separate registers:
545c6d31e6fSDmitry Preobrazhensky
54647eb6368SDmitry Preobrazhensky    ===================== =================================================================
547c6d31e6fSDmitry Preobrazhensky    Syntax                Description
54847eb6368SDmitry Preobrazhensky    ===================== =================================================================
54947eb6368SDmitry Preobrazhensky    exec_lo               Low 32 bits of *execute mask* register.
55047eb6368SDmitry Preobrazhensky    exec_hi               High 32 bits of *execute mask* register.
551b9683d3cSDmitry Preobrazhensky    [exec_lo]             Low 32 bits of *execute mask* register (an SP3 syntax).
552b9683d3cSDmitry Preobrazhensky    [exec_hi]             High 32 bits of *execute mask* register (an SP3 syntax).
55347eb6368SDmitry Preobrazhensky    ===================== =================================================================
554c6d31e6fSDmitry Preobrazhensky
55547eb6368SDmitry Preobrazhensky.. _amdgpu_synid_vccz:
556c6d31e6fSDmitry Preobrazhensky
55747eb6368SDmitry Preobrazhenskyvccz
55847eb6368SDmitry Preobrazhensky----
559c6d31e6fSDmitry Preobrazhensky
560d9daee5aSDmitry PreobrazhenskyA single bit flag indicating that the :ref:`vcc<amdgpu_synid_vcc>`
561d9daee5aSDmitry Preobrazhenskyis all zeros.
562c6d31e6fSDmitry Preobrazhensky
563d9daee5aSDmitry PreobrazhenskyNote: when GFX10+ operates in *wave32* mode, this register reflects
564d9daee5aSDmitry Preobrazhenskythe state of :ref:`vcc_lo<amdgpu_synid_vcc_lo>`.
565c6d31e6fSDmitry Preobrazhensky
56647eb6368SDmitry Preobrazhensky.. _amdgpu_synid_execz:
567c6d31e6fSDmitry Preobrazhensky
56847eb6368SDmitry Preobrazhenskyexecz
56947eb6368SDmitry Preobrazhensky-----
570c6d31e6fSDmitry Preobrazhensky
571d9daee5aSDmitry PreobrazhenskyA single bit flag indicating that the :ref:`exec<amdgpu_synid_exec>`
572d9daee5aSDmitry Preobrazhenskyis all zeros.
573c6d31e6fSDmitry Preobrazhensky
574d9daee5aSDmitry PreobrazhenskyNote: when GFX10+ operates in *wave32* mode, this register reflects
575d9daee5aSDmitry Preobrazhenskythe state of :ref:`exec_lo<amdgpu_synid_exec>`.
576c6d31e6fSDmitry Preobrazhensky
57747eb6368SDmitry Preobrazhensky.. _amdgpu_synid_scc:
578c6d31e6fSDmitry Preobrazhensky
57947eb6368SDmitry Preobrazhenskyscc
58047eb6368SDmitry Preobrazhensky---
581c6d31e6fSDmitry Preobrazhensky
58247eb6368SDmitry PreobrazhenskyA single bit flag indicating the result of a scalar compare operation.
583c6d31e6fSDmitry Preobrazhensky
584cef9d421SDmitry Preobrazhensky.. _amdgpu_synid_lds_direct:
585c6d31e6fSDmitry Preobrazhensky
58647eb6368SDmitry Preobrazhenskylds_direct
58747eb6368SDmitry Preobrazhensky----------
58847eb6368SDmitry Preobrazhensky
58947eb6368SDmitry PreobrazhenskyA special operand which supplies a 32-bit value
59047eb6368SDmitry Preobrazhenskyfetched from *LDS* memory using :ref:`m0<amdgpu_synid_m0>` as an address.
59147eb6368SDmitry Preobrazhensky
592cef9d421SDmitry Preobrazhensky.. _amdgpu_synid_null:
593cef9d421SDmitry Preobrazhensky
594cef9d421SDmitry Preobrazhenskynull
595cef9d421SDmitry Preobrazhensky----
596cef9d421SDmitry Preobrazhensky
597d9daee5aSDmitry PreobrazhenskyThis is a special operand that may be used as a source or a destination.
598cef9d421SDmitry Preobrazhensky
599cef9d421SDmitry PreobrazhenskyWhen used as a destination, the result of the operation is discarded.
600cef9d421SDmitry Preobrazhensky
601cef9d421SDmitry PreobrazhenskyWhen used as a source, it supplies zero value.
602cef9d421SDmitry Preobrazhensky
60347eb6368SDmitry Preobrazhensky.. _amdgpu_synid_constant:
60447eb6368SDmitry Preobrazhensky
605b9683d3cSDmitry Preobrazhenskyinline constant
606b9683d3cSDmitry Preobrazhensky---------------
60747eb6368SDmitry Preobrazhensky
608d9daee5aSDmitry PreobrazhenskyAn *inline constant* is an integer or a floating-point value
609d9daee5aSDmitry Preobrazhenskyencoded as a part of an instruction. Compare *inline constants*
610d9daee5aSDmitry Preobrazhenskywith :ref:`literals<amdgpu_synid_literal>`.
611b9683d3cSDmitry Preobrazhensky
612b9683d3cSDmitry PreobrazhenskyInline constants include:
61347eb6368SDmitry Preobrazhensky
614d9daee5aSDmitry Preobrazhensky* :ref:`Integer inline constants<amdgpu_synid_iconst>`;
615d9daee5aSDmitry Preobrazhensky* :ref:`Floating-point inline constants<amdgpu_synid_fconst>`;
616d9daee5aSDmitry Preobrazhensky* :ref:`Inline values<amdgpu_synid_ival>`.
61747eb6368SDmitry Preobrazhensky
61847eb6368SDmitry PreobrazhenskyIf a number may be encoded as either
61947eb6368SDmitry Preobrazhenskya :ref:`literal<amdgpu_synid_literal>` or
620cef9d421SDmitry Preobrazhenskya :ref:`constant<amdgpu_synid_constant>`,
621d9daee5aSDmitry Preobrazhenskythe assembler selects the latter encoding as more efficient.
62247eb6368SDmitry Preobrazhensky
62347eb6368SDmitry Preobrazhensky.. _amdgpu_synid_iconst:
62447eb6368SDmitry Preobrazhensky
62547eb6368SDmitry Preobrazhenskyiconst
626cef9d421SDmitry Preobrazhensky~~~~~~
62747eb6368SDmitry Preobrazhensky
628b9683d3cSDmitry PreobrazhenskyAn :ref:`integer number<amdgpu_synid_integer_number>` or
629b9683d3cSDmitry Preobrazhenskyan :ref:`absolute expression<amdgpu_synid_absolute_expression>`
63047eb6368SDmitry Preobrazhenskyencoded as an *inline constant*.
63147eb6368SDmitry Preobrazhensky
63247eb6368SDmitry PreobrazhenskyOnly a small fraction of integer numbers may be encoded as *inline constants*.
63347eb6368SDmitry PreobrazhenskyThey are enumerated in the table below.
634d9daee5aSDmitry PreobrazhenskyOther integer numbers are encoded as :ref:`literals<amdgpu_synid_literal>`.
63547eb6368SDmitry Preobrazhensky
63647eb6368SDmitry Preobrazhensky    ================================== ====================================
63747eb6368SDmitry Preobrazhensky    Value                              Note
63847eb6368SDmitry Preobrazhensky    ================================== ====================================
63947eb6368SDmitry Preobrazhensky    {0..64}                            Positive integer inline constants.
64047eb6368SDmitry Preobrazhensky    {-16..-1}                          Negative integer inline constants.
64147eb6368SDmitry Preobrazhensky    ================================== ====================================
64247eb6368SDmitry Preobrazhensky
64347eb6368SDmitry Preobrazhensky.. _amdgpu_synid_fconst:
64447eb6368SDmitry Preobrazhensky
64547eb6368SDmitry Preobrazhenskyfconst
646cef9d421SDmitry Preobrazhensky~~~~~~
64747eb6368SDmitry Preobrazhensky
64847eb6368SDmitry PreobrazhenskyA :ref:`floating-point number<amdgpu_synid_floating-point_number>`
64947eb6368SDmitry Preobrazhenskyencoded as an *inline constant*.
65047eb6368SDmitry Preobrazhensky
651d9daee5aSDmitry PreobrazhenskyOnly a small fraction of floating-point numbers may be encoded
652d9daee5aSDmitry Preobrazhenskyas *inline constants*. They are enumerated in the table below.
653d9daee5aSDmitry PreobrazhenskyOther floating-point numbers are encoded as
654d9daee5aSDmitry Preobrazhensky:ref:`literals<amdgpu_synid_literal>`.
65547eb6368SDmitry Preobrazhensky
6566bc26aaaSDmitry Preobrazhensky    ===================== ===================================================== ==================
65747eb6368SDmitry Preobrazhensky    Value                 Note                                                  Availability
6586bc26aaaSDmitry Preobrazhensky    ===================== ===================================================== ==================
65947eb6368SDmitry Preobrazhensky    0.0                   The same as integer constant 0.                       All GPUs
66047eb6368SDmitry Preobrazhensky    0.5                   Floating-point constant 0.5                           All GPUs
66147eb6368SDmitry Preobrazhensky    1.0                   Floating-point constant 1.0                           All GPUs
66247eb6368SDmitry Preobrazhensky    2.0                   Floating-point constant 2.0                           All GPUs
66347eb6368SDmitry Preobrazhensky    4.0                   Floating-point constant 4.0                           All GPUs
66447eb6368SDmitry Preobrazhensky    -0.5                  Floating-point constant -0.5                          All GPUs
66547eb6368SDmitry Preobrazhensky    -1.0                  Floating-point constant -1.0                          All GPUs
66647eb6368SDmitry Preobrazhensky    -2.0                  Floating-point constant -2.0                          All GPUs
66747eb6368SDmitry Preobrazhensky    -4.0                  Floating-point constant -4.0                          All GPUs
668d9daee5aSDmitry Preobrazhensky    0.1592                1.0/(2.0*pi). Use only for 16-bit operands.           GFX8+
669d9daee5aSDmitry Preobrazhensky    0.15915494            1.0/(2.0*pi). Use only for 16- and 32-bit operands.   GFX8+
670d9daee5aSDmitry Preobrazhensky    0.15915494309189532   1.0/(2.0*pi).                                         GFX8+
6716bc26aaaSDmitry Preobrazhensky    ===================== ===================================================== ==================
67247eb6368SDmitry Preobrazhensky
6733f7985e6SDmitry Preobrazhensky.. WARNING:: Floating-point inline constants cannot be used with *16-bit integer* operands. \
674d9daee5aSDmitry Preobrazhensky             Assembler encodes these values as literals.
67547eb6368SDmitry Preobrazhensky
676cef9d421SDmitry Preobrazhensky.. _amdgpu_synid_ival:
677cef9d421SDmitry Preobrazhensky
678cef9d421SDmitry Preobrazhenskyival
679cef9d421SDmitry Preobrazhensky~~~~
680cef9d421SDmitry Preobrazhensky
681cef9d421SDmitry PreobrazhenskyA symbolic operand encoded as an *inline constant*.
682cef9d421SDmitry PreobrazhenskyThese operands provide read-only access to H/W registers.
683cef9d421SDmitry Preobrazhensky
684d9daee5aSDmitry Preobrazhensky    ===================== ========================= ================================================ =============
685d9daee5aSDmitry Preobrazhensky    Syntax                Alternative Syntax (SP3)  Note                                             Availability
686d9daee5aSDmitry Preobrazhensky    ===================== ========================= ================================================ =============
687d9daee5aSDmitry Preobrazhensky    shared_base           src_shared_base           Base address of shared memory region.            GFX9+
688d9daee5aSDmitry Preobrazhensky    shared_limit          src_shared_limit          Address of the end of shared memory region.      GFX9+
689d9daee5aSDmitry Preobrazhensky    private_base          src_private_base          Base address of private memory region.           GFX9+
690d9daee5aSDmitry Preobrazhensky    private_limit         src_private_limit         Address of the end of private memory region.     GFX9+
691d9daee5aSDmitry Preobrazhensky    pops_exiting_wave_id  src_pops_exiting_wave_id  A dedicated counter for POPS.                    GFX9, GFX10
692d9daee5aSDmitry Preobrazhensky    ===================== ========================= ================================================ =============
693cef9d421SDmitry Preobrazhensky
69447eb6368SDmitry Preobrazhensky.. _amdgpu_synid_literal:
69547eb6368SDmitry Preobrazhensky
69647eb6368SDmitry Preobrazhenskyliteral
69747eb6368SDmitry Preobrazhensky-------
69847eb6368SDmitry Preobrazhensky
699d9daee5aSDmitry PreobrazhenskyA *literal* is a 64-bit value encoded as a separate
700d9daee5aSDmitry Preobrazhensky32-bit dword in the instruction stream. Compare *literals*
701d9daee5aSDmitry Preobrazhenskywith :ref:`inline constants<amdgpu_synid_constant>`.
70247eb6368SDmitry Preobrazhensky
70347eb6368SDmitry PreobrazhenskyIf a number may be encoded as either
70447eb6368SDmitry Preobrazhenskya :ref:`literal<amdgpu_synid_literal>` or
70547eb6368SDmitry Preobrazhenskyan :ref:`inline constant<amdgpu_synid_constant>`,
70647eb6368SDmitry Preobrazhenskyassembler selects the latter encoding as more efficient.
70747eb6368SDmitry Preobrazhensky
708d9daee5aSDmitry PreobrazhenskyLiterals may be specified as
709d9daee5aSDmitry Preobrazhensky:ref:`integer numbers<amdgpu_synid_integer_number>`,
710b9683d3cSDmitry Preobrazhensky:ref:`floating-point numbers<amdgpu_synid_floating-point_number>`,
711b9683d3cSDmitry Preobrazhensky:ref:`absolute expressions<amdgpu_synid_absolute_expression>` or
712b9683d3cSDmitry Preobrazhensky:ref:`relocatable expressions<amdgpu_synid_relocatable_expression>`.
71347eb6368SDmitry Preobrazhensky
714d9daee5aSDmitry PreobrazhenskyAn instruction may use only one literal,
715d9daee5aSDmitry Preobrazhenskybut several operands may refer to the same literal.
71647eb6368SDmitry Preobrazhensky
71747eb6368SDmitry Preobrazhensky.. _amdgpu_synid_uimm8:
71847eb6368SDmitry Preobrazhensky
71947eb6368SDmitry Preobrazhenskyuimm8
72047eb6368SDmitry Preobrazhensky-----
72147eb6368SDmitry Preobrazhensky
722d9daee5aSDmitry PreobrazhenskyAn 8-bit :ref:`integer number<amdgpu_synid_integer_number>`
723b9683d3cSDmitry Preobrazhenskyor an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
724b9683d3cSDmitry PreobrazhenskyThe value must be in the range 0..0xFF.
72547eb6368SDmitry Preobrazhensky
72647eb6368SDmitry Preobrazhensky.. _amdgpu_synid_uimm32:
72747eb6368SDmitry Preobrazhensky
72847eb6368SDmitry Preobrazhenskyuimm32
72947eb6368SDmitry Preobrazhensky------
73047eb6368SDmitry Preobrazhensky
731b9683d3cSDmitry PreobrazhenskyA 32-bit :ref:`integer number<amdgpu_synid_integer_number>`
732b9683d3cSDmitry Preobrazhenskyor an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
733b9683d3cSDmitry PreobrazhenskyThe value must be in the range 0..0xFFFFFFFF.
73447eb6368SDmitry Preobrazhensky
73547eb6368SDmitry Preobrazhensky.. _amdgpu_synid_uimm20:
73647eb6368SDmitry Preobrazhensky
73747eb6368SDmitry Preobrazhenskyuimm20
73847eb6368SDmitry Preobrazhensky------
73947eb6368SDmitry Preobrazhensky
740b9683d3cSDmitry PreobrazhenskyA 20-bit :ref:`integer number<amdgpu_synid_integer_number>`
741b9683d3cSDmitry Preobrazhenskyor an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
742b9683d3cSDmitry Preobrazhensky
743b9683d3cSDmitry PreobrazhenskyThe value must be in the range 0..0xFFFFF.
74447eb6368SDmitry Preobrazhensky
74547eb6368SDmitry Preobrazhensky.. _amdgpu_synid_simm21:
74647eb6368SDmitry Preobrazhensky
74747eb6368SDmitry Preobrazhenskysimm21
74847eb6368SDmitry Preobrazhensky------
74947eb6368SDmitry Preobrazhensky
750b9683d3cSDmitry PreobrazhenskyA 21-bit :ref:`integer number<amdgpu_synid_integer_number>`
751b9683d3cSDmitry Preobrazhenskyor an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
752b9683d3cSDmitry Preobrazhensky
753b9683d3cSDmitry PreobrazhenskyThe value must be in the range -0x100000..0x0FFFFF.
75447eb6368SDmitry Preobrazhensky
75547eb6368SDmitry Preobrazhensky.. _amdgpu_synid_off:
75647eb6368SDmitry Preobrazhensky
75747eb6368SDmitry Preobrazhenskyoff
75847eb6368SDmitry Preobrazhensky---
75947eb6368SDmitry Preobrazhensky
76047eb6368SDmitry PreobrazhenskyA special entity which indicates that the value of this operand is not used.
76147eb6368SDmitry Preobrazhensky
76247eb6368SDmitry Preobrazhensky    ================================== ===================================================
763c6d31e6fSDmitry Preobrazhensky    Syntax                             Description
76447eb6368SDmitry Preobrazhensky    ================================== ===================================================
76547eb6368SDmitry Preobrazhensky    off                                Indicates an unused operand.
76647eb6368SDmitry Preobrazhensky    ================================== ===================================================
767c6d31e6fSDmitry Preobrazhensky
768c6d31e6fSDmitry Preobrazhensky
76947eb6368SDmitry Preobrazhensky.. _amdgpu_synid_number:
770c6d31e6fSDmitry Preobrazhensky
77147eb6368SDmitry PreobrazhenskyNumbers
77247eb6368SDmitry Preobrazhensky=======
773c6d31e6fSDmitry Preobrazhensky
77447eb6368SDmitry Preobrazhensky.. _amdgpu_synid_integer_number:
775c6d31e6fSDmitry Preobrazhensky
77647eb6368SDmitry PreobrazhenskyInteger Numbers
777c6d31e6fSDmitry Preobrazhensky---------------
778c6d31e6fSDmitry Preobrazhensky
77947eb6368SDmitry PreobrazhenskyInteger numbers are 64 bits wide.
780b9683d3cSDmitry PreobrazhenskyThey are converted to :ref:`expected operand type<amdgpu_syn_instruction_type>`
781b9683d3cSDmitry Preobrazhenskyas described :ref:`here<amdgpu_synid_int_conv>`.
782c6d31e6fSDmitry Preobrazhensky
783d9daee5aSDmitry PreobrazhenskyInteger numbers may be specified in binary, octal,
784d9daee5aSDmitry Preobrazhenskyhexadecimal and decimal formats:
785c6d31e6fSDmitry Preobrazhensky
786b9683d3cSDmitry Preobrazhensky    ============ =============================== ========
787b9683d3cSDmitry Preobrazhensky    Format       Syntax                          Example
788b9683d3cSDmitry Preobrazhensky    ============ =============================== ========
789b9683d3cSDmitry Preobrazhensky    Decimal      [-]?[1-9][0-9]*                 -1234
790b9683d3cSDmitry Preobrazhensky    Binary       [-]?0b[01]+                     0b1010
791b9683d3cSDmitry Preobrazhensky    Octal        [-]?0[0-7]+                     010
792b9683d3cSDmitry Preobrazhensky    Hexadecimal  [-]?0x[0-9a-fA-F]+              0xff
793b9683d3cSDmitry Preobrazhensky    \            [-]?[0x]?[0-9][0-9a-fA-F]*[hH]  0ffh
794b9683d3cSDmitry Preobrazhensky    ============ =============================== ========
795c6d31e6fSDmitry Preobrazhensky
79647eb6368SDmitry Preobrazhensky.. _amdgpu_synid_floating-point_number:
797c6d31e6fSDmitry Preobrazhensky
79847eb6368SDmitry PreobrazhenskyFloating-Point Numbers
79947eb6368SDmitry Preobrazhensky----------------------
800c6d31e6fSDmitry Preobrazhensky
80147eb6368SDmitry PreobrazhenskyAll floating-point numbers are handled as double (64 bits wide).
802b9683d3cSDmitry PreobrazhenskyThey are converted to
803b9683d3cSDmitry Preobrazhensky:ref:`expected operand type<amdgpu_syn_instruction_type>`
804b9683d3cSDmitry Preobrazhenskyas described :ref:`here<amdgpu_synid_fp_conv>`.
805c6d31e6fSDmitry Preobrazhensky
80647eb6368SDmitry PreobrazhenskyFloating-point numbers may be specified in hexadecimal and decimal formats:
807c6d31e6fSDmitry Preobrazhensky
808b9683d3cSDmitry Preobrazhensky    ============ ======================================================== ====================== ====================
809b9683d3cSDmitry Preobrazhensky    Format       Syntax                                                   Examples               Note
810b9683d3cSDmitry Preobrazhensky    ============ ======================================================== ====================== ====================
811b9683d3cSDmitry Preobrazhensky    Decimal      [-]?[0-9]*[.][0-9]*([eE][+-]?[0-9]*)?                    -1.234, 234e2          Must include either
812b9683d3cSDmitry Preobrazhensky                                                                                                 a decimal separator
813b9683d3cSDmitry Preobrazhensky                                                                                                 or an exponent.
814b9683d3cSDmitry Preobrazhensky    Hexadecimal  [-]0x[0-9a-fA-F]*(.[0-9a-fA-F]*)?[pP][+-]?[0-9a-fA-F]+   -0x1afp-10, 0x.1afp10
815b9683d3cSDmitry Preobrazhensky    ============ ======================================================== ====================== ====================
816c6d31e6fSDmitry Preobrazhensky
81747eb6368SDmitry Preobrazhensky.. _amdgpu_synid_expression:
818c6d31e6fSDmitry Preobrazhensky
81947eb6368SDmitry PreobrazhenskyExpressions
82047eb6368SDmitry Preobrazhensky===========
821c6d31e6fSDmitry Preobrazhensky
822b9683d3cSDmitry PreobrazhenskyAn expression is evaluated to a 64-bit integer.
823b9683d3cSDmitry PreobrazhenskyNote that floating-point expressions are not supported.
824b9683d3cSDmitry Preobrazhensky
82547eb6368SDmitry PreobrazhenskyThere are two kinds of expressions:
826c6d31e6fSDmitry Preobrazhensky
82747eb6368SDmitry Preobrazhensky* :ref:`Absolute<amdgpu_synid_absolute_expression>`.
82847eb6368SDmitry Preobrazhensky* :ref:`Relocatable<amdgpu_synid_relocatable_expression>`.
829c6d31e6fSDmitry Preobrazhensky
83047eb6368SDmitry Preobrazhensky.. _amdgpu_synid_absolute_expression:
831c6d31e6fSDmitry Preobrazhensky
83247eb6368SDmitry PreobrazhenskyAbsolute Expressions
83347eb6368SDmitry Preobrazhensky--------------------
834c6d31e6fSDmitry Preobrazhensky
835b9683d3cSDmitry PreobrazhenskyThe value of an absolute expression does not change after program relocation.
83647eb6368SDmitry PreobrazhenskyAbsolute expressions must not include unassigned and relocatable values
83747eb6368SDmitry Preobrazhenskysuch as labels.
838c6d31e6fSDmitry Preobrazhensky
839b9683d3cSDmitry PreobrazhenskyAbsolute expressions are evaluated to 64-bit integer values and converted to
840b9683d3cSDmitry Preobrazhensky:ref:`expected operand type<amdgpu_syn_instruction_type>`
841b9683d3cSDmitry Preobrazhenskyas described :ref:`here<amdgpu_synid_int_conv>`.
842b9683d3cSDmitry Preobrazhensky
84347eb6368SDmitry PreobrazhenskyExamples:
844c6d31e6fSDmitry Preobrazhensky
8451fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
846c6d31e6fSDmitry Preobrazhensky
84747eb6368SDmitry Preobrazhensky    x = -1
84847eb6368SDmitry Preobrazhensky    y = x + 10
849c6d31e6fSDmitry Preobrazhensky
85047eb6368SDmitry Preobrazhensky.. _amdgpu_synid_relocatable_expression:
851c6d31e6fSDmitry Preobrazhensky
85247eb6368SDmitry PreobrazhenskyRelocatable Expressions
85347eb6368SDmitry Preobrazhensky-----------------------
854c6d31e6fSDmitry Preobrazhensky
85547eb6368SDmitry PreobrazhenskyThe value of a relocatable expression depends on program relocation.
856c6d31e6fSDmitry Preobrazhensky
857d9daee5aSDmitry PreobrazhenskyNote that use of relocatable expressions is limited to branch targets
858b9683d3cSDmitry Preobrazhenskyand 32-bit integer operands.
859c6d31e6fSDmitry Preobrazhensky
860d9daee5aSDmitry PreobrazhenskyA relocatable expression is evaluated to a 64-bit integer value,
861d9daee5aSDmitry Preobrazhenskywhich depends on operand kind and
862d9daee5aSDmitry Preobrazhensky:ref:`relocation type<amdgpu-relocation-records>` of symbol(s)
863d9daee5aSDmitry Preobrazhenskyused in the expression. For example, if an instruction refers to a label,
864d9daee5aSDmitry Preobrazhenskythis reference is evaluated to an offset from the address after
865d9daee5aSDmitry Preobrazhenskythe instruction to the label address:
866c6d31e6fSDmitry Preobrazhensky
8671fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
868c6d31e6fSDmitry Preobrazhensky
869b9683d3cSDmitry Preobrazhensky    label:
870b9683d3cSDmitry Preobrazhensky    v_add_co_u32_e32 v0, vcc, label, v1  // 'label' operand is evaluated to -4
871c6d31e6fSDmitry Preobrazhensky
872d9daee5aSDmitry PreobrazhenskyNote that values of relocatable expressions are usually unknown
873d9daee5aSDmitry Preobrazhenskyat assembly time; they are resolved later by a linker and converted to
874b9683d3cSDmitry Preobrazhensky:ref:`expected operand type<amdgpu_syn_instruction_type>`
875b9683d3cSDmitry Preobrazhenskyas described :ref:`here<amdgpu_synid_rl_conv>`.
876c6d31e6fSDmitry Preobrazhensky
877b9683d3cSDmitry PreobrazhenskyOperands and Operations
878b9683d3cSDmitry Preobrazhensky-----------------------
879c6d31e6fSDmitry Preobrazhensky
880b9683d3cSDmitry PreobrazhenskyExpressions are composed of 64-bit integer operands and operations.
881b9683d3cSDmitry PreobrazhenskyOperands include :ref:`integer numbers<amdgpu_synid_integer_number>`
882b9683d3cSDmitry Preobrazhenskyand :ref:`symbols<amdgpu_synid_symbol>`.
883c80b1650SDmitry Preobrazhensky
884d9daee5aSDmitry PreobrazhenskyExpressions may also use "." which is a reference
885d9daee5aSDmitry Preobrazhenskyto the current PC (program counter).
886c80b1650SDmitry Preobrazhensky
887d9daee5aSDmitry Preobrazhensky:ref:`Unary<amdgpu_synid_expression_un_op>` and
888d9daee5aSDmitry Preobrazhensky:ref:`binary<amdgpu_synid_expression_bin_op>`
889b9683d3cSDmitry Preobrazhenskyoperations produce 64-bit integer results.
890b9683d3cSDmitry Preobrazhensky
891b9683d3cSDmitry PreobrazhenskySyntax of Expressions
892b9683d3cSDmitry Preobrazhensky---------------------
893b9683d3cSDmitry Preobrazhensky
8943f7985e6SDmitry PreobrazhenskySyntax of expressions is shown below::
895c80b1650SDmitry Preobrazhensky
89647eb6368SDmitry Preobrazhensky    expr ::= expr binop expr | primaryexpr ;
897c80b1650SDmitry Preobrazhensky
89847eb6368SDmitry Preobrazhensky    primaryexpr ::= '(' expr ')' | symbol | number | '.' | unop primaryexpr ;
899c80b1650SDmitry Preobrazhensky
90047eb6368SDmitry Preobrazhensky    binop ::= '&&'
90147eb6368SDmitry Preobrazhensky            | '||'
90247eb6368SDmitry Preobrazhensky            | '|'
90347eb6368SDmitry Preobrazhensky            | '^'
90447eb6368SDmitry Preobrazhensky            | '&'
90547eb6368SDmitry Preobrazhensky            | '!'
90647eb6368SDmitry Preobrazhensky            | '=='
90747eb6368SDmitry Preobrazhensky            | '!='
90847eb6368SDmitry Preobrazhensky            | '<>'
90947eb6368SDmitry Preobrazhensky            | '<'
91047eb6368SDmitry Preobrazhensky            | '<='
91147eb6368SDmitry Preobrazhensky            | '>'
91247eb6368SDmitry Preobrazhensky            | '>='
91347eb6368SDmitry Preobrazhensky            | '<<'
91447eb6368SDmitry Preobrazhensky            | '>>'
91547eb6368SDmitry Preobrazhensky            | '+'
91647eb6368SDmitry Preobrazhensky            | '-'
91747eb6368SDmitry Preobrazhensky            | '*'
91847eb6368SDmitry Preobrazhensky            | '/'
91947eb6368SDmitry Preobrazhensky            | '%' ;
920c6d31e6fSDmitry Preobrazhensky
92147eb6368SDmitry Preobrazhensky    unop ::= '~'
92247eb6368SDmitry Preobrazhensky           | '+'
92347eb6368SDmitry Preobrazhensky           | '-'
92447eb6368SDmitry Preobrazhensky           | '!' ;
925c6d31e6fSDmitry Preobrazhensky
92647eb6368SDmitry Preobrazhensky.. _amdgpu_synid_expression_bin_op:
927c6d31e6fSDmitry Preobrazhensky
92847eb6368SDmitry PreobrazhenskyBinary Operators
92947eb6368SDmitry Preobrazhensky----------------
930c6d31e6fSDmitry Preobrazhensky
93147eb6368SDmitry PreobrazhenskyBinary operators are described in the following table.
93247eb6368SDmitry PreobrazhenskyThey operate on and produce 64-bit integers.
93347eb6368SDmitry PreobrazhenskyOperators with higher priority are performed first.
934c6d31e6fSDmitry Preobrazhensky
93547eb6368SDmitry Preobrazhensky    ========== ========= ===============================================
93647eb6368SDmitry Preobrazhensky    Operator   Priority  Meaning
93747eb6368SDmitry Preobrazhensky    ========== ========= ===============================================
93847eb6368SDmitry Preobrazhensky       \*         5      Integer multiplication.
93947eb6368SDmitry Preobrazhensky       /          5      Integer division.
94047eb6368SDmitry Preobrazhensky       %          5      Integer signed remainder.
94147eb6368SDmitry Preobrazhensky       \+         4      Integer addition.
94247eb6368SDmitry Preobrazhensky       \-         4      Integer subtraction.
94347eb6368SDmitry Preobrazhensky       <<         3      Integer shift left.
94447eb6368SDmitry Preobrazhensky       >>         3      Logical shift right.
94547eb6368SDmitry Preobrazhensky       ==         2      Equality comparison.
94647eb6368SDmitry Preobrazhensky       !=         2      Inequality comparison.
94747eb6368SDmitry Preobrazhensky       <>         2      Inequality comparison.
94847eb6368SDmitry Preobrazhensky       <          2      Signed less than comparison.
94947eb6368SDmitry Preobrazhensky       <=         2      Signed less than or equal comparison.
95047eb6368SDmitry Preobrazhensky       >          2      Signed greater than comparison.
95147eb6368SDmitry Preobrazhensky       >=         2      Signed greater than or equal comparison.
95247eb6368SDmitry Preobrazhensky      \|          1      Bitwise or.
95347eb6368SDmitry Preobrazhensky       ^          1      Bitwise xor.
95447eb6368SDmitry Preobrazhensky       &          1      Bitwise and.
95547eb6368SDmitry Preobrazhensky       &&         0      Logical and.
95647eb6368SDmitry Preobrazhensky       ||         0      Logical or.
95747eb6368SDmitry Preobrazhensky    ========== ========= ===============================================
958c6d31e6fSDmitry Preobrazhensky
95947eb6368SDmitry Preobrazhensky.. _amdgpu_synid_expression_un_op:
96047eb6368SDmitry Preobrazhensky
96147eb6368SDmitry PreobrazhenskyUnary Operators
96247eb6368SDmitry Preobrazhensky---------------
96347eb6368SDmitry Preobrazhensky
96447eb6368SDmitry PreobrazhenskyUnary operators are described in the following table.
96547eb6368SDmitry PreobrazhenskyThey operate on and produce 64-bit integers.
96647eb6368SDmitry Preobrazhensky
96747eb6368SDmitry Preobrazhensky    ========== ===============================================
96847eb6368SDmitry Preobrazhensky    Operator   Meaning
96947eb6368SDmitry Preobrazhensky    ========== ===============================================
97047eb6368SDmitry Preobrazhensky       !       Logical negation.
97147eb6368SDmitry Preobrazhensky       ~       Bitwise negation.
97247eb6368SDmitry Preobrazhensky       \+      Integer unary plus.
97347eb6368SDmitry Preobrazhensky       \-      Integer unary minus.
97447eb6368SDmitry Preobrazhensky    ========== ===============================================
97547eb6368SDmitry Preobrazhensky
97647eb6368SDmitry Preobrazhensky.. _amdgpu_synid_symbol:
97747eb6368SDmitry Preobrazhensky
97847eb6368SDmitry PreobrazhenskySymbols
97947eb6368SDmitry Preobrazhensky-------
98047eb6368SDmitry Preobrazhensky
981b9683d3cSDmitry PreobrazhenskyA symbol is a named 64-bit integer value, representing a relocatable
98247eb6368SDmitry Preobrazhenskyaddress or an absolute (non-relocatable) number.
98347eb6368SDmitry Preobrazhensky
98447eb6368SDmitry PreobrazhenskySymbol names have the following syntax:
98547eb6368SDmitry Preobrazhensky    ``[a-zA-Z_.][a-zA-Z0-9_$.@]*``
98647eb6368SDmitry Preobrazhensky
98747eb6368SDmitry PreobrazhenskyThe table below provides several examples of syntax used for symbol definition.
98847eb6368SDmitry Preobrazhensky
98947eb6368SDmitry Preobrazhensky    ================ ==========================================================
99047eb6368SDmitry Preobrazhensky    Syntax           Meaning
99147eb6368SDmitry Preobrazhensky    ================ ==========================================================
99247eb6368SDmitry Preobrazhensky    .globl <S>       Declares a global symbol S without assigning it a value.
99347eb6368SDmitry Preobrazhensky    .set <S>, <E>    Assigns the value of an expression E to a symbol S.
99447eb6368SDmitry Preobrazhensky    <S> = <E>        Assigns the value of an expression E to a symbol S.
99547eb6368SDmitry Preobrazhensky    <S>:             Declares a label S and assigns it the current PC value.
99647eb6368SDmitry Preobrazhensky    ================ ==========================================================
99747eb6368SDmitry Preobrazhensky
99847eb6368SDmitry PreobrazhenskyA symbol may be used before it is declared or assigned;
99947eb6368SDmitry Preobrazhenskyunassigned symbols are assumed to be PC-relative.
100047eb6368SDmitry Preobrazhensky
1001b9683d3cSDmitry PreobrazhenskyAdditional information about symbols may be found :ref:`here<amdgpu-symbols>`.
100247eb6368SDmitry Preobrazhensky
100347eb6368SDmitry Preobrazhensky.. _amdgpu_synid_conv:
100447eb6368SDmitry Preobrazhensky
1005b9683d3cSDmitry PreobrazhenskyType and Size Conversion
1006b9683d3cSDmitry Preobrazhensky========================
100747eb6368SDmitry Preobrazhensky
100847eb6368SDmitry PreobrazhenskyThis section describes what happens when a 64-bit
100947eb6368SDmitry Preobrazhensky:ref:`integer number<amdgpu_synid_integer_number>`, a
1010b9683d3cSDmitry Preobrazhensky:ref:`floating-point number<amdgpu_synid_floating-point_number>` or an
1011b9683d3cSDmitry Preobrazhensky:ref:`expression<amdgpu_synid_expression>`
101247eb6368SDmitry Preobrazhenskyis used for an operand which has a different type or size.
101347eb6368SDmitry Preobrazhensky
1014b9683d3cSDmitry Preobrazhensky.. _amdgpu_synid_int_conv:
101547eb6368SDmitry Preobrazhensky
1016b9683d3cSDmitry PreobrazhenskyConversion of Integer Values
1017b9683d3cSDmitry Preobrazhensky----------------------------
101847eb6368SDmitry Preobrazhensky
1019d9daee5aSDmitry PreobrazhenskyInstruction operands may be specified as 64-bit
1020d9daee5aSDmitry Preobrazhensky:ref:`integer numbers<amdgpu_synid_integer_number>` or
1021d9daee5aSDmitry Preobrazhensky:ref:`absolute expressions<amdgpu_synid_absolute_expression>`.
1022d9daee5aSDmitry PreobrazhenskyThese values are converted to the
1023d9daee5aSDmitry Preobrazhensky:ref:`expected operand type<amdgpu_syn_instruction_type>`
1024d9daee5aSDmitry Preobrazhenskyusing the following steps:
102547eb6368SDmitry Preobrazhensky
1026d9daee5aSDmitry Preobrazhensky1. *Validation*. Assembler checks if the input value may be truncated
1027d9daee5aSDmitry Preobrazhenskywithout loss to the required *truncation width* (see the table below).
1028d9daee5aSDmitry PreobrazhenskyThere are two cases when this operation is enabled:
102947eb6368SDmitry Preobrazhensky
103047eb6368SDmitry Preobrazhensky    * The truncated bits are all 0.
103147eb6368SDmitry Preobrazhensky    * The truncated bits are all 1 and the value after truncation has its MSB bit set.
103247eb6368SDmitry Preobrazhensky
1033d9daee5aSDmitry PreobrazhenskyIn all other cases, the assembler triggers an error.
1034b9683d3cSDmitry Preobrazhensky
1035d9daee5aSDmitry Preobrazhensky2. *Conversion*. The input value is converted to the expected type
1036d9daee5aSDmitry Preobrazhenskyas described in the table below. Depending on operand kind, this conversion
1037d9daee5aSDmitry Preobrazhenskyis performed by either assembler or AMDGPU H/W (or both).
1038b9683d3cSDmitry Preobrazhensky
1039b9683d3cSDmitry Preobrazhensky    ============== ================= =============== ====================================================================
1040b9683d3cSDmitry Preobrazhensky    Expected type  Truncation Width  Conversion      Description
1041b9683d3cSDmitry Preobrazhensky    ============== ================= =============== ====================================================================
1042b9683d3cSDmitry Preobrazhensky    i16, u16, b16  16                num.u16         Truncate to 16 bits.
1043b9683d3cSDmitry Preobrazhensky    i32, u32, b32  32                num.u32         Truncate to 32 bits.
1044b9683d3cSDmitry Preobrazhensky    i64            32                {-1,num.i32}    Truncate to 32 bits and then sign-extend the result to 64 bits.
1045b9683d3cSDmitry Preobrazhensky    u64, b64       32                {0,num.u32}     Truncate to 32 bits and then zero-extend the result to 64 bits.
1046b9683d3cSDmitry Preobrazhensky    f16            16                num.u16         Use low 16 bits as an f16 value.
1047b9683d3cSDmitry Preobrazhensky    f32            32                num.u32         Use low 32 bits as an f32 value.
1048b9683d3cSDmitry Preobrazhensky    f64            32                {num.u32,0}     Use low 32 bits of the number as high 32 bits
1049b9683d3cSDmitry Preobrazhensky                                                     of the result; low 32 bits of the result are zeroed.
1050b9683d3cSDmitry Preobrazhensky    ============== ================= =============== ====================================================================
1051b9683d3cSDmitry Preobrazhensky
1052b9683d3cSDmitry PreobrazhenskyExamples of enabled conversions:
105347eb6368SDmitry Preobrazhensky
10541fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
105547eb6368SDmitry Preobrazhensky
105647eb6368SDmitry Preobrazhensky    // GFX9
105747eb6368SDmitry Preobrazhensky
1058b9683d3cSDmitry Preobrazhensky    v_add_u16 v0, -1, 0                   // src0 = 0xFFFF
1059b9683d3cSDmitry Preobrazhensky    v_add_f16 v0, -1, 0                   // src0 = 0xFFFF (NaN)
1060b9683d3cSDmitry Preobrazhensky                                          //
1061b9683d3cSDmitry Preobrazhensky    v_add_u32 v0, -1, 0                   // src0 = 0xFFFFFFFF
1062b9683d3cSDmitry Preobrazhensky    v_add_f32 v0, -1, 0                   // src0 = 0xFFFFFFFF (NaN)
1063b9683d3cSDmitry Preobrazhensky                                          //
1064b9683d3cSDmitry Preobrazhensky    v_add_u16 v0, 0xff00, v0              // src0 = 0xff00
1065b9683d3cSDmitry Preobrazhensky    v_add_u16 v0, 0xffffffffffffff00, v0  // src0 = 0xff00
1066b9683d3cSDmitry Preobrazhensky    v_add_u16 v0, -256, v0                // src0 = 0xff00
1067b9683d3cSDmitry Preobrazhensky                                          //
1068b9683d3cSDmitry Preobrazhensky    s_bfe_i64 s[0:1], 0xffefffff, s3      // src0 = 0xffffffffffefffff
1069b9683d3cSDmitry Preobrazhensky    s_bfe_u64 s[0:1], 0xffefffff, s3      // src0 = 0x00000000ffefffff
1070b9683d3cSDmitry Preobrazhensky    v_ceil_f64_e32 v[0:1], 0xffefffff     // src0 = 0xffefffff00000000 (-1.7976922776554302e308)
1071b9683d3cSDmitry Preobrazhensky                                          //
1072b9683d3cSDmitry Preobrazhensky    x = 0xffefffff                        //
1073b9683d3cSDmitry Preobrazhensky    s_bfe_i64 s[0:1], x, s3               // src0 = 0xffffffffffefffff
1074b9683d3cSDmitry Preobrazhensky    s_bfe_u64 s[0:1], x, s3               // src0 = 0x00000000ffefffff
1075b9683d3cSDmitry Preobrazhensky    v_ceil_f64_e32 v[0:1], x              // src0 = 0xffefffff00000000 (-1.7976922776554302e308)
1076b9683d3cSDmitry Preobrazhensky
1077b9683d3cSDmitry PreobrazhenskyExamples of disabled conversions:
107847eb6368SDmitry Preobrazhensky
10791fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
108047eb6368SDmitry Preobrazhensky
108147eb6368SDmitry Preobrazhensky    // GFX9
108247eb6368SDmitry Preobrazhensky
1083ddac5c9bSDmitry Preobrazhensky    v_add_u16 v0, 0x1ff00, v0               // truncated bits are not all 0 or 1
1084ddac5c9bSDmitry Preobrazhensky    v_add_u16 v0, 0xffffffffffff00ff, v0    // truncated bits do not match MSB of the result
108547eb6368SDmitry Preobrazhensky
1086b9683d3cSDmitry Preobrazhensky.. _amdgpu_synid_fp_conv:
108747eb6368SDmitry Preobrazhensky
1088b9683d3cSDmitry PreobrazhenskyConversion of Floating-Point Values
1089b9683d3cSDmitry Preobrazhensky-----------------------------------
109047eb6368SDmitry Preobrazhensky
1091d9daee5aSDmitry PreobrazhenskyInstruction operands may be specified as 64-bit
1092d9daee5aSDmitry Preobrazhensky:ref:`floating-point numbers<amdgpu_synid_floating-point_number>`.
1093d9daee5aSDmitry PreobrazhenskyThese values are converted to the
1094d9daee5aSDmitry Preobrazhensky:ref:`expected operand type<amdgpu_syn_instruction_type>`
1095d9daee5aSDmitry Preobrazhenskyusing the following steps:
109647eb6368SDmitry Preobrazhensky
1097b9683d3cSDmitry Preobrazhensky1. *Validation*. Assembler checks if the input f64 number can be converted
1098d9daee5aSDmitry Preobrazhenskyto the *required floating-point type* (see the table below) without overflow
1099d9daee5aSDmitry Preobrazhenskyor underflow. Precision lost is allowed. If this conversion is not possible,
1100d9daee5aSDmitry Preobrazhenskythe assembler triggers an error.
110147eb6368SDmitry Preobrazhensky
1102d9daee5aSDmitry Preobrazhensky2. *Conversion*. The input value is converted to the expected type
1103d9daee5aSDmitry Preobrazhenskyas described in the table below. Depending on operand kind, this is
1104d9daee5aSDmitry Preobrazhenskyperformed by either assembler or AMDGPU H/W (or both).
1105b9683d3cSDmitry Preobrazhensky
1106b9683d3cSDmitry Preobrazhensky    ============== ================ ================= =================================================================
1107b9683d3cSDmitry Preobrazhensky    Expected type  Required FP Type Conversion        Description
1108b9683d3cSDmitry Preobrazhensky    ============== ================ ================= =================================================================
1109b9683d3cSDmitry Preobrazhensky    i16, u16, b16  f16              f16(num)          Convert to f16 and use bits of the result as an integer value.
1110d9daee5aSDmitry Preobrazhensky                                                      The value has to be encoded as a literal, or an error occurs.
11113f7985e6SDmitry Preobrazhensky                                                      Note that the value cannot be encoded as an inline constant.
1112b9683d3cSDmitry Preobrazhensky    i32, u32, b32  f32              f32(num)          Convert to f32 and use bits of the result as an integer value.
1113b9683d3cSDmitry Preobrazhensky    i64, u64, b64  \-               \-                Conversion disabled.
1114b9683d3cSDmitry Preobrazhensky    f16            f16              f16(num)          Convert to f16.
1115b9683d3cSDmitry Preobrazhensky    f32            f32              f32(num)          Convert to f32.
1116b9683d3cSDmitry Preobrazhensky    f64            f64              {num.u32.hi,0}    Use high 32 bits of the number as high 32 bits of the result;
111747eb6368SDmitry Preobrazhensky                                                      zero-fill low 32 bits of the result.
111847eb6368SDmitry Preobrazhensky
111947eb6368SDmitry Preobrazhensky                                                      Note that the result may differ from the original number.
1120b9683d3cSDmitry Preobrazhensky    ============== ================ ================= =================================================================
112147eb6368SDmitry Preobrazhensky
1122b9683d3cSDmitry PreobrazhenskyExamples of enabled conversions:
112347eb6368SDmitry Preobrazhensky
11241fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
112547eb6368SDmitry Preobrazhensky
112647eb6368SDmitry Preobrazhensky    // GFX9
112747eb6368SDmitry Preobrazhensky
1128b9683d3cSDmitry Preobrazhensky    v_add_f16 v0, 1.0, 0        // src0 = 0x3C00 (1.0)
1129b9683d3cSDmitry Preobrazhensky    v_add_u16 v0, 1.0, 0        // src0 = 0x3C00
1130b9683d3cSDmitry Preobrazhensky                                //
1131b9683d3cSDmitry Preobrazhensky    v_add_f32 v0, 1.0, 0        // src0 = 0x3F800000 (1.0)
1132b9683d3cSDmitry Preobrazhensky    v_add_u32 v0, 1.0, 0        // src0 = 0x3F800000
113347eb6368SDmitry Preobrazhensky
1134b9683d3cSDmitry Preobrazhensky                                // src0 before conversion:
1135b9683d3cSDmitry Preobrazhensky                                //   1.7976931348623157e308 = 0x7fefffffffffffff
1136b9683d3cSDmitry Preobrazhensky                                // src0 after conversion:
1137b9683d3cSDmitry Preobrazhensky                                //   1.7976922776554302e308 = 0x7fefffff00000000
1138ddac5c9bSDmitry Preobrazhensky    v_ceil_f64 v[0:1], 1.7976931348623157e308
113947eb6368SDmitry Preobrazhensky
1140b9683d3cSDmitry Preobrazhensky    v_add_f16 v1, 65500.0, v2   // ok for f16.
1141b9683d3cSDmitry Preobrazhensky    v_add_f32 v1, 65600.0, v2   // ok for f32, but would result in overflow for f16.
1142b9683d3cSDmitry Preobrazhensky
1143b9683d3cSDmitry PreobrazhenskyExamples of disabled conversions:
114447eb6368SDmitry Preobrazhensky
11451fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
114647eb6368SDmitry Preobrazhensky
114747eb6368SDmitry Preobrazhensky    // GFX9
114847eb6368SDmitry Preobrazhensky
1149ddac5c9bSDmitry Preobrazhensky    v_add_f16 v1, 65600.0, v2    // overflow
115047eb6368SDmitry Preobrazhensky
1151b9683d3cSDmitry Preobrazhensky.. _amdgpu_synid_rl_conv:
115247eb6368SDmitry Preobrazhensky
1153b9683d3cSDmitry PreobrazhenskyConversion of Relocatable Values
1154b9683d3cSDmitry Preobrazhensky--------------------------------
115547eb6368SDmitry Preobrazhensky
1156b9683d3cSDmitry Preobrazhensky:ref:`Relocatable expressions<amdgpu_synid_relocatable_expression>`
1157b9683d3cSDmitry Preobrazhenskymay be used with 32-bit integer operands and jump targets.
115847eb6368SDmitry Preobrazhensky
1159b9683d3cSDmitry PreobrazhenskyWhen the value of a relocatable expression is resolved by a linker, it is
1160b9683d3cSDmitry Preobrazhenskyconverted as needed and truncated to the operand size. The conversion depends
1161b9683d3cSDmitry Preobrazhenskyon :ref:`relocation type<amdgpu-relocation-records>` and operand kind.
116247eb6368SDmitry Preobrazhensky
1163d9daee5aSDmitry PreobrazhenskyFor example, when a 32-bit operand of an instruction refers
1164d9daee5aSDmitry Preobrazhenskyto a relocatable expression *expr*, this reference is evaluated
1165d9daee5aSDmitry Preobrazhenskyto a 64-bit offset from the address after the
1166b9683d3cSDmitry Preobrazhenskyinstruction to the address being referenced, *counted in bytes*.
1167b9683d3cSDmitry PreobrazhenskyThen the value is truncated to 32 bits and encoded as a literal:
116847eb6368SDmitry Preobrazhensky
11691fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
117047eb6368SDmitry Preobrazhensky
1171b9683d3cSDmitry Preobrazhensky    expr = .
1172b9683d3cSDmitry Preobrazhensky    v_add_co_u32_e32 v0, vcc, expr, v1  // 'expr' operand is evaluated to -4
1173b9683d3cSDmitry Preobrazhensky                                        // and then truncated to 0xFFFFFFFC
117447eb6368SDmitry Preobrazhensky
1175d9daee5aSDmitry PreobrazhenskyAs another example, when a branch instruction refers to a label,
1176b9683d3cSDmitry Preobrazhenskythis reference is evaluated to an offset from the address after the
1177b9683d3cSDmitry Preobrazhenskyinstruction to the label address, *counted in dwords*.
1178b9683d3cSDmitry PreobrazhenskyThen the value is truncated to 16 bits:
117947eb6368SDmitry Preobrazhensky
1180b9683d3cSDmitry Preobrazhensky.. parsed-literal::
1181b9683d3cSDmitry Preobrazhensky
1182b9683d3cSDmitry Preobrazhensky    label:
1183b9683d3cSDmitry Preobrazhensky    s_branch label  // 'label' operand is evaluated to -1 and truncated to 0xFFFF
1184