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