Home | History | Annotate | Download | only in nv30
      1 #ifndef __NVFX_SHADER_H__
      2 #define __NVFX_SHADER_H__
      3 
      4 #include <stdint.h>
      5 
      6 #include "pipe/p_compiler.h"
      7 
      8 #define NVFX_SWZ_IDENTITY ((3 << 6) | (2 << 4) | (1 << 2) | (0 << 0))
      9 
     10 /* this will resolve to either the NV30 or the NV40 version
     11  * depending on the current hardware */
     12 /* unusual, but very fast and compact method */
     13 #define NVFX_VP(c) ((NV30_VP_##c) + (nv30->is_nv4x & ((NV40_VP_##c) - (NV30_VP_##c))))
     14 
     15 #define NVFX_VP_INST_SLOT_VEC 0
     16 #define NVFX_VP_INST_SLOT_SCA 1
     17 
     18 #define NVFX_VP_INST_IN_POS  0    /* These seem to match the bindings specified in */
     19 #define NVFX_VP_INST_IN_WEIGHT  1    /* the ARB_v_p spec (2.14.3.1) */
     20 #define NVFX_VP_INST_IN_NORMAL  2
     21 #define NVFX_VP_INST_IN_COL0  3    /* Should probably confirm them all though */
     22 #define NVFX_VP_INST_IN_COL1  4
     23 #define NVFX_VP_INST_IN_FOGC  5
     24 #define NVFX_VP_INST_IN_TC0  8
     25 #define NVFX_VP_INST_IN_TC(n)  (8+n)
     26 
     27 #define NVFX_VP_INST_SCA_OP_NOP 0x00
     28 #define NVFX_VP_INST_SCA_OP_MOV 0x01
     29 #define NVFX_VP_INST_SCA_OP_RCP 0x02
     30 #define NVFX_VP_INST_SCA_OP_RCC 0x03
     31 #define NVFX_VP_INST_SCA_OP_RSQ 0x04
     32 #define NVFX_VP_INST_SCA_OP_EXP 0x05
     33 #define NVFX_VP_INST_SCA_OP_LOG 0x06
     34 #define NVFX_VP_INST_SCA_OP_LIT 0x07
     35 #define NVFX_VP_INST_SCA_OP_BRA 0x09
     36 #define NVFX_VP_INST_SCA_OP_CAL 0x0B
     37 #define NVFX_VP_INST_SCA_OP_RET 0x0C
     38 #define NVFX_VP_INST_SCA_OP_LG2 0x0D
     39 #define NVFX_VP_INST_SCA_OP_EX2 0x0E
     40 #define NVFX_VP_INST_SCA_OP_SIN 0x0F
     41 #define NVFX_VP_INST_SCA_OP_COS 0x10
     42 
     43 #define NV40_VP_INST_SCA_OP_PUSHA 0x13
     44 #define NV40_VP_INST_SCA_OP_POPA 0x14
     45 
     46 #define NVFX_VP_INST_VEC_OP_NOP 0x00
     47 #define NVFX_VP_INST_VEC_OP_MOV 0x01
     48 #define NVFX_VP_INST_VEC_OP_MUL 0x02
     49 #define NVFX_VP_INST_VEC_OP_ADD 0x03
     50 #define NVFX_VP_INST_VEC_OP_MAD 0x04
     51 #define NVFX_VP_INST_VEC_OP_DP3 0x05
     52 #define NVFX_VP_INST_VEC_OP_DPH 0x06
     53 #define NVFX_VP_INST_VEC_OP_DP4 0x07
     54 #define NVFX_VP_INST_VEC_OP_DST 0x08
     55 #define NVFX_VP_INST_VEC_OP_MIN 0x09
     56 #define NVFX_VP_INST_VEC_OP_MAX 0x0A
     57 #define NVFX_VP_INST_VEC_OP_SLT 0x0B
     58 #define NVFX_VP_INST_VEC_OP_SGE 0x0C
     59 #define NVFX_VP_INST_VEC_OP_ARL 0x0D
     60 #define NVFX_VP_INST_VEC_OP_FRC 0x0E
     61 #define NVFX_VP_INST_VEC_OP_FLR 0x0F
     62 #define NVFX_VP_INST_VEC_OP_SEQ 0x10
     63 #define NVFX_VP_INST_VEC_OP_SFL 0x11
     64 #define NVFX_VP_INST_VEC_OP_SGT 0x12
     65 #define NVFX_VP_INST_VEC_OP_SLE 0x13
     66 #define NVFX_VP_INST_VEC_OP_SNE 0x14
     67 #define NVFX_VP_INST_VEC_OP_STR 0x15
     68 #define NVFX_VP_INST_VEC_OP_SSG 0x16
     69 #define NVFX_VP_INST_VEC_OP_ARR 0x17
     70 #define NVFX_VP_INST_VEC_OP_ARA 0x18
     71 
     72 #define NV40_VP_INST_VEC_OP_TXL 0x19
     73 
     74 /* DWORD 3 */
     75 #define NVFX_VP_INST_LAST                           (1 << 0)
     76 
     77 /*
     78  * Each fragment program opcode appears to be comprised of 4 32-bit values.
     79  *
     80  * 0: OPDEST
     81  * 	0: program end
     82  * 	1-6: destination register
     83  * 	7: destination register is fp16?? (use for outputs)
     84  * 	8: set condition code
     85  * 	9: writemask x
     86  *  	10: writemask y
     87  *  	11: writemask z
     88  *  	12: writemask w
     89  *  	13-16: source attribute register number (e.g. COL0)
     90  *  	17-20: texture unit number
     91  *  	21: expand value on texture operation (x -> 2x - 1)
     92  *  	22-23: precision 0 = fp32, 1 = fp16, 2 = s1.10 fixed, 3 = s0.8 fixed (nv40-only))
     93  * 	24-29: opcode
     94  * 	30: no destination
     95  * 	31: saturate
     96  * 1 - SRC0
     97  * 	0-17: see common source fields
     98  * 	18: execute if condition code less
     99  * 	19: execute if condition code equal
    100  * 	20: execute if condition code greater
    101  * 	21-22: condition code swizzle x source component
    102  * 	23-24: condition code swizzle y source component
    103  * 	25-26: condition code swizzle z source component
    104  * 	27-28: condition code swizzle w source component
    105  * 	29: source 0 absolute
    106  * 	30: always 0 in renouveau tests
    107  * 	31: always 0 in renouveau tests
    108  * 2 - SRC1
    109  * 	0-17: see common source fields
    110  * 	18: source 1 absolute
    111  * 	19-20: input precision 0 = fp32, 1 = fp16, 2 = s1.10 fixed, 3 = ???
    112  * 	21-27: always 0 in renouveau tests
    113  * 	28-30: scale (0 = 1x, 1 = 2x, 2 = 4x, 3 = 8x, 4 = ???, 5, = 1/2, 6 = 1/4, 7 = 1/8)
    114  * 	31: opcode is branch
    115  * 3 - SRC2
    116  * 	0-17: see common source fields
    117  * 	18: source 2 absolute
    118  * 	19-29: address register displacement
    119  * 	30: use index register
    120  * 	31: disable perspective-correct interpolation?
    121  *
    122 * Common fields of 0, 1, 2 - SRC
    123  * 	0-1: source register type (0 = temp, 1 = input, 2 = immediate, 3 = ???)
    124  * 	2-7: source temp register index
    125  * 	8: source register is fp16??
    126  * 	9-10: source swizzle x source component
    127  * 	11-12: source swizzle y source component
    128  * 	13-14: source swizzle z source component
    129  * 	15-16: source swizzle w source component
    130  *	17: negate
    131 
    132  * There appears to be no special difference between result regs and temp regs.
    133  *     result.color == R0.xyzw
    134  *     result.depth == R1.z
    135  * When the fragprog contains instructions to write depth, NV30_TCL_PRIMITIVE_3D_UNK1D78=0
    136  * otherwise it is set to 1.
    137  *
    138  * Constants are inserted directly after the instruction that uses them.
    139  *
    140  * It appears that it's not possible to use two input registers in one
    141  * instruction as the input sourcing is done in the instruction dword
    142  * and not the source selection dwords.  As such instructions such as:
    143  *
    144  *     ADD result.color, fragment.color, fragment.texcoord[0];
    145  *
    146  * must be split into two MOV's and then an ADD (nvidia does this) but
    147  * I'm not sure why it's not just one MOV and then source the second input
    148  * in the ADD instruction..
    149  *
    150  * Negation of the full source is done with NV30_FP_REG_NEGATE, arbitrary
    151  * negation requires multiplication with a const.
    152  *
    153  * Arbitrary swizzling is supported with the exception of SWIZZLE_ZERO/SWIZZLE_ONE
    154  * The temp/result regs appear to be initialised to (0.0, 0.0, 0.0, 0.0) as SWIZZLE_ZERO
    155  * is implemented simply by not writing to the relevant components of the destination.
    156  *
    157  * Conditional execution
    158  *   TODO
    159  *
    160  * Non-native instructions:
    161  *   LIT
    162  *   LRP - MAD+MAD
    163  *   SUB - ADD, negate second source
    164  *   RSQ - LG2 + EX2
    165  *   POW - LG2 + MUL + EX2
    166  *   SCS - COS + SIN
    167  *   XPD
    168  *
    169  * NV40 Looping
    170  *   Loops appear to be fairly expensive on NV40 at least, the proprietary
    171  *   driver goes to a lot of effort to avoid using the native looping
    172  *   instructions.  If the total number of *executed* instructions between
    173  *   REP/ENDREP or LOOP/ENDLOOP is <=500, the driver will unroll the loop.
    174  *   The maximum loop count is 255.
    175  *
    176  */
    177 
    178 //== Opcode / Destination selection ==
    179 #define NVFX_FP_OP_PROGRAM_END          (1 << 0)
    180 #define NVFX_FP_OP_OUT_REG_SHIFT        1
    181 #define NV30_FP_OP_OUT_REG_MASK          (31 << 1)  /* uncertain */
    182 #define NV40_FP_OP_OUT_REG_MASK          (63 << 1)
    183 /* Needs to be set when writing outputs to get expected result.. */
    184 #define NVFX_FP_OP_OUT_REG_HALF          (1 << 7)
    185 #define NVFX_FP_OP_COND_WRITE_ENABLE        (1 << 8)
    186 #define NVFX_FP_OP_OUTMASK_SHIFT        9
    187 #define NVFX_FP_OP_OUTMASK_MASK          (0xF << 9)
    188 #  define NVFX_FP_OP_OUT_X  (1<<9)
    189 #  define NVFX_FP_OP_OUT_Y  (1<<10)
    190 #  define NVFX_FP_OP_OUT_Z  (1<<11)
    191 #  define NVFX_FP_OP_OUT_W  (1<<12)
    192 /* Uncertain about these, especially the input_src values.. it's possible that
    193  * they can be dynamically changed.
    194  */
    195 #define NVFX_FP_OP_INPUT_SRC_SHIFT        13
    196 #define NVFX_FP_OP_INPUT_SRC_MASK        (15 << 13)
    197 #  define NVFX_FP_OP_INPUT_SRC_POSITION  0x0
    198 #  define NVFX_FP_OP_INPUT_SRC_COL0  0x1
    199 #  define NVFX_FP_OP_INPUT_SRC_COL1  0x2
    200 #  define NVFX_FP_OP_INPUT_SRC_FOGC  0x3
    201 #  define NVFX_FP_OP_INPUT_SRC_TC0    0x4
    202 #  define NVFX_FP_OP_INPUT_SRC_TC(n)  (0x4 + n)
    203 #  define NV40_FP_OP_INPUT_SRC_FACING  0xE
    204 #define NVFX_FP_OP_TEX_UNIT_SHIFT        17
    205 #define NVFX_FP_OP_TEX_UNIT_MASK        (0xF << 17) /* guess */
    206 #define NVFX_FP_OP_PRECISION_SHIFT        22
    207 #define NVFX_FP_OP_PRECISION_MASK        (3 << 22)
    208 #   define NVFX_FP_PRECISION_FP32  0
    209 #   define NVFX_FP_PRECISION_FP16  1
    210 #   define NVFX_FP_PRECISION_FX12  2
    211 #define NVFX_FP_OP_OPCODE_SHIFT          24
    212 #define NVFX_FP_OP_OPCODE_MASK          (0x3F << 24)
    213 /* NV30/NV40 fragment program opcodes */
    214 #define NVFX_FP_OP_OPCODE_NOP 0x00
    215 #define NVFX_FP_OP_OPCODE_MOV 0x01
    216 #define NVFX_FP_OP_OPCODE_MUL 0x02
    217 #define NVFX_FP_OP_OPCODE_ADD 0x03
    218 #define NVFX_FP_OP_OPCODE_MAD 0x04
    219 #define NVFX_FP_OP_OPCODE_DP3 0x05
    220 #define NVFX_FP_OP_OPCODE_DP4 0x06
    221 #define NVFX_FP_OP_OPCODE_DST 0x07
    222 #define NVFX_FP_OP_OPCODE_MIN 0x08
    223 #define NVFX_FP_OP_OPCODE_MAX 0x09
    224 #define NVFX_FP_OP_OPCODE_SLT 0x0A
    225 #define NVFX_FP_OP_OPCODE_SGE 0x0B
    226 #define NVFX_FP_OP_OPCODE_SLE 0x0C
    227 #define NVFX_FP_OP_OPCODE_SGT 0x0D
    228 #define NVFX_FP_OP_OPCODE_SNE 0x0E
    229 #define NVFX_FP_OP_OPCODE_SEQ 0x0F
    230 #define NVFX_FP_OP_OPCODE_FRC 0x10
    231 #define NVFX_FP_OP_OPCODE_FLR 0x11
    232 #define NVFX_FP_OP_OPCODE_KIL 0x12
    233 #define NVFX_FP_OP_OPCODE_PK4B 0x13
    234 #define NVFX_FP_OP_OPCODE_UP4B 0x14
    235 #define NVFX_FP_OP_OPCODE_DDX 0x15 /* can only write XY */
    236 #define NVFX_FP_OP_OPCODE_DDY 0x16 /* can only write XY */
    237 #define NVFX_FP_OP_OPCODE_TEX 0x17
    238 #define NVFX_FP_OP_OPCODE_TXP 0x18
    239 #define NVFX_FP_OP_OPCODE_TXD 0x19
    240 #define NVFX_FP_OP_OPCODE_RCP 0x1A
    241 #define NVFX_FP_OP_OPCODE_EX2 0x1C
    242 #define NVFX_FP_OP_OPCODE_LG2 0x1D
    243 #define NVFX_FP_OP_OPCODE_STR 0x20
    244 #define NVFX_FP_OP_OPCODE_SFL 0x21
    245 #define NVFX_FP_OP_OPCODE_COS 0x22
    246 #define NVFX_FP_OP_OPCODE_SIN 0x23
    247 #define NVFX_FP_OP_OPCODE_PK2H 0x24
    248 #define NVFX_FP_OP_OPCODE_UP2H 0x25
    249 #define NVFX_FP_OP_OPCODE_PK4UB 0x27
    250 #define NVFX_FP_OP_OPCODE_UP4UB 0x28
    251 #define NVFX_FP_OP_OPCODE_PK2US 0x29
    252 #define NVFX_FP_OP_OPCODE_UP2US 0x2A
    253 #define NVFX_FP_OP_OPCODE_DP2A 0x2E
    254 #define NVFX_FP_OP_OPCODE_TXB 0x31
    255 #define NVFX_FP_OP_OPCODE_DIV 0x3A
    256 
    257 /* NV30 only fragment program opcodes */
    258 #define NVFX_FP_OP_OPCODE_RSQ_NV30 0x1B
    259 #define NVFX_FP_OP_OPCODE_LIT_NV30 0x1E
    260 #define NVFX_FP_OP_OPCODE_LRP_NV30 0x1F
    261 #define NVFX_FP_OP_OPCODE_POW_NV30 0x26
    262 #define NVFX_FP_OP_OPCODE_RFL_NV30 0x36
    263 
    264 /* NV40 only fragment program opcodes */
    265 #define NVFX_FP_OP_OPCODE_TXL_NV40 0x2F
    266 #define NVFX_FP_OP_OPCODE_LITEX2_NV40 0x3C
    267 
    268 /* The use of these instructions appears to be indicated by bit 31 of DWORD 2.*/
    269 #define NV40_FP_OP_BRA_OPCODE_BRK                                    0x0
    270 #define NV40_FP_OP_BRA_OPCODE_CAL                                    0x1
    271 #define NV40_FP_OP_BRA_OPCODE_IF                                     0x2
    272 #define NV40_FP_OP_BRA_OPCODE_LOOP                                   0x3
    273 #define NV40_FP_OP_BRA_OPCODE_REP                                    0x4
    274 #define NV40_FP_OP_BRA_OPCODE_RET                                    0x5
    275 
    276 #define NV40_FP_OP_OUT_NONE         (1 << 30)
    277 #define NVFX_FP_OP_OUT_SAT          (1 << 31)
    278 
    279 /* high order bits of SRC0 */
    280 #define NVFX_FP_OP_SRC0_ABS          (1 << 29)
    281 #define NVFX_FP_OP_COND_SWZ_W_SHIFT        27
    282 #define NVFX_FP_OP_COND_SWZ_W_MASK        (3 << 27)
    283 #define NVFX_FP_OP_COND_SWZ_Z_SHIFT        25
    284 #define NVFX_FP_OP_COND_SWZ_Z_MASK        (3 << 25)
    285 #define NVFX_FP_OP_COND_SWZ_Y_SHIFT        23
    286 #define NVFX_FP_OP_COND_SWZ_Y_MASK        (3 << 23)
    287 #define NVFX_FP_OP_COND_SWZ_X_SHIFT        21
    288 #define NVFX_FP_OP_COND_SWZ_X_MASK        (3 << 21)
    289 #define NVFX_FP_OP_COND_SWZ_ALL_SHIFT        21
    290 #define NVFX_FP_OP_COND_SWZ_ALL_MASK        (0xFF << 21)
    291 #define NVFX_FP_OP_COND_SHIFT          18
    292 #define NVFX_FP_OP_COND_MASK          (0x07 << 18)
    293 #  define NVFX_FP_OP_COND_FL  0
    294 #  define NVFX_FP_OP_COND_LT  1
    295 #  define NVFX_FP_OP_COND_EQ  2
    296 #  define NVFX_FP_OP_COND_LE  3
    297 #  define NVFX_FP_OP_COND_GT  4
    298 #  define NVFX_FP_OP_COND_NE  5
    299 #  define NVFX_FP_OP_COND_GE  6
    300 #  define NVFX_FP_OP_COND_TR  7
    301 
    302 /* high order bits of SRC1 */
    303 #define NV40_FP_OP_OPCODE_IS_BRANCH                                      (1<<31)
    304 #define NVFX_FP_OP_DST_SCALE_SHIFT        28
    305 #define NVFX_FP_OP_DST_SCALE_MASK        (3 << 28)
    306 #define NVFX_FP_OP_DST_SCALE_1X                                                0
    307 #define NVFX_FP_OP_DST_SCALE_2X                                                1
    308 #define NVFX_FP_OP_DST_SCALE_4X                                                2
    309 #define NVFX_FP_OP_DST_SCALE_8X                                                3
    310 #define NVFX_FP_OP_DST_SCALE_INV_2X                                            5
    311 #define NVFX_FP_OP_DST_SCALE_INV_4X                                            6
    312 #define NVFX_FP_OP_DST_SCALE_INV_8X                                            7
    313 #define NVFX_FP_OP_SRC1_ABS          (1 << 18)
    314 
    315 /* SRC1 LOOP */
    316 #define NV40_FP_OP_LOOP_INCR_SHIFT                                            19
    317 #define NV40_FP_OP_LOOP_INCR_MASK                                   (0xFF << 19)
    318 #define NV40_FP_OP_LOOP_INDEX_SHIFT                                           10
    319 #define NV40_FP_OP_LOOP_INDEX_MASK                                  (0xFF << 10)
    320 #define NV40_FP_OP_LOOP_COUNT_SHIFT                                            2
    321 #define NV40_FP_OP_LOOP_COUNT_MASK                                   (0xFF << 2)
    322 
    323 /* SRC1 IF: absolute offset in dwords */
    324 #define NV40_FP_OP_ELSE_OFFSET_SHIFT                                           0
    325 #define NV40_FP_OP_ELSE_OFFSET_MASK                             (0x7FFFFFFF << 0)
    326 
    327 /* SRC1 CAL */
    328 #define NV40_FP_OP_SUB_OFFSET_SHIFT                                                 0
    329 #define NV40_FP_OP_SUB_OFFSET_MASK                                   (0x7FFFFFFF << 0)
    330 
    331 /* SRC1 REP
    332  *   I have no idea why there are 3 count values here..  but they
    333  *   have always been filled with the same value in my tests so
    334  *   far..
    335  */
    336 #define NV40_FP_OP_REP_COUNT1_SHIFT                                            2
    337 #define NV40_FP_OP_REP_COUNT1_MASK                                   (0xFF << 2)
    338 #define NV40_FP_OP_REP_COUNT2_SHIFT                                           10
    339 #define NV40_FP_OP_REP_COUNT2_MASK                                  (0xFF << 10)
    340 #define NV40_FP_OP_REP_COUNT3_SHIFT                                           19
    341 #define NV40_FP_OP_REP_COUNT3_MASK                                  (0xFF << 19)
    342 
    343 /* SRC2 REP/IF: absolute offset in dwords */
    344 #define NV40_FP_OP_END_OFFSET_SHIFT                                            0
    345 #define NV40_FP_OP_END_OFFSET_MASK                              (0x7FFFFFFF << 0)
    346 
    347 /* high order bits of SRC2 */
    348 #define NVFX_FP_OP_INDEX_INPUT          (1 << 30)
    349 #define NV40_FP_OP_ADDR_INDEX_SHIFT        19
    350 #define NV40_FP_OP_ADDR_INDEX_MASK        (0xF << 19)
    351 
    352 //== Register selection ==
    353 #define NVFX_FP_REG_TYPE_SHIFT           0
    354 #define NVFX_FP_REG_TYPE_MASK           (3 << 0)
    355 #  define NVFX_FP_REG_TYPE_TEMP   0
    356 #  define NVFX_FP_REG_TYPE_INPUT  1
    357 #  define NVFX_FP_REG_TYPE_CONST  2
    358 #define NVFX_FP_REG_SRC_SHIFT            2
    359 #define NV30_FP_REG_SRC_MASK              (31 << 2)
    360 #define NV40_FP_REG_SRC_MASK              (63 << 2)
    361 #define NVFX_FP_REG_SRC_HALF            (1 << 8)
    362 #define NVFX_FP_REG_SWZ_ALL_SHIFT        9
    363 #define NVFX_FP_REG_SWZ_ALL_MASK        (255 << 9)
    364 #define NVFX_FP_REG_SWZ_X_SHIFT          9
    365 #define NVFX_FP_REG_SWZ_X_MASK          (3 << 9)
    366 #define NVFX_FP_REG_SWZ_Y_SHIFT          11
    367 #define NVFX_FP_REG_SWZ_Y_MASK          (3 << 11)
    368 #define NVFX_FP_REG_SWZ_Z_SHIFT          13
    369 #define NVFX_FP_REG_SWZ_Z_MASK          (3 << 13)
    370 #define NVFX_FP_REG_SWZ_W_SHIFT          15
    371 #define NVFX_FP_REG_SWZ_W_MASK          (3 << 15)
    372 #  define NVFX_FP_SWIZZLE_X  0
    373 #  define NVFX_FP_SWIZZLE_Y  1
    374 #  define NVFX_FP_SWIZZLE_Z  2
    375 #  define NVFX_FP_SWIZZLE_W  3
    376 #define NVFX_FP_REG_NEGATE          (1 << 17)
    377 
    378 #define NVFXSR_NONE	0
    379 #define NVFXSR_OUTPUT	1
    380 #define NVFXSR_INPUT	2
    381 #define NVFXSR_TEMP	3
    382 #define NVFXSR_CONST	5
    383 #define NVFXSR_IMM	6
    384 
    385 #define NVFX_COND_FL  0
    386 #define NVFX_COND_LT  1
    387 #define NVFX_COND_EQ  2
    388 #define NVFX_COND_LE  3
    389 #define NVFX_COND_GT  4
    390 #define NVFX_COND_NE  5
    391 #define NVFX_COND_GE  6
    392 #define NVFX_COND_TR  7
    393 
    394 /* Yes, this are ordered differently... */
    395 
    396 #define NVFX_VP_MASK_X 8
    397 #define NVFX_VP_MASK_Y 4
    398 #define NVFX_VP_MASK_Z 2
    399 #define NVFX_VP_MASK_W 1
    400 #define NVFX_VP_MASK_ALL 0xf
    401 
    402 #define NVFX_FP_MASK_X 1
    403 #define NVFX_FP_MASK_Y 2
    404 #define NVFX_FP_MASK_Z 4
    405 #define NVFX_FP_MASK_W 8
    406 #define NVFX_FP_MASK_ALL 0xf
    407 
    408 #define NVFX_SWZ_X 0
    409 #define NVFX_SWZ_Y 1
    410 #define NVFX_SWZ_Z 2
    411 #define NVFX_SWZ_W 3
    412 
    413 #define swz(s,x,y,z,w) nvfx_src_swz((s), NVFX_SWZ_##x, NVFX_SWZ_##y, NVFX_SWZ_##z, NVFX_SWZ_##w)
    414 #define neg(s) nvfx_src_neg((s))
    415 #define abs(s) nvfx_src_abs((s))
    416 
    417 struct nvfx_reg {
    418 	int8_t type;
    419 	int32_t index;
    420 };
    421 
    422 struct nvfx_src {
    423 	struct nvfx_reg reg;
    424 
    425 	uint8_t indirect : 1;
    426 	uint8_t indirect_reg : 1;
    427 	uint8_t indirect_swz : 2;
    428 	uint8_t negate : 1;
    429 	uint8_t abs : 1;
    430 	uint8_t swz[4];
    431 };
    432 
    433 struct nvfx_insn
    434 {
    435 	uint8_t op;
    436 	char scale;
    437 	int8_t unit;
    438 	uint8_t mask;
    439 	uint8_t cc_swz[4];
    440 
    441 	uint8_t sat : 1;
    442 	uint8_t cc_update : 1;
    443 	uint8_t cc_update_reg : 1;
    444 	uint8_t cc_test : 3;
    445 	uint8_t cc_test_reg : 1;
    446 
    447 	struct nvfx_reg dst;
    448 	struct nvfx_src src[3];
    449 };
    450 
    451 static INLINE struct nvfx_insn
    452 nvfx_insn(boolean sat, unsigned op, int unit, struct nvfx_reg dst, unsigned mask, struct nvfx_src s0, struct nvfx_src s1, struct nvfx_src s2)
    453 {
    454 	struct nvfx_insn insn = {
    455 		.op = op,
    456 		.scale = 0,
    457 		.unit = unit,
    458 		.sat = sat,
    459 		.mask = mask,
    460 		.cc_update = 0,
    461 		.cc_update_reg = 0,
    462 		.cc_test = NVFX_COND_TR,
    463 		.cc_test_reg = 0,
    464 		.cc_swz = { 0, 1, 2, 3 },
    465 		.dst = dst,
    466 		.src = {s0, s1, s2}
    467 	};
    468 	return insn;
    469 }
    470 
    471 static INLINE struct nvfx_reg
    472 nvfx_reg(int type, int index)
    473 {
    474 	struct nvfx_reg temp = {
    475 		.type = type,
    476 		.index = index,
    477 	};
    478 	return temp;
    479 }
    480 
    481 static INLINE struct nvfx_src
    482 nvfx_src(struct nvfx_reg reg)
    483 {
    484 	struct nvfx_src temp = {
    485 		.reg = reg,
    486 		.abs = 0,
    487 		.negate = 0,
    488 		.swz = { 0, 1, 2, 3 },
    489 		.indirect = 0,
    490 	};
    491 	return temp;
    492 }
    493 
    494 static INLINE struct nvfx_src
    495 nvfx_src_swz(struct nvfx_src src, int x, int y, int z, int w)
    496 {
    497 	struct nvfx_src dst = src;
    498 
    499 	dst.swz[NVFX_SWZ_X] = src.swz[x];
    500 	dst.swz[NVFX_SWZ_Y] = src.swz[y];
    501 	dst.swz[NVFX_SWZ_Z] = src.swz[z];
    502 	dst.swz[NVFX_SWZ_W] = src.swz[w];
    503 	return dst;
    504 }
    505 
    506 static INLINE struct nvfx_src
    507 nvfx_src_neg(struct nvfx_src src)
    508 {
    509 	src.negate = !src.negate;
    510 	return src;
    511 }
    512 
    513 static INLINE struct nvfx_src
    514 nvfx_src_abs(struct nvfx_src src)
    515 {
    516 	src.abs = 1;
    517 	return src;
    518 }
    519 
    520 struct nvfx_relocation {
    521         unsigned location;
    522         unsigned target;
    523 };
    524 
    525 #endif
    526