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