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).
1747eb6368SDmitry Preobrazhensky    <x>                 Syntax and meaning of *x* is 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
2747eb6368SDmitry Preobrazhenskyv
2847eb6368SDmitry 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
34*9e3f86e2SDmitry PreobrazhenskyAssembler currently supports sequences of 1, 2, 3, 4, 5, 6, 7, 8, 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.
64*9e3f86e2SDmitry Preobrazhensky* *K-N+1* must be equal to 1, 2, 3, 4, 5, 6, 7, 8, 16 or 32.
65434b278cSDmitry Preobrazhensky
66434b278cSDmitry PreobrazhenskyGFX90A has an additional alignment requirement: pairs of *vector* registers must be even-aligned
67434b278cSDmitry Preobrazhensky(first register must be even).
6847eb6368SDmitry Preobrazhensky
6947eb6368SDmitry PreobrazhenskyExamples:
7047eb6368SDmitry Preobrazhensky
711fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
7247eb6368SDmitry Preobrazhensky
7347eb6368SDmitry Preobrazhensky  v255
7447eb6368SDmitry Preobrazhensky  v[0]
7547eb6368SDmitry Preobrazhensky  v[0:1]
7647eb6368SDmitry Preobrazhensky  v[1:1]
7747eb6368SDmitry Preobrazhensky  v[0:3]
7847eb6368SDmitry Preobrazhensky  v[2*2]
7947eb6368SDmitry Preobrazhensky  v[1-1:2-1]
8047eb6368SDmitry Preobrazhensky  [v252]
8147eb6368SDmitry Preobrazhensky  [v252,v253,v254,v255]
8247eb6368SDmitry Preobrazhensky
83cef9d421SDmitry Preobrazhensky.. _amdgpu_synid_nsa:
84cef9d421SDmitry Preobrazhensky
85b9683d3cSDmitry PreobrazhenskyGFX10 *Image* instructions may use special *NSA* (Non-Sequential Address) syntax for *image addresses*:
86cef9d421SDmitry Preobrazhensky
87b9683d3cSDmitry Preobrazhensky    ===================================== =================================================
88cef9d421SDmitry Preobrazhensky    Syntax                                Description
89b9683d3cSDmitry Preobrazhensky    ===================================== =================================================
90b9683d3cSDmitry Preobrazhensky    **[Vm**, \ **Vn**, ... **Vk**\ **]**  A sequence of 32-bit *vector* registers.
913f7985e6SDmitry Preobrazhensky                                          Each register may be specified using syntax
92b9683d3cSDmitry Preobrazhensky                                          defined :ref:`above<amdgpu_synid_v>`.
93cef9d421SDmitry Preobrazhensky
94b9683d3cSDmitry Preobrazhensky                                          In contrast with standard syntax, registers
95b9683d3cSDmitry Preobrazhensky                                          in *NSA* sequence are not required to have
96b9683d3cSDmitry Preobrazhensky                                          consecutive indices. Moreover, the same register
97b9683d3cSDmitry Preobrazhensky                                          may appear in the list more than once.
98b9683d3cSDmitry Preobrazhensky    ===================================== =================================================
99cef9d421SDmitry Preobrazhensky
100cef9d421SDmitry PreobrazhenskyExamples:
101cef9d421SDmitry Preobrazhensky
102cef9d421SDmitry Preobrazhensky.. parsed-literal::
103cef9d421SDmitry Preobrazhensky
104b9683d3cSDmitry Preobrazhensky  [v32,v1,v[2]]
105b9683d3cSDmitry Preobrazhensky  [v[32],v[1:1],[v2]]
106cef9d421SDmitry Preobrazhensky  [v4,v4,v4,v4]
107cef9d421SDmitry Preobrazhensky
10880c45e49SDmitry Preobrazhensky.. _amdgpu_synid_a:
10980c45e49SDmitry Preobrazhensky
11080c45e49SDmitry Preobrazhenskya
11180c45e49SDmitry Preobrazhensky-
11280c45e49SDmitry Preobrazhensky
11380c45e49SDmitry PreobrazhenskyAccumulator registers. There are 256 32-bit accumulator registers.
11480c45e49SDmitry Preobrazhensky
11580c45e49SDmitry PreobrazhenskyA sequence of *accumulator* registers may be used to operate with more than 32 bits of data.
11680c45e49SDmitry Preobrazhensky
117*9e3f86e2SDmitry PreobrazhenskyAssembler currently supports sequences of 1, 2, 3, 4, 5, 6, 7, 8, 16 and 32 *accumulator* registers.
11880c45e49SDmitry Preobrazhensky
11980c45e49SDmitry Preobrazhensky    =================================================== ========================================================= ====================================================================
12080c45e49SDmitry Preobrazhensky    Syntax                                              An Alternative Syntax (SP3)                               Description
12180c45e49SDmitry Preobrazhensky    =================================================== ========================================================= ====================================================================
12280c45e49SDmitry Preobrazhensky    **a**\<N>                                           **acc**\<N>                                               A single 32-bit *accumulator* register.
12380c45e49SDmitry Preobrazhensky
12480c45e49SDmitry Preobrazhensky                                                                                                                  *N* must be a decimal
12580c45e49SDmitry Preobrazhensky                                                                                                                  :ref:`integer number<amdgpu_synid_integer_number>`.
12680c45e49SDmitry Preobrazhensky    **a[**\ <N>\ **]**                                  **acc[**\ <N>\ **]**                                      A single 32-bit *accumulator* register.
12780c45e49SDmitry Preobrazhensky
12880c45e49SDmitry Preobrazhensky                                                                                                                  *N* may be specified as an
12980c45e49SDmitry Preobrazhensky                                                                                                                  :ref:`integer number<amdgpu_synid_integer_number>`
13080c45e49SDmitry Preobrazhensky                                                                                                                  or an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
13180c45e49SDmitry Preobrazhensky    **a[**\ <N>:<K>\ **]**                              **acc[**\ <N>:<K>\ **]**                                  A sequence of (\ *K-N+1*\ ) *accumulator* registers.
13280c45e49SDmitry Preobrazhensky
13380c45e49SDmitry Preobrazhensky                                                                                                                  *N* and *K* may be specified as
13480c45e49SDmitry Preobrazhensky                                                                                                                  :ref:`integer numbers<amdgpu_synid_integer_number>`
13580c45e49SDmitry Preobrazhensky                                                                                                                  or :ref:`absolute expressions<amdgpu_synid_absolute_expression>`.
13680c45e49SDmitry Preobrazhensky    **[a**\ <N>, \ **a**\ <N+1>, ... **a**\ <K>\ **]**  **[acc**\ <N>, \ **acc**\ <N+1>, ... **acc**\ <K>\ **]**  A sequence of (\ *K-N+1*\ ) *accumulator* registers.
13780c45e49SDmitry Preobrazhensky
13880c45e49SDmitry Preobrazhensky                                                                                                                  Register indices must be specified as decimal
13980c45e49SDmitry Preobrazhensky                                                                                                                  :ref:`integer numbers<amdgpu_synid_integer_number>`.
14080c45e49SDmitry Preobrazhensky    =================================================== ========================================================= ====================================================================
14180c45e49SDmitry Preobrazhensky
14280c45e49SDmitry PreobrazhenskyNote: *N* and *K* must satisfy the following conditions:
14380c45e49SDmitry Preobrazhensky
14480c45e49SDmitry Preobrazhensky* *N* <= *K*.
14580c45e49SDmitry Preobrazhensky* 0 <= *N* <= 255.
14680c45e49SDmitry Preobrazhensky* 0 <= *K* <= 255.
147*9e3f86e2SDmitry Preobrazhensky* *K-N+1* must be equal to 1, 2, 3, 4, 5, 6, 7, 8, 16 or 32.
148434b278cSDmitry Preobrazhensky
149434b278cSDmitry PreobrazhenskyGFX90A has an additional alignment requirement: pairs of *accumulator* registers must be even-aligned
150434b278cSDmitry Preobrazhensky(first register must be even).
15180c45e49SDmitry Preobrazhensky
15280c45e49SDmitry PreobrazhenskyExamples:
15380c45e49SDmitry Preobrazhensky
15480c45e49SDmitry Preobrazhensky.. parsed-literal::
15580c45e49SDmitry Preobrazhensky
15680c45e49SDmitry Preobrazhensky  a255
15780c45e49SDmitry Preobrazhensky  a[0]
15880c45e49SDmitry Preobrazhensky  a[0:1]
15980c45e49SDmitry Preobrazhensky  a[1:1]
16080c45e49SDmitry Preobrazhensky  a[0:3]
16180c45e49SDmitry Preobrazhensky  a[2*2]
16280c45e49SDmitry Preobrazhensky  a[1-1:2-1]
16380c45e49SDmitry Preobrazhensky  [a252]
16480c45e49SDmitry Preobrazhensky  [a252,a253,a254,a255]
16580c45e49SDmitry Preobrazhensky
16680c45e49SDmitry Preobrazhensky  acc0
16780c45e49SDmitry Preobrazhensky  acc[1]
16880c45e49SDmitry Preobrazhensky  [acc250]
16980c45e49SDmitry Preobrazhensky  [acc2,acc3]
17080c45e49SDmitry Preobrazhensky
17147eb6368SDmitry Preobrazhensky.. _amdgpu_synid_s:
17247eb6368SDmitry Preobrazhensky
17347eb6368SDmitry Preobrazhenskys
17447eb6368SDmitry Preobrazhensky-
17547eb6368SDmitry Preobrazhensky
17647eb6368SDmitry PreobrazhenskyScalar 32-bit registers. The number of available *scalar* registers depends on GPU:
17747eb6368SDmitry Preobrazhensky
17847eb6368SDmitry Preobrazhensky    ======= ============================
17947eb6368SDmitry Preobrazhensky    GPU     Number of *scalar* registers
18047eb6368SDmitry Preobrazhensky    ======= ============================
18147eb6368SDmitry Preobrazhensky    GFX7    104
18247eb6368SDmitry Preobrazhensky    GFX8    102
18347eb6368SDmitry Preobrazhensky    GFX9    102
184cef9d421SDmitry Preobrazhensky    GFX10   106
18547eb6368SDmitry Preobrazhensky    ======= ============================
18647eb6368SDmitry Preobrazhensky
18747eb6368SDmitry PreobrazhenskyA sequence of *scalar* registers may be used to operate with more than 32 bits of data.
188*9e3f86e2SDmitry PreobrazhenskyAssembler currently supports sequences of 1, 2, 3, 4, 5, 6, 7, 8, 16 and 32 *scalar* registers.
18947eb6368SDmitry Preobrazhensky
190434b278cSDmitry PreobrazhenskyPairs of *scalar* registers must be even-aligned (first register must be even).
19147eb6368SDmitry PreobrazhenskySequences of 4 and more *scalar* registers must be quad-aligned.
19247eb6368SDmitry Preobrazhensky
19347eb6368SDmitry Preobrazhensky    ======================================================== ====================================================================
19447eb6368SDmitry Preobrazhensky    Syntax                                                   Description
19547eb6368SDmitry Preobrazhensky    ======================================================== ====================================================================
19647eb6368SDmitry Preobrazhensky    **s**\ <N>                                               A single 32-bit *scalar* register.
19747eb6368SDmitry Preobrazhensky
198b9683d3cSDmitry Preobrazhensky                                                             *N* must be a decimal
199b9683d3cSDmitry Preobrazhensky                                                             :ref:`integer number<amdgpu_synid_integer_number>`.
200b9683d3cSDmitry Preobrazhensky
20147eb6368SDmitry Preobrazhensky    **s[**\ <N>\ **]**                                       A single 32-bit *scalar* register.
20247eb6368SDmitry Preobrazhensky
20347eb6368SDmitry Preobrazhensky                                                             *N* may be specified as an
20447eb6368SDmitry Preobrazhensky                                                             :ref:`integer number<amdgpu_synid_integer_number>`
20547eb6368SDmitry Preobrazhensky                                                             or an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
20647eb6368SDmitry Preobrazhensky    **s[**\ <N>:<K>\ **]**                                   A sequence of (\ *K-N+1*\ ) *scalar* registers.
20747eb6368SDmitry Preobrazhensky
20847eb6368SDmitry Preobrazhensky                                                             *N* and *K* may be specified as
20947eb6368SDmitry Preobrazhensky                                                             :ref:`integer numbers<amdgpu_synid_integer_number>`
21047eb6368SDmitry Preobrazhensky                                                             or :ref:`absolute expressions<amdgpu_synid_absolute_expression>`.
211b9683d3cSDmitry Preobrazhensky
21247eb6368SDmitry Preobrazhensky    **[s**\ <N>, \ **s**\ <N+1>, ... **s**\ <K>\ **]**       A sequence of (\ *K-N+1*\ ) *scalar* registers.
21347eb6368SDmitry Preobrazhensky
214b9683d3cSDmitry Preobrazhensky                                                             Register indices must be specified as decimal
215b9683d3cSDmitry Preobrazhensky                                                             :ref:`integer numbers<amdgpu_synid_integer_number>`.
21647eb6368SDmitry Preobrazhensky    ======================================================== ====================================================================
21747eb6368SDmitry Preobrazhensky
218b9683d3cSDmitry PreobrazhenskyNote: *N* and *K* must satisfy the following conditions:
21947eb6368SDmitry Preobrazhensky
22047eb6368SDmitry Preobrazhensky* *N* must be properly aligned based on sequence size.
22147eb6368SDmitry Preobrazhensky* *N* <= *K*.
22247eb6368SDmitry Preobrazhensky* 0 <= *N* < *SMAX*\ , where *SMAX* is the number of available *scalar* registers.
22347eb6368SDmitry Preobrazhensky* 0 <= *K* < *SMAX*\ , where *SMAX* is the number of available *scalar* registers.
224*9e3f86e2SDmitry Preobrazhensky* *K-N+1* must be equal to 1, 2, 3, 4, 5, 6, 7, 8, 16 or 32.
22547eb6368SDmitry Preobrazhensky
22647eb6368SDmitry PreobrazhenskyExamples:
22747eb6368SDmitry Preobrazhensky
2281fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
22947eb6368SDmitry Preobrazhensky
23047eb6368SDmitry Preobrazhensky  s0
23147eb6368SDmitry Preobrazhensky  s[0]
23247eb6368SDmitry Preobrazhensky  s[0:1]
23347eb6368SDmitry Preobrazhensky  s[1:1]
23447eb6368SDmitry Preobrazhensky  s[0:3]
23547eb6368SDmitry Preobrazhensky  s[2*2]
23647eb6368SDmitry Preobrazhensky  s[1-1:2-1]
23747eb6368SDmitry Preobrazhensky  [s4]
23847eb6368SDmitry Preobrazhensky  [s4,s5,s6,s7]
23947eb6368SDmitry Preobrazhensky
24047eb6368SDmitry PreobrazhenskyExamples of *scalar* registers with an invalid alignment:
24147eb6368SDmitry Preobrazhensky
2421fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
24347eb6368SDmitry Preobrazhensky
24447eb6368SDmitry Preobrazhensky  s[1:2]
24547eb6368SDmitry Preobrazhensky  s[2:5]
24647eb6368SDmitry Preobrazhensky
24747eb6368SDmitry Preobrazhensky.. _amdgpu_synid_trap:
24847eb6368SDmitry Preobrazhensky
24947eb6368SDmitry Preobrazhenskytrap
25047eb6368SDmitry Preobrazhensky----
25147eb6368SDmitry Preobrazhensky
25247eb6368SDmitry PreobrazhenskyA set of trap handler registers:
25347eb6368SDmitry Preobrazhensky
25447eb6368SDmitry Preobrazhensky* :ref:`ttmp<amdgpu_synid_ttmp>`
25547eb6368SDmitry Preobrazhensky* :ref:`tba<amdgpu_synid_tba>`
25647eb6368SDmitry Preobrazhensky* :ref:`tma<amdgpu_synid_tma>`
25747eb6368SDmitry Preobrazhensky
25847eb6368SDmitry Preobrazhensky.. _amdgpu_synid_ttmp:
25947eb6368SDmitry Preobrazhensky
26047eb6368SDmitry Preobrazhenskyttmp
26147eb6368SDmitry Preobrazhensky----
26247eb6368SDmitry Preobrazhensky
26347eb6368SDmitry PreobrazhenskyTrap handler temporary scalar registers, 32-bits wide.
26447eb6368SDmitry PreobrazhenskyThe number of available *ttmp* registers depends on GPU:
26547eb6368SDmitry Preobrazhensky
26647eb6368SDmitry Preobrazhensky    ======= ===========================
26747eb6368SDmitry Preobrazhensky    GPU     Number of *ttmp* registers
26847eb6368SDmitry Preobrazhensky    ======= ===========================
26947eb6368SDmitry Preobrazhensky    GFX7    12
27047eb6368SDmitry Preobrazhensky    GFX8    12
27147eb6368SDmitry Preobrazhensky    GFX9    16
272cef9d421SDmitry Preobrazhensky    GFX10   16
27347eb6368SDmitry Preobrazhensky    ======= ===========================
27447eb6368SDmitry Preobrazhensky
27547eb6368SDmitry PreobrazhenskyA sequence of *ttmp* registers may be used to operate with more than 32 bits of data.
276*9e3f86e2SDmitry PreobrazhenskyAssembler currently supports sequences of 1, 2, 3, 4, 5, 6, 7, 8 and 16 *ttmp* registers.
27747eb6368SDmitry Preobrazhensky
278434b278cSDmitry PreobrazhenskyPairs of *ttmp* registers must be even-aligned (first register must be even).
27947eb6368SDmitry PreobrazhenskySequences of 4 and more *ttmp* registers must be quad-aligned.
28047eb6368SDmitry Preobrazhensky
28147eb6368SDmitry Preobrazhensky    ============================================================= ====================================================================
28247eb6368SDmitry Preobrazhensky    Syntax                                                        Description
28347eb6368SDmitry Preobrazhensky    ============================================================= ====================================================================
28447eb6368SDmitry Preobrazhensky    **ttmp**\ <N>                                                 A single 32-bit *ttmp* register.
28547eb6368SDmitry Preobrazhensky
286b9683d3cSDmitry Preobrazhensky                                                                  *N* must be a decimal
287b9683d3cSDmitry Preobrazhensky                                                                  :ref:`integer number<amdgpu_synid_integer_number>`.
28847eb6368SDmitry Preobrazhensky    **ttmp[**\ <N>\ **]**                                         A single 32-bit *ttmp* register.
28947eb6368SDmitry Preobrazhensky
29047eb6368SDmitry Preobrazhensky                                                                  *N* may be specified as an
29147eb6368SDmitry Preobrazhensky                                                                  :ref:`integer number<amdgpu_synid_integer_number>`
29247eb6368SDmitry Preobrazhensky                                                                  or an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
29347eb6368SDmitry Preobrazhensky    **ttmp[**\ <N>:<K>\ **]**                                     A sequence of (\ *K-N+1*\ ) *ttmp* registers.
29447eb6368SDmitry Preobrazhensky
29547eb6368SDmitry Preobrazhensky                                                                  *N* and *K* may be specified as
29647eb6368SDmitry Preobrazhensky                                                                  :ref:`integer numbers<amdgpu_synid_integer_number>`
29747eb6368SDmitry Preobrazhensky                                                                  or :ref:`absolute expressions<amdgpu_synid_absolute_expression>`.
29847eb6368SDmitry Preobrazhensky    **[ttmp**\ <N>, \ **ttmp**\ <N+1>, ... **ttmp**\ <K>\ **]**   A sequence of (\ *K-N+1*\ ) *ttmp* registers.
29947eb6368SDmitry Preobrazhensky
300b9683d3cSDmitry Preobrazhensky                                                                  Register indices must be specified as decimal
301b9683d3cSDmitry Preobrazhensky                                                                  :ref:`integer numbers<amdgpu_synid_integer_number>`.
30247eb6368SDmitry Preobrazhensky    ============================================================= ====================================================================
30347eb6368SDmitry Preobrazhensky
304b9683d3cSDmitry PreobrazhenskyNote: *N* and *K* must satisfy the following conditions:
30547eb6368SDmitry Preobrazhensky
30647eb6368SDmitry Preobrazhensky* *N* must be properly aligned based on sequence size.
30747eb6368SDmitry Preobrazhensky* *N* <= *K*.
30847eb6368SDmitry Preobrazhensky* 0 <= *N* < *TMAX*, where *TMAX* is the number of available *ttmp* registers.
30947eb6368SDmitry Preobrazhensky* 0 <= *K* < *TMAX*, where *TMAX* is the number of available *ttmp* registers.
310*9e3f86e2SDmitry Preobrazhensky* *K-N+1* must be equal to 1, 2, 3, 4, 5, 6, 7, 8 or 16.
31147eb6368SDmitry Preobrazhensky
31247eb6368SDmitry PreobrazhenskyExamples:
31347eb6368SDmitry Preobrazhensky
3141fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
31547eb6368SDmitry Preobrazhensky
31647eb6368SDmitry Preobrazhensky  ttmp0
31747eb6368SDmitry Preobrazhensky  ttmp[0]
31847eb6368SDmitry Preobrazhensky  ttmp[0:1]
31947eb6368SDmitry Preobrazhensky  ttmp[1:1]
32047eb6368SDmitry Preobrazhensky  ttmp[0:3]
32147eb6368SDmitry Preobrazhensky  ttmp[2*2]
32247eb6368SDmitry Preobrazhensky  ttmp[1-1:2-1]
32347eb6368SDmitry Preobrazhensky  [ttmp4]
32447eb6368SDmitry Preobrazhensky  [ttmp4,ttmp5,ttmp6,ttmp7]
32547eb6368SDmitry Preobrazhensky
32647eb6368SDmitry PreobrazhenskyExamples of *ttmp* registers with an invalid alignment:
32747eb6368SDmitry Preobrazhensky
3281fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
32947eb6368SDmitry Preobrazhensky
33047eb6368SDmitry Preobrazhensky  ttmp[1:2]
33147eb6368SDmitry Preobrazhensky  ttmp[2:5]
33247eb6368SDmitry Preobrazhensky
33347eb6368SDmitry Preobrazhensky.. _amdgpu_synid_tba:
33447eb6368SDmitry Preobrazhensky
33547eb6368SDmitry Preobrazhenskytba
33647eb6368SDmitry Preobrazhensky---
33747eb6368SDmitry Preobrazhensky
33847eb6368SDmitry PreobrazhenskyTrap base address, 64-bits wide. Holds the pointer to the current trap handler program.
33947eb6368SDmitry Preobrazhensky
34047eb6368SDmitry Preobrazhensky    ================== ======================================================================= =============
34147eb6368SDmitry Preobrazhensky    Syntax             Description                                                             Availability
34247eb6368SDmitry Preobrazhensky    ================== ======================================================================= =============
34347eb6368SDmitry Preobrazhensky    tba                64-bit *trap base address* register.                                    GFX7, GFX8
344b9683d3cSDmitry Preobrazhensky    [tba]              64-bit *trap base address* register (an SP3 syntax).                    GFX7, GFX8
345b9683d3cSDmitry Preobrazhensky    [tba_lo,tba_hi]    64-bit *trap base address* register (an SP3 syntax).                    GFX7, GFX8
34647eb6368SDmitry Preobrazhensky    ================== ======================================================================= =============
34747eb6368SDmitry Preobrazhensky
34847eb6368SDmitry PreobrazhenskyHigh and low 32 bits of *trap base address* may be accessed as separate registers:
34947eb6368SDmitry Preobrazhensky
35047eb6368SDmitry Preobrazhensky    ================== ======================================================================= =============
35147eb6368SDmitry Preobrazhensky    Syntax             Description                                                             Availability
35247eb6368SDmitry Preobrazhensky    ================== ======================================================================= =============
35347eb6368SDmitry Preobrazhensky    tba_lo             Low 32 bits of *trap base address* register.                            GFX7, GFX8
35447eb6368SDmitry Preobrazhensky    tba_hi             High 32 bits of *trap base address* register.                           GFX7, GFX8
355b9683d3cSDmitry Preobrazhensky    [tba_lo]           Low 32 bits of *trap base address* register (an SP3 syntax).            GFX7, GFX8
356b9683d3cSDmitry Preobrazhensky    [tba_hi]           High 32 bits of *trap base address* register (an SP3 syntax).           GFX7, GFX8
35747eb6368SDmitry Preobrazhensky    ================== ======================================================================= =============
35847eb6368SDmitry Preobrazhensky
359cef9d421SDmitry PreobrazhenskyNote that *tba*, *tba_lo* and *tba_hi* are not accessible as assembler registers in GFX9 and GFX10,
36047eb6368SDmitry Preobrazhenskybut *tba* is readable/writable with the help of *s_get_reg* and *s_set_reg* instructions.
36147eb6368SDmitry Preobrazhensky
36247eb6368SDmitry Preobrazhensky.. _amdgpu_synid_tma:
36347eb6368SDmitry Preobrazhensky
36447eb6368SDmitry Preobrazhenskytma
36547eb6368SDmitry Preobrazhensky---
36647eb6368SDmitry Preobrazhensky
36747eb6368SDmitry PreobrazhenskyTrap memory address, 64-bits wide.
36847eb6368SDmitry Preobrazhensky
36947eb6368SDmitry Preobrazhensky    ================= ======================================================================= ==================
37047eb6368SDmitry Preobrazhensky    Syntax            Description                                                             Availability
37147eb6368SDmitry Preobrazhensky    ================= ======================================================================= ==================
37247eb6368SDmitry Preobrazhensky    tma               64-bit *trap memory address* register.                                  GFX7, GFX8
373b9683d3cSDmitry Preobrazhensky    [tma]             64-bit *trap memory address* register (an SP3 syntax).                  GFX7, GFX8
374b9683d3cSDmitry Preobrazhensky    [tma_lo,tma_hi]   64-bit *trap memory address* register (an SP3 syntax).                  GFX7, GFX8
37547eb6368SDmitry Preobrazhensky    ================= ======================================================================= ==================
37647eb6368SDmitry Preobrazhensky
37747eb6368SDmitry PreobrazhenskyHigh and low 32 bits of *trap memory address* may be accessed as separate registers:
37847eb6368SDmitry Preobrazhensky
37947eb6368SDmitry Preobrazhensky    ================= ======================================================================= ==================
38047eb6368SDmitry Preobrazhensky    Syntax            Description                                                             Availability
38147eb6368SDmitry Preobrazhensky    ================= ======================================================================= ==================
38247eb6368SDmitry Preobrazhensky    tma_lo            Low 32 bits of *trap memory address* register.                          GFX7, GFX8
38347eb6368SDmitry Preobrazhensky    tma_hi            High 32 bits of *trap memory address* register.                         GFX7, GFX8
384b9683d3cSDmitry Preobrazhensky    [tma_lo]          Low 32 bits of *trap memory address* register (an SP3 syntax).          GFX7, GFX8
385b9683d3cSDmitry Preobrazhensky    [tma_hi]          High 32 bits of *trap memory address* register (an SP3 syntax).         GFX7, GFX8
38647eb6368SDmitry Preobrazhensky    ================= ======================================================================= ==================
38747eb6368SDmitry Preobrazhensky
388cef9d421SDmitry PreobrazhenskyNote that *tma*, *tma_lo* and *tma_hi* are not accessible as assembler registers in GFX9 and GFX10,
38947eb6368SDmitry Preobrazhenskybut *tma* is readable/writable with the help of *s_get_reg* and *s_set_reg* instructions.
39047eb6368SDmitry Preobrazhensky
39147eb6368SDmitry Preobrazhensky.. _amdgpu_synid_flat_scratch:
39247eb6368SDmitry Preobrazhensky
39347eb6368SDmitry Preobrazhenskyflat_scratch
394c6d31e6fSDmitry Preobrazhensky------------
395c6d31e6fSDmitry Preobrazhensky
39647eb6368SDmitry PreobrazhenskyFlat scratch address, 64-bits wide. Holds the base address of scratch memory.
397c6d31e6fSDmitry Preobrazhensky
39847eb6368SDmitry Preobrazhensky    ================================== ================================================================
399c6d31e6fSDmitry Preobrazhensky    Syntax                             Description
40047eb6368SDmitry Preobrazhensky    ================================== ================================================================
40147eb6368SDmitry Preobrazhensky    flat_scratch                       64-bit *flat scratch* address register.
402b9683d3cSDmitry Preobrazhensky    [flat_scratch]                     64-bit *flat scratch* address register (an SP3 syntax).
403b9683d3cSDmitry Preobrazhensky    [flat_scratch_lo,flat_scratch_hi]  64-bit *flat scratch* address register (an SP3 syntax).
40447eb6368SDmitry Preobrazhensky    ================================== ================================================================
405c6d31e6fSDmitry Preobrazhensky
40647eb6368SDmitry PreobrazhenskyHigh and low 32 bits of *flat scratch* address may be accessed as separate registers:
407c6d31e6fSDmitry Preobrazhensky
40847eb6368SDmitry Preobrazhensky    ========================= =========================================================================
409c6d31e6fSDmitry Preobrazhensky    Syntax                    Description
41047eb6368SDmitry Preobrazhensky    ========================= =========================================================================
41147eb6368SDmitry Preobrazhensky    flat_scratch_lo           Low 32 bits of *flat scratch* address register.
41247eb6368SDmitry Preobrazhensky    flat_scratch_hi           High 32 bits of *flat scratch* address register.
413b9683d3cSDmitry Preobrazhensky    [flat_scratch_lo]         Low 32 bits of *flat scratch* address register (an SP3 syntax).
414b9683d3cSDmitry Preobrazhensky    [flat_scratch_hi]         High 32 bits of *flat scratch* address register (an SP3 syntax).
41547eb6368SDmitry Preobrazhensky    ========================= =========================================================================
416c6d31e6fSDmitry Preobrazhensky
4173f7985e6SDmitry PreobrazhenskyNote that *flat_scratch*, *flat_scratch_lo* and *flat_scratch_hi* are not accessible as assembler
4183f7985e6SDmitry Preobrazhenskyregisters in GFX10, but *flat_scratch* is readable/writable with the help of
4193f7985e6SDmitry Preobrazhensky*s_get_reg* and *s_set_reg* instructions.
4203f7985e6SDmitry Preobrazhensky
42147eb6368SDmitry Preobrazhensky.. _amdgpu_synid_xnack:
422434b278cSDmitry Preobrazhensky.. _amdgpu_synid_xnack_mask:
423c6d31e6fSDmitry Preobrazhensky
424434b278cSDmitry Preobrazhenskyxnack_mask
425434b278cSDmitry Preobrazhensky----------
426c6d31e6fSDmitry Preobrazhensky
42747eb6368SDmitry PreobrazhenskyXnack mask, 64-bits wide. Holds a 64-bit mask of which threads
42847eb6368SDmitry Preobrazhenskyreceived an *XNACK* due to a vector memory operation.
429c6d31e6fSDmitry Preobrazhensky
430cef9d421SDmitry Preobrazhensky.. WARNING:: GFX7 does not support *xnack* feature. For availability of this feature in other GPUs, refer :ref:`this table<amdgpu-processors>`.
431c6d31e6fSDmitry Preobrazhensky
43247eb6368SDmitry Preobrazhensky\
43347eb6368SDmitry Preobrazhensky
43447eb6368SDmitry Preobrazhensky    ============================== =====================================================
435c6d31e6fSDmitry Preobrazhensky    Syntax                         Description
43647eb6368SDmitry Preobrazhensky    ============================== =====================================================
43747eb6368SDmitry Preobrazhensky    xnack_mask                     64-bit *xnack mask* register.
438b9683d3cSDmitry Preobrazhensky    [xnack_mask]                   64-bit *xnack mask* register (an SP3 syntax).
439b9683d3cSDmitry Preobrazhensky    [xnack_mask_lo,xnack_mask_hi]  64-bit *xnack mask* register (an SP3 syntax).
44047eb6368SDmitry Preobrazhensky    ============================== =====================================================
441c6d31e6fSDmitry Preobrazhensky
44247eb6368SDmitry PreobrazhenskyHigh and low 32 bits of *xnack mask* may be accessed as separate registers:
443c6d31e6fSDmitry Preobrazhensky
44447eb6368SDmitry Preobrazhensky    ===================== ==============================================================
445c6d31e6fSDmitry Preobrazhensky    Syntax                Description
44647eb6368SDmitry Preobrazhensky    ===================== ==============================================================
44747eb6368SDmitry Preobrazhensky    xnack_mask_lo         Low 32 bits of *xnack mask* register.
44847eb6368SDmitry Preobrazhensky    xnack_mask_hi         High 32 bits of *xnack mask* register.
449b9683d3cSDmitry Preobrazhensky    [xnack_mask_lo]       Low 32 bits of *xnack mask* register (an SP3 syntax).
450b9683d3cSDmitry Preobrazhensky    [xnack_mask_hi]       High 32 bits of *xnack mask* register (an SP3 syntax).
45147eb6368SDmitry Preobrazhensky    ===================== ==============================================================
452c6d31e6fSDmitry Preobrazhensky
4533f7985e6SDmitry PreobrazhenskyNote that *xnack_mask*, *xnack_mask_lo* and *xnack_mask_hi* are not accessible as assembler
4543f7985e6SDmitry Preobrazhenskyregisters in GFX10, but *xnack_mask* is readable/writable with the help of
4553f7985e6SDmitry Preobrazhensky*s_get_reg* and *s_set_reg* instructions.
4563f7985e6SDmitry Preobrazhensky
45747eb6368SDmitry Preobrazhensky.. _amdgpu_synid_vcc:
458cef9d421SDmitry Preobrazhensky.. _amdgpu_synid_vcc_lo:
459c6d31e6fSDmitry Preobrazhensky
46047eb6368SDmitry Preobrazhenskyvcc
46147eb6368SDmitry Preobrazhensky---
462c6d31e6fSDmitry Preobrazhensky
46347eb6368SDmitry PreobrazhenskyVector condition code, 64-bits wide. A bit mask with one bit per thread;
46447eb6368SDmitry Preobrazhenskyit holds the result of a vector compare operation.
465c6d31e6fSDmitry Preobrazhensky
466cef9d421SDmitry PreobrazhenskyNote that GFX10 H/W does not use high 32 bits of *vcc* in *wave32* mode.
467cef9d421SDmitry Preobrazhensky
46847eb6368SDmitry Preobrazhensky    ================ =========================================================================
469c6d31e6fSDmitry Preobrazhensky    Syntax           Description
47047eb6368SDmitry Preobrazhensky    ================ =========================================================================
47147eb6368SDmitry Preobrazhensky    vcc              64-bit *vector condition code* register.
472b9683d3cSDmitry Preobrazhensky    [vcc]            64-bit *vector condition code* register (an SP3 syntax).
473b9683d3cSDmitry Preobrazhensky    [vcc_lo,vcc_hi]  64-bit *vector condition code* register (an SP3 syntax).
47447eb6368SDmitry Preobrazhensky    ================ =========================================================================
475c6d31e6fSDmitry Preobrazhensky
47647eb6368SDmitry PreobrazhenskyHigh and low 32 bits of *vector condition code* may be accessed as separate registers:
477c6d31e6fSDmitry Preobrazhensky
47847eb6368SDmitry Preobrazhensky    ================ =========================================================================
479c6d31e6fSDmitry Preobrazhensky    Syntax           Description
48047eb6368SDmitry Preobrazhensky    ================ =========================================================================
48147eb6368SDmitry Preobrazhensky    vcc_lo           Low 32 bits of *vector condition code* register.
48247eb6368SDmitry Preobrazhensky    vcc_hi           High 32 bits of *vector condition code* register.
483b9683d3cSDmitry Preobrazhensky    [vcc_lo]         Low 32 bits of *vector condition code* register (an SP3 syntax).
484b9683d3cSDmitry Preobrazhensky    [vcc_hi]         High 32 bits of *vector condition code* register (an SP3 syntax).
48547eb6368SDmitry Preobrazhensky    ================ =========================================================================
486c6d31e6fSDmitry Preobrazhensky
48747eb6368SDmitry Preobrazhensky.. _amdgpu_synid_m0:
488c6d31e6fSDmitry Preobrazhensky
48947eb6368SDmitry Preobrazhenskym0
49047eb6368SDmitry Preobrazhensky--
491c6d31e6fSDmitry Preobrazhensky
49247eb6368SDmitry PreobrazhenskyA 32-bit memory register. It has various uses,
49347eb6368SDmitry Preobrazhenskyincluding register indexing and bounds checking.
494c6d31e6fSDmitry Preobrazhensky
49547eb6368SDmitry Preobrazhensky    =========== ===================================================
496c6d31e6fSDmitry Preobrazhensky    Syntax      Description
49747eb6368SDmitry Preobrazhensky    =========== ===================================================
49847eb6368SDmitry Preobrazhensky    m0          A 32-bit *memory* register.
499b9683d3cSDmitry Preobrazhensky    [m0]        A 32-bit *memory* register (an SP3 syntax).
50047eb6368SDmitry Preobrazhensky    =========== ===================================================
501c6d31e6fSDmitry Preobrazhensky
50247eb6368SDmitry Preobrazhensky.. _amdgpu_synid_exec:
503c6d31e6fSDmitry Preobrazhensky
50447eb6368SDmitry Preobrazhenskyexec
50547eb6368SDmitry Preobrazhensky----
506c6d31e6fSDmitry Preobrazhensky
50747eb6368SDmitry PreobrazhenskyExecute mask, 64-bits wide. A bit mask with one bit per thread,
50847eb6368SDmitry Preobrazhenskywhich is applied to vector instructions and controls which threads execute
50947eb6368SDmitry Preobrazhenskyand which ignore the instruction.
510c6d31e6fSDmitry Preobrazhensky
511cef9d421SDmitry PreobrazhenskyNote that GFX10 H/W does not use high 32 bits of *exec* in *wave32* mode.
512cef9d421SDmitry Preobrazhensky
51347eb6368SDmitry Preobrazhensky    ===================== =================================================================
514c6d31e6fSDmitry Preobrazhensky    Syntax                Description
51547eb6368SDmitry Preobrazhensky    ===================== =================================================================
51647eb6368SDmitry Preobrazhensky    exec                  64-bit *execute mask* register.
517b9683d3cSDmitry Preobrazhensky    [exec]                64-bit *execute mask* register (an SP3 syntax).
518b9683d3cSDmitry Preobrazhensky    [exec_lo,exec_hi]     64-bit *execute mask* register (an SP3 syntax).
51947eb6368SDmitry Preobrazhensky    ===================== =================================================================
520c6d31e6fSDmitry Preobrazhensky
52147eb6368SDmitry PreobrazhenskyHigh and low 32 bits of *execute mask* may be accessed as separate registers:
522c6d31e6fSDmitry Preobrazhensky
52347eb6368SDmitry Preobrazhensky    ===================== =================================================================
524c6d31e6fSDmitry Preobrazhensky    Syntax                Description
52547eb6368SDmitry Preobrazhensky    ===================== =================================================================
52647eb6368SDmitry Preobrazhensky    exec_lo               Low 32 bits of *execute mask* register.
52747eb6368SDmitry Preobrazhensky    exec_hi               High 32 bits of *execute mask* register.
528b9683d3cSDmitry Preobrazhensky    [exec_lo]             Low 32 bits of *execute mask* register (an SP3 syntax).
529b9683d3cSDmitry Preobrazhensky    [exec_hi]             High 32 bits of *execute mask* register (an SP3 syntax).
53047eb6368SDmitry Preobrazhensky    ===================== =================================================================
531c6d31e6fSDmitry Preobrazhensky
53247eb6368SDmitry Preobrazhensky.. _amdgpu_synid_vccz:
533c6d31e6fSDmitry Preobrazhensky
53447eb6368SDmitry Preobrazhenskyvccz
53547eb6368SDmitry Preobrazhensky----
536c6d31e6fSDmitry Preobrazhensky
537cef9d421SDmitry PreobrazhenskyA single bit flag indicating that the :ref:`vcc<amdgpu_synid_vcc>` is all zeros.
538c6d31e6fSDmitry Preobrazhensky
539b9683d3cSDmitry PreobrazhenskyNote: when GFX10 operates in *wave32* mode, this register reflects state of :ref:`vcc_lo<amdgpu_synid_vcc_lo>`.
540c6d31e6fSDmitry Preobrazhensky
54147eb6368SDmitry Preobrazhensky.. _amdgpu_synid_execz:
542c6d31e6fSDmitry Preobrazhensky
54347eb6368SDmitry Preobrazhenskyexecz
54447eb6368SDmitry Preobrazhensky-----
545c6d31e6fSDmitry Preobrazhensky
54647eb6368SDmitry PreobrazhenskyA single bit flag indicating that the :ref:`exec<amdgpu_synid_exec>` is all zeros.
547c6d31e6fSDmitry Preobrazhensky
548b9683d3cSDmitry PreobrazhenskyNote: when GFX10 operates in *wave32* mode, this register reflects state of :ref:`exec_lo<amdgpu_synid_exec>`.
549c6d31e6fSDmitry Preobrazhensky
55047eb6368SDmitry Preobrazhensky.. _amdgpu_synid_scc:
551c6d31e6fSDmitry Preobrazhensky
55247eb6368SDmitry Preobrazhenskyscc
55347eb6368SDmitry Preobrazhensky---
554c6d31e6fSDmitry Preobrazhensky
55547eb6368SDmitry PreobrazhenskyA single bit flag indicating the result of a scalar compare operation.
556c6d31e6fSDmitry Preobrazhensky
557cef9d421SDmitry Preobrazhensky.. _amdgpu_synid_lds_direct:
558c6d31e6fSDmitry Preobrazhensky
55947eb6368SDmitry Preobrazhenskylds_direct
56047eb6368SDmitry Preobrazhensky----------
56147eb6368SDmitry Preobrazhensky
56247eb6368SDmitry PreobrazhenskyA special operand which supplies a 32-bit value
56347eb6368SDmitry Preobrazhenskyfetched from *LDS* memory using :ref:`m0<amdgpu_synid_m0>` as an address.
56447eb6368SDmitry Preobrazhensky
565cef9d421SDmitry Preobrazhensky.. _amdgpu_synid_null:
566cef9d421SDmitry Preobrazhensky
567cef9d421SDmitry Preobrazhenskynull
568cef9d421SDmitry Preobrazhensky----
569cef9d421SDmitry Preobrazhensky
570cef9d421SDmitry PreobrazhenskyThis is a special operand which may be used as a source or a destination.
571cef9d421SDmitry Preobrazhensky
572cef9d421SDmitry PreobrazhenskyWhen used as a destination, the result of the operation is discarded.
573cef9d421SDmitry Preobrazhensky
574cef9d421SDmitry PreobrazhenskyWhen used as a source, it supplies zero value.
575cef9d421SDmitry Preobrazhensky
576cef9d421SDmitry PreobrazhenskyGFX10 only.
577cef9d421SDmitry Preobrazhensky
578cef9d421SDmitry Preobrazhensky.. WARNING:: Due to a H/W bug, this operand cannot be used with VALU instructions in first generation of GFX10.
57947eb6368SDmitry Preobrazhensky
58047eb6368SDmitry Preobrazhensky.. _amdgpu_synid_constant:
58147eb6368SDmitry Preobrazhensky
582b9683d3cSDmitry Preobrazhenskyinline constant
583b9683d3cSDmitry Preobrazhensky---------------
58447eb6368SDmitry Preobrazhensky
585b9683d3cSDmitry PreobrazhenskyAn *inline constant* is an integer or a floating-point value encoded as a part of an instruction.
586b9683d3cSDmitry PreobrazhenskyCompare *inline constants* with :ref:`literals<amdgpu_synid_literal>`.
587b9683d3cSDmitry Preobrazhensky
588b9683d3cSDmitry PreobrazhenskyInline constants include:
58947eb6368SDmitry Preobrazhensky
59047eb6368SDmitry Preobrazhensky* :ref:`iconst<amdgpu_synid_iconst>`
59147eb6368SDmitry Preobrazhensky* :ref:`fconst<amdgpu_synid_fconst>`
592cef9d421SDmitry Preobrazhensky* :ref:`ival<amdgpu_synid_ival>`
59347eb6368SDmitry Preobrazhensky
59447eb6368SDmitry PreobrazhenskyIf a number may be encoded as either
59547eb6368SDmitry Preobrazhenskya :ref:`literal<amdgpu_synid_literal>` or
596cef9d421SDmitry Preobrazhenskya :ref:`constant<amdgpu_synid_constant>`,
59747eb6368SDmitry Preobrazhenskyassembler selects the latter encoding as more efficient.
59847eb6368SDmitry Preobrazhensky
59947eb6368SDmitry Preobrazhensky.. _amdgpu_synid_iconst:
60047eb6368SDmitry Preobrazhensky
60147eb6368SDmitry Preobrazhenskyiconst
602cef9d421SDmitry Preobrazhensky~~~~~~
60347eb6368SDmitry Preobrazhensky
604b9683d3cSDmitry PreobrazhenskyAn :ref:`integer number<amdgpu_synid_integer_number>` or
605b9683d3cSDmitry Preobrazhenskyan :ref:`absolute expression<amdgpu_synid_absolute_expression>`
60647eb6368SDmitry Preobrazhenskyencoded as an *inline constant*.
60747eb6368SDmitry Preobrazhensky
60847eb6368SDmitry PreobrazhenskyOnly a small fraction of integer numbers may be encoded as *inline constants*.
60947eb6368SDmitry PreobrazhenskyThey are enumerated in the table below.
61047eb6368SDmitry PreobrazhenskyOther integer numbers have to be encoded as :ref:`literals<amdgpu_synid_literal>`.
61147eb6368SDmitry Preobrazhensky
61247eb6368SDmitry Preobrazhensky    ================================== ====================================
61347eb6368SDmitry Preobrazhensky    Value                              Note
61447eb6368SDmitry Preobrazhensky    ================================== ====================================
61547eb6368SDmitry Preobrazhensky    {0..64}                            Positive integer inline constants.
61647eb6368SDmitry Preobrazhensky    {-16..-1}                          Negative integer inline constants.
61747eb6368SDmitry Preobrazhensky    ================================== ====================================
61847eb6368SDmitry Preobrazhensky
61947eb6368SDmitry Preobrazhensky.. WARNING:: GFX7 does not support inline constants for *f16* operands.
62047eb6368SDmitry Preobrazhensky
62147eb6368SDmitry Preobrazhensky.. _amdgpu_synid_fconst:
62247eb6368SDmitry Preobrazhensky
62347eb6368SDmitry Preobrazhenskyfconst
624cef9d421SDmitry Preobrazhensky~~~~~~
62547eb6368SDmitry Preobrazhensky
62647eb6368SDmitry PreobrazhenskyA :ref:`floating-point number<amdgpu_synid_floating-point_number>`
62747eb6368SDmitry Preobrazhenskyencoded as an *inline constant*.
62847eb6368SDmitry Preobrazhensky
62947eb6368SDmitry PreobrazhenskyOnly a small fraction of floating-point numbers may be encoded as *inline constants*.
63047eb6368SDmitry PreobrazhenskyThey are enumerated in the table below.
63147eb6368SDmitry PreobrazhenskyOther floating-point numbers have to be encoded as :ref:`literals<amdgpu_synid_literal>`.
63247eb6368SDmitry Preobrazhensky
6336bc26aaaSDmitry Preobrazhensky    ===================== ===================================================== ==================
63447eb6368SDmitry Preobrazhensky    Value                 Note                                                  Availability
6356bc26aaaSDmitry Preobrazhensky    ===================== ===================================================== ==================
63647eb6368SDmitry Preobrazhensky    0.0                   The same as integer constant 0.                       All GPUs
63747eb6368SDmitry Preobrazhensky    0.5                   Floating-point constant 0.5                           All GPUs
63847eb6368SDmitry Preobrazhensky    1.0                   Floating-point constant 1.0                           All GPUs
63947eb6368SDmitry Preobrazhensky    2.0                   Floating-point constant 2.0                           All GPUs
64047eb6368SDmitry Preobrazhensky    4.0                   Floating-point constant 4.0                           All GPUs
64147eb6368SDmitry Preobrazhensky    -0.5                  Floating-point constant -0.5                          All GPUs
64247eb6368SDmitry Preobrazhensky    -1.0                  Floating-point constant -1.0                          All GPUs
64347eb6368SDmitry Preobrazhensky    -2.0                  Floating-point constant -2.0                          All GPUs
64447eb6368SDmitry Preobrazhensky    -4.0                  Floating-point constant -4.0                          All GPUs
645cef9d421SDmitry Preobrazhensky    0.1592                1.0/(2.0*pi). Use only for 16-bit operands.           GFX8, GFX9, GFX10
646cef9d421SDmitry Preobrazhensky    0.15915494            1.0/(2.0*pi). Use only for 16- and 32-bit operands.   GFX8, GFX9, GFX10
647cef9d421SDmitry Preobrazhensky    0.15915494309189532   1.0/(2.0*pi).                                         GFX8, GFX9, GFX10
6486bc26aaaSDmitry Preobrazhensky    ===================== ===================================================== ==================
64947eb6368SDmitry Preobrazhensky
6503f7985e6SDmitry Preobrazhensky.. WARNING:: Floating-point inline constants cannot be used with *16-bit integer* operands. \
6513f7985e6SDmitry Preobrazhensky             Assembler will attempt to encode these values as literals.
6523f7985e6SDmitry Preobrazhensky
65347eb6368SDmitry Preobrazhensky.. WARNING:: GFX7 does not support inline constants for *f16* operands.
65447eb6368SDmitry Preobrazhensky
655cef9d421SDmitry Preobrazhensky.. _amdgpu_synid_ival:
656cef9d421SDmitry Preobrazhensky
657cef9d421SDmitry Preobrazhenskyival
658cef9d421SDmitry Preobrazhensky~~~~
659cef9d421SDmitry Preobrazhensky
660cef9d421SDmitry PreobrazhenskyA symbolic operand encoded as an *inline constant*.
661cef9d421SDmitry PreobrazhenskyThese operands provide read-only access to H/W registers.
662cef9d421SDmitry Preobrazhensky
663cef9d421SDmitry Preobrazhensky    ======================== ================================================ =============
664cef9d421SDmitry Preobrazhensky    Syntax                   Note                                             Availability
665cef9d421SDmitry Preobrazhensky    ======================== ================================================ =============
666cef9d421SDmitry Preobrazhensky    shared_base              Base address of shared memory region.            GFX9, GFX10
667cef9d421SDmitry Preobrazhensky    shared_limit             Address of the end of shared memory region.      GFX9, GFX10
668cef9d421SDmitry Preobrazhensky    private_base             Base address of private memory region.           GFX9, GFX10
669cef9d421SDmitry Preobrazhensky    private_limit            Address of the end of private memory region.     GFX9, GFX10
670cef9d421SDmitry Preobrazhensky    pops_exiting_wave_id     A dedicated counter for POPS.                    GFX9, GFX10
671cef9d421SDmitry Preobrazhensky    ======================== ================================================ =============
672cef9d421SDmitry Preobrazhensky
67347eb6368SDmitry Preobrazhensky.. _amdgpu_synid_literal:
67447eb6368SDmitry Preobrazhensky
67547eb6368SDmitry Preobrazhenskyliteral
67647eb6368SDmitry Preobrazhensky-------
67747eb6368SDmitry Preobrazhensky
678b9683d3cSDmitry PreobrazhenskyA *literal* is a 64-bit value encoded as a separate 32-bit dword in the instruction stream.
679b9683d3cSDmitry PreobrazhenskyCompare *literals* with :ref:`inline constants<amdgpu_synid_constant>`.
68047eb6368SDmitry Preobrazhensky
68147eb6368SDmitry PreobrazhenskyIf a number may be encoded as either
68247eb6368SDmitry Preobrazhenskya :ref:`literal<amdgpu_synid_literal>` or
68347eb6368SDmitry Preobrazhenskyan :ref:`inline constant<amdgpu_synid_constant>`,
68447eb6368SDmitry Preobrazhenskyassembler selects the latter encoding as more efficient.
68547eb6368SDmitry Preobrazhensky
68647eb6368SDmitry PreobrazhenskyLiterals may be specified as :ref:`integer numbers<amdgpu_synid_integer_number>`,
687b9683d3cSDmitry Preobrazhensky:ref:`floating-point numbers<amdgpu_synid_floating-point_number>`,
688b9683d3cSDmitry Preobrazhensky:ref:`absolute expressions<amdgpu_synid_absolute_expression>` or
689b9683d3cSDmitry Preobrazhensky:ref:`relocatable expressions<amdgpu_synid_relocatable_expression>`.
69047eb6368SDmitry Preobrazhensky
69147eb6368SDmitry PreobrazhenskyAn instruction may use only one literal but several operands may refer the same literal.
69247eb6368SDmitry Preobrazhensky
69347eb6368SDmitry Preobrazhensky.. _amdgpu_synid_uimm8:
69447eb6368SDmitry Preobrazhensky
69547eb6368SDmitry Preobrazhenskyuimm8
69647eb6368SDmitry Preobrazhensky-----
69747eb6368SDmitry Preobrazhensky
698b9683d3cSDmitry PreobrazhenskyA 8-bit :ref:`integer number<amdgpu_synid_integer_number>`
699b9683d3cSDmitry Preobrazhenskyor an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
700b9683d3cSDmitry PreobrazhenskyThe value must be in the range 0..0xFF.
70147eb6368SDmitry Preobrazhensky
70247eb6368SDmitry Preobrazhensky.. _amdgpu_synid_uimm32:
70347eb6368SDmitry Preobrazhensky
70447eb6368SDmitry Preobrazhenskyuimm32
70547eb6368SDmitry Preobrazhensky------
70647eb6368SDmitry Preobrazhensky
707b9683d3cSDmitry PreobrazhenskyA 32-bit :ref:`integer number<amdgpu_synid_integer_number>`
708b9683d3cSDmitry Preobrazhenskyor an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
709b9683d3cSDmitry PreobrazhenskyThe value must be in the range 0..0xFFFFFFFF.
71047eb6368SDmitry Preobrazhensky
71147eb6368SDmitry Preobrazhensky.. _amdgpu_synid_uimm20:
71247eb6368SDmitry Preobrazhensky
71347eb6368SDmitry Preobrazhenskyuimm20
71447eb6368SDmitry Preobrazhensky------
71547eb6368SDmitry Preobrazhensky
716b9683d3cSDmitry PreobrazhenskyA 20-bit :ref:`integer number<amdgpu_synid_integer_number>`
717b9683d3cSDmitry Preobrazhenskyor an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
718b9683d3cSDmitry Preobrazhensky
719b9683d3cSDmitry PreobrazhenskyThe value must be in the range 0..0xFFFFF.
72047eb6368SDmitry Preobrazhensky
72147eb6368SDmitry Preobrazhensky.. _amdgpu_synid_simm21:
72247eb6368SDmitry Preobrazhensky
72347eb6368SDmitry Preobrazhenskysimm21
72447eb6368SDmitry Preobrazhensky------
72547eb6368SDmitry Preobrazhensky
726b9683d3cSDmitry PreobrazhenskyA 21-bit :ref:`integer number<amdgpu_synid_integer_number>`
727b9683d3cSDmitry Preobrazhenskyor an :ref:`absolute expression<amdgpu_synid_absolute_expression>`.
728b9683d3cSDmitry Preobrazhensky
729b9683d3cSDmitry PreobrazhenskyThe value must be in the range -0x100000..0x0FFFFF.
73047eb6368SDmitry Preobrazhensky
73147eb6368SDmitry Preobrazhensky.. _amdgpu_synid_off:
73247eb6368SDmitry Preobrazhensky
73347eb6368SDmitry Preobrazhenskyoff
73447eb6368SDmitry Preobrazhensky---
73547eb6368SDmitry Preobrazhensky
73647eb6368SDmitry PreobrazhenskyA special entity which indicates that the value of this operand is not used.
73747eb6368SDmitry Preobrazhensky
73847eb6368SDmitry Preobrazhensky    ================================== ===================================================
739c6d31e6fSDmitry Preobrazhensky    Syntax                             Description
74047eb6368SDmitry Preobrazhensky    ================================== ===================================================
74147eb6368SDmitry Preobrazhensky    off                                Indicates an unused operand.
74247eb6368SDmitry Preobrazhensky    ================================== ===================================================
743c6d31e6fSDmitry Preobrazhensky
744c6d31e6fSDmitry Preobrazhensky
74547eb6368SDmitry Preobrazhensky.. _amdgpu_synid_number:
746c6d31e6fSDmitry Preobrazhensky
74747eb6368SDmitry PreobrazhenskyNumbers
74847eb6368SDmitry Preobrazhensky=======
749c6d31e6fSDmitry Preobrazhensky
75047eb6368SDmitry Preobrazhensky.. _amdgpu_synid_integer_number:
751c6d31e6fSDmitry Preobrazhensky
75247eb6368SDmitry PreobrazhenskyInteger Numbers
753c6d31e6fSDmitry Preobrazhensky---------------
754c6d31e6fSDmitry Preobrazhensky
75547eb6368SDmitry PreobrazhenskyInteger numbers are 64 bits wide.
756b9683d3cSDmitry PreobrazhenskyThey are converted to :ref:`expected operand type<amdgpu_syn_instruction_type>`
757b9683d3cSDmitry Preobrazhenskyas described :ref:`here<amdgpu_synid_int_conv>`.
758c6d31e6fSDmitry Preobrazhensky
759b9683d3cSDmitry PreobrazhenskyInteger numbers may be specified in binary, octal, hexadecimal and decimal formats:
760c6d31e6fSDmitry Preobrazhensky
761b9683d3cSDmitry Preobrazhensky    ============ =============================== ========
762b9683d3cSDmitry Preobrazhensky    Format       Syntax                          Example
763b9683d3cSDmitry Preobrazhensky    ============ =============================== ========
764b9683d3cSDmitry Preobrazhensky    Decimal      [-]?[1-9][0-9]*                 -1234
765b9683d3cSDmitry Preobrazhensky    Binary       [-]?0b[01]+                     0b1010
766b9683d3cSDmitry Preobrazhensky    Octal        [-]?0[0-7]+                     010
767b9683d3cSDmitry Preobrazhensky    Hexadecimal  [-]?0x[0-9a-fA-F]+              0xff
768b9683d3cSDmitry Preobrazhensky    \            [-]?[0x]?[0-9][0-9a-fA-F]*[hH]  0ffh
769b9683d3cSDmitry Preobrazhensky    ============ =============================== ========
770c6d31e6fSDmitry Preobrazhensky
77147eb6368SDmitry Preobrazhensky.. _amdgpu_synid_floating-point_number:
772c6d31e6fSDmitry Preobrazhensky
77347eb6368SDmitry PreobrazhenskyFloating-Point Numbers
77447eb6368SDmitry Preobrazhensky----------------------
775c6d31e6fSDmitry Preobrazhensky
77647eb6368SDmitry PreobrazhenskyAll floating-point numbers are handled as double (64 bits wide).
777b9683d3cSDmitry PreobrazhenskyThey are converted to
778b9683d3cSDmitry Preobrazhensky:ref:`expected operand type<amdgpu_syn_instruction_type>`
779b9683d3cSDmitry Preobrazhenskyas described :ref:`here<amdgpu_synid_fp_conv>`.
780c6d31e6fSDmitry Preobrazhensky
78147eb6368SDmitry PreobrazhenskyFloating-point numbers may be specified in hexadecimal and decimal formats:
782c6d31e6fSDmitry Preobrazhensky
783b9683d3cSDmitry Preobrazhensky    ============ ======================================================== ====================== ====================
784b9683d3cSDmitry Preobrazhensky    Format       Syntax                                                   Examples               Note
785b9683d3cSDmitry Preobrazhensky    ============ ======================================================== ====================== ====================
786b9683d3cSDmitry Preobrazhensky    Decimal      [-]?[0-9]*[.][0-9]*([eE][+-]?[0-9]*)?                    -1.234, 234e2          Must include either
787b9683d3cSDmitry Preobrazhensky                                                                                                 a decimal separator
788b9683d3cSDmitry Preobrazhensky                                                                                                 or an exponent.
789b9683d3cSDmitry Preobrazhensky    Hexadecimal  [-]0x[0-9a-fA-F]*(.[0-9a-fA-F]*)?[pP][+-]?[0-9a-fA-F]+   -0x1afp-10, 0x.1afp10
790b9683d3cSDmitry Preobrazhensky    ============ ======================================================== ====================== ====================
791c6d31e6fSDmitry Preobrazhensky
79247eb6368SDmitry Preobrazhensky.. _amdgpu_synid_expression:
793c6d31e6fSDmitry Preobrazhensky
79447eb6368SDmitry PreobrazhenskyExpressions
79547eb6368SDmitry Preobrazhensky===========
796c6d31e6fSDmitry Preobrazhensky
797b9683d3cSDmitry PreobrazhenskyAn expression is evaluated to a 64-bit integer.
798b9683d3cSDmitry PreobrazhenskyNote that floating-point expressions are not supported.
799b9683d3cSDmitry Preobrazhensky
80047eb6368SDmitry PreobrazhenskyThere are two kinds of expressions:
801c6d31e6fSDmitry Preobrazhensky
80247eb6368SDmitry Preobrazhensky* :ref:`Absolute<amdgpu_synid_absolute_expression>`.
80347eb6368SDmitry Preobrazhensky* :ref:`Relocatable<amdgpu_synid_relocatable_expression>`.
804c6d31e6fSDmitry Preobrazhensky
80547eb6368SDmitry Preobrazhensky.. _amdgpu_synid_absolute_expression:
806c6d31e6fSDmitry Preobrazhensky
80747eb6368SDmitry PreobrazhenskyAbsolute Expressions
80847eb6368SDmitry Preobrazhensky--------------------
809c6d31e6fSDmitry Preobrazhensky
810b9683d3cSDmitry PreobrazhenskyThe value of an absolute expression does not change after program relocation.
81147eb6368SDmitry PreobrazhenskyAbsolute expressions must not include unassigned and relocatable values
81247eb6368SDmitry Preobrazhenskysuch as labels.
813c6d31e6fSDmitry Preobrazhensky
814b9683d3cSDmitry PreobrazhenskyAbsolute expressions are evaluated to 64-bit integer values and converted to
815b9683d3cSDmitry Preobrazhensky:ref:`expected operand type<amdgpu_syn_instruction_type>`
816b9683d3cSDmitry Preobrazhenskyas described :ref:`here<amdgpu_synid_int_conv>`.
817b9683d3cSDmitry Preobrazhensky
81847eb6368SDmitry PreobrazhenskyExamples:
819c6d31e6fSDmitry Preobrazhensky
8201fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
821c6d31e6fSDmitry Preobrazhensky
82247eb6368SDmitry Preobrazhensky    x = -1
82347eb6368SDmitry Preobrazhensky    y = x + 10
824c6d31e6fSDmitry Preobrazhensky
82547eb6368SDmitry Preobrazhensky.. _amdgpu_synid_relocatable_expression:
826c6d31e6fSDmitry Preobrazhensky
82747eb6368SDmitry PreobrazhenskyRelocatable Expressions
82847eb6368SDmitry Preobrazhensky-----------------------
829c6d31e6fSDmitry Preobrazhensky
83047eb6368SDmitry PreobrazhenskyThe value of a relocatable expression depends on program relocation.
831c6d31e6fSDmitry Preobrazhensky
83247eb6368SDmitry PreobrazhenskyNote that use of relocatable expressions is limited with branch targets
833b9683d3cSDmitry Preobrazhenskyand 32-bit integer operands.
834c6d31e6fSDmitry Preobrazhensky
835b9683d3cSDmitry PreobrazhenskyA relocatable expression is evaluated to a 64-bit integer value
836b9683d3cSDmitry Preobrazhenskywhich depends on operand kind and :ref:`relocation type<amdgpu-relocation-records>`
837b9683d3cSDmitry Preobrazhenskyof symbol(s) used in the expression. For example, if an instruction refers a label,
838b9683d3cSDmitry Preobrazhenskythis reference is evaluated to an offset from the address after the instruction
839b9683d3cSDmitry Preobrazhenskyto the label address:
840c6d31e6fSDmitry Preobrazhensky
8411fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
842c6d31e6fSDmitry Preobrazhensky
843b9683d3cSDmitry Preobrazhensky    label:
844b9683d3cSDmitry Preobrazhensky    v_add_co_u32_e32 v0, vcc, label, v1  // 'label' operand is evaluated to -4
845c6d31e6fSDmitry Preobrazhensky
846b9683d3cSDmitry PreobrazhenskyNote that values of relocatable expressions are usually unknown at assembly time;
847b9683d3cSDmitry Preobrazhenskythey are resolved later by a linker and converted to
848b9683d3cSDmitry Preobrazhensky:ref:`expected operand type<amdgpu_syn_instruction_type>`
849b9683d3cSDmitry Preobrazhenskyas described :ref:`here<amdgpu_synid_rl_conv>`.
850c6d31e6fSDmitry Preobrazhensky
851b9683d3cSDmitry PreobrazhenskyOperands and Operations
852b9683d3cSDmitry Preobrazhensky-----------------------
853c6d31e6fSDmitry Preobrazhensky
854b9683d3cSDmitry PreobrazhenskyExpressions are composed of 64-bit integer operands and operations.
855b9683d3cSDmitry PreobrazhenskyOperands include :ref:`integer numbers<amdgpu_synid_integer_number>`
856b9683d3cSDmitry Preobrazhenskyand :ref:`symbols<amdgpu_synid_symbol>`.
857c80b1650SDmitry Preobrazhensky
85847eb6368SDmitry PreobrazhenskyExpressions may also use "." which is a reference to the current PC (program counter).
859c80b1650SDmitry Preobrazhensky
860b9683d3cSDmitry Preobrazhensky:ref:`Unary<amdgpu_synid_expression_un_op>` and :ref:`binary<amdgpu_synid_expression_bin_op>`
861b9683d3cSDmitry Preobrazhenskyoperations produce 64-bit integer results.
862b9683d3cSDmitry Preobrazhensky
863b9683d3cSDmitry PreobrazhenskySyntax of Expressions
864b9683d3cSDmitry Preobrazhensky---------------------
865b9683d3cSDmitry Preobrazhensky
8663f7985e6SDmitry PreobrazhenskySyntax of expressions is shown below::
867c80b1650SDmitry Preobrazhensky
86847eb6368SDmitry Preobrazhensky    expr ::= expr binop expr | primaryexpr ;
869c80b1650SDmitry Preobrazhensky
87047eb6368SDmitry Preobrazhensky    primaryexpr ::= '(' expr ')' | symbol | number | '.' | unop primaryexpr ;
871c80b1650SDmitry Preobrazhensky
87247eb6368SDmitry Preobrazhensky    binop ::= '&&'
87347eb6368SDmitry Preobrazhensky            | '||'
87447eb6368SDmitry Preobrazhensky            | '|'
87547eb6368SDmitry Preobrazhensky            | '^'
87647eb6368SDmitry Preobrazhensky            | '&'
87747eb6368SDmitry Preobrazhensky            | '!'
87847eb6368SDmitry Preobrazhensky            | '=='
87947eb6368SDmitry Preobrazhensky            | '!='
88047eb6368SDmitry Preobrazhensky            | '<>'
88147eb6368SDmitry Preobrazhensky            | '<'
88247eb6368SDmitry Preobrazhensky            | '<='
88347eb6368SDmitry Preobrazhensky            | '>'
88447eb6368SDmitry Preobrazhensky            | '>='
88547eb6368SDmitry Preobrazhensky            | '<<'
88647eb6368SDmitry Preobrazhensky            | '>>'
88747eb6368SDmitry Preobrazhensky            | '+'
88847eb6368SDmitry Preobrazhensky            | '-'
88947eb6368SDmitry Preobrazhensky            | '*'
89047eb6368SDmitry Preobrazhensky            | '/'
89147eb6368SDmitry Preobrazhensky            | '%' ;
892c6d31e6fSDmitry Preobrazhensky
89347eb6368SDmitry Preobrazhensky    unop ::= '~'
89447eb6368SDmitry Preobrazhensky           | '+'
89547eb6368SDmitry Preobrazhensky           | '-'
89647eb6368SDmitry Preobrazhensky           | '!' ;
897c6d31e6fSDmitry Preobrazhensky
89847eb6368SDmitry Preobrazhensky.. _amdgpu_synid_expression_bin_op:
899c6d31e6fSDmitry Preobrazhensky
90047eb6368SDmitry PreobrazhenskyBinary Operators
90147eb6368SDmitry Preobrazhensky----------------
902c6d31e6fSDmitry Preobrazhensky
90347eb6368SDmitry PreobrazhenskyBinary operators are described in the following table.
90447eb6368SDmitry PreobrazhenskyThey operate on and produce 64-bit integers.
90547eb6368SDmitry PreobrazhenskyOperators with higher priority are performed first.
906c6d31e6fSDmitry Preobrazhensky
90747eb6368SDmitry Preobrazhensky    ========== ========= ===============================================
90847eb6368SDmitry Preobrazhensky    Operator   Priority  Meaning
90947eb6368SDmitry Preobrazhensky    ========== ========= ===============================================
91047eb6368SDmitry Preobrazhensky       \*         5      Integer multiplication.
91147eb6368SDmitry Preobrazhensky       /          5      Integer division.
91247eb6368SDmitry Preobrazhensky       %          5      Integer signed remainder.
91347eb6368SDmitry Preobrazhensky       \+         4      Integer addition.
91447eb6368SDmitry Preobrazhensky       \-         4      Integer subtraction.
91547eb6368SDmitry Preobrazhensky       <<         3      Integer shift left.
91647eb6368SDmitry Preobrazhensky       >>         3      Logical shift right.
91747eb6368SDmitry Preobrazhensky       ==         2      Equality comparison.
91847eb6368SDmitry Preobrazhensky       !=         2      Inequality comparison.
91947eb6368SDmitry Preobrazhensky       <>         2      Inequality comparison.
92047eb6368SDmitry Preobrazhensky       <          2      Signed less than comparison.
92147eb6368SDmitry Preobrazhensky       <=         2      Signed less than or equal comparison.
92247eb6368SDmitry Preobrazhensky       >          2      Signed greater than comparison.
92347eb6368SDmitry Preobrazhensky       >=         2      Signed greater than or equal comparison.
92447eb6368SDmitry Preobrazhensky      \|          1      Bitwise or.
92547eb6368SDmitry Preobrazhensky       ^          1      Bitwise xor.
92647eb6368SDmitry Preobrazhensky       &          1      Bitwise and.
92747eb6368SDmitry Preobrazhensky       &&         0      Logical and.
92847eb6368SDmitry Preobrazhensky       ||         0      Logical or.
92947eb6368SDmitry Preobrazhensky    ========== ========= ===============================================
930c6d31e6fSDmitry Preobrazhensky
93147eb6368SDmitry Preobrazhensky.. _amdgpu_synid_expression_un_op:
93247eb6368SDmitry Preobrazhensky
93347eb6368SDmitry PreobrazhenskyUnary Operators
93447eb6368SDmitry Preobrazhensky---------------
93547eb6368SDmitry Preobrazhensky
93647eb6368SDmitry PreobrazhenskyUnary operators are described in the following table.
93747eb6368SDmitry PreobrazhenskyThey operate on and produce 64-bit integers.
93847eb6368SDmitry Preobrazhensky
93947eb6368SDmitry Preobrazhensky    ========== ===============================================
94047eb6368SDmitry Preobrazhensky    Operator   Meaning
94147eb6368SDmitry Preobrazhensky    ========== ===============================================
94247eb6368SDmitry Preobrazhensky       !       Logical negation.
94347eb6368SDmitry Preobrazhensky       ~       Bitwise negation.
94447eb6368SDmitry Preobrazhensky       \+      Integer unary plus.
94547eb6368SDmitry Preobrazhensky       \-      Integer unary minus.
94647eb6368SDmitry Preobrazhensky    ========== ===============================================
94747eb6368SDmitry Preobrazhensky
94847eb6368SDmitry Preobrazhensky.. _amdgpu_synid_symbol:
94947eb6368SDmitry Preobrazhensky
95047eb6368SDmitry PreobrazhenskySymbols
95147eb6368SDmitry Preobrazhensky-------
95247eb6368SDmitry Preobrazhensky
953b9683d3cSDmitry PreobrazhenskyA symbol is a named 64-bit integer value, representing a relocatable
95447eb6368SDmitry Preobrazhenskyaddress or an absolute (non-relocatable) number.
95547eb6368SDmitry Preobrazhensky
95647eb6368SDmitry PreobrazhenskySymbol names have the following syntax:
95747eb6368SDmitry Preobrazhensky    ``[a-zA-Z_.][a-zA-Z0-9_$.@]*``
95847eb6368SDmitry Preobrazhensky
95947eb6368SDmitry PreobrazhenskyThe table below provides several examples of syntax used for symbol definition.
96047eb6368SDmitry Preobrazhensky
96147eb6368SDmitry Preobrazhensky    ================ ==========================================================
96247eb6368SDmitry Preobrazhensky    Syntax           Meaning
96347eb6368SDmitry Preobrazhensky    ================ ==========================================================
96447eb6368SDmitry Preobrazhensky    .globl <S>       Declares a global symbol S without assigning it a value.
96547eb6368SDmitry Preobrazhensky    .set <S>, <E>    Assigns the value of an expression E to a symbol S.
96647eb6368SDmitry Preobrazhensky    <S> = <E>        Assigns the value of an expression E to a symbol S.
96747eb6368SDmitry Preobrazhensky    <S>:             Declares a label S and assigns it the current PC value.
96847eb6368SDmitry Preobrazhensky    ================ ==========================================================
96947eb6368SDmitry Preobrazhensky
97047eb6368SDmitry PreobrazhenskyA symbol may be used before it is declared or assigned;
97147eb6368SDmitry Preobrazhenskyunassigned symbols are assumed to be PC-relative.
97247eb6368SDmitry Preobrazhensky
973b9683d3cSDmitry PreobrazhenskyAdditional information about symbols may be found :ref:`here<amdgpu-symbols>`.
97447eb6368SDmitry Preobrazhensky
97547eb6368SDmitry Preobrazhensky.. _amdgpu_synid_conv:
97647eb6368SDmitry Preobrazhensky
977b9683d3cSDmitry PreobrazhenskyType and Size Conversion
978b9683d3cSDmitry Preobrazhensky========================
97947eb6368SDmitry Preobrazhensky
98047eb6368SDmitry PreobrazhenskyThis section describes what happens when a 64-bit
98147eb6368SDmitry Preobrazhensky:ref:`integer number<amdgpu_synid_integer_number>`, a
982b9683d3cSDmitry Preobrazhensky:ref:`floating-point number<amdgpu_synid_floating-point_number>` or an
983b9683d3cSDmitry Preobrazhensky:ref:`expression<amdgpu_synid_expression>`
98447eb6368SDmitry Preobrazhenskyis used for an operand which has a different type or size.
98547eb6368SDmitry Preobrazhensky
986b9683d3cSDmitry Preobrazhensky.. _amdgpu_synid_int_conv:
98747eb6368SDmitry Preobrazhensky
988b9683d3cSDmitry PreobrazhenskyConversion of Integer Values
989b9683d3cSDmitry Preobrazhensky----------------------------
99047eb6368SDmitry Preobrazhensky
991b9683d3cSDmitry PreobrazhenskyInstruction operands may be specified as 64-bit :ref:`integer numbers<amdgpu_synid_integer_number>` or
992b9683d3cSDmitry Preobrazhensky:ref:`absolute expressions<amdgpu_synid_absolute_expression>`. These values are converted to
993b9683d3cSDmitry Preobrazhenskythe :ref:`expected operand type<amdgpu_syn_instruction_type>` using the following steps:
99447eb6368SDmitry Preobrazhensky
995b9683d3cSDmitry Preobrazhensky1. *Validation*. Assembler checks if the input value may be truncated without loss to the required *truncation width*
996b9683d3cSDmitry Preobrazhensky(see the table below). There are two cases when this operation is enabled:
99747eb6368SDmitry Preobrazhensky
99847eb6368SDmitry Preobrazhensky    * The truncated bits are all 0.
99947eb6368SDmitry Preobrazhensky    * The truncated bits are all 1 and the value after truncation has its MSB bit set.
100047eb6368SDmitry Preobrazhensky
1001b9683d3cSDmitry PreobrazhenskyIn all other cases assembler triggers an error.
1002b9683d3cSDmitry Preobrazhensky
1003b9683d3cSDmitry Preobrazhensky2. *Conversion*. The input value is converted to the expected type as described in the table below.
1004b9683d3cSDmitry PreobrazhenskyDepending on operand kind, this conversion is performed by either assembler or AMDGPU H/W (or both).
1005b9683d3cSDmitry Preobrazhensky
1006b9683d3cSDmitry Preobrazhensky    ============== ================= =============== ====================================================================
1007b9683d3cSDmitry Preobrazhensky    Expected type  Truncation Width  Conversion      Description
1008b9683d3cSDmitry Preobrazhensky    ============== ================= =============== ====================================================================
1009b9683d3cSDmitry Preobrazhensky    i16, u16, b16  16                num.u16         Truncate to 16 bits.
1010b9683d3cSDmitry Preobrazhensky    i32, u32, b32  32                num.u32         Truncate to 32 bits.
1011b9683d3cSDmitry Preobrazhensky    i64            32                {-1,num.i32}    Truncate to 32 bits and then sign-extend the result to 64 bits.
1012b9683d3cSDmitry Preobrazhensky    u64, b64       32                {0,num.u32}     Truncate to 32 bits and then zero-extend the result to 64 bits.
1013b9683d3cSDmitry Preobrazhensky    f16            16                num.u16         Use low 16 bits as an f16 value.
1014b9683d3cSDmitry Preobrazhensky    f32            32                num.u32         Use low 32 bits as an f32 value.
1015b9683d3cSDmitry Preobrazhensky    f64            32                {num.u32,0}     Use low 32 bits of the number as high 32 bits
1016b9683d3cSDmitry Preobrazhensky                                                     of the result; low 32 bits of the result are zeroed.
1017b9683d3cSDmitry Preobrazhensky    ============== ================= =============== ====================================================================
1018b9683d3cSDmitry Preobrazhensky
1019b9683d3cSDmitry PreobrazhenskyExamples of enabled conversions:
102047eb6368SDmitry Preobrazhensky
10211fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
102247eb6368SDmitry Preobrazhensky
102347eb6368SDmitry Preobrazhensky    // GFX9
102447eb6368SDmitry Preobrazhensky
1025b9683d3cSDmitry Preobrazhensky    v_add_u16 v0, -1, 0                   // src0 = 0xFFFF
1026b9683d3cSDmitry Preobrazhensky    v_add_f16 v0, -1, 0                   // src0 = 0xFFFF (NaN)
1027b9683d3cSDmitry Preobrazhensky                                          //
1028b9683d3cSDmitry Preobrazhensky    v_add_u32 v0, -1, 0                   // src0 = 0xFFFFFFFF
1029b9683d3cSDmitry Preobrazhensky    v_add_f32 v0, -1, 0                   // src0 = 0xFFFFFFFF (NaN)
1030b9683d3cSDmitry Preobrazhensky                                          //
1031b9683d3cSDmitry Preobrazhensky    v_add_u16 v0, 0xff00, v0              // src0 = 0xff00
1032b9683d3cSDmitry Preobrazhensky    v_add_u16 v0, 0xffffffffffffff00, v0  // src0 = 0xff00
1033b9683d3cSDmitry Preobrazhensky    v_add_u16 v0, -256, v0                // src0 = 0xff00
1034b9683d3cSDmitry Preobrazhensky                                          //
1035b9683d3cSDmitry Preobrazhensky    s_bfe_i64 s[0:1], 0xffefffff, s3      // src0 = 0xffffffffffefffff
1036b9683d3cSDmitry Preobrazhensky    s_bfe_u64 s[0:1], 0xffefffff, s3      // src0 = 0x00000000ffefffff
1037b9683d3cSDmitry Preobrazhensky    v_ceil_f64_e32 v[0:1], 0xffefffff     // src0 = 0xffefffff00000000 (-1.7976922776554302e308)
1038b9683d3cSDmitry Preobrazhensky                                          //
1039b9683d3cSDmitry Preobrazhensky    x = 0xffefffff                        //
1040b9683d3cSDmitry Preobrazhensky    s_bfe_i64 s[0:1], x, s3               // src0 = 0xffffffffffefffff
1041b9683d3cSDmitry Preobrazhensky    s_bfe_u64 s[0:1], x, s3               // src0 = 0x00000000ffefffff
1042b9683d3cSDmitry Preobrazhensky    v_ceil_f64_e32 v[0:1], x              // src0 = 0xffefffff00000000 (-1.7976922776554302e308)
1043b9683d3cSDmitry Preobrazhensky
1044b9683d3cSDmitry PreobrazhenskyExamples of disabled conversions:
104547eb6368SDmitry Preobrazhensky
10461fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
104747eb6368SDmitry Preobrazhensky
104847eb6368SDmitry Preobrazhensky    // GFX9
104947eb6368SDmitry Preobrazhensky
1050ddac5c9bSDmitry Preobrazhensky    v_add_u16 v0, 0x1ff00, v0               // truncated bits are not all 0 or 1
1051ddac5c9bSDmitry Preobrazhensky    v_add_u16 v0, 0xffffffffffff00ff, v0    // truncated bits do not match MSB of the result
105247eb6368SDmitry Preobrazhensky
1053b9683d3cSDmitry Preobrazhensky.. _amdgpu_synid_fp_conv:
105447eb6368SDmitry Preobrazhensky
1055b9683d3cSDmitry PreobrazhenskyConversion of Floating-Point Values
1056b9683d3cSDmitry Preobrazhensky-----------------------------------
105747eb6368SDmitry Preobrazhensky
1058b9683d3cSDmitry PreobrazhenskyInstruction operands may be specified as 64-bit :ref:`floating-point numbers<amdgpu_synid_floating-point_number>`.
1059b9683d3cSDmitry PreobrazhenskyThese values are converted to the :ref:`expected operand type<amdgpu_syn_instruction_type>` using the following steps:
106047eb6368SDmitry Preobrazhensky
1061b9683d3cSDmitry Preobrazhensky1. *Validation*. Assembler checks if the input f64 number can be converted
1062b9683d3cSDmitry Preobrazhenskyto the *required floating-point type* (see the table below) without overflow or underflow.
1063b9683d3cSDmitry PreobrazhenskyPrecision lost is allowed. If this conversion is not possible, assembler triggers an error.
106447eb6368SDmitry Preobrazhensky
1065b9683d3cSDmitry Preobrazhensky2. *Conversion*. The input value is converted to the expected type as described in the table below.
1066b9683d3cSDmitry PreobrazhenskyDepending on operand kind, this is performed by either assembler or AMDGPU H/W (or both).
1067b9683d3cSDmitry Preobrazhensky
1068b9683d3cSDmitry Preobrazhensky    ============== ================ ================= =================================================================
1069b9683d3cSDmitry Preobrazhensky    Expected type  Required FP Type Conversion        Description
1070b9683d3cSDmitry Preobrazhensky    ============== ================ ================= =================================================================
1071b9683d3cSDmitry Preobrazhensky    i16, u16, b16  f16              f16(num)          Convert to f16 and use bits of the result as an integer value.
10723f7985e6SDmitry Preobrazhensky                                                      The value has to be encoded as a literal or an error occurs.
10733f7985e6SDmitry Preobrazhensky                                                      Note that the value cannot be encoded as an inline constant.
1074b9683d3cSDmitry Preobrazhensky    i32, u32, b32  f32              f32(num)          Convert to f32 and use bits of the result as an integer value.
1075b9683d3cSDmitry Preobrazhensky    i64, u64, b64  \-               \-                Conversion disabled.
1076b9683d3cSDmitry Preobrazhensky    f16            f16              f16(num)          Convert to f16.
1077b9683d3cSDmitry Preobrazhensky    f32            f32              f32(num)          Convert to f32.
1078b9683d3cSDmitry Preobrazhensky    f64            f64              {num.u32.hi,0}    Use high 32 bits of the number as high 32 bits of the result;
107947eb6368SDmitry Preobrazhensky                                                      zero-fill low 32 bits of the result.
108047eb6368SDmitry Preobrazhensky
108147eb6368SDmitry Preobrazhensky                                                      Note that the result may differ from the original number.
1082b9683d3cSDmitry Preobrazhensky    ============== ================ ================= =================================================================
108347eb6368SDmitry Preobrazhensky
1084b9683d3cSDmitry PreobrazhenskyExamples of enabled conversions:
108547eb6368SDmitry Preobrazhensky
10861fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
108747eb6368SDmitry Preobrazhensky
108847eb6368SDmitry Preobrazhensky    // GFX9
108947eb6368SDmitry Preobrazhensky
1090b9683d3cSDmitry Preobrazhensky    v_add_f16 v0, 1.0, 0        // src0 = 0x3C00 (1.0)
1091b9683d3cSDmitry Preobrazhensky    v_add_u16 v0, 1.0, 0        // src0 = 0x3C00
1092b9683d3cSDmitry Preobrazhensky                                //
1093b9683d3cSDmitry Preobrazhensky    v_add_f32 v0, 1.0, 0        // src0 = 0x3F800000 (1.0)
1094b9683d3cSDmitry Preobrazhensky    v_add_u32 v0, 1.0, 0        // src0 = 0x3F800000
109547eb6368SDmitry Preobrazhensky
1096b9683d3cSDmitry Preobrazhensky                                // src0 before conversion:
1097b9683d3cSDmitry Preobrazhensky                                //   1.7976931348623157e308 = 0x7fefffffffffffff
1098b9683d3cSDmitry Preobrazhensky                                // src0 after conversion:
1099b9683d3cSDmitry Preobrazhensky                                //   1.7976922776554302e308 = 0x7fefffff00000000
1100ddac5c9bSDmitry Preobrazhensky    v_ceil_f64 v[0:1], 1.7976931348623157e308
110147eb6368SDmitry Preobrazhensky
1102b9683d3cSDmitry Preobrazhensky    v_add_f16 v1, 65500.0, v2   // ok for f16.
1103b9683d3cSDmitry Preobrazhensky    v_add_f32 v1, 65600.0, v2   // ok for f32, but would result in overflow for f16.
1104b9683d3cSDmitry Preobrazhensky
1105b9683d3cSDmitry PreobrazhenskyExamples of disabled conversions:
110647eb6368SDmitry Preobrazhensky
11071fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
110847eb6368SDmitry Preobrazhensky
110947eb6368SDmitry Preobrazhensky    // GFX9
111047eb6368SDmitry Preobrazhensky
1111ddac5c9bSDmitry Preobrazhensky    v_add_f16 v1, 65600.0, v2    // overflow
111247eb6368SDmitry Preobrazhensky
1113b9683d3cSDmitry Preobrazhensky.. _amdgpu_synid_rl_conv:
111447eb6368SDmitry Preobrazhensky
1115b9683d3cSDmitry PreobrazhenskyConversion of Relocatable Values
1116b9683d3cSDmitry Preobrazhensky--------------------------------
111747eb6368SDmitry Preobrazhensky
1118b9683d3cSDmitry Preobrazhensky:ref:`Relocatable expressions<amdgpu_synid_relocatable_expression>`
1119b9683d3cSDmitry Preobrazhenskymay be used with 32-bit integer operands and jump targets.
112047eb6368SDmitry Preobrazhensky
1121b9683d3cSDmitry PreobrazhenskyWhen the value of a relocatable expression is resolved by a linker, it is
1122b9683d3cSDmitry Preobrazhenskyconverted as needed and truncated to the operand size. The conversion depends
1123b9683d3cSDmitry Preobrazhenskyon :ref:`relocation type<amdgpu-relocation-records>` and operand kind.
112447eb6368SDmitry Preobrazhensky
1125b9683d3cSDmitry PreobrazhenskyFor example, when a 32-bit operand of an instruction refers a relocatable expression *expr*,
1126b9683d3cSDmitry Preobrazhenskythis reference is evaluated to a 64-bit offset from the address after the
1127b9683d3cSDmitry Preobrazhenskyinstruction to the address being referenced, *counted in bytes*.
1128b9683d3cSDmitry PreobrazhenskyThen the value is truncated to 32 bits and encoded as a literal:
112947eb6368SDmitry Preobrazhensky
11301fa7aaf5SDmitry Preobrazhensky.. parsed-literal::
113147eb6368SDmitry Preobrazhensky
1132b9683d3cSDmitry Preobrazhensky    expr = .
1133b9683d3cSDmitry Preobrazhensky    v_add_co_u32_e32 v0, vcc, expr, v1  // 'expr' operand is evaluated to -4
1134b9683d3cSDmitry Preobrazhensky                                        // and then truncated to 0xFFFFFFFC
113547eb6368SDmitry Preobrazhensky
1136b9683d3cSDmitry PreobrazhenskyAs another example, when a branch instruction refers a label,
1137b9683d3cSDmitry Preobrazhenskythis reference is evaluated to an offset from the address after the
1138b9683d3cSDmitry Preobrazhenskyinstruction to the label address, *counted in dwords*.
1139b9683d3cSDmitry PreobrazhenskyThen the value is truncated to 16 bits:
114047eb6368SDmitry Preobrazhensky
1141b9683d3cSDmitry Preobrazhensky.. parsed-literal::
1142b9683d3cSDmitry Preobrazhensky
1143b9683d3cSDmitry Preobrazhensky    label:
1144b9683d3cSDmitry Preobrazhensky    s_branch label  // 'label' operand is evaluated to -1 and truncated to 0xFFFF
1145